From 2db62fdb052691802dd37376620aff2b8a757c76 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Fri, 17 Nov 2023 16:18:43 +0200
Subject: [PATCH] Implement refreshToken in DefaultAuthService

---
 .../sdk/api/auth/AuthenticationService.kt     |  6 +++++
 .../auth/DefaultAuthenticationService.kt      | 27 +++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
index 1afae8c1..ad5a43e8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
@@ -24,6 +24,7 @@ import org.matrix.android.sdk.api.auth.login.LoginWizard
 import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
 import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
 import org.matrix.android.sdk.api.session.Session
+import org.matrix.android.sdk.internal.auth.login.RefreshedTokenInfo
 
 /**
  * This interface defines methods to authenticate or to create an account to a matrix server.
@@ -165,4 +166,9 @@ interface AuthenticationService {
      * Added for switch user
      */
     suspend fun removeSession(sessionId: String)
+
+    /**
+     * Added for Circles
+     */
+    suspend fun refreshToken(sessionId: String): RefreshedTokenInfo
 }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
index aa5774e5..d3b3b923 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
@@ -42,6 +42,8 @@ import org.matrix.android.sdk.internal.auth.db.PendingSessionData
 import org.matrix.android.sdk.internal.auth.login.DefaultLoginWizard
 import org.matrix.android.sdk.internal.auth.login.DirectLoginTask
 import org.matrix.android.sdk.internal.auth.login.QrLoginTokenTask
+import org.matrix.android.sdk.internal.auth.login.RefreshTokenParams
+import org.matrix.android.sdk.internal.auth.login.RefreshedTokenInfo
 import org.matrix.android.sdk.internal.auth.registration.DefaultRegistrationWizard
 import org.matrix.android.sdk.internal.auth.version.Versions
 import org.matrix.android.sdk.internal.auth.version.doesServerSupportLogoutDevices
@@ -501,4 +503,29 @@ internal class DefaultAuthenticationService @Inject constructor(
     override suspend fun removeSession(sessionId: String) {
         sessionManager.removeSession(sessionId)
     }
+
+    //Added for Circles
+    override suspend fun refreshToken(sessionId: String): RefreshedTokenInfo {
+        val sessionParams = sessionParamsStore.get(sessionId) ?: throw IllegalArgumentException(
+                "Session params for session $sessionId not found"
+        )
+        val authAPI = buildAuthAPI(sessionParams.homeServerConnectionConfig)
+
+        val sessionCredentials = sessionParamsStore.get(sessionId)?.credentials ?: throw IllegalArgumentException(
+                "Credentials for session $sessionId not found"
+        )
+        val sessionRefreshToken = sessionCredentials.refreshToken ?: throw IllegalArgumentException(
+                "Refresh token for session $sessionId not found"
+        )
+        val refreshTokenInfo = executeRequest(null) {
+            authAPI.refreshToken(RefreshTokenParams(sessionRefreshToken))
+        }
+        val newCredentials = sessionCredentials.copy(
+                accessToken = refreshTokenInfo.accessToken,
+                refreshToken = refreshTokenInfo.refreshToken,
+                expiresInMs = refreshTokenInfo.expiresInMs
+        )
+        sessionParamsStore.updateCredentials(newCredentials)
+        return refreshTokenInfo
+    }
 }
-- 
GitLab