From c78b47fbe337ee9f052f3eebc342d64fcba2be45 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 16 Sep 2025 14:36:09 -0400 Subject: [PATCH] Make max envelope size remote configurable. --- .../ApplicationDependencyProvider.java | 5 +-- .../securesms/util/RemoteConfig.kt | 11 ++++- .../api/SignalServiceMessageSender.java | 43 +++++++------------ 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java index 9b5022ccf6..5c37dead97 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java @@ -174,10 +174,9 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { keysApi, Optional.of(new SecurityEventListener(context)), SignalExecutors.newCachedBoundedExecutor("signal-messages", ThreadUtil.PRIORITY_IMPORTANT_BACKGROUND_THREAD, 1, 16, 30), - ByteUnit.KILOBYTES.toBytes(256), + RemoteConfig.maxEnvelopeSizeBytes(), RemoteConfig::useMessageSendRestFallback, - RemoteConfig.usePqRatchet(), - RemoteConfig.internalUser() ? Optional.of(ByteUnit.KILOBYTES.toBytes(96)) : Optional.empty()); + RemoteConfig.usePqRatchet()); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index aa17207449..d4fd4d7753 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -875,7 +875,7 @@ object RemoteConfig { @JvmStatic @get:JvmName("promptForDelayedNotificationLogs") val promptForDelayedNotificationLogs: String by remoteString( - key = RemoteConfig.PROMPT_FOR_NOTIFICATION_LOGS, + key = PROMPT_FOR_NOTIFICATION_LOGS, defaultValue = "*", hotSwappable = true ) @@ -1177,5 +1177,14 @@ object RemoteConfig { if (value.asBoolean(false)) UsePqRatchet.YES else UsePqRatchet.NO } + /** The maximum allowed envelope size for messages we send. */ + @JvmStatic + @get:JvmName("maxEnvelopeSizeBytes") + val maxEnvelopeSizeBytes: Long by remoteLong( + key = "android.maxEnvelopeSizeBytes", + defaultValue = 256.kibiBytes.inWholeBytes, + hotSwappable = true + ) + // endregion } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index f51a3bdd66..de1a4ce4fa 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -186,7 +186,6 @@ public class SignalServiceMessageSender { private final long maxEnvelopeSize; private final BooleanSupplier useRestFallback; private final UsePqRatchet usePqRatchet; - private final Optional internalOnlyMaxEnvelopeSize; public SignalServiceMessageSender(PushServiceSocket pushServiceSocket, SignalServiceDataStore store, @@ -198,27 +197,25 @@ public class SignalServiceMessageSender { ExecutorService executor, long maxEnvelopeSize, BooleanSupplier useRestFallback, - UsePqRatchet usePqRatchet, - Optional internalOnlyMaxEnvelopeSize) + UsePqRatchet usePqRatchet) { CredentialsProvider credentialsProvider = pushServiceSocket.getCredentialsProvider(); - this.socket = pushServiceSocket; - this.aciStore = store.aci(); - this.sessionLock = sessionLock; - this.localAddress = new SignalServiceAddress(credentialsProvider.getAci(), credentialsProvider.getE164()); - this.localDeviceId = credentialsProvider.getDeviceId(); - this.localPni = credentialsProvider.getPni(); - this.attachmentApi = attachmentApi; - this.messageApi = messageApi; - this.eventListener = eventListener; - this.maxEnvelopeSize = maxEnvelopeSize; - this.localPniIdentity = store.pni().getIdentityKeyPair(); - this.scheduler = Schedulers.from(executor, false, false); - this.keysApi = keysApi; - this.useRestFallback = useRestFallback; - this.usePqRatchet = usePqRatchet; - this.internalOnlyMaxEnvelopeSize = internalOnlyMaxEnvelopeSize; + this.socket = pushServiceSocket; + this.aciStore = store.aci(); + this.sessionLock = sessionLock; + this.localAddress = new SignalServiceAddress(credentialsProvider.getAci(), credentialsProvider.getE164()); + this.localDeviceId = credentialsProvider.getDeviceId(); + this.localPni = credentialsProvider.getPni(); + this.attachmentApi = attachmentApi; + this.messageApi = messageApi; + this.eventListener = eventListener; + this.maxEnvelopeSize = maxEnvelopeSize; + this.localPniIdentity = store.pni().getIdentityKeyPair(); + this.scheduler = Schedulers.from(executor, false, false); + this.keysApi = keysApi; + this.useRestFallback = useRestFallback; + this.usePqRatchet = usePqRatchet; } /** @@ -2817,10 +2814,6 @@ public class SignalServiceMessageSender { throw new ContentTooLargeException(size); } - if (internalOnlyMaxEnvelopeSize.isPresent() && size > internalOnlyMaxEnvelopeSize.get()) { - throw new ContentTooLargeException(size); - } - return content; } @@ -2831,10 +2824,6 @@ public class SignalServiceMessageSender { throw new ContentTooLargeException(size); } - if (internalOnlyMaxEnvelopeSize.isPresent() && size > internalOnlyMaxEnvelopeSize.get()) { - throw new ContentTooLargeException(size); - } - return content; }