import org.whispersystems.libsignal.InvalidKeyException;
import org.whispersystems.libsignal.InvalidMessageException;
import org.whispersystems.libsignal.ecc.ECPublicKey;
+import org.whispersystems.libsignal.fingerprint.Fingerprint;
+import org.whispersystems.libsignal.fingerprint.FingerprintParsingException;
+import org.whispersystems.libsignal.fingerprint.FingerprintVersionMismatchException;
import org.whispersystems.libsignal.state.PreKeyRecord;
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
import org.whispersystems.libsignal.util.Pair;
queuedActions.addAll(actions);
}
}
- for (var action : queuedActions) {
- try {
- action.execute(this);
- } catch (Throwable e) {
- if (e instanceof AssertionError && e.getCause() instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- logger.warn("Message action failed.", e);
- }
- }
+ handleQueuedActions(queuedActions);
}
private List<HandleAction> retryFailedReceivedMessage(
boolean returnOnTimeout,
boolean ignoreAttachments,
ReceiveMessageHandler handler
- ) throws IOException, InterruptedException {
+ ) throws IOException {
retryFailedReceivedMessages(handler, ignoreAttachments);
Set<HandleAction> queuedActions = new HashSet<>();
// Received indicator that server queue is empty
hasCaughtUpWithOldMessages = true;
- for (var action : queuedActions) {
- try {
- action.execute(this);
- } catch (Throwable e) {
- if (e instanceof AssertionError && e.getCause() instanceof InterruptedException) {
- Thread.currentThread().interrupt();
- }
- logger.warn("Message action failed.", e);
- }
- }
+ handleQueuedActions(queuedActions);
queuedActions.clear();
// Continue to wait another timeout for new messages
}
} catch (AssertionError e) {
if (e.getCause() instanceof InterruptedException) {
- throw (InterruptedException) e.getCause();
+ Thread.currentThread().interrupt();
+ break;
} else {
throw e;
}
}
}
}
+ handleQueuedActions(queuedActions);
+ }
+
+ private void handleQueuedActions(final Set<HandleAction> queuedActions) {
+ for (var action : queuedActions) {
+ try {
+ action.execute(this);
+ } catch (Throwable e) {
+ if (e instanceof AssertionError && e.getCause() instanceof InterruptedException) {
+ Thread.currentThread().interrupt();
+ }
+ logger.warn("Message action failed.", e);
+ }
+ }
}
private boolean isMessageBlocked(
TrustLevel.TRUSTED_VERIFIED);
}
+ /**
+ * Trust this the identity with this scannable safety number
+ *
+ * @param name username of the identity
+ * @param safetyNumber Scannable safety number
+ */
+ public boolean trustIdentityVerifiedSafetyNumber(String name, byte[] safetyNumber) throws InvalidNumberException {
+ var recipientId = canonicalizeAndResolveRecipient(name);
+ var address = account.getRecipientStore().resolveServiceAddress(recipientId);
+ return trustIdentity(recipientId, identityKey -> {
+ final var fingerprint = computeSafetyNumberFingerprint(address, identityKey);
+ try {
+ return fingerprint != null && fingerprint.getScannableFingerprint().compareTo(safetyNumber);
+ } catch (FingerprintVersionMismatchException | FingerprintParsingException e) {
+ return false;
+ }
+ }, TrustLevel.TRUSTED_VERIFIED);
+ }
+
/**
* Trust all keys of this identity without verification
*
}
public String computeSafetyNumber(SignalServiceAddress theirAddress, IdentityKey theirIdentityKey) {
- final var fingerprint = Utils.computeSafetyNumber(capabilities.isUuid(),
- account.getSelfAddress(),
- getIdentityKeyPair().getPublicKey(),
- theirAddress,
- theirIdentityKey);
+ final Fingerprint fingerprint = computeSafetyNumberFingerprint(theirAddress, theirIdentityKey);
return fingerprint == null ? null : fingerprint.getDisplayableFingerprint().getDisplayText();
}
public byte[] computeSafetyNumberForScanning(SignalServiceAddress theirAddress, IdentityKey theirIdentityKey) {
- final var fingerprint = Utils.computeSafetyNumber(capabilities.isUuid(),
+ final Fingerprint fingerprint = computeSafetyNumberFingerprint(theirAddress, theirIdentityKey);
+ return fingerprint == null ? null : fingerprint.getScannableFingerprint().getSerialized();
+ }
+
+ private Fingerprint computeSafetyNumberFingerprint(
+ final SignalServiceAddress theirAddress, final IdentityKey theirIdentityKey
+ ) {
+ return Utils.computeSafetyNumber(capabilities.isUuid(),
account.getSelfAddress(),
getIdentityKeyPair().getPublicKey(),
theirAddress,
theirIdentityKey);
- return fingerprint == null ? null : fingerprint.getScannableFingerprint().getSerialized();
}
@Deprecated