PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-waf / src / class-waf-operators.php
jetpack / jetpack_vendor / automattic / jetpack-waf / src Last commit date
brute-force-protection 8 months ago exceptions 8 months ago abstract-blocked-login-page.php 2 months ago class-brute-force-protection.php 1 month ago class-compatibility.php 1 month ago class-rest-controller.php 8 months ago class-waf-blocked-login-page.php 8 months ago class-waf-blocklog-manager.php 8 months ago class-waf-cli.php 8 months ago class-waf-constants.php 1 year ago class-waf-initializer.php 1 month ago class-waf-operators.php 2 years ago class-waf-request.php 6 months ago class-waf-rules-manager.php 1 year ago class-waf-runner.php 1 month ago class-waf-runtime.php 2 months ago class-waf-standalone-bootstrap.php 1 month ago class-waf-stats.php 1 year ago class-waf-transforms.php 2 years ago functions.php 1 year ago
class-waf-operators.php
287 lines
1 <?php
2 /**
3 * Rule compiler for Jetpack Waf.
4 *
5 * @package automattic/jetpack-waf
6 */
7
8 namespace Automattic\Jetpack\Waf;
9
10 /**
11 * Waf_Operators class
12 */
13 class Waf_Operators {
14 /**
15 * Returns true if the test string is found at the beginning of the input.
16 *
17 * @param string $input Input.
18 * @param string $test Test.
19 * @return string|false
20 */
21 public function begins_with( $input, $test ) {
22 if ( '' === $input && '' === $test ) {
23 return '';
24 }
25
26 return substr( $input, 0, strlen( $test ) ) === $test
27 ? $test
28 : false;
29 }
30
31 /**
32 * Returns true if the test string is found anywhere in the input.
33 *
34 * @param string $input Input.
35 * @param string $test Test.
36 * @return string|false
37 */
38 public function contains( $input, $test ) {
39 if ( empty( $input ) || empty( $test ) ) {
40 return false;
41 }
42
43 return strpos( $input, $test ) !== false
44 ? $test
45 : false;
46 }
47
48 /**
49 * Returns true if the test string with word boundaries is found anywhere in the input.
50 *
51 * @param string $input Input.
52 * @param string $test Test.
53 * @return string|false
54 */
55 public function contains_word( $input, $test ) {
56 return ( $input === $test || 1 === preg_match( '/\b' . preg_quote( $test, '/' ) . '\b/Ds', $input ) )
57 ? $test
58 : false;
59 }
60
61 /**
62 * Returns true if the test string is found at the end of the input.
63 *
64 * @param string $input Input.
65 * @param string $test Test.
66 * @return string|false
67 */
68 public function ends_with( $input, $test ) {
69 return ( '' === $test || substr( $input, -1 * strlen( $test ) ) === $test )
70 ? $test
71 : false;
72 }
73
74 /**
75 * Returns true if the input value is equal to the test value.
76 * If either value cannot be converted to an int it will be treated as 0.
77 *
78 * @param mixed $input Input.
79 * @param mixed $test Test.
80 * @return int|false
81 */
82 public function eq( $input, $test ) {
83 return intval( $input ) === intval( $test )
84 ? $input
85 : false;
86 }
87
88 /**
89 * Returns true if the input value is greater than or equal to the test value.
90 * If either value cannot be converted to an int it will be treated as 0.
91 *
92 * @param mixed $input Input.
93 * @param mixed $test Test.
94 * @return int|false
95 */
96 public function ge( $input, $test ) {
97 return intval( $input ) >= intval( $test )
98 ? $input
99 : false;
100 }
101
102 /**
103 * Returns true if the input value is greater than the test value.
104 * If either value cannot be converted to an int it will be treated as 0.
105 *
106 * @param mixed $input Input.
107 * @param mixed $test Test.
108 * @return int|false
109 */
110 public function gt( $input, $test ) {
111 return intval( $input ) > intval( $test )
112 ? $input
113 : false;
114 }
115
116 /**
117 * Returns true if the input value is less than or equal to the test value.
118 * If either value cannot be converted to an int it will be treated as 0.
119 *
120 * @param mixed $input Input.
121 * @param mixed $test Test.
122 * @return int|false
123 */
124 public function le( $input, $test ) {
125 return intval( $input ) <= intval( $test )
126 ? $input
127 : false;
128 }
129
130 /**
131 * Returns true if the input value is less than the test value.
132 * If either value cannot be converted to an int it will be treated as 0.
133 *
134 * @param mixed $input Input.
135 * @param mixed $test Test.
136 * @return int|false
137 */
138 public function lt( $input, $test ) {
139 return intval( $input ) < intval( $test )
140 ? $input
141 : false;
142 }
143
144 /**
145 * Returns false.
146 *
147 * @return false
148 */
149 public function no_match() {
150 return false;
151 }
152
153 /**
154 * Uses a multi-string matching algorithm to search through $input for a number of given $words.
155 *
156 * @param string $input Input.
157 * @param string[] $words \AhoCorasick\MultiStringMatcher $matcher.
158 * @return string[]|false Returns the words that were found in $input, or FALSE if no words were found.
159 */
160 public function pm( $input, $words ) {
161 $results = $this->get_multi_string_matcher( $words )->searchIn( $input );
162
163 return isset( $results[0] )
164 ? array_map(
165 function ( $r ) {
166 return $r[1]; },
167 $results
168 )
169 : false;
170 }
171
172 /**
173 * The last-used pattern-matching algorithm.
174 *
175 * @var array
176 */
177 private $last_multi_string_matcher = array( null, null );
178
179 /**
180 * Creates a matcher that uses the Aho-Corasick algorithm to efficiently find a number of words in an input string.
181 * Caches the last-used matcher so that the same word list doesn't have to be compiled multiple times.
182 *
183 * @param string[] $words Words.
184 * @return \AhoCorasick\MultiStringMatcher
185 */
186 private function get_multi_string_matcher( $words ) {
187 // only create a new matcher entity if we don't have one already for this word list.
188 if ( $this->last_multi_string_matcher[0] !== $words ) {
189 $this->last_multi_string_matcher = array( $words, new \AhoCorasick\MultiStringMatcher( $words ) );
190 }
191
192 return $this->last_multi_string_matcher[1];
193 }
194
195 /**
196 * Performs a regular expression match on the input subject using the given pattern.
197 * Returns false if the pattern does not match, or the substring(s) of the input
198 * that were matched by the pattern.
199 *
200 * @param string $subject Subject.
201 * @param string $pattern Pattern.
202 * @return string[]|false
203 */
204 public function rx( $subject, $pattern ) {
205 $matched = preg_match( $pattern, $subject, $matches );
206 return 1 === $matched
207 ? $matches
208 : false;
209 }
210
211 /**
212 * Returns true if the given input string matches the test string.
213 *
214 * @param string $input Input.
215 * @param string $test Test.
216 * @return string|false
217 */
218 public function streq( $input, $test ) {
219 return $input === $test
220 ? $test
221 : false;
222 }
223
224 /**
225 * Returns true.
226 *
227 * @param string $input Input.
228 * @return bool
229 */
230 public function unconditional_match( $input ) {
231 return $input;
232 }
233
234 /**
235 * Checks to see if the input string only contains characters within the given byte range
236 *
237 * @param string $input Input.
238 * @param array $valid_range Valid range.
239 * @return string
240 */
241 public function validate_byte_range( $input, $valid_range ) {
242 if ( '' === $input ) {
243 // an empty string is considered "valid".
244 return false;
245 }
246 $i = 0;
247 while ( isset( $input[ $i ] ) ) {
248 $n = ord( $input[ $i ] );
249 if ( $n < $valid_range['min'] || $n > $valid_range['max'] ) {
250 return $input[ $i ];
251 }
252 $valid = false;
253 foreach ( $valid_range['range'] as $b ) {
254 if ( $n === $b || is_array( $b ) && $n >= $b[0] && $n <= $b[1] ) {
255 $valid = true;
256 break;
257 }
258 }
259 if ( ! $valid ) {
260 return $input[ $i ];
261 }
262 ++$i;
263 }
264
265 // if there weren't any invalid bytes, return false.
266 return false;
267 }
268
269 /**
270 * Returns true if the input value is found anywhere inside the test value
271 * (i.e. the inverse of @contains)
272 *
273 * @param mixed $input Input.
274 * @param mixed $test Test.
275 * @return string|false
276 */
277 public function within( $input, $test ) {
278 if ( '' === $input || '' === $test ) {
279 return false;
280 }
281
282 return strpos( $test, $input ) !== false
283 ? $input
284 : false;
285 }
286 }
287