From 8bc31386a5d3ac0eed20cd8425a906bd603ba27d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 10 Jul 2026 04:31:51 +0000 Subject: [PATCH] Build eager prefetch sessions under the SignalSessionLock. --- .../ApplicationDependencyProvider.java | 1 + .../api/keys/PreKeyRepository.kt | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 12 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 a9ad7ab192..33412891f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java @@ -209,6 +209,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider { protocolStore.aci(), new SignalProtocolAddress(pushServiceSocket.getCredentialsProvider().getAci().getLibSignalServiceId(), pushServiceSocket.getCredentialsProvider().getDeviceId()), + ReentrantSessionLock.INSTANCE, PreKeyBatcher.INSTANCE ) ); diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/keys/PreKeyRepository.kt b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/keys/PreKeyRepository.kt index 7b9a8757e9..947ce96da0 100644 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/keys/PreKeyRepository.kt +++ b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/keys/PreKeyRepository.kt @@ -32,6 +32,7 @@ class PreKeyRepository( private val keysApi: KeysApi, private val aciStore: SignalServiceAccountDataStore, private val localProtocolAddress: SignalProtocolAddress, + private val sessionLock: SignalSessionLock, private val batchHelper: BatchHelper ) { @@ -134,18 +135,20 @@ class PreKeyRepository( val recipient = result.recipient var aborted = false - for (preKey in result.bundles) { - val preKeyAddress = SignalProtocolAddress(recipient.identifier, preKey.deviceId) - try { - SessionBuilder(aciStore, preKeyAddress, localProtocolAddress).process(preKey) - } catch (_: UntrustedIdentityException) { - Log.i(TAG, "[eagerPrefetch] Untrusted identity for recipient") - aborted = true - break - } catch (_: InvalidKeyException) { - Log.i(TAG, "[eagerPrefetch] Invalid pre-key") - aborted = true - break + sessionLock.acquire().use { + for (preKey in result.bundles) { + val preKeyAddress = SignalProtocolAddress(recipient.identifier, preKey.deviceId) + try { + SessionBuilder(aciStore, preKeyAddress, localProtocolAddress).process(preKey) + } catch (_: UntrustedIdentityException) { + Log.i(TAG, "[eagerPrefetch] Untrusted identity for recipient") + aborted = true + break + } catch (_: InvalidKeyException) { + Log.i(TAG, "[eagerPrefetch] Invalid pre-key") + aborted = true + break + } } }