]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/helper/GroupHelper.java
Migrate local group to v2 if another member has migrated it
[signal-cli] / src / main / java / org / asamk / signal / manager / helper / GroupHelper.java
1 package org.asamk.signal.manager.helper;
2
3 import org.signal.storageservice.protos.groups.Member;
4 import org.signal.zkgroup.groups.GroupSecretParams;
5 import org.signal.zkgroup.profiles.ProfileKeyCredential;
6 import org.whispersystems.libsignal.util.guava.Optional;
7 import org.whispersystems.signalservice.api.groupsv2.GroupCandidate;
8 import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
9 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
10
11 import java.util.Collection;
12 import java.util.Set;
13 import java.util.stream.Collectors;
14
15 public class GroupHelper {
16
17 private final ProfileKeyCredentialProvider profileKeyCredentialProvider;
18
19 private final ProfileProvider profileProvider;
20
21 private final SelfAddressProvider selfAddressProvider;
22
23 private final GroupsV2Operations groupsV2Operations;
24
25 public GroupHelper(
26 final ProfileKeyCredentialProvider profileKeyCredentialProvider,
27 final ProfileProvider profileProvider,
28 final SelfAddressProvider selfAddressProvider,
29 final GroupsV2Operations groupsV2Operations
30 ) {
31 this.profileKeyCredentialProvider = profileKeyCredentialProvider;
32 this.profileProvider = profileProvider;
33 this.selfAddressProvider = selfAddressProvider;
34 this.groupsV2Operations = groupsV2Operations;
35 }
36
37 public GroupsV2Operations.NewGroup createGroupV2(
38 String name, Collection<SignalServiceAddress> members, byte[] avatar
39 ) {
40 final ProfileKeyCredential profileKeyCredential = profileKeyCredentialProvider.getProfileKeyCredential(
41 selfAddressProvider.getSelfAddress());
42 if (profileKeyCredential == null) {
43 System.err.println("Cannot create a V2 group as self does not have a versioned profile");
44 return null;
45 }
46
47 final int noUuidCapability = members.stream()
48 .filter(address -> !address.getUuid().isPresent())
49 .collect(Collectors.toUnmodifiableSet())
50 .size();
51 if (noUuidCapability > 0) {
52 System.err.println("Cannot create a V2 group as " + noUuidCapability + " members don't have a UUID.");
53 return null;
54 }
55
56 final int noGv2Capability = members.stream()
57 .map(profileProvider::getProfile)
58 .filter(profile -> !profile.getCapabilities().gv2)
59 .collect(Collectors.toUnmodifiableSet())
60 .size();
61 if (noGv2Capability > 0) {
62 System.err.println("Cannot create a V2 group as " + noGv2Capability + " members don't support Groups V2.");
63 return null;
64 }
65
66 GroupCandidate self = new GroupCandidate(selfAddressProvider.getSelfAddress().getUuid().orNull(),
67 Optional.fromNullable(profileKeyCredential));
68 Set<GroupCandidate> candidates = members.stream()
69 .map(member -> new GroupCandidate(member.getUuid().get(),
70 Optional.fromNullable(profileKeyCredentialProvider.getProfileKeyCredential(member))))
71 .collect(Collectors.toSet());
72
73 final GroupSecretParams groupSecretParams = GroupSecretParams.generate();
74 return groupsV2Operations.createNewGroup(groupSecretParams,
75 name,
76 Optional.fromNullable(avatar),
77 self,
78 candidates,
79 Member.Role.DEFAULT,
80 0);
81 }
82
83 }