]> nmode's Git Repositories - signal-cli/commitdiff
Implement setting group permissions
authorAsamK <asamk@gmx.de>
Sat, 15 May 2021 14:37:52 +0000 (16:37 +0200)
committerAsamK <asamk@gmx.de>
Sat, 15 May 2021 15:04:22 +0000 (17:04 +0200)
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/groups/GroupPermission.java [new file with mode: 0644]
lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java
src/main/java/org/asamk/signal/GroupPermission.java [new file with mode: 0644]
src/main/java/org/asamk/signal/commands/QuitGroupCommand.java
src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index 28e06bbe0ec6c182776c50fba55fa403f35450ea..c95ab9b7b1ff3c62b3acb71ca2157fb42504a843 100644 (file)
@@ -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<String> 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<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);
 
@@ -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<RecipientId> 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 (file)
index 0000000..0036649
--- /dev/null
@@ -0,0 +1,6 @@
+package org.asamk.signal.manager.groups;
+
+public enum GroupPermission {
+    EVERY_MEMBER,
+    ONLY_ADMINS,
+}
index b8e7566f28c3287ac67aff06e191cf0e9a6bbe66..06bfdcdac84c7eb0282f551e98d6de82a8f67cfd 100644 (file)
@@ -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<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,
@@ -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 (file)
index 0000000..0805628
--- /dev/null
@@ -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();
+        }
+    }
+}
index e47728d5278f49e69c3778e4795c48dc1112d4ee..435d1896585e0a50991fa0c59d86731360e0252d 100644 (file)
@@ -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 {
index 5a6606504b060d95b2a5e009052d924545e67dda..6f7f87fdfb2cb985ffd17738a1c6a2613f8ed839 100644 (file)
@@ -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.<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) {
@@ -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) {
index 6ecf2abaa19b8523b8b17414faec727b5f1a6eac..d9ff59966c19441a028ce4b90412178a90abe5e8 100644 (file)
@@ -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());