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