]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java
Add json output listIdentities command
[signal-cli] / src / main / java / org / asamk / signal / commands / ListIdentitiesCommand.java
index f996f3b5633bd029786d39c5d59ac1ebf0ca2934..49ca2546f30a0698fdfd429d329fc25d84706b75 100644 (file)
@@ -3,6 +3,7 @@ package org.asamk.signal.commands;
 import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
+import org.asamk.signal.JsonWriter;
 import org.asamk.signal.OutputWriter;
 import org.asamk.signal.PlainTextWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
@@ -16,9 +17,12 @@ import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 
+import java.util.Base64;
 import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
-public class ListIdentitiesCommand implements LocalCommand {
+public class ListIdentitiesCommand implements JsonRpcLocalCommand {
 
     private final static Logger logger = LoggerFactory.getLogger(ListIdentitiesCommand.class);
 
@@ -48,26 +52,71 @@ public class ListIdentitiesCommand implements LocalCommand {
     public void handleCommand(
             final Namespace ns, final Manager m, final OutputWriter outputWriter
     ) throws CommandException {
-        final var writer = (PlainTextWriter) outputWriter;
-
         var number = ns.getString("number");
 
+        List<IdentityInfo> identities;
         if (number == null) {
-            for (var identity : m.getIdentities()) {
-                printIdentityFingerprint(writer, m, identity);
+            identities = m.getIdentities();
+        } else {
+            try {
+                identities = m.getIdentities(number);
+            } catch (InvalidNumberException e) {
+                throw new UserErrorException("Invalid number: " + e.getMessage());
             }
-            return;
         }
 
-        List<IdentityInfo> identities;
-        try {
-            identities = m.getIdentities(number);
-        } catch (InvalidNumberException e) {
-            throw new UserErrorException("Invalid number: " + e.getMessage());
+        if (outputWriter instanceof PlainTextWriter) {
+            final var writer = (PlainTextWriter) outputWriter;
+            for (var id : identities) {
+                printIdentityFingerprint(writer, m, id);
+            }
+        } else {
+            final var writer = (JsonWriter) outputWriter;
+            final var jsonIdentities = identities.stream().map(id -> {
+                final var address = m.resolveSignalServiceAddress(id.getRecipientId());
+                var safetyNumber = Util.formatSafetyNumber(m.computeSafetyNumber(address, id.getIdentityKey()));
+                var scannableSafetyNumber = m.computeSafetyNumberForScanning(address, id.getIdentityKey());
+                return new JsonIdentity(address.getNumber().orNull(),
+                        address.getUuid().transform(UUID::toString).orNull(),
+                        Hex.toString(id.getFingerprint()),
+                        safetyNumber,
+                        scannableSafetyNumber == null
+                                ? null
+                                : Base64.getEncoder().encodeToString(scannableSafetyNumber),
+                        id.getTrustLevel().name(),
+                        id.getDateAdded().getTime());
+            }).collect(Collectors.toList());
+
+            writer.write(jsonIdentities);
         }
+    }
+
+    private static final class JsonIdentity {
+
+        public final String number;
+        public final String uuid;
+        public final String fingerprint;
+        public final String safetyNumber;
+        public final String scannableSafetyNumber;
+        public final String trustLevel;
+        public final long addedTimestamp;
 
-        for (var id : identities) {
-            printIdentityFingerprint(writer, m, id);
+        private JsonIdentity(
+                final String number,
+                final String uuid,
+                final String fingerprint,
+                final String safetyNumber,
+                final String scannableSafetyNumber,
+                final String trustLevel,
+                final long addedTimestamp
+        ) {
+            this.number = number;
+            this.uuid = uuid;
+            this.fingerprint = fingerprint;
+            this.safetyNumber = safetyNumber;
+            this.scannableSafetyNumber = scannableSafetyNumber;
+            this.trustLevel = trustLevel;
+            this.addedTimestamp = addedTimestamp;
         }
     }
 }