]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java
Print stack trace of exception causes in verbose mode
[signal-cli] / src / main / java / org / asamk / signal / commands / ListIdentitiesCommand.java
1 package org.asamk.signal.commands;
2
3 import net.sourceforge.argparse4j.inf.Namespace;
4 import net.sourceforge.argparse4j.inf.Subparser;
5
6 import org.asamk.signal.JsonWriter;
7 import org.asamk.signal.OutputWriter;
8 import org.asamk.signal.PlainTextWriter;
9 import org.asamk.signal.commands.exceptions.CommandException;
10 import org.asamk.signal.manager.Manager;
11 import org.asamk.signal.manager.storage.identities.IdentityInfo;
12 import org.asamk.signal.util.CommandUtil;
13 import org.asamk.signal.util.Hex;
14 import org.asamk.signal.util.Util;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
18
19 import java.util.Base64;
20 import java.util.List;
21 import java.util.stream.Collectors;
22
23 public class ListIdentitiesCommand implements JsonRpcLocalCommand {
24
25 private final static Logger logger = LoggerFactory.getLogger(ListIdentitiesCommand.class);
26
27 @Override
28 public String getName() {
29 return "listIdentities";
30 }
31
32 private static void printIdentityFingerprint(PlainTextWriter writer, Manager m, IdentityInfo theirId) {
33 final SignalServiceAddress address = m.resolveSignalServiceAddress(theirId.getRecipientId());
34 var digits = Util.formatSafetyNumber(m.computeSafetyNumber(address, theirId.getIdentityKey()));
35 writer.println("{}: {} Added: {} Fingerprint: {} Safety Number: {}",
36 address.getNumber().orNull(),
37 theirId.getTrustLevel(),
38 theirId.getDateAdded(),
39 Hex.toString(theirId.getFingerprint()),
40 digits);
41 }
42
43 @Override
44 public void attachToSubparser(final Subparser subparser) {
45 subparser.help("List all known identity keys and their trust status, fingerprint and safety number.");
46 subparser.addArgument("-n", "--number").help("Only show identity keys for the given phone number.");
47 }
48
49 @Override
50 public void handleCommand(
51 final Namespace ns, final Manager m, final OutputWriter outputWriter
52 ) throws CommandException {
53 var number = ns.getString("number");
54
55 List<IdentityInfo> identities;
56 if (number == null) {
57 identities = m.getIdentities();
58 } else {
59 identities = m.getIdentities(CommandUtil.getSingleRecipientIdentifier(number, m.getUsername()));
60 }
61
62 if (outputWriter instanceof PlainTextWriter) {
63 final var writer = (PlainTextWriter) outputWriter;
64 for (var id : identities) {
65 printIdentityFingerprint(writer, m, id);
66 }
67 } else {
68 final var writer = (JsonWriter) outputWriter;
69 final var jsonIdentities = identities.stream().map(id -> {
70 final var address = m.resolveSignalServiceAddress(id.getRecipientId());
71 var safetyNumber = Util.formatSafetyNumber(m.computeSafetyNumber(address, id.getIdentityKey()));
72 var scannableSafetyNumber = m.computeSafetyNumberForScanning(address, id.getIdentityKey());
73 return new JsonIdentity(address.getNumber().orNull(),
74 address.getUuid().toString(),
75 Hex.toString(id.getFingerprint()),
76 safetyNumber,
77 scannableSafetyNumber == null
78 ? null
79 : Base64.getEncoder().encodeToString(scannableSafetyNumber),
80 id.getTrustLevel().name(),
81 id.getDateAdded().getTime());
82 }).collect(Collectors.toList());
83
84 writer.write(jsonIdentities);
85 }
86 }
87
88 private static final class JsonIdentity {
89
90 public final String number;
91 public final String uuid;
92 public final String fingerprint;
93 public final String safetyNumber;
94 public final String scannableSafetyNumber;
95 public final String trustLevel;
96 public final long addedTimestamp;
97
98 private JsonIdentity(
99 final String number,
100 final String uuid,
101 final String fingerprint,
102 final String safetyNumber,
103 final String scannableSafetyNumber,
104 final String trustLevel,
105 final long addedTimestamp
106 ) {
107 this.number = number;
108 this.uuid = uuid;
109 this.fingerprint = fingerprint;
110 this.safetyNumber = safetyNumber;
111 this.scannableSafetyNumber = scannableSafetyNumber;
112 this.trustLevel = trustLevel;
113 this.addedTimestamp = addedTimestamp;
114 }
115 }
116 }