From 5b26905e5032b6ad0babdc20f8dac884dc22b8d3 Mon Sep 17 00:00:00 2001 From: Louis CAD Date: Wed, 23 Sep 2026 18:36:26 +0200 Subject: [PATCH 1/3] chore: Replace boilerplate with shared code in BackupAgent --- Core | 2 +- .../backup/AuthenticatorFullBackupAgent.kt | 46 ++----------------- 2 files changed, 6 insertions(+), 42 deletions(-) diff --git a/Core b/Core index 12d648f8..d67e84fa 160000 --- a/Core +++ b/Core @@ -1 +1 @@ -Subproject commit 12d648f832cba5b1ee7554c9f135993033b7f40b +Subproject commit d67e84fafcf38c726cd0d45fb772d5618e942006 diff --git a/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt b/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt index 18d624bc..07515bad 100644 --- a/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt +++ b/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt @@ -18,50 +18,14 @@ package com.infomaniak.auth.backup import android.app.backup.FullBackupDataOutput -import androidx.room.immediateTransaction -import androidx.room.useWriterConnection -import com.infomaniak.core.auth.models.user.User -import com.infomaniak.core.auth.room.UserDatabase +import com.infomaniak.core.auth.backup.withBlockStoreCredentialsBackup import com.infomaniak.core.common.backup.FullBackupAgent -import kotlinx.coroutines.runBlocking class AuthenticatorFullBackupAgent : FullBackupAgent(RestorationPolicy.AllBackedUpFiles) { - override fun onFullBackup(data: FullBackupDataOutput) { - val blockStoreBackupSucceeded = runBlocking { BlockStoreBackup.backupPasskeys() } - if (!blockStoreBackupSucceeded) return // Don't backup anything if we can't save the passkeys. - - val db = UserDatabase() - // We don't want to keep tokens in the db for backup, so we remove them temporarily. - // Note that the app can perfectly recover from this state if the backup process is aborted, here's why: - // Authenticated API calls with an empty token will result in a 401 http status code, - // which will lead to the token being refreshed using the passkey. - val usersWithTokens = runBlocking { db.getUsersAndRemoveTokens() } - try { - super.onFullBackup(data) - } finally { - runBlocking { db.putTokensBack(usersWithTokens) } - } - } - - private suspend fun UserDatabase.getUsersAndRemoveTokens(): List = useWriterConnection { transactor -> - transactor.immediateTransaction { - userDao().allUsers().also { users -> - users.forEach { user -> - userDao().update(user = user.copy(apiToken = user.apiToken.copy(accessToken = "", refreshToken = null))) - } - } - } - } - - private suspend fun UserDatabase.putTokensBack(usersWithTokens: List) { - useWriterConnection { transactor -> - transactor.immediateTransaction { - usersWithTokens.forEach { user -> - // We don't need the refreshToken even if it's there because we're using passkeys instead. - userDao().updateUserToken(user.id, user.apiToken.accessToken) - } - } - } + override fun onFullBackup(data: FullBackupDataOutput) = withBlockStoreCredentialsBackup( + backupCredentials = { BlockStoreBackup.backupPasskeys() } + ) { + super.onFullBackup(data) } } From 477c34543bce625c9d5fb957a63ed34dca22f5d2 Mon Sep 17 00:00:00 2001 From: Louis CAD Date: Wed, 23 Sep 2026 18:39:37 +0200 Subject: [PATCH 2/3] chore: Configure Sentry in BackupAgent --- .../auth/backup/AuthenticatorFullBackupAgent.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt b/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt index 07515bad..28a64e7a 100644 --- a/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt +++ b/app/src/standard/kotlin/com/infomaniak/auth/backup/AuthenticatorFullBackupAgent.kt @@ -18,11 +18,21 @@ package com.infomaniak.auth.backup import android.app.backup.FullBackupDataOutput +import com.infomaniak.auth.BuildConfig +import com.infomaniak.auth.data.preferences.SentryPreferences import com.infomaniak.core.auth.backup.withBlockStoreCredentialsBackup import com.infomaniak.core.common.backup.FullBackupAgent +import com.infomaniak.core.sentry.SentryConfig.configureSentry +import kotlinx.coroutines.runBlocking class AuthenticatorFullBackupAgent : FullBackupAgent(RestorationPolicy.AllBackedUpFiles) { + override fun onCreate() { + super.onCreate() + val sentryPreferences = runBlocking { SentryPreferences() } // Non-user-facing process, runBlocking is fine. + configureSentry(isDebug = BuildConfig.DEBUG, isSentryTrackingEnabled = { sentryPreferences.isSentryAuthorized }) + } + override fun onFullBackup(data: FullBackupDataOutput) = withBlockStoreCredentialsBackup( backupCredentials = { BlockStoreBackup.backupPasskeys() } ) { From d74b906f55bd8c4a5bba5c71d738523ca5b1b3dd Mon Sep 17 00:00:00 2001 From: Louis CAD Date: Thu, 24 Sep 2026 14:53:10 +0200 Subject: [PATCH 3/3] chore: Bump Core --- Core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core b/Core index d67e84fa..a487d56f 160000 --- a/Core +++ b/Core @@ -1 +1 @@ -Subproject commit d67e84fafcf38c726cd0d45fb772d5618e942006 +Subproject commit a487d56f094802e210f1dae716fba045b8d0d679