From a2a10fb0c1ae4487f5a2b0dc1499ceacbca1afcf Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 18 Apr 2025 10:52:02 -0400 Subject: [PATCH] Filter out bad E164s from GV1 groups. --- .../thoughtcrime/securesms/mms/MessageGroupContext.java | 3 +++ .../org/thoughtcrime/securesms/util/SignalE164Util.kt | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java b/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java index 2526ed762c..ec92f1b4e7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/MessageGroupContext.java @@ -5,6 +5,7 @@ import androidx.annotation.Nullable; import com.annimon.stream.Stream; +import org.signal.core.util.E164Util; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.groups.GroupMasterKey; import org.signal.storageservice.protos.groups.local.DecryptedGroup; @@ -16,6 +17,7 @@ import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.signal.core.util.Base64; +import org.thoughtcrime.securesms.util.SignalE164Util; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId.ACI; @@ -128,6 +130,7 @@ public final class MessageGroupContext { RecipientId selfId = Recipient.self().getId(); return Stream.of(groupContext.members) + .filter(m -> SignalE164Util.isPotentialE164(m.e164)) .map(m -> m.e164) .withoutNulls() .map(RecipientId::fromE164) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SignalE164Util.kt b/app/src/main/java/org/thoughtcrime/securesms/util/SignalE164Util.kt index 72709e73a8..acfb828df1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SignalE164Util.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SignalE164Util.kt @@ -53,6 +53,14 @@ object SignalE164Util { return getFormatter().formatAsE164(input) } + /** + * Returns true if the input string can be considered an E164. Specifically, it returns true if we could figure out how to format it as an E164. + */ + @JvmStatic + fun isPotentialE164(input: String): Boolean { + return formatAsE164(input) != null + } + private fun getFormatter(): E164Util.Formatter { val localNumber = SignalStore.account.e164 ?: return defaultFormatter val formatter = cachedFormatters[localNumber]