Attempt to prevent message retry loops.

This commit is contained in:
Greyson Parrelli
2024-02-23 15:36:05 -05:00
parent dc32e51ac2
commit c4842ae7c5
14 changed files with 280 additions and 73 deletions

View File

@@ -119,6 +119,9 @@ public final class FeatureFlags {
private static final String GIF_SEARCH = "global.gifSearch";
private static final String AUDIO_REMUXING = "android.media.audioRemux.1";
private static final String VIDEO_RECORD_1X_ZOOM = "android.media.videoCaptureDefaultZoom";
private static final String RETRY_RECEIPT_MAX_COUNT = "android.retryReceipt.maxCount";
private static final String RETRY_RECEIPT_MAX_COUNT_RESET_AGE = "android.retryReceipt.maxCountResetAge";
private static final String PREKEY_FORCE_REFRESH_INTERVAL = "android.prekeyForceRefreshInterval";
/**
* We will only store remote values for flags in this set. If you want a flag to be controllable
@@ -190,7 +193,10 @@ public final class FeatureFlags {
USE_ACTIVE_CALL_MANAGER,
GIF_SEARCH,
AUDIO_REMUXING,
VIDEO_RECORD_1X_ZOOM
VIDEO_RECORD_1X_ZOOM,
RETRY_RECEIPT_MAX_COUNT,
RETRY_RECEIPT_MAX_COUNT_RESET_AGE,
PREKEY_FORCE_REFRESH_INTERVAL
);
@VisibleForTesting
@@ -259,7 +265,10 @@ public final class FeatureFlags {
CALLING_REACTIONS,
NOTIFICATION_THUMBNAIL_BLOCKLIST,
CALLING_RAISE_HAND,
VIDEO_RECORD_1X_ZOOM
VIDEO_RECORD_1X_ZOOM,
RETRY_RECEIPT_MAX_COUNT,
RETRY_RECEIPT_MAX_COUNT_RESET_AGE,
PREKEY_FORCE_REFRESH_INTERVAL
);
/**
@@ -435,6 +444,20 @@ public final class FeatureFlags {
return getLong(RETRY_RESPOND_MAX_AGE, TimeUnit.DAYS.toMillis(14));
}
/**
* The max number of retry receipts sends we allow (within @link{#retryReceiptMaxCountResetAge()}) before we consider the volume too large and stop responding.
*/
public static long retryReceiptMaxCount() {
return getLong(RETRY_RECEIPT_MAX_COUNT, 10);
}
/**
* If the last retry receipt send was older than this, then we reset the retry receipt sent count. (For use with @link{#retryReceiptMaxCount()})
*/
public static long retryReceiptMaxCountResetAge() {
return getLong(RETRY_RECEIPT_MAX_COUNT_RESET_AGE, TimeUnit.HOURS.toMillis(3));
}
/** How long a sender key can live before it needs to be rotated. */
public static long senderKeyMaxAge() {
return Math.min(getLong(SENDER_KEY_MAX_AGE, TimeUnit.DAYS.toMillis(14)), TimeUnit.DAYS.toMillis(90));
@@ -670,6 +693,11 @@ public final class FeatureFlags {
return getBoolean(VIDEO_RECORD_1X_ZOOM, false);
}
/** How often we allow a forced prekey refresh. */
public static long preKeyForceRefreshInterval() {
return getLong(PREKEY_FORCE_REFRESH_INTERVAL, TimeUnit.HOURS.toMillis(1));
}
/** Only for rendering debug info. */
public static synchronized @NonNull Map<String, Object> getMemoryValues() {
return new TreeMap<>(REMOTE_VALUES);

View File

@@ -0,0 +1,15 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.util
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.Job
import org.thoughtcrime.securesms.jobmanager.JobManager
/** Starts a new chain with this job. */
fun Job.asChain(): JobManager.Chain {
return ApplicationDependencies.getJobManager().startChain(this)
}