From 87bdebb21c689a8537c031c2d557c4594a640ab1 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Fri, 20 Oct 2023 17:28:29 -0700 Subject: [PATCH] Remove dependency on presentations being present in AddMemberAction. --- .../securesms/groups/GroupManagerV2.java | 2 +- .../api/groupsv2/GroupsV2Operations.java | 15 +++++++++------ libsignal-service/src/main/protowire/Groups.proto | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java index 2043c5c67a..f2fbaef745 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -724,7 +724,7 @@ final class GroupManagerV2 { List groupCandidates = groupCandidateHelper.recipientIdsToCandidatesList(ids); return groupOperations.replaceAddMembers(change, groupCandidates); - } catch (InvalidInputException | VerificationFailedException | IOException e) { + } catch (InvalidGroupStateException | InvalidInputException | VerificationFailedException | IOException e) { Log.w(TAG, "Unable to refetch credentials for added members, failing change", e); } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java index 6bc345189b..07bed200cf 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java @@ -577,7 +577,7 @@ public final class GroupsV2Operations { ACI aci; ProfileKey profileKey; - if (modifyMemberProfileKeyAction.user_id.size() == 0 || modifyMemberProfileKeyAction.presentation.size() == 0) { + if (modifyMemberProfileKeyAction.user_id.size() == 0 || modifyMemberProfileKeyAction.profile_key.size() == 0) { ProfileKeyCredentialPresentation presentation = new ProfileKeyCredentialPresentation(modifyMemberProfileKeyAction.presentation.toByteArray()); aci = decryptAci(ByteString.of(presentation.getUuidCiphertext().serialize())); profileKey = decryptProfileKey(ByteString.of(presentation.getProfileKeyCiphertext().serialize()), aci); @@ -1034,13 +1034,16 @@ public final class GroupsV2Operations { )); } - public List decryptAddMembers(List addMembers) throws InvalidInputException, VerificationFailedException { + public List decryptAddMembers(List addMembers) throws InvalidGroupStateException, InvalidInputException, VerificationFailedException { List ids = new ArrayList<>(addMembers.size()); - for (int i = 0; i < addMembers.size(); i++) { - GroupChange.Actions.AddMemberAction addMember = addMembers.get(i); - ProfileKeyCredentialPresentation profileKeyCredentialPresentation = new ProfileKeyCredentialPresentation(addMember.added.presentation.toByteArray()); + for (GroupChange.Actions.AddMemberAction addMember : addMembers) { + if (addMember.added.presentation.size() == 0) { + ids.add(decryptAci(addMember.added.userId)); + } else { + ProfileKeyCredentialPresentation profileKeyCredentialPresentation = new ProfileKeyCredentialPresentation(addMember.added.presentation.toByteArray()); - ids.add(ServiceId.fromLibSignal(clientZkGroupCipher.decrypt(profileKeyCredentialPresentation.getUuidCiphertext()))); + ids.add(ServiceId.fromLibSignal(clientZkGroupCipher.decrypt(profileKeyCredentialPresentation.getUuidCiphertext()))); + } } return ids; } diff --git a/libsignal-service/src/main/protowire/Groups.proto b/libsignal-service/src/main/protowire/Groups.proto index bad55e4a1d..3f0b7300bf 100644 --- a/libsignal-service/src/main/protowire/Groups.proto +++ b/libsignal-service/src/main/protowire/Groups.proto @@ -28,7 +28,7 @@ message Member { bytes userId = 1; Role role = 2; bytes profileKey = 3; - bytes presentation = 4; + bytes presentation = 4; // Only set when sending to server uint32 joinedAtRevision = 5; } @@ -41,7 +41,7 @@ message PendingMember { message RequestingMember { bytes userId = 1; bytes profileKey = 2; - bytes presentation = 3; + bytes presentation = 3; // Only set when sending to server uint64 timestamp = 4; }