import net.sourceforge.argparse4j.inf.Namespace;
import net.sourceforge.argparse4j.inf.Subparser;
+import org.asamk.signal.JsonWriter;
import org.asamk.signal.OutputWriter;
import org.asamk.signal.PlainTextWriter;
import org.asamk.signal.commands.exceptions.CommandException;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
+import java.util.Base64;
import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
-public class ListIdentitiesCommand implements LocalCommand {
+public class ListIdentitiesCommand implements JsonRpcLocalCommand {
private final static Logger logger = LoggerFactory.getLogger(ListIdentitiesCommand.class);
public void handleCommand(
final Namespace ns, final Manager m, final OutputWriter outputWriter
) throws CommandException {
- final var writer = (PlainTextWriter) outputWriter;
-
var number = ns.getString("number");
+ List<IdentityInfo> identities;
if (number == null) {
- for (var identity : m.getIdentities()) {
- printIdentityFingerprint(writer, m, identity);
+ identities = m.getIdentities();
+ } else {
+ try {
+ identities = m.getIdentities(number);
+ } catch (InvalidNumberException e) {
+ throw new UserErrorException("Invalid number: " + e.getMessage());
}
- return;
}
- List<IdentityInfo> identities;
- try {
- identities = m.getIdentities(number);
- } catch (InvalidNumberException e) {
- throw new UserErrorException("Invalid number: " + e.getMessage());
+ if (outputWriter instanceof PlainTextWriter) {
+ final var writer = (PlainTextWriter) outputWriter;
+ for (var id : identities) {
+ printIdentityFingerprint(writer, m, id);
+ }
+ } else {
+ final var writer = (JsonWriter) outputWriter;
+ final var jsonIdentities = identities.stream().map(id -> {
+ final var address = m.resolveSignalServiceAddress(id.getRecipientId());
+ var safetyNumber = Util.formatSafetyNumber(m.computeSafetyNumber(address, id.getIdentityKey()));
+ var scannableSafetyNumber = m.computeSafetyNumberForScanning(address, id.getIdentityKey());
+ return new JsonIdentity(address.getNumber().orNull(),
+ address.getUuid().transform(UUID::toString).orNull(),
+ Hex.toString(id.getFingerprint()),
+ safetyNumber,
+ scannableSafetyNumber == null
+ ? null
+ : Base64.getEncoder().encodeToString(scannableSafetyNumber),
+ id.getTrustLevel().name(),
+ id.getDateAdded().getTime());
+ }).collect(Collectors.toList());
+
+ writer.write(jsonIdentities);
}
+ }
+
+ private static final class JsonIdentity {
+
+ public final String number;
+ public final String uuid;
+ public final String fingerprint;
+ public final String safetyNumber;
+ public final String scannableSafetyNumber;
+ public final String trustLevel;
+ public final long addedTimestamp;
- for (var id : identities) {
- printIdentityFingerprint(writer, m, id);
+ private JsonIdentity(
+ final String number,
+ final String uuid,
+ final String fingerprint,
+ final String safetyNumber,
+ final String scannableSafetyNumber,
+ final String trustLevel,
+ final long addedTimestamp
+ ) {
+ this.number = number;
+ this.uuid = uuid;
+ this.fingerprint = fingerprint;
+ this.safetyNumber = safetyNumber;
+ this.scannableSafetyNumber = scannableSafetyNumber;
+ this.trustLevel = trustLevel;
+ this.addedTimestamp = addedTimestamp;
}
}
}