1
0
Эх сурвалжийг харах

➕ Add Cloudflare's Turnstile Captcha Service to our Captcha options

BrettonYe 2 жил өмнө
parent
commit
73ac656935

+ 12 - 4
app/Http/Controllers/AuthController.php

@@ -25,6 +25,7 @@ use Illuminate\Http\Request;
 use Notification;
 use Redirect;
 use Response;
+use romanzipp\Turnstile\Rules\TurnstileCaptcha;
 use Session;
 use Str;
 use Validator;
@@ -52,7 +53,7 @@ class AuthController extends Controller
 
         // 是否校验验证码
         $captcha = $this->check_captcha($request);
-        if ($captcha !== false) {
+        if ($captcha !== true) {
             return $captcha;
         }
 
@@ -96,7 +97,7 @@ class AuthController extends Controller
         return redirect()->back();
     }
 
-    private function check_captcha(Request $request)
+    private function check_captcha(Request $request): RedirectResponse|bool
     { // 校验验证码
         switch (sysConfig('is_captcha')) {
             case 1: // 默认图形验证码
@@ -125,11 +126,18 @@ class AuthController extends Controller
                     return Redirect::back()->withInput()->withErrors(trans('auth.captcha.error.failed'));
                 }
                 break;
+            case 5: // Turnstile
+                $validator = Validator::make($request->all(), ['cf-turnstile-response' => ['required', 'string', new TurnstileCaptcha()]]);
+
+                if ($validator->fails()) {
+                    return Redirect::back()->withInput()->withErrors($validator->errors());
+                }
+                break;
             default: // 不启用验证码
                 break;
         }
 
-        return false;
+        return true;
     }
 
     public function logout(Request $request): RedirectResponse
@@ -205,7 +213,7 @@ class AuthController extends Controller
 
         // 是否校验验证码
         $captcha = $this->check_captcha($request);
-        if ($captcha !== false) {
+        if ($captcha !== true) {
             return $captcha;
         }
 

+ 2 - 6
app/Providers/SettingServiceProvider.php

@@ -23,6 +23,7 @@ class SettingServiceProvider extends ServiceProvider
             2 => ['geetest.id', 'geetest.key'],
             3 => ['NoCaptcha.secret', 'NoCaptcha.sitekey'],
             4 => ['HCaptcha.secret', 'HCaptcha.sitekey'],
+            5 => ['turnstile.secret_key', 'turnstile.site_key'],
         ]);
 
         $notifications = [
@@ -61,12 +62,7 @@ class SettingServiceProvider extends ServiceProvider
             config([$toApp[config('settings.is_captcha')][1] => config('settings.captcha_key')]);
         }
 
-        collect([
-            'website_name' => 'app.name',
-            'website_url' => 'app.url',
-        ])->each(function ($item, $key) {
-            config([$item => config('settings.'.$key)]); // 设置APP有关的选项
-        });
+        collect(['website_name' => 'app.name', 'website_url' => 'app.url'])->each(fn ($item, $key) => config([$item => config('settings.'.$key)]));
     }
 
     private static function setChannel(array $channels): array

+ 1 - 0
composer.json

@@ -32,6 +32,7 @@
     "mews/captcha": "^3.2",
     "mews/purifier": "^3.3",
     "phpoffice/phpspreadsheet": "^1.16",
+    "romanzipp/laravel-turnstile": "^1.1",
     "socialiteproviders/telegram": "^4.1",
     "spatie/laravel-permission": "^5.10",
     "srmklive/paypal": "^3.0",

+ 1 - 0
resources/lang/de/admin.php

