diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/common/ApJobServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/common/ApJobServiceImpl.kt index 0020fbd0..5da0356c 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/common/ApJobServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/common/ApJobServiceImpl.kt @@ -1,28 +1,11 @@ package dev.usbharu.hideout.activitypub.service.common import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.module.kotlin.readValue -import dev.usbharu.hideout.activitypub.domain.model.Follow -import dev.usbharu.hideout.activitypub.service.activity.accept.APAcceptServiceImpl -import dev.usbharu.hideout.activitypub.service.activity.create.APCreateServiceImpl -import dev.usbharu.hideout.activitypub.service.activity.delete.APReceiveDeleteServiceImpl import dev.usbharu.hideout.activitypub.service.activity.follow.APReceiveFollowJobService -import dev.usbharu.hideout.activitypub.service.activity.follow.APReceiveFollowServiceImpl -import dev.usbharu.hideout.activitypub.service.activity.like.APLikeServiceImpl import dev.usbharu.hideout.activitypub.service.activity.like.ApReactionJobService -import dev.usbharu.hideout.activitypub.service.activity.undo.APUndoServiceImpl import dev.usbharu.hideout.activitypub.service.objects.note.ApNoteJobService -import dev.usbharu.hideout.activitypub.service.objects.user.APUserService -import dev.usbharu.hideout.application.external.Transaction -import dev.usbharu.hideout.core.domain.exception.FailedToGetResourcesException +import dev.usbharu.hideout.activitypub.service.tmp.InboxJobProcessor import dev.usbharu.hideout.core.external.job.* -import dev.usbharu.hideout.core.query.UserQueryService -import dev.usbharu.hideout.util.RsaUtil -import dev.usbharu.httpsignature.common.HttpHeaders -import dev.usbharu.httpsignature.common.HttpRequest -import dev.usbharu.httpsignature.common.PublicKey -import dev.usbharu.httpsignature.verify.DefaultSignatureHeaderParser -import dev.usbharu.httpsignature.verify.RsaSha256HttpSignatureVerifier import kjob.core.dsl.JobContextWithProps import kjob.core.job.JobProps import org.slf4j.LoggerFactory @@ -34,18 +17,8 @@ class ApJobServiceImpl( private val apReceiveFollowJobService: APReceiveFollowJobService, private val apNoteJobService: ApNoteJobService, private val apReactionJobService: ApReactionJobService, - private val APAcceptServiceImpl: APAcceptServiceImpl, - private val APReceiveFollowServiceImpl: APReceiveFollowServiceImpl, - private val APCreateServiceImpl: APCreateServiceImpl, - private val APLikeServiceImpl: APLikeServiceImpl, - private val APUndoServiceImpl: APUndoServiceImpl, - private val APReceiveDeleteServiceImpl: APReceiveDeleteServiceImpl, @Qualifier("activitypub") private val objectMapper: ObjectMapper, - private val httpSignatureVerifier: RsaSha256HttpSignatureVerifier, - private val signatureHeaderParser: DefaultSignatureHeaderParser, - private val apUserService: APUserService, - private val userQueryService: UserQueryService, - private val transaction: Transaction + private val inboxJobProcessor: InboxJobProcessor ) : ApJobService { @Suppress("REDUNDANT_ELSE_IN_WHEN") override suspend fun processActivity(job: JobContextWithProps, hideoutJob: HideoutJob) { @@ -55,47 +28,7 @@ class ApJobServiceImpl( // Springで作成されるプロキシの都合上パターンマッチングが壊れるので必須 when (hideoutJob) { is InboxJob -> { - val httpRequestString = (job.props as JobProps)[InboxJob.httpRequest] - println(httpRequestString) - val headerString = (job.props as JobProps)[InboxJob.headers] - - val readValue = objectMapper.readValue>>(headerString) - - val httpRequest = - objectMapper.readValue(httpRequestString).copy(headers = HttpHeaders(readValue)) - val signature = signatureHeaderParser.parse(httpRequest.headers) - - val publicKey = transaction.transaction { - try { - userQueryService.findByKeyId(signature.keyId) - } catch (e: FailedToGetResourcesException) { - apUserService.fetchPersonWithEntity(signature.keyId).second - }.publicKey - } - - httpSignatureVerifier.verify( - httpRequest, - PublicKey(RsaUtil.decodeRsaPublicKeyPem(publicKey), signature.keyId) - ) - - val typeString = (job.props as JobProps)[InboxJob.type] - val json = (job.props as JobProps)[InboxJob.json] - val type = ActivityType.valueOf(typeString) - when (type) { - ActivityType.Accept -> APAcceptServiceImpl.receiveAccept(objectMapper.readValue(json)) - ActivityType.Follow -> - APReceiveFollowServiceImpl - .receiveFollow(objectMapper.readValue(json, Follow::class.java)) - - ActivityType.Create -> APCreateServiceImpl.receiveCreate(objectMapper.readValue(json)) - ActivityType.Like -> APLikeServiceImpl.receiveLike(objectMapper.readValue(json)) - ActivityType.Undo -> APUndoServiceImpl.receiveUndo(objectMapper.readValue(json)) - ActivityType.Delete -> APReceiveDeleteServiceImpl.receiveDelete(objectMapper.readValue(json)) - - else -> { - throw IllegalArgumentException("$type is not supported.") - } - } + inboxJobProcessor.process(job.props as JobProps) } is ReceiveFollowJob -> { diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/tmp/InboxJobProcessor.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/tmp/InboxJobProcessor.kt index 1489765c..99ad3fb9 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/tmp/InboxJobProcessor.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/tmp/InboxJobProcessor.kt @@ -17,7 +17,9 @@ import dev.usbharu.httpsignature.verify.Signature import dev.usbharu.httpsignature.verify.SignatureHeaderParser import kjob.core.job.JobProps import org.slf4j.LoggerFactory +import org.springframework.stereotype.Service +@Service class InboxJobProcessor( private val activityPubProcessorList: List>, private val objectMapper: ObjectMapper,