Skip to content

Commit c2cce38

Browse files
authored
Merge pull request #252 from walt-id/250-ssikit-refactor-did-service
250 ssikit refactor did service
2 parents 7d08fff + d505cdf commit c2cce38

38 files changed

+679
-498
lines changed

build.gradle.kts

+2-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ dependencies {
7474
implementation("io.ktor:ktor-client-jackson-jvm:2.2.4")
7575
implementation("io.ktor:ktor-client-content-negotiation:2.2.4")
7676
implementation("io.ktor:ktor-client-core-jvm:2.2.4")
77-
//implementation("io.ktor:ktor-client-cio-jvm:2.2.4")
77+
implementation("io.ktor:ktor-client-cio-jvm:2.2.4")
78+
implementation("io.ktor:ktor-client-auth:2.2.4")
7879
implementation("io.ktor:ktor-client-okhttp:2.2.4")
7980
implementation("io.ktor:ktor-serialization-kotlinx-json:2.2.4")
8081
implementation("io.ktor:ktor-client-logging-jvm:2.2.4")

src/main/kotlin/id/walt/cli/AuthCommand.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.github.ajalt.clikt.core.requireObject
55
import com.github.ajalt.clikt.parameters.options.option
66
import com.github.ajalt.clikt.parameters.options.prompt
77
import com.nimbusds.jwt.SignedJWT
8-
import id.walt.services.WaltIdServices.http
8+
import id.walt.services.WaltIdServices.httpNoAuth
99
import io.ktor.client.call.*
1010
import io.ktor.client.request.*
1111
import kotlinx.coroutines.runBlocking
@@ -40,7 +40,7 @@ class AuthCommand : CliktCommand(
4040

4141
runBlocking {
4242
//val client = HttpClient(CIO)
43-
val client = http
43+
val client = httpNoAuth
4444
val token = client.post("https://api.walt.id/users/auth/login") {
4545
setBody(mapOf("email" to email, "password" to password))
4646
}.body<JsonObject>()["token"].toString()

src/main/kotlin/id/walt/cli/GaiaxCommand.kt

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import id.walt.model.Did
1111
import id.walt.model.DidMethod
1212
import id.walt.model.gaiax.GaiaxCredentialGroup
1313
import id.walt.model.gaiax.ParticipantVerificationResult
14-
import id.walt.services.WaltIdServices.http
14+
import id.walt.services.WaltIdServices.httpNoAuth
1515
import id.walt.services.did.DidService
16+
import id.walt.services.did.DidWebCreateOptions
1617
import id.walt.services.ecosystems.gaiax.GaiaxService
1718
import id.walt.services.key.KeyService
1819
import id.walt.signatory.Ecosystem
@@ -81,7 +82,7 @@ class GaiaxOnboardingCommand : CliktCommand(
8182
if (didWebPath?.isBlank() == true) didWebPath = null
8283

8384
echo(">>> Creating did:web from key $keyId...")
84-
val did = DidService.create(DidMethod.web, keyId.id, DidService.DidWebOptions(didWebDomain, didWebPath))
85+
val did = DidService.create(DidMethod.web, keyId.id, DidWebCreateOptions(didWebDomain, didWebPath))
8586
echo("DID created: $did")
8687

8788
var encodedDid = DidService.load(did).encodePretty()
@@ -196,7 +197,7 @@ class GaiaxVerifyCredentialGroupCommand : CliktCommand(
196197
)
197198

198199
val verificationResult = runBlocking {
199-
http.post("https://compliance.lab.gaia-x.eu/api/v2206/participant/verify/raw") {
200+
httpNoAuth.post("https://compliance.lab.gaia-x.eu/api/v2206/participant/verify/raw") {
200201
setBody(credentialGroup)
201202
}.body<ParticipantVerificationResult>()
202203
}

src/main/kotlin/id/walt/cli/did/DidCommand.kt

+5-13
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,17 @@ import com.github.ajalt.clikt.core.requireObject
66
import com.github.ajalt.clikt.parameters.arguments.argument
77
import com.github.ajalt.clikt.parameters.arguments.optional
88
import com.github.ajalt.clikt.parameters.groups.*
9-
import com.github.ajalt.clikt.parameters.options.default
109
import com.github.ajalt.clikt.parameters.options.flag
1110
import com.github.ajalt.clikt.parameters.options.option
1211
import com.github.ajalt.clikt.parameters.options.required
13-
import com.github.ajalt.clikt.parameters.types.choice
14-
import com.github.ajalt.clikt.parameters.types.int
1512
import com.github.ajalt.clikt.parameters.types.path
1613
import id.walt.cli.CliConfig
17-
import id.walt.common.prettyPrint
1814
import id.walt.crypto.KeyAlgorithm
1915
import id.walt.model.DidMethod
2016
import id.walt.model.DidMethod.*
2117
import id.walt.model.DidUrl
2218
import id.walt.services.crypto.CryptoService
23-
import id.walt.services.did.DidService
19+
import id.walt.services.did.*
2420
import java.io.File
2521
import java.nio.file.Path
2622
import kotlin.io.path.absolutePathString
@@ -69,9 +65,9 @@ class CreateDidCommand : CliktCommand(
6965
echo("Creating did:${method} (key: ${keyId})")
7066

7167
val did = when (method) {
72-
is WebMethodOption -> DidService.create(web, keyId, DidService.DidWebOptions((method as WebMethodOption).domain, (method as WebMethodOption).path))
73-
is EbsiMethodOption -> DidService.create(ebsi, keyId, DidService.DidEbsiOptions((method as EbsiMethodOption).version))
74-
is CheqdMethodOption -> DidService.create(cheqd, keyId, DidService.DidCheqdOptions((method as CheqdMethodOption).network))
68+
is WebMethodOption -> DidService.create(web, keyId, DidWebCreateOptions((method as WebMethodOption).domain, (method as WebMethodOption).path))
69+
is EbsiMethodOption -> DidService.create(ebsi, keyId, DidEbsiCreateOptions((method as EbsiMethodOption).version))
70+
is CheqdMethodOption -> DidService.create(cheqd, keyId, DidCheqdCreateOptions((method as CheqdMethodOption).network))
7571
else -> DidService.create(DidMethod.valueOf(method.method), keyId)
7672
}
7773

@@ -97,11 +93,7 @@ class CreateDidCommand : CliktCommand(
9793

9894
fun resolveDidHelper(did: String, raw: Boolean) = when {
9995
did.contains("web") -> DidService.resolve(DidUrl.from(did)).encodePretty()
100-
did.contains("ebsi") -> when (raw) {
101-
true -> DidService.resolveDidEbsiRaw(did).prettyPrint()
102-
else -> DidService.resolveDidEbsi(did).encodePretty()
103-
}
104-
96+
did.contains("ebsi") -> DidService.resolve(did, DidEbsiResolveOptions(raw)).encodePretty()
10597
else -> DidService.resolve(did).encodePretty()
10698
}
10799

src/main/kotlin/id/walt/common/CommonUtils.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package id.walt.common
22

3-
import id.walt.services.WaltIdServices.http
3+
import id.walt.services.WaltIdServices.httpNoAuth
44
import io.ktor.client.request.*
55
import io.ktor.client.statement.*
66
import kotlinx.coroutines.runBlocking
@@ -20,7 +20,7 @@ fun resolveContent(fileUrlContent: String): String {
2020
return url?.readText() ?: fileUrlContent
2121
}
2222
if (Regex("^https?:\\/\\/.*$").matches(fileUrlContent)) {
23-
return runBlocking { http.get(fileUrlContent).bodyAsText() }
23+
return runBlocking { httpNoAuth.get(fileUrlContent).bodyAsText() }
2424
}
2525
return fileUrlContent
2626
}

src/main/kotlin/id/walt/rest/core/DidController.kt

+9-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ import id.walt.common.KlaxonWithConverters
44
import id.walt.common.prettyPrint
55
import id.walt.crypto.KeyAlgorithm
66
import id.walt.model.DidMethod
7-
import id.walt.rest.core.requests.did.*
8-
import id.walt.services.did.DidService
7+
import id.walt.rest.core.requests.did.CheqdCreateDidRequest
8+
import id.walt.rest.core.requests.did.CreateDidRequest
9+
import id.walt.rest.core.requests.did.EbsiCreateDidRequest
10+
import id.walt.rest.core.requests.did.WebCreateDidRequest
11+
import id.walt.services.did.*
912
import io.javalin.http.Context
1013
import io.javalin.http.HttpCode
1114
import io.javalin.plugin.openapi.dsl.document
@@ -76,9 +79,9 @@ object DidController {
7679
}
7780

7881
private fun getOptions(request: CreateDidRequest) = when (request) {
79-
is WebCreateDidRequest -> DidService.DidWebOptions(request.domain ?: "walt.id", request.path)
80-
is EbsiCreateDidRequest -> DidService.DidEbsiOptions(request.version)
81-
is CheqdCreateDidRequest -> DidService.DidCheqdOptions(request.network)
82+
is WebCreateDidRequest -> DidWebCreateOptions(request.domain ?: "walt.id", request.path)
83+
is EbsiCreateDidRequest -> DidEbsiCreateOptions(request.version)
84+
is CheqdCreateDidRequest -> DidCheqdCreateOptions(request.network)
8285
else -> null
8386
}
8487

@@ -90,7 +93,7 @@ object DidController {
9093
fun resolve(ctx: Context) {
9194
val did = ctx.bodyAsClass(ResolveDidRequest::class.java).did
9295
when {
93-
did.contains("ebsi") -> ctx.result(DidService.resolveDidEbsiRaw(did).prettyPrint())
96+
did.contains("ebsi") -> ctx.result(DidService.resolve(did, DidEbsiResolveOptions(true)).prettyPrint())
9497
else -> ctx.json(DidService.resolve(did))
9598
}
9699
}

src/main/kotlin/id/walt/services/WaltIdServices.kt

+41-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@ import com.sksamuel.hoplite.yaml.YamlParser
88
import com.zaxxer.hikari.HikariDataSource
99
import id.walt.Values
1010
import io.ktor.client.*
11+
import io.ktor.client.engine.cio.*
1112
import io.ktor.client.engine.okhttp.*
12-
//import io.ktor.client.engine.cio.*
13+
import io.ktor.client.plugins.auth.providers.*
1314
import io.ktor.client.plugins.contentnegotiation.*
1415
import io.ktor.client.plugins.logging.*
16+
import io.ktor.client.statement.*
17+
import io.ktor.http.*
1518
import io.ktor.serialization.kotlinx.json.*
1619
import kotlinx.serialization.json.Json
1720
import mu.KotlinLogging
@@ -35,9 +38,10 @@ object WaltIdServices {
3538

3639
val httpLogging = false
3740
private val log = KotlinLogging.logger {}
41+
private val bearerTokenStorage = mutableListOf<BearerTokens>()
3842

3943
//val http = HttpClient(CIO) {
40-
val http = HttpClient(OkHttp) {
44+
val httpNoAuth = HttpClient(OkHttp) {
4145
install(ContentNegotiation) {
4246
json(Json { ignoreUnknownKeys = true })
4347
}
@@ -49,6 +53,25 @@ object WaltIdServices {
4953
}
5054
}
5155

56+
val httpWithAuth = HttpClient(CIO) {
57+
install(ContentNegotiation) {
58+
json(Json { ignoreUnknownKeys = true })
59+
}
60+
install(io.ktor.client.plugins.auth.Auth) {
61+
bearer {
62+
loadTokens {
63+
bearerTokenStorage.last()
64+
}
65+
}
66+
}
67+
if (httpLogging) {
68+
install(Logging) {
69+
logger = Logger.SIMPLE
70+
level = LogLevel.HEADERS
71+
}
72+
}
73+
}
74+
5275
init {
5376
val javaVersion = System.getProperty("java.runtime.version")
5477
println("walt.id SSI Kit ${Values.version} (running on Java $javaVersion)")
@@ -92,4 +115,20 @@ object WaltIdServices {
92115
.build()
93116
.loadConfigOrThrow<WaltIdConfig>()
94117

118+
fun addBearerToken(token: String) = bearerTokenStorage.add(BearerTokens(token, token))
119+
120+
fun clearBearerTokens() = bearerTokenStorage.clear()
121+
122+
suspend inline fun <T> callWithToken(token: String, vararg arg: T, callback: (Any) -> HttpResponse): Result<String> {
123+
addBearerToken(token)
124+
val result = callback(arg)
125+
clearBearerTokens()
126+
return when (result.status) {
127+
HttpStatusCode.Accepted,
128+
HttpStatusCode.Created,
129+
HttpStatusCode.OK -> Result.success(result.bodyAsText())
130+
else -> Result.failure(Exception(result.bodyAsText()))
131+
132+
}
133+
}
95134
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package id.walt.services.did
2+
3+
sealed class DidOptions
4+
5+
data class DidWebCreateOptions(val domain: String?, val path: String? = null) : DidOptions()
6+
data class DidEbsiCreateOptions(val version: Int) : DidOptions()
7+
data class DidCheqdCreateOptions(val network: String) : DidOptions()
8+
9+
data class DidEbsiResolveOptions(val isRaw: Boolean) : DidOptions()

0 commit comments

Comments
 (0)