From e2155e2e17ca89eabc3414a7dac0be5bc19a2450 Mon Sep 17 00:00:00 2001 From: Babis Routis <127745316+babisRoutis@users.noreply.github.com> Date: Mon, 22 Apr 2024 11:37:47 +0300 Subject: [PATCH] Made credential_identifiers optional (inside an authorization_details) (#199) --- .../eudi/openid4vci/internal/Serialization.kt | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/eu/europa/ec/eudi/openid4vci/internal/Serialization.kt b/src/main/kotlin/eu/europa/ec/eudi/openid4vci/internal/Serialization.kt index a105c882..cec61b3d 100644 --- a/src/main/kotlin/eu/europa/ec/eudi/openid4vci/internal/Serialization.kt +++ b/src/main/kotlin/eu/europa/ec/eudi/openid4vci/internal/Serialization.kt @@ -127,36 +127,49 @@ internal object ClaimSetSerializer : KSerializer { } @OptIn(ExperimentalSerializationApi::class) -internal object GrantedAuthorizationDetailsSerializer : KSerializer>> { +internal object GrantedAuthorizationDetailsSerializer : + KSerializer>> { + + private const val OPENID_CREDENTIAL: String = "openid_credential" @Serializable data class AuthorizationDetailJson( - @SerialName("type") val type: String, + @SerialName("type") @Required val type: String, @SerialName("format") val format: String? = null, @SerialName("credential_configuration_id") val credentialConfigurationId: String, - @SerialName("credential_identifiers") val credentialIdentifiers: List, - ) + @SerialName("credential_identifiers") val credentialIdentifiers: List = emptyList(), + ) { + init { + require(type == OPENID_CREDENTIAL) { "type must be $OPENID_CREDENTIAL" } + } + } + private fun authDetails( + credentialConfigurationId: CredentialConfigurationIdentifier, + credentialIdentifiers: List, + ): AuthorizationDetailJson = + AuthorizationDetailJson( + type = OPENID_CREDENTIAL, + credentialConfigurationId = credentialConfigurationId.value, + credentialIdentifiers = credentialIdentifiers.map(CredentialIdentifier::value), + ) private val internal = serializer>() override val descriptor: SerialDescriptor = SerialDescriptor("GrantedAuthorizationDetails", internal.descriptor) override fun deserialize(decoder: Decoder): Map> { val deserialized = internal.deserialize(decoder) - return deserialized.map { - CredentialConfigurationIdentifier(it.credentialConfigurationId) to it.credentialIdentifiers.map { CredentialIdentifier(it) } - }.toMap() + return deserialized.associate { authDetails -> + val credentialConfigurationId = CredentialConfigurationIdentifier(authDetails.credentialConfigurationId) + val credentialIdentifiers = authDetails.credentialIdentifiers.map { CredentialIdentifier(it) } + credentialConfigurationId to credentialIdentifiers + } } - override fun serialize(encoder: Encoder, value: Map>) { - internal.serialize( - encoder, - value.entries.map { - AuthorizationDetailJson( - type = "openid_credential", - credentialConfigurationId = it.key.value, - credentialIdentifiers = it.value.map(CredentialIdentifier::value), - ) - }, - ) + override fun serialize( + encoder: Encoder, + value: Map>, + ) { + val authorizationDetailsList = value.entries.map { (cfgId, credIds) -> authDetails(cfgId, credIds) } + internal.serialize(encoder, authorizationDetailsList) } }