fix: revoked token no longer crashes the app
This commit is contained in:
parent
aca7817526
commit
e185350d4c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue