}
}
- public String computeSafetyNumber(
- SignalServiceAddress theirAddress, IdentityKey theirIdentityKey
- ) {
- return Utils.computeSafetyNumber(ServiceConfig.capabilities.isUuid(),
+ public String computeSafetyNumber(SignalServiceAddress theirAddress, IdentityKey theirIdentityKey) {
+ final var fingerprint = Utils.computeSafetyNumber(capabilities.isUuid(),
+ account.getSelfAddress(),
+ getIdentityKeyPair().getPublicKey(),
+ theirAddress,
+ theirIdentityKey);
+ return fingerprint == null ? null : fingerprint.getDisplayableFingerprint().getDisplayText();
+ }
+
+ public byte[] computeSafetyNumberForScanning(SignalServiceAddress theirAddress, IdentityKey theirIdentityKey) {
+ final var fingerprint = Utils.computeSafetyNumber(capabilities.isUuid(),
account.getSelfAddress(),
getIdentityKeyPair().getPublicKey(),
theirAddress,
theirIdentityKey);
+ return fingerprint == null ? null : fingerprint.getScannableFingerprint().getSerialized();
}
@Deprecated
package org.asamk.signal.manager.util;
import org.whispersystems.libsignal.IdentityKey;
+import org.whispersystems.libsignal.fingerprint.Fingerprint;
import org.whispersystems.libsignal.fingerprint.NumericFingerprintGenerator;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.util.StreamDetails;
return new StreamDetails(stream, mime, size);
}
- public static String computeSafetyNumber(
+ public static Fingerprint computeSafetyNumber(
boolean isUuidCapable,
SignalServiceAddress ownAddress,
IdentityKey ownIdentityKey,
// Version 1: E164 user
version = 1;
if (!ownAddress.getNumber().isPresent() || !theirAddress.getNumber().isPresent()) {
- return "INVALID ID";
+ return null;
}
ownId = ownAddress.getNumber().get().getBytes();
theirId = theirAddress.getNumber().get().getBytes();
}
- var fingerprint = new NumericFingerprintGenerator(5200).createFor(version,
+ return new NumericFingerprintGenerator(5200).createFor(version,
ownId,
ownIdentityKey,
theirId,
theirIdentityKey);
- return fingerprint.getDisplayableFingerprint().getDisplayText();
}
public static SignalServiceAddress getSignalServiceAddressFromIdentifier(final String identifier) {
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;
}
}
}