support for extra reasons of registration failure

This commit is contained in:
Sergey Chernov 2023-09-25 14:14:32 +01:00
parent 13436ccedd
commit cef5e06f0b
3 changed files with 24 additions and 9 deletions

View File

@ -9,7 +9,7 @@ val logback_version="1.2.10"
group = "net.sergeych"
version = "0.2.4"
version = "0.2.6-SNAPSHOT"
repositories {
mavenCentral()
@ -24,9 +24,9 @@ repositories {
kotlin {
jvm {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
// compilations.all {
// kotlinOptions.jvmTarget = "1.8"
// }
withJava()
testRuns["test"].executionTask.configure {
useJUnitPlatform()
@ -51,8 +51,8 @@ kotlin {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3")
api("net.sergeych:unikrypto:1.2.2-SNAPSHOT")
api("net.sergeych:parsec3:0.4.5")
// api("net.sergeych:unikrypto:1.2.2-SNAPSHOT")
api("net.sergeych:parsec3:0.4.6")
api("net.sergeych:unikrypto:1.2.5")
}
}

View File

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

View File

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