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?,
+)