From 3b2f7a67464f4432c4ee2d7a385ee9615cb7219e Mon Sep 17 00:00:00 2001 From: Jonathan Klee Date: Tue, 22 Apr 2025 10:55:49 +0200 Subject: [PATCH 1/2] Revert "fix: clear cookie if the app is updated" This reverts commit 73812170ed4cd02d6ddc181bf2008444e30f4b46. --- .../davdroid/syncadapter/SyncManager.kt | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt index 4749f57ac..04b18a4f4 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt @@ -10,16 +10,12 @@ import android.content.ContentUris import android.content.Context import android.content.Intent import android.content.SyncResult -import android.content.pm.PackageManager import android.net.Uri import android.os.RemoteException import android.provider.CalendarContract import android.provider.ContactsContract import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat -import androidx.core.content.edit -import androidx.core.content.pm.PackageInfoCompat -import androidx.preference.PreferenceManager import at.bitfire.dav4jvm.* import at.bitfire.dav4jvm.exception.* import at.bitfire.dav4jvm.property.GetCTag @@ -179,8 +175,6 @@ abstract class SyncManager, out CollectionType: L val workDispatcher = getWorkDispatcher() - private val PREF_LAST_VERSION_CODE = "LAST_VERSION_CODE" - /** * Call performSync with default retry values */ @@ -201,34 +195,6 @@ abstract class SyncManager, out CollectionType: L refreshAuthTokenAndSync(authState) } - private fun packageChanged(): Boolean { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - val currentVersion = getCurrentVersionCode() - val savedVersion = prefs.getLong(PREF_LAST_VERSION_CODE, 0L) - if (savedVersion != currentVersion) { - Logger.log.warning("App has been updated!" + - "Previous: $savedVersion, Current: $currentVersion") - prefs.edit { - putLong(PREF_LAST_VERSION_CODE, currentVersion) - } - // Clear cookie since the app is updated. - Logger.log.warning("Clear cookies for ${accountSettings.credentials().userName}") - accountSettings.clearCookie() - return true - } - - return false - } - - private fun getCurrentVersionCode(): Long { - return try { - val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0) - PackageInfoCompat.getLongVersionCode(packageInfo) - } catch (e: PackageManager.NameNotFoundException) { - 0 - } - } - private fun refreshAuthTokenAndSync(authState: AuthState) { val tokenRequest = authState.createTokenRefreshRequest() val clientSecretString = accountSettings.credentials().clientSecret @@ -422,9 +388,6 @@ abstract class SyncManager, out CollectionType: L is UnauthorizedException -> { Logger.log.log(Level.WARNING, "Got 401 Unauthorized", e) - if (packageChanged()) { - return@unwrapExceptions - } val credentials = accountSettings.credentials() if (credentials.authState == null) { credentials.passwordNeedsUpdate = true -- GitLab From fa21e073e1ca8e04d6706496bcd02a08042b78c4 Mon Sep 17 00:00:00 2001 From: Jonathan Klee Date: Tue, 22 Apr 2025 10:56:00 +0200 Subject: [PATCH 2/2] Revert "Avoid too many request after auth fail" This reverts commit 48e46ca19760e7ef90715476133245326235088d. --- .../kotlin/at/bitfire/davdroid/Constants.kt | 2 -- .../at/bitfire/davdroid/db/Credentials.kt | 3 +-- .../davdroid/settings/AccountSettings.kt | 11 +--------- .../davdroid/syncadapter/SyncManager.kt | 21 ++++--------------- .../davdroid/ui/account/SettingsActivity.kt | 14 ------------- 5 files changed, 6 insertions(+), 45 deletions(-) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/Constants.kt b/app/src/main/kotlin/at/bitfire/davdroid/Constants.kt index f1a481ba7..b231268de 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/Constants.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/Constants.kt @@ -34,6 +34,4 @@ object Constants { const val E_SYNC_URL = "e.email" const val MURENA_DAV_URL = "https://murena.io/remote.php/dav" - - const val HTTP_STATUS_CODE_TOO_MANY_REQUESTS = 429 } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/db/Credentials.kt b/app/src/main/kotlin/at/bitfire/davdroid/db/Credentials.kt index 34b54902e..4e0469f4a 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/db/Credentials.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/db/Credentials.kt @@ -13,8 +13,7 @@ data class Credentials( val authState: AuthState? = null, val certificateAlias: String? = null, val serverUri: URI? = null, - val clientSecret: String? = null, - var passwordNeedsUpdate: Boolean = false + val clientSecret: String? = null ) { override fun toString(): String { diff --git a/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt b/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt index 6e9f23c4e..abbb5855e 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/settings/AccountSettings.kt @@ -73,7 +73,6 @@ class AccountSettings( const val KEY_AUTH_STATE = "auth_state" const val KEY_CLIENT_SECRET = "client_secret" const val KEY_CERTIFICATE_ALIAS = "certificate_alias" - const val KEY_PASSWORD_NEEDS_UPDATE = "password_needs_update" const val KEY_WIFI_ONLY = "wifi_only" // sync on WiFi only (default: false) const val KEY_WIFI_ONLY_SSIDS = "wifi_only_ssids" // restrict sync to specific WiFi SSIDs @@ -157,9 +156,6 @@ class AccountSettings( if (credentials.clientSecret != null) { bundle.putString(KEY_CLIENT_SECRET, credentials.clientSecret) } - - bundle.putString(KEY_PASSWORD_NEEDS_UPDATE, - credentials.passwordNeedsUpdate.toString()) } if (!cookies.isNullOrEmpty()) { @@ -274,9 +270,7 @@ class AccountSettings( accountManager.getUserData(account, KEY_USERNAME), accountManager.getPassword(account), null, - accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS), - passwordNeedsUpdate = accountManager.getUserData( - account, KEY_PASSWORD_NEEDS_UPDATE).toBoolean() + accountManager.getUserData(account, KEY_CERTIFICATE_ALIAS) ) } else { Credentials( @@ -293,9 +287,6 @@ class AccountSettings( // Basic/Digest auth accountManager.setAndVerifyUserData(account, KEY_USERNAME, credentials.userName) accountManager.setPassword(account, credentials.password) - accountManager.setAndVerifyUserData(account, KEY_PASSWORD_NEEDS_UPDATE, - credentials.passwordNeedsUpdate.toString() - ) // client certificate accountManager.setAndVerifyUserData(account, KEY_CERTIFICATE_ALIAS, credentials.certificateAlias) diff --git a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt index 04b18a4f4..ae3b479bb 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/syncadapter/SyncManager.kt @@ -179,14 +179,8 @@ abstract class SyncManager, out CollectionType: L * Call performSync with default retry values */ fun performSync() { - val credentials = accountSettings.credentials() - if (credentials.passwordNeedsUpdate) { - val exception = UnauthorizedException(context.getString(R.string.sync_error_authentication_failed)) - notifyException(exception, null, null) - return - } + val authState = accountSettings.credentials().authState - val authState = credentials.authState if (authState == null || !authState.needsTokenRefresh) { performSync(DEFAULT_RETRY_AFTER, DEFAULT_SECOND_RETRY_AFTER, DEFAULT_MAX_RETRY_TIME) return @@ -232,7 +226,8 @@ abstract class SyncManager, out CollectionType: L * @param secondRetryAfter optional param, in seconds. Used to calculate fibonnacci sequence for rety on unhandled exception * @param maxRetryTime optional param, in seconds. On unhandled exception, max time the method should retry. */ - private fun performSync(retryAfter: Int, secondRetryAfter: Int, maxRetryTime: Int) { + fun performSync(retryAfter: Int, secondRetryAfter: Int, maxRetryTime: Int) { + // dismiss previous error notifications notificationManager.cancel(notificationTag, NotificationUtils.NOTIFY_SYNC_ERROR) @@ -388,11 +383,6 @@ abstract class SyncManager, out CollectionType: L is UnauthorizedException -> { Logger.log.log(Level.WARNING, "Got 401 Unauthorized", e) - val credentials = accountSettings.credentials() - if (credentials.authState == null) { - credentials.passwordNeedsUpdate = true - accountSettings.credentials(credentials) - } notifyException(e, local, remote) return@unwrapExceptions } @@ -421,10 +411,6 @@ abstract class SyncManager, out CollectionType: L if (retryAfter > 0 && secondRetryAfter > 0 && retryAfter <= maxRetryTime) { try { Logger.log.severe("Faced unhandled exception $e, Will retry sync") - if (e is HttpException && e.code == Constants.HTTP_STATUS_CODE_TOO_MANY_REQUESTS) { - Logger.log.info("HTTP 429 Too Many Requests: Retry sync cancelled") - return false - } Logger.log.info("Retry sync after $retryAfter seconds") Thread.sleep(retryAfter * 1000L) performSync(secondRetryAfter, retryAfter + secondRetryAfter, maxRetryTime) @@ -958,6 +944,7 @@ abstract class SyncManager, out CollectionType: L .setCategory(NotificationCompat.CATEGORY_ERROR) viewItemAction?.let { builder.addAction(it) } + notificationManager.notifyIfPossible(tag, NotificationUtils.NOTIFY_SYNC_ERROR, builder.build()) } diff --git a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt index f1946ff19..22cc425c2 100644 --- a/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt +++ b/app/src/main/kotlin/at/bitfire/davdroid/ui/account/SettingsActivity.kt @@ -8,7 +8,6 @@ import android.accounts.Account import android.accounts.AccountManager import android.annotation.SuppressLint import android.app.Application -import android.app.NotificationManager import android.content.Intent import android.os.Build import android.os.Bundle @@ -40,7 +39,6 @@ import at.bitfire.davdroid.log.Logger import at.bitfire.davdroid.resource.TaskUtils import at.bitfire.davdroid.settings.AccountSettings import at.bitfire.davdroid.settings.SettingsManager -import at.bitfire.davdroid.syncadapter.SyncUtils import at.bitfire.davdroid.syncadapter.SyncWorker import at.bitfire.davdroid.syncadapter.Syncer import at.bitfire.davdroid.ui.UiUtils @@ -135,13 +133,6 @@ class SettingsActivity: AppCompatActivity() { return true } - private fun cancelNotifications() { - context?.getSystemService(NotificationManager::class.java)?.let { notificationManager -> - notificationManager.cancelAll() - Logger.log.info("All notifications canceled successfully") - } ?: Logger.log.warning("Failed to cancel notifications: Context is null") - } - private fun initSettings() { // preference group: sync findPreference(getString(R.string.settings_sync_interval_contacts_key))!!.let { @@ -301,12 +292,7 @@ class SettingsActivity: AppCompatActivity() { certificateAlias = credentials.certificateAlias, authState = credentials.authState, clientSecret = credentials.clientSecret, - passwordNeedsUpdate = false, serverUri = credentials.serverUri)) - // Cancel all notifications on password change. - cancelNotifications() - // Sync accounts once password is changed. - context?.let { SyncUtils.syncAllAccounts(it) } false } } else -- GitLab