Validator
1 month ago
BehavioralSignals.php
1 month ago
CaptchaConstants.php
2 months ago
CaptchaFormRenderer.php
2 weeks ago
CaptchaHooks.php
2 months ago
CaptchaPhrase.php
1 year ago
CaptchaRenderer.php
4 months ago
CaptchaSession.php
1 year ago
CaptchaUrlFactory.php
4 months ago
PageRenderer.php
5 months ago
ReCaptchaHooks.php
2 months ago
ReCaptchaRenderer.php
1 year ago
ReCaptchaValidator.php
1 year ago
TurnstileHooks.php
2 months ago
TurnstileRenderer.php
2 months ago
TurnstileValidator.php
2 months ago
index.php
1 year ago
CaptchaHooks.php
97 lines
| 1 | <?php declare(strict_types = 1); |
| 2 | |
| 3 | namespace MailPoet\Captcha; |
| 4 | |
| 5 | if (!defined('ABSPATH')) exit; |
| 6 | |
| 7 | |
| 8 | use MailPoet\Captcha\Validator\CaptchaValidator; |
| 9 | use MailPoet\Captcha\Validator\ValidationError; |
| 10 | use MailPoet\Settings\SettingsController; |
| 11 | |
| 12 | class CaptchaHooks { |
| 13 | |
| 14 | private SettingsController $settings; |
| 15 | private CaptchaValidator $captchaValidator; |
| 16 | private CaptchaRenderer $captchaRenderer; |
| 17 | |
| 18 | public function __construct( |
| 19 | SettingsController $settings, |
| 20 | CaptchaValidator $captchaValidator, |
| 21 | CaptchaRenderer $captchaRenderer |
| 22 | ) { |
| 23 | $this->settings = $settings; |
| 24 | $this->captchaValidator = $captchaValidator; |
| 25 | $this->captchaRenderer = $captchaRenderer; |
| 26 | } |
| 27 | |
| 28 | public function isEnabled(): bool { |
| 29 | // In some cases on multisite instance or during fresh install, this code may run |
| 30 | // before DB migrator and settings table is not ready at that time |
| 31 | try { |
| 32 | if (!$this->settings->get(CaptchaConstants::ON_REGISTER_FORMS_SETTING_NAME, false)) { |
| 33 | return false; |
| 34 | } |
| 35 | |
| 36 | $type = $this->settings->get('captcha.type'); |
| 37 | return CaptchaConstants::isBuiltIn($type) |
| 38 | || (CaptchaConstants::isDisabled($type) && $this->captchaRenderer->isSupported()); |
| 39 | } catch (\Exception $e) { |
| 40 | return false; |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | public function renderInWPRegisterForm() { |
| 45 | $this->render('form#registerform', CaptchaUrlFactory::REFERER_WP_FORM); |
| 46 | } |
| 47 | |
| 48 | public function renderInWCRegisterForm() { |
| 49 | $this->render('form.woocommerce-form-register', CaptchaUrlFactory::REFERER_WC_FORM); |
| 50 | } |
| 51 | |
| 52 | private function render($formSelector, $referrer) { |
| 53 | // phpcs:disable WordPress.Security.EscapeOutput.HeredocOutputNotEscaped |
| 54 | echo <<<HTML |
| 55 | <input class="mailpoet_hidden_field" type="hidden" name="action" value="mailpoet"> |
| 56 | <input class="mailpoet_hidden_field" type="hidden" name="endpoint" value="captcha"> |
| 57 | <input class="mailpoet_hidden_field" type="hidden" name="method" value="render"> |
| 58 | <input class="mailpoet_hidden_field" type="hidden" name="api_version" value="v1"> |
| 59 | |
| 60 | <input type="hidden" name="referrer_form" value="$referrer"> |
| 61 | |
| 62 | <script async defer> |
| 63 | document.addEventListener('DOMContentLoaded', function () { |
| 64 | let form = document.querySelector('$formSelector'); |
| 65 | |
| 66 | // Forward the original form action URL |
| 67 | let actionUrl = form.getAttribute('action') ?? window.location.href; |
| 68 | form.insertAdjacentHTML('beforeend', '<input type="hidden" name="referrer_form_url" value="' + actionUrl + '">'); |
| 69 | |
| 70 | // Submit the form to MP's AJAX endpoint |
| 71 | form.setAttribute('action', '/wp-admin/admin-ajax.php'); |
| 72 | |
| 73 | // Transform 'name' attr to 'data[name]' format |
| 74 | form.querySelectorAll('input,select,textarea,button[name][value]').forEach(function (field) { |
| 75 | if (!field.classList.contains('mailpoet_hidden_field')) { |
| 76 | field.setAttribute('name', 'data[' + field.getAttribute('name') + ']'); |
| 77 | } |
| 78 | }); |
| 79 | }); |
| 80 | </script> |
| 81 | HTML; |
| 82 | // phpcs:enable WordPress.Security.EscapeOutput.HeredocOutputNotEscaped |
| 83 | } |
| 84 | |
| 85 | public function validate(\WP_Error $errors) { |
| 86 | try { |
| 87 | // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized |
| 88 | $captchaData = $_POST['data'] ?? []; |
| 89 | $this->captchaValidator->validate(is_array($captchaData) ? $captchaData : []); |
| 90 | } catch (ValidationError $e) { |
| 91 | $errors->add('captcha_failed', $e->getMessage()); |
| 92 | } |
| 93 | |
| 94 | return $errors; |
| 95 | } |
| 96 | } |
| 97 |