From 28fa2a4ecfca39bc4a23962af30640f9f3af2544 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Fri, 24 Mar 2023 23:29:53 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=AC=E9=96=8B=E9=8D=B5=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/dev/usbharu/hideout/Application.kt | 2 +- src/main/kotlin/dev/usbharu/hideout/ap/Key.kt | 21 ++++++++++ .../kotlin/dev/usbharu/hideout/ap/Person.kt | 5 ++- .../hideout/service/ActivityPubUserService.kt | 42 ++++++++++++------- .../hideout/service/IUserAuthService.kt | 4 ++ .../hideout/service/UserAuthService.kt | 13 ++++-- 6 files changed, 66 insertions(+), 21 deletions(-) create mode 100644 src/main/kotlin/dev/usbharu/hideout/ap/Key.kt diff --git a/src/main/kotlin/dev/usbharu/hideout/Application.kt b/src/main/kotlin/dev/usbharu/hideout/Application.kt index e67e5b60..6645e1db 100644 --- a/src/main/kotlin/dev/usbharu/hideout/Application.kt +++ b/src/main/kotlin/dev/usbharu/hideout/Application.kt @@ -48,7 +48,7 @@ fun Application.module() { single { UserAuthRepository(get()) } single { UserAuthService(get(), get()) } single { UserService(get()) } - single { ActivityPubUserService(get()) } + single { ActivityPubUserService(get(),get()) } } configureKoin(module) val configData by inject() diff --git a/src/main/kotlin/dev/usbharu/hideout/ap/Key.kt b/src/main/kotlin/dev/usbharu/hideout/ap/Key.kt new file mode 100644 index 00000000..0c7470da --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/ap/Key.kt @@ -0,0 +1,21 @@ +package dev.usbharu.hideout.ap + +open class Key : Object{ + private var id:String? = null + private var owner:String? = null + private var publicKeyPem:String? = null + protected constructor() : super() + constructor( + type: List, + name: String, + id: String?, + owner: String?, + publicKeyPem: String? + ) : super(add(type,"Key"), name) { + this.id = id + this.owner = owner + this.publicKeyPem = publicKeyPem + } + + +} diff --git a/src/main/kotlin/dev/usbharu/hideout/ap/Person.kt b/src/main/kotlin/dev/usbharu/hideout/ap/Person.kt index 3f79d193..80d7b601 100644 --- a/src/main/kotlin/dev/usbharu/hideout/ap/Person.kt +++ b/src/main/kotlin/dev/usbharu/hideout/ap/Person.kt @@ -8,6 +8,7 @@ open class Person : Object { private var outbox:String? = null private var url:String? = null private var icon:Image? = null + private var publicKey:Key? = null protected constructor() : super() constructor( type: List = emptyList(), @@ -18,7 +19,8 @@ open class Person : Object { inbox: String?, outbox: String?, url: String?, - icon: Image? + icon: Image?, + publicKey: Key? ) : super(add(type,"Person"), name) { this.id = id this.preferredUsername = preferredUsername @@ -27,6 +29,7 @@ open class Person : Object { this.outbox = outbox this.url = url this.icon = icon + this.publicKey = publicKey } } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/ActivityPubUserService.kt b/src/main/kotlin/dev/usbharu/hideout/service/ActivityPubUserService.kt index 5d301f14..4189d2c9 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/ActivityPubUserService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/ActivityPubUserService.kt @@ -1,27 +1,39 @@ package dev.usbharu.hideout.service import dev.usbharu.hideout.ap.Image +import dev.usbharu.hideout.ap.Key import dev.usbharu.hideout.ap.Person import dev.usbharu.hideout.config.Config -class ActivityPubUserService(private val userService: UserService) { - suspend fun generateUserModel(name:String):Person{ +class ActivityPubUserService( + private val userService: UserService, + private val userAuthService: IUserAuthService +) { + suspend fun generateUserModel(name: String): Person { val userEntity = userService.findByName(name) + val userAuthEntity = userAuthService.findByUserId(userEntity.id) val userUrl = "${Config.configData.hostname}/users/$name" return Person( - emptyList(), - userEntity.name, - userUrl, - name, - userEntity.description, - "$userUrl/inbox", - "$userUrl/outbox", - userUrl, - Image( - emptyList(), - "$userUrl/icon.png", - "image/png", - "$userUrl/icon.png" + type = emptyList(), + name = userEntity.name, + id = userUrl, + preferredUsername = name, + summary = userEntity.description, + inbox = "$userUrl/inbox", + outbox = "$userUrl/outbox", + url = userUrl, + icon = Image( + type = emptyList(), + name = "$userUrl/icon.png", + mediaType = "image/png", + url = "$userUrl/icon.png" + ), + publicKey = Key( + type = emptyList(), + name = "Public Key", + id = "$userUrl/pubkey", + owner = userUrl, + publicKeyPem = userAuthEntity.publicKey ) ) } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/IUserAuthService.kt b/src/main/kotlin/dev/usbharu/hideout/service/IUserAuthService.kt index 2342835e..c53082de 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/IUserAuthService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/IUserAuthService.kt @@ -1,5 +1,7 @@ package dev.usbharu.hideout.service +import dev.usbharu.hideout.domain.model.UserAuthenticationEntity + interface IUserAuthService { fun hash(password:String): String @@ -7,4 +9,6 @@ interface IUserAuthService { suspend fun registerAccount(username: String, hash: String) suspend fun verifyAccount(username: String,password: String): Boolean + + suspend fun findByUserId(userId: Long):UserAuthenticationEntity } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/UserAuthService.kt b/src/main/kotlin/dev/usbharu/hideout/service/UserAuthService.kt index a8baf8e2..2b65c70b 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/UserAuthService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/UserAuthService.kt @@ -2,6 +2,7 @@ package dev.usbharu.hideout.service import dev.usbharu.hideout.domain.model.User import dev.usbharu.hideout.domain.model.UserAuthentication +import dev.usbharu.hideout.domain.model.UserAuthenticationEntity import dev.usbharu.hideout.exception.UserNotFoundException import dev.usbharu.hideout.repository.IUserAuthRepository import dev.usbharu.hideout.repository.IUserRepository @@ -61,6 +62,10 @@ class UserAuthService( return userAuthEntity.hash == hash(password) } + override suspend fun findByUserId(userId: Long): UserAuthenticationEntity { + return userAuthRepository.findByUserId(userId) ?: throw UserNotFoundException("$userId was not found") + } + private fun generateKeyPair(): KeyPair { val keyPairGenerator = KeyPairGenerator.getInstance("RSA") keyPairGenerator.initialize(1024) @@ -69,14 +74,14 @@ class UserAuthService( private fun RSAPublicKey.toPem(): String { - return "-----BEGIN RSA PUBLIC KEY-----\n" + - Base64.getEncoder().encodeToString(encoded) + "\n" + + return "-----BEGIN RSA PUBLIC KEY-----" + + Base64.getEncoder().encodeToString(encoded) + "-----END RSA PUBLIC KEY-----" } private fun RSAPrivateKey.toPem(): String { - return "-----BEGIN RSA PRIVATE KEY-----\n" + - Base64.getEncoder().encodeToString(encoded) + "\n" + + return "-----BEGIN RSA PRIVATE KEY-----" + + Base64.getEncoder().encodeToString(encoded) + "-----END RSA PRIVATE KEY-----" }