diff --git a/Core b/Core index 12d648f8..a487d56f 160000 --- a/Core +++ b/Core @@ -1 +1 @@ -Subproject commit 12d648f832cba5b1ee7554c9f135993033b7f40b +Subproject commit a487d56f094802e210f1dae716fba045b8d0d679 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..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,50 +18,24 @@ 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.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 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))) - } - } - } + override fun onCreate() { + super.onCreate() + val sentryPreferences = runBlocking { SentryPreferences() } // Non-user-facing process, runBlocking is fine. + configureSentry(isDebug = BuildConfig.DEBUG, isSentryTrackingEnabled = { sentryPreferences.isSentryAuthorized }) } - 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) } }