17
17
#endif
18
18
19
19
#include "php_intl.h"
20
+ #include "intl_convert.h"
20
21
#include "spoofchecker_class.h"
21
22
22
23
/* {{{ Checks if a given text contains any suspicious characters */
23
24
PHP_METHOD (Spoofchecker , isSuspicious )
24
25
{
25
26
int32_t ret , errmask ;
26
- char * text ;
27
- size_t text_len ;
27
+ zend_string * text ;
28
28
zval * error_code = NULL ;
29
29
SPOOFCHECKER_METHOD_INIT_VARS ;
30
30
31
31
ZEND_PARSE_PARAMETERS_START (1 , 2 )
32
- Z_PARAM_STRING (text , text_len )
32
+ Z_PARAM_STR (text )
33
33
Z_PARAM_OPTIONAL
34
34
Z_PARAM_ZVAL (error_code )
35
35
ZEND_PARSE_PARAMETERS_END ();
36
36
37
37
SPOOFCHECKER_METHOD_FETCH_OBJECT ;
38
38
39
39
#if U_ICU_VERSION_MAJOR_NUM >= 58
40
- ret = uspoof_check2UTF8 (co -> uspoof , text , text_len , co -> uspoofres , SPOOFCHECKER_ERROR_CODE_P (co ));
40
+ ret = uspoof_check2UTF8 (co -> uspoof , ZSTR_VAL ( text ), ZSTR_LEN ( text ) , co -> uspoofres , SPOOFCHECKER_ERROR_CODE_P (co ));
41
41
#else
42
- ret = uspoof_checkUTF8 (co -> uspoof , text , text_len , NULL , SPOOFCHECKER_ERROR_CODE_P (co ));
42
+ ret = uspoof_checkUTF8 (co -> uspoof , ZSTR_VAL ( text ), ZSTR_LEN ( text ) , NULL , SPOOFCHECKER_ERROR_CODE_P (co ));
43
43
#endif
44
44
45
45
if (U_FAILURE (SPOOFCHECKER_ERROR_CODE (co ))) {
@@ -65,23 +65,22 @@ PHP_METHOD(Spoofchecker, isSuspicious)
65
65
PHP_METHOD (Spoofchecker , areConfusable )
66
66
{
67
67
int ret ;
68
- char * s1 , * s2 ;
69
- size_t s1_len , s2_len ;
68
+ zend_string * s1 , * s2 ;
70
69
zval * error_code = NULL ;
71
70
SPOOFCHECKER_METHOD_INIT_VARS ;
72
71
73
72
ZEND_PARSE_PARAMETERS_START (2 , 3 )
74
- Z_PARAM_STRING (s1 , s1_len )
75
- Z_PARAM_STRING (s2 , s2_len )
73
+ Z_PARAM_STR (s1 )
74
+ Z_PARAM_STR (s2 )
76
75
Z_PARAM_OPTIONAL
77
76
Z_PARAM_ZVAL (error_code )
78
77
ZEND_PARSE_PARAMETERS_END ();
79
78
80
79
SPOOFCHECKER_METHOD_FETCH_OBJECT ;
81
- if (s1_len > INT32_MAX || s2_len > INT32_MAX ) {
80
+ if (ZSTR_LEN ( s1 ) > INT32_MAX || ZSTR_LEN ( s2 ) > INT32_MAX ) {
82
81
SPOOFCHECKER_ERROR_CODE (co ) = U_BUFFER_OVERFLOW_ERROR ;
83
82
} else {
84
- ret = uspoof_areConfusableUTF8 (co -> uspoof , s1 , (int32_t )s1_len , s2 , (int32_t )s2_len , SPOOFCHECKER_ERROR_CODE_P (co ));
83
+ ret = uspoof_areConfusableUTF8 (co -> uspoof , ZSTR_VAL ( s1 ) , (int32_t )ZSTR_LEN ( s1 ), ZSTR_VAL ( s2 ) , (int32_t )ZSTR_LEN ( s2 ) , SPOOFCHECKER_ERROR_CODE_P (co ));
85
84
}
86
85
if (U_FAILURE (SPOOFCHECKER_ERROR_CODE (co ))) {
87
86
php_error_docref (NULL , E_WARNING , "(%d) %s" , SPOOFCHECKER_ERROR_CODE (co ), u_errorName (SPOOFCHECKER_ERROR_CODE (co )));
@@ -98,17 +97,16 @@ PHP_METHOD(Spoofchecker, areConfusable)
98
97
/* {{{ Locales to use when running checks */
99
98
PHP_METHOD (Spoofchecker , setAllowedLocales )
100
99
{
101
- char * locales ;
102
- size_t locales_len ;
100
+ zend_string * locales ;
103
101
SPOOFCHECKER_METHOD_INIT_VARS ;
104
102
105
103
ZEND_PARSE_PARAMETERS_START (1 , 1 )
106
- Z_PARAM_STRING (locales , locales_len )
104
+ Z_PARAM_STR (locales )
107
105
ZEND_PARSE_PARAMETERS_END ();
108
106
109
107
SPOOFCHECKER_METHOD_FETCH_OBJECT ;
110
108
111
- uspoof_setAllowedLocales (co -> uspoof , locales , SPOOFCHECKER_ERROR_CODE_P (co ));
109
+ uspoof_setAllowedLocales (co -> uspoof , ZSTR_VAL ( locales ) , SPOOFCHECKER_ERROR_CODE_P (co ));
112
110
113
111
if (U_FAILURE (SPOOFCHECKER_ERROR_CODE (co ))) {
114
112
php_error_docref (NULL , E_WARNING , "(%d) %s" , SPOOFCHECKER_ERROR_CODE (co ), u_errorName (SPOOFCHECKER_ERROR_CODE (co )));
@@ -167,3 +165,74 @@ PHP_METHOD(Spoofchecker, setRestrictionLevel)
167
165
}
168
166
/* }}} */
169
167
#endif
168
+
169
+ PHP_METHOD (Spoofchecker , setAllowedChars )
170
+ {
171
+ zend_string * pattern ;
172
+ UChar * upattern = NULL ;
173
+ int32_t upattern_len = 0 ;
174
+ zend_long pattern_option = 0 ;
175
+ SPOOFCHECKER_METHOD_INIT_VARS ;
176
+
177
+ ZEND_PARSE_PARAMETERS_START (1 , 2 )
178
+ Z_PARAM_STR (pattern )
179
+ Z_PARAM_OPTIONAL
180
+ Z_PARAM_LONG (pattern_option )
181
+ ZEND_PARSE_PARAMETERS_END ();
182
+ SPOOFCHECKER_METHOD_FETCH_OBJECT ;
183
+
184
+ if (ZSTR_LEN (pattern ) > INT32_MAX ) {
185
+ zend_argument_value_error (1 , "must be less than or equal to " ZEND_LONG_FMT " bytes long" , INT32_MAX );
186
+ RETURN_THROWS ();
187
+ }
188
+
189
+ /* uset_applyPattern requires to start with a regex range char */
190
+ if (ZSTR_VAL (pattern )[0 ] != '[' || ZSTR_VAL (pattern )[ZSTR_LEN (pattern ) - 1 ] != ']' ) {
191
+ zend_argument_value_error (1 , "must be a valid regular expression character set pattern" );
192
+ RETURN_THROWS ();
193
+ }
194
+
195
+ intl_convert_utf8_to_utf16 (& upattern , & upattern_len , ZSTR_VAL (pattern ), ZSTR_LEN (pattern ), SPOOFCHECKER_ERROR_CODE_P (co ));
196
+ if (U_FAILURE (SPOOFCHECKER_ERROR_CODE (co ))) {
197
+ zend_argument_value_error (1 , "string conversion to unicode encoding failed (%d) %s" , SPOOFCHECKER_ERROR_CODE (co ), u_errorName (SPOOFCHECKER_ERROR_CODE (co )));
198
+ RETURN_THROWS ();
199
+ }
200
+
201
+ USet * set = uset_openEmpty ();
202
+
203
+ /* pattern is either USE_IGNORE_SPACE alone or in conjunction with the following flags (but mutually exclusive) */
204
+ if (pattern_option &&
205
+ pattern_option != USET_IGNORE_SPACE &&
206
+ #if U_ICU_VERSION_MAJOR_NUM >= 73
207
+ pattern_option != (USET_IGNORE_SPACE |USET_SIMPLE_CASE_INSENSITIVE ) &&
208
+ #endif
209
+ pattern_option != (USET_IGNORE_SPACE |USET_CASE_INSENSITIVE ) &&
210
+ pattern_option != (USET_IGNORE_SPACE |USET_ADD_CASE_MAPPINGS )) {
211
+ zend_argument_value_error (2 , "must be a valid pattern option, 0 or (SpoofChecker::IGNORE_SPACE|(<none> or SpoofChecker::USET_CASE_INSENSITIVE or SpoofChecker::USET_ADD_CASE_MAPPINGS"
212
+ #if U_ICU_VERSION_MAJOR_NUM >= 73
213
+ " or SpoofChecker::USET_SIMPLE_CASE_INSENSITIVE"
214
+ #endif
215
+ "))"
216
+ );
217
+ uset_close (set );
218
+ efree (upattern );
219
+ RETURN_THROWS ();
220
+ }
221
+
222
+ uset_applyPattern (set , upattern , upattern_len , (uint32_t )pattern_option , SPOOFCHECKER_ERROR_CODE_P (co ));
223
+ if (U_FAILURE (SPOOFCHECKER_ERROR_CODE (co ))) {
224
+ zend_argument_value_error (1 , "must be a valid regular expression character set pattern (%d) %s" , SPOOFCHECKER_ERROR_CODE (co ), u_errorName (SPOOFCHECKER_ERROR_CODE (co )));
225
+ uset_close (set );
226
+ efree (upattern );
227
+ RETURN_THROWS ();
228
+ }
229
+
230
+ uset_compact (set );
231
+ uspoof_setAllowedChars (co -> uspoof , set , SPOOFCHECKER_ERROR_CODE_P (co ));
232
+ uset_close (set );
233
+ efree (upattern );
234
+
235
+ if (U_FAILURE (SPOOFCHECKER_ERROR_CODE (co ))) {
236
+ php_error_docref (NULL , E_WARNING , "(%d) %s" , SPOOFCHECKER_ERROR_CODE (co ), u_errorName (SPOOFCHECKER_ERROR_CODE (co )));
237
+ }
238
+ }
0 commit comments