Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

align to ios structure, v2.6.0 #134

Merged
merged 1 commit into from
Oct 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>? = 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<String>?
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()}")
}
}
}
}

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"
}



Original file line number Diff line number Diff line change
Expand Up @@ -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
)
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<String>? = null
override val vendorOriginContext: String? = deepLink.vendorOriginContext

override val did: String?
get() = retrieveDid()

override val endpoint: String?
get() = retrieveEndpoint()
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>? = 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()
}
data class VCLCredentialManifestDescriptorByService(
private val service: VCLService,
override var issuingType: VCLIssuingType = VCLIssuingType.Career,
override var credentialTypes: List<String>? = 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()}")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>,
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<String>? = 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" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,33 @@

package io.velocitycareerlabs.api.entities

class VCLIdentificationSubmission(
credentialManifest: VCLCredentialManifest,
verifiableCredentials: List<VCLVerifiableCredential>? = null
) : VCLSubmission(
submitUri = credentialManifest.submitPresentationUri,
exchangeId = credentialManifest.exchangeId,
presentationDefinitionId = credentialManifest.presentationDefinitionId,
verifiableCredentials = verifiableCredentials,
vendorOriginContext = credentialManifest.vendorOriginContext,
didJwk = credentialManifest.didJwk,
remoteCryptoServicesToken = credentialManifest.remoteCryptoServicesToken
)
import java.util.UUID

data class VCLIdentificationSubmission(
override val submitUri: String,
override val exchangeId: String,
override val presentationDefinitionId: String,
override val verifiableCredentials: List<VCLVerifiableCredential>?,
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<VCLVerifiableCredential>? = null
) : this(
submitUri = credentialManifest.submitPresentationUri,
exchangeId = credentialManifest.exchangeId,
presentationDefinitionId = credentialManifest.presentationDefinitionId,
verifiableCredentials = verifiableCredentials,
vendorOriginContext = credentialManifest.vendorOriginContext,
didJwk = credentialManifest.didJwk,
remoteCryptoServicesToken = credentialManifest.remoteCryptoServicesToken,
pushDelegate = null
)
}
20 changes: 6 additions & 14 deletions VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLJwt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ data class VCLOrganization(val payload: JSONObject) {

val TAG = VCLOrganization::class.simpleName

val serviceCredentialAgentIssuers: List<VCLServiceCredentialAgentIssuer>
val serviceCredentialAgentIssuers: List<VCLService>
get() = parseServiceCredentialAgentIssuers()

private fun parseServiceCredentialAgentIssuers(): List<VCLServiceCredentialAgentIssuer> {
val retVal = mutableListOf<VCLServiceCredentialAgentIssuer>()
private fun parseServiceCredentialAgentIssuers(): List<VCLService> {
val retVal = mutableListOf<VCLService>()
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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading