Skip to content

Commit 90c177c

Browse files
authored
Merge pull request #6535 from vector-im/feature/bca/crypto_olm_proliferation
fix olm session proliferation
2 parents c7b54b8 + 4c554e4 commit 90c177c

File tree

3 files changed

+30
-15
lines changed

3 files changed

+30
-15
lines changed

changelog.d/6534.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Unwedging could cause the SDK to force creating a new olm session every hour

matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/UnwedgingTest.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import org.amshove.kluent.shouldBe
2121
import org.junit.Assert
2222
import org.junit.Before
2323
import org.junit.FixMethodOrder
24-
import org.junit.Ignore
2524
import org.junit.Test
2625
import org.junit.runner.RunWith
2726
import org.junit.runners.MethodSorters
@@ -60,7 +59,6 @@ import kotlin.coroutines.resume
6059
*/
6160
@RunWith(AndroidJUnit4::class)
6261
@FixMethodOrder(MethodSorters.JVM)
63-
@Ignore
6462
class UnwedgingTest : InstrumentedTest {
6563

6664
private lateinit var messagesReceivedByBob: List<TimelineEvent>

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package org.matrix.android.sdk.internal.crypto
1818

1919
import kotlinx.coroutines.CoroutineScope
2020
import kotlinx.coroutines.launch
21+
import kotlinx.coroutines.sync.Mutex
22+
import kotlinx.coroutines.sync.withLock
2123
import kotlinx.coroutines.withContext
2224
import org.matrix.android.sdk.api.MatrixCallback
2325
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
@@ -68,6 +70,7 @@ internal class EventDecryptor @Inject constructor(
6870
val senderKey: String?
6971
)
7072

73+
private val wedgedMutex = Mutex()
7174
private val wedgedDevices = mutableListOf<WedgedDeviceInfo>()
7275

7376
/**
@@ -151,11 +154,13 @@ internal class EventDecryptor @Inject constructor(
151154
}
152155
}
153156

154-
private fun markOlmSessionForUnwedging(senderId: String, senderKey: String) {
155-
val info = WedgedDeviceInfo(senderId, senderKey)
156-
if (!wedgedDevices.contains(info)) {
157-
Timber.tag(loggerTag.value).d("Marking device from $senderId key:$senderKey as wedged")
158-
wedgedDevices.add(info)
157+
private suspend fun markOlmSessionForUnwedging(senderId: String, senderKey: String) {
158+
wedgedMutex.withLock {
159+
val info = WedgedDeviceInfo(senderId, senderKey)
160+
if (!wedgedDevices.contains(info)) {
161+
Timber.tag(loggerTag.value).d("Marking device from $senderId key:$senderKey as wedged")
162+
wedgedDevices.add(info)
163+
}
159164
}
160165
}
161166

@@ -167,15 +172,17 @@ internal class EventDecryptor @Inject constructor(
167172
Timber.tag(loggerTag.value).v("Unwedging: ${wedgedDevices.size} are wedged")
168173
// get the one that should be retried according to rate limit
169174
val now = clock.epochMillis()
170-
val toUnwedge = wedgedDevices.filter {
171-
val lastForcedDate = lastNewSessionForcedDates[it] ?: 0
172-
if (now - lastForcedDate < DefaultCryptoService.CRYPTO_MIN_FORCE_SESSION_PERIOD_MILLIS) {
173-
Timber.tag(loggerTag.value).d("Unwedging, New session for $it already forced with device at $lastForcedDate")
174-
return@filter false
175+
val toUnwedge = wedgedMutex.withLock {
176+
wedgedDevices.filter {
177+
val lastForcedDate = lastNewSessionForcedDates[it] ?: 0
178+
if (now - lastForcedDate < DefaultCryptoService.CRYPTO_MIN_FORCE_SESSION_PERIOD_MILLIS) {
179+
Timber.tag(loggerTag.value).d("Unwedging, New session for $it already forced with device at $lastForcedDate")
180+
return@filter false
181+
}
182+
// let's already mark that we tried now
183+
lastNewSessionForcedDates[it] = now
184+
true
175185
}
176-
// let's already mark that we tried now
177-
lastNewSessionForcedDates[it] = now
178-
true
179186
}
180187

181188
if (toUnwedge.isEmpty()) {
@@ -230,6 +237,15 @@ internal class EventDecryptor @Inject constructor(
230237
withContext(coroutineDispatchers.io) {
231238
sendToDeviceTask.executeRetry(sendToDeviceParams, remainingRetry = SEND_TO_DEVICE_RETRY_COUNT)
232239
}
240+
241+
deviceList.values.flatten().forEach { deviceInfo ->
242+
wedgedMutex.withLock {
243+
wedgedDevices.removeAll {
244+
it.senderKey == deviceInfo.identityKey() &&
245+
it.userId == deviceInfo.userId
246+
}
247+
}
248+
}
233249
} catch (failure: Throwable) {
234250
deviceList.flatMap { it.value }.joinToString { it.shortDebugString() }.let {
235251
Timber.tag(loggerTag.value).e(failure, "## Failed to unwedge devices: $it}")

0 commit comments

Comments
 (0)