From 69f5aacd2514ba3ea90d1b3cfba3908e229bc40b Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sat, 14 Nov 2015 15:17:05 -0800 Subject: [PATCH] Consider everything <= len(4) a short code, except short countries // FREEBIE --- .../database/CanonicalAddressDatabase.java | 17 +------- .../securesms/util/ShortCodeUtil.java | 43 +++++++++++++++++++ .../securesms/util/ShortCodeUtilTest.java | 41 ++++++++++++++++++ 3 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 src/org/thoughtcrime/securesms/util/ShortCodeUtil.java create mode 100644 test/unitTest/java/org/thoughtcrime/securesms/util/ShortCodeUtilTest.java diff --git a/src/org/thoughtcrime/securesms/database/CanonicalAddressDatabase.java b/src/org/thoughtcrime/securesms/database/CanonicalAddressDatabase.java index ace7bc5f4f..934795c549 100644 --- a/src/org/thoughtcrime/securesms/database/CanonicalAddressDatabase.java +++ b/src/org/thoughtcrime/securesms/database/CanonicalAddressDatabase.java @@ -33,6 +33,7 @@ import com.google.i18n.phonenumbers.Phonenumber; import com.google.i18n.phonenumbers.ShortNumberInfo; import org.thoughtcrime.securesms.util.GroupUtil; +import org.thoughtcrime.securesms.util.ShortCodeUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.VisibleForTesting; import org.whispersystems.textsecure.api.util.InvalidNumberException; @@ -151,7 +152,7 @@ public class CanonicalAddressDatabase { if (isNumberAddress(address) && TextSecurePreferences.isPushRegistered(context)) { String localNumber = TextSecurePreferences.getLocalNumber(context); - if (!isShortCode(localNumber, address)) { + if (!ShortCodeUtil.isShortCode(localNumber, address)) { address = PhoneNumberFormatter.formatNumber(address, localNumber); } } @@ -237,20 +238,6 @@ public class CanonicalAddressDatabase { return PhoneNumberUtils.isWellFormedSmsAddress(number); } - private boolean isShortCode(@NonNull String localNumber, @NonNull String number) { - try { - PhoneNumberUtil util = PhoneNumberUtil.getInstance(); - Phonenumber.PhoneNumber localNumberObject = util.parse(localNumber, null); - String localCountryCode = util.getRegionCodeForNumber(localNumberObject); - Phonenumber.PhoneNumber shortCode = util.parse(number, localCountryCode); - - return ShortNumberInfo.getInstance().isPossibleShortNumberForRegion(shortCode, localCountryCode); - } catch (NumberParseException e) { - Log.w(TAG, e); - return false; - } - } - private static class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { diff --git a/src/org/thoughtcrime/securesms/util/ShortCodeUtil.java b/src/org/thoughtcrime/securesms/util/ShortCodeUtil.java new file mode 100644 index 0000000000..d5157c0121 --- /dev/null +++ b/src/org/thoughtcrime/securesms/util/ShortCodeUtil.java @@ -0,0 +1,43 @@ +package org.thoughtcrime.securesms.util; + +import android.support.annotation.NonNull; +import android.util.Log; + +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber; +import com.google.i18n.phonenumbers.ShortNumberInfo; + +import java.util.HashSet; +import java.util.Set; + +public class ShortCodeUtil { + + private static final String TAG = ShortCodeUtil.class.getSimpleName(); + + private static final Set SHORT_COUNTRIES = new HashSet() {{ + add("NU"); + add("TK"); + add("NC"); + add("AC"); + }}; + + public static boolean isShortCode(@NonNull String localNumber, @NonNull String number) { + try { + PhoneNumberUtil util = PhoneNumberUtil.getInstance(); + Phonenumber.PhoneNumber localNumberObject = util.parse(localNumber, null); + String localCountryCode = util.getRegionCodeForNumber(localNumberObject); + + if (number.replaceAll("[^0-9+]", "").length() <= 4 && !SHORT_COUNTRIES.contains(localCountryCode)) { + return true; + } else { + Phonenumber.PhoneNumber shortCode = util.parse(number, localCountryCode); + return ShortNumberInfo.getInstance().isPossibleShortNumberForRegion(shortCode, localCountryCode); + } + } catch (NumberParseException e) { + Log.w(TAG, e); + return false; + } + } + +} diff --git a/test/unitTest/java/org/thoughtcrime/securesms/util/ShortCodeUtilTest.java b/test/unitTest/java/org/thoughtcrime/securesms/util/ShortCodeUtilTest.java new file mode 100644 index 0000000000..f6ebf685c1 --- /dev/null +++ b/test/unitTest/java/org/thoughtcrime/securesms/util/ShortCodeUtilTest.java @@ -0,0 +1,41 @@ +package org.thoughtcrime.securesms.util; + +import org.junit.Test; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +public class ShortCodeUtilTest { + + @Test + public void testShortCodes() throws Exception { + assertTrue(ShortCodeUtil.isShortCode("+14152222222", "40404")); + assertTrue(ShortCodeUtil.isShortCode("+14152222222", "431")); + assertFalse(ShortCodeUtil.isShortCode("+14152222222", "4157778888")); + assertFalse(ShortCodeUtil.isShortCode("+14152222222", "+14157778888")); + assertFalse(ShortCodeUtil.isShortCode("+14152222222", "415-777-8888")); + assertFalse(ShortCodeUtil.isShortCode("+14152222222", "(415) 777-8888")); + assertFalse(ShortCodeUtil.isShortCode("+14152222222", "8882222")); + assertFalse(ShortCodeUtil.isShortCode("+14152222222", "888-2222")); + + assertTrue(ShortCodeUtil.isShortCode("+491723742522", "670")); + assertTrue(ShortCodeUtil.isShortCode("+491723742522", "115")); + assertFalse(ShortCodeUtil.isShortCode("+491723742522", "089-12345678")); + assertFalse(ShortCodeUtil.isShortCode("+491723742522", "089/12345678")); + assertFalse(ShortCodeUtil.isShortCode("+491723742522", "12345678")); + + assertTrue(ShortCodeUtil.isShortCode("+298123456", "4040")); + assertTrue(ShortCodeUtil.isShortCode("+298123456", "6701")); + assertTrue(ShortCodeUtil.isShortCode("+298123456", "433")); + assertFalse(ShortCodeUtil.isShortCode("+298123456", "123456")); + + assertTrue(ShortCodeUtil.isShortCode("+61414915066", "19808948")); + assertFalse(ShortCodeUtil.isShortCode("+61414915066", "119808948")); + + assertTrue(ShortCodeUtil.isShortCode("+79166503388", "8080")); + assertTrue(ShortCodeUtil.isShortCode("+79166503388", "6701")); + assertTrue(ShortCodeUtil.isShortCode("+79166503388", "431")); + assertFalse(ShortCodeUtil.isShortCode("+79166503388", "111-22-33")); + } + +}