Fix various corner case block/reject join request bugs.

This commit is contained in:
Cody Henthorne
2022-03-18 11:00:23 -04:00
parent b8e98350c1
commit e6ac40a07c
8 changed files with 83 additions and 26 deletions

View File

@@ -6,6 +6,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.google.protobuf.ByteString;
import org.signal.core.util.logging.Log;
import org.signal.storageservice.protos.groups.GroupExternalCredential;
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
@@ -22,6 +24,7 @@ import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException;
import org.whispersystems.signalservice.api.util.UuidUtil;
import java.io.IOException;
import java.util.Collection;
@@ -280,8 +283,19 @@ public final class GroupManager {
@NonNull RecipientId recipientId)
throws GroupChangeBusyException, IOException, GroupChangeFailedException, GroupNotAMemberException, GroupInsufficientRightsException
{
GroupDatabase.GroupRecord groupRecord = SignalDatabase.groups().requireGroup(groupId);
Recipient recipient = Recipient.resolved(recipientId);
if (groupRecord.requireV2GroupProperties().getBannedMembers().contains(recipient.requireServiceId().uuid())) {
Log.i(TAG, "Attempt to ban already banned recipient: " + recipientId);
return;
}
ByteString uuid = UuidUtil.toByteString(recipient.requireServiceId().uuid());
boolean rejectJoinRequest = groupRecord.requireV2GroupProperties().getDecryptedGroup().getRequestingMembersList().stream().anyMatch(m -> m.getUuid().equals(uuid));
try (GroupManagerV2.GroupEditor editor = new GroupManagerV2(context).edit(groupId.requireV2())) {
editor.ban(Collections.singleton(Recipient.resolved(recipientId).requireServiceId().uuid()));
editor.ban(Collections.singleton(recipient.requireServiceId().uuid()), rejectJoinRequest);
}
}

View File

@@ -530,8 +530,8 @@ final class GroupManagerV2 {
return commitChangeWithConflictResolution(groupOperations.createAcceptInviteChange(groupCandidate.getProfileKeyCredential().get()));
}
public GroupManager.GroupActionResult ban(Set<UUID> uuids) throws GroupChangeFailedException, GroupNotAMemberException, GroupInsufficientRightsException, IOException {
return commitChangeWithConflictResolution(groupOperations.createBanUuidsChange(uuids));
public GroupManager.GroupActionResult ban(Set<UUID> uuids, boolean rejectJoinRequest) throws GroupChangeFailedException, GroupNotAMemberException, GroupInsufficientRightsException, IOException {
return commitChangeWithConflictResolution(groupOperations.createBanUuidsChange(uuids, rejectJoinRequest));
}
public GroupManager.GroupActionResult unban(Set<UUID> uuids) throws GroupChangeFailedException, GroupNotAMemberException, GroupInsufficientRightsException, IOException {

View File

@@ -32,6 +32,8 @@ import org.whispersystems.signalservice.api.push.ServiceId;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public final class LiveGroup {
@@ -141,6 +143,10 @@ public final class LiveGroup {
return Transformations.map(groupRecord, g -> g.isAdmin(Recipient.self()));
}
public LiveData<Set<UUID>> getBannedMembers() {
return Transformations.map(groupRecord, g -> g.isV2Group() ? g.requireV2GroupProperties().getBannedMembers() : Collections.emptySet());
}
public LiveData<Boolean> isActive() {
return Transformations.map(groupRecord, GroupDatabase.GroupRecord::isActive);
}