From eb6394eb6a34e098a4beae45c305005d8d6c2c70 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 21 Sep 2023 15:55:14 -0400 Subject: [PATCH] Fix SSE event bug and make the assertion guarded by a separate flag. --- .../RecipientTableTest_getAndPossiblyMerge.kt | 12 ++++++++++++ .../securesms/database/MessageTable.kt | 2 +- .../securesms/database/RecipientTable.kt | 2 +- .../thoughtcrime/securesms/util/FeatureFlags.java | 14 ++++++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt index ea48c05782..23da93e97b 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt @@ -502,6 +502,18 @@ class RecipientTableTest_getAndPossiblyMerge { expectNoSessionSwitchoverEvent() } + test("steal, e164+pni+aci * pni+aci, all provided, aci sessions but not pni sessions, no SSE expected") { + given(E164_A, PNI_A, ACI_A, createThread = true, aciSession = true, pniSession = false) + given(null, PNI_B, ACI_B, createThread = false, aciSession = true, pniSession = false) + + process(E164_A, PNI_B, ACI_A) + + expect(E164_A, PNI_B, ACI_A) + expect(null, null, ACI_B) + + expectNoSessionSwitchoverEvent() + } + test("merge, e164 & pni & aci, all provided") { given(E164_A, null, null) given(null, PNI_A, null) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 526ba7993e..c2132fa3b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -1293,7 +1293,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } fun insertSessionSwitchoverEvent(recipientId: RecipientId, threadId: Long, event: SessionSwitchoverEvent) { - check(FeatureFlags.phoneNumberPrivacy()) { "Should not occur in a non-PNP world!" } + check(!FeatureFlags.blockSessionSwitchoverEvents()) { "Should not occur in a non-PNP world!" } writableDatabase .insertInto(TABLE_NAME) .values( diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index e4adb498a1..099267495e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -2650,7 +2650,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da * records and turning it into a possible event. */ private fun sessionSwitchoverEventIfNeeded(pniVerified: Boolean, oldRecord: RecipientRecord?, newRecord: RecipientRecord?): PnpOperation? { - return if (oldRecord != null && newRecord != null && needsSessionSwitchoverEvent(pniVerified, oldRecord.serviceId, newRecord.serviceId)) { + return if (oldRecord != null && newRecord != null && oldRecord.serviceId == oldRecord.pni && newRecord.serviceId == newRecord.aci && needsSessionSwitchoverEvent(pniVerified, oldRecord.serviceId, newRecord.serviceId)) { PnpOperation.SessionSwitchoverInsert( recipientId = newRecord.id, e164 = newRecord.e164 diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index 8fb3a09a39..1cfb37f991 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -86,6 +86,7 @@ public final class FeatureFlags { private static final String USE_AEC3 = "android.calling.useAec3"; private static final String PAYMENTS_COUNTRY_BLOCKLIST = "global.payments.disabledRegions"; public static final String PHONE_NUMBER_PRIVACY = "android.pnp"; + public static final String BLOCK_SSE = "android.blockSessionSwitchoverEvents"; private static final String STORIES_AUTO_DOWNLOAD_MAXIMUM = "android.stories.autoDownloadMaximum"; private static final String TELECOM_MANUFACTURER_ALLOWLIST = "android.calling.telecomAllowList"; private static final String TELECOM_MODEL_BLOCKLIST = "android.calling.telecomModelBlockList"; @@ -183,7 +184,8 @@ public final class FeatureFlags { USERNAMES, INSTANT_VIDEO_PLAYBACK, CONVERSATION_ITEM_V2_TEXT, - CRASH_PROMPT_CONFIG + CRASH_PROMPT_CONFIG, + BLOCK_SSE ); @VisibleForTesting @@ -255,7 +257,8 @@ public final class FeatureFlags { PROMPT_FOR_NOTIFICATION_CONFIG, PROMPT_BATTERY_SAVER, USERNAMES, - CRASH_PROMPT_CONFIG + CRASH_PROMPT_CONFIG, + BLOCK_SSE ); /** @@ -388,6 +391,13 @@ public final class FeatureFlags { return getBoolean(PHONE_NUMBER_PRIVACY, false) || Environment.IS_PNP; } + /** + * Whether session switchover events should be blocked on the client. + */ + public static boolean blockSessionSwitchoverEvents() { + return getBoolean(BLOCK_SSE, false) && !phoneNumberPrivacy(); + } + /** Whether to use the custom streaming muxer or built in android muxer. */ public static boolean useStreamingVideoMuxer() { return getBoolean(CUSTOM_VIDEO_MUXER, false);