package net.sergeych.superlogin import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import net.sergeych.boss_serialization_mp.BossEncoder import net.sergeych.boss_serialization_mp.decodeBoss import net.sergeych.parsec3.CommandHost import net.sergeych.parsec3.WithAdapter import net.sergeych.unikrypto.PublicKey @Serializable data class RegistrationArgs( val loginName: String, val loginId: ByteArray, val loginPublicKey: PublicKey, val derivationParams: PasswordDerivationParams, val restoreId: ByteArray, val packedACO: ByteArray, val extraData: ByteArray? = null ) { inline fun toSuccess(loginToken: ByteArray, extraData: T): AuthenticationResult.Success { return AuthenticationResult.Success( loginName, loginToken, BossEncoder.encode(extraData) ) } inline fun decodeOrNull(): T? = extraData?.let { it.decodeBoss() } inline fun decodeOrThrow(): T = extraData?.let { it.decodeBoss() } ?: throw IllegalArgumentException("missing require extra data of type ${T::class.simpleName}") } @Serializable sealed class AuthenticationResult { @Serializable @SerialName("Success") data class Success( val loginName: String, val loginToken: ByteArray, val applicationData: ByteArray?, ): AuthenticationResult() @Serializable @SerialName("LoginUnavailable") object LoginUnavailable: AuthenticationResult() @Serializable @SerialName("LoginIdUnavailable") object LoginIdUnavailable: AuthenticationResult() @Serializable @SerialName("RestoreIdUnavailable") object RestoreIdUnavailable: AuthenticationResult() } @Serializable class RequestACOByLoginNameArgs( val loginName: String, val loginId: ByteArray, ) @Serializable class RequestACOResult( val packedACO: ByteArray, val nonce: ByteArray ) @Serializable class LoginByPasswordPayload( val loginName: String ) @Serializable class ChangePasswordArgs( val loginName: String, val packedSignedRecord: ByteArray, ) @Serializable class ChangePasswordPayload( val packedACO: ByteArray, val passwordDerivationParams: PasswordDerivationParams, val newLoginKey: PublicKey, val newLoginId: ByteArray ) class SuperloginServerApi : CommandHost() { val slGetNonce by command() val slRegister by command() val slLogout by command() val slLoginByToken by command() val slRequestDerivationParams by command() val slRequestACOByLoginName by command() val slLoginByKey by command() val slRequestACOBySecretId by command() val slChangePasswordAndLogin by command () val slSendTestException by command() }