From a7ee7d5badb352e3ebdc4f3df79cbf831fdedc51 Mon Sep 17 00:00:00 2001 From: Thomas Zeitlhofer Date: Thu, 20 Aug 2020 14:11:44 +0200 Subject: [PATCH] Renew turnserver credentials when ttl runs out The previous implementation caches the turnserver response indefinitely. This breaks VoIP calls as soon as the ttl of the received turnserver credentials runs out. So, take care to renew the turnserver credentials by allowing the cache to expire. Fixes: d8cf44fdc901 ("Simple cache of turn server response") Signed-off-by: Thomas Zeitlhofer --- .../call/DefaultCallSignalingService.kt | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/DefaultCallSignalingService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/DefaultCallSignalingService.kt index 0c1a129733..8e8bbfa691 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/DefaultCallSignalingService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/DefaultCallSignalingService.kt @@ -58,18 +58,32 @@ internal class DefaultCallSignalingService @Inject constructor( private val activeCalls = mutableListOf() - private var cachedTurnServerResponse: TurnServerResponse? = null + private var cachedTurnServerResponse = object { + + private val MIN_TTL = 60 + + private val now = { System.currentTimeMillis() / 1000 } + + private var expiresAt: Long = 0 + + var data: TurnServerResponse? = null + get() = if (expiresAt > now()) field else null + set(value) { + expiresAt = now() + (value?.ttl ?: 0) - MIN_TTL + field = value + } + } override fun getTurnServer(callback: MatrixCallback): Cancelable { - if (cachedTurnServerResponse != null) { - cachedTurnServerResponse?.let { callback.onSuccess(it) } + if (cachedTurnServerResponse.data != null) { + cachedTurnServerResponse.data?.let { callback.onSuccess(it) } return NoOpCancellable } return turnServerTask .configureWith(GetTurnServerTask.Params) { this.callback = object : MatrixCallback { override fun onSuccess(data: TurnServerResponse) { - cachedTurnServerResponse = data + cachedTurnServerResponse.data = data callback.onSuccess(data) }