From ff478a5b0ac8e45f79150805d12a48d1c5d14523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=A4ufele?= Date: Mon, 6 Jan 2020 23:55:24 +0100 Subject: [PATCH] Add blocking/unblocking for groups --- src/main/java/org/asamk/Signal.java | 2 + .../asamk/signal/commands/BlockCommand.java | 47 +++++++++++++++++++ .../signal/commands/BlockContactCommand.java | 29 ------------ .../org/asamk/signal/commands/Commands.java | 4 +- .../asamk/signal/commands/UnblockCommand.java | 47 +++++++++++++++++++ .../commands/UnblockContactCommand.java | 29 ------------ .../org/asamk/signal/manager/Manager.java | 15 +++++- .../signal/storage/groups/GroupInfo.java | 5 +- 8 files changed, 116 insertions(+), 62 deletions(-) create mode 100644 src/main/java/org/asamk/signal/commands/BlockCommand.java delete mode 100644 src/main/java/org/asamk/signal/commands/BlockContactCommand.java create mode 100644 src/main/java/org/asamk/signal/commands/UnblockCommand.java delete mode 100644 src/main/java/org/asamk/signal/commands/UnblockContactCommand.java diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index 5ba7d116..51a35997 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -26,6 +26,8 @@ public interface Signal extends DBusInterface { void setContactBlocked(String number, boolean blocked); + void setGroupBlocked(byte[] groupId, boolean blocked) throws GroupNotFoundException; + List getGroupIds(); String getGroupName(byte[] groupId); diff --git a/src/main/java/org/asamk/signal/commands/BlockCommand.java b/src/main/java/org/asamk/signal/commands/BlockCommand.java new file mode 100644 index 00000000..afe7c4bb --- /dev/null +++ b/src/main/java/org/asamk/signal/commands/BlockCommand.java @@ -0,0 +1,47 @@ +package org.asamk.signal.commands; + +import net.sourceforge.argparse4j.inf.Namespace; +import net.sourceforge.argparse4j.inf.Subparser; +import org.asamk.signal.GroupIdFormatException; +import org.asamk.signal.GroupNotFoundException; +import org.asamk.signal.manager.Manager; +import org.asamk.signal.util.Util; + +public class BlockCommand implements LocalCommand { + + @Override + public void attachToSubparser(final Subparser subparser) { + subparser.addArgument("contact") + .help("Contact number") + .nargs("*"); + subparser.addArgument("-g", "--group") + .help("Group ID") + .nargs("*"); + subparser.help("Block the given contacts or groups (no messages will be received)"); + } + + @Override + public int handleCommand(final Namespace ns, final Manager m) { + if (!m.isRegistered()) { + System.err.println("User is not registered."); + return 1; + } + + for (String contact_number : ns.getList("contact")) { + m.setContactBlocked(contact_number, true); + } + + if(ns.getList("group") != null) { + for (String groupIdString : ns.getList("group")) { + try { + byte[] groupId = Util.decodeGroupId(groupIdString); + m.setGroupBlocked(groupId, true); + } catch (GroupIdFormatException | GroupNotFoundException e) { + System.err.println(e.getMessage()); + } + } + } + + return 0; + } +} diff --git a/src/main/java/org/asamk/signal/commands/BlockContactCommand.java b/src/main/java/org/asamk/signal/commands/BlockContactCommand.java deleted file mode 100644 index 7cbc9e8f..00000000 --- a/src/main/java/org/asamk/signal/commands/BlockContactCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.asamk.signal.commands; - -import net.sourceforge.argparse4j.inf.Namespace; -import net.sourceforge.argparse4j.inf.Subparser; -import org.asamk.signal.manager.Manager; - -public class BlockContactCommand implements LocalCommand { - - @Override - public void attachToSubparser(final Subparser subparser) { - subparser.addArgument("number") - .help("Contact number"); - subparser.help("Block the given contact (no messages will be received)"); - } - - @Override - public int handleCommand(final Namespace ns, final Manager m) { - if (!m.isRegistered()) { - System.err.println("User is not registered."); - return 1; - } - - String number = ns.getString("number"); - - m.setContactBlocked(number, true); - - return 0; - } -} diff --git a/src/main/java/org/asamk/signal/commands/Commands.java b/src/main/java/org/asamk/signal/commands/Commands.java index 563b5263..1ad0987a 100644 --- a/src/main/java/org/asamk/signal/commands/Commands.java +++ b/src/main/java/org/asamk/signal/commands/Commands.java @@ -9,7 +9,7 @@ public class Commands { static { addCommand("addDevice", new AddDeviceCommand()); - addCommand("blockContact", new BlockContactCommand()); + addCommand("block", new BlockCommand()); addCommand("daemon", new DaemonCommand()); addCommand("link", new LinkCommand()); addCommand("listContacts", new ListContactsCommand()); @@ -26,7 +26,7 @@ public class Commands { addCommand("updateContact", new UpdateContactCommand()); addCommand("setPin", new SetPinCommand()); addCommand("trust", new TrustCommand()); - addCommand("unblockContact", new UnblockContactCommand()); + addCommand("unblock", new UnblockCommand()); addCommand("unregister", new UnregisterCommand()); addCommand("updateAccount", new UpdateAccountCommand()); addCommand("updateGroup", new UpdateGroupCommand()); diff --git a/src/main/java/org/asamk/signal/commands/UnblockCommand.java b/src/main/java/org/asamk/signal/commands/UnblockCommand.java new file mode 100644 index 00000000..8e0a2702 --- /dev/null +++ b/src/main/java/org/asamk/signal/commands/UnblockCommand.java @@ -0,0 +1,47 @@ +package org.asamk.signal.commands; + +import net.sourceforge.argparse4j.inf.Namespace; +import net.sourceforge.argparse4j.inf.Subparser; +import org.asamk.signal.GroupIdFormatException; +import org.asamk.signal.GroupNotFoundException; +import org.asamk.signal.manager.Manager; +import org.asamk.signal.util.Util; + +public class UnblockCommand implements LocalCommand { + + @Override + public void attachToSubparser(final Subparser subparser) { + subparser.addArgument("contact") + .help("Contact number") + .nargs("*"); + subparser.addArgument("-g", "--group") + .help("Group ID") + .nargs("*"); + subparser.help("Unblock the given contacts or groups (messages will be received again)"); + } + + @Override + public int handleCommand(final Namespace ns, final Manager m) { + if (!m.isRegistered()) { + System.err.println("User is not registered."); + return 1; + } + + for (String contact_number : ns.getList("contact")) { + m.setContactBlocked(contact_number, false); + } + + if(ns.getList("group") != null) { + for (String groupIdString : ns.getList("group")) { + try { + byte[] groupId = Util.decodeGroupId(groupIdString); + m.setGroupBlocked(groupId, false); + } catch (GroupIdFormatException | GroupNotFoundException e) { + System.err.println(e.getMessage()); + } + } + } + + return 0; + } +} diff --git a/src/main/java/org/asamk/signal/commands/UnblockContactCommand.java b/src/main/java/org/asamk/signal/commands/UnblockContactCommand.java deleted file mode 100644 index 1abb9508..00000000 --- a/src/main/java/org/asamk/signal/commands/UnblockContactCommand.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.asamk.signal.commands; - -import net.sourceforge.argparse4j.inf.Namespace; -import net.sourceforge.argparse4j.inf.Subparser; -import org.asamk.signal.manager.Manager; - -public class UnblockContactCommand implements LocalCommand { - - @Override - public void attachToSubparser(final Subparser subparser) { - subparser.addArgument("number") - .help("Contact number"); - subparser.help("Unblock the given contact (messages will be received again)"); - } - - @Override - public int handleCommand(final Namespace ns, final Manager m) { - if (!m.isRegistered()) { - System.err.println("User is not registered."); - return 1; - } - - String number = ns.getString("number"); - - m.setContactBlocked(number, false); - - return 0; - } -} diff --git a/src/main/java/org/asamk/signal/manager/Manager.java b/src/main/java/org/asamk/signal/manager/Manager.java index b5d63215..f649a145 100644 --- a/src/main/java/org/asamk/signal/manager/Manager.java +++ b/src/main/java/org/asamk/signal/manager/Manager.java @@ -701,6 +701,19 @@ public class Manager implements Signal { account.save(); } + @Override + public void setGroupBlocked(final byte[] groupId, final boolean blocked) throws GroupNotFoundException { + GroupInfo group = getGroup(groupId); + if (group == null) { + throw new GroupNotFoundException(groupId); + } else { + System.err.println((blocked ? "Blocking" : "Unblocking") + " group " + Base64.encodeBytes(groupId)); + group.blocked = blocked; + account.getGroupStore().updateGroup(group); + account.save(); + } + } + @Override public List getGroupIds() { List groups = getGroups(); @@ -1441,7 +1454,7 @@ public class Manager implements Signal { out.write(new DeviceGroup(record.groupId, Optional.fromNullable(record.name), new ArrayList<>(record.getMembers()), createGroupAvatarAttachment(record.groupId), record.active, Optional.fromNullable(info != null ? info.messageExpirationTime : null), - Optional.fromNullable(record.color), false)); + Optional.fromNullable(record.color), record.blocked)); } } diff --git a/src/main/java/org/asamk/signal/storage/groups/GroupInfo.java b/src/main/java/org/asamk/signal/storage/groups/GroupInfo.java index c43bd832..1a4e0ec2 100644 --- a/src/main/java/org/asamk/signal/storage/groups/GroupInfo.java +++ b/src/main/java/org/asamk/signal/storage/groups/GroupInfo.java @@ -23,6 +23,8 @@ public class GroupInfo { public boolean active; @JsonProperty public String color; + @JsonProperty(defaultValue = "false") + public boolean blocked; private long avatarId; @@ -30,12 +32,13 @@ public class GroupInfo { this.groupId = groupId; } - public GroupInfo(@JsonProperty("groupId") byte[] groupId, @JsonProperty("name") String name, @JsonProperty("members") Collection members, @JsonProperty("avatarId") long avatarId, @JsonProperty("color") String color) { + public GroupInfo(@JsonProperty("groupId") byte[] groupId, @JsonProperty("name") String name, @JsonProperty("members") Collection members, @JsonProperty("avatarId") long avatarId, @JsonProperty("color") String color, @JsonProperty("blocked") boolean blocked) { this.groupId = groupId; this.name = name; this.members.addAll(members); this.avatarId = avatarId; this.color = color; + this.blocked = blocked; } @JsonIgnore