From be12cb28f138e2177ebdd4979b128c7b827f5059 Mon Sep 17 00:00:00 2001 From: waltkb <68587968+waltkb@users.noreply.github.com> Date: Wed, 22 Nov 2023 10:31:37 +0100 Subject: [PATCH] Move VC Cards to single component, add Selective Disclosure marking, added listing of selectively disclosure-able properties --- .../id/walt/service/SSIKit2WalletService.kt | 4 +- .../id/walt/service/WalletKitWalletService.kt | 18 ++-- .../kotlin/id/walt/service/WalletService.kt | 3 +- .../web/controllers/CredentialController.kt | 3 +- .../credentials/VerifiableCredentialCard.vue | 47 ++++++++ .../[wallet]/credentials/[credentialId].vue | 102 ++++++++++++------ web/src/pages/wallet/[wallet]/index.vue | 30 +----- 7 files changed, 135 insertions(+), 72 deletions(-) create mode 100644 web/src/components/credentials/VerifiableCredentialCard.vue diff --git a/src/main/kotlin/id/walt/service/SSIKit2WalletService.kt b/src/main/kotlin/id/walt/service/SSIKit2WalletService.kt index 1ac679c..34516ef 100644 --- a/src/main/kotlin/id/walt/service/SSIKit2WalletService.kt +++ b/src/main/kotlin/id/walt/service/SSIKit2WalletService.kt @@ -93,8 +93,8 @@ class SSIKit2WalletService(accountId: UUID, walletId: UUID) : WalletService(acco override suspend fun deleteCredential(id: String) = transaction { CredentialsService.delete(walletId, id) } - override suspend fun getCredential(credentialId: String): String = - CredentialsService.get(walletId, credentialId)?.document + override suspend fun getCredential(credentialId: String): WalletCredential = + CredentialsService.get(walletId, credentialId) ?: throw IllegalArgumentException("WalletCredential not found for credentialId: $credentialId") private fun getQueryParams(url: String): Map> { diff --git a/src/main/kotlin/id/walt/service/WalletKitWalletService.kt b/src/main/kotlin/id/walt/service/WalletKitWalletService.kt index 466c6ce..56bb4da 100644 --- a/src/main/kotlin/id/walt/service/WalletKitWalletService.kt +++ b/src/main/kotlin/id/walt/service/WalletKitWalletService.kt @@ -2,10 +2,7 @@ package id.walt.service import id.walt.config.ConfigManager import id.walt.config.RemoteWalletConfig -import id.walt.db.models.Accounts -import id.walt.db.models.WalletDid -import id.walt.db.models.WalletOperationHistories -import id.walt.db.models.WalletOperationHistory +import id.walt.db.models.* import id.walt.service.dids.DidsService import id.walt.service.dto.LinkedWalletDataTransferObject import id.walt.service.dto.WalletDataTransferObject @@ -23,6 +20,7 @@ import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.serialization.kotlinx.json.* import kotlinx.coroutines.runBlocking +import kotlinx.datetime.Instant import kotlinx.datetime.toJavaInstant import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString @@ -138,9 +136,15 @@ class WalletKitWalletService(accountId: UUID, walletId: UUID) : WalletService(ac override suspend fun deleteCredential(id: String) = authenticatedJsonDelete("/api/wallet/credentials/delete/$id").status.isSuccess() - override suspend fun getCredential(credentialId: String): String = - /*prettyJson.encodeToString(*/ - listCredentials().first { it.parsedCredential["id"]?.jsonPrimitive?.content == credentialId }.toString()//) + override suspend fun getCredential(credentialId: String) = WalletCredential( + wallet = walletId, + id = credentialId, + document = listCredentials().first { it.parsedCredential["id"]?.jsonPrimitive?.content == credentialId }.toString(), + disclosures = null, + addedOn = Instant.DISTANT_PAST + ) + /*prettyJson.encodeToString(*/ + //) /* override suspend fun getCredential(credentialId: String): String = authenticatedJsonGet("/api/wallet/credentials/$credentialId") .bodyAsText()*/ diff --git a/src/main/kotlin/id/walt/service/WalletService.kt b/src/main/kotlin/id/walt/service/WalletService.kt index 2c837fe..9603a17 100644 --- a/src/main/kotlin/id/walt/service/WalletService.kt +++ b/src/main/kotlin/id/walt/service/WalletService.kt @@ -1,5 +1,6 @@ package id.walt.service +import id.walt.db.models.WalletCredential import id.walt.db.models.WalletDid import id.walt.db.models.WalletOperationHistory import id.walt.service.dto.LinkedWalletDataTransferObject @@ -15,7 +16,7 @@ abstract class WalletService(val accountId: UUID, val walletId: UUID) { abstract fun listCredentials(): List abstract suspend fun listRawCredentials(): List abstract suspend fun deleteCredential(id: String): Boolean - abstract suspend fun getCredential(credentialId: String): String + abstract suspend fun getCredential(credentialId: String): WalletCredential // SIOP abstract suspend fun usePresentationRequest(request: String, did: String): Result diff --git a/src/main/kotlin/id/walt/web/controllers/CredentialController.kt b/src/main/kotlin/id/walt/web/controllers/CredentialController.kt index 1786d39..fdf0aa7 100644 --- a/src/main/kotlin/id/walt/web/controllers/CredentialController.kt +++ b/src/main/kotlin/id/walt/web/controllers/CredentialController.kt @@ -1,5 +1,6 @@ package id.walt.web.controllers +import id.walt.db.models.WalletCredential import id.walt.web.getWalletService import io.github.smiley4.ktorswaggerui.dsl.delete import io.github.smiley4.ktorswaggerui.dsl.get @@ -45,7 +46,7 @@ fun Application.credentials() = walletRoute { summary = "View a credential" response { HttpStatusCode.OK to { - body { + body { description = "WalletCredential in JWT (String starting with 'ey' or JSON_LD (JSON with proof) format" } diff --git a/web/src/components/credentials/VerifiableCredentialCard.vue b/web/src/components/credentials/VerifiableCredentialCard.vue new file mode 100644 index 0000000..c4cc03e --- /dev/null +++ b/web/src/components/credentials/VerifiableCredentialCard.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/web/src/pages/wallet/[wallet]/credentials/[credentialId].vue b/web/src/pages/wallet/[wallet]/credentials/[credentialId].vue index 5a0bba4..3a5757d 100644 --- a/web/src/pages/wallet/[wallet]/credentials/[credentialId].vue +++ b/web/src/pages/wallet/[wallet]/credentials/[credentialId].vue @@ -4,27 +4,30 @@ Loading credential...
-
-
-
-
- {{ jwtJson?.expirationDate ? (new Date(jwtJson?.expirationDate).getTime() > new Date().getTime() ? "Valid" : "Expired") : "Valid" }} -
-
-
-

- {{ jwtJson?.type[jwtJson?.type.length - 1].replace(/([a-z0-9])([A-Z])/g, "$1 $2") }} -

-
- -
- {{ jwtJson?.issuer?.name }} -
-
-
+ +
@@ -214,6 +217,19 @@ {{ jwtJson?.issuer?.id ?? jwtJson?.issuer }}
+ +
+
+
Selectively disclosure-able attributes
+
    +
  • +
    Attribute "{{ disclosure[1] }}"
    +
    {{ disclosure[2] }}
    +
  • +
+
No disclosure-able attributes!
+
+
@@ -266,36 +282,37 @@
-->

JWT

-
{{
-                        /*JSON.stringify(JSON.parse(*/
-                        credential /*), null, 2)*/ ?? ""
-                    }}
+
{{
+                            /*JSON.stringify(JSON.parse(*/
+                            credential.document /*), null, 2)*/ ?? ""
+                        }}

JSON

-
{{ jwtJson }} 
+
{{ jwtJson }} 
-