From 099c94c215c4d9368640ffeed38bc9247431236b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 29 Aug 2023 15:57:56 -0400 Subject: [PATCH] Fix handling of some PNI initial contact flows. --- .../crypto/storage/SignalBaseIdentityKeyStore.java | 2 +- .../org/thoughtcrime/securesms/database/RecipientTable.kt | 2 +- .../thoughtcrime/securesms/messages/MessageDecryptor.kt | 8 ++++---- .../org/thoughtcrime/securesms/recipients/Recipient.java | 8 +++----- .../thoughtcrime/securesms/recipients/RecipientId.java | 5 +++-- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore.java index c725ae28af..dac34d22e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore.java @@ -70,7 +70,7 @@ public class SignalBaseIdentityKeyStore { public @NonNull SaveResult saveIdentity(SignalProtocolAddress address, IdentityKey identityKey, boolean nonBlockingApproval) { try (SignalSessionLock.Lock unused = ReentrantSessionLock.INSTANCE.acquire()) { IdentityStoreRecord identityRecord = cache.get(address.getName()); - RecipientId recipientId = RecipientId.fromSidOrE164(address.getName()); + RecipientId recipientId = RecipientId.from(ServiceId.fromLibSignal(address.getServiceId())); if (identityRecord == null) { Log.i(TAG, "Saving new identity for " + address); 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 f16cfaa8f6..38069f5f04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -457,7 +457,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da if (result.operations.isNotEmpty() || result.requiredInsert) { val pniString = if (pni == null) "null" else if (aci == null && e164 == null) pni.toString() else "" - val e164String = if (e164 == null) "null" else if (aci == null && pni == null) e164 else "" + val e164String = if (e164 == null) "null" else if (aci == null) e164 else "" Log.i(TAG, "[getAndPossiblyMerge] ($aci, $pniString, $e164String) BreadCrumbs: ${result.breadCrumbs}, Operations: ${result.operations}, RequiredInsert: ${result.requiredInsert}, FinalId: ${result.finalId}") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt index c4983457d9..82f9148730 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt @@ -172,6 +172,7 @@ object MessageDecryptor { if (cipherResult.metadata.sourceServiceId is ACI) { handlePniSignatureMessage( envelope, + bufferedProtocolStore, cipherResult.metadata.sourceServiceId as ACI, cipherResult.metadata.sourceE164, cipherResult.metadata.sourceDeviceId, @@ -325,7 +326,7 @@ object MessageDecryptor { SignalGroupSessionBuilder(ReentrantSessionLock.INSTANCE, GroupSessionBuilder(senderKeyStore)).process(sender, message) } - private fun handlePniSignatureMessage(envelope: Envelope, aci: ACI, e164: String?, deviceId: Int, pniSignatureMessage: PniSignatureMessage) { + private fun handlePniSignatureMessage(envelope: Envelope, protocolStore: BufferedProtocolStore, aci: ACI, e164: String?, deviceId: Int, pniSignatureMessage: PniSignatureMessage) { Log.i(TAG, "${logPrefix(envelope, aci)} Processing PniSignatureMessage") val pni: PNI = PNI.parseOrThrow(pniSignatureMessage.pni.toByteArray()) @@ -335,11 +336,10 @@ object MessageDecryptor { return } - val identityStore = ApplicationDependencies.getProtocolStore().aci().identities() val aciAddress = SignalProtocolAddress(aci.toString(), deviceId) val pniAddress = SignalProtocolAddress(pni.toString(), deviceId) - val aciIdentity = identityStore.getIdentity(aciAddress) - val pniIdentity = identityStore.getIdentity(pniAddress) + val aciIdentity = protocolStore.getAciStore().getIdentity(aciAddress) + val pniIdentity = protocolStore.getAciStore().getIdentity(pniAddress) if (aciIdentity == null) { Log.w(TAG, "${logPrefix(envelope, aci)}[validatePniSignature] No identity found for ACI address $aciAddress") diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java index 87cb912602..d8489cca98 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java @@ -58,8 +58,6 @@ import org.whispersystems.signalservice.api.util.OptionalUtil; import org.whispersystems.signalservice.api.util.Preconditions; import org.whispersystems.signalservice.api.util.UuidUtil; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -75,7 +73,6 @@ import java.util.stream.Collectors; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.schedulers.Schedulers; -import static org.thoughtcrime.securesms.database.RecipientTable.InsightsBannerTier; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public class Recipient { @@ -343,8 +340,9 @@ public class Recipient { RecipientTable db = SignalDatabase.recipients(); RecipientId id = null; - if (UuidUtil.isUuid(identifier)) { - ServiceId serviceId = ServiceId.parseOrThrow(identifier); + ServiceId serviceId = ServiceId.parseOrNull(identifier); + + if (serviceId != null) { id = db.getOrInsertFromServiceId(serviceId); } else if (GroupId.isEncodedGroup(identifier)) { id = db.getOrInsertFromGroupId(GroupId.parseOrThrow(identifier)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java index 18525aec50..d6eeb3cf1a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/RecipientId.java @@ -87,8 +87,9 @@ public class RecipientId implements Parcelable, Comparable, Databas */ @AnyThread public static @NonNull RecipientId fromSidOrE164(@NonNull String identifier) { - if (UuidUtil.isUuid(identifier)) { - return from(ServiceId.parseOrThrow(identifier)); + ServiceId serviceId = ServiceId.parseOrNull(identifier); + if (serviceId != null) { + return from(serviceId); } else { return from(null, identifier); }