From 9bc4dfc3f69c4713ff5c2476a3b31adf3eb74040 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 12 May 2022 16:11:44 -0400 Subject: [PATCH] Fix PNI crash in in group processing. --- .../database/model/GroupsV2UpdateMessageProducer.java | 6 ++++-- .../securesms/database/model/MessageRecord.java | 2 +- .../org/thoughtcrime/securesms/keyvalue/AccountValues.kt | 4 ++-- .../java/org/thoughtcrime/securesms/keyvalue/ServiceIds.kt | 6 +++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java index 7988bbc3f..b56840ce0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java @@ -72,7 +72,7 @@ final class GroupsV2UpdateMessageProducer { */ UpdateDescription describeNewGroup(@NonNull DecryptedGroup group, @NonNull DecryptedGroupChange decryptedGroupChange) { Optional selfPending = DecryptedGroupUtil.findPendingByUuid(group.getPendingMembersList(), selfIds.getAci().uuid()); - if (!selfPending.isPresent()) { + if (!selfPending.isPresent() && selfIds.getPni() != null) { selfPending = DecryptedGroupUtil.findPendingByUuid(group.getPendingMembersList(), selfIds.getPni().uuid()); } @@ -89,7 +89,9 @@ final class GroupsV2UpdateMessageProducer { } } - if (DecryptedGroupUtil.findMemberByUuid(group.getMembersList(), selfIds.getAci().uuid()).isPresent() || DecryptedGroupUtil.findMemberByUuid(group.getMembersList(), selfIds.getPni().uuid()).isPresent()) { + if (DecryptedGroupUtil.findMemberByUuid(group.getMembersList(), selfIds.getAci().uuid()).isPresent() || + (selfIds.getPni() != null && DecryptedGroupUtil.findMemberByUuid(group.getMembersList(), selfIds.getPni().uuid()).isPresent()) + ) { return updateDescription(context.getString(R.string.MessageRecord_you_joined_the_group), R.drawable.ic_update_group_add_16); } else { return updateDescription(context.getString(R.string.MessageRecord_group_updated), R.drawable.ic_update_group_16); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 8854633a2..02a03ef1e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -270,7 +270,7 @@ public abstract class MessageRecord extends DisplayRecord { try { byte[] decoded = Base64.decode(body); DecryptedGroupV2Context decryptedGroupV2Context = DecryptedGroupV2Context.parseFrom(decoded); - GroupsV2UpdateMessageProducer updateMessageProducer = new GroupsV2UpdateMessageProducer(context, SignalStore.account().requireServiceIds(), recipientClickHandler); + GroupsV2UpdateMessageProducer updateMessageProducer = new GroupsV2UpdateMessageProducer(context, SignalStore.account().getServiceIds(), recipientClickHandler); if (decryptedGroupV2Context.hasChange() && (decryptedGroupV2Context.getGroupState().getRevision() != 0 || decryptedGroupV2Context.hasPreviousGroupState())) { return UpdateDescription.concatWithNewLines(updateMessageProducer.describeChanges(decryptedGroupV2Context.getPreviousGroupState(), decryptedGroupV2Context.getChange())); diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt index e6847b04a..46517665d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/AccountValues.kt @@ -111,8 +111,8 @@ internal class AccountValues internal constructor(store: KeyValueStore) : Signal putString(KEY_PNI, pni.toString()) } - fun requireServiceIds(): ServiceIds { - return ServiceIds(requireAci(), requirePni()) + fun getServiceIds(): ServiceIds { + return ServiceIds(requireAci(), pni) } /** The local user's E164. */ diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/ServiceIds.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/ServiceIds.kt index ec484c0e2..e84f1a4fd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/ServiceIds.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/ServiceIds.kt @@ -10,13 +10,13 @@ import java.util.UUID * Helper for dealing with [ServiceId] matching when you only care that either of your * service ids match but don't care which one. */ -data class ServiceIds(val aci: ACI, val pni: PNI) { +data class ServiceIds(val aci: ACI, val pni: PNI?) { private val aciByteString: ByteString by lazy { UuidUtil.toByteString(aci.uuid()) } - private val pniByteString: ByteString by lazy { UuidUtil.toByteString(pni.uuid()) } + private val pniByteString: ByteString? by lazy { pni?.let { UuidUtil.toByteString(it.uuid()) } } fun matches(uuid: UUID): Boolean { - return uuid == aci.uuid() || uuid == pni.uuid() + return uuid == aci.uuid() || uuid == pni?.uuid() } fun matches(uuid: ByteString): Boolean {