From e185350d4c2a7c05c80c089a1f6f0f9cb973ed4e Mon Sep 17 00:00:00 2001 From: Infi Date: Mon, 12 Dec 2022 20:12:06 +0100 Subject: [PATCH] fix: revoked token no longer crashes the app --- .../main/java/chat/revolt/api/RevoltAPI.kt | 13 ++++++++++++ .../java/chat/revolt/api/routes/user/User.kt | 9 +++++++++ .../revolt/screens/login/GreeterScreen.kt | 6 +++++- .../chat/revolt/screens/login/LoginScreen.kt | 10 +++++++--- .../chat/revolt/screens/login/MfaScreen.kt | 20 +++++++++++++------ 5 files changed, 48 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/chat/revolt/api/RevoltAPI.kt b/app/src/main/java/chat/revolt/api/RevoltAPI.kt index a163f2e1..c535584e 100644 --- a/app/src/main/java/chat/revolt/api/RevoltAPI.kt +++ b/app/src/main/java/chat/revolt/api/RevoltAPI.kt @@ -1,6 +1,7 @@ package chat.revolt.api import chat.revolt.api.routes.user.fetchSelf +import chat.revolt.api.routes.user.fetchSelfWithNewToken import chat.revolt.api.schemas.CompleteUser import io.ktor.client.* import io.ktor.client.engine.okhttp.* @@ -85,6 +86,18 @@ object RevoltAPI { userCache.clear() } + + /** + * Checks if a session token is valid. + */ + suspend fun checkSessionToken(token: String): Boolean { + return try { + fetchSelfWithNewToken(token) + true + } catch (e: Exception) { + false + } + } } @kotlinx.serialization.Serializable diff --git a/app/src/main/java/chat/revolt/api/routes/user/User.kt b/app/src/main/java/chat/revolt/api/routes/user/User.kt index ccd84852..42d12ac2 100644 --- a/app/src/main/java/chat/revolt/api/routes/user/User.kt +++ b/app/src/main/java/chat/revolt/api/routes/user/User.kt @@ -1,11 +1,13 @@ package chat.revolt.api.routes.user import chat.revolt.api.RevoltAPI +import chat.revolt.api.RevoltError import chat.revolt.api.RevoltHttp import chat.revolt.api.RevoltJson import chat.revolt.api.schemas.CompleteUser import io.ktor.client.request.* import io.ktor.client.statement.* +import kotlinx.serialization.SerializationException suspend fun fetchSelf(): CompleteUser { val response = RevoltHttp.get("/users/@me") { @@ -13,6 +15,13 @@ suspend fun fetchSelf(): CompleteUser { } .bodyAsText() + try { + val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + throw Error(error.type) + } catch (e: SerializationException) { + // Not an error + } + val user = RevoltJson.decodeFromString(CompleteUser.serializer(), response) RevoltAPI.userCache[user.id!!] = user diff --git a/app/src/main/java/chat/revolt/screens/login/GreeterScreen.kt b/app/src/main/java/chat/revolt/screens/login/GreeterScreen.kt index ee83b26e..5e388e1c 100644 --- a/app/src/main/java/chat/revolt/screens/login/GreeterScreen.kt +++ b/app/src/main/java/chat/revolt/screens/login/GreeterScreen.kt @@ -55,7 +55,11 @@ class GreeterViewModel @Inject constructor( viewModelScope.launch { val token = kvStorage.get("sessionToken") if (token != null) { - RevoltAPI.setSessionHeader(token) + val valid = RevoltAPI.checkSessionToken(token) + if (!valid) { + kvStorage.remove("sessionToken") + RevoltAPI.setSessionHeader("") + } } RevoltAPI.initialize() diff --git a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt b/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt index b9919ec0..542797b8 100644 --- a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt +++ b/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt @@ -75,10 +75,14 @@ class LoginViewModel @Inject constructor( "No MFA required. Login is complete! We have a session token: ${response.firstUserHints!!.token}" ) - fetchSelfWithNewToken(response.firstUserHints.token) - kvStorage.set("sessionToken", response.firstUserHints.token) + try { + fetchSelfWithNewToken(response.firstUserHints.token) + kvStorage.set("sessionToken", response.firstUserHints.token) - _navigateTo = "home" + _navigateTo = "home" + } catch (e: Error) { + _error = e.message ?: "Unknown error" + } } } } diff --git a/app/src/main/java/chat/revolt/screens/login/MfaScreen.kt b/app/src/main/java/chat/revolt/screens/login/MfaScreen.kt index 86631669..02b105a5 100644 --- a/app/src/main/java/chat/revolt/screens/login/MfaScreen.kt +++ b/app/src/main/java/chat/revolt/screens/login/MfaScreen.kt @@ -79,10 +79,14 @@ class MfaScreenViewModel @Inject constructor( "Successfully authorized TOTP. Token: ${response.firstUserHints!!.token}" ) - fetchSelfWithNewToken(response.firstUserHints.token) - kvStorage.set("sessionToken", response.firstUserHints.token) + try { + fetchSelfWithNewToken(response.firstUserHints.token) + kvStorage.set("sessionToken", response.firstUserHints.token) - _navigateToHome = true + _navigateToHome = true + } catch (e: Error) { + _error = e.message ?: "Unknown error" + } } } } @@ -100,10 +104,14 @@ class MfaScreenViewModel @Inject constructor( "Successfully authorized recovery code. Token: ${response.firstUserHints!!.token}" ) - fetchSelfWithNewToken(response.firstUserHints.token) - kvStorage.set("sessionToken", response.firstUserHints.token) + try { + fetchSelfWithNewToken(response.firstUserHints.token) + kvStorage.set("sessionToken", response.firstUserHints.token) - _navigateToHome = true + _navigateToHome = true + } catch (e: Error) { + _error = e.message ?: "Unknown error" + } } } }