-
Notifications
You must be signed in to change notification settings - Fork 21
/
HoneypotCaptcha.php
148 lines (120 loc) · 3.5 KB
/
HoneypotCaptcha.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
/**
* @link https://sprout.barrelstrengthdesign.com
* @copyright Copyright (c) Barrel Strength Design LLC
* @license https://craftcms.github.io/license
*/
namespace barrelstrength\sproutforms\captchas;
use barrelstrength\sproutforms\base\Captcha;
use barrelstrength\sproutforms\events\OnBeforeValidateEntryEvent;
use Craft;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
use yii\base\Exception;
/**
* Class HoneypotCaptcha
*
* @property string $captchaSettingsHtml
* @property string $name
* @property string $description
* @property string $captchaHtml
*/
class HoneypotCaptcha extends Captcha
{
const HONEYPOT_CAPTCHA_INPUT_KEY = 'sprout-forms-hc';
/**
* @var string
*/
public $honeypotFieldName;
/**
* @var string
*/
public $honeypotScreenReaderMessage;
/**
* @inheritdoc
*/
public function getName(): string
{
return 'Honeypot Captcha';
}
/**
* @inheritdoc
*/
public function getDescription(): string
{
return Craft::t('sprout-forms', 'Block form submissions by robots who auto-fill all of your form fields ');
}
/**
* @inheritdoc
* @return string
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
* @throws Exception
* @throws \Exception
*/
public function getCaptchaSettingsHtml(): string
{
$settings = $this->getSettings();
$html = Craft::$app->getView()->renderTemplate('sprout-forms/_components/captchas/honeypot/settings', [
'captcha' => $this,
'settings' => $settings,
'defaultFieldName' => self::HONEYPOT_CAPTCHA_INPUT_KEY
]);
return $html;
}
/**
* @inheritdoc
*/
public function getCaptchaHtml(): string
{
$this->honeypotFieldName = $this->getHoneypotFieldName();
$this->honeypotScreenReaderMessage = $this->getHoneypotScreenReaderMessage();
$uniqueId = uniqid($this->honeypotFieldName, false);
$html = '
<div id="'.$uniqueId.'_wrapper" style="display:none;">
<label for="'.$uniqueId.'">'.$this->honeypotScreenReaderMessage.'</label>
<input type="text" id="'.$uniqueId.'" name="'.$uniqueId.'" value="" />
</div>';
return $html;
}
/**
* @inheritdoc
*/
public function verifySubmission(OnBeforeValidateEntryEvent $event): bool
{
$honeypotFieldName = $this->getHoneypotFieldName();
$honeypotValue = null;
foreach ($_POST as $key => $value) {
if (strpos($key, $honeypotFieldName) === 0) {
$honeypotValue = $_POST[$key];
break;
}
}
// The honeypot field must be left blank
if ($honeypotValue) {
$errorMessage = 'Honeypot must be blank. Value submitted: '.$honeypotValue;
Craft::error($errorMessage, __METHOD__);
$this->addError(self::CAPTCHA_ERRORS_KEY, $errorMessage);
return false;
}
return true;
}
/**
* @return string
*/
public function getHoneypotFieldName(): string
{
$settings = $this->getSettings();
return $settings['honeypotFieldName'];
}
/**
* @return string
*/
public function getHoneypotScreenReaderMessage(): string
{
$settings = $this->getSettings();
return $settings['honeypotScreenReaderMessage'] ?? Craft::t('sprout-forms', 'Leave this field blank');
}
}