From 642d37edb2cdd82260465db3ae8caccde7ed3b9f Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 24 Jan 2022 14:21:21 -0500 Subject: [PATCH] Prevent updates to blocked groups. --- .../conversation/ConversationSettingsViewModel.kt | 9 +++++---- .../conversation/ConversationParentFragment.java | 2 +- .../securesms/groups/GroupManagerV2.java | 4 ++++ .../securesms/jobs/GroupV1MigrationJob.java | 5 +++++ .../securesms/jobs/PushGroupSilentUpdateSendJob.java | 12 +++++++++--- .../securesms/jobs/RequestGroupV2InfoWorkerJob.java | 5 +++++ 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt index 47b0420ca..813574d77 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt @@ -130,8 +130,8 @@ sealed class ConversationSettingsViewModel( state.copy( recipient = recipient, buttonStripState = ButtonStripPreference.State( - isVideoAvailable = recipient.registered == RecipientDatabase.RegisteredState.REGISTERED && !recipient.isSelf, - isAudioAvailable = !recipient.isGroup && !recipient.isSelf, + isVideoAvailable = recipient.registered == RecipientDatabase.RegisteredState.REGISTERED && !recipient.isSelf && !recipient.isBlocked, + isAudioAvailable = !recipient.isGroup && !recipient.isSelf && !recipient.isBlocked, isAudioSecure = recipient.registered == RecipientDatabase.RegisteredState.REGISTERED, isMuted = recipient.isMuted, isMuteAvailable = !recipient.isSelf, @@ -240,11 +240,12 @@ sealed class ConversationSettingsViewModel( private val liveGroup = LiveGroup(groupId) init { - store.update(liveGroup.groupRecipient) { recipient, state -> + val recipientAndIsActive = LiveDataUtil.combineLatest(liveGroup.groupRecipient, liveGroup.isActive) { r, a -> r to a } + store.update(recipientAndIsActive) { (recipient, isActive), state -> state.copy( recipient = recipient, buttonStripState = ButtonStripPreference.State( - isVideoAvailable = recipient.isPushV2Group, + isVideoAvailable = recipient.isPushV2Group && !recipient.isBlocked && isActive, isAudioAvailable = false, isAudioSecure = recipient.isPushV2Group, isMuted = recipient.isMuted, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 33a8dd496..0942398e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -624,7 +624,7 @@ public class ConversationParentFragment extends Fragment setBlockedUserState(recipientSnapshot, isSecureText, isDefaultSms); calculateCharactersRemaining(); - if (recipientSnapshot.getGroupId().isPresent() && recipientSnapshot.getGroupId().get().isV2()) { + if (recipientSnapshot.getGroupId().isPresent() && recipientSnapshot.getGroupId().get().isV2() && !recipientSnapshot.isBlocked()) { GroupId.V2 groupId = recipientSnapshot.getGroupId().get().requireV2(); ApplicationDependencies.getJobManager() 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 3a8fdce52..792d7af9d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -621,6 +621,10 @@ final class GroupManagerV2 { final DecryptedGroup decryptedGroupState; final DecryptedGroup previousGroupState; + if (Recipient.externalGroupExact(context, groupId).isBlocked()) { + throw new GroupChangeFailedException("Group is blocked."); + } + try { previousGroupState = v2GroupProperties.getDecryptedGroup(); decryptedChange = groupOperations.decryptChange(changeActions, selfAci.uuid()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java index c5917af57..009c01966 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/GroupV1MigrationJob.java @@ -123,6 +123,11 @@ public class GroupV1MigrationJob extends BaseJob { @Override protected void onRun() throws IOException, GroupChangeBusyException, RetryLaterException { + if (Recipient.resolved(recipientId).isBlocked()) { + Log.i(TAG, "Group blocked. Skipping."); + return; + } + try { GroupsV1MigrationUtil.migrate(context, recipientId, false); } catch (GroupsV1MigrationUtil.InvalidMigrationStateException e) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java index 50b271112..b412d9eec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSilentUpdateSendJob.java @@ -130,9 +130,15 @@ public final class PushGroupSilentUpdateSendJob extends BaseJob { throw new NotPushRegisteredException(); } - GroupId.V2 groupId = GroupId.v2(GroupUtil.requireMasterKey(groupContextV2.getMasterKey().toByteArray())); - List destinations = Stream.of(recipients).map(Recipient::resolved).toList(); - List completions = deliver(destinations, groupId); + GroupId.V2 groupId = GroupId.v2(GroupUtil.requireMasterKey(groupContextV2.getMasterKey().toByteArray())); + + if (Recipient.externalGroupExact(context, groupId).isBlocked()) { + Log.i(TAG, "Not updating group state for blocked group " + groupId); + return; + } + + List destinations = Stream.of(recipients).map(Recipient::resolved).toList(); + List completions = deliver(destinations, groupId); for (Recipient completion : completions) { recipients.remove(completion.getId()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java index e42579e0c..3ff200afb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RequestGroupV2InfoWorkerJob.java @@ -84,6 +84,11 @@ final class RequestGroupV2InfoWorkerJob extends BaseJob { return; } + if (Recipient.externalGroupExact(context, groupId).isBlocked()) { + Log.i(TAG, "Not fetching group info for blocked group " + groupId); + return; + } + GroupManager.updateGroupFromServer(context, group.get().requireV2GroupProperties().getGroupMasterKey(), toRevision, System.currentTimeMillis(), null); }