fix: revoked token no longer crashes the app

This commit is contained in:
Infi 2022-12-12 20:12:06 +01:00
parent aca7817526
commit e185350d4c
5 changed files with 48 additions and 10 deletions

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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"
}
}
}
}

View File

@ -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"
}
}
}
}