From 1ca4b3b78a784cfd4c56ebc1db133b956475b318 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 25 Aug 2021 15:50:39 +0200 Subject: [PATCH] Add expired account error code For synapse instances which have activated and configured the email account validity module, an error code (ORG_MATRIX_EXPIRED_ACCOUNT) is triggered for any request authenticated by the user's access token which is expired. This change only add the error code in the matrix SDK but does not handle it for now in the client side. More documentation can be found in the dedicated Synapse plugin module repository: https://github.com/matrix-org/synapse-email-account-validity --- .../org/matrix/android/sdk/api/failure/Extensions.kt | 4 +++- .../matrix/android/sdk/api/failure/GlobalError.kt | 1 + .../matrix/android/sdk/api/failure/MatrixError.kt | 3 +++ .../sdk/internal/network/RetrofitExtensions.kt | 12 +++++++----- .../vector/app/core/platform/VectorBaseActivity.kt | 1 + 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt index 0ba61e5890..3149a0218b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt @@ -29,7 +29,9 @@ fun Throwable.is401() = fun Throwable.isTokenError() = this is Failure.ServerError - && (error.code == MatrixError.M_UNKNOWN_TOKEN || error.code == MatrixError.M_MISSING_TOKEN) + && (error.code == MatrixError.M_UNKNOWN_TOKEN + || error.code == MatrixError.M_MISSING_TOKEN + || error.code == MatrixError.ORG_MATRIX_EXPIRED_ACCOUNT) fun Throwable.shouldBeRetried(): Boolean { return this is Failure.NetworkConnection diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt index ef770ea1d2..50c84da02b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt @@ -23,4 +23,5 @@ sealed class GlobalError { data class InvalidToken(val softLogout: Boolean) : GlobalError() data class ConsentNotGivenError(val consentUri: String) : GlobalError() data class CertificateError(val fingerprint: Fingerprint) : GlobalError() + object ExpiredAccount : GlobalError() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt index 73b0fe0a7c..f2da2b9ad2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt @@ -189,5 +189,8 @@ data class MatrixError( // Possible value for "limit_type" const val LIMIT_TYPE_MAU = "monthly_active_user" + + /** The user account has expired. It has to be renewed by clicking on an email or by sending a renewal token. */ + const val ORG_MATRIX_EXPIRED_ACCOUNT = "ORG_MATRIX_EXPIRED_ACCOUNT" } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RetrofitExtensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RetrofitExtensions.kt index 71ba71b915..8a03102527 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RetrofitExtensions.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RetrofitExtensions.kt @@ -19,13 +19,13 @@ package org.matrix.android.sdk.internal.network import com.squareup.moshi.JsonEncodingException +import kotlinx.coroutines.suspendCancellableCoroutine +import okhttp3.ResponseBody +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.failure.GlobalError import org.matrix.android.sdk.api.failure.MatrixError import org.matrix.android.sdk.internal.di.MoshiProvider -import kotlinx.coroutines.suspendCancellableCoroutine -import okhttp3.ResponseBody -import org.matrix.android.sdk.api.extensions.orFalse import retrofit2.HttpException import retrofit2.Response import timber.log.Timber @@ -86,16 +86,18 @@ private fun toFailure(errorBody: ResponseBody?, httpCode: Int, globalErrorReceiv val matrixError = matrixErrorAdapter.fromJson(errorBodyStr) if (matrixError != null) { + // Also send following errors to the globalErrorReceiver, for a global management when { matrixError.code == MatrixError.M_CONSENT_NOT_GIVEN && !matrixError.consentUri.isNullOrBlank() -> { - // Also send this error to the globalErrorReceiver, for a global management globalErrorReceiver?.handleGlobalError(GlobalError.ConsentNotGivenError(matrixError.consentUri)) } httpCode == HttpURLConnection.HTTP_UNAUTHORIZED /* 401 */ && matrixError.code == MatrixError.M_UNKNOWN_TOKEN -> { - // Also send this error to the globalErrorReceiver, for a global management globalErrorReceiver?.handleGlobalError(GlobalError.InvalidToken(matrixError.isSoftLogout.orFalse())) } + matrixError.code == MatrixError.ORG_MATRIX_EXPIRED_ACCOUNT -> { + globalErrorReceiver?.handleGlobalError(GlobalError.ExpiredAccount) + } } return Failure.ServerError(matrixError, httpCode) diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt index 61abbd445b..dc19520865 100644 --- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt +++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt @@ -267,6 +267,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), HasSc activeSessionHolder.getActiveSession().sessionParams.homeServerHost ?: "") is GlobalError.CertificateError -> handleCertificateError(globalError) + GlobalError.ExpiredAccount -> Unit // TODO Handle account expiration }.exhaustive }