diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9e16f263..cdc25eea 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): bool { + $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()); + } +}