]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/Main.java
Update dependencies, add attachment filename support
[signal-cli] / src / main / java / org / asamk / signal / Main.java
index 7d89d4802e9eb946f3174d87eb974b4c68f40d5b..c896365953217b69b76099d3ccdc3d0d6f283402 100644 (file)
@@ -21,6 +21,11 @@ import net.sourceforge.argparse4j.impl.Arguments;
 import net.sourceforge.argparse4j.inf.*;
 import org.apache.http.util.TextUtils;
 import org.asamk.Signal;
+import org.asamk.signal.storage.contacts.ContactInfo;
+import org.asamk.signal.storage.groups.GroupInfo;
+import org.asamk.signal.storage.protocol.JsonIdentityKeyStore;
+import org.asamk.signal.util.Base64;
+import org.asamk.signal.util.Hex;
 import org.freedesktop.dbus.DBusConnection;
 import org.freedesktop.dbus.DBusSigHandler;
 import org.freedesktop.dbus.exceptions.DBusException;
@@ -88,6 +93,9 @@ public class Main {
                     ts = (Signal) dBusConn.getRemoteObject(
                             SIGNAL_BUSNAME, SIGNAL_OBJECTPATH,
                             Signal.class);
+                } catch (UnsatisfiedLinkError e) {
+                    System.err.println("Missing native library dependency for dbus service: " + e.getMessage());
+                    return 1;
                 } catch (DBusException e) {
                     e.printStackTrace();
                     if (dBusConn != null) {
@@ -135,6 +143,38 @@ public class Main {
                         return 3;
                     }
                     break;
+                case "unregister":
+                    if (dBusConn != null) {
+                        System.err.println("unregister is not yet implemented via dbus");
+                        return 1;
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        return 1;
+                    }
+                    try {
+                        m.unregister();
+                    } catch (IOException e) {
+                        System.err.println("Unregister error: " + e.getMessage());
+                        return 3;
+                    }
+                    break;
+                case "updateAccount":
+                    if (dBusConn != null) {
+                        System.err.println("updateAccount is not yet implemented via dbus");
+                        return 1;
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        return 1;
+                    }
+                    try {
+                        m.updateAccountAttributes();
+                    } catch (IOException e) {
+                        System.err.println("UpdateAccount error: " + e.getMessage());
+                        return 3;
+                    }
+                    break;
                 case "verify":
                     if (dBusConn != null) {
                         System.err.println("verify is not yet implemented via dbus");
@@ -350,6 +390,9 @@ public class Main {
                                     System.out.println();
                                 }
                             });
+                        } catch (UnsatisfiedLinkError e) {
+                            System.err.println("Missing native library dependency for dbus service: " + e.getMessage());
+                            return 1;
                         } catch (DBusException e) {
                             e.printStackTrace();
                             return 1;
@@ -453,6 +496,23 @@ public class Main {
                         return 3;
                     }
 
+                    break;
+                case "listGroups":
+                    if (dBusConn != null) {
+                        System.err.println("listGroups is not yet implemented via dbus");
+                        return 1;
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        return 1;
+                    }
+
+                    List<GroupInfo> groups = m.getGroups();
+                    boolean detailed = ns.getBoolean("detailed");
+
+                    for (GroupInfo group : groups) {
+                        printGroup(group, detailed);
+                    }
                     break;
                 case "listIdentities":
                     if (dBusConn != null) {
@@ -546,6 +606,9 @@ public class Main {
                             conn = DBusConnection.getConnection(busType);
                             conn.exportObject(SIGNAL_OBJECTPATH, m);
                             conn.requestBusName(SIGNAL_BUSNAME);
+                        } catch (UnsatisfiedLinkError e) {
+                            System.err.println("Missing native library dependency for dbus service: " + e.getMessage());
+                            return 1;
                         } catch (DBusException e) {
                             e.printStackTrace();
                             return 2;
@@ -577,9 +640,19 @@ public class Main {
     }
 
     private static void printIdentityFingerprint(Manager m, String theirUsername, JsonIdentityKeyStore.Identity theirId) {
-        String digits = formatSafetyNumber(m.computeSafetyNumber(theirUsername, theirId.identityKey));
+        String digits = formatSafetyNumber(m.computeSafetyNumber(theirUsername, theirId.getIdentityKey()));
         System.out.println(String.format("%s: %s Added: %s Fingerprint: %s Safety Number: %s", theirUsername,
-                theirId.trustLevel, theirId.added, Hex.toStringCondensed(theirId.getFingerprint()), digits));
+                theirId.getTrustLevel(), theirId.getDateAdded(), Hex.toStringCondensed(theirId.getFingerprint()), digits));
+    }
+
+    private static void printGroup(GroupInfo group, boolean detailed) {
+        if (detailed) {
+            System.out.println(String.format("Id: %s Name: %s  Active: %s Members: %s",
+                    Base64.encodeBytes(group.groupId), group.name, group.active, group.members));
+        } else {
+            System.out.println(String.format("Id: %s Name: %s  Active: %s", Base64.encodeBytes(group.groupId),
+                    group.name, group.active));
+        }
     }
 
     private static String formatSafetyNumber(String digits) {
@@ -670,6 +743,12 @@ public class Main {
                 .help("The verification should be done over voice, not sms.")
                 .action(Arguments.storeTrue());
 
+        Subparser parserUnregister = subparsers.addParser("unregister");
+        parserUnregister.help("Unregister the current device from the signal server.");
+
+        Subparser parserUpdateAccount = subparsers.addParser("updateAccount");
+        parserUpdateAccount.help("Update the account attributes on the signal server.");
+
         Subparser parserVerify = subparsers.addParser("verify");
         parserVerify.addArgument("verificationCode")
                 .help("The verification code you received via sms or voice call.");
@@ -705,6 +784,11 @@ public class Main {
                 .nargs("*")
                 .help("Specify one or more members to add to the group");
 
+        Subparser parserListGroups = subparsers.addParser("listGroups");
+        parserListGroups.addArgument("-d", "--detailed").action(Arguments.storeTrue())
+                .help("List members of each group");
+        parserListGroups.help("List group name and ids");
+
         Subparser parserListIdentities = subparsers.addParser("listIdentities");
         parserListIdentities.addArgument("-n", "--number")
                 .help("Only show identity keys for the given phone number.");
@@ -954,6 +1038,7 @@ public class Main {
             if (attachment.isPointer()) {
                 final SignalServiceAttachmentPointer pointer = attachment.asPointer();
                 System.out.println("  Id: " + pointer.getId() + " Key length: " + pointer.getKey().length + (pointer.getRelay().isPresent() ? " Relay: " + pointer.getRelay().get() : ""));
+                System.out.println("  Filename: " + (pointer.getFileName().isPresent() ? pointer.getFileName().get() : "-"));
                 System.out.println("  Size: " + (pointer.getSize().isPresent() ? pointer.getSize().get() + " bytes" : "<unavailable>") + (pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : ""));
                 File file = m.getAttachmentFile(pointer.getId());
                 if (file.exists()) {