diff --git a/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig b/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig
index a1a2bb511..4bd2ea16a 100644
--- a/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig
+++ b/addons/default/visiosoft/base-theme/resources/views/addons/anomaly/users-module/register.twig
@@ -20,6 +20,8 @@
'url':form.options.url
})|raw }}
+
+
{% include 'visiosoft.theme.base::addons/anomaly/users-module/partials/register-form' %}
@@ -76,6 +78,12 @@
+ {% set reCAPTCHASiteKey = setting_value('visiosoft.module.profile::google_captcha_site_key') %}
+
+ {{ asset_add('scripts.js', asset_download('https://www.google.com/recaptcha/api.js?render=' ~ reCAPTCHASiteKey, 60*60*24)) }}
{{ asset_add("scripts.js", "visiosoft.theme.base::js/register.js") }}
+ {{ asset_add("scripts.js", "visiosoft.module.profile::assets/js/captcha.js") }}
{% endblock %}
diff --git a/addons/default/visiosoft/profile-module/composer.json b/addons/default/visiosoft/profile-module/composer.json
index 04878d89c..c36b753bb 100644
--- a/addons/default/visiosoft/profile-module/composer.json
+++ b/addons/default/visiosoft/profile-module/composer.json
@@ -10,6 +10,7 @@
]
},
"require": {
- "maatwebsite/excel": "*"
+ "maatwebsite/excel": "*",
+ "google/recaptcha": "1.2.*"
}
}
diff --git a/addons/default/visiosoft/profile-module/resources/assets/js/captcha.js b/addons/default/visiosoft/profile-module/resources/assets/js/captcha.js
new file mode 100644
index 000000000..506b864c2
--- /dev/null
+++ b/addons/default/visiosoft/profile-module/resources/assets/js/captcha.js
@@ -0,0 +1,6 @@
+grecaptcha.ready(function() {
+ grecaptcha.execute(reCAPTCHASiteKey)
+ .then(function(token) {
+ document.getElementById("recaptcha_token").value = token;
+ });
+});
diff --git a/addons/default/visiosoft/profile-module/resources/config/settings/sections.php b/addons/default/visiosoft/profile-module/resources/config/settings/sections.php
index 85d63e090..824048352 100644
--- a/addons/default/visiosoft/profile-module/resources/config/settings/sections.php
+++ b/addons/default/visiosoft/profile-module/resources/config/settings/sections.php
@@ -4,13 +4,18 @@ return [
'monitoring' => [
'stacked' => false,
'tabs' => [
-
'general_setting' => [
'title' => 'visiosoft.module.profile::section.general_setting',
'fields' => [
'show_my_ads', 'upload_avatar', 'show_tax_office'
],
],
+ 'recaptcha' => [
+ 'title' => 'visiosoft.module.profile::section.recaptcha',
+ 'fields' => [
+ 'google_captcha_site_key', 'google_captcha_secret_key', 'score_threshold'
+ ],
+ ],
],
],
];
diff --git a/addons/default/visiosoft/profile-module/resources/config/settings/settings.php b/addons/default/visiosoft/profile-module/resources/config/settings/settings.php
index 6308c2cbd..f9bea65e9 100644
--- a/addons/default/visiosoft/profile-module/resources/config/settings/settings.php
+++ b/addons/default/visiosoft/profile-module/resources/config/settings/settings.php
@@ -13,11 +13,25 @@ return [
'default_value' => 1
],
],
-
'show_tax_office' => [
'type' => 'anomaly.field_type.boolean',
'config' => [
'default_value' => true,
],
],
+ 'google_captcha_site_key' => [
+ 'type' => 'anomaly.field_type.text',
+ ],
+ 'google_captcha_secret_key' => [
+ 'type' => 'anomaly.field_type.text',
+ ],
+ "score_threshold" => [
+ "type" => "anomaly.field_type.decimal",
+ "config" => [
+ "default_value" => 0.5,
+ "decimals" => 1,
+ "min" => 0.0,
+ "max" => 1.0,
+ ]
+ ],
];
\ No newline at end of file
diff --git a/addons/default/visiosoft/profile-module/resources/lang/en/message.php b/addons/default/visiosoft/profile-module/resources/lang/en/message.php
index 49cef7e64..fbd74ccb0 100644
--- a/addons/default/visiosoft/profile-module/resources/lang/en/message.php
+++ b/addons/default/visiosoft/profile-module/resources/lang/en/message.php
@@ -38,4 +38,8 @@ return [
// Mail
'update_email_mail_subject' => 'Email Updated!',
'update_email_mail_message' => 'Your Email Has Been Updated!',
+
+ // Register
+ 'recaptcha_field_is_required' => 'reCaptcha field is required.',
+ 'failed_to_validate_captcha' => 'Failed to validate captcha.',
];
diff --git a/addons/default/visiosoft/profile-module/resources/lang/en/section.php b/addons/default/visiosoft/profile-module/resources/lang/en/section.php
index 3564a569b..33c358b85 100644
--- a/addons/default/visiosoft/profile-module/resources/lang/en/section.php
+++ b/addons/default/visiosoft/profile-module/resources/lang/en/section.php
@@ -8,4 +8,5 @@ return [
'title' => 'Adress',
],
'general_setting' => 'General Settings',
+ 'recaptcha' => 'reCAPTCHA',
];
diff --git a/addons/default/visiosoft/profile-module/resources/lang/en/setting.php b/addons/default/visiosoft/profile-module/resources/lang/en/setting.php
index d97d7cb1d..9c1e08a97 100644
--- a/addons/default/visiosoft/profile-module/resources/lang/en/setting.php
+++ b/addons/default/visiosoft/profile-module/resources/lang/en/setting.php
@@ -7,8 +7,17 @@ return [
'upload_avatar' => [
'name' => 'Avatar Upload',
],
-
'show_tax_office' => [
'name' => 'Show Tax Office Field',
],
+ 'google_captcha_site_key' => [
+ 'name' => 'Google Captcha Site Key',
+ ],
+ 'google_captcha_secret_key' => [
+ 'name' => 'Google Captcha Secret Key',
+ ],
+ 'score_threshold' => [
+ 'name' => 'Score Threshold',
+ 'instructions' => 'A value between 0 and 1. The higher the threshold the more strict ReCaptcha is in trying to determine if a user is a bot or not.',
+ ],
];
diff --git a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php
index f4c0d6c22..89a9cbc55 100644
--- a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php
+++ b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormBuilder.php
@@ -4,6 +4,7 @@ use Anomaly\Streams\Platform\Ui\Form\FormBuilder;
use Visiosoft\ProfileModule\Profile\Register2\Command\SetOptions;
use Anomaly\UsersModule\User\UserModel;
use Visiosoft\ProfileModule\Profile\Validation\ValidateRegister;
+use Visiosoft\ProfileModule\Rules\ReCaptchaRule;
/**
* Class RegisterFormBuilder
@@ -37,6 +38,22 @@ class Register2FormBuilder extends FormBuilder
* @var array
*/
protected $fields = [
+ 'recaptcha_token' => [
+ 'required' => true,
+ 'type' => 'anomaly.field_type.text',
+ 'config' => [
+ "max" => 0,
+ ],
+ 'rules' => [
+ 'valid_recaptcha'
+ ],
+ 'validators' => [
+ 'valid_recaptcha' => [
+ 'message' => false,
+ 'handler' => ReCaptchaRule::class
+ ]
+ ]
+ ],
'username' => [
'required' => true,
],
diff --git a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php
index 3dd4ba818..cf49a76ab 100644
--- a/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php
+++ b/addons/default/visiosoft/profile-module/src/Profile/Register2/Register2FormHandler.php
@@ -62,7 +62,8 @@ class Register2FormHandler
$fields['accept_terms'],
$fields['accept_protection_law'],
$fields['accept_privacy_terms'],
- $fields['receive_sms_emails']
+ $fields['receive_sms_emails'],
+ $fields['recaptcha_token']
);
$register = $users->create($fields);
diff --git a/addons/default/visiosoft/profile-module/src/Rules/ReCaptchaRule.php b/addons/default/visiosoft/profile-module/src/Rules/ReCaptchaRule.php
new file mode 100644
index 000000000..e12f90c46
--- /dev/null
+++ b/addons/default/visiosoft/profile-module/src/Rules/ReCaptchaRule.php
@@ -0,0 +1,37 @@
+message = $message;
+ }
+
+ public function handle($attribute, $value)
+ {
+ if (empty($value)) {
+ $this->message->error(trans('visiosoft.module.profile::message.recaptcha_field_is_required'));
+
+ return false;
+ }
+
+ $recaptcha = new ReCaptcha(setting_value('visiosoft.module.profile::google_captcha_secret_key'));
+
+ $resp = $recaptcha->setExpectedHostname(request()->server('SERVER_NAME'))
+ ->setScoreThreshold(setting_value('visiosoft.module.profile::score_threshold'))
+ ->verify($value, request()->server('REMOTE_ADDR'));
+
+ if (!$resp->isSuccess()) {
+ $this->message->error('visiosoft.module.profile::message.failed_to_validate_captcha');
+
+ return false;
+ }
+
+ return true;
+ }
+}
\ No newline at end of file