From 03c68375db89783ddde3368ef9a058fe144093f2 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Tue, 7 Feb 2023 09:57:36 -0500 Subject: [PATCH] Fix bad group state when requesting to rejoin a group. --- .../thoughtcrime/securesms/groups/GroupManagerV2.java | 8 ++++++++ .../groups/v2/processing/GroupsV2StateProcessor.java | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) 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 748eea0f0..cbc219122 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -937,6 +937,14 @@ final class GroupManagerV2 { if (group.isPresent()) { Log.i(TAG, "Group already present locally"); + if (decryptedChange != null) { + try { + groupsV2StateProcessor.forGroup(SignalStore.account().getServiceIds(), groupMasterKey) + .updateLocalGroupToRevision(decryptedChange.getRevision(), System.currentTimeMillis(), decryptedChange); + } catch (GroupNotAMemberException e) { + Log.w(TAG, "Unable to apply join change to existing group", e); + } + } } else { groupDatabase.create(groupMasterKey, decryptedGroup); Log.i(TAG, "Created local group with placeholder"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index 267ce64ca..20ea7ffe1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -19,6 +19,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroupChange; import org.signal.storageservice.protos.groups.local.DecryptedMember; import org.signal.storageservice.protos.groups.local.DecryptedPendingMember; import org.signal.storageservice.protos.groups.local.DecryptedPendingMemberRemoval; +import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember; import org.thoughtcrime.securesms.database.GroupTable; import org.thoughtcrime.securesms.database.model.GroupRecord; import org.thoughtcrime.securesms.database.MessageTable; @@ -333,7 +334,14 @@ public class GroupsV2StateProcessor { .filter(Objects::nonNull) .anyMatch(serviceIds::matches); - return !currentlyInGroup && !addedAsMember && !addedAsPendingMember; + boolean addedAsRequestingMember = signedGroupChange.getNewRequestingMembersList() + .stream() + .map(DecryptedRequestingMember::getUuid) + .map(UuidUtil::fromByteStringOrNull) + .filter(Objects::nonNull) + .anyMatch(serviceIds::matches); + + return !currentlyInGroup && !addedAsMember && !addedAsPendingMember && !addedAsRequestingMember; } private boolean notHavingInviteRevoked(@NonNull DecryptedGroupChange signedGroupChange) {