Search in sources :

Example 6 with DecryptedRequestingMember

use of org.signal.storageservice.protos.groups.local.DecryptedRequestingMember in project Signal-Android by WhisperSystems.

the class GroupChangeReconstruct method reconstructGroupChange.

/**
 * Given a {@param fromState} and a {@param toState} creates a {@link DecryptedGroupChange} that would take the {@param fromState} to the {@param toState}.
 */
public static DecryptedGroupChange reconstructGroupChange(DecryptedGroup fromState, DecryptedGroup toState) {
    DecryptedGroupChange.Builder builder = DecryptedGroupChange.newBuilder().setRevision(toState.getRevision());
    if (!fromState.getTitle().equals(toState.getTitle())) {
        builder.setNewTitle(DecryptedString.newBuilder().setValue(toState.getTitle()));
    }
    if (!fromState.getDescription().equals(toState.getDescription())) {
        builder.setNewDescription(DecryptedString.newBuilder().setValue(toState.getDescription()));
    }
    if (!fromState.getIsAnnouncementGroup().equals(toState.getIsAnnouncementGroup())) {
        builder.setNewIsAnnouncementGroup(toState.getIsAnnouncementGroup());
    }
    if (!fromState.getAvatar().equals(toState.getAvatar())) {
        builder.setNewAvatar(DecryptedString.newBuilder().setValue(toState.getAvatar()));
    }
    if (!fromState.getDisappearingMessagesTimer().equals(toState.getDisappearingMessagesTimer())) {
        builder.setNewTimer(toState.getDisappearingMessagesTimer());
    }
    if (!fromState.getAccessControl().getAttributes().equals(toState.getAccessControl().getAttributes())) {
        builder.setNewAttributeAccess(toState.getAccessControl().getAttributes());
    }
    if (!fromState.getAccessControl().getMembers().equals(toState.getAccessControl().getMembers())) {
        builder.setNewMemberAccess(toState.getAccessControl().getMembers());
    }
    Set<ByteString> fromStateMemberUuids = membersToSetOfUuids(fromState.getMembersList());
    Set<ByteString> toStateMemberUuids = membersToSetOfUuids(toState.getMembersList());
    Set<ByteString> pendingMembersListA = pendingMembersToSetOfUuids(fromState.getPendingMembersList());
    Set<ByteString> pendingMembersListB = pendingMembersToSetOfUuids(toState.getPendingMembersList());
    Set<ByteString> requestingMembersListA = requestingMembersToSetOfUuids(fromState.getRequestingMembersList());
    Set<ByteString> requestingMembersListB = requestingMembersToSetOfUuids(toState.getRequestingMembersList());
    Set<ByteString> removedPendingMemberUuids = subtract(pendingMembersListA, pendingMembersListB);
    Set<ByteString> removedRequestingMemberUuids = subtract(requestingMembersListA, requestingMembersListB);
    Set<ByteString> newPendingMemberUuids = subtract(pendingMembersListB, pendingMembersListA);
    Set<ByteString> newRequestingMemberUuids = subtract(requestingMembersListB, requestingMembersListA);
    Set<ByteString> removedMemberUuids = subtract(fromStateMemberUuids, toStateMemberUuids);
    Set<ByteString> newMemberUuids = subtract(toStateMemberUuids, fromStateMemberUuids);
    Set<ByteString> addedByInvitationUuids = intersect(newMemberUuids, removedPendingMemberUuids);
    Set<ByteString> addedByRequestApprovalUuids = intersect(newMemberUuids, removedRequestingMemberUuids);
    Set<DecryptedMember> addedMembersByInvitation = intersectByUUID(toState.getMembersList(), addedByInvitationUuids);
    Set<DecryptedMember> addedMembersByRequestApproval = intersectByUUID(toState.getMembersList(), addedByRequestApprovalUuids);
    Set<DecryptedMember> addedMembers = intersectByUUID(toState.getMembersList(), subtract(newMemberUuids, addedByInvitationUuids, addedByRequestApprovalUuids));
    Set<DecryptedPendingMember> uninvitedMembers = intersectPendingByUUID(fromState.getPendingMembersList(), subtract(removedPendingMemberUuids, addedByInvitationUuids));
    Set<DecryptedRequestingMember> rejectedRequestMembers = intersectRequestingByUUID(fromState.getRequestingMembersList(), subtract(removedRequestingMemberUuids, addedByRequestApprovalUuids));
    for (DecryptedMember member : intersectByUUID(fromState.getMembersList(), removedMemberUuids)) {
        builder.addDeleteMembers(member.getUuid());
    }
    for (DecryptedMember member : addedMembers) {
        builder.addNewMembers(member);
    }
    for (DecryptedMember member : addedMembersByInvitation) {
        builder.addPromotePendingMembers(member);
    }
    for (DecryptedPendingMember uninvitedMember : uninvitedMembers) {
        builder.addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder().setUuid(uninvitedMember.getUuid()).setUuidCipherText(uninvitedMember.getUuidCipherText()));
    }
    for (DecryptedPendingMember invitedMember : intersectPendingByUUID(toState.getPendingMembersList(), newPendingMemberUuids)) {
        builder.addNewPendingMembers(invitedMember);
    }
    Set<ByteString> consistentMemberUuids = intersect(fromStateMemberUuids, toStateMemberUuids);
    Set<DecryptedMember> changedMembers = intersectByUUID(subtract(toState.getMembersList(), fromState.getMembersList()), consistentMemberUuids);
    Map<ByteString, DecryptedMember> membersUuidMap = uuidMap(fromState.getMembersList());
    for (DecryptedMember newState : changedMembers) {
        DecryptedMember oldState = membersUuidMap.get(newState.getUuid());
        if (oldState.getRole() != newState.getRole()) {
            builder.addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder().setUuid(newState.getUuid()).setRole(newState.getRole()));
        }
        if (!oldState.getProfileKey().equals(newState.getProfileKey())) {
            builder.addModifiedProfileKeys(newState);
        }
    }
    if (!fromState.getAccessControl().getAddFromInviteLink().equals(toState.getAccessControl().getAddFromInviteLink())) {
        builder.setNewInviteLinkAccess(toState.getAccessControl().getAddFromInviteLink());
    }
    for (DecryptedRequestingMember requestingMember : intersectRequestingByUUID(toState.getRequestingMembersList(), newRequestingMemberUuids)) {
        builder.addNewRequestingMembers(requestingMember);
    }
    for (DecryptedRequestingMember requestingMember : rejectedRequestMembers) {
        builder.addDeleteRequestingMembers(requestingMember.getUuid());
    }
    for (DecryptedMember member : addedMembersByRequestApproval) {
        builder.addPromoteRequestingMembers(DecryptedApproveMember.newBuilder().setUuid(member.getUuid()).setRole(member.getRole()));
    }
    if (!fromState.getInviteLinkPassword().equals(toState.getInviteLinkPassword())) {
        builder.setNewInviteLinkPassword(toState.getInviteLinkPassword());
    }
    return builder.build();
}
Also used : DecryptedRequestingMember(org.signal.storageservice.protos.groups.local.DecryptedRequestingMember) ByteString(com.google.protobuf.ByteString) DecryptedGroupChange(org.signal.storageservice.protos.groups.local.DecryptedGroupChange) DecryptedPendingMember(org.signal.storageservice.protos.groups.local.DecryptedPendingMember) DecryptedMember(org.signal.storageservice.protos.groups.local.DecryptedMember)

Example 7 with DecryptedRequestingMember

use of org.signal.storageservice.protos.groups.local.DecryptedRequestingMember in project Signal-Android by WhisperSystems.

the class GroupChangeUtil method resolveConflict.

private static void resolveConflict(DecryptedGroup groupState, DecryptedGroupChange conflictingChange, ChangeSetModifier changeSetModifier) {
    HashMap<ByteString, DecryptedMember> fullMembersByUuid = new HashMap<>(groupState.getMembersCount());
    HashMap<ByteString, DecryptedPendingMember> pendingMembersByUuid = new HashMap<>(groupState.getPendingMembersCount());
    HashMap<ByteString, DecryptedRequestingMember> requestingMembersByUuid = new HashMap<>(groupState.getMembersCount());
    for (DecryptedMember member : groupState.getMembersList()) {
        fullMembersByUuid.put(member.getUuid(), member);
    }
    for (DecryptedPendingMember member : groupState.getPendingMembersList()) {
        pendingMembersByUuid.put(member.getUuid(), member);
    }
    for (DecryptedRequestingMember member : groupState.getRequestingMembersList()) {
        requestingMembersByUuid.put(member.getUuid(), member);
    }
    resolveField3AddMembers(conflictingChange, changeSetModifier, fullMembersByUuid, pendingMembersByUuid);
    resolveField4DeleteMembers(conflictingChange, changeSetModifier, fullMembersByUuid);
    resolveField5ModifyMemberRoles(conflictingChange, changeSetModifier, fullMembersByUuid);
    resolveField6ModifyProfileKeys(conflictingChange, changeSetModifier, fullMembersByUuid);
    resolveField7AddPendingMembers(conflictingChange, changeSetModifier, fullMembersByUuid, pendingMembersByUuid);
    resolveField8DeletePendingMembers(conflictingChange, changeSetModifier, pendingMembersByUuid);
    resolveField9PromotePendingMembers(conflictingChange, changeSetModifier, pendingMembersByUuid);
    resolveField10ModifyTitle(groupState, conflictingChange, changeSetModifier);
    resolveField11ModifyAvatar(groupState, conflictingChange, changeSetModifier);
    resolveField12modifyDisappearingMessagesTimer(groupState, conflictingChange, changeSetModifier);
    resolveField13modifyAttributesAccess(groupState, conflictingChange, changeSetModifier);
    resolveField14modifyAttributesAccess(groupState, conflictingChange, changeSetModifier);
    resolveField15modifyAddFromInviteLinkAccess(groupState, conflictingChange, changeSetModifier);
    resolveField16AddRequestingMembers(conflictingChange, changeSetModifier, fullMembersByUuid, pendingMembersByUuid);
    resolveField17DeleteMembers(conflictingChange, changeSetModifier, requestingMembersByUuid);
    resolveField18PromoteRequestingMembers(conflictingChange, changeSetModifier, requestingMembersByUuid);
    resolveField20ModifyDescription(groupState, conflictingChange, changeSetModifier);
    resolveField21ModifyAnnouncementsOnly(groupState, conflictingChange, changeSetModifier);
}
Also used : HashMap(java.util.HashMap) DecryptedRequestingMember(org.signal.storageservice.protos.groups.local.DecryptedRequestingMember) ByteString(com.google.protobuf.ByteString) DecryptedPendingMember(org.signal.storageservice.protos.groups.local.DecryptedPendingMember) DecryptedMember(org.signal.storageservice.protos.groups.local.DecryptedMember)

Example 8 with DecryptedRequestingMember

use of org.signal.storageservice.protos.groups.local.DecryptedRequestingMember in project Signal-Android by WhisperSystems.

the class DecryptedGroupUtil_apply_Test method cannot_apply_promote_requesting_member_without_a_role.

@Test(expected = NotAbleToApplyGroupV2ChangeException.class)
public void cannot_apply_promote_requesting_member_without_a_role() throws NotAbleToApplyGroupV2ChangeException {
    UUID uuid = UUID.randomUUID();
    DecryptedRequestingMember member = requestingMember(uuid);
    DecryptedGroupUtil.apply(DecryptedGroup.newBuilder().setRevision(13).addRequestingMembers(member).build(), DecryptedGroupChange.newBuilder().setRevision(14).addPromoteRequestingMembers(DecryptedApproveMember.newBuilder().setUuid(member.getUuid())).build());
}
Also used : DecryptedRequestingMember(org.signal.storageservice.protos.groups.local.DecryptedRequestingMember) UUID(java.util.UUID) Test(org.junit.Test)

Example 9 with DecryptedRequestingMember

use of org.signal.storageservice.protos.groups.local.DecryptedRequestingMember in project Signal-Android by WhisperSystems.

the class DecryptedGroupUtil_apply_Test method apply_new_requesting_member.

@Test
public void apply_new_requesting_member() throws NotAbleToApplyGroupV2ChangeException {
    DecryptedRequestingMember member1 = requestingMember(UUID.randomUUID());
    DecryptedRequestingMember member2 = requestingMember(UUID.randomUUID());
    DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder().setRevision(10).addRequestingMembers(member1).build(), DecryptedGroupChange.newBuilder().setRevision(11).addNewRequestingMembers(member2).build());
    assertEquals(DecryptedGroup.newBuilder().setRevision(11).addRequestingMembers(member1).addRequestingMembers(member2).build(), newGroup);
}
Also used : DecryptedRequestingMember(org.signal.storageservice.protos.groups.local.DecryptedRequestingMember) DecryptedGroup(org.signal.storageservice.protos.groups.local.DecryptedGroup) Test(org.junit.Test)

Aggregations

DecryptedRequestingMember (org.signal.storageservice.protos.groups.local.DecryptedRequestingMember)9 Test (org.junit.Test)5 DecryptedMember (org.signal.storageservice.protos.groups.local.DecryptedMember)5 DecryptedGroup (org.signal.storageservice.protos.groups.local.DecryptedGroup)4 UUID (java.util.UUID)3 DecryptedPendingMember (org.signal.storageservice.protos.groups.local.DecryptedPendingMember)3 ByteString (com.google.protobuf.ByteString)2 ProfileKey (org.signal.zkgroup.profiles.ProfileKey)2 ProtoTestUtils.newProfileKey (org.whispersystems.signalservice.api.groupsv2.ProtoTestUtils.newProfileKey)2 ProtoTestUtils.randomProfileKey (org.whispersystems.signalservice.api.groupsv2.ProtoTestUtils.randomProfileKey)2 ProtoTestUtils.withProfileKey (org.whispersystems.signalservice.api.groupsv2.ProtoTestUtils.withProfileKey)2 HashMap (java.util.HashMap)1 Member (org.signal.storageservice.protos.groups.Member)1 DecryptedApproveMember (org.signal.storageservice.protos.groups.local.DecryptedApproveMember)1 DecryptedGroupChange (org.signal.storageservice.protos.groups.local.DecryptedGroupChange)1