From: AsamK Date: Tue, 27 Feb 2024 16:52:21 +0000 (+0100) Subject: Only retry messages after identity was trusted X-Git-Tag: v0.13.1~2 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/2e4cd0eddc6e66bb47d2751006073c6ee828b183 Only retry messages after identity was trusted Fixes #1477 --- diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java index a66d6ff6..a40c134d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ReceiveHelper.java @@ -41,7 +41,6 @@ public class ReceiveHelper { private final Context context; private ReceiveConfig receiveConfig = new ReceiveConfig(false, false, false); - private boolean needsToRetryFailedMessages = false; private boolean hasCaughtUpWithOldMessages = false; private boolean isWaitingForMessage = false; private boolean shouldStop = false; @@ -59,10 +58,6 @@ public class ReceiveHelper { dependencies.setAllowStories(!receiveConfig.ignoreStories()); } - public void setNeedsToRetryFailedMessages(final boolean needsToRetryFailedMessages) { - this.needsToRetryFailedMessages = needsToRetryFailedMessages; - } - public void setAuthenticationFailureListener(final Callable authenticationFailureListener) { this.authenticationFailureListener = authenticationFailureListener; } @@ -90,7 +85,7 @@ public class ReceiveHelper { public void receiveMessages( Duration timeout, boolean returnOnTimeout, Integer maxMessages, Manager.ReceiveMessageHandler handler ) throws IOException { - needsToRetryFailedMessages = true; + account.setNeedsToRetryFailedMessages(true); hasCaughtUpWithOldMessages = false; // Use a Map here because java Set doesn't have a get method ... @@ -130,9 +125,8 @@ public class ReceiveHelper { isWaitingForMessage = false; while (!shouldStop && remainingMessages != 0) { - if (needsToRetryFailedMessages) { + if (account.getNeedsToRetryFailedMessages()) { retryFailedReceivedMessages(handler); - needsToRetryFailedMessages = false; } SignalServiceEnvelope envelope; final CachedMessage[] cachedMessage = {null}; @@ -266,6 +260,7 @@ public class ReceiveHelper { } } handleQueuedActions(queuedActions); + account.setNeedsToRetryFailedMessages(false); } private List retryFailedReceivedMessage( @@ -282,8 +277,8 @@ public class ReceiveHelper { final var exception = result.second(); if (exception instanceof UntrustedIdentityException) { - if (System.currentTimeMillis() - envelope.getServerDeliveredTimestamp() > 1000L * 60 * 60 * 24 * 30) { - // Envelope is more than a month old, cleaning up. + if (System.currentTimeMillis() - envelope.getServerDeliveredTimestamp() > 1000L * 60 * 60 * 24 * 14) { + // Envelope is more than two weeks old, cleaning up. cachedMessage.delete(); return null; } diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index b7808fc6..35ad4d3c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -409,8 +409,7 @@ public class ManagerImpl implements Manager { @Override public void submitRateLimitRecaptchaChallenge( - String challenge, - String captcha + String challenge, String captcha ) throws IOException, CaptchaRejectedException { captcha = captcha == null ? null : captcha.replace("signalcaptcha://", ""); @@ -1389,7 +1388,7 @@ public class ManagerImpl implements Manager { final var recipientId = context.getRecipientHelper().resolveRecipient(recipient); final var updated = trustMethod.apply(recipientId); if (updated && this.isReceiving()) { - context.getReceiveHelper().setNeedsToRetryFailedMessages(true); + account.setNeedsToRetryFailedMessages(true); } return updated; } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 72725f5c..e8f2db45 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -149,6 +149,9 @@ public class SignalAccount implements Closeable { private final KeyValueEntry lastReceiveTimestamp = new KeyValueEntry<>("last-receive-timestamp", long.class, 0L); + private final KeyValueEntry needsToRetryFailedMessages = new KeyValueEntry<>("retry-failed-messages", + Boolean.class, + true); private final KeyValueEntry cdsiToken = new KeyValueEntry<>("cdsi-token", byte[].class); private final KeyValueEntry lastRecipientsRefresh = new KeyValueEntry<>("last-recipients-refresh", long.class); @@ -297,7 +300,7 @@ public class SignalAccount implements Closeable { this.pniAccountData.setIdentityKeyPair(pniIdentity); this.registered = false; this.isMultiDevice = true; - getKeyValueStore().storeEntry(lastReceiveTimestamp, 0L); + setLastReceiveTimestamp(0L); this.pinMasterKey = masterKey; getKeyValueStore().storeEntry(storageManifestVersion, -1L); this.setStorageManifest(null); @@ -342,7 +345,7 @@ public class SignalAccount implements Closeable { this.pniAccountData.setServiceId(pni); init(); this.registrationLockPin = pin; - getKeyValueStore().storeEntry(lastReceiveTimestamp, 0L); + setLastReceiveTimestamp(0L); save(); setPreKeys(ServiceIdType.ACI, aciPreKeys); @@ -590,7 +593,7 @@ public class SignalAccount implements Closeable { isMultiDevice = rootNode.get("isMultiDevice").asBoolean(); } if (rootNode.hasNonNull("lastReceiveTimestamp")) { - getKeyValueStore().storeEntry(lastReceiveTimestamp, rootNode.get("lastReceiveTimestamp").asLong()); + setLastReceiveTimestamp(rootNode.get("lastReceiveTimestamp").asLong()); } int registrationId = 0; if (rootNode.hasNonNull("registrationId")) { @@ -1650,6 +1653,14 @@ public class SignalAccount implements Closeable { getKeyValueStore().storeEntry(lastReceiveTimestamp, value); } + public void setNeedsToRetryFailedMessages(final boolean value) { + getKeyValueStore().storeEntry(needsToRetryFailedMessages, value); + } + + public boolean getNeedsToRetryFailedMessages() { + return getKeyValueStore().getEntry(needsToRetryFailedMessages); + } + public boolean isUnrestrictedUnidentifiedAccess() { return Boolean.TRUE.equals(getKeyValueStore().getEntry(unrestrictedUnidentifiedAccess)); }