From 989b071a6d2b67bd662585c3aa56926ea3e3803b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 1 Jun 2020 09:10:36 -0400 Subject: [PATCH] Ignore contacts that don't have a phone number. --- .../securesms/storage/StorageSyncHelper.java | 9 +++++++-- .../securesms/storage/StorageSyncHelperTest.java | 6 +++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java index eb32100dda..c66b218d27 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java @@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.SetUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; @@ -231,7 +232,7 @@ public final class StorageSyncHelper { public static @NonNull MergeResult resolveConflict(@NonNull Collection remoteOnlyRecords, @NonNull Collection localOnlyRecords) { - List remoteOnlyContacts = Stream.of(remoteOnlyRecords).filter(r -> r.getContact().isPresent()).map(r -> r.getContact().get()).toList(); + List remoteOnlyContacts = Stream.of(remoteOnlyRecords).filter(r -> r.getContact().isPresent() && isValidContact(r.getContact().get())).map(r -> r.getContact().get()).toList(); List localOnlyContacts = Stream.of(localOnlyRecords).filter(r -> r.getContact().isPresent()).map(r -> r.getContact().get()).toList(); List remoteOnlyGroupV1 = Stream.of(remoteOnlyRecords).filter(r -> r.getGroupV1().isPresent()).map(r -> r.getGroupV1().get()).toList(); @@ -240,7 +241,7 @@ public final class StorageSyncHelper { List remoteOnlyGroupV2 = Stream.of(remoteOnlyRecords).filter(r -> r.getGroupV2().isPresent()).map(r -> r.getGroupV2().get()).toList(); List localOnlyGroupV2 = Stream.of(localOnlyRecords).filter(r -> r.getGroupV2().isPresent()).map(r -> r.getGroupV2().get()).toList(); - List remoteOnlyUnknowns = Stream.of(remoteOnlyRecords).filter(SignalStorageRecord::isUnknown).toList(); + List remoteOnlyUnknowns = Stream.of(remoteOnlyRecords).filter(r -> r.isUnknown() || (r.getContact().isPresent() && !isValidContact(r.getContact().get()))).toList(); List localOnlyUnknowns = Stream.of(localOnlyRecords).filter(SignalStorageRecord::isUnknown).toList(); List remoteOnlyAccount = Stream.of(remoteOnlyRecords).filter(r -> r.getAccount().isPresent()).map(r -> r.getAccount().get()).toList(); @@ -440,6 +441,10 @@ public final class StorageSyncHelper { } } + private static boolean isValidContact(@NonNull SignalContactRecord contact) { + return FeatureFlags.uuids() || contact.getAddress().getNumber().isPresent(); + } + public static final class KeyDifferenceResult { private final List remoteOnlyKeys; private final List localOnlyKeys; diff --git a/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java b/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java index 2cd50b9909..59a05b9f27 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/storage/StorageSyncHelperTest.java @@ -15,6 +15,7 @@ import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.storage.StorageSyncHelper.KeyDifferenceResult; import org.thoughtcrime.securesms.storage.StorageSyncHelper.MergeResult; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.storage.SignalAccountRecord; @@ -47,7 +48,7 @@ import static org.thoughtcrime.securesms.testutil.TestHelpers.byteListOf; import static org.thoughtcrime.securesms.testutil.TestHelpers.setOf; @RunWith(PowerMockRunner.class) -@PrepareForTest({ Recipient.class }) +@PrepareForTest({ Recipient.class, FeatureFlags.class}) public final class StorageSyncHelperTest { private static final UUID UUID_A = UuidUtil.parseOrThrow("ebef429e-695e-4f51-bcc4-526a60ac68c7"); @@ -76,6 +77,7 @@ public final class StorageSyncHelperTest { mockStatic(Recipient.class); when(Recipient.self()).thenReturn(SELF); Log.initialize(new Log.Logger[0]); + mockStatic(FeatureFlags.class); } @Test @@ -242,6 +244,8 @@ public final class StorageSyncHelperTest { @Test public void resolveConflict_complex() { + when(FeatureFlags.uuids()).thenReturn(true); + SignalContactRecord remote1 = contact(1, UUID_A, null, "a"); SignalContactRecord local1 = contact(2, UUID_A, E164_A, "a");