From a55a4930608a011b15125bc37e74879652519526 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Dec 2024 12:14:03 +0100 Subject: [PATCH 1/2] Create a `loggerTag` val. --- .../unifiedpush/UnifiedPushGatewayResolver.kt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayResolver.kt b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayResolver.kt index 4b80ae42ff..8dc54dff8c 100644 --- a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayResolver.kt +++ b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayResolver.kt @@ -10,6 +10,7 @@ package io.element.android.libraries.pushproviders.unifiedpush import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.data.tryOrNull +import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.di.AppScope import kotlinx.coroutines.withContext import retrofit2.HttpException @@ -29,6 +30,8 @@ interface UnifiedPushGatewayResolver { suspend fun getGateway(endpoint: String): UnifiedPushGatewayResolverResult } +private val loggerTag = LoggerTag("DefaultUnifiedPushGatewayResolver") + @ContributesBinding(AppScope::class) class DefaultUnifiedPushGatewayResolver @Inject constructor( private val unifiedPushApiFactory: UnifiedPushApiFactory, @@ -36,36 +39,36 @@ class DefaultUnifiedPushGatewayResolver @Inject constructor( ) : UnifiedPushGatewayResolver { override suspend fun getGateway(endpoint: String): UnifiedPushGatewayResolverResult { val url = tryOrNull( - onException = { Timber.tag("DefaultUnifiedPushGatewayResolver").d(it, "Cannot parse endpoint as an URL") } + onException = { Timber.tag(loggerTag.value).d(it, "Cannot parse endpoint as an URL") } ) { URL(endpoint) } return if (url == null) { - Timber.tag("DefaultUnifiedPushGatewayResolver").d("ErrorInvalidUrl") + Timber.tag(loggerTag.value).d("ErrorInvalidUrl") UnifiedPushGatewayResolverResult.ErrorInvalidUrl } else { val port = if (url.port != -1) ":${url.port}" else "" val customBase = "${url.protocol}://${url.host}$port" val customUrl = "$customBase/_matrix/push/v1/notify" - Timber.tag("DefaultUnifiedPushGatewayResolver").i("Testing $customUrl") + Timber.tag(loggerTag.value).i("Testing $customUrl") return withContext(coroutineDispatchers.io) { val api = unifiedPushApiFactory.create(customBase) try { val discoveryResponse = api.discover() if (discoveryResponse.unifiedpush.gateway == "matrix") { - Timber.tag("DefaultUnifiedPushGatewayResolver").d("The endpoint seems to be a valid UnifiedPush gateway") + Timber.tag(loggerTag.value).d("The endpoint seems to be a valid UnifiedPush gateway") UnifiedPushGatewayResolverResult.Success(customUrl) } else { // The endpoint returned a 200 OK but didn't promote an actual matrix gateway, which means it doesn't have any - Timber.tag("DefaultUnifiedPushGatewayResolver").w("The endpoint does not seem to be a valid UnifiedPush gateway, using fallback") + Timber.tag(loggerTag.value).w("The endpoint does not seem to be a valid UnifiedPush gateway, using fallback") UnifiedPushGatewayResolverResult.NoMatrixGateway } } catch (throwable: Throwable) { if ((throwable as? HttpException)?.code() == HttpURLConnection.HTTP_NOT_FOUND) { - Timber.tag("DefaultUnifiedPushGatewayResolver").i("Checking for UnifiedPush endpoint yielded 404, using fallback") + Timber.tag(loggerTag.value).i("Checking for UnifiedPush endpoint yielded 404, using fallback") UnifiedPushGatewayResolverResult.NoMatrixGateway } else { - Timber.tag("DefaultUnifiedPushGatewayResolver").e(throwable, "Error checking for UnifiedPush endpoint") + Timber.tag(loggerTag.value).e(throwable, "Error checking for UnifiedPush endpoint") UnifiedPushGatewayResolverResult.Error(customUrl) } } From 7819c3fabf8695f57dd134ee5c0055cd2829d4fc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Dec 2024 12:15:27 +0100 Subject: [PATCH 2/2] Cannot create a logger like that. The tag will be lost. --- .../matrix/impl/RustClientSessionDelegate.kt | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt index cb1a443ccb..7a3bfb3e6b 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustClientSessionDelegate.kt @@ -8,12 +8,12 @@ package io.element.android.libraries.matrix.impl import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.core.log.logger.LoggerTag import io.element.android.libraries.matrix.impl.mapper.toSessionData import io.element.android.libraries.matrix.impl.paths.getSessionPaths import io.element.android.libraries.matrix.impl.util.anonymizedTokens import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import org.matrix.rustcomponents.sdk.ClientDelegate import org.matrix.rustcomponents.sdk.ClientSessionDelegate @@ -22,6 +22,8 @@ import timber.log.Timber import java.lang.ref.WeakReference import java.util.concurrent.atomic.AtomicBoolean +private val loggerTag = LoggerTag("RustClientSessionDelegate") + /** * This class is responsible for handling the session data for the Rust SDK. * @@ -29,14 +31,11 @@ import java.util.concurrent.atomic.AtomicBoolean * * IMPORTANT: you must set the [client] property as soon as possible so [didReceiveAuthError] can work properly. */ -@OptIn(ExperimentalCoroutinesApi::class) class RustClientSessionDelegate( private val sessionStore: SessionStore, private val appCoroutineScope: CoroutineScope, coroutineDispatchers: CoroutineDispatchers, ) : ClientSessionDelegate, ClientDelegate { - private val clientLog = Timber.tag("$this") - // Used to ensure several calls to `didReceiveAuthError` don't trigger multiple logouts private val isLoggingOut = AtomicBoolean(false) @@ -64,7 +63,7 @@ class RustClientSessionDelegate( appCoroutineScope.launch(updateTokensDispatcher) { val existingData = sessionStore.getSession(session.userId) ?: return@launch val (anonymizedAccessToken, anonymizedRefreshToken) = session.anonymizedTokens() - clientLog.d( + Timber.tag(loggerTag.value).d( "Saving new session data with token: access token '$anonymizedAccessToken' and refresh token '$anonymizedRefreshToken'. " + "Was token valid: ${existingData.isTokenValid}" ) @@ -75,29 +74,29 @@ class RustClientSessionDelegate( sessionPaths = existingData.getSessionPaths(), ) sessionStore.updateData(newData) - clientLog.d("Saved new session data with access token: '$anonymizedAccessToken'.") + Timber.tag(loggerTag.value).d("Saved new session data with access token: '$anonymizedAccessToken'.") }.invokeOnCompletion { if (it != null) { - clientLog.e(it, "Failed to save new session data.") + Timber.tag(loggerTag.value).e(it, "Failed to save new session data.") } } } override fun didReceiveAuthError(isSoftLogout: Boolean) { - clientLog.w("didReceiveAuthError(isSoftLogout=$isSoftLogout)") + Timber.tag(loggerTag.value).w("didReceiveAuthError(isSoftLogout=$isSoftLogout)") if (isLoggingOut.getAndSet(true).not()) { - clientLog.v("didReceiveAuthError -> do the cleanup") + Timber.tag(loggerTag.value).v("didReceiveAuthError -> do the cleanup") // TODO handle isSoftLogout parameter. appCoroutineScope.launch(updateTokensDispatcher) { val currentClient = client.get() if (currentClient == null) { - clientLog.w("didReceiveAuthError -> no client, exiting") + Timber.tag(loggerTag.value).w("didReceiveAuthError -> no client, exiting") isLoggingOut.set(false) return@launch } val existingData = sessionStore.getSession(currentClient.sessionId.value) val (anonymizedAccessToken, anonymizedRefreshToken) = existingData.anonymizedTokens() - clientLog.d( + Timber.tag(loggerTag.value).d( "Removing session data with access token '$anonymizedAccessToken' " + "and refresh token '$anonymizedRefreshToken'." ) @@ -105,18 +104,18 @@ class RustClientSessionDelegate( // Set isTokenValid to false val newData = existingData.copy(isTokenValid = false) sessionStore.updateData(newData) - clientLog.d("Invalidated session data with access token: '$anonymizedAccessToken'.") + Timber.tag(loggerTag.value).d("Invalidated session data with access token: '$anonymizedAccessToken'.") } else { - clientLog.d("No session data found.") + Timber.tag(loggerTag.value).d("No session data found.") } currentClient.logout(userInitiated = false, ignoreSdkError = true) }.invokeOnCompletion { if (it != null) { - clientLog.e(it, "Failed to remove session data.") + Timber.tag(loggerTag.value).e(it, "Failed to remove session data.") } } } else { - clientLog.v("didReceiveAuthError -> already cleaning up") + Timber.tag(loggerTag.value).v("didReceiveAuthError -> already cleaning up") } }