From 4be93fea861cccf217c2e2025177ec8f1e76d6c1 Mon Sep 17 00:00:00 2001
From: usbharu <i@usbharu.dev>
Date: Mon, 24 Feb 2025 23:42:46 +0900
Subject: [PATCH] =?UTF-8?q?feat:=20/.well-known/nodeinfo=E3=82=92=E4=BD=9C?=
 =?UTF-8?q?=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../application/nodeinfo/Nodeinfo2_0.kt       |  3 +++
 .../config/ActivityPubSecurityConfig.kt       |  1 +
 .../wellknown/NodeinfoController.kt           | 23 +++++++++++++++++++
 .../activitypub/interfaces/wellknown/XRD.kt   |  7 +++---
 .../hideout/core/config/SecurityConfig.kt     |  2 +-
 5 files changed, 32 insertions(+), 4 deletions(-)
 create mode 100644 hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt
 create mode 100644 hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt

diff --git a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt
new file mode 100644
index 00000000..5809ec69
--- /dev/null
+++ b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt
@@ -0,0 +1,3 @@
+package dev.usbharu.hideout.activitypub.application.nodeinfo
+
+data class Nodeinfo2_0()
\ No newline at end of file
diff --git a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/config/ActivityPubSecurityConfig.kt b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/config/ActivityPubSecurityConfig.kt
index b445a086..9dfbbe4c 100644
--- a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/config/ActivityPubSecurityConfig.kt
+++ b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/config/ActivityPubSecurityConfig.kt
@@ -24,6 +24,7 @@ class ActivityPubSecurityConfig {
             )
             authorizeHttpRequests {
                 authorize(GET, "/.well-known/**", permitAll)
+                authorize(GET, "/nodeinfo/**", permitAll)
                 authorize(GET, "/error", permitAll)
                 authorize(POST, "/inbox", permitAll)
                 authorize(POST, "/users/{username}/inbox", permitAll)
diff --git a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt
new file mode 100644
index 00000000..c2c63e27
--- /dev/null
+++ b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt
@@ -0,0 +1,23 @@
+package dev.usbharu.hideout.activitypub.interfaces.wellknown
+
+import dev.usbharu.hideout.core.config.ApplicationConfig
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@RequestMapping("/.well-known")
+class NodeinfoController(private val applicationConfig: ApplicationConfig) {
+    @GetMapping("/nodeinfo", produces = ["application/json"])
+    suspend fun nodeinfo(): XRD = XRD(
+        listOf(
+            Link(
+                "http://nodeinfo.diaspora.software/ns/schema/2.1",
+                href = applicationConfig.url.resolve("/nodeinfo/2.1").toString()
+            ), Link(
+                "http://nodeinfo.diaspora.software/ns/schema/2.0",
+                href = applicationConfig.url.resolve("/nodeinfo/2.0").toString()
+            )
+        )
+    )
+}
\ No newline at end of file
diff --git a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/XRD.kt b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/XRD.kt
index e6617c3f..02a9792d 100644
--- a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/XRD.kt
+++ b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/XRD.kt
@@ -24,8 +24,9 @@ data class XRD(
 data class Link(
     @JacksonXmlProperty(localName = "rel", isAttribute = true) val rel: String,
     @JsonInclude(JsonInclude.Include.NON_NULL)
-    @JacksonXmlProperty(localName = "template", isAttribute = true) val template: String?,
-    @JacksonXmlProperty(localName = "type", isAttribute = true) val type: String,
+    @JacksonXmlProperty(localName = "template", isAttribute = true) val template: String? = null,
     @JsonInclude(JsonInclude.Include.NON_NULL)
-    @JacksonXmlProperty(localName = "href", isAttribute = true) val href: String?,
+    @JacksonXmlProperty(localName = "type", isAttribute = true) val type: String? = null,
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    @JacksonXmlProperty(localName = "href", isAttribute = true) val href: String? = null,
 )
diff --git a/hideout/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/SecurityConfig.kt b/hideout/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/SecurityConfig.kt
index 9a1ea2da..97d62803 100644
--- a/hideout/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/SecurityConfig.kt
+++ b/hideout/hideout-core/src/main/kotlin/dev/usbharu/hideout/core/config/SecurityConfig.kt
@@ -90,7 +90,7 @@ class SecurityConfig {
                 authorize("/error", permitAll)
                 authorize("/auth/sign_in", permitAll)
                 authorize(GET, "/.well-known/**", permitAll)
-                authorize(GET, "/nodeinfo/2.0", permitAll)
+                authorize(GET, "/nodeinfo/**", permitAll)
 
                 authorize(GET, "/auth/sign_up", hasRole("ANONYMOUS"))
                 authorize(POST, "/auth/sign_up", permitAll)