import org.asamk.signal.manager.groups.GroupInviteLinkUrl;
import org.asamk.signal.manager.groups.GroupLinkState;
import org.asamk.signal.manager.groups.GroupNotFoundException;
+import org.asamk.signal.manager.groups.GroupPermission;
import org.asamk.signal.manager.groups.GroupUtils;
import org.asamk.signal.manager.groups.NotAGroupMemberException;
import org.asamk.signal.manager.helper.GroupV2Helper;
List<String> removeAdmins,
boolean resetGroupLink,
GroupLinkState groupLinkState,
+ GroupPermission addMemberPermission,
+ GroupPermission editDetailsPermission,
File avatarFile,
Integer expirationTimer
) throws IOException, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException, NotAGroupMemberException {
removeAdmins == null ? null : getSignalServiceAddresses(removeAdmins),
resetGroupLink,
groupLinkState,
+ addMemberPermission,
+ editDetailsPermission,
avatarFile,
expirationTimer);
}
final Set<RecipientId> removeAdmins,
final boolean resetGroupLink,
final GroupLinkState groupLinkState,
+ final GroupPermission addMemberPermission,
+ final GroupPermission editDetailsPermission,
final File avatarFile,
- Integer expirationTimer
+ final Integer expirationTimer
) throws IOException, GroupNotFoundException, AttachmentInvalidException, NotAGroupMemberException {
var group = getGroupForUpdating(groupId);
removeAdmins,
resetGroupLink,
groupLinkState,
+ addMemberPermission,
+ editDetailsPermission,
avatarFile,
expirationTimer);
}
final Set<RecipientId> removeAdmins,
final boolean resetGroupLink,
final GroupLinkState groupLinkState,
+ final GroupPermission addMemberPermission,
+ final GroupPermission editDetailsPermission,
final File avatarFile,
Integer expirationTimer
) throws IOException {
result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
}
+ if (addMemberPermission != null) {
+ var groupGroupChangePair = groupV2Helper.setAddMemberPermission(group, addMemberPermission);
+ result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
+ }
+
+ if (editDetailsPermission != null) {
+ var groupGroupChangePair = groupV2Helper.setEditDetailsPermission(group, editDetailsPermission);
+ result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
+ }
+
if (expirationTimer != null) {
var groupGroupChangePair = groupV2Helper.setMessageExpirationTimer(group, expirationTimer);
result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
--- /dev/null
+package org.asamk.signal.manager.groups;
+
+public enum GroupPermission {
+ EVERY_MEMBER,
+ ONLY_ADMINS,
+}
import org.asamk.signal.manager.groups.GroupLinkPassword;
import org.asamk.signal.manager.groups.GroupLinkState;
+import org.asamk.signal.manager.groups.GroupPermission;
import org.asamk.signal.manager.groups.GroupUtils;
import org.asamk.signal.manager.storage.groups.GroupInfoV2;
import org.asamk.signal.manager.storage.recipients.Profile;
return commitChange(groupInfoV2, change);
}
+ public Pair<DecryptedGroup, GroupChange> setEditDetailsPermission(
+ GroupInfoV2 groupInfoV2, GroupPermission permission
+ ) throws IOException {
+ final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
+
+ final var accessRequired = toAccessControl(permission);
+ final var change = groupOperations.createChangeAttributesRights(accessRequired);
+ return commitChange(groupInfoV2, change);
+ }
+
+ public Pair<DecryptedGroup, GroupChange> setAddMemberPermission(
+ GroupInfoV2 groupInfoV2, GroupPermission permission
+ ) throws IOException {
+ final GroupsV2Operations.GroupOperations groupOperations = getGroupOperations(groupInfoV2);
+
+ final var accessRequired = toAccessControl(permission);
+ final var change = groupOperations.createChangeMembershipRights(accessRequired);
+ return commitChange(groupInfoV2, change);
+ }
+
public GroupChange joinGroup(
GroupMasterKey groupMasterKey,
GroupLinkPassword groupLinkPassword,
}
}
+ private AccessControl.AccessRequired toAccessControl(final GroupPermission permission) {
+ switch (permission) {
+ case EVERY_MEMBER:
+ return AccessControl.AccessRequired.MEMBER;
+ case ONLY_ADMINS:
+ 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);
--- /dev/null
+package org.asamk.signal;
+
+public enum GroupPermission {
+ EVERY_MEMBER {
+ @Override
+ public String toString() {
+ return "every-member";
+ }
+ },
+ ONLY_ADMINS {
+ @Override
+ public String toString() {
+ return "only-admins";
+ }
+ };
+
+ public org.asamk.signal.manager.groups.GroupPermission toManager() {
+ switch (this) {
+ case EVERY_MEMBER:
+ return org.asamk.signal.manager.groups.GroupPermission.EVERY_MEMBER;
+ case ONLY_ADMINS:
+ return org.asamk.signal.manager.groups.GroupPermission.ONLY_ADMINS;
+ default:
+ throw new AssertionError();
+ }
+ }
+}
try {
groupId = Util.decodeGroupId(ns.getString("group"));
} catch (GroupIdFormatException e) {
- throw new UserErrorException("Invalid group id:" + e.getMessage());
+ throw new UserErrorException("Invalid group id: " + e.getMessage());
}
try {
import org.asamk.Signal;
import org.asamk.signal.GroupLinkState;
+import org.asamk.signal.GroupPermission;
import org.asamk.signal.PlainTextWriterImpl;
import org.asamk.signal.commands.exceptions.CommandException;
import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
.help("Set group link state, with or without admin approval")
.type(Arguments.enumStringType(GroupLinkState.class));
+ subparser.addArgument("--set-permission-add-member")
+ .help("Set permission to add new group members")
+ .type(Arguments.enumStringType(GroupPermission.class));
+ subparser.addArgument("--set-permission-edit-details")
+ .help("Set permission to edit group details")
+ .type(Arguments.enumStringType(GroupPermission.class));
+
subparser.addArgument("-e", "--expiration").type(int.class).help("Set expiration time of messages (seconds)");
}
try {
groupId = Util.decodeGroupId(groupIdString);
} catch (GroupIdFormatException e) {
- throw new UserErrorException("Invalid group id:" + e.getMessage());
+ throw new UserErrorException("Invalid group id: " + e.getMessage());
}
}
var groupName = ns.getString("name");
-
var groupDescription = ns.getString("description");
-
var groupMembers = ns.<String>getList("member");
-
var groupRemoveMembers = ns.<String>getList("remove-member");
-
var groupAdmins = ns.<String>getList("admin");
-
var groupRemoveAdmins = ns.<String>getList("remove-admin");
-
var groupAvatar = ns.getString("avatar");
-
var groupResetLink = ns.getBoolean("reset-link");
-
var groupLinkState = ns.<GroupLinkState>get("link");
-
var groupExpiration = ns.getInt("expiration");
+ var groupAddMemberPermission = ns.<GroupPermission>get("set-permission-add-member");
+ var groupEditDetailsPermission = ns.<GroupPermission>get("set-permission-edit-details");
try {
if (groupId == null) {
groupRemoveAdmins,
groupResetLink,
groupLinkState != null ? groupLinkState.toLinkState() : null,
+ groupAddMemberPermission != null ? groupAddMemberPermission.toManager() : null,
+ groupEditDetailsPermission != null ? groupEditDetailsPermission.toManager() : null,
groupAvatar == null ? null : new File(groupAvatar),
groupExpiration);
ErrorUtils.handleTimestampAndSendMessageResults(writer, results.first(), results.second());
try {
groupId = Util.decodeGroupId(ns.getString("group")).serialize();
} catch (GroupIdFormatException e) {
- throw new UserErrorException("Invalid group id:" + e.getMessage());
+ throw new UserErrorException("Invalid group id: " + e.getMessage());
}
}
if (groupId == null) {
null,
false,
null,
+ null,
+ null,
avatar == null ? null : new File(avatar),
null);
checkSendMessageResults(results.first(), results.second());