1 package org
.asamk
.signal
.commands
;
3 import net
.sourceforge
.argparse4j
.inf
.Namespace
;
4 import net
.sourceforge
.argparse4j
.inf
.Subparser
;
6 import org
.asamk
.signal
.commands
.exceptions
.CommandException
;
7 import org
.asamk
.signal
.manager
.Manager
;
8 import org
.asamk
.signal
.manager
.api
.Identity
;
9 import org
.asamk
.signal
.output
.JsonWriter
;
10 import org
.asamk
.signal
.output
.OutputWriter
;
11 import org
.asamk
.signal
.output
.PlainTextWriter
;
12 import org
.asamk
.signal
.util
.CommandUtil
;
13 import org
.asamk
.signal
.util
.DateUtils
;
14 import org
.asamk
.signal
.util
.Hex
;
15 import org
.asamk
.signal
.util
.Util
;
16 import org
.slf4j
.Logger
;
17 import org
.slf4j
.LoggerFactory
;
19 import java
.util
.Base64
;
20 import java
.util
.List
;
21 import java
.util
.UUID
;
23 public class ListIdentitiesCommand
implements JsonRpcLocalCommand
{
25 private final static Logger logger
= LoggerFactory
.getLogger(ListIdentitiesCommand
.class);
28 public String
getName() {
29 return "listIdentities";
32 private static void printIdentityFingerprint(PlainTextWriter writer
, Identity theirId
) {
33 writer
.println("{}: {} Added: {} Fingerprint: {} Safety Number: {}",
34 theirId
.recipient().getLegacyIdentifier(),
36 DateUtils
.formatTimestamp(theirId
.dateAddedTimestamp()),
37 Hex
.toString(theirId
.getFingerprint()),
38 Util
.formatSafetyNumber(theirId
.safetyNumber()));
42 public void attachToSubparser(final Subparser subparser
) {
43 subparser
.help("List all known identity keys and their trust status, fingerprint and safety number.");
44 subparser
.addArgument("-n", "--number").help("Only show identity keys for the given phone number.");
48 public void handleCommand(
49 final Namespace ns
, final Manager m
, final OutputWriter outputWriter
50 ) throws CommandException
{
51 var number
= ns
.getString("number");
53 List
<Identity
> identities
;
55 identities
= m
.getIdentities();
57 identities
= m
.getIdentities(CommandUtil
.getSingleRecipientIdentifier(number
, m
.getSelfNumber()));
60 if (outputWriter
instanceof PlainTextWriter writer
) {
61 for (var id
: identities
) {
62 printIdentityFingerprint(writer
, id
);
65 final var writer
= (JsonWriter
) outputWriter
;
66 final var jsonIdentities
= identities
.stream().map(id
-> {
67 final var address
= id
.recipient();
68 var safetyNumber
= Util
.formatSafetyNumber(id
.safetyNumber());
69 var scannableSafetyNumber
= id
.scannableSafetyNumber();
70 return new JsonIdentity(address
.number().orElse(null),
71 address
.uuid().map(UUID
::toString
).orElse(null),
72 Hex
.toString(id
.getFingerprint()),
74 scannableSafetyNumber
== null
76 : Base64
.getEncoder().encodeToString(scannableSafetyNumber
),
77 id
.trustLevel().name(),
78 id
.dateAddedTimestamp());
81 writer
.write(jsonIdentities
);
85 private record JsonIdentity(
90 String scannableSafetyNumber
,