]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/ListIdentitiesCommand.java
Use record classes
[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.recipient().toSignalServiceAddress();
34 var digits = Util.formatSafetyNumber(theirId.safetyNumber());
35 writer.println("{}: {} Added: {} Fingerprint: {} Safety Number: {}",
36 address.getNumber().orNull(),
37 theirId.trustLevel(),
38 theirId.dateAdded(),
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.recipient().toSignalServiceAddress();
70 var safetyNumber = Util.formatSafetyNumber(id.safetyNumber());
71 var scannableSafetyNumber = id.scannableSafetyNumber();
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.trustLevel().name(),
80 id.dateAdded().getTime());
81 }).collect(Collectors.toList());
82
83 writer.write(jsonIdentities);
84 }
85 }
86
87 private record JsonIdentity(
88 String number,
89 String uuid,
90 String fingerprint,
91 String safetyNumber,
92 String scannableSafetyNumber,
93 String trustLevel,
94 long addedTimestamp
95 ) {}
96 }