]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java
Use Java 17
[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.api.Identity;
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, Identity theirId) {
33 final SignalServiceAddress address = theirId.getRecipient().toSignalServiceAddress();
34 var digits = Util.formatSafetyNumber(theirId.getSafetyNumber());
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<Identity> identities;
56 if (number == null) {
57 identities = m.getIdentities();
58 } else {
59 identities = m.getIdentities(CommandUtil.getSingleRecipientIdentifier(number, m.getSelfNumber()));
60 }
61
62 if (outputWriter instanceof PlainTextWriter writer) {
63 for (var id : identities) {
64 printIdentityFingerprint(writer, m, id);
65 }
66 } else {
67 final var writer = (JsonWriter) outputWriter;
68 final var jsonIdentities = identities.stream().map(id -> {
69 final var address = id.getRecipient().toSignalServiceAddress();
70 var safetyNumber = Util.formatSafetyNumber(id.getSafetyNumber());
71 var scannableSafetyNumber = id.getScannableSafetyNumber();
72 return new JsonIdentity(address.getNumber().orNull(),
73 address.getUuid().toString(),
74 Hex.toString(id.getFingerprint()),
75 safetyNumber,
76 scannableSafetyNumber == null
77 ? null
78 : Base64.getEncoder().encodeToString(scannableSafetyNumber),
79 id.getTrustLevel().name(),
80 id.getDateAdded().getTime());
81 }).collect(Collectors.toList());
82
83 writer.write(jsonIdentities);
84 }
85 }
86
87 private static final class JsonIdentity {
88
89 public final String number;
90 public final String uuid;
91 public final String fingerprint;
92 public final String safetyNumber;
93 public final String scannableSafetyNumber;
94 public final String trustLevel;
95 public final long addedTimestamp;
96
97 private JsonIdentity(
98 final String number,
99 final String uuid,
100 final String fingerprint,
101 final String safetyNumber,
102 final String scannableSafetyNumber,
103 final String trustLevel,
104 final long addedTimestamp
105 ) {
106 this.number = number;
107 this.uuid = uuid;
108 this.fingerprint = fingerprint;
109 this.safetyNumber = safetyNumber;
110 this.scannableSafetyNumber = scannableSafetyNumber;
111 this.trustLevel = trustLevel;
112 this.addedTimestamp = addedTimestamp;
113 }
114 }
115 }