From a478605da48c04d648cc1817d439eb80d0ebc01b Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 28 Aug 2020 10:32:05 -0300 Subject: [PATCH] Remove requesting members if they are directly added to the group. --- .../api/groupsv2/DecryptedGroupUtil.java | 11 +++++- .../DecryptedGroupUtil_apply_Test.java | 37 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java index b9276e3618..2ae80f0eb7 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java @@ -307,7 +307,7 @@ public final class DecryptedGroupUtil { private static void applyAddMemberAction(DecryptedGroup.Builder builder, List newMembersList) { builder.addAllMembers(newMembersList); - removePendingMembersNowInGroup(builder); + removePendingAndRequestingMembersNowInGroup(builder); } protected static void applyDeleteMemberActions(DecryptedGroup.Builder builder, List deleteMembersList) { @@ -509,7 +509,7 @@ public final class DecryptedGroupUtil { return pendingMemberCipherTexts; } - private static void removePendingMembersNowInGroup(DecryptedGroup.Builder builder) { + private static void removePendingAndRequestingMembersNowInGroup(DecryptedGroup.Builder builder) { Set allMembers = membersToUuidByteStringSet(builder.getMembersList()); for (int i = builder.getPendingMembersCount() - 1; i >= 0; i--) { @@ -518,6 +518,13 @@ public final class DecryptedGroupUtil { builder.removePendingMembers(i); } } + + for (int i = builder.getRequestingMembersCount() - 1; i >= 0; i--) { + DecryptedRequestingMember requestingMember = builder.getRequestingMembers(i); + if (allMembers.contains(requestingMember.getUuid())) { + builder.removeRequestingMembers(i); + } + } } private static void ensureKnownRole(Member.Role role) throws NotAbleToApplyGroupV2ChangeException { diff --git a/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java index 58c767b018..5ea3079eee 100644 --- a/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java +++ b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java @@ -473,6 +473,43 @@ public final class DecryptedGroupUtil_apply_Test { newGroup); } + @Test + public void skip_promote_requesting_member_by_direct_add() throws NotAbleToApplyGroupV2ChangeException { + ProfileKey profileKey2 = randomProfileKey(); + ProfileKey profileKey3 = randomProfileKey(); + DecryptedMember member1 = member(UUID.randomUUID()); + UUID requesting2Uuid = UUID.randomUUID(); + UUID requesting3Uuid = UUID.randomUUID(); + UUID requesting4Uuid = UUID.randomUUID(); + DecryptedRequestingMember requesting2 = requestingMember(requesting2Uuid); + DecryptedRequestingMember requesting3 = requestingMember(requesting3Uuid); + DecryptedRequestingMember requesting4 = requestingMember(requesting4Uuid); + DecryptedMember member2 = member(requesting2Uuid, profileKey2); + DecryptedMember member3 = member(requesting3Uuid, profileKey3); + + DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() + .setRevision(10) + .addMembers(member1) + .addRequestingMembers(requesting2) + .addRequestingMembers(requesting3) + .addRequestingMembers(requesting4) + .build(), + DecryptedGroupChange.newBuilder() + .setRevision(11) + .addNewMembers(member2) + .addNewMembers(member3) + .build()); + + assertEquals(DecryptedGroup.newBuilder() + .setRevision(11) + .addMembers(member1) + .addMembers(member2) + .addMembers(member3) + .addRequestingMembers(requesting4) + .build(), + newGroup); + } + @Test public void title() throws NotAbleToApplyGroupV2ChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder()