From 24d67dd956623ceea37eec32f9545d83d8c6b8b3 Mon Sep 17 00:00:00 2001 From: Michael Avoyan <64565419+michaelavoyan@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:36:59 +0300 Subject: [PATCH] align to ios structure, v2.6.0 --- .../VCLCredentialManifestDescriptor.kt | 112 +++++++++++------- ...LCredentialManifestDescriptorByDeepLink.kt | 33 +++--- ...CLCredentialManifestDescriptorByService.kt | 46 +++---- .../VCLCredentialManifestDescriptorRefresh.kt | 44 ++++--- .../entities/VCLIdentificationSubmission.kt | 42 +++++-- .../velocitycareerlabs/api/entities/VCLJwt.kt | 20 +--- .../api/entities/VCLOrganization.kt | 8 +- .../VCLPresentationRequestDescriptor.kt | 2 +- .../api/entities/VCLPresentationSubmission.kt | 47 +++++--- .../api/entities/VCLPublicJwk.kt | 22 ++-- .../api/entities/VCLService.kt | 3 + .../VCLServiceCredentialAgentIssuer.kt | 21 ---- .../api/entities/VCLServiceTypes.kt | 9 +- .../api/entities/VCLSubmission.kt | 112 +++++++++--------- .../api/entities/error/VCLError.kt | 73 +++++------- ...edentialManifestDescriptorByServiceTest.kt | 46 +++---- ...CredentialManifestDescriptorRefreshTest.kt | 13 +- .../entities/VCLSubmissionTest.kt | 19 +-- .../main/java/com/vcl/wallet/MainActivity.kt | 2 +- 19 files changed, 353 insertions(+), 321 deletions(-) delete mode 100644 VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceCredentialAgentIssuer.kt diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptor.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptor.kt index cb8e4778..6f5c861e 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptor.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptor.kt @@ -11,50 +11,76 @@ import io.velocitycareerlabs.impl.extensions.appendQueryParams import io.velocitycareerlabs.impl.extensions.encode import io.velocitycareerlabs.impl.extensions.getUrlSubPath -abstract class VCLCredentialManifestDescriptor( - val uri: String? = null, - val issuingType: VCLIssuingType = VCLIssuingType.Career, - val credentialTypes: List? = null, - val pushDelegate: VCLPushDelegate? = null, - val vendorOriginContext: String? = null, - val deepLink: VCLDeepLink? = null, - val didJwk: VCLDidJwk, - val remoteCryptoServicesToken: VCLToken? = null -) { - open val endpoint = generateQueryParams()?.let { queryParams -> - uri?.appendQueryParams(queryParams) - } ?: uri - - val did = uri?.getUrlSubPath(KeyDidPrefix) - - private fun generateQueryParams(): String? { - val pCredentialTypes = credentialTypes?.let { credTypes -> - credTypes.map { it.encode() }.joinToString(separator = "&") { "$KeyCredentialTypes=$it" } } - val pPushDelegate = pushDelegate?.let { - "$KeyPushDelegatePushUrl=${it.pushUrl.encode()}&" + "$KeyPushDelegatePushToken=${it.pushToken}" +interface VCLCredentialManifestDescriptor { + val uri: String? + val issuingType: VCLIssuingType + val credentialTypes: List? + val pushDelegate: VCLPushDelegate? + val did: String? + val vendorOriginContext: String? + val deepLink: VCLDeepLink? + val didJwk: VCLDidJwk + val remoteCryptoServicesToken: VCLToken? + + val endpoint: String? + + fun retrieveDid(): String? { + return uri?.getUrlSubPath(CredentialManifestDescriptorCodingKeys.KeyDidPrefix) + } + + fun retrieveEndpoint(): String? { + return generateQueryParams()?.let { queryParams -> + uri?.appendQueryParams(queryParams) + } ?: uri + } + + fun generateQueryParams(): String? { + val pCredentialTypes: String? = credentialTypes?.joinToString("&") { type -> + "${CredentialManifestDescriptorCodingKeys.KeyCredentialTypes}=${type.encode() ?: ""}" + } + val pPushDelegate: String? = pushDelegate?.pushUrl?.let { + "${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushUrl}=${it.encode() ?: ""}" + } + val pPushToken: String? = pushDelegate?.pushToken?.let { + "${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushToken}=${it.encode() ?: ""}" } - val qParams = listOfNotNull(pCredentialTypes, pPushDelegate).filter { it.isNotBlank() } - return if(qParams.isNotEmpty()) qParams.joinToString("&") else null + + val qParams = + listOfNotNull(pCredentialTypes, pPushDelegate, pPushToken).filter { it.isNotEmpty() } + return if (qParams.isEmpty()) null else qParams.joinToString("&") } - open fun toPropsString() = - StringBuilder() - .append("\nuri: , $uri") - .append("\ndid: , $did") - .append("\nissuingType: , $issuingType") - .append("\ncredentialTypes: , $credentialTypes") - .append("\npushDelegate: , ${pushDelegate?.toPropsString()}") - .append("\nvendorOriginContext: , $vendorOriginContext") - .toString() - - companion object CodingKeys { - const val KeyId = "id" - const val KeyDidPrefix = "did:" - const val KeyCredentialTypes = "credential_types" - const val KeyPushDelegatePushUrl = "push_delegate.push_url" - const val KeyPushDelegatePushToken = "push_delegate.push_token" - - const val KeyCredentialId = "credentialId" - const val KeyRefresh = "refresh" +//private fun generateQueryParams(): String? { +// val pCredentialTypes = credentialTypes?.let { credTypes -> +// credTypes.map { it.encode() }.joinToString(separator = "&") { "$KeyCredentialTypes=$it" } } +// val pPushDelegate = pushDelegate?.let { +// "$KeyPushDelegatePushUrl=${it.pushUrl.encode()}&" + "$KeyPushDelegatePushToken=${it.pushToken}" +// } +// val qParams = listOfNotNull(pCredentialTypes, pPushDelegate).filter { it.isNotBlank() } +// return if(qParams.isNotEmpty()) qParams.joinToString("&") else null +//} + + fun toPropsString(): String { + return buildString { + appendLine("uri: ${uri.orEmpty()}") + appendLine("did: ${did.orEmpty()}") + appendLine("issuingType: $issuingType") + appendLine("credentialTypes: ${credentialTypes?.joinToString()}") + appendLine("pushDelegate: ${pushDelegate?.toPropsString().orEmpty()}") + appendLine("vendorOriginContext: ${vendorOriginContext.orEmpty()}") + } } -} \ No newline at end of file +} + +object CredentialManifestDescriptorCodingKeys { + const val KeyDidPrefix = "did:" + const val KeyCredentialTypes = "credential_types" + const val KeyPushDelegatePushUrl = "push_delegate.push_url" + const val KeyPushDelegatePushToken = "push_delegate.push_token" + + const val KeyCredentialId = "credentialId" + const val KeyRefresh = "refresh" +} + + + diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByDeepLink.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByDeepLink.kt index b1a2c646..e8b33ada 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByDeepLink.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByDeepLink.kt @@ -7,18 +7,21 @@ package io.velocitycareerlabs.api.entities -class VCLCredentialManifestDescriptorByDeepLink( - deepLink: VCLDeepLink, - issuingType: VCLIssuingType = VCLIssuingType.Career, - pushDelegate: VCLPushDelegate? = null, - didJwk: VCLDidJwk, - remoteCryptoServicesToken: VCLToken? = null -): VCLCredentialManifestDescriptor( - uri = deepLink.requestUri, - issuingType = issuingType, - pushDelegate = pushDelegate, - vendorOriginContext = deepLink.vendorOriginContext, - deepLink = deepLink, - didJwk = didJwk, - remoteCryptoServicesToken = remoteCryptoServicesToken -) \ No newline at end of file +data class VCLCredentialManifestDescriptorByDeepLink( + override val deepLink: VCLDeepLink, + override val issuingType: VCLIssuingType = VCLIssuingType.Career, + override val pushDelegate: VCLPushDelegate? = null, + override val didJwk: VCLDidJwk, + override val remoteCryptoServicesToken: VCLToken? = null +) : VCLCredentialManifestDescriptor { + + override val uri: String? = deepLink.requestUri + override val credentialTypes: List? = null + override val vendorOriginContext: String? = deepLink.vendorOriginContext + + override val did: String? + get() = retrieveDid() + + override val endpoint: String? + get() = retrieveEndpoint() +} diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByService.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByService.kt index 75590bae..461d6288 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByService.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorByService.kt @@ -11,23 +11,29 @@ import io.velocitycareerlabs.impl.extensions.appendQueryParams import io.velocitycareerlabs.impl.extensions.encode import java.lang.StringBuilder -class VCLCredentialManifestDescriptorByService( - val service: VCLService, // for log - issuingType: VCLIssuingType = VCLIssuingType.Career, - credentialTypes: List? = null, - pushDelegate: VCLPushDelegate? = null, - didJwk: VCLDidJwk, - remoteCryptoServicesToken: VCLToken? = null -): VCLCredentialManifestDescriptor( - uri = service.serviceEndpoint, - issuingType = issuingType, - credentialTypes = credentialTypes, - pushDelegate = pushDelegate, - didJwk = didJwk, - remoteCryptoServicesToken = remoteCryptoServicesToken -) { - override fun toPropsString() = - StringBuilder(super.toPropsString()) - .append("\nservice: ${service.toPropsString()}") - .toString() -} \ No newline at end of file +data class VCLCredentialManifestDescriptorByService( + private val service: VCLService, + override var issuingType: VCLIssuingType = VCLIssuingType.Career, + override var credentialTypes: List? = null, + override var pushDelegate: VCLPushDelegate? = null, + override var didJwk: VCLDidJwk, + override var remoteCryptoServicesToken: VCLToken? = null +) : VCLCredentialManifestDescriptor { + + override var uri: String? = service.serviceEndpoint + override var vendorOriginContext: String? = null + override var deepLink: VCLDeepLink? = null + + override val did: String? + get() = retrieveDid() + + override val endpoint: String? + get() = retrieveEndpoint() + + override fun toPropsString(): String { + return buildString { + appendLine(super.toPropsString()) + appendLine("service: ${service.toPropsString()}") + } + } +} diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorRefresh.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorRefresh.kt index 855e8817..d9234b7f 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorRefresh.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLCredentialManifestDescriptorRefresh.kt @@ -7,28 +7,38 @@ package io.velocitycareerlabs.api.entities +import io.velocitycareerlabs.api.entities.CredentialManifestDescriptorCodingKeys.KeyCredentialId +import io.velocitycareerlabs.api.entities.CredentialManifestDescriptorCodingKeys.KeyRefresh import io.velocitycareerlabs.impl.extensions.encode import java.net.URI -class VCLCredentialManifestDescriptorRefresh( - service: VCLService, +data class VCLCredentialManifestDescriptorRefresh( val credentialIds: List, - didJwk: VCLDidJwk, - remoteCryptoServicesToken: VCLToken? = null -): VCLCredentialManifestDescriptor( - uri = service.serviceEndpoint, - issuingType = VCLIssuingType.Refresh, - didJwk = didJwk, - remoteCryptoServicesToken = remoteCryptoServicesToken -) { - override val endpoint = generateQueryParams()?.let { queryParams -> - val originUri = URI(uri) - val allQueryParams = - (originUri.query?.let { "&" } ?: "?") + "${KeyRefresh}=${true}&$queryParams" - uri + allQueryParams - } ?: "$uri?${KeyRefresh}=${true}" + private val service: VCLService, // for log + override val issuingType: VCLIssuingType = VCLIssuingType.Refresh, + override val didJwk: VCLDidJwk, + override val remoteCryptoServicesToken: VCLToken? = null, + override val uri: String = service.serviceEndpoint, + override val credentialTypes: List? = null, + override val pushDelegate: VCLPushDelegate? = null, + override val vendorOriginContext: String? = null, + override val deepLink: VCLDeepLink? = null +) : VCLCredentialManifestDescriptor { - private fun generateQueryParams(): String? { + override val did: String? + get() = retrieveDid() + + override val endpoint = retrieveEndpoint() + + override fun retrieveEndpoint() = + generateQueryParams()?.let { queryParams -> + val originUri = URI(uri) + val allQueryParams = + (originUri.query?.let { "&" } ?: "?") + "${KeyRefresh}=${true}&$queryParams" + uri + allQueryParams + } ?: "$uri?${KeyRefresh}=${true}" + + override fun generateQueryParams(): String? { val pCredentialIds = credentialIds.map { it.encode() }.joinToString(separator = "&") { "$KeyCredentialId=$it" } diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLIdentificationSubmission.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLIdentificationSubmission.kt index d477db43..9f8336d5 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLIdentificationSubmission.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLIdentificationSubmission.kt @@ -7,15 +7,33 @@ package io.velocitycareerlabs.api.entities -class VCLIdentificationSubmission( - credentialManifest: VCLCredentialManifest, - verifiableCredentials: List? = null -) : VCLSubmission( - submitUri = credentialManifest.submitPresentationUri, - exchangeId = credentialManifest.exchangeId, - presentationDefinitionId = credentialManifest.presentationDefinitionId, - verifiableCredentials = verifiableCredentials, - vendorOriginContext = credentialManifest.vendorOriginContext, - didJwk = credentialManifest.didJwk, - remoteCryptoServicesToken = credentialManifest.remoteCryptoServicesToken -) \ No newline at end of file +import java.util.UUID + +data class VCLIdentificationSubmission( + override val submitUri: String, + override val exchangeId: String, + override val presentationDefinitionId: String, + override val verifiableCredentials: List?, + override val pushDelegate: VCLPushDelegate?, + override val vendorOriginContext: String?, + override val didJwk: VCLDidJwk, + override val remoteCryptoServicesToken: VCLToken? +) : VCLSubmission { + + override val jti: String = UUID.randomUUID().toString() + override val submissionId: String = UUID.randomUUID().toString() + + constructor( + credentialManifest: VCLCredentialManifest, + verifiableCredentials: List? = null + ) : this( + submitUri = credentialManifest.submitPresentationUri, + exchangeId = credentialManifest.exchangeId, + presentationDefinitionId = credentialManifest.presentationDefinitionId, + verifiableCredentials = verifiableCredentials, + vendorOriginContext = credentialManifest.vendorOriginContext, + didJwk = credentialManifest.didJwk, + remoteCryptoServicesToken = credentialManifest.remoteCryptoServicesToken, + pushDelegate = null + ) +} diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLJwt.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLJwt.kt index 9fc202d1..d0c5c6ef 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLJwt.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLJwt.kt @@ -14,25 +14,17 @@ import com.nimbusds.jwt.SignedJWT import io.velocitycareerlabs.impl.utils.VCLLog import java.lang.Exception -class VCLJwt { +data class VCLJwt( internal var signedJwt: SignedJWT? = null - - constructor(signedJwt: SignedJWT) { - this.signedJwt = signedJwt - } - - constructor(encodedJwt: String) { +) { + constructor(encodedJwt: String) : this( try { - val encodedJwtArr = encodedJwt.split(".") - this.signedJwt = SignedJWT( - Base64URL(if (encodedJwtArr.isNotEmpty()) encodedJwtArr.component1() else ""), - Base64URL(if (encodedJwtArr.size >= 2) encodedJwtArr.component2() else ""), - Base64URL(if (encodedJwtArr.size >= 3) encodedJwtArr.component3() else "") - ) + SignedJWT.parse(encodedJwt) } catch (ex: Exception) { VCLLog.e("", ex.toString()) + null } - } + ) val header: JWSHeader? get() = signedJwt?.header val payload: Payload? get() = signedJwt?.payload diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLOrganization.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLOrganization.kt index 848db9b5..e0bca19a 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLOrganization.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLOrganization.kt @@ -15,16 +15,16 @@ data class VCLOrganization(val payload: JSONObject) { val TAG = VCLOrganization::class.simpleName - val serviceCredentialAgentIssuers: List + val serviceCredentialAgentIssuers: List get() = parseServiceCredentialAgentIssuers() - private fun parseServiceCredentialAgentIssuers(): List { - val retVal = mutableListOf() + private fun parseServiceCredentialAgentIssuers(): List { + val retVal = mutableListOf() try { payload.optJSONArray(CodingKeys.KeyService)?.let { serviceJsonArr -> for (i in 0 until serviceJsonArr.length()) { serviceJsonArr.optJSONObject(i) - ?.let { retVal.add(VCLServiceCredentialAgentIssuer(it)) } + ?.let { retVal.add(VCLService(it)) } } } } catch (ex: Exception) { diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationRequestDescriptor.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationRequestDescriptor.kt index 00f479b5..a59d2846 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationRequestDescriptor.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationRequestDescriptor.kt @@ -11,7 +11,7 @@ import io.velocitycareerlabs.impl.extensions.appendQueryParams import io.velocitycareerlabs.impl.extensions.encode import java.net.URI -class VCLPresentationRequestDescriptor( +data class VCLPresentationRequestDescriptor( val deepLink: VCLDeepLink, val pushDelegate: VCLPushDelegate? = null, val didJwk: VCLDidJwk, diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationSubmission.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationSubmission.kt index 428e795e..da03294f 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationSubmission.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPresentationSubmission.kt @@ -7,18 +7,35 @@ package io.velocitycareerlabs.api.entities -class VCLPresentationSubmission( - presentationRequest: VCLPresentationRequest, - verifiableCredentials: List -) : VCLSubmission( - submitUri = presentationRequest.submitPresentationUri, - exchangeId = presentationRequest.exchangeId, - presentationDefinitionId = presentationRequest.presentationDefinitionId, - verifiableCredentials = verifiableCredentials, - pushDelegate = presentationRequest.pushDelegate, - vendorOriginContext = presentationRequest.vendorOriginContext, - didJwk = presentationRequest.didJwk, - remoteCryptoServicesToken = presentationRequest.remoteCryptoServicesToken -) { - val progressUri = presentationRequest.progressUri -} \ No newline at end of file +import java.util.UUID + +data class VCLPresentationSubmission( + override val submitUri: String, + override val exchangeId: String, + override val presentationDefinitionId: String, + override val verifiableCredentials: List?, + override val pushDelegate: VCLPushDelegate?, + override val vendorOriginContext: String?, + override val didJwk: VCLDidJwk, + override val remoteCryptoServicesToken: VCLToken?, + val progressUri: String +) : VCLSubmission { + + override val jti: String = UUID.randomUUID().toString() + override val submissionId: String = UUID.randomUUID().toString() + + constructor( + presentationRequest: VCLPresentationRequest, + verifiableCredentials: List + ) : this( + submitUri = presentationRequest.submitPresentationUri, + exchangeId = presentationRequest.exchangeId, + presentationDefinitionId = presentationRequest.presentationDefinitionId, + verifiableCredentials = verifiableCredentials, + pushDelegate = presentationRequest.pushDelegate, + vendorOriginContext = presentationRequest.vendorOriginContext, + didJwk = presentationRequest.didJwk, + remoteCryptoServicesToken = presentationRequest.remoteCryptoServicesToken, + progressUri = presentationRequest.progressUri + ) +} diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPublicJwk.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPublicJwk.kt index b0ad8c3b..3d5565fc 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPublicJwk.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLPublicJwk.kt @@ -10,19 +10,19 @@ package io.velocitycareerlabs.api.entities import io.velocitycareerlabs.impl.extensions.toJsonObject import org.json.JSONObject -class VCLPublicJwk { - val valueStr: String +data class VCLPublicJwk( + val valueStr: String, val valueJson: JSONObject +) { + constructor(valueStr: String) : this( + valueStr = valueStr, + valueJson = valueStr.toJsonObject() ?: JSONObject("{}") + ) - constructor(valueStr: String) { - this.valueStr = valueStr - this.valueJson = this.valueStr.toJsonObject() ?: JSONObject("{}") - } - - constructor(valueJson: JSONObject) { - this.valueJson = valueJson - this.valueStr = this.valueJson.toString() - } + constructor(valueJson: JSONObject) : this( + valueStr = valueJson.toString(), + valueJson = valueJson + ) val curve: String get() = valueJson.optString("crv") diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLService.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLService.kt index 4dcbd00a..32ad6fce 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLService.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLService.kt @@ -7,12 +7,14 @@ package io.velocitycareerlabs.api.entities +import io.velocitycareerlabs.impl.extensions.toList import org.json.JSONObject open class VCLService(val payload: JSONObject) { val id: String = payload.optString(VCLService.KeyId) val type: String = payload.optString(VCLService.KeyType) val serviceEndpoint: String = payload.optString(VCLService.KeyServiceEndpoint) + val credentialTypes: List? = payload.optJSONArray(VCLService.KeyCredentialTypes)?.toList() as? List open fun toPropsString() = StringBuilder() @@ -20,6 +22,7 @@ open class VCLService(val payload: JSONObject) { .append("\nid: $id") .append("\ntype: $type") .append("\nserviceEndpoint: $serviceEndpoint") + .append("\ncredentialTypes: $credentialTypes") .toString() companion object CodingKeys { diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceCredentialAgentIssuer.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceCredentialAgentIssuer.kt deleted file mode 100644 index 024a54e4..00000000 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceCredentialAgentIssuer.kt +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Created by Michael Avoyan on 3/11/21. - * - * Copyright 2022 Velocity Career Labs inc. - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.velocitycareerlabs.api.entities - -import io.velocitycareerlabs.impl.extensions.toList -import org.json.JSONObject -import java.lang.StringBuilder - -class VCLServiceCredentialAgentIssuer(payload: JSONObject): VCLService(payload) { - val credentialTypes: List? = payload.optJSONArray(VCLService.KeyCredentialTypes)?.toList() as? List - - override fun toPropsString() = - StringBuilder(super.toPropsString()) - .append("\ncredentialTypes: $credentialTypes") - .toString() -} \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypes.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypes.kt index 459ed747..ab734dd8 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypes.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypes.kt @@ -7,14 +7,9 @@ package io.velocitycareerlabs.api.entities -class VCLServiceTypes { - +data class VCLServiceTypes( val all: List - - constructor(all: List) { - this.all = all - } - +) { constructor(serviceType: VCLServiceType): this(listOf(serviceType)) constructor(issuingType: VCLIssuingType) : this( diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLSubmission.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLSubmission.kt index 41e34be2..4ee276d0 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLSubmission.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLSubmission.kt @@ -10,75 +10,69 @@ package io.velocitycareerlabs.api.entities import io.velocitycareerlabs.impl.extensions.toJsonArray import org.json.JSONArray import org.json.JSONObject -import java.util.* -abstract class VCLSubmission( - val submitUri: String, - val exchangeId: String, - val presentationDefinitionId: String, - val verifiableCredentials: List? = null, - val pushDelegate: VCLPushDelegate? = null, - val vendorOriginContext: String? = null, - val didJwk: VCLDidJwk, - val remoteCryptoServicesToken: VCLToken? = null -) { - val jti = UUID.randomUUID().toString() - val submissionId = UUID.randomUUID().toString() +interface VCLSubmission { + val submitUri: String + val exchangeId: String + val presentationDefinitionId: String + val verifiableCredentials: List? + val pushDelegate: VCLPushDelegate? + val vendorOriginContext: String? + val didJwk: VCLDidJwk + val remoteCryptoServicesToken: VCLToken? + val jti: String + val submissionId: String - internal fun generatePayload(iss: String?): JSONObject { + fun generatePayload(iss: String?): JSONObject { val retVal = JSONObject() - retVal.putOpt(VCLSubmission.KeyJti, jti) - .putOpt(VCLSubmission.KeyIss, iss) + retVal.putOpt(SubmissionCodingKeys.KeyJti, jti) + .putOpt(SubmissionCodingKeys.KeyIss, iss) val vp = JSONObject() .putOpt( - VCLSubmission.KeyType, - VCLSubmission.ValueVerifiablePresentation + SubmissionCodingKeys.KeyType, + SubmissionCodingKeys.ValueVerifiablePresentation ) - .putOpt(VCLSubmission.KeyPresentationSubmission, JSONObject() - .putOpt(VCLSubmission.KeyId, submissionId) - .putOpt(VCLSubmission.KeyDefinitionId, presentationDefinitionId) - .putOpt(VCLSubmission.KeyDescriptorMap, JSONArray(verifiableCredentials?.mapIndexed { index, credential -> + .putOpt(SubmissionCodingKeys.KeyPresentationSubmission, JSONObject() + .putOpt(SubmissionCodingKeys.KeyId, submissionId) + .putOpt(SubmissionCodingKeys.KeyDefinitionId, presentationDefinitionId) + .putOpt(SubmissionCodingKeys.KeyDescriptorMap, JSONArray(verifiableCredentials?.mapIndexed { index, credential -> JSONObject() - .putOpt(VCLSubmission.KeyId, credential.inputDescriptor) - .putOpt(VCLSubmission.KeyPath, "$.verifiableCredential[$index]") - .putOpt(VCLSubmission.KeyFormat, VCLSubmission.ValueJwtVc) }))) - vp.putOpt(VCLSubmission.KeyVerifiableCredential, JSONArray(verifiableCredentials?.map { credential -> credential.jwtVc })) - vendorOriginContext?.let { vp.putOpt(VCLSubmission.KeyVendorOriginContext, vendorOriginContext) } - retVal.putOpt(VCLSubmission.KeyVp, vp) + .putOpt(SubmissionCodingKeys.KeyId, credential.inputDescriptor) + .putOpt(SubmissionCodingKeys.KeyPath, "$.verifiableCredential[$index]") + .putOpt(SubmissionCodingKeys.KeyFormat, SubmissionCodingKeys.ValueJwtVcFormat) }))) + vp.putOpt(SubmissionCodingKeys.KeyVerifiableCredential, JSONArray(verifiableCredentials?.map { credential -> credential.jwtVc })) + vendorOriginContext?.let { vp.putOpt(SubmissionCodingKeys.KeyVendorOriginContext, vendorOriginContext) } + retVal.putOpt(SubmissionCodingKeys.KeyVp, vp) return retVal } fun generateRequestBody(jwt: VCLJwt): JSONObject = JSONObject() - .putOpt(VCLSubmission.KeyExchangeId, exchangeId) - .putOpt(VCLSubmission.KeyJwtVp, jwt.encodedJwt) - .putOpt(VCLSubmission.KeyPushDelegate, pushDelegate?.toJsonObject()) - .putOpt(VCLSubmission.KeyContext, VCLSubmission.ValueContextList.toJsonArray()) - - companion object CodingKeys { - const val KeyJti = "jti" - const val KeyIss = "iss" - const val KeyId = "id" - const val KeyVp = "vp" - const val KeyDid = "did" - const val KeyPushDelegate = "push_delegate" - - const val KeyType = "type" - const val KeyPresentationSubmission = "presentation_submission" - const val KeyDefinitionId = "definition_id" - const val KeyDescriptorMap = "descriptor_map" - const val KeyExchangeId = "exchange_id" - const val KeyJwtVp = "jwt_vp" - const val KeyPath = "path" - const val KeyFormat = "format" - const val KeyVerifiableCredential = "verifiableCredential" - const val KeyVendorOriginContext = "vendorOriginContext" - const val KeyInputDescriptor = "input_descriptor" - - const val ValueJwtVc = "jwt_vc" - const val ValueVerifiablePresentation = "VerifiablePresentation" - - const val KeyContext = "@context" - val ValueContextList = listOf("https://www.w3.org/2018/credentials/v1") - } + .putOpt(SubmissionCodingKeys.KeyExchangeId, exchangeId) + .putOpt(SubmissionCodingKeys.KeyJwtVp, jwt.encodedJwt) + .putOpt(SubmissionCodingKeys.KeyPushDelegate, pushDelegate?.toJsonObject()) + .putOpt(SubmissionCodingKeys.KeyContext, SubmissionCodingKeys.ValueContextList.toJsonArray()) } +object SubmissionCodingKeys { + const val KeyJti = "jti" + const val KeyIss = "iss" + const val KeyId = "id" + const val KeyVp = "vp" + const val KeyDid = "did" + const val KeyPushDelegate = "push_delegate" + const val KeyType = "type" + const val KeyPresentationSubmission = "presentation_submission" + const val KeyDefinitionId = "definition_id" + const val KeyDescriptorMap = "descriptor_map" + const val KeyExchangeId = "exchange_id" + const val KeyJwtVp = "jwt_vp" + const val KeyPath = "path" + const val KeyFormat = "format" + const val KeyVerifiableCredential = "verifiableCredential" + const val KeyVendorOriginContext = "vendorOriginContext" + const val KeyInputDescriptor = "input_descriptor" + const val ValueVerifiablePresentation = "VerifiablePresentation" + const val ValueJwtVcFormat = "jwt_vc" + const val KeyContext = "@context" + val ValueContextList = listOf("https://www.w3.org/2018/credentials/v1") +} diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/error/VCLError.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/error/VCLError.kt index 78f9aa63..1fc804b3 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/api/entities/error/VCLError.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/error/VCLError.kt @@ -10,60 +10,47 @@ package io.velocitycareerlabs.api.entities.error import io.velocitycareerlabs.impl.extensions.toJsonObject import org.json.JSONObject -class VCLError( -): Error() { - var payload: String? = null - var error: String? = null - var errorCode: String = VCLErrorCode.SdkError.value - var requestId: String? = null - override var message: String? = null - var statusCode: Int? = null - - constructor( - error: String? = null, - errorCode: String = VCLErrorCode.SdkError.value, - requestId: String? = null, - message: String? = null, - statusCode: Int? = null, - ) : this() { - this.error = error - this.errorCode = errorCode - this.requestId = requestId - this.message = message - this.statusCode = statusCode - } +data class VCLError( + val payload: String? = null, + val error: String? = null, + val errorCode: String = VCLErrorCode.SdkError.value, + val requestId: String? = null, + override val message: String? = null, + val statusCode: Int? = null +) : Error(message) { constructor( payload: String?, errorCode: String? = null - ): this() { - val payloadJson = payload?.toJsonObject() - this.payload = payload - this.error = payloadJson?.optString(KeyError) - this.errorCode = errorCode ?: payloadJson?.optString(KeyErrorCode) ?: VCLErrorCode.SdkError.value - this.requestId = payloadJson?.optString(KeyRequestId) - this.message = payloadJson?.optString(KeyMessage) - this.statusCode = payloadJson?.optInt(KeyStatusCode) - } + ) : this( + payload = payload, + error = payload?.toJsonObject()?.optString(KeyError), + errorCode = errorCode ?: payload?.toJsonObject()?.optString(KeyErrorCode) + ?: VCLErrorCode.SdkError.value, + requestId = payload?.toJsonObject()?.optString(KeyRequestId), + message = payload?.toJsonObject()?.optString(KeyMessage), + statusCode = payload?.toJsonObject()?.optInt(KeyStatusCode) + ) constructor( exception: Exception, errorCode: String = VCLErrorCode.SdkError.value, statusCode: Int? = null - ): this() { - this.errorCode = errorCode - this.message = exception.toString() - this.statusCode = statusCode + ) : this( + errorCode = errorCode, + message = exception.toString(), + statusCode = statusCode + ) + + fun toJsonObject() = JSONObject().apply { + putOpt(KeyPayload, payload) + putOpt(KeyError, error) + putOpt(KeyErrorCode, errorCode) + putOpt(KeyRequestId, requestId) + putOpt(KeyMessage, message) + putOpt(KeyStatusCode, statusCode) } - fun toJsonObject() = JSONObject() - .putOpt(KeyPayload, payload) - .putOpt(KeyError, error) - .putOpt(KeyErrorCode, errorCode) - .putOpt(KeyRequestId, requestId) - .putOpt(KeyMessage, message) - .putOpt(KeyStatusCode, statusCode) - companion object CodingKeys { const val KeyPayload = "payload" const val KeyError = "error" diff --git a/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorByServiceTest.kt b/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorByServiceTest.kt index f0850c73..a0a99bcd 100644 --- a/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorByServiceTest.kt +++ b/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorByServiceTest.kt @@ -7,10 +7,10 @@ package io.velocitycareerlabs.entities -import io.velocitycareerlabs.api.entities.VCLCredentialManifestDescriptor +import io.velocitycareerlabs.api.entities.CredentialManifestDescriptorCodingKeys import io.velocitycareerlabs.api.entities.VCLCredentialManifestDescriptorByService -import io.velocitycareerlabs.api.entities.VCLServiceCredentialAgentIssuer import io.velocitycareerlabs.api.entities.VCLIssuingType +import io.velocitycareerlabs.api.entities.VCLService import io.velocitycareerlabs.impl.extensions.encode import io.velocitycareerlabs.impl.extensions.isUrlEquivalentTo import io.velocitycareerlabs.infrastructure.resources.valid.CredentialManifestDescriptorMocks @@ -31,7 +31,7 @@ internal class VCLCredentialManifestDescriptorByServiceTest { @Test fun testCredentialManifestDescriptorByServiceWithFullInput1Success() { val service = - VCLServiceCredentialAgentIssuer(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) + VCLService(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) subject = VCLCredentialManifestDescriptorByService( service = service, issuingType = VCLIssuingType.Career, @@ -41,10 +41,10 @@ internal class VCLCredentialManifestDescriptorByServiceTest { ) val credentialTypesQuery = - "${VCLCredentialManifestDescriptor.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[0]}" + - "&${VCLCredentialManifestDescriptor.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[1]}" + - "&${VCLCredentialManifestDescriptor.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + - "&${VCLCredentialManifestDescriptor.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" + "${CredentialManifestDescriptorCodingKeys.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[0]}" + + "&${CredentialManifestDescriptorCodingKeys.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[1]}" + + "&${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + + "&${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceEndPoint + "?" + credentialTypesQuery) @@ -55,7 +55,7 @@ internal class VCLCredentialManifestDescriptorByServiceTest { @Test fun testCredentialManifestDescriptorByServiceWithFullInput2Success() { val service = - VCLServiceCredentialAgentIssuer(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) + VCLService(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) subject = VCLCredentialManifestDescriptorByService( service = service, issuingType = VCLIssuingType.Identity, @@ -65,10 +65,10 @@ internal class VCLCredentialManifestDescriptorByServiceTest { ) val credentialTypesQuery = - "${VCLCredentialManifestDescriptor.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[0]}" + - "&${VCLCredentialManifestDescriptor.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[1]}" + - "&${VCLCredentialManifestDescriptor.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + - "&${VCLCredentialManifestDescriptor.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" + "${CredentialManifestDescriptorCodingKeys.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[0]}" + + "&${CredentialManifestDescriptorCodingKeys.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[1]}" + + "&${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + + "&${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceEndPoint + "?" + credentialTypesQuery) @@ -79,7 +79,7 @@ internal class VCLCredentialManifestDescriptorByServiceTest { @Test fun testCredentialManifestDescriptorByServiceWithPartialInput2Success() { val service = - VCLServiceCredentialAgentIssuer(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) + VCLService(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) subject = VCLCredentialManifestDescriptorByService( service = service, issuingType = VCLIssuingType.Career, @@ -88,8 +88,8 @@ internal class VCLCredentialManifestDescriptorByServiceTest { ) val credentialTypesQuery = - "${VCLCredentialManifestDescriptor.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + - "&${VCLCredentialManifestDescriptor.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" + "${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + + "&${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceEndPoint + "?" + credentialTypesQuery) @@ -100,7 +100,7 @@ internal class VCLCredentialManifestDescriptorByServiceTest { @Test fun testCredentialManifestDescriptorByServiceWithPartialInput3Success() { val service = - VCLServiceCredentialAgentIssuer(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceWithParamJsonStr)) + VCLService(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceWithParamJsonStr)) subject = VCLCredentialManifestDescriptorByService( service = service, issuingType = VCLIssuingType.Career, @@ -109,8 +109,8 @@ internal class VCLCredentialManifestDescriptorByServiceTest { ) val credentialTypesQuery = - "${VCLCredentialManifestDescriptor.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[0]}" + - "&${VCLCredentialManifestDescriptor.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[1]}" + "${CredentialManifestDescriptorCodingKeys.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[0]}" + + "&${CredentialManifestDescriptorCodingKeys.KeyCredentialTypes}=${CredentialManifestDescriptorMocks.CredentialTypesList[1]}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceWithParamEndPoint + "&" + credentialTypesQuery) @@ -121,7 +121,7 @@ internal class VCLCredentialManifestDescriptorByServiceTest { @Test fun testCredentialManifestDescriptorByServiceWithPartialInput4Success() { val service = - VCLServiceCredentialAgentIssuer(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceWithParamJsonStr)) + VCLService(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceWithParamJsonStr)) subject = VCLCredentialManifestDescriptorByService( service = service, issuingType = VCLIssuingType.Career, @@ -130,8 +130,8 @@ internal class VCLCredentialManifestDescriptorByServiceTest { ) val credentialTypesQuery = - "${VCLCredentialManifestDescriptor.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + - "&${VCLCredentialManifestDescriptor.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" + "${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushUrl}=${CredentialManifestDescriptorMocks.PushDelegate.pushUrl.encode()}" + + "&${CredentialManifestDescriptorCodingKeys.KeyPushDelegatePushToken}=${CredentialManifestDescriptorMocks.PushDelegate.pushToken}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceWithParamEndPoint + "&" + credentialTypesQuery) @@ -142,7 +142,7 @@ internal class VCLCredentialManifestDescriptorByServiceTest { @Test fun testCredentialManifestDescriptorByServiceWithPartialInput5Success() { val service = - VCLServiceCredentialAgentIssuer(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceWithParamJsonStr)) + VCLService(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceWithParamJsonStr)) subject = VCLCredentialManifestDescriptorByService( service = service, issuingType = VCLIssuingType.Career, @@ -157,7 +157,7 @@ internal class VCLCredentialManifestDescriptorByServiceTest { @Test fun testCredentialManifestDescriptorByServiceWithPartialInput6Success() { val service = - VCLServiceCredentialAgentIssuer(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) + VCLService(JSONObject(CredentialManifestDescriptorMocks.IssuingServiceJsonStr)) subject = VCLCredentialManifestDescriptorByService( service = service, didJwk = DidJwkMocks.DidJwk diff --git a/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorRefreshTest.kt b/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorRefreshTest.kt index 488b63f6..486e6946 100644 --- a/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorRefreshTest.kt +++ b/VCL/src/test/java/io/velocitycareerlabs/entities/VCLCredentialManifestDescriptorRefreshTest.kt @@ -7,6 +7,7 @@ package io.velocitycareerlabs.entities +import io.velocitycareerlabs.api.entities.CredentialManifestDescriptorCodingKeys import io.velocitycareerlabs.api.entities.VCLCredentialManifestDescriptor import io.velocitycareerlabs.api.entities.VCLCredentialManifestDescriptorRefresh import io.velocitycareerlabs.api.entities.VCLService @@ -43,9 +44,9 @@ internal class VCLCredentialManifestDescriptorRefreshTest { didJwk = DidJwkMocks.DidJwk ) - val credentialTypesQuery = "${VCLCredentialManifestDescriptor.KeyRefresh}=${true}" + - "&${VCLCredentialManifestDescriptor.KeyCredentialId}=${CredentialManifestDescriptorMocks.CredentialId1.encode()}" + - "&${VCLCredentialManifestDescriptor.KeyCredentialId}=${CredentialManifestDescriptorMocks.CredentialId2.encode()}" + val credentialTypesQuery = "${CredentialManifestDescriptorCodingKeys.KeyRefresh}=${true}" + + "&${CredentialManifestDescriptorCodingKeys.KeyCredentialId}=${CredentialManifestDescriptorMocks.CredentialId1.encode()}" + + "&${CredentialManifestDescriptorCodingKeys.KeyCredentialId}=${CredentialManifestDescriptorMocks.CredentialId2.encode()}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceEndPoint + "?" + credentialTypesQuery) assert(subject.endpoint.isUrlEquivalentTo(mockEndpoint)) @@ -64,8 +65,8 @@ internal class VCLCredentialManifestDescriptorRefreshTest { didJwk = DidJwkMocks.DidJwk ) - val credentialTypesQuery = "${VCLCredentialManifestDescriptor.KeyRefresh}=${true}" + - "&${VCLCredentialManifestDescriptor.KeyCredentialId}=${CredentialManifestDescriptorMocks.CredentialId1.encode()}" + val credentialTypesQuery = "${CredentialManifestDescriptorCodingKeys.KeyRefresh}=${true}" + + "&${CredentialManifestDescriptorCodingKeys.KeyCredentialId}=${CredentialManifestDescriptorMocks.CredentialId1.encode()}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceEndPoint + "?" + credentialTypesQuery) assert(subject.endpoint.isUrlEquivalentTo(mockEndpoint)) @@ -84,7 +85,7 @@ internal class VCLCredentialManifestDescriptorRefreshTest { didJwk = DidJwkMocks.DidJwk ) - val credentialTypesQuery = "${VCLCredentialManifestDescriptor.KeyRefresh}=${true}" + val credentialTypesQuery = "${CredentialManifestDescriptorCodingKeys.KeyRefresh}=${true}" val mockEndpoint = (CredentialManifestDescriptorMocks.IssuingServiceEndPoint + "?" + credentialTypesQuery) assert(subject.endpoint.isUrlEquivalentTo(mockEndpoint)) diff --git a/VCL/src/test/java/io/velocitycareerlabs/entities/VCLSubmissionTest.kt b/VCL/src/test/java/io/velocitycareerlabs/entities/VCLSubmissionTest.kt index 6741d664..b6a6188c 100644 --- a/VCL/src/test/java/io/velocitycareerlabs/entities/VCLSubmissionTest.kt +++ b/VCL/src/test/java/io/velocitycareerlabs/entities/VCLSubmissionTest.kt @@ -7,6 +7,7 @@ package io.velocitycareerlabs.entities +import io.velocitycareerlabs.api.entities.SubmissionCodingKeys import io.velocitycareerlabs.api.entities.VCLCredentialManifest import io.velocitycareerlabs.api.entities.VCLIdentificationSubmission import io.velocitycareerlabs.api.entities.VCLPresentationSubmission @@ -49,12 +50,12 @@ class VCLSubmissionTest { @Test fun testPayload() { val presentationSubmissionPayload = subjectPresentationSubmission.generatePayload(inspectionIss) - assert(presentationSubmissionPayload.optString(VCLSubmission.KeyJti) == subjectPresentationSubmission.jti) - assert(presentationSubmissionPayload.optString(VCLSubmission.KeyIss) == inspectionIss) + assert(presentationSubmissionPayload.optString(SubmissionCodingKeys.KeyJti) == subjectPresentationSubmission.jti) + assert(presentationSubmissionPayload.optString(SubmissionCodingKeys.KeyIss) == inspectionIss) val identificationSubmissionPayload = subjectIdentificationSubmission.generatePayload(issuingIss) - assert(identificationSubmissionPayload.optString(VCLSubmission.KeyJti) == subjectIdentificationSubmission.jti) - assert(identificationSubmissionPayload.optString(VCLSubmission.KeyIss) == issuingIss) + assert(identificationSubmissionPayload.optString(SubmissionCodingKeys.KeyJti) == subjectIdentificationSubmission.jti) + assert(identificationSubmissionPayload.optString(SubmissionCodingKeys.KeyIss) == issuingIss) } @Test @@ -66,10 +67,10 @@ class VCLSubmissionTest { @Test fun testRequestBody() { val requestBodyJsonObj = subjectPresentationSubmission.generateRequestBody(JwtServiceMocks.JWT) - assert(requestBodyJsonObj.optString(VCLSubmission.KeyExchangeId) == subjectPresentationSubmission.exchangeId) - assert(requestBodyJsonObj.optJSONArray(VCLSubmission.KeyContext)!!.toList() == VCLSubmission.ValueContextList) + assert(requestBodyJsonObj.optString(SubmissionCodingKeys.KeyExchangeId) == subjectPresentationSubmission.exchangeId) + assert(requestBodyJsonObj.optJSONArray(SubmissionCodingKeys.KeyContext)!!.toList() == SubmissionCodingKeys.ValueContextList) - val pushDelegateBodyJsonObj = requestBodyJsonObj.optJSONObject(VCLSubmission.KeyPushDelegate)!! + val pushDelegateBodyJsonObj = requestBodyJsonObj.optJSONObject(SubmissionCodingKeys.KeyPushDelegate)!! assert(pushDelegateBodyJsonObj.optString(VCLPushDelegate.KeyPushUrl) == PresentationSubmissionMocks.PushDelegate.pushUrl) assert(pushDelegateBodyJsonObj.optString(VCLPushDelegate.KeyPushToken) == PresentationSubmissionMocks.PushDelegate.pushToken) @@ -80,7 +81,7 @@ class VCLSubmissionTest { @Test fun testContext() { - assert(VCLSubmission.KeyContext == "@context") - assert(VCLSubmission.ValueContextList == listOf("https://www.w3.org/2018/credentials/v1")) + assert(SubmissionCodingKeys.KeyContext == "@context") + assert(SubmissionCodingKeys.ValueContextList == listOf("https://www.w3.org/2018/credentials/v1")) } } \ No newline at end of file diff --git a/app/src/main/java/com/vcl/wallet/MainActivity.kt b/app/src/main/java/com/vcl/wallet/MainActivity.kt index 180a7665..262cadd4 100644 --- a/app/src/main/java/com/vcl/wallet/MainActivity.kt +++ b/app/src/main/java/com/vcl/wallet/MainActivity.kt @@ -240,7 +240,7 @@ class MainActivity : AppCompatActivity() { }) } - private fun getCredentialManifestByService(serviceCredentialAgentIssuer: VCLServiceCredentialAgentIssuer) { + private fun getCredentialManifestByService(serviceCredentialAgentIssuer: VCLService) { val credentialManifestDescriptorByOrganization = VCLCredentialManifestDescriptorByService( service = serviceCredentialAgentIssuer,