From e01bd8d384ddf675c262a5bfa1d4a2a439324721 Mon Sep 17 00:00:00 2001 From: Erko Risthein Date: Sat, 23 Mar 2019 15:19:14 +0200 Subject: [PATCH] Add backwards compatible phone number normalization for Estonian and Lithuanian phone numbers --- .../mobileid/MobileIDAuthenticator.java | 22 ++++++++++++++++++- .../mobileid/MobileIDAuthenticatorTest.java | 15 +++++++++---- .../security/mobileid/MobileIDSignerTest.java | 9 ++++---- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/com/codeborne/security/mobileid/MobileIDAuthenticator.java b/src/com/codeborne/security/mobileid/MobileIDAuthenticator.java index 696b3ae..a277055 100644 --- a/src/com/codeborne/security/mobileid/MobileIDAuthenticator.java +++ b/src/com/codeborne/security/mobileid/MobileIDAuthenticator.java @@ -15,6 +15,7 @@ import java.rmi.RemoteException; import java.util.Base64; import java.util.List; +import java.util.stream.Stream; import static com.codeborne.security.AuthenticationException.Code.valueOf; @@ -155,7 +156,26 @@ private void validateServiceUrl() { } String normalizePhoneNumber(String phone) { - return phone != null && phone.startsWith("+") ? phone.substring(1) : phone; + if (phone != null) { + if (phone.startsWith("+")) + phone = phone.substring(1); + if (isLithuanian(phone)) { + return "370" + phone; + } else if (isEstonian(phone)) { + return "372" + phone; + } + } + return phone; + } + + private boolean isEstonian(String phone) { + // https://en.wikipedia.org/wiki/Telephone_numbers_in_Estonia + return Stream.of("5", "81", "82", "83", "84", "870", "871").anyMatch(phone::startsWith); + } + + private boolean isLithuanian(String phone) { + // https://en.wikipedia.org/wiki/Telephone_numbers_in_Lithuania + return phone.startsWith("86"); } private void validateOkResult(StringHolder result) { diff --git a/test/com/codeborne/security/mobileid/MobileIDAuthenticatorTest.java b/test/com/codeborne/security/mobileid/MobileIDAuthenticatorTest.java index 9feeaa2..a754606 100644 --- a/test/com/codeborne/security/mobileid/MobileIDAuthenticatorTest.java +++ b/test/com/codeborne/security/mobileid/MobileIDAuthenticatorTest.java @@ -59,13 +59,20 @@ public void loginByPhone() throws RemoteException { } @Test - public void removesPlusFromPhoneNumber() { - assertThat(mid.normalizePhoneNumber("+37255667788"), equalTo("37255667788")); - + public void normalizesEstonianAndLithuanianPhoneNumbers() { assertThat(mid.normalizePhoneNumber(null), nullValue()); assertThat(mid.normalizePhoneNumber(""), equalTo("")); + assertThat(mid.normalizePhoneNumber("+37255667788"), equalTo("37255667788")); assertThat(mid.normalizePhoneNumber("37255667788"), equalTo("37255667788")); - assertThat(mid.normalizePhoneNumber("55667788"), equalTo("55667788")); + assertThat(mid.normalizePhoneNumber("5xxxxxx"), equalTo("3725xxxxxx")); + assertThat(mid.normalizePhoneNumber("5xxxxxxx"), equalTo("3725xxxxxxx")); + assertThat(mid.normalizePhoneNumber("81xxxxxx"), equalTo("37281xxxxxx")); + assertThat(mid.normalizePhoneNumber("82xxxxxx"), equalTo("37282xxxxxx")); + assertThat(mid.normalizePhoneNumber("83xxxxxx"), equalTo("37283xxxxxx")); + assertThat(mid.normalizePhoneNumber("84xxxxxx"), equalTo("37284xxxxxx")); + assertThat(mid.normalizePhoneNumber("870xxxxxxxxx"), equalTo("372870xxxxxxxxx")); + assertThat(mid.normalizePhoneNumber("871xxxxxxxxx"), equalTo("372871xxxxxxxxx")); + assertThat(mid.normalizePhoneNumber("86xxxxxxx"), equalTo("37086xxxxxxx")); } @Test diff --git a/test/com/codeborne/security/mobileid/MobileIDSignerTest.java b/test/com/codeborne/security/mobileid/MobileIDSignerTest.java index 3038e41..a040d08 100644 --- a/test/com/codeborne/security/mobileid/MobileIDSignerTest.java +++ b/test/com/codeborne/security/mobileid/MobileIDSignerTest.java @@ -5,7 +5,6 @@ import org.junit.Ignore; import org.junit.Test; -import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -30,8 +29,8 @@ public void setUp() { } @Test - @Ignore - public void mobileIdSignatureFlow() throws IOException { + @Ignore + public void mobileIdSignatureFlow() throws Exception { // startSession int sessCode = signer.startSession(); assertThat(sessCode, is(not(0))); @@ -59,6 +58,7 @@ public void mobileIdSignatureFlow() throws IOException { assertThat(challenge, is(notNullValue())); // getStatusInfo + // set a breakpoint here and resume after typing in the PIN2 on your phone String status = signer.getStatusInfo(sessCode); assertThat(status, is("SIGNATURE")); @@ -76,7 +76,7 @@ public void mobileIdSignatureFlow() throws IOException { @Test @Ignore - public void compactMobileIdSignatureFlow() throws Exception { + public void compactMobileIdSignatureFlow() { List files = asList( new SignatureFile("test1.txt", "text/plain", "Test1".getBytes()), new SignatureFile("test2.txt", "text/plain", "Test2".getBytes()) @@ -84,6 +84,7 @@ public void compactMobileIdSignatureFlow() throws Exception { MobileIdSignatureSession session = signer.startSign(files, "38112310010", "55555555"); + // set a breakpoint here and resume after typing in the PIN2 on your phone byte[] signedFile = signer.getSignedFile(session); assertThat(signedFile, is(notNullValue())); }