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
|
package chat.revolt.api
|
||||||
|
|
||||||
import chat.revolt.api.routes.user.fetchSelf
|
import chat.revolt.api.routes.user.fetchSelf
|
||||||
|
import chat.revolt.api.routes.user.fetchSelfWithNewToken
|
||||||
import chat.revolt.api.schemas.CompleteUser
|
import chat.revolt.api.schemas.CompleteUser
|
||||||
import io.ktor.client.*
|
import io.ktor.client.*
|
||||||
import io.ktor.client.engine.okhttp.*
|
import io.ktor.client.engine.okhttp.*
|
||||||
|
|
@ -85,6 +86,18 @@ object RevoltAPI {
|
||||||
|
|
||||||
userCache.clear()
|
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
|
@kotlinx.serialization.Serializable
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,13 @@
|
||||||
package chat.revolt.api.routes.user
|
package chat.revolt.api.routes.user
|
||||||
|
|
||||||
import chat.revolt.api.RevoltAPI
|
import chat.revolt.api.RevoltAPI
|
||||||
|
import chat.revolt.api.RevoltError
|
||||||
import chat.revolt.api.RevoltHttp
|
import chat.revolt.api.RevoltHttp
|
||||||
import chat.revolt.api.RevoltJson
|
import chat.revolt.api.RevoltJson
|
||||||
import chat.revolt.api.schemas.CompleteUser
|
import chat.revolt.api.schemas.CompleteUser
|
||||||
import io.ktor.client.request.*
|
import io.ktor.client.request.*
|
||||||
import io.ktor.client.statement.*
|
import io.ktor.client.statement.*
|
||||||
|
import kotlinx.serialization.SerializationException
|
||||||
|
|
||||||
suspend fun fetchSelf(): CompleteUser {
|
suspend fun fetchSelf(): CompleteUser {
|
||||||
val response = RevoltHttp.get("/users/@me") {
|
val response = RevoltHttp.get("/users/@me") {
|
||||||
|
|
@ -13,6 +15,13 @@ suspend fun fetchSelf(): CompleteUser {
|
||||||
}
|
}
|
||||||
.bodyAsText()
|
.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)
|
val user = RevoltJson.decodeFromString(CompleteUser.serializer(), response)
|
||||||
|
|
||||||
RevoltAPI.userCache[user.id!!] = user
|
RevoltAPI.userCache[user.id!!] = user
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,11 @@ class GreeterViewModel @Inject constructor(
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
val token = kvStorage.get("sessionToken")
|
val token = kvStorage.get("sessionToken")
|
||||||
if (token != null) {
|
if (token != null) {
|
||||||
RevoltAPI.setSessionHeader(token)
|
val valid = RevoltAPI.checkSessionToken(token)
|
||||||
|
if (!valid) {
|
||||||
|
kvStorage.remove("sessionToken")
|
||||||
|
RevoltAPI.setSessionHeader("")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RevoltAPI.initialize()
|
RevoltAPI.initialize()
|
||||||
|
|
|
||||||
|
|
@ -75,10 +75,14 @@ class LoginViewModel @Inject constructor(
|
||||||
"No MFA required. Login is complete! We have a session token: ${response.firstUserHints!!.token}"
|
"No MFA required. Login is complete! We have a session token: ${response.firstUserHints!!.token}"
|
||||||
)
|
)
|
||||||
|
|
||||||
fetchSelfWithNewToken(response.firstUserHints.token)
|
try {
|
||||||
kvStorage.set("sessionToken", response.firstUserHints.token)
|
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}"
|
"Successfully authorized TOTP. Token: ${response.firstUserHints!!.token}"
|
||||||
)
|
)
|
||||||
|
|
||||||
fetchSelfWithNewToken(response.firstUserHints.token)
|
try {
|
||||||
kvStorage.set("sessionToken", response.firstUserHints.token)
|
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}"
|
"Successfully authorized recovery code. Token: ${response.firstUserHints!!.token}"
|
||||||
)
|
)
|
||||||
|
|
||||||
fetchSelfWithNewToken(response.firstUserHints.token)
|
try {
|
||||||
kvStorage.set("sessionToken", response.firstUserHints.token)
|
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