1 package org
.asamk
.signal
.manager
.storage
.groups
;
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
;
17 import java
.util
.stream
.Collectors
;
19 public final class GroupInfoV2
extends GroupInfo
{
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
;
28 private final RecipientResolver recipientResolver
;
31 final GroupIdV2 groupId
, final GroupMasterKey masterKey
, final RecipientResolver recipientResolver
33 this.groupId
= groupId
;
34 this.masterKey
= masterKey
;
35 this.distributionId
= DistributionId
.create();
36 this.recipientResolver
= recipientResolver
;
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
48 this.groupId
= groupId
;
49 this.masterKey
= masterKey
;
51 this.distributionId
= distributionId
;
52 this.blocked
= blocked
;
53 this.permissionDenied
= permissionDenied
;
54 this.recipientResolver
= recipientResolver
;
58 public GroupIdV2
getGroupId() {
62 public GroupMasterKey
getMasterKey() {
66 public DistributionId
getDistributionId() {
67 return distributionId
;
70 public void setGroup(final DecryptedGroup group
) {
72 this.permissionDenied
= false;
77 public DecryptedGroup
getGroup() {
82 public String
getTitle() {
83 if (this.group
== null) {
86 return this.group
.getTitle();
90 public String
getDescription() {
91 if (this.group
== null) {
94 return this.group
.getDescription();
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
107 return GroupInviteLinkUrl
.forGroup(masterKey
, group
);
111 public Set
<RecipientId
> getMembers() {
112 if (this.group
== null) {
115 return group
.getMembersList()
117 .map(m
-> ServiceId
.fromByteString(m
.getUuid()))
118 .map(recipientResolver
::resolveRecipient
)
119 .collect(Collectors
.toSet());
123 public Set
<RecipientId
> getBannedMembers() {
124 if (this.group
== null) {
127 return group
.getBannedMembersList()
129 .map(m
-> ServiceId
.fromByteString(m
.getUuid()))
130 .map(recipientResolver
::resolveRecipient
)
131 .collect(Collectors
.toSet());
135 public Set
<RecipientId
> getPendingMembers() {
136 if (this.group
== null) {
139 return group
.getPendingMembersList()
141 .map(m
-> ServiceId
.fromByteString(m
.getUuid()))
142 .map(recipientResolver
::resolveRecipient
)
143 .collect(Collectors
.toSet());
147 public Set
<RecipientId
> getRequestingMembers() {
148 if (this.group
== null) {
151 return group
.getRequestingMembersList()
153 .map(m
-> ServiceId
.fromByteString(m
.getUuid()))
154 .map(recipientResolver
::resolveRecipient
)
155 .collect(Collectors
.toSet());
159 public Set
<RecipientId
> getAdminMembers() {
160 if (this.group
== null) {
163 return group
.getMembersList()
165 .filter(m
-> m
.getRole() == Member
.Role
.ADMINISTRATOR
)
166 .map(m
-> ServiceId
.fromByteString(m
.getUuid()))
167 .map(recipientResolver
::resolveRecipient
)
168 .collect(Collectors
.toSet());
172 public boolean isBlocked() {
177 public void setBlocked(final boolean blocked
) {
178 this.blocked
= blocked
;
182 public int getMessageExpirationTimer() {
183 return this.group
!= null && this.group
.hasDisappearingMessagesTimer()
184 ?
this.group
.getDisappearingMessagesTimer().getDuration()
189 public boolean isAnnouncementGroup() {
190 return this.group
!= null && this.group
.getIsAnnouncementGroup() == EnabledState
.ENABLED
;
194 public GroupPermission
getPermissionAddMember() {
195 final var accessControl
= getAccessControl();
196 return accessControl
== null ? GroupPermission
.EVERY_MEMBER
: toGroupPermission(accessControl
.getMembers());
200 public GroupPermission
getPermissionEditDetails() {
201 final var accessControl
= getAccessControl();
202 return accessControl
== null ? GroupPermission
.EVERY_MEMBER
: toGroupPermission(accessControl
.getAttributes());
206 public GroupPermission
getPermissionSendMessage() {
207 return isAnnouncementGroup() ? GroupPermission
.ONLY_ADMINS
: GroupPermission
.EVERY_MEMBER
;
210 public void setPermissionDenied(final boolean permissionDenied
) {
211 this.permissionDenied
= permissionDenied
;
214 public boolean isPermissionDenied() {
215 return permissionDenied
;
218 private AccessControl
getAccessControl() {
219 if (this.group
== null || !this.group
.hasAccessControl()) {
223 return this.group
.getAccessControl();
226 private static GroupPermission
toGroupPermission(final AccessControl
.AccessRequired permission
) {
227 return switch (permission
) {
228 case ADMINISTRATOR
-> GroupPermission
.ONLY_ADMINS
;
229 default -> GroupPermission
.EVERY_MEMBER
;