]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/Main.java
Send and receive verified messages
[signal-cli] / src / main / java / org / asamk / signal / Main.java
index 633ef469ef353fbee0a509c6940b6c8a278fa576..a9097fc96493b3213d48d97f0dd2bd26a2640a8c 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;
@@ -138,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");
@@ -423,11 +460,7 @@ public class Main {
 
                     break;
                 case "updateGroup":
-                    if (dBusConn != null) {
-                        System.err.println("updateGroup is not yet implemented via dbus");
-                        return 1;
-                    }
-                    if (!m.isRegistered()) {
+                    if (dBusConn == null && !m.isRegistered()) {
                         System.err.println("User is not registered.");
                         return 1;
                     }
@@ -437,8 +470,23 @@ public class Main {
                         if (ns.getString("group") != null) {
                             groupId = decodeGroupId(ns.getString("group"));
                         }
-                        byte[] newGroupId = m.sendUpdateGroupMessage(groupId, ns.getString("name"), ns.<String>getList("member"), ns.getString("avatar"));
                         if (groupId == null) {
+                            groupId = new byte[0];
+                        }
+                        String groupName = ns.getString("name");
+                        if (groupName == null) {
+                            groupName = "";
+                        }
+                        List<String> groupMembers = ns.<String>getList("member");
+                        if (groupMembers == null) {
+                            groupMembers = new ArrayList<String>();
+                        }
+                        String groupAvatar = ns.getString("avatar");
+                        if (groupAvatar == null) {
+                            groupAvatar = "";
+                        }
+                        byte[] newGroupId = ts.updateGroup(groupId, groupName, groupMembers, groupAvatar);
+                        if (groupId.length != newGroupId.length) {
                             System.out.println("Creating new group \"" + Base64.encodeBytes(newGroupId) + "\" …");
                         }
                     } catch (IOException e) {
@@ -459,6 +507,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) {
@@ -586,9 +651,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) {
@@ -679,6 +754,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.");
@@ -714,6 +795,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.");
@@ -852,8 +938,13 @@ public class Main {
                         SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
 
                         if (syncMessage.getContacts().isPresent()) {
-                            System.out.println("Received sync contacts");
-                            printAttachment(syncMessage.getContacts().get());
+                            final ContactsMessage contactsMessage = syncMessage.getContacts().get();
+                            if (contactsMessage.isComplete()) {
+                                System.out.println("Received complete sync contacts");
+                            } else {
+                                System.out.println("Received sync contacts");
+                            }
+                            printAttachment(contactsMessage.getContactsStream());
                         }
                         if (syncMessage.getGroups().isPresent()) {
                             System.out.println("Received sync groups");
@@ -901,6 +992,16 @@ public class Main {
                                 System.out.println(" - " + number);
                             }
                         }
+                        if (syncMessage.getVerified().isPresent()) {
+                            System.out.println("Received sync message with verified identities:");
+                            final List<VerifiedMessage> verifiedList = syncMessage.getVerified().get();
+                            for (VerifiedMessage v : verifiedList) {
+                                System.out.println(" - " + v.getDestination() + ": " + v.getVerified());
+                                String safetyNumber = formatSafetyNumber(m.computeSafetyNumber(v.getDestination(), v.getIdentityKey()));
+                                System.out.println("   " + safetyNumber);
+                            }
+
+                        }
                     }
                 }
             } else {
@@ -963,7 +1064,9 @@ 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)" : ""));
+                System.out.println("  Voice note: " + (pointer.getVoiceNote() ? "yes" : "no"));
                 File file = m.getAttachmentFile(pointer.getId());
                 if (file.exists()) {
                     System.out.println("  Stored plaintext in: " + file);