diff --git a/.gitignore b/.gitignore index a374dac..a5e231c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ Homestead.json Homestead.yaml .env +composer.phar \ No newline at end of file diff --git a/app/Helpers/ConfigHelper.php b/app/Helpers/ConfigHelper.php index a7a8271..b036aa1 100644 --- a/app/Helpers/ConfigHelper.php +++ b/app/Helpers/ConfigHelper.php @@ -59,6 +59,9 @@ class ConfigHelper 'date_format' => $this->allowedDateFormats()[0], 'items_per_page' => 12, 'items_per_page_admin' => 10, + 'recaptcha_enabled_registration' => false, + 'recaptcha_secret_key' => '', + 'recaptcha_site_key' => '', 'require_email_verification' => true, 'sender_address' => sprintf('hostmaster@%s', (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost')), 'sender_name' => (is_null($currentAppName) ? trans('global.app_name') : $currentAppName), diff --git a/app/Helpers/RecaptchaHelper.php b/app/Helpers/RecaptchaHelper.php new file mode 100644 index 0000000..781480c --- /dev/null +++ b/app/Helpers/RecaptchaHelper.php @@ -0,0 +1,36 @@ + UserConfig::get('recaptcha_secret_key'), + 'response' => $response, + 'remoteip' => $clientIpAddress + )); + + $return = json_decode(curl_exec($ch)); + + if (is_null($return)) + { + throw new \Exception('Error while communicating with the reCAPTCHA service.'); + } + + return $return->success; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/DefaultController.php b/app/Http/Controllers/Admin/DefaultController.php index b0de72e..aad9b1b 100644 --- a/app/Http/Controllers/Admin/DefaultController.php +++ b/app/Http/Controllers/Admin/DefaultController.php @@ -40,7 +40,8 @@ class DefaultController extends Controller $checkboxKeys = [ 'allow_self_registration', 'require_email_verification', - 'smtp_encryption' + 'smtp_encryption', + 'recaptcha_enabled_registration' ]; $updateKeys = [ 'app_name', @@ -51,7 +52,9 @@ class DefaultController extends Controller 'smtp_port', 'smtp_username', 'smtp_password', - 'theme' + 'theme', + 'recaptcha_site_key', + 'recaptcha_secret_key' ]; $defaults = UserConfig::defaults(); diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 05a6fd6..29389ad 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Auth; use App\Facade\Theme; use App\Facade\UserConfig; use App\Helpers\MiscHelper; +use App\Helpers\RecaptchaHelper; use App\Mail\UserActivationRequired; use App\User; use Illuminate\Http\Request; @@ -51,13 +52,27 @@ class RegisterController extends Controller * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ - protected function validator(array $data) + protected function validator(Request $request) { - return Validator::make($data, [ - 'name' => 'required|max:255', - 'email' => 'required|email|max:255|unique:users', - 'password' => 'required|min:6|confirmed', - ]); + return Validator::make( + $request->all(), + [ + 'name' => 'required|max:255', + 'email' => 'required|email|max:255|unique:users', + 'password' => 'required|min:6|confirmed', + ] + ) + ->after(function($validator) use ($request) + { + // reCAPTCHA validation + if ( + UserConfig::get('recaptcha_enabled_registration') && + !RecaptchaHelper::validateResponse($request->request->get('g-recaptcha-response'), $request->getClientIp()) + ) + { + $validator->errors()->add('recaptcha', trans('auth.recaptcha_failed_message')); + } + }); } /** @@ -96,7 +111,7 @@ class RegisterController extends Controller return redirect(route('home')); } - $this->validator($request->all())->validate(); + $this->validator($request)->validate(); /** @var User $user */ $user = $this->create($request->all()); diff --git a/config/services.php b/config/services.php index 4460f0e..37d7599 100644 --- a/config/services.php +++ b/config/services.php @@ -14,7 +14,11 @@ return [ | */ - 'mailgun' => [ + 'recaptcha' => [ + 'verify_url' => 'https://www.google.com/recaptcha/api/siteverify' + ] + + /*'mailgun' => [ 'domain' => env('MAILGUN_DOMAIN'), 'secret' => env('MAILGUN_SECRET'), ], @@ -33,6 +37,6 @@ return [ 'model' => App\User::class, 'key' => env('STRIPE_KEY'), 'secret' => env('STRIPE_SECRET'), - ], + ],*/ ]; diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php index 895be63..594fa60 100644 --- a/resources/lang/en/auth.php +++ b/resources/lang/en/auth.php @@ -23,5 +23,6 @@ return [ 'forgot_password_link' => 'Forgotten your password?', 'forgot_password_title' => 'Send password reset link', 'login_page_title' => 'Login', + 'recaptcha_failed_message' => 'The reCAPTCHA verfication failed. Please ensure you have completed the reCAPTCHA challenge and try again.', 'register_page_title' => 'Create an account' ]; diff --git a/resources/views/themes/base/admin/settings.blade.php b/resources/views/themes/base/admin/settings.blade.php index 2cae600..f7156ff 100644 --- a/resources/views/themes/base/admin/settings.blade.php +++ b/resources/views/themes/base/admin/settings.blade.php @@ -84,7 +84,7 @@
@@ -105,10 +105,10 @@ {{-- Security --}} -
+
@@ -116,15 +116,38 @@
+ +
+ +
+ +
+ reCAPTCHA settings + +
+ {!! Form::label('recaptcha_site_key', 'Site key:', ['class' => 'control-label']) !!} + {!! Form::text('recaptcha_site_key', old('recaptcha_site_key'), ['class' => 'form-control']) !!} +
+ +
+ {!! Form::label('recaptcha_secret_key', 'Secret key:', ['class' => 'control-label']) !!} + {!! Form::text('recaptcha_secret_key', old('recaptcha_secret_key'), ['class' => 'form-control']) !!} +
+
+
@lang('forms.cancel_action') {!! Form::submit(trans('admin.settings_save_action'), ['class' => 'btn btn-success']) !!} diff --git a/resources/views/themes/base/auth/register.blade.php b/resources/views/themes/base/auth/register.blade.php index cbf68e0..ca08fe9 100644 --- a/resources/views/themes/base/auth/register.blade.php +++ b/resources/views/themes/base/auth/register.blade.php @@ -67,8 +67,26 @@
+ @if (UserConfig::get('recaptcha_enabled_registration')) +
+ @if ($errors->has('recaptcha')) +
+
+ + {{ $errors->first('recaptcha') }} +
+
+ @endif + +
+
+
+
+ @endif +
+ @lang('forms.cancel_action')
@@ -79,3 +97,9 @@ @endsection + +@if (UserConfig::get('recaptcha_enabled_registration')) + @push('scripts') + + @endpush +@endif \ No newline at end of file