]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java
a06b83dfa3203d064533266429c1d92dcfac91ee
[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.storage.recipients.RecipientId;
6 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
7 import org.signal.storageservice.protos.groups.AccessControl;
8 import org.signal.storageservice.protos.groups.Member;
9 import org.signal.storageservice.protos.groups.local.DecryptedGroup;
10 import org.signal.storageservice.protos.groups.local.EnabledState;
11 import org.signal.zkgroup.groups.GroupMasterKey;
12 import org.whispersystems.signalservice.api.util.UuidUtil;
13
14 import java.util.Set;
15 import java.util.stream.Collectors;
16
17 public class GroupInfoV2 extends GroupInfo {
18
19 private final GroupIdV2 groupId;
20 private final GroupMasterKey masterKey;
21
22 private boolean blocked;
23 private DecryptedGroup group; // stored as a file with hexadecimal groupId as name
24 private RecipientResolver recipientResolver;
25 private boolean permissionDenied;
26
27 public GroupInfoV2(final GroupIdV2 groupId, final GroupMasterKey masterKey) {
28 this.groupId = groupId;
29 this.masterKey = masterKey;
30 }
31
32 public GroupInfoV2(
33 final GroupIdV2 groupId,
34 final GroupMasterKey masterKey,
35 final boolean blocked,
36 final boolean permissionDenied
37 ) {
38 this.groupId = groupId;
39 this.masterKey = masterKey;
40 this.blocked = blocked;
41 this.permissionDenied = permissionDenied;
42 }
43
44 @Override
45 public GroupIdV2 getGroupId() {
46 return groupId;
47 }
48
49 public GroupMasterKey getMasterKey() {
50 return masterKey;
51 }
52
53 public void setGroup(final DecryptedGroup group, final RecipientResolver recipientResolver) {
54 if (group != null) {
55 this.permissionDenied = false;
56 }
57 this.group = group;
58 this.recipientResolver = recipientResolver;
59 }
60
61 public DecryptedGroup getGroup() {
62 return group;
63 }
64
65 @Override
66 public String getTitle() {
67 if (this.group == null) {
68 return null;
69 }
70 return this.group.getTitle();
71 }
72
73 @Override
74 public String getDescription() {
75 if (this.group == null) {
76 return null;
77 }
78 return this.group.getDescription();
79 }
80
81 @Override
82 public GroupInviteLinkUrl getGroupInviteLink() {
83 if (this.group == null || this.group.getInviteLinkPassword().isEmpty() || (
84 this.group.getAccessControl().getAddFromInviteLink() != AccessControl.AccessRequired.ANY
85 && this.group.getAccessControl().getAddFromInviteLink()
86 != AccessControl.AccessRequired.ADMINISTRATOR
87 )) {
88 return null;
89 }
90
91 return GroupInviteLinkUrl.forGroup(masterKey, group);
92 }
93
94 @Override
95 public Set<RecipientId> getMembers() {
96 if (this.group == null) {
97 return Set.of();
98 }
99 return group.getMembersList()
100 .stream()
101 .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
102 .map(recipientResolver::resolveRecipient)
103 .collect(Collectors.toSet());
104 }
105
106 @Override
107 public Set<RecipientId> getPendingMembers() {
108 if (this.group == null) {
109 return Set.of();
110 }
111 return group.getPendingMembersList()
112 .stream()
113 .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
114 .map(recipientResolver::resolveRecipient)
115 .collect(Collectors.toSet());
116 }
117
118 @Override
119 public Set<RecipientId> getRequestingMembers() {
120 if (this.group == null) {
121 return Set.of();
122 }
123 return group.getRequestingMembersList()
124 .stream()
125 .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
126 .map(recipientResolver::resolveRecipient)
127 .collect(Collectors.toSet());
128 }
129
130 @Override
131 public Set<RecipientId> getAdminMembers() {
132 if (this.group == null) {
133 return Set.of();
134 }
135 return group.getMembersList()
136 .stream()
137 .filter(m -> m.getRole() == Member.Role.ADMINISTRATOR)
138 .map(m -> UuidUtil.parseOrThrow(m.getUuid().toByteArray()))
139 .map(recipientResolver::resolveRecipient)
140 .collect(Collectors.toSet());
141 }
142
143 @Override
144 public boolean isBlocked() {
145 return blocked;
146 }
147
148 @Override
149 public void setBlocked(final boolean blocked) {
150 this.blocked = blocked;
151 }
152
153 @Override
154 public int getMessageExpirationTime() {
155 return this.group != null && this.group.hasDisappearingMessagesTimer()
156 ? this.group.getDisappearingMessagesTimer().getDuration()
157 : 0;
158 }
159
160 @Override
161 public boolean isAnnouncementGroup() {
162 return this.group != null && this.group.getIsAnnouncementGroup() == EnabledState.ENABLED;
163 }
164
165 public void setPermissionDenied(final boolean permissionDenied) {
166 this.permissionDenied = permissionDenied;
167 }
168
169 public boolean isPermissionDenied() {
170 return permissionDenied;
171 }
172 }