From 20ae2ce5e02539719b971e53222f3e3328ff82a6 Mon Sep 17 00:00:00 2001 From: ilotterytea Date: Thu, 15 May 2025 15:20:53 +0500 Subject: feat: custom captcha --- .gitignore | 3 +- public/captcha.php | 92 ++++++++++++++--------------- public/emotes/upload.php | 12 ++++ src/accounts.php | 5 -- src/captcha.php | 151 +++++++++++++++++++++++++++++++++++++++++++++++ src/config.sample.php | 5 +- 6 files changed, 211 insertions(+), 57 deletions(-) create mode 100644 src/captcha.php diff --git a/.gitignore b/.gitignore index 665c2a6..6d1f0c2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ userdata/ *.db config.php -custom_static/ \ No newline at end of file +custom_static/ +captcha/ \ No newline at end of file diff --git a/public/captcha.php b/public/captcha.php index 58283bf..b454b7d 100644 --- a/public/captcha.php +++ b/public/captcha.php @@ -1,65 +1,59 @@ 200, + "message" => "Solved!", + "data" => null + ]); + } else { + echo json_response([ + "status_code" => 400, + "message" => "Wrong answer!", + "data" => null + ], 400); + } exit; } -if (isset($_SESSION["captcha_solved"]) && $_SESSION["captcha_solved"]) { - header("Location: /"); +$file_folder = $_SERVER["DOCUMENT_ROOT"] . '/static/img/captcha'; + +if (!CAPTCHA_ENABLE || ($_SESSION["captcha_solved"] ?? false) || !is_dir($file_folder)) { + $_SESSION["captcha_solved"] = true; + echo json_response([ + "status_code" => 200, + "message" => "No need to solve captcha", + "data" => null + ]); exit; } -if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["h-captcha-response"])) { - // sending a request to captcha api - $request = curl_init("https://hcaptcha.com/siteverify"); - curl_setopt($request, CURLOPT_POST, 1); - curl_setopt($request, CURLOPT_HTTPHEADER, [sprintf("User-Agent: %s/1.0", INSTANCE_NAME)]); - curl_setopt( - $request, - CURLOPT_POSTFIELDS, - http_build_query(array("secret" => HCAPTCHA_SECRETKEY, "response" => $_POST["h-captcha-response"])) - ); - curl_setopt($request, CURLOPT_RETURNTRANSFER, true); - - $response = curl_exec($request); - curl_close($request); - - $json = json_decode($response); - - if ($json->success) { - $_SESSION["captcha_solved"] = true; - header("Location: /"); - exit; - } -} -?> +$files = scandir($file_folder); +array_splice($files, 0, 2); - +$filename = $files[random_int(0, count($files) - 1)]; +$filename = basename($filename, ".png"); - - Resolving a hCaptcha - <?php echo INSTANCE_NAME ?> - - - - +$_SESSION["captcha_word"] = $filename; - - -
-
-
-
-
-
-
-
-
- +$image = generate_image_captcha( + CAPTCHA_SIZE[0], + CAPTCHA_SIZE[1], + random_int(1, 3), + $filename, + $file_folder +); - \ No newline at end of file +echo json_response([ + "status_code" => 200, + "message" => null, + "data" => $image +]); \ No newline at end of file diff --git a/public/emotes/upload.php b/public/emotes/upload.php index e4ff6cc..4506152 100644 --- a/public/emotes/upload.php +++ b/public/emotes/upload.php @@ -2,6 +2,7 @@ include "../../src/accounts.php"; include_once "../../src/config.php"; include_once "../../src/alert.php"; +include_once "../../src/captcha.php"; if (!EMOTE_UPLOAD) { generate_alert("/404.php", "Emote upload is disabled", 403); @@ -135,6 +136,12 @@ if ($_SERVER['REQUEST_METHOD'] != "POST") { + +