mirror of https://github.com/usbharu/Hideout.git
refactor: Ktor使用箇所を削除
This commit is contained in:
parent
887249c68d
commit
70ba6ae4f8
|
@ -1,172 +0,0 @@
|
||||||
package dev.usbharu.hideout
|
|
||||||
|
|
||||||
import com.auth0.jwk.JwkProvider
|
|
||||||
import com.auth0.jwk.JwkProviderBuilder
|
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude
|
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature
|
|
||||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
|
||||||
import dev.usbharu.hideout.config.CharacterLimit
|
|
||||||
import dev.usbharu.hideout.config.Config
|
|
||||||
import dev.usbharu.hideout.config.ConfigData
|
|
||||||
import dev.usbharu.hideout.domain.model.job.DeliverPostJob
|
|
||||||
import dev.usbharu.hideout.domain.model.job.DeliverReactionJob
|
|
||||||
import dev.usbharu.hideout.domain.model.job.DeliverRemoveReactionJob
|
|
||||||
import dev.usbharu.hideout.domain.model.job.ReceiveFollowJob
|
|
||||||
import dev.usbharu.hideout.plugins.*
|
|
||||||
import dev.usbharu.hideout.query.FollowerQueryService
|
|
||||||
import dev.usbharu.hideout.query.UserQueryService
|
|
||||||
import dev.usbharu.hideout.routing.register
|
|
||||||
import dev.usbharu.hideout.service.ap.APService
|
|
||||||
import dev.usbharu.hideout.service.ap.APUserService
|
|
||||||
import dev.usbharu.hideout.service.api.PostApiService
|
|
||||||
import dev.usbharu.hideout.service.api.UserApiService
|
|
||||||
import dev.usbharu.hideout.service.api.UserAuthApiService
|
|
||||||
import dev.usbharu.hideout.service.api.WebFingerApiService
|
|
||||||
import dev.usbharu.hideout.service.auth.HttpSignatureVerifyService
|
|
||||||
import dev.usbharu.hideout.service.core.*
|
|
||||||
import dev.usbharu.hideout.service.job.JobQueueParentService
|
|
||||||
import dev.usbharu.hideout.service.job.KJobJobQueueParentService
|
|
||||||
import dev.usbharu.hideout.service.user.UserService
|
|
||||||
import dev.usbharu.kjob.exposed.ExposedKJob
|
|
||||||
import io.ktor.client.*
|
|
||||||
import io.ktor.client.engine.cio.*
|
|
||||||
import io.ktor.client.plugins.logging.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import kjob.core.kjob
|
|
||||||
import kotlinx.coroutines.runBlocking
|
|
||||||
import org.jetbrains.exposed.sql.Database
|
|
||||||
import org.koin.ksp.generated.module
|
|
||||||
import org.koin.ktor.ext.inject
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun main(args: Array<String>): Unit = io.ktor.server.cio.EngineMain.main(args)
|
|
||||||
|
|
||||||
val Application.property: Application.(propertyName: String) -> String
|
|
||||||
get() = {
|
|
||||||
environment.config.property(it).getString()
|
|
||||||
}
|
|
||||||
|
|
||||||
val Application.propertyOrNull: Application.(propertyName: String) -> String?
|
|
||||||
get() = {
|
|
||||||
environment.config.propertyOrNull(it)?.getString()
|
|
||||||
}
|
|
||||||
|
|
||||||
// application.conf references the main function. This annotation prevents the IDE from marking it as unused.
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
@Suppress("unused", "LongMethod")
|
|
||||||
fun Application.parent() {
|
|
||||||
Config.configData = ConfigData(
|
|
||||||
url = property("hideout.url"),
|
|
||||||
objectMapper = jacksonObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
|
|
||||||
.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
|
|
||||||
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false),
|
|
||||||
characterLimit = CharacterLimit(
|
|
||||||
general = CharacterLimit.General.of(
|
|
||||||
url = propertyOrNull("hideout.character-limit.general.url")?.toIntOrNull(),
|
|
||||||
domain = propertyOrNull("hideout.character-limit.general.domain")?.toIntOrNull(),
|
|
||||||
publicKey = propertyOrNull("hideout.character-limit.general.publicKey")?.toIntOrNull(),
|
|
||||||
privateKey = propertyOrNull("hideout.character-limit.general.privateKey")?.toIntOrNull()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val module = org.koin.dsl.module {
|
|
||||||
single<Database> {
|
|
||||||
Database.connect(
|
|
||||||
url = property("hideout.database.url"),
|
|
||||||
driver = property("hideout.database.driver"),
|
|
||||||
user = property("hideout.database.username"),
|
|
||||||
password = property("hideout.database.password")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
single<JobQueueParentService> {
|
|
||||||
val kJobJobQueueService = KJobJobQueueParentService(get())
|
|
||||||
kJobJobQueueService.init(emptyList())
|
|
||||||
kJobJobQueueService
|
|
||||||
}
|
|
||||||
single<HttpClient> {
|
|
||||||
HttpClient(CIO).config {
|
|
||||||
install(Logging) {
|
|
||||||
logger = Logger.DEFAULT
|
|
||||||
level = LogLevel.INFO
|
|
||||||
}
|
|
||||||
install(httpSignaturePlugin) {
|
|
||||||
keyMap = KtorKeyMap(get(), get())
|
|
||||||
}
|
|
||||||
expectSuccess = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
single<IdGenerateService> { TwitterSnowflakeIdGenerateService }
|
|
||||||
single<JwkProvider> {
|
|
||||||
JwkProviderBuilder(Config.configData.url).cached(
|
|
||||||
10,
|
|
||||||
24,
|
|
||||||
TimeUnit.HOURS
|
|
||||||
)
|
|
||||||
.rateLimited(10, 1, TimeUnit.MINUTES).build()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
configureKoin(module, HideoutModule().module)
|
|
||||||
configureStatusPages()
|
|
||||||
runBlocking {
|
|
||||||
inject<ServerInitialiseService>().value.init()
|
|
||||||
}
|
|
||||||
configureCompression()
|
|
||||||
configureHTTP()
|
|
||||||
configureStaticRouting()
|
|
||||||
configureMonitoring()
|
|
||||||
configureSerialization()
|
|
||||||
register(inject<UserApiService>().value)
|
|
||||||
configureSecurity(
|
|
||||||
|
|
||||||
inject<JwkProvider>().value,
|
|
||||||
inject<MetaService>().value
|
|
||||||
)
|
|
||||||
configureRouting(
|
|
||||||
httpSignatureVerifyService = inject<HttpSignatureVerifyService>().value,
|
|
||||||
apService = inject<APService>().value,
|
|
||||||
userService = inject<UserService>().value,
|
|
||||||
apUserService = inject<APUserService>().value,
|
|
||||||
postService = inject<PostApiService>().value,
|
|
||||||
userApiService = inject<UserApiService>().value,
|
|
||||||
userQueryService = inject<UserQueryService>().value,
|
|
||||||
followerQueryService = inject<FollowerQueryService>().value,
|
|
||||||
userAuthApiService = inject<UserAuthApiService>().value,
|
|
||||||
webFingerApiService = inject<WebFingerApiService>().value,
|
|
||||||
transaction = inject<Transaction>().value
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
@Suppress("unused")
|
|
||||||
fun Application.worker() {
|
|
||||||
val kJob = kjob(ExposedKJob) {
|
|
||||||
connectionDatabase = inject<Database>().value
|
|
||||||
}.start()
|
|
||||||
|
|
||||||
val apService = inject<APService>().value
|
|
||||||
|
|
||||||
kJob.register(ReceiveFollowJob) {
|
|
||||||
execute {
|
|
||||||
apService.processActivity(this, it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
kJob.register(DeliverPostJob) {
|
|
||||||
execute {
|
|
||||||
apService.processActivity(this, it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
kJob.register(DeliverReactionJob) {
|
|
||||||
execute {
|
|
||||||
apService.processActivity(this, it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
kJob.register(DeliverRemoveReactionJob) {
|
|
||||||
execute {
|
|
||||||
apService.processActivity(this, it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -11,8 +11,6 @@ import io.ktor.client.plugins.api.*
|
||||||
import io.ktor.client.request.*
|
import io.ktor.client.request.*
|
||||||
import io.ktor.client.statement.*
|
import io.ktor.client.statement.*
|
||||||
import io.ktor.http.*
|
import io.ktor.http.*
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import tech.barbero.http.message.signing.HttpMessage
|
import tech.barbero.http.message.signing.HttpMessage
|
||||||
import tech.barbero.http.message.signing.HttpMessageSigner
|
import tech.barbero.http.message.signing.HttpMessageSigner
|
||||||
|
@ -28,12 +26,6 @@ import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.crypto.SecretKey
|
import javax.crypto.SecretKey
|
||||||
|
|
||||||
suspend fun <T : JsonLd> ApplicationCall.respondAp(message: T, status: HttpStatusCode = HttpStatusCode.OK) {
|
|
||||||
message.context += "https://www.w3.org/ns/activitystreams"
|
|
||||||
val activityJson = Config.configData.objectMapper.writeValueAsString(message)
|
|
||||||
respondText(activityJson, ContentType.Application.Activity, status)
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun HttpClient.postAp(urlString: String, username: String, jsonLd: JsonLd): HttpResponse {
|
suspend fun HttpClient.postAp(urlString: String, username: String, jsonLd: JsonLd): HttpResponse {
|
||||||
jsonLd.context += "https://www.w3.org/ns/activitystreams"
|
jsonLd.context += "https://www.w3.org/ns/activitystreams"
|
||||||
return this.post(urlString) {
|
return this.post(urlString) {
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.plugins.compression.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.configureCompression() {
|
|
||||||
install(Compression) {
|
|
||||||
gzip {
|
|
||||||
matchContentType(ContentType.Application.JavaScript)
|
|
||||||
priority = 1.0
|
|
||||||
}
|
|
||||||
deflate {
|
|
||||||
matchContentType(ContentType.Application.JavaScript)
|
|
||||||
priority = 10.0
|
|
||||||
minimumSize(1024) // condition
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.plugins.defaultheaders.*
|
|
||||||
import io.ktor.server.plugins.forwardedheaders.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.configureHTTP() {
|
|
||||||
// install(CORS) {
|
|
||||||
// allowMethod(HttpMethod.Options)
|
|
||||||
// allowMethod(HttpMethod.Put)
|
|
||||||
// allowMethod(HttpMethod.Delete)
|
|
||||||
// allowMethod(HttpMethod.Patch)
|
|
||||||
// allowHeader(HttpHeaders.Authorization)
|
|
||||||
// allow
|
|
||||||
// allowHeader("MyCustomHeader")
|
|
||||||
// anyHost() // @TODO: Don't do this in production if possible. Try to limit it.
|
|
||||||
// }
|
|
||||||
install(DefaultHeaders) {
|
|
||||||
header("X-Engine", "Ktor") // will send this header with each response
|
|
||||||
}
|
|
||||||
install(ForwardedHeaders) // WARNING: for security, do not include this if not behind a reverse proxy
|
|
||||||
install(XForwardedHeaders) // WARNING: for security, do not include this if not behind a reverse proxy
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import org.koin.core.module.Module
|
|
||||||
import org.koin.ktor.plugin.Koin
|
|
||||||
import org.koin.logger.slf4jLogger
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.configureKoin(vararg module: Module) {
|
|
||||||
install(Koin) {
|
|
||||||
slf4jLogger()
|
|
||||||
modules(*module)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.plugins.callloging.*
|
|
||||||
import org.slf4j.event.Level
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.configureMonitoring() {
|
|
||||||
install(CallLogging) {
|
|
||||||
level = Level.INFO
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.query.FollowerQueryService
|
|
||||||
import dev.usbharu.hideout.query.UserQueryService
|
|
||||||
import dev.usbharu.hideout.routing.activitypub.inbox
|
|
||||||
import dev.usbharu.hideout.routing.activitypub.outbox
|
|
||||||
import dev.usbharu.hideout.routing.activitypub.usersAP
|
|
||||||
import dev.usbharu.hideout.routing.api.internal.v1.auth
|
|
||||||
import dev.usbharu.hideout.routing.api.internal.v1.posts
|
|
||||||
import dev.usbharu.hideout.routing.api.internal.v1.users
|
|
||||||
import dev.usbharu.hideout.routing.wellknown.webfinger
|
|
||||||
import dev.usbharu.hideout.service.ap.APService
|
|
||||||
import dev.usbharu.hideout.service.ap.APUserService
|
|
||||||
import dev.usbharu.hideout.service.api.PostApiService
|
|
||||||
import dev.usbharu.hideout.service.api.UserApiService
|
|
||||||
import dev.usbharu.hideout.service.api.UserAuthApiService
|
|
||||||
import dev.usbharu.hideout.service.api.WebFingerApiService
|
|
||||||
import dev.usbharu.hideout.service.auth.HttpSignatureVerifyService
|
|
||||||
import dev.usbharu.hideout.service.core.Transaction
|
|
||||||
import dev.usbharu.hideout.service.user.UserService
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.plugins.autohead.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
@Suppress("LongParameterList")
|
|
||||||
fun Application.configureRouting(
|
|
||||||
httpSignatureVerifyService: HttpSignatureVerifyService,
|
|
||||||
apService: APService,
|
|
||||||
userService: UserService,
|
|
||||||
apUserService: APUserService,
|
|
||||||
postService: PostApiService,
|
|
||||||
userApiService: UserApiService,
|
|
||||||
userQueryService: UserQueryService,
|
|
||||||
followerQueryService: FollowerQueryService,
|
|
||||||
userAuthApiService: UserAuthApiService,
|
|
||||||
webFingerApiService: WebFingerApiService,
|
|
||||||
transaction: Transaction
|
|
||||||
) {
|
|
||||||
install(AutoHeadResponse)
|
|
||||||
routing {
|
|
||||||
inbox(httpSignatureVerifyService, apService)
|
|
||||||
outbox()
|
|
||||||
usersAP(apUserService, userQueryService, followerQueryService, transaction)
|
|
||||||
webfinger(webFingerApiService)
|
|
||||||
route("/api/internal/v1") {
|
|
||||||
posts(postService)
|
|
||||||
users(userService, userApiService)
|
|
||||||
auth(userAuthApiService)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import com.auth0.jwk.JwkProvider
|
|
||||||
import dev.usbharu.hideout.config.Config
|
|
||||||
import dev.usbharu.hideout.service.core.MetaService
|
|
||||||
import dev.usbharu.hideout.util.JsonWebKeyUtil
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.auth.*
|
|
||||||
import io.ktor.server.auth.jwt.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
const val TOKEN_AUTH = "jwt-auth"
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
@Suppress("MagicNumber")
|
|
||||||
fun Application.configureSecurity(
|
|
||||||
jwkProvider: JwkProvider,
|
|
||||||
metaService: MetaService
|
|
||||||
) {
|
|
||||||
val issuer = Config.configData.url
|
|
||||||
install(Authentication) {
|
|
||||||
jwt(TOKEN_AUTH) {
|
|
||||||
verifier(jwkProvider, issuer) {
|
|
||||||
acceptLeeway(3)
|
|
||||||
}
|
|
||||||
validate { jwtCredential ->
|
|
||||||
val uid = jwtCredential.payload.getClaim("uid")
|
|
||||||
if (uid.isMissing) {
|
|
||||||
return@validate null
|
|
||||||
}
|
|
||||||
if (uid.asLong() == null) {
|
|
||||||
return@validate null
|
|
||||||
}
|
|
||||||
return@validate JWTPrincipal(jwtCredential.payload)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
routing {
|
|
||||||
get("/.well-known/jwks.json") {
|
|
||||||
//language=JSON
|
|
||||||
val jwt = metaService.getJwtMeta()
|
|
||||||
call.respondText(
|
|
||||||
contentType = ContentType.Application.Json,
|
|
||||||
text = JsonWebKeyUtil.publicKeyToJwk(jwt.publicKey, jwt.kid.toString())
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonInclude
|
|
||||||
import com.fasterxml.jackson.annotation.JsonSetter
|
|
||||||
import com.fasterxml.jackson.annotation.Nulls
|
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature
|
|
||||||
import io.ktor.serialization.jackson.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.plugins.contentnegotiation.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.configureSerialization() {
|
|
||||||
install(ContentNegotiation) {
|
|
||||||
jackson {
|
|
||||||
enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
|
|
||||||
setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
|
|
||||||
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
|
|
||||||
configOverride(List::class.java).setSetterInfo(JsonSetter.Value.forContentNulls(Nulls.AS_EMPTY))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.http.content.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.configureStaticRouting() {
|
|
||||||
routing {
|
|
||||||
get("/") {
|
|
||||||
call.respondText(
|
|
||||||
String.javaClass.classLoader.getResourceAsStream("static/index.html").readAllBytes().decodeToString(),
|
|
||||||
contentType = ContentType.Text.Html
|
|
||||||
)
|
|
||||||
}
|
|
||||||
static("/") {
|
|
||||||
resources("static")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
package dev.usbharu.hideout.plugins
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.exception.InvalidUsernameOrPasswordException
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.plugins.statuspages.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.configureStatusPages() {
|
|
||||||
install(StatusPages) {
|
|
||||||
exception<IllegalArgumentException> { call, cause ->
|
|
||||||
call.respondText(text = "400: $cause", status = HttpStatusCode.BadRequest)
|
|
||||||
call.application.log.warn("Bad Request", cause)
|
|
||||||
}
|
|
||||||
exception<InvalidUsernameOrPasswordException> { call, _ ->
|
|
||||||
call.respond(HttpStatusCode.Unauthorized)
|
|
||||||
}
|
|
||||||
exception<Throwable> { call, cause ->
|
|
||||||
call.respondText(text = "500: ${cause.stackTraceToString()}", status = HttpStatusCode.InternalServerError)
|
|
||||||
call.application.log.error("Internal Server Error", cause)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.service.api.UserApiService
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.auth.*
|
|
||||||
import io.ktor.server.request.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Application.register(userApiService: UserApiService) {
|
|
||||||
routing {
|
|
||||||
get("/register") {
|
|
||||||
val principal = call.principal<UserIdPrincipal>()
|
|
||||||
if (principal != null) {
|
|
||||||
call.respondRedirect("/users/${principal.name}")
|
|
||||||
}
|
|
||||||
call.respondText(ContentType.Text.Html) {
|
|
||||||
//language=HTML
|
|
||||||
"""
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<form method='post' action=''>
|
|
||||||
<input type='text' name='username' value=''>
|
|
||||||
<input type='password' name='password'>
|
|
||||||
<input type="submit">
|
|
||||||
</form>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
""".trimIndent()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
post("/register") {
|
|
||||||
val parameters = call.receiveParameters()
|
|
||||||
val password = parameters["password"] ?: return@post call.respondRedirect("/register")
|
|
||||||
val username = parameters["username"] ?: return@post call.respondRedirect("/register")
|
|
||||||
userApiService.createUser(username, password)
|
|
||||||
call.respondRedirect("/users/$username")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,77 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.activitypub
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.config.Config
|
|
||||||
import dev.usbharu.hideout.domain.model.ActivityPubObjectResponse
|
|
||||||
import dev.usbharu.hideout.domain.model.ActivityPubStringResponse
|
|
||||||
import dev.usbharu.hideout.exception.HttpSignatureVerifyException
|
|
||||||
import dev.usbharu.hideout.service.auth.HttpSignatureVerifyService
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.request.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Routing.inbox(
|
|
||||||
httpSignatureVerifyService: HttpSignatureVerifyService,
|
|
||||||
apService: dev.usbharu.hideout.service.ap.APService
|
|
||||||
) {
|
|
||||||
route("/inbox") {
|
|
||||||
get {
|
|
||||||
call.respond(HttpStatusCode.MethodNotAllowed)
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
if (httpSignatureVerifyService.verify(call.request.headers).not()) {
|
|
||||||
throw HttpSignatureVerifyException()
|
|
||||||
}
|
|
||||||
val json = call.receiveText()
|
|
||||||
call.application.log.trace("Received: $json")
|
|
||||||
val activityTypes = apService.parseActivity(json)
|
|
||||||
call.application.log.debug("ActivityTypes: ${activityTypes.name}")
|
|
||||||
val response = apService.processActivity(json, activityTypes)
|
|
||||||
when (response) {
|
|
||||||
is ActivityPubObjectResponse -> call.respond(
|
|
||||||
response.httpStatusCode,
|
|
||||||
Config.configData.objectMapper.writeValueAsString(
|
|
||||||
response.message.apply {
|
|
||||||
context =
|
|
||||||
listOf("https://www.w3.org/ns/activitystreams")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
is ActivityPubStringResponse -> call.respond(response.httpStatusCode, response.message)
|
|
||||||
null -> call.respond(HttpStatusCode.NotImplemented)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
route("/users/{name}/inbox") {
|
|
||||||
get {
|
|
||||||
call.respond(HttpStatusCode.MethodNotAllowed)
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
if (httpSignatureVerifyService.verify(call.request.headers).not()) {
|
|
||||||
throw HttpSignatureVerifyException()
|
|
||||||
}
|
|
||||||
val json = call.receiveText()
|
|
||||||
call.application.log.trace("Received: $json")
|
|
||||||
val activityTypes = apService.parseActivity(json)
|
|
||||||
call.application.log.debug("ActivityTypes: ${activityTypes.name}")
|
|
||||||
val response = apService.processActivity(json, activityTypes)
|
|
||||||
when (response) {
|
|
||||||
is ActivityPubObjectResponse -> call.respond(
|
|
||||||
response.httpStatusCode,
|
|
||||||
Config.configData.objectMapper.writeValueAsString(
|
|
||||||
response.message.apply {
|
|
||||||
context =
|
|
||||||
listOf("https://www.w3.org/ns/activitystreams")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
is ActivityPubStringResponse -> call.respond(response.httpStatusCode, response.message)
|
|
||||||
null -> call.respond(HttpStatusCode.NotImplemented)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.activitypub
|
|
||||||
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Routing.outbox() {
|
|
||||||
route("/outbox") {
|
|
||||||
get {
|
|
||||||
call.respond(HttpStatusCode.NotImplemented)
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
call.respond(HttpStatusCode.NotImplemented)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
route("/users/{name}/outbox") {
|
|
||||||
get {
|
|
||||||
call.respond(HttpStatusCode.NotImplemented)
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
call.respond(HttpStatusCode.NotImplemented)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.activitypub
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.config.Config
|
|
||||||
import dev.usbharu.hideout.exception.ParameterNotExistException
|
|
||||||
import dev.usbharu.hideout.plugins.respondAp
|
|
||||||
import dev.usbharu.hideout.query.FollowerQueryService
|
|
||||||
import dev.usbharu.hideout.query.UserQueryService
|
|
||||||
import dev.usbharu.hideout.service.ap.APUserService
|
|
||||||
import dev.usbharu.hideout.service.core.Transaction
|
|
||||||
import dev.usbharu.hideout.util.HttpUtil.Activity
|
|
||||||
import dev.usbharu.hideout.util.HttpUtil.JsonLd
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.request.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Routing.usersAP(
|
|
||||||
apUserService: APUserService,
|
|
||||||
userQueryService: UserQueryService,
|
|
||||||
followerQueryService: FollowerQueryService,
|
|
||||||
transaction: Transaction
|
|
||||||
) {
|
|
||||||
route("/users/{name}") {
|
|
||||||
createChild(ContentTypeRouteSelector(ContentType.Application.Activity, ContentType.Application.JsonLd)).handle {
|
|
||||||
call.application.log.debug("Signature: ${call.request.header("Signature")}")
|
|
||||||
call.application.log.debug("Authorization: ${call.request.header("Authorization")}")
|
|
||||||
val name =
|
|
||||||
call.parameters["name"] ?: throw ParameterNotExistException("Parameter(name='name') does not exist.")
|
|
||||||
val person = apUserService.getPersonByName(name)
|
|
||||||
return@handle call.respondAp(person, HttpStatusCode.OK)
|
|
||||||
}
|
|
||||||
get {
|
|
||||||
// TODO: 暫定処置なので治す
|
|
||||||
transaction.transaction {
|
|
||||||
val userEntity = userQueryService.findByNameAndDomain(
|
|
||||||
call.parameters["name"]
|
|
||||||
?: throw ParameterNotExistException("Parameter(name='name') does not exist."),
|
|
||||||
Config.configData.domain
|
|
||||||
)
|
|
||||||
val personByName = apUserService.getPersonByName(userEntity.name)
|
|
||||||
call.respondText(
|
|
||||||
userEntity.toString() + "\n" + followerQueryService.findFollowersById(userEntity.id) +
|
|
||||||
"\n" + Config.configData.objectMapper.writeValueAsString(
|
|
||||||
personByName
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
class ContentTypeRouteSelector(private vararg val contentType: ContentType) : RouteSelector() {
|
|
||||||
override fun evaluate(context: RoutingResolveContext, segmentIndex: Int): RouteSelectorEvaluation {
|
|
||||||
context.call.application.log.debug("Accept: ${context.call.request.accept()}")
|
|
||||||
val requestContentType = context.call.request.accept() ?: return RouteSelectorEvaluation.FailedParameter
|
|
||||||
return if (requestContentType.split(",").any { contentType.any { contentType -> contentType.match(it) } }) {
|
|
||||||
RouteSelectorEvaluation.Constant
|
|
||||||
} else {
|
|
||||||
RouteSelectorEvaluation.FailedParameter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.api.internal.v1
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken
|
|
||||||
import dev.usbharu.hideout.domain.model.hideout.form.UserLogin
|
|
||||||
import dev.usbharu.hideout.plugins.TOKEN_AUTH
|
|
||||||
import dev.usbharu.hideout.service.api.UserAuthApiService
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.auth.*
|
|
||||||
import io.ktor.server.auth.jwt.*
|
|
||||||
import io.ktor.server.request.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Route.auth(userAuthApiService: UserAuthApiService) {
|
|
||||||
post("/login") {
|
|
||||||
val loginUser = call.receive<UserLogin>()
|
|
||||||
return@post call.respond(userAuthApiService.login(loginUser.username, loginUser.password))
|
|
||||||
}
|
|
||||||
|
|
||||||
post("/refresh-token") {
|
|
||||||
val refreshToken = call.receive<RefreshToken>()
|
|
||||||
return@post call.respond(userAuthApiService.refreshToken(refreshToken))
|
|
||||||
}
|
|
||||||
authenticate(TOKEN_AUTH) {
|
|
||||||
get("/auth-check") {
|
|
||||||
val principal = call.principal<JWTPrincipal>() ?: throw IllegalStateException("no principal")
|
|
||||||
val username = principal.payload.getClaim("uid")
|
|
||||||
call.respondText("Hello $username")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,102 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.api.internal.v1
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.domain.model.hideout.form.Post
|
|
||||||
import dev.usbharu.hideout.domain.model.hideout.form.Reaction
|
|
||||||
import dev.usbharu.hideout.exception.ParameterNotExistException
|
|
||||||
import dev.usbharu.hideout.plugins.TOKEN_AUTH
|
|
||||||
import dev.usbharu.hideout.service.api.PostApiService
|
|
||||||
import dev.usbharu.hideout.util.InstantParseUtil
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.auth.*
|
|
||||||
import io.ktor.server.auth.jwt.*
|
|
||||||
import io.ktor.server.request.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
@Suppress("LongMethod")
|
|
||||||
fun Route.posts(postApiService: PostApiService) {
|
|
||||||
route("/posts") {
|
|
||||||
authenticate(TOKEN_AUTH) {
|
|
||||||
post {
|
|
||||||
val principal = call.principal<JWTPrincipal>() ?: throw IllegalStateException("no principal")
|
|
||||||
val userId = principal.payload.getClaim("uid").asLong()
|
|
||||||
|
|
||||||
val receive = call.receive<Post>()
|
|
||||||
val create = postApiService.createPost(receive, userId)
|
|
||||||
call.response.header("Location", create.url)
|
|
||||||
call.respond(HttpStatusCode.OK)
|
|
||||||
}
|
|
||||||
route("/{id}/reactions") {
|
|
||||||
get {
|
|
||||||
val principal = call.principal<JWTPrincipal>() ?: throw IllegalStateException("no principal")
|
|
||||||
val userId = principal.payload.getClaim("uid").asLong()
|
|
||||||
val postId = (
|
|
||||||
call.parameters["id"]?.toLong()
|
|
||||||
?: throw ParameterNotExistException("Parameter(id='postsId') does not exist.")
|
|
||||||
)
|
|
||||||
call.respond(postApiService.getReactionByPostId(postId, userId))
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
val jwtPrincipal = call.principal<JWTPrincipal>() ?: throw IllegalStateException("no principal")
|
|
||||||
val userId = jwtPrincipal.payload.getClaim("uid").asLong()
|
|
||||||
val postId = call.parameters["id"]?.toLong()
|
|
||||||
?: throw ParameterNotExistException("Parameter(id='postsId') does not exist.")
|
|
||||||
val reaction = try {
|
|
||||||
call.receive<Reaction>()
|
|
||||||
} catch (_: ContentTransformationException) {
|
|
||||||
Reaction(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
postApiService.appendReaction(reaction.reaction ?: "❤", userId, postId)
|
|
||||||
call.respond(HttpStatusCode.NoContent)
|
|
||||||
}
|
|
||||||
delete {
|
|
||||||
val jwtPrincipal = call.principal<JWTPrincipal>() ?: throw IllegalStateException("no principal")
|
|
||||||
val userId = jwtPrincipal.payload.getClaim("uid").asLong()
|
|
||||||
val postId = call.parameters["id"]?.toLong()
|
|
||||||
?: throw ParameterNotExistException("Parameter(id='postsId') does not exist.")
|
|
||||||
postApiService.removeReaction(userId, postId)
|
|
||||||
call.respond(HttpStatusCode.NoContent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
authenticate(TOKEN_AUTH, optional = true) {
|
|
||||||
get {
|
|
||||||
val userId = call.principal<JWTPrincipal>()?.payload?.getClaim("uid")?.asLong()
|
|
||||||
val since = InstantParseUtil.parse(call.request.queryParameters["since"])
|
|
||||||
val until = InstantParseUtil.parse(call.request.queryParameters["until"])
|
|
||||||
val minId = call.request.queryParameters["minId"]?.toLong()
|
|
||||||
val maxId = call.request.queryParameters["maxId"]?.toLong()
|
|
||||||
val limit = call.request.queryParameters["limit"]?.toInt()
|
|
||||||
call.respond(HttpStatusCode.OK, postApiService.getAll(since, until, minId, maxId, limit, userId))
|
|
||||||
}
|
|
||||||
get("/{id}") {
|
|
||||||
val userId = call.principal<JWTPrincipal>()?.payload?.getClaim("uid")?.asLong()
|
|
||||||
val id = call.parameters["id"]?.toLong()
|
|
||||||
?: throw ParameterNotExistException("Parameter(id='postsId') does not exist.")
|
|
||||||
val post = postApiService.getById(id, userId)
|
|
||||||
call.respond(post)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
route("/users/{name}/posts") {
|
|
||||||
authenticate(TOKEN_AUTH, optional = true) {
|
|
||||||
get {
|
|
||||||
val userId = call.principal<JWTPrincipal>()?.payload?.getClaim("uid")?.asLong()
|
|
||||||
val targetUserName = call.parameters["name"]
|
|
||||||
?: throw ParameterNotExistException("Parameter(name='userName@domain') does not exist.")
|
|
||||||
val posts = postApiService.getByUser(targetUserName, userId = userId)
|
|
||||||
call.respond(posts)
|
|
||||||
}
|
|
||||||
get("/{id}") {
|
|
||||||
val userId = call.principal<JWTPrincipal>()?.payload?.getClaim("uid")?.asLong()
|
|
||||||
val id = call.parameters["id"]?.toLong()
|
|
||||||
?: throw ParameterNotExistException("Parameter(name='postsId' does not exist.")
|
|
||||||
val post = postApiService.getById(id, userId)
|
|
||||||
call.respond(post)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,107 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.api.internal.v1
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.config.Config
|
|
||||||
import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
|
|
||||||
import dev.usbharu.hideout.domain.model.hideout.form.UserCreate
|
|
||||||
import dev.usbharu.hideout.exception.ParameterNotExistException
|
|
||||||
import dev.usbharu.hideout.plugins.TOKEN_AUTH
|
|
||||||
import dev.usbharu.hideout.service.api.UserApiService
|
|
||||||
import dev.usbharu.hideout.service.user.UserService
|
|
||||||
import dev.usbharu.hideout.util.AcctUtil
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.auth.*
|
|
||||||
import io.ktor.server.auth.jwt.*
|
|
||||||
import io.ktor.server.request.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
@Suppress("LongMethod", "CognitiveComplexMethod")
|
|
||||||
fun Route.users(userService: UserService, userApiService: UserApiService) {
|
|
||||||
route("/users") {
|
|
||||||
get {
|
|
||||||
call.respond(userApiService.findAll())
|
|
||||||
}
|
|
||||||
post {
|
|
||||||
val userCreate = call.receive<UserCreate>()
|
|
||||||
if (userService.usernameAlreadyUse(userCreate.username)) {
|
|
||||||
return@post call.respond(HttpStatusCode.BadRequest)
|
|
||||||
}
|
|
||||||
val user = userService.createLocalUser(
|
|
||||||
UserCreateDto(
|
|
||||||
userCreate.username,
|
|
||||||
userCreate.username,
|
|
||||||
"",
|
|
||||||
userCreate.password
|
|
||||||
)
|
|
||||||
)
|
|
||||||
call.response.header("Location", "${Config.configData.url}/api/internal/v1/users/${user.name}")
|
|
||||||
call.respond(HttpStatusCode.Created)
|
|
||||||
}
|
|
||||||
route("/{name}") {
|
|
||||||
authenticate(TOKEN_AUTH, optional = true) {
|
|
||||||
get {
|
|
||||||
val userParameter = (
|
|
||||||
call.parameters["name"]
|
|
||||||
?: throw ParameterNotExistException(
|
|
||||||
"Parameter(name='userName@domain') does not exist."
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if (userParameter.toLongOrNull() != null) {
|
|
||||||
return@get call.respond(userApiService.findById(userParameter.toLong()))
|
|
||||||
} else {
|
|
||||||
val acct = AcctUtil.parse(userParameter)
|
|
||||||
return@get call.respond(userApiService.findByAcct(acct))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
route("/followers") {
|
|
||||||
get {
|
|
||||||
val userParameter = call.parameters["name"]
|
|
||||||
?: throw ParameterNotExistException("Parameter(name='userName@domain') does not exist.")
|
|
||||||
if (userParameter.toLongOrNull() != null) {
|
|
||||||
return@get call.respond(userApiService.findFollowers(userParameter.toLong()))
|
|
||||||
}
|
|
||||||
val acct = AcctUtil.parse(userParameter)
|
|
||||||
return@get call.respond(userApiService.findFollowersByAcct(acct))
|
|
||||||
}
|
|
||||||
authenticate(TOKEN_AUTH) {
|
|
||||||
post {
|
|
||||||
val userId = call.principal<JWTPrincipal>()?.payload?.getClaim("uid")?.asLong()
|
|
||||||
?: throw IllegalStateException("no principal")
|
|
||||||
val userParameter = call.parameters["name"]
|
|
||||||
?: throw ParameterNotExistException("Parameter(name='userName@domain') does not exist.")
|
|
||||||
if (if (userParameter.toLongOrNull() != null) {
|
|
||||||
userApiService.follow(userParameter.toLong(), userId)
|
|
||||||
} else {
|
|
||||||
val parse = AcctUtil.parse(userParameter)
|
|
||||||
userApiService.follow(parse, userId)
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
call.respond(HttpStatusCode.OK)
|
|
||||||
} else {
|
|
||||||
call.respond(HttpStatusCode.Accepted)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
route("/following") {
|
|
||||||
get {
|
|
||||||
val userParameter = (
|
|
||||||
call.parameters["name"]
|
|
||||||
?: throw ParameterNotExistException(
|
|
||||||
"Parameter(name='userName@domain') does not exist."
|
|
||||||
)
|
|
||||||
)
|
|
||||||
if (userParameter.toLongOrNull() != null) {
|
|
||||||
return@get call.respond(userApiService.findFollowings(userParameter.toLong()))
|
|
||||||
}
|
|
||||||
val acct = AcctUtil.parse(userParameter)
|
|
||||||
return@get call.respond(userApiService.findFollowingsByAcct(acct))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.api.mastodon.v1
|
|
||||||
|
|
||||||
// @Suppress("UnusedPrivateMember")
|
|
||||||
// fun Route.statuses(postService: IPostService) {
|
|
||||||
// // route("/statuses") {
|
|
||||||
// // post {
|
|
||||||
// // val status: StatusForPost = call.receive()
|
|
||||||
// // val post = dev.usbharu.hideout.domain.model.hideout.form.Post(
|
|
||||||
// // userId = status.userId,
|
|
||||||
// // createdAt = System.currentTimeMillis(),
|
|
||||||
// // text = status.status,
|
|
||||||
// // visibility = 1
|
|
||||||
// // )
|
|
||||||
// // postService.create(post)
|
|
||||||
// // call.respond(status)
|
|
||||||
// // }
|
|
||||||
// // }
|
|
||||||
// }
|
|
|
@ -1,45 +0,0 @@
|
||||||
package dev.usbharu.hideout.routing.wellknown
|
|
||||||
|
|
||||||
import dev.usbharu.hideout.config.Config
|
|
||||||
import dev.usbharu.hideout.domain.model.wellknown.WebFinger
|
|
||||||
import dev.usbharu.hideout.exception.IllegalParameterException
|
|
||||||
import dev.usbharu.hideout.exception.ParameterNotExistException
|
|
||||||
import dev.usbharu.hideout.service.api.WebFingerApiService
|
|
||||||
import dev.usbharu.hideout.util.HttpUtil.Activity
|
|
||||||
import io.ktor.http.*
|
|
||||||
import io.ktor.server.application.*
|
|
||||||
import io.ktor.server.response.*
|
|
||||||
import io.ktor.server.routing.*
|
|
||||||
|
|
||||||
@Deprecated("Ktor is deprecated")
|
|
||||||
fun Routing.webfinger(webFingerApiService: WebFingerApiService) {
|
|
||||||
route("/.well-known/webfinger") {
|
|
||||||
get {
|
|
||||||
val acct = call.request.queryParameters["resource"]?.decodeURLPart()
|
|
||||||
?: throw ParameterNotExistException("Parameter(name='resource') does not exist.")
|
|
||||||
|
|
||||||
if (acct.startsWith("acct:").not()) {
|
|
||||||
throw IllegalParameterException("Parameter(name='resource') is not start with 'acct:'.")
|
|
||||||
}
|
|
||||||
|
|
||||||
val accountName = acct.substringBeforeLast("@")
|
|
||||||
.substringAfter("acct:")
|
|
||||||
.trimStart('@')
|
|
||||||
|
|
||||||
val userEntity = webFingerApiService.findByNameAndDomain(accountName, Config.configData.domain)
|
|
||||||
|
|
||||||
val webFinger = WebFinger(
|
|
||||||
subject = acct,
|
|
||||||
links = listOf(
|
|
||||||
WebFinger.Link(
|
|
||||||
rel = "self",
|
|
||||||
type = ContentType.Application.Activity.toString(),
|
|
||||||
href = "${Config.configData.url}/users/${userEntity.name}"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return@get call.respond(webFinger)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue