From 16278db90c4f0098c2e96a0f42f430490b9f6cfb Mon Sep 17 00:00:00 2001 From: EwelinaSkrzypacz Date: Tue, 24 Jun 2025 10:04:46 +0200 Subject: [PATCH 1/2] - make custom validator --- app/Providers/AppServiceProvider.php | 15 ++++++++ tests/Unit/RecaptchaTest.php | 52 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 tests/Unit/RecaptchaTest.php diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9e16f263..1937343e 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -4,8 +4,10 @@ namespace Blumilk\Website\Providers; +use Exception; use Illuminate\Http\Request; use Illuminate\Support\ServiceProvider; +use Lunaweb\RecaptchaV3\Facades\RecaptchaV3; class AppServiceProvider extends ServiceProvider { @@ -18,5 +20,18 @@ public function boot(): void $request->setLocale("pl"); app()->setLocale("pl"); } + + $this->app["validator"]->extend("recaptchav3", function ($attribute, $value, $parameters) { + $action = $parameters[0]; + $minScore = isset($parameters[1]) ? (float)$parameters[1] : 0.5; + + try { + $score = RecaptchaV3::verify($value, $action); + + return $score && $score >= $minScore; + } catch (Exception) { + return false; + } + }); } } diff --git a/tests/Unit/RecaptchaTest.php b/tests/Unit/RecaptchaTest.php new file mode 100644 index 00000000..217778f8 --- /dev/null +++ b/tests/Unit/RecaptchaTest.php @@ -0,0 +1,52 @@ +once() + ->andReturn(0.8); + + $data = ["token" => "dummy-token"]; + $rules = ["token" => "recaptchav3:contact,0.5"]; + + $validator = Validator::make($data, $rules); + + $this->assertTrue($validator->passes()); + } + + public function testRecaptchav3ValidationFailsWhenScoreIsTooLow(): void + { + RecaptchaV3::shouldReceive("verify") + ->once() + ->andReturn(0.3); + + $data = ["token" => "dummy-token"]; + $rules = ["token" => "recaptchav3:contact,0.5"]; + + $validator = Validator::make($data, $rules); + + $this->assertFalse($validator->passes()); + } + + public function testRecaptchav3ValidationFailsWhenExceptionIsThrown(): void + { + RecaptchaV3::shouldReceive("verify") + ->once() + ->andThrow(new Exception()); + + $data = ["token" => "dummy-token"]; + $rules = ["token" => "recaptchav3:contact,0.5"]; + + $validator = Validator::make($data, $rules); + + $this->assertFalse($validator->passes()); + } +} From baa0ab0fddaed6ae9c64b81bba6e589c9efe7dee Mon Sep 17 00:00:00 2001 From: Ewelina Skrzypacz <56546832+EwelinaSkrzypacz@users.noreply.github.com> Date: Thu, 26 Jun 2025 10:16:33 +0200 Subject: [PATCH 2/2] Update app/Providers/AppServiceProvider.php Co-authored-by: Krzysztof Rewak --- app/Providers/AppServiceProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 1937343e..cdc25eea 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -21,7 +21,7 @@ public function boot(): void app()->setLocale("pl"); } - $this->app["validator"]->extend("recaptchav3", function ($attribute, $value, $parameters) { + $this->app["validator"]->extend("recaptchav3", function ($attribute, $value, $parameters): bool { $action = $parameters[0]; $minScore = isset($parameters[1]) ? (float)$parameters[1] : 0.5;