]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/Main.java
Update Readme and fix help bug in Main
[signal-cli] / src / main / java / org / asamk / signal / Main.java
index e5a2288f1f40b18d8e50b70d036a01dd7c8b60a2..b3664f24431408d86e28db24301e409edf1c5f7c 100644 (file)
@@ -26,8 +26,10 @@ import org.freedesktop.dbus.DBusConnection;
 import org.freedesktop.dbus.DBusSigHandler;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.freedesktop.dbus.exceptions.DBusExecutionException;
+import org.whispersystems.libsignal.InvalidKeyException;
 import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
 import org.whispersystems.signalservice.api.messages.*;
+import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo;
 import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
@@ -39,9 +41,12 @@ import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.security.Security;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.TimeoutException;
 
 public class Main {
 
@@ -144,6 +149,98 @@ public class Main {
                         System.exit(3);
                     }
                     break;
+                case "link":
+                    if (dBusConn != null) {
+                        System.err.println("link is not yet implemented via dbus");
+                        System.exit(1);
+                    }
+
+                    // When linking, username is null and we always have to create keys
+                    m.createNewIdentity();
+
+                    String deviceName = ns.getString("name");
+                    if (deviceName == null) {
+                        deviceName = "cli";
+                    }
+                    try {
+                        System.out.println(m.getDeviceLinkUri());
+                        m.finishDeviceLink(deviceName);
+                        System.out.println("Associated with: " + m.getUsername());
+                    } catch (TimeoutException e) {
+                        System.err.println("Link request timed out, please try again.");
+                        System.exit(3);
+                    } catch (IOException e) {
+                        System.err.println("Link request error: " + e.getMessage());
+                        System.exit(3);
+                    } catch (InvalidKeyException e) {
+                        e.printStackTrace();
+                        System.exit(3);
+                    } catch (UserAlreadyExists e) {
+                        System.err.println("The user " + e.getUsername() + " already exists\nDelete \"" + e.getFileName() + "\" before trying again.");
+                        System.exit(3);
+                    }
+                    break;
+                case "addDevice":
+                    if (dBusConn != null) {
+                        System.err.println("link is not yet implemented via dbus");
+                        System.exit(1);
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        System.exit(1);
+                    }
+                    try {
+                        m.addDeviceLink(new URI(ns.getString("uri")));
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        System.exit(3);
+                    } catch (InvalidKeyException e) {
+                        e.printStackTrace();
+                        System.exit(2);
+                    } catch (URISyntaxException e) {
+                        e.printStackTrace();
+                        System.exit(2);
+                    }
+                    break;
+                case "listDevices":
+                    if (dBusConn != null) {
+                        System.err.println("listDevices is not yet implemented via dbus");
+                        System.exit(1);
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        System.exit(1);
+                    }
+                    try {
+                        List<DeviceInfo> devices = m.getLinkedDevices();
+                        for (DeviceInfo d : devices) {
+                            System.out.println("Device " + d.getId() + (d.getId() == m.getDeviceId() ? " (this device)" : "") + ":");
+                            System.out.println(" Name: " + d.getName());
+                            System.out.println(" Created: " + d.getCreated());
+                            System.out.println(" Last seen: " + d.getLastSeen());
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        System.exit(3);
+                    }
+                    break;
+                case "removeDevice":
+                    if (dBusConn != null) {
+                        System.err.println("removeDevice is not yet implemented via dbus");
+                        System.exit(1);
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        System.exit(1);
+                    }
+                    try {
+                        int deviceId = ns.getInt("deviceId");
+                        m.removeLinkedDevices(deviceId);
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        System.exit(3);
+                    }
+                    break;
                 case "send":
                     if (dBusConn == null && !m.isRegistered()) {
                         System.err.println("User is not registered.");
@@ -407,7 +504,7 @@ public class Main {
                 .help("Show package version.")
                 .action(Arguments.version());
         parser.addArgument("--config")
-                .help("Set the path, where to store the config (Default: $HOME/.config/signal-cli).");
+                .help("Set the path, where to store the config (Default: $HOME/.config/signal).");
 
         MutuallyExclusiveGroup mut = parser.addMutuallyExclusiveGroup();
         mut.addArgument("-u", "--username")
@@ -425,6 +522,23 @@ public class Main {
                 .description("valid subcommands")
                 .help("additional help");
 
+        Subparser parserLink = subparsers.addParser("link");
+        parserLink.addArgument("-n", "--name")
+                .help("Specify a name to describe this new device.");
+
+        Subparser parserAddDevice = subparsers.addParser("addDevice");
+        parserAddDevice.addArgument("--uri")
+                .required(true)
+                .help("Specify the uri contained in the QR code shown by the new device.");
+
+        Subparser parserDevices = subparsers.addParser("listDevices");
+
+        Subparser parserRemoveDevice = subparsers.addParser("removeDevice");
+        parserRemoveDevice.addArgument("-d", "--deviceId")
+                .type(int.class)
+                .required(true)
+                .help("Specify the device you want to remove. Use listDevices to see the deviceIds.");
+
         Subparser parserRegister = subparsers.addParser("register");
         parserRegister.addArgument("-v", "--voice")
                 .help("The verification should be done over voice, not sms.")
@@ -477,7 +591,13 @@ public class Main {
 
         try {
             Namespace ns = parser.parseArgs(args);
-            if (!ns.getBoolean("dbus") && !ns.getBoolean("dbus_system")) {
+            if ("link".equals(ns.getString("command"))) {
+                if (ns.getString("username") != null) {
+                    parser.printUsage();
+                    System.err.println("You cannot specify a username (phone number) when linking");
+                    System.exit(2);
+                }
+            } else if (!ns.getBoolean("dbus") && !ns.getBoolean("dbus_system")) {
                 if (ns.getString("username") == null) {
                     parser.printUsage();
                     System.err.println("You need to specify a username (phone number)");
@@ -550,6 +670,7 @@ public class Main {
                         handleSignalServiceDataMessage(message, group);
                     }
                     if (content.getSyncMessage().isPresent()) {
+                        System.out.println("Received a sync message");
                         SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
 
                         if (syncMessage.getContacts().isPresent()) {