diff --git a/backend/.gitignore b/backend/.gitignore index c426c32..68b4f6a 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -33,4 +33,6 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ \ No newline at end of file +.vscode/ + +**/src/main/resources/.env* diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index b36ad30..70673b3 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { implementation("io.ktor:ktor-server-compression") implementation("io.ktor:ktor-server-netty") implementation("ch.qos.logback:logback-classic:$logback_version") + implementation("io.github.cdimascio:dotenv-kotlin:6.5.1") testImplementation("io.ktor:ktor-server-test-host") testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version") } diff --git a/backend/src/main/kotlin/Administration.kt b/backend/src/main/kotlin/Administration.kt index 389c632..3f3bbf8 100644 --- a/backend/src/main/kotlin/Administration.kt +++ b/backend/src/main/kotlin/Administration.kt @@ -1,35 +1,16 @@ package svitan.dev -import io.github.flaxoos.ktor.server.plugins.ratelimiter.* -import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.* -import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* +import io.github.flaxoos.ktor.server.plugins.ratelimiter.RateLimiting +import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.TokenBucket import io.ktor.server.application.* -import io.ktor.server.auth.* -import io.ktor.server.plugins.calllogging.* -import io.ktor.server.plugins.compression.* -import io.ktor.server.plugins.contentnegotiation.* -import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.plugins.requestvalidation.RequestValidation -import io.ktor.server.plugins.requestvalidation.ValidationResult -import io.ktor.server.plugins.statuspages.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.server.routing.* import kotlin.time.Duration.Companion.seconds -import org.jetbrains.exposed.sql.* -import org.slf4j.event.* fun Application.configureAdministration() { - routing { - route("/") { - install(RateLimiting) { - rateLimiter { - type = TokenBucket::class - capacity = 100 - rate = 10.seconds - } - } + install(RateLimiting) { + rateLimiter { + type = TokenBucket::class + capacity = 100 + rate = 10.seconds } } } diff --git a/backend/src/main/kotlin/Application.kt b/backend/src/main/kotlin/Application.kt index ac56bdf..2fed4bd 100644 --- a/backend/src/main/kotlin/Application.kt +++ b/backend/src/main/kotlin/Application.kt @@ -1,20 +1,26 @@ package svitan.dev +import io.github.cdimascio.dotenv.dotenv import io.ktor.server.application.* import io.ktor.server.engine.* import io.ktor.server.netty.* fun main() { - embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module) - .start(wait = true) + embeddedServer( + Netty, + port = 8080, + host = "0.0.0.0", + module = Application::module + ).start(wait = true) } fun Application.module() { + val dotenv = dotenv() + configureHTTP() - configureSecurity() - configureMonitoring() - configureSerialization() - configureDatabases() - configureAdministration() configureRouting() + configureDatabases() + configureMonitoring() + configureAdministration() + configureSecurity(dotenv) } diff --git a/backend/src/main/kotlin/Databases.kt b/backend/src/main/kotlin/Databases.kt index d74c6f8..ee3e1d9 100644 --- a/backend/src/main/kotlin/Databases.kt +++ b/backend/src/main/kotlin/Databases.kt @@ -1,24 +1,11 @@ package svitan.dev -import io.github.flaxoos.ktor.server.plugins.ratelimiter.* -import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.* import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* -import io.ktor.server.auth.* -import io.ktor.server.plugins.calllogging.* -import io.ktor.server.plugins.compression.* -import io.ktor.server.plugins.contentnegotiation.* -import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.plugins.requestvalidation.RequestValidation -import io.ktor.server.plugins.requestvalidation.ValidationResult -import io.ktor.server.plugins.statuspages.* import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* -import kotlin.time.Duration.Companion.seconds -import org.jetbrains.exposed.sql.* -import org.slf4j.event.* +import org.jetbrains.exposed.sql.Database fun Application.configureDatabases() { val database = Database.connect( diff --git a/backend/src/main/kotlin/HTTP.kt b/backend/src/main/kotlin/HTTP.kt index a714fc8..456e944 100644 --- a/backend/src/main/kotlin/HTTP.kt +++ b/backend/src/main/kotlin/HTTP.kt @@ -1,24 +1,9 @@ package svitan.dev -import io.github.flaxoos.ktor.server.plugins.ratelimiter.* -import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.* import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* -import io.ktor.server.auth.* -import io.ktor.server.plugins.calllogging.* import io.ktor.server.plugins.compression.* -import io.ktor.server.plugins.contentnegotiation.* import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.plugins.requestvalidation.RequestValidation -import io.ktor.server.plugins.requestvalidation.ValidationResult -import io.ktor.server.plugins.statuspages.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.server.routing.* -import kotlin.time.Duration.Companion.seconds -import org.jetbrains.exposed.sql.* -import org.slf4j.event.* fun Application.configureHTTP() { install(CORS) { diff --git a/backend/src/main/kotlin/Monitoring.kt b/backend/src/main/kotlin/Monitoring.kt index aa8e25b..716d676 100644 --- a/backend/src/main/kotlin/Monitoring.kt +++ b/backend/src/main/kotlin/Monitoring.kt @@ -1,24 +1,9 @@ package svitan.dev -import io.github.flaxoos.ktor.server.plugins.ratelimiter.* -import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.* -import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* -import io.ktor.server.auth.* import io.ktor.server.plugins.calllogging.* -import io.ktor.server.plugins.compression.* -import io.ktor.server.plugins.contentnegotiation.* -import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.plugins.requestvalidation.RequestValidation -import io.ktor.server.plugins.requestvalidation.ValidationResult -import io.ktor.server.plugins.statuspages.* import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.server.routing.* -import kotlin.time.Duration.Companion.seconds -import org.jetbrains.exposed.sql.* -import org.slf4j.event.* +import org.slf4j.event.Level fun Application.configureMonitoring() { install(CallLogging) { diff --git a/backend/src/main/kotlin/Routing.kt b/backend/src/main/kotlin/Routing.kt index 2b01e49..b21a8ea 100644 --- a/backend/src/main/kotlin/Routing.kt +++ b/backend/src/main/kotlin/Routing.kt @@ -1,24 +1,10 @@ package svitan.dev -import io.github.flaxoos.ktor.server.plugins.ratelimiter.* -import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.* import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* -import io.ktor.server.auth.* -import io.ktor.server.plugins.calllogging.* -import io.ktor.server.plugins.compression.* -import io.ktor.server.plugins.contentnegotiation.* -import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.plugins.requestvalidation.RequestValidation -import io.ktor.server.plugins.requestvalidation.ValidationResult +import io.ktor.server.plugins.requestvalidation.* import io.ktor.server.plugins.statuspages.* -import io.ktor.server.request.* import io.ktor.server.response.* -import io.ktor.server.routing.* -import kotlin.time.Duration.Companion.seconds -import org.jetbrains.exposed.sql.* -import org.slf4j.event.* fun Application.configureRouting() { install(RequestValidation) { @@ -28,14 +14,10 @@ fun Application.configureRouting() { else ValidationResult.Valid } } + install(StatusPages) { exception { call, cause -> call.respondText(text = "500: $cause", status = HttpStatusCode.InternalServerError) } } - routing { - get("/") { - call.respondText("Hello World!") - } - } } diff --git a/backend/src/main/kotlin/Security.kt b/backend/src/main/kotlin/Security.kt index 0cc53d1..a482064 100644 --- a/backend/src/main/kotlin/Security.kt +++ b/backend/src/main/kotlin/Security.kt @@ -1,58 +1,22 @@ package svitan.dev -import io.github.flaxoos.ktor.server.plugins.ratelimiter.* -import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.* -import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* +import io.github.cdimascio.dotenv.Dotenv import io.ktor.server.application.* import io.ktor.server.auth.* -import io.ktor.server.plugins.calllogging.* -import io.ktor.server.plugins.compression.* -import io.ktor.server.plugins.contentnegotiation.* -import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.plugins.requestvalidation.RequestValidation -import io.ktor.server.plugins.requestvalidation.ValidationResult -import io.ktor.server.plugins.statuspages.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.server.routing.* -import kotlin.time.Duration.Companion.seconds -import org.jetbrains.exposed.sql.* -import org.slf4j.event.* -fun Application.configureSecurity() { +fun Application.configureSecurity(dotenv: Dotenv) { + val apiKey = dotenv["API_KEY"] ?: throw Exception("API_KEY not found") + authentication { - basic(name = "myauth1") { + basic { realm = "Ktor Server" validate { credentials -> - if (credentials.name == credentials.password) { + if (credentials.name == "admin" && credentials.password == apiKey) { UserIdPrincipal(credentials.name) } else { null } } } - - form(name = "myauth2") { - userParamName = "user" - passwordParamName = "password" - challenge { - /**/ - } - } - } - routing { - authenticate("myauth1") { - get("/protected/route/basic") { - val principal = call.principal()!! - call.respondText("Hello ${principal.name}") - } - } - authenticate("myauth2") { - get("/protected/route/form") { - val principal = call.principal()!! - call.respondText("Hello ${principal.name}") - } - } } } diff --git a/backend/src/main/kotlin/Serialization.kt b/backend/src/main/kotlin/Serialization.kt deleted file mode 100644 index 86f7c0e..0000000 --- a/backend/src/main/kotlin/Serialization.kt +++ /dev/null @@ -1,29 +0,0 @@ -package svitan.dev - -import io.github.flaxoos.ktor.server.plugins.ratelimiter.* -import io.github.flaxoos.ktor.server.plugins.ratelimiter.implementations.* -import io.ktor.http.* -import io.ktor.serialization.kotlinx.json.* -import io.ktor.server.application.* -import io.ktor.server.auth.* -import io.ktor.server.plugins.calllogging.* -import io.ktor.server.plugins.compression.* -import io.ktor.server.plugins.contentnegotiation.* -import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.plugins.requestvalidation.RequestValidation -import io.ktor.server.plugins.requestvalidation.ValidationResult -import io.ktor.server.plugins.statuspages.* -import io.ktor.server.request.* -import io.ktor.server.response.* -import io.ktor.server.routing.* -import kotlin.time.Duration.Companion.seconds -import org.jetbrains.exposed.sql.* -import org.slf4j.event.* - -fun Application.configureSerialization() { - routing { - get("/json/kotlinx-serialization") { - call.respond(mapOf("hello" to "world")) - } - } -}