]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java
fca71f10e2e001e82aebe4dfe2aaf4a29105c793
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / groups / GroupInfoV2.java
1 package org.asamk.signal.manager.storage.groups;
2
3 import org.asamk.signal.manager.groups.GroupIdV2;
4 import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
5 import org.asamk.signal.manager.groups.GroupPermission;
6 import org.asamk.signal.manager.storage.recipients.RecipientId;
7 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
8 import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
9 import org.signal.storageservice.protos.groups.AccessControl;
10 import org.signal.storageservice.protos.groups.Member;
11 import org.signal.storageservice.protos.groups.local.DecryptedGroup;
12 import org.signal.storageservice.protos.groups.local.EnabledState;
13 import org.whispersystems.signalservice.api.push.DistributionId;
14 import org.whispersystems.signalservice.api.push.ServiceId;
15
16 import java.util.Set;
17 import java.util.stream.Collectors;
18
19 public final class GroupInfoV2 extends GroupInfo {
20
21 private final GroupIdV2 groupId;
22 private final GroupMasterKey masterKey;
23 private DistributionId distributionId;
24 private boolean blocked;
25 private DecryptedGroup group;
26 private boolean permissionDenied;
27
28 private final RecipientResolver recipientResolver;
29
30 public GroupInfoV2(
31 final GroupIdV2 groupId, final GroupMasterKey masterKey, final RecipientResolver recipientResolver
32 ) {
33 this.groupId = groupId;
34 this.masterKey = masterKey;
35 this.distributionId = DistributionId.create();
36 this.recipientResolver = recipientResolver;
37 }
38
39 public GroupInfoV2(
40 final GroupIdV2 groupId,
41 final GroupMasterKey masterKey,
42 final DecryptedGroup group,
43 final DistributionId distributionId,
44 final boolean blocked,
45 final boolean permissionDenied,
46 final RecipientResolver recipientResolver
47 ) {
48 this.groupId = groupId;
49 this.masterKey = masterKey;
50 this.group = group;
51 this.distributionId = distributionId;
52 this.blocked = blocked;
53 this.permissionDenied = permissionDenied;
54 this.recipientResolver = recipientResolver;
55 }
56
57 @Override
58 public GroupIdV2 getGroupId() {
59 return groupId;
60 }
61
62 public GroupMasterKey getMasterKey() {
63 return masterKey;
64 }
65
66 public DistributionId getDistributionId() {
67 return distributionId;
68 }
69
70 public void setGroup(final DecryptedGroup group) {
71 if (group != null) {
72 this.permissionDenied = false;
73 }
74 this.group = group;
75 }
76
77 public DecryptedGroup getGroup() {
78 return group;
79 }
80
81 @Override
82 public String getTitle() {
83 if (this.group == null) {
84 return null;
85 }
86 return this.group.getTitle();
87 }
88
89 @Override
90 public String getDescription() {
91 if (this.group == null) {
92 return null;
93 }
94 return this.group.getDescription();
95 }
96
97 @Override
98 public GroupInviteLinkUrl getGroupInviteLink() {
99 if (this.group == null || this.group.getInviteLinkPassword().isEmpty() || (
100 this.group.getAccessControl().getAddFromInviteLink() != AccessControl.AccessRequired.ANY
101 && this.group.getAccessControl().getAddFromInviteLink()
102 != AccessControl.AccessRequired.ADMINISTRATOR
103 )) {
104 return null;
105 }
106
107 return GroupInviteLinkUrl.forGroup(masterKey, group);
108 }
109
110 @Override
111 public Set<RecipientId> getMembers() {
112 if (this.group == null) {
113 return Set.of();
114 }
115 return group.getMembersList()
116 .stream()
117 .map(m -> ServiceId.fromByteString(m.getUuid()))
118 .map(recipientResolver::resolveRecipient)
119 .collect(Collectors.toSet());
120 }
121
122 @Override
123 public Set<RecipientId> getBannedMembers() {
124 if (this.group == null) {
125 return Set.of();
126 }
127 return group.getBannedMembersList()
128 .stream()
129 .map(m -> ServiceId.fromByteString(m.getUuid()))
130 .map(recipientResolver::resolveRecipient)
131 .collect(Collectors.toSet());
132 }
133
134 @Override
135 public Set<RecipientId> getPendingMembers() {
136 if (this.group == null) {
137 return Set.of();
138 }
139 return group.getPendingMembersList()
140 .stream()
141 .map(m -> ServiceId.fromByteString(m.getUuid()))
142 .map(recipientResolver::resolveRecipient)
143 .collect(Collectors.toSet());
144 }
145
146 @Override
147 public Set<RecipientId> getRequestingMembers() {
148 if (this.group == null) {
149 return Set.of();
150 }
151 return group.getRequestingMembersList()
152 .stream()
153 .map(m -> ServiceId.fromByteString(m.getUuid()))
154 .map(recipientResolver::resolveRecipient)
155 .collect(Collectors.toSet());
156 }
157
158 @Override
159 public Set<RecipientId> getAdminMembers() {
160 if (this.group == null) {
161 return Set.of();
162 }
163 return group.getMembersList()
164 .stream()
165 .filter(m -> m.getRole() == Member.Role.ADMINISTRATOR)
166 .map(m -> ServiceId.fromByteString(m.getUuid()))
167 .map(recipientResolver::resolveRecipient)
168 .collect(Collectors.toSet());
169 }
170
171 @Override
172 public boolean isBlocked() {
173 return blocked;
174 }
175
176 @Override
177 public void setBlocked(final boolean blocked) {
178 this.blocked = blocked;
179 }
180
181 @Override
182 public int getMessageExpirationTimer() {
183 return this.group != null && this.group.hasDisappearingMessagesTimer()
184 ? this.group.getDisappearingMessagesTimer().getDuration()
185 : 0;
186 }
187
188 @Override
189 public boolean isAnnouncementGroup() {
190 return this.group != null && this.group.getIsAnnouncementGroup() == EnabledState.ENABLED;
191 }
192
193 @Override
194 public GroupPermission getPermissionAddMember() {
195 final var accessControl = getAccessControl();
196 return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getMembers());
197 }
198
199 @Override
200 public GroupPermission getPermissionEditDetails() {
201 final var accessControl = getAccessControl();
202 return accessControl == null ? GroupPermission.EVERY_MEMBER : toGroupPermission(accessControl.getAttributes());
203 }
204
205 @Override
206 public GroupPermission getPermissionSendMessage() {
207 return isAnnouncementGroup() ? GroupPermission.ONLY_ADMINS : GroupPermission.EVERY_MEMBER;
208 }
209
210 public void setPermissionDenied(final boolean permissionDenied) {
211 this.permissionDenied = permissionDenied;
212 }
213
214 public boolean isPermissionDenied() {
215 return permissionDenied;
216 }
217
218 private AccessControl getAccessControl() {
219 if (this.group == null || !this.group.hasAccessControl()) {
220 return null;
221 }
222
223 return this.group.getAccessControl();
224 }
225
226 private static GroupPermission toGroupPermission(final AccessControl.AccessRequired permission) {
227 return switch (permission) {
228 case ADMINISTRATOR -> GroupPermission.ONLY_ADMINS;
229 default -> GroupPermission.EVERY_MEMBER;
230 };
231 }
232 }