From 940e82f279e724ca525a153beeff07d2fe7049c9 Mon Sep 17 00:00:00 2001 From: usbharu <i@usbharu.dev> Date: Mon, 23 Sep 2024 12:44:26 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20RFC9421=E3=81=B8=E3=81=AE=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C=E3=82=92=E9=96=8B=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SignatureBaseの生成をするために必要なものを作成 --- build.gradle.kts | 2 +- .../dev/usbharu/httpsignature/v2/Component.kt | 9 ++++++ .../httpsignature/v2/SignatureAlgorithm.kt | 6 ++++ .../usbharu/httpsignature/v2/SignatureBase.kt | 30 +++++++++++++++++++ .../httpsignature/v2/SignatureParameter.kt | 12 ++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/v2/Component.kt create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureAlgorithm.kt create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBase.kt create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureParameter.kt diff --git a/build.gradle.kts b/build.gradle.kts index 657a87b..81d9d2f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "dev.usbharu" -version = "1.0.0" +version = "2.0.0-SNAPSHOT" repositories { mavenCentral() diff --git a/src/main/kotlin/dev/usbharu/httpsignature/v2/Component.kt b/src/main/kotlin/dev/usbharu/httpsignature/v2/Component.kt new file mode 100644 index 0000000..72eb09c --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/v2/Component.kt @@ -0,0 +1,9 @@ +package dev.usbharu.httpsignature.v2 + +interface Component { + val componentName: String + val componentIdentifier: String + get() = "\"$componentName\":$componentParameter" + val componentParameter: String + val componentValue: String +} diff --git a/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureAlgorithm.kt b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureAlgorithm.kt new file mode 100644 index 0000000..e88cb82 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureAlgorithm.kt @@ -0,0 +1,6 @@ +package dev.usbharu.httpsignature.v2 + +enum class SignatureAlgorithm(val value: String) { + ; + +} \ No newline at end of file diff --git a/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBase.kt b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBase.kt new file mode 100644 index 0000000..66fe13f --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureBase.kt @@ -0,0 +1,30 @@ +package dev.usbharu.httpsignature.v2 + +class SignatureBase() { + + private val list = mutableMapOf<String, Component>() + + fun addComponent(component: Component) { + if (list[component.componentIdentifier] != null) { + throw IllegalArgumentException("Component with identifier ${component.componentIdentifier} already exists.") + } + list[component.componentIdentifier] = component + } + + fun generateSignatureBase(signatureParameter: SignatureParameter): String { + val signatureBase = + list.values.joinToString(postfix = "\n") { component -> "${component.componentIdentifier}: ${component.componentValue}\n" } + + val signatureParams = listOfNotNull( + list.keys.joinToString(" ", "(", ")"), + signatureParameter.algorithm?.let { algorithm -> "alg=\"${algorithm.value}\"" }, + signatureParameter.keyId?.let { keyId -> "keyid=\"$keyId\"" }, + signatureParameter.created?.let { created -> "created=$created" }, + signatureParameter.expires?.let { expires -> "expires=$expires" }, + signatureParameter.nonce?.let { nonce -> "nonce=\"$nonce\"" }, + signatureParameter.tag?.let { tag -> "tag=\"$tag\"" }, + ).joinToString(";", prefix = "\"@signature-params\": ") + + return signatureBase + signatureParams + } +} diff --git a/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureParameter.kt b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureParameter.kt new file mode 100644 index 0000000..fb6d7d7 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/v2/SignatureParameter.kt @@ -0,0 +1,12 @@ +package dev.usbharu.httpsignature.v2 + +import java.time.Instant + +data class SignatureParameter( + val algorithm: SignatureAlgorithm?, + val keyId: String?, + val created: Instant?, + val expires: Instant?, + val nonce: String?, + val tag: String?, +)