Search in sources :

Example 1 with InvalidGroupStateException

use of org.whispersystems.signalservice.api.groupsv2.InvalidGroupStateException in project Signal-Android by WhisperSystems.

the class GroupManagerV2 method createGroupOnServer.

@WorkerThread
@NonNull
private DecryptedGroup createGroupOnServer(@NonNull GroupSecretParams groupSecretParams, @Nullable String name, @Nullable byte[] avatar, @NonNull Collection<RecipientId> members, @NonNull Member.Role memberRole, int disappearingMessageTimerSeconds) throws GroupChangeFailedException, IOException, MembershipNotSuitableForV2Exception, GroupAlreadyExistsException {
    if (!GroupsV2CapabilityChecker.allAndSelfHaveUuidAndSupportGroupsV2(members)) {
        throw new MembershipNotSuitableForV2Exception("At least one potential new member does not support GV2 capability or we don't have their UUID");
    }
    GroupCandidate self = groupCandidateHelper.recipientIdToCandidate(Recipient.self().getId());
    Set<GroupCandidate> candidates = new HashSet<>(groupCandidateHelper.recipientIdsToCandidates(members));
    if (SignalStore.internalValues().gv2ForceInvites()) {
        Log.w(TAG, "Forcing GV2 invites due to internal setting");
        candidates = GroupCandidate.withoutProfileKeyCredentials(candidates);
    }
    if (!self.hasProfileKeyCredential()) {
        Log.w(TAG, "Cannot create a V2 group as self does not have a versioned profile");
        throw new MembershipNotSuitableForV2Exception("Cannot create a V2 group as self does not have a versioned profile");
    }
    GroupsV2Operations.NewGroup newGroup = groupsV2Operations.createNewGroup(groupSecretParams, name, Optional.fromNullable(avatar), self, candidates, memberRole, disappearingMessageTimerSeconds);
    try {
        groupsV2Api.putNewGroup(newGroup, authorization.getAuthorizationForToday(selfAci, groupSecretParams));
        DecryptedGroup decryptedGroup = groupsV2Api.getGroup(groupSecretParams, ApplicationDependencies.getGroupsV2Authorization().getAuthorizationForToday(selfAci, groupSecretParams));
        if (decryptedGroup == null) {
            throw new GroupChangeFailedException();
        }
        return decryptedGroup;
    } catch (VerificationFailedException | InvalidGroupStateException e) {
        throw new GroupChangeFailedException(e);
    } catch (GroupExistsException e) {
        throw new GroupAlreadyExistsException(e);
    }
}
Also used : GroupExistsException(org.whispersystems.signalservice.internal.push.exceptions.GroupExistsException) GroupCandidate(org.whispersystems.signalservice.api.groupsv2.GroupCandidate) VerificationFailedException(org.signal.zkgroup.VerificationFailedException) InvalidGroupStateException(org.whispersystems.signalservice.api.groupsv2.InvalidGroupStateException) GroupsV2Operations(org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations) DecryptedGroup(org.signal.storageservice.protos.groups.local.DecryptedGroup) HashSet(java.util.HashSet) WorkerThread(androidx.annotation.WorkerThread) NonNull(androidx.annotation.NonNull)

Aggregations

NonNull (androidx.annotation.NonNull)1 WorkerThread (androidx.annotation.WorkerThread)1 HashSet (java.util.HashSet)1 DecryptedGroup (org.signal.storageservice.protos.groups.local.DecryptedGroup)1 VerificationFailedException (org.signal.zkgroup.VerificationFailedException)1 GroupCandidate (org.whispersystems.signalservice.api.groupsv2.GroupCandidate)1 GroupsV2Operations (org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations)1 InvalidGroupStateException (org.whispersystems.signalservice.api.groupsv2.InvalidGroupStateException)1 GroupExistsException (org.whispersystems.signalservice.internal.push.exceptions.GroupExistsException)1