import com.google.protobuf.InvalidProtocolBufferException;
import org.asamk.signal.manager.groups.GroupLinkPassword;
+import org.asamk.signal.manager.groups.GroupLinkState;
import org.asamk.signal.manager.groups.GroupUtils;
import org.asamk.signal.manager.storage.groups.GroupInfoV2;
import org.asamk.signal.manager.storage.recipients.Profile;
return revokeInvites(groupInfoV2, memberUuids);
}
+ public Pair<DecryptedGroup, GroupChange> resetGroupLinkPassword(GroupInfoV2 groupInfoV2) throws IOException {
+ final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
+ final var newGroupLinkPassword = GroupLinkPassword.createNew().serialize();
+ final var change = groupOperations.createModifyGroupLinkPasswordChange(newGroupLinkPassword);
+ return commitChange(groupInfoV2, change);
+ }
+
+ public Pair<DecryptedGroup, GroupChange> setGroupLinkState(
+ GroupInfoV2 groupInfoV2, GroupLinkState state
+ ) throws IOException {
+ final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
+
+ final var accessRequired = toAccessControl(state);
+ final var requiresNewPassword = state != GroupLinkState.DISABLED && groupInfoV2.getGroup()
+ .getInviteLinkPassword()
+ .isEmpty();
+
+ final var change = requiresNewPassword ? groupOperations.createModifyGroupLinkPasswordAndRightsChange(
+ GroupLinkPassword.createNew().serialize(),
+ accessRequired) : groupOperations.createChangeJoinByLinkRights(accessRequired);
+ return commitChange(groupInfoV2, change);
+ }
+
public GroupChange joinGroup(
GroupMasterKey groupMasterKey,
GroupLinkPassword groupLinkPassword,
return commitChange(groupInfoV2, change);
}
+ private AccessControl.AccessRequired toAccessControl(final GroupLinkState state) {
+ switch (state) {
+ case DISABLED:
+ return AccessControl.AccessRequired.UNSATISFIABLE;
+ case ENABLED:
+ return AccessControl.AccessRequired.ANY;
+ case ENABLED_WITH_APPROVAL:
+ return AccessControl.AccessRequired.ADMINISTRATOR;
+ default:
+ throw new AssertionError();
+ }
+ }
+
private GroupsV2Operations.GroupOperations getGroupOperations(final GroupInfoV2 groupInfoV2) {
final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey());
return groupsV2Operations.forGroup(groupSecretParams);