]> nmode's Git Repositories - signal-cli/commitdiff
Add commands to update contact names on Signal servers
authorJérémy Bobbio <lunar@debian.org>
Tue, 24 Sep 2019 17:43:40 +0000 (19:43 +0200)
committerAsamK <asamk@gmx.de>
Wed, 16 Oct 2019 17:27:42 +0000 (19:27 +0200)
As Signal Desktop does not allow its users to update the contact names,
it would be nice to be able to update contact names from signal-cli when
the latter is the master device.

The command `setContactName` allow to set the name for the given contact
in the local store. `sendContacts` can then be used to push the updated
contact list on Signal servers.

Closes #228

man/signal-cli.1.adoc
src/main/java/org/asamk/signal/commands/Commands.java
src/main/java/org/asamk/signal/commands/SendContactsCommand.java [new file with mode: 0644]
src/main/java/org/asamk/signal/commands/SetContactNameCommand.java [new file with mode: 0644]
src/main/java/org/asamk/signal/manager/Manager.java

index c338bb6382ef4b0c5f0cd67f1bcbb3e1f73b0a31..2d91826be49a7ffa2a8ed1f81db18a337cb02c26 100644 (file)
@@ -223,6 +223,16 @@ with every outgoing messages (excluding group messages).
 *--remove-avatar*::
        Remove the avatar visible by message recipients.
 
+setContactName
+--------------
+Update name associated to a number on our contact list. This change is only local but can be synchronized to other devices by using `sendContacts` (see below).
+number::
+       Specify the contact phone number.
+name::
+       Specify the new name for this contact.
+sendContacts
+------------
+Update contact list on Signal servers.
 daemon
 ~~~~~~
 signal-cli can run in daemon mode and provides an experimental dbus interface. For
index 75efaef2d1a0f77070999a0cafb980fb194f2ac6..ed2796b82fdfb5897021ccc1c89528461ce7ad9e 100644 (file)
@@ -20,6 +20,8 @@ public class Commands {
         addCommand("removeDevice", new RemoveDeviceCommand());
         addCommand("removePin", new RemovePinCommand());
         addCommand("send", new SendCommand());
+        addCommand("sendContacts", new SendContactsCommand());
+        addCommand("setContactName", new SetContactNameCommand());
         addCommand("setPin", new SetPinCommand());
         addCommand("trust", new TrustCommand());
         addCommand("unregister", new UnregisterCommand());
diff --git a/src/main/java/org/asamk/signal/commands/SendContactsCommand.java b/src/main/java/org/asamk/signal/commands/SendContactsCommand.java
new file mode 100644 (file)
index 0000000..15241a3
--- /dev/null
@@ -0,0 +1,31 @@
+package org.asamk.signal.commands;
+
+import net.sourceforge.argparse4j.inf.Namespace;
+import net.sourceforge.argparse4j.inf.Subparser;
+import org.asamk.signal.manager.Manager;
+import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
+
+import java.io.IOException;
+
+public class SendContactsCommand implements LocalCommand {
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
+        subparser.help("Send contacts to the signal server.");
+    }
+
+    @Override
+    public int handleCommand(final Namespace ns, final Manager m) {
+        if (!m.isRegistered()) {
+            System.err.println("User is not registered.");
+            return 1;
+        }
+        try {
+            m.sendContacts();
+            return 0;
+        } catch (IOException | UntrustedIdentityException e) {
+            System.err.println("SendContacts error: " + e.getMessage());
+            return 3;
+        }
+    }
+}
diff --git a/src/main/java/org/asamk/signal/commands/SetContactNameCommand.java b/src/main/java/org/asamk/signal/commands/SetContactNameCommand.java
new file mode 100644 (file)
index 0000000..d7cbedc
--- /dev/null
@@ -0,0 +1,34 @@
+package org.asamk.signal.commands;
+
+import net.sourceforge.argparse4j.impl.Arguments;
+import net.sourceforge.argparse4j.inf.Namespace;
+import net.sourceforge.argparse4j.inf.Subparser;
+import org.asamk.signal.manager.Manager;
+
+public class SetContactNameCommand implements LocalCommand {
+
+    @Override
+    public void attachToSubparser(final Subparser subparser) {
+        subparser.addArgument("number")
+                .help("Contact number");
+        subparser.addArgument("name")
+                .help("New contact name");
+        subparser.help("Set the name of a given contact");
+    }
+
+    @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");
+        String name = ns.getString("name");
+
+        m.setContactName(number, name);
+
+        return 0;
+    }
+
+}
index 5aaf14e3af7156d1f060e8ed224d174286922ba4..a1458019548435cc31367db0d0291347c1e112a1 100644 (file)
@@ -1416,7 +1416,7 @@ public class Manager implements Signal {
         }
     }
 
-    private void sendContacts() throws IOException, UntrustedIdentityException {
+    public void sendContacts() throws IOException, UntrustedIdentityException {
         File contactsFile = IOUtils.createTempFile();
 
         try {