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
.storageservice
.protos
.groups
.AccessControl
;
9 import org
.signal
.storageservice
.protos
.groups
.Member
;
10 import org
.signal
.storageservice
.protos
.groups
.local
.DecryptedGroup
;
11 import org
.signal
.storageservice
.protos
.groups
.local
.EnabledState
;
12 import org
.signal
.zkgroup
.groups
.GroupMasterKey
;
13 import org
.whispersystems
.signalservice
.api
.util
.UuidUtil
;
16 import java
.util
.stream
.Collectors
;
18 public class GroupInfoV2
extends GroupInfo
{
20 private final GroupIdV2 groupId
;
21 private final GroupMasterKey masterKey
;
23 private boolean blocked
;
24 private DecryptedGroup group
; // stored as a file with hexadecimal groupId as name
25 private RecipientResolver recipientResolver
;
26 private boolean permissionDenied
;
28 public GroupInfoV2(final GroupIdV2 groupId
, final GroupMasterKey masterKey
) {
29 this.groupId
= groupId
;
30 this.masterKey
= masterKey
;
34 final GroupIdV2 groupId
,
35 final GroupMasterKey masterKey
,
36 final boolean blocked
,
37 final boolean permissionDenied
39 this.groupId
= groupId
;
40 this.masterKey
= masterKey
;
41 this.blocked
= blocked
;
42 this.permissionDenied
= permissionDenied
;
46 public GroupIdV2
getGroupId() {
50 public GroupMasterKey
getMasterKey() {
54 public void setGroup(final DecryptedGroup group
, final RecipientResolver recipientResolver
) {
56 this.permissionDenied
= false;
59 this.recipientResolver
= recipientResolver
;
62 public DecryptedGroup
getGroup() {
67 public String
getTitle() {
68 if (this.group
== null) {
71 return this.group
.getTitle();
75 public String
getDescription() {
76 if (this.group
== null) {
79 return this.group
.getDescription();
83 public GroupInviteLinkUrl
getGroupInviteLink() {
84 if (this.group
== null || this.group
.getInviteLinkPassword().isEmpty() || (
85 this.group
.getAccessControl().getAddFromInviteLink() != AccessControl
.AccessRequired
.ANY
86 && this.group
.getAccessControl().getAddFromInviteLink()
87 != AccessControl
.AccessRequired
.ADMINISTRATOR
92 return GroupInviteLinkUrl
.forGroup(masterKey
, group
);
96 public Set
<RecipientId
> getMembers() {
97 if (this.group
== null) {
100 return group
.getMembersList()
102 .map(m
-> UuidUtil
.parseOrThrow(m
.getUuid().toByteArray()))
103 .map(recipientResolver
::resolveRecipient
)
104 .collect(Collectors
.toSet());
108 public Set
<RecipientId
> getPendingMembers() {
109 if (this.group
== null) {
112 return group
.getPendingMembersList()
114 .map(m
-> UuidUtil
.parseOrThrow(m
.getUuid().toByteArray()))
115 .map(recipientResolver
::resolveRecipient
)
116 .collect(Collectors
.toSet());
120 public Set
<RecipientId
> getRequestingMembers() {
121 if (this.group
== null) {
124 return group
.getRequestingMembersList()
126 .map(m
-> UuidUtil
.parseOrThrow(m
.getUuid().toByteArray()))
127 .map(recipientResolver
::resolveRecipient
)
128 .collect(Collectors
.toSet());
132 public Set
<RecipientId
> getAdminMembers() {
133 if (this.group
== null) {
136 return group
.getMembersList()
138 .filter(m
-> m
.getRole() == Member
.Role
.ADMINISTRATOR
)
139 .map(m
-> UuidUtil
.parseOrThrow(m
.getUuid().toByteArray()))
140 .map(recipientResolver
::resolveRecipient
)
141 .collect(Collectors
.toSet());
145 public boolean isBlocked() {
150 public void setBlocked(final boolean blocked
) {
151 this.blocked
= blocked
;
155 public int getMessageExpirationTimer() {
156 return this.group
!= null && this.group
.hasDisappearingMessagesTimer()
157 ?
this.group
.getDisappearingMessagesTimer().getDuration()
162 public boolean isAnnouncementGroup() {
163 return this.group
!= null && this.group
.getIsAnnouncementGroup() == EnabledState
.ENABLED
;
167 public GroupPermission
getPermissionAddMember() {
168 final var accessControl
= getAccessControl();
169 return accessControl
== null ? GroupPermission
.EVERY_MEMBER
: toGroupPermission(accessControl
.getMembers());
173 public GroupPermission
getPermissionEditDetails() {
174 final var accessControl
= getAccessControl();
175 return accessControl
== null ? GroupPermission
.EVERY_MEMBER
: toGroupPermission(accessControl
.getAttributes());
179 public GroupPermission
getPermissionSendMessage() {
180 return isAnnouncementGroup() ? GroupPermission
.ONLY_ADMINS
: GroupPermission
.EVERY_MEMBER
;
183 public void setPermissionDenied(final boolean permissionDenied
) {
184 this.permissionDenied
= permissionDenied
;
187 public boolean isPermissionDenied() {
188 return permissionDenied
;
191 private AccessControl
getAccessControl() {
192 if (this.group
== null || !this.group
.hasAccessControl()) {
196 return this.group
.getAccessControl();
199 private static GroupPermission
toGroupPermission(final AccessControl
.AccessRequired permission
) {
200 switch (permission
) {
202 return GroupPermission
.ONLY_ADMINS
;
205 return GroupPermission
.EVERY_MEMBER
;