@@ -787,6 +787,7 @@ return [
             'geetest' => 'Geetest',
             'recaptcha' => 'Google ReCaptcha',
             'hcaptcha' => 'hCaptcha',
+            'turnstile' => 'Turnstile',
         ],
         'referral' => [
             'once' => 'Einmal Provision',

+ 1 - 0
resources/lang/en/admin.php

@@ -787,6 +787,7 @@ return [
             'geetest' => 'Geetest',
             'recaptcha' => 'Google ReCaptcha',
             'hcaptcha' => 'hCaptcha',
+            'turnstile' => 'Turnstile',
         ],
         'referral' => [
             'once' => 'First Purchase Rebate',

+ 1 - 0
resources/lang/fa/admin.php

@@ -789,6 +789,7 @@ return [
             'geetest' => 'جی‌تست',
             'recaptcha' => 'ری‌کپچای گوگل',
             'hcaptcha' => 'اچ‌کپچا',
+            'turnstile' => 'Turnstile',
         ],
         'referral' => [
             'once' => 'بازگشت درآمد اولین خرید',

+ 1 - 0
resources/lang/ja/admin.php

@@ -787,6 +787,7 @@ return [
             'geetest' => 'Geetest',
             'recaptcha' => 'Google ReCaptcha',
             'hcaptcha' => 'hCaptcha',
+            'turnstile' => 'Turnstile',
         ],
         'referral' => [
             'once' => '初回購入のみリベート',

+ 1 - 0
resources/lang/ko/admin.php

@@ -787,6 +787,7 @@ return [
             'geetest' => '极验',
             'recaptcha' => '구글 reCaptcha',
             'hcaptcha' => 'hCaptcha',
+            'turnstile' => 'Turnstile',
         ],
         'referral' => [
             'once' => '첫 구매 리베이트',

+ 1 - 0
resources/lang/vi/admin.php

@@ -787,6 +787,7 @@ return [
             'geetest' => '极验',
             'recaptcha' => 'Google reCaptcha',
             'hcaptcha' => 'hCaptcha',
+            'turnstile' => 'Turnstile',
         ],
         'referral' => [
             'once' => 'Hoa hồng đầu tiên',

+ 1 - 0
resources/lang/zh_CN/admin.php

@@ -787,6 +787,7 @@ return [
             'geetest' => '极 验',
             'recaptcha' => 'Google reCaptcha',
             'hcaptcha' => 'hCaptcha',
+            'turnstile' => 'Turnstile',
         ],
         'referral' => [
             'once' => '首购返利',

+ 4 - 5
resources/views/admin/config/system.blade.php

@@ -8,7 +8,8 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title"><i class="icon wb-settings" aria-hidden="true"></i>{{ trans('admin.setting.system.title') }}</h1>
+                <h1 class="panel-title">
+                    <i class="icon wb-settings" aria-hidden="true"></i>{{ trans('admin.setting.system.title') }}</h1>
             </div>
             <div class="panel-body">
                 <div class="nav-tabs-horizontal" data-plugin="tabs">
@@ -129,13 +130,11 @@
                             <x-system.input code="v2ray_tls_provider" :value="$v2ray_tls_provider"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="extend">
-                            <x-system.select code="ddns_mode"
-                                             :list="[trans('common.status.closed') => '', trans('admin.system.ddns.namesilo') => 'namesilo', trans('admin.system.ddns.aliyun') => 'aliyun', trans('admin.system.ddns.dnspod') =>  'dnspod', trans('admin.system.ddns.cloudflare') => 'cloudflare']"/>
+                            <x-system.select code="ddns_mode" :list="[trans('common.status.closed') => '', trans('admin.system.ddns.namesilo') => 'namesilo', trans('admin.system.ddns.aliyun') => 'aliyun', trans('admin.system.ddns.dnspod') =>  'dnspod', trans('admin.system.ddns.cloudflare') => 'cloudflare']"/>
                             <x-system.input code="ddns_key" :value="$ddns_key"/>
                             <x-system.input code="ddns_secret" :value="$ddns_secret"/>
                             <hr class="col-lg-12">
-                            <x-system.select code="is_captcha"
-                                             :list="[trans('common.status.closed') => '', trans('admin.system.captcha.standard') => 1, trans('admin.system.captcha.geetest') => 2, trans('admin.system.captcha.recaptcha') => 3, trans('admin.system.captcha.hcaptcha') => 4]"/>
+                            <x-system.select code="is_captcha" :list="[trans('common.status.closed') => '', trans('admin.system.captcha.standard') => 1, trans('admin.system.captcha.geetest') => 2, trans('admin.system.captcha.recaptcha') => 3, trans('admin.system.captcha.hcaptcha') => 4, trans('admin.system.captcha.turnstile') => 5]"/>
                             <x-system.input code="captcha_key" :value="$captcha_key"/>
                             <x-system.input code="captcha_secret" :value="$captcha_secret"/>
                         </x-system.tab-pane>

+ 7 - 0
resources/views/auth/captcha.blade.php

@@ -27,5 +27,12 @@
             {!! HCaptcha::renderJs(Session::get('locale')) !!}
         </div>
         @break
+    @case(5)
+        <!-- Turnstile -->
+        <div class="form-group form-material floating w-p100" data-plugin="formMaterial">
+            {{ \romanzipp\Turnstile\Captcha::getScript() }}
+            {{ \romanzipp\Turnstile\Captcha::getChallenge() }}
+        </div>
+        @break
     @default
 @endswitch