From: AsamK Date: Sat, 15 May 2021 14:37:52 +0000 (+0200) Subject: Implement setting group permissions X-Git-Tag: v0.8.4~34 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/78f22c70205bdda075f5db6cd5b77ce0f0f79525 Implement setting group permissions --- diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 28e06bbe..c95ab9b7 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -25,6 +25,7 @@ import org.asamk.signal.manager.groups.GroupIdV1; 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; @@ -836,6 +837,8 @@ public class Manager implements Closeable { List removeAdmins, boolean resetGroupLink, GroupLinkState groupLinkState, + GroupPermission addMemberPermission, + GroupPermission editDetailsPermission, File avatarFile, Integer expirationTimer ) throws IOException, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException, NotAGroupMemberException { @@ -848,6 +851,8 @@ public class Manager implements Closeable { removeAdmins == null ? null : getSignalServiceAddresses(removeAdmins), resetGroupLink, groupLinkState, + addMemberPermission, + editDetailsPermission, avatarFile, expirationTimer); } @@ -862,8 +867,10 @@ public class Manager implements Closeable { final Set 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); @@ -877,6 +884,8 @@ public class Manager implements Closeable { removeAdmins, resetGroupLink, groupLinkState, + addMemberPermission, + editDetailsPermission, avatarFile, expirationTimer); } @@ -948,6 +957,8 @@ public class Manager implements Closeable { final Set removeAdmins, final boolean resetGroupLink, final GroupLinkState groupLinkState, + final GroupPermission addMemberPermission, + final GroupPermission editDetailsPermission, final File avatarFile, Integer expirationTimer ) throws IOException { @@ -1020,6 +1031,16 @@ public class Manager implements Closeable { 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()); diff --git a/lib/src/main/java/org/asamk/signal/manager/groups/GroupPermission.java b/lib/src/main/java/org/asamk/signal/manager/groups/GroupPermission.java new file mode 100644 index 00000000..00366497 --- /dev/null +++ b/lib/src/main/java/org/asamk/signal/manager/groups/GroupPermission.java @@ -0,0 +1,6 @@ +package org.asamk.signal.manager.groups; + +public enum GroupPermission { + EVERY_MEMBER, + ONLY_ADMINS, +} diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java b/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java index b8e7566f..06bfdcda 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java @@ -4,6 +4,7 @@ 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.GroupPermission; import org.asamk.signal.manager.groups.GroupUtils; import org.asamk.signal.manager.storage.groups.GroupInfoV2; import org.asamk.signal.manager.storage.recipients.Profile; @@ -314,6 +315,26 @@ public class GroupV2Helper { return commitChange(groupInfoV2, change); } + public Pair 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 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, @@ -390,6 +411,17 @@ public class GroupV2Helper { } } + 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); diff --git a/src/main/java/org/asamk/signal/GroupPermission.java b/src/main/java/org/asamk/signal/GroupPermission.java new file mode 100644 index 00000000..08056284 --- /dev/null +++ b/src/main/java/org/asamk/signal/GroupPermission.java @@ -0,0 +1,27 @@ +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(); + } + } +} diff --git a/src/main/java/org/asamk/signal/commands/QuitGroupCommand.java b/src/main/java/org/asamk/signal/commands/QuitGroupCommand.java index e47728d5..435d1896 100644 --- a/src/main/java/org/asamk/signal/commands/QuitGroupCommand.java +++ b/src/main/java/org/asamk/signal/commands/QuitGroupCommand.java @@ -33,7 +33,7 @@ public class QuitGroupCommand implements LocalCommand { 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 { diff --git a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java index 5a660650..6f7f87fd 100644 --- a/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java +++ b/src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java @@ -6,6 +6,7 @@ import net.sourceforge.argparse4j.inf.Subparser; 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; @@ -55,6 +56,13 @@ public class UpdateGroupCommand implements DbusCommand, LocalCommand { .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)"); } @@ -67,29 +75,22 @@ public class UpdateGroupCommand implements DbusCommand, LocalCommand { 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.getList("member"); - var groupRemoveMembers = ns.getList("remove-member"); - var groupAdmins = ns.getList("admin"); - var groupRemoveAdmins = ns.getList("remove-admin"); - var groupAvatar = ns.getString("avatar"); - var groupResetLink = ns.getBoolean("reset-link"); - var groupLinkState = ns.get("link"); - var groupExpiration = ns.getInt("expiration"); + var groupAddMemberPermission = ns.get("set-permission-add-member"); + var groupEditDetailsPermission = ns.get("set-permission-edit-details"); try { if (groupId == null) { @@ -109,6 +110,8 @@ public class UpdateGroupCommand implements DbusCommand, LocalCommand { 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()); @@ -134,7 +137,7 @@ public class UpdateGroupCommand implements DbusCommand, LocalCommand { 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) { diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 6ecf2aba..d9ff5996 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -349,6 +349,8 @@ public class DbusSignalImpl implements Signal { null, false, null, + null, + null, avatar == null ? null : new File(avatar), null); checkSendMessageResults(results.first(), results.second());