import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
import java.util.stream.Collectors;
import static org.asamk.signal.manager.config.ServiceConfig.capabilities;
try {
messageSender.sendMessage(message, unidentifiedAccessHelper.getAccessForSync());
} catch (UntrustedIdentityException e) {
- account.getSignalProtocolStore()
- .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
- e.getIdentityKey(),
- TrustLevel.UNTRUSTED);
+ if (e.getIdentityKey() != null) {
+ account.getSignalProtocolStore()
+ .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
+ e.getIdentityKey(),
+ TrustLevel.UNTRUSTED);
+ }
throw e;
}
}
}
return new Pair<>(timestamp, result);
} catch (UntrustedIdentityException e) {
- account.getSignalProtocolStore()
- .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
- e.getIdentityKey(),
- TrustLevel.UNTRUSTED);
+ if (e.getIdentityKey() != null) {
+ account.getSignalProtocolStore()
+ .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
+ e.getIdentityKey(),
+ TrustLevel.UNTRUSTED);
+ }
return new Pair<>(timestamp, List.of());
}
} else {
false,
System.currentTimeMillis() - startTime);
} catch (UntrustedIdentityException e) {
- account.getSignalProtocolStore()
- .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
- e.getIdentityKey(),
- TrustLevel.UNTRUSTED);
+ if (e.getIdentityKey() != null) {
+ account.getSignalProtocolStore()
+ .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
+ e.getIdentityKey(),
+ TrustLevel.UNTRUSTED);
+ }
return SendMessageResult.identityFailure(recipient, e.getIdentityKey());
}
}
try {
return messageSender.sendMessage(address, unidentifiedAccessHelper.getAccessFor(address), message);
} catch (UntrustedIdentityException e) {
- account.getSignalProtocolStore()
- .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
- e.getIdentityKey(),
- TrustLevel.UNTRUSTED);
+ if (e.getIdentityKey() != null) {
+ account.getSignalProtocolStore()
+ .saveIdentity(resolveSignalServiceAddress(e.getIdentifier()),
+ e.getIdentityKey(),
+ TrustLevel.UNTRUSTED);
+ }
return SendMessageResult.identityFailure(address, e.getIdentityKey());
}
}
*/
public boolean trustIdentityVerified(String name, byte[] fingerprint) throws InvalidNumberException {
var address = canonicalizeAndResolveSignalServiceAddress(name);
- var ids = account.getSignalProtocolStore().getIdentities(address);
- if (ids == null) {
- return false;
- }
- for (var id : ids) {
- if (!Arrays.equals(id.getIdentityKey().serialize(), fingerprint)) {
- continue;
- }
-
- account.getSignalProtocolStore()
- .setIdentityTrustLevel(address, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED);
- try {
- sendVerifiedMessage(address, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED);
- } catch (IOException | UntrustedIdentityException e) {
- logger.warn("Failed to send verification sync message: {}", e.getMessage());
- }
- account.save();
- return true;
- }
- return false;
+ return trustIdentity(address, (identityKey) -> Arrays.equals(identityKey.serialize(), fingerprint));
}
/**
*/
public boolean trustIdentityVerifiedSafetyNumber(String name, String safetyNumber) throws InvalidNumberException {
var address = canonicalizeAndResolveSignalServiceAddress(name);
+ return trustIdentity(address, (identityKey) -> safetyNumber.equals(computeSafetyNumber(address, identityKey)));
+ }
+
+ private boolean trustIdentity(SignalServiceAddress address, Function<IdentityKey, Boolean> verifier) {
var ids = account.getSignalProtocolStore().getIdentities(address);
if (ids == null) {
return false;
}
+
+ IdentityInfo foundIdentity = null;
+
for (var id : ids) {
- if (!safetyNumber.equals(computeSafetyNumber(address, id.getIdentityKey()))) {
- continue;
+ if (verifier.apply(id.getIdentityKey())) {
+ foundIdentity = id;
+ break;
}
+ }
- account.getSignalProtocolStore()
- .setIdentityTrustLevel(address, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED);
- try {
- sendVerifiedMessage(address, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED);
- } catch (IOException | UntrustedIdentityException e) {
- logger.warn("Failed to send verification sync message: {}", e.getMessage());
+ if (foundIdentity == null) {
+ return false;
+ }
+
+ account.getSignalProtocolStore()
+ .setIdentityTrustLevel(address, foundIdentity.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED);
+ try {
+ sendVerifiedMessage(address, foundIdentity.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED);
+ } catch (IOException | UntrustedIdentityException e) {
+ logger.warn("Failed to send verification sync message: {}", e.getMessage());
+ }
+
+ // Successfully trusted the new identity, now remove all other identities for that number
+ for (var id : ids) {
+ if (id == foundIdentity) {
+ continue;
}
- account.save();
- return true;
+ account.getSignalProtocolStore().removeIdentity(address, id.getIdentityKey());
}
- return false;
+
+ account.save();
+ return true;
}
/**