|
67 | 67 | #include <sasl/sasl.h>
|
68 | 68 | #endif
|
69 | 69 |
|
| 70 | +#define PHP_LDAP_ESCAPE_FILTER 0x01 |
| 71 | +#define PHP_LDAP_ESCAPE_DN 0x02 |
| 72 | + |
70 | 73 | typedef struct {
|
71 | 74 | LDAP *link;
|
72 | 75 | #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
|
@@ -195,6 +198,9 @@ PHP_MINIT_FUNCTION(ldap)
|
195 | 198 | REGISTER_LONG_CONSTANT("GSLC_SSL_TWOWAY_AUTH", GSLC_SSL_TWOWAY_AUTH, CONST_PERSISTENT | CONST_CS);
|
196 | 199 | #endif
|
197 | 200 |
|
| 201 | + REGISTER_LONG_CONSTANT("LDAP_ESCAPE_FILTER", PHP_LDAP_ESCAPE_FILTER, CONST_PERSISTENT | CONST_CS); |
| 202 | + REGISTER_LONG_CONSTANT("LDAP_ESCAPE_DN", PHP_LDAP_ESCAPE_DN, CONST_PERSISTENT | CONST_CS); |
| 203 | + |
198 | 204 | le_link = zend_register_list_destructors_ex(_close_ldap_link, NULL, "ldap link", module_number);
|
199 | 205 | le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number);
|
200 | 206 | le_result_entry = zend_register_list_destructors_ex(_free_ldap_result_entry, NULL, "ldap result entry", module_number);
|
@@ -2136,6 +2142,81 @@ PHP_FUNCTION(ldap_set_rebind_proc)
|
2136 | 2142 | /* }}} */
|
2137 | 2143 | #endif
|
2138 | 2144 |
|
| 2145 | +static void php_ldap_do_escape(const zend_bool *map, const unsigned char *value, const int valuelen, unsigned char **result, int *resultlen) |
| 2146 | +{ |
| 2147 | + char hex[] = "0123456789abcdef"; |
| 2148 | + int i, p = 0; |
| 2149 | + size_t len = 0; |
| 2150 | + |
| 2151 | + for (i = 0; i < valuelen; i++) { |
| 2152 | + len += (map[value[i]]) ? 3 : 1; |
| 2153 | + } |
| 2154 | + len += 1; |
| 2155 | + |
| 2156 | + (*result) = (unsigned char *)emalloc(len); |
| 2157 | + (*resultlen) = (int)len; |
| 2158 | + |
| 2159 | + for (i = 0; i < valuelen; i++) { |
| 2160 | + if (map[value[i]]) { |
| 2161 | + (*result)[p++] = '\\'; |
| 2162 | + (*result)[p++] = hex[value[i] >> 4]; |
| 2163 | + (*result)[p++] = hex[value[i] & 0x0f]; |
| 2164 | + } else { |
| 2165 | + (*result)[p++] = value[i]; |
| 2166 | + } |
| 2167 | + } |
| 2168 | + |
| 2169 | + (*result)[p++] = '\0'; |
| 2170 | +} |
| 2171 | + |
| 2172 | +static void php_ldap_escape_map_set_chars(zend_bool *map, const unsigned char *chars, const int charslen, char escape) |
| 2173 | +{ |
| 2174 | + int i = 0; |
| 2175 | + while (i < charslen) { |
| 2176 | + map[chars[i++]] = escape; |
| 2177 | + } |
| 2178 | +} |
| 2179 | + |
| 2180 | +PHP_FUNCTION(ldap_escape) |
| 2181 | +{ |
| 2182 | + unsigned char *value, *ignores, *result; |
| 2183 | + int valuelen = 0, ignoreslen = 0, resultlen = 0, i; |
| 2184 | + long flags = 0; |
| 2185 | + zend_bool map[256] = {0}, havecharlist = 0; |
| 2186 | + |
| 2187 | + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|sl", &value, &valuelen, &ignores, &ignoreslen, &flags) != SUCCESS) { |
| 2188 | + return; |
| 2189 | + } |
| 2190 | + |
| 2191 | + if (!valuelen) { |
| 2192 | + RETURN_EMPTY_STRING(); |
| 2193 | + } |
| 2194 | + |
| 2195 | + if (flags & PHP_LDAP_ESCAPE_FILTER) { |
| 2196 | + havecharlist = 1; |
| 2197 | + php_ldap_escape_map_set_chars(map, "\\*()\0", sizeof("\\*()\0") - 1, 1); |
| 2198 | + } |
| 2199 | + |
| 2200 | + if (flags & PHP_LDAP_ESCAPE_DN) { |
| 2201 | + havecharlist = 1; |
| 2202 | + php_ldap_escape_map_set_chars(map, "\\,=+<>;\"#", sizeof("\\,=+<>;\"#") - 1, 1); |
| 2203 | + } |
| 2204 | + |
| 2205 | + if (!havecharlist) { |
| 2206 | + for (i = 0; i < 256; i++) { |
| 2207 | + map[i] = 1; |
| 2208 | + } |
| 2209 | + } |
| 2210 | + |
| 2211 | + if (ignoreslen) { |
| 2212 | + php_ldap_escape_map_set_chars(map, ignores, ignoreslen, 0); |
| 2213 | + } |
| 2214 | + |
| 2215 | + php_ldap_do_escape(map, value, valuelen, &result, &resultlen); |
| 2216 | + |
| 2217 | + RETURN_STRINGL(result, resultlen - 1, 0); |
| 2218 | +} |
| 2219 | + |
2139 | 2220 | #ifdef STR_TRANSLATION
|
2140 | 2221 | /* {{{ php_ldap_do_translate
|
2141 | 2222 | */
|
@@ -2625,6 +2706,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_set_rebind_proc, 0, 0, 2)
|
2625 | 2706 | ZEND_END_ARG_INFO()
|
2626 | 2707 | #endif
|
2627 | 2708 |
|
| 2709 | +ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_escape, 0, 0, 1) |
| 2710 | + ZEND_ARG_INFO(0, value) |
| 2711 | + ZEND_ARG_INFO(0, ignore) |
| 2712 | + ZEND_ARG_INFO(0, flags) |
| 2713 | +ZEND_END_ARG_INFO() |
| 2714 | + |
2628 | 2715 | #ifdef STR_TRANSLATION
|
2629 | 2716 | ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_t61_to_8859, 0, 0, 1)
|
2630 | 2717 | ZEND_ARG_INFO(0, value)
|
@@ -2703,6 +2790,8 @@ const zend_function_entry ldap_functions[] = {
|
2703 | 2790 | PHP_FE(ldap_set_rebind_proc, arginfo_ldap_set_rebind_proc)
|
2704 | 2791 | #endif
|
2705 | 2792 |
|
| 2793 | + PHP_FE(ldap_escape, arginfo_ldap_escape) |
| 2794 | + |
2706 | 2795 | #ifdef STR_TRANSLATION
|
2707 | 2796 | PHP_FE(ldap_t61_to_8859, arginfo_ldap_t61_to_8859)
|
2708 | 2797 | PHP_FE(ldap_8859_to_t61, arginfo_ldap_8859_to_t61)
|
|
0 commit comments