From 3d503971ae94a1dc0cf34239671d809cb04ef792 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 16 Feb 2024 23:56:12 -0500 Subject: [PATCH] [+] Turnstile utility class --- .../icu/samnyan/aqua/net/utils/Turnstile.kt | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/icu/samnyan/aqua/net/utils/Turnstile.kt diff --git a/src/main/java/icu/samnyan/aqua/net/utils/Turnstile.kt b/src/main/java/icu/samnyan/aqua/net/utils/Turnstile.kt new file mode 100644 index 00000000..95ed94c6 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/net/utils/Turnstile.kt @@ -0,0 +1,45 @@ +package icu.samnyan.aqua.net.utils + +import ext.Bool +import ext.HTTP +import ext.Str +import io.ktor.client.call.* +import io.ktor.client.request.* +import io.ktor.client.request.forms.* +import io.ktor.http.* +import kotlinx.serialization.Serializable +import org.springframework.boot.context.properties.ConfigurationProperties +import org.springframework.context.annotation.Configuration +import org.springframework.stereotype.Service + +@Configuration +@ConfigurationProperties(prefix = "turnstile") +class TurnstileProperties { + var enable: Bool = false + + lateinit var secret: Str +} + +@Service +class CaptchaService(val props: TurnstileProperties) { + @Serializable + data class Outcome(val success: Boolean) + + suspend fun validate(captcha: Str?, ip: Str): Boolean { + if (!props.enable) return true + if (captcha == null) return false + + val outcome: Outcome = HTTP.post("https://challenges.cloudflare.com/turnstile/v0/siteverify") { + setBody( + FormDataContent(Parameters.build { + append("secret", props.secret) + append("response", captcha) + append("remoteip", ip) + }) + ) + }.body() + + return outcome.success + } +} +