X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/c49b05cd75dd8cee795859b6045fbec0040d4144..17608ce5220142b979f777cbd1512416043f52bb:/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java diff --git a/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java b/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java index 7c0339c9..1f7e69e3 100644 --- a/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java +++ b/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java @@ -118,24 +118,7 @@ public class GroupHelper { return null; } - final int noUuidCapability = members.stream() - .filter(address -> !address.getUuid().isPresent()) - .collect(Collectors.toUnmodifiableSet()) - .size(); - if (noUuidCapability > 0) { - System.err.println("Cannot create a V2 group as " + noUuidCapability + " members don't have a UUID."); - return null; - } - - final int noGv2Capability = members.stream() - .map(profileProvider::getProfile) - .filter(profile -> !profile.getCapabilities().gv2) - .collect(Collectors.toUnmodifiableSet()) - .size(); - if (noGv2Capability > 0) { - System.err.println("Cannot create a V2 group as " + noGv2Capability + " members don't support Groups V2."); - return null; - } + if (!areMembersValid(members)) return null; GroupCandidate self = new GroupCandidate(selfAddressProvider.getSelfAddress().getUuid().orNull(), Optional.fromNullable(profileKeyCredential)); @@ -154,6 +137,29 @@ public class GroupHelper { 0); } + private boolean areMembersValid(final Collection members) { + final int noUuidCapability = members.stream() + .filter(address -> !address.getUuid().isPresent()) + .collect(Collectors.toUnmodifiableSet()) + .size(); + if (noUuidCapability > 0) { + System.err.println("Cannot create a V2 group as " + noUuidCapability + " members don't have a UUID."); + return false; + } + + final int noGv2Capability = members.stream() + .map(profileProvider::getProfile) + .filter(profile -> profile != null && !profile.getCapabilities().gv2) + .collect(Collectors.toUnmodifiableSet()) + .size(); + if (noGv2Capability > 0) { + System.err.println("Cannot create a V2 group as " + noGv2Capability + " members don't support Groups V2."); + return false; + } + + return true; + } + public Pair updateGroupV2( GroupInfoV2 groupInfoV2, String name, String avatarFile ) throws IOException { @@ -186,6 +192,8 @@ public class GroupHelper { final GroupSecretParams groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); GroupsV2Operations.GroupOperations groupOperations = groupsV2Operations.forGroup(groupSecretParams); + if (!areMembersValid(newMembers)) return null; + Set candidates = newMembers.stream() .map(member -> new GroupCandidate(member.getUuid().get(), Optional.fromNullable(profileKeyCredentialProvider.getProfileKeyCredential(member)))) @@ -215,6 +223,27 @@ public class GroupHelper { } } + public Pair acceptInvite(GroupInfoV2 groupInfoV2) throws IOException { + final GroupSecretParams groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey()); + final GroupsV2Operations.GroupOperations groupOperations = groupsV2Operations.forGroup(groupSecretParams); + + final SignalServiceAddress selfAddress = this.selfAddressProvider.getSelfAddress(); + final ProfileKeyCredential profileKeyCredential = profileKeyCredentialProvider.getProfileKeyCredential( + selfAddress); + if (profileKeyCredential == null) { + throw new IOException("Cannot join a V2 group as self does not have a versioned profile"); + } + + final GroupChange.Actions.Builder change = groupOperations.createAcceptInviteChange(profileKeyCredential); + + final Optional uuid = selfAddress.getUuid(); + if (uuid.isPresent()) { + change.setSourceUuid(UuidUtil.toByteString(uuid.get())); + } + + return commitChange(groupInfoV2, change); + } + public Pair revokeInvites( GroupInfoV2 groupInfoV2, Set pendingMembers ) throws IOException {