support for extra reasons of registration failure

This commit is contained in:
sergeych committed 2023-09-25 14:14:50 +01:00
1 parent 13436ccedd
commit cef5e06f0b
3 files changed
+24 -9

No files matched your search

@@ -19,14 +19,19 @@ data class RegistrationArgs(
val packedACO: ByteArray,
val extraData: ByteArray? = null
) {
@Suppress("unused")
inline fun <reified T>toSuccess(loginToken: ByteArray, extraData: T): AuthenticationResult.Success {
return AuthenticationResult.Success(
loginName, loginToken, BossEncoder.encode(extraData)
)
}
inline fun <reified T>decodeOrNull(): T? = extraData?.let { it.decodeBoss<T>() }
inline fun <reified T: Any>decodeOrThrow(): T = extraData?.let { it.decodeBoss<T>() }
@Suppress("unused")
inline fun <reified T>decodeOrNull(): T? = extraData?.decodeBoss<T>()
@Suppress("unused")
inline fun <reified T: Any>decodeOrThrow(): T = extraData?.decodeBoss<T>()
?: throw IllegalArgumentException("missing require extra data of type ${T::class.simpleName}")
}
@@ -44,6 +49,11 @@ sealed class AuthenticationResult {
@SerialName("LoginUnavailable")
object LoginUnavailable: AuthenticationResult()
@Serializable
@SerialName("OtherError")
class OtherError(val reason: String,val packedData: ByteArray?=null): AuthenticationResult()
@Serializable
@SerialName("LoginIdUnavailable")
object LoginIdUnavailable: AuthenticationResult()
@@ -34,6 +34,7 @@ class Registration(
val pbkdfRounds: Int = 15000,
) : LogTag("SLREG") {
@Suppress("unused")
sealed class Result {
/**
* Login is already in use or is somehow else invalid
@@ -53,6 +54,8 @@ class Registration(
val encodedData: ByteArray?) : Result() {
inline fun <reified D>data() = encodedData?.let { BossDecoder.decodeFrom<D>(it)}
}
class OtherError(val code: String,val packedData: ByteArray?=null): Result()
}
private var lastPasswordHash: ByteArray? = null
@@ -90,7 +93,7 @@ class Registration(
val nonce = adapter.invokeCommand(api.slGetNonce)
val loginPrivateKey = deferredLoginKey.await()
val spl = SuperloginRestoreAccessPayload(login, loginPrivateKey, dataKey)
repeat(10) {
repeat(3) {
val (restoreKey, restoreData) = AccessControlObject.pack(passwordKeys!!.loginAccessKey, spl)
try {
val packedArgs = SignedRecord.pack(
@@ -122,6 +125,8 @@ class Registration(
AuthenticationResult.LoginUnavailable -> return Result.InvalidLogin
is AuthenticationResult.OtherError -> return Result.OtherError(result.reason, result.packedData)
is AuthenticationResult.Success -> {
return Result.Success(
restoreKey.secret,