support for extra reasons of registration failure
This commit is contained in:
parent
13436ccedd
commit
cef5e06f0b
@ -9,7 +9,7 @@ val logback_version="1.2.10"
|
|||||||
|
|
||||||
|
|
||||||
group = "net.sergeych"
|
group = "net.sergeych"
|
||||||
version = "0.2.4"
|
version = "0.2.6-SNAPSHOT"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@ -24,9 +24,9 @@ repositories {
|
|||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
jvm {
|
jvm {
|
||||||
compilations.all {
|
// compilations.all {
|
||||||
kotlinOptions.jvmTarget = "1.8"
|
// kotlinOptions.jvmTarget = "1.8"
|
||||||
}
|
// }
|
||||||
withJava()
|
withJava()
|
||||||
testRuns["test"].executionTask.configure {
|
testRuns["test"].executionTask.configure {
|
||||||
useJUnitPlatform()
|
useJUnitPlatform()
|
||||||
@ -51,8 +51,8 @@ kotlin {
|
|||||||
val commonMain by getting {
|
val commonMain by getting {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3")
|
||||||
api("net.sergeych:unikrypto:1.2.2-SNAPSHOT")
|
// api("net.sergeych:unikrypto:1.2.2-SNAPSHOT")
|
||||||
api("net.sergeych:parsec3:0.4.5")
|
api("net.sergeych:parsec3:0.4.6")
|
||||||
api("net.sergeych:unikrypto:1.2.5")
|
api("net.sergeych:unikrypto:1.2.5")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,14 +19,19 @@ data class RegistrationArgs(
|
|||||||
val packedACO: ByteArray,
|
val packedACO: ByteArray,
|
||||||
val extraData: ByteArray? = null
|
val extraData: ByteArray? = null
|
||||||
) {
|
) {
|
||||||
|
@Suppress("unused")
|
||||||
|
|
||||||
inline fun <reified T>toSuccess(loginToken: ByteArray, extraData: T): AuthenticationResult.Success {
|
inline fun <reified T>toSuccess(loginToken: ByteArray, extraData: T): AuthenticationResult.Success {
|
||||||
return AuthenticationResult.Success(
|
return AuthenticationResult.Success(
|
||||||
loginName, loginToken, BossEncoder.encode(extraData)
|
loginName, loginToken, BossEncoder.encode(extraData)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified T>decodeOrNull(): T? = extraData?.let { it.decodeBoss<T>() }
|
@Suppress("unused")
|
||||||
inline fun <reified T: Any>decodeOrThrow(): T = extraData?.let { it.decodeBoss<T>() }
|
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}")
|
?: throw IllegalArgumentException("missing require extra data of type ${T::class.simpleName}")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +49,11 @@ sealed class AuthenticationResult {
|
|||||||
@SerialName("LoginUnavailable")
|
@SerialName("LoginUnavailable")
|
||||||
object LoginUnavailable: AuthenticationResult()
|
object LoginUnavailable: AuthenticationResult()
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
@SerialName("OtherError")
|
||||||
|
class OtherError(val reason: String,val packedData: ByteArray?=null): AuthenticationResult()
|
||||||
|
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@SerialName("LoginIdUnavailable")
|
@SerialName("LoginIdUnavailable")
|
||||||
object LoginIdUnavailable: AuthenticationResult()
|
object LoginIdUnavailable: AuthenticationResult()
|
||||||
|
@ -34,6 +34,7 @@ class Registration(
|
|||||||
val pbkdfRounds: Int = 15000,
|
val pbkdfRounds: Int = 15000,
|
||||||
) : LogTag("SLREG") {
|
) : LogTag("SLREG") {
|
||||||
|
|
||||||
|
@Suppress("unused")
|
||||||
sealed class Result {
|
sealed class Result {
|
||||||
/**
|
/**
|
||||||
* Login is already in use or is somehow else invalid
|
* Login is already in use or is somehow else invalid
|
||||||
@ -53,6 +54,8 @@ class Registration(
|
|||||||
val encodedData: ByteArray?) : Result() {
|
val encodedData: ByteArray?) : Result() {
|
||||||
inline fun <reified D>data() = encodedData?.let { BossDecoder.decodeFrom<D>(it)}
|
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
|
private var lastPasswordHash: ByteArray? = null
|
||||||
@ -90,7 +93,7 @@ class Registration(
|
|||||||
val nonce = adapter.invokeCommand(api.slGetNonce)
|
val nonce = adapter.invokeCommand(api.slGetNonce)
|
||||||
val loginPrivateKey = deferredLoginKey.await()
|
val loginPrivateKey = deferredLoginKey.await()
|
||||||
val spl = SuperloginRestoreAccessPayload(login, loginPrivateKey, dataKey)
|
val spl = SuperloginRestoreAccessPayload(login, loginPrivateKey, dataKey)
|
||||||
repeat(10) {
|
repeat(3) {
|
||||||
val (restoreKey, restoreData) = AccessControlObject.pack(passwordKeys!!.loginAccessKey, spl)
|
val (restoreKey, restoreData) = AccessControlObject.pack(passwordKeys!!.loginAccessKey, spl)
|
||||||
try {
|
try {
|
||||||
val packedArgs = SignedRecord.pack(
|
val packedArgs = SignedRecord.pack(
|
||||||
@ -122,6 +125,8 @@ class Registration(
|
|||||||
|
|
||||||
AuthenticationResult.LoginUnavailable -> return Result.InvalidLogin
|
AuthenticationResult.LoginUnavailable -> return Result.InvalidLogin
|
||||||
|
|
||||||
|
is AuthenticationResult.OtherError -> return Result.OtherError(result.reason, result.packedData)
|
||||||
|
|
||||||
is AuthenticationResult.Success -> {
|
is AuthenticationResult.Success -> {
|
||||||
return Result.Success(
|
return Result.Success(
|
||||||
restoreKey.secret,
|
restoreKey.secret,
|
||||||
|
Loading…
Reference in New Issue
Block a user