|
53 | 53 |
|
54 | 54 | typedef struct {
|
55 | 55 | LDAP *link;
|
| 56 | +#ifdef HAVE_3ARG_SETREBINDPROC |
| 57 | + zval *rebindproc; |
| 58 | +#endif |
56 | 59 | } ldap_linkdata;
|
57 | 60 |
|
58 | 61 | ZEND_DECLARE_MODULE_GLOBALS(ldap)
|
@@ -119,6 +122,10 @@ function_entry ldap_functions[] = {
|
119 | 122 | PHP_FE(ldap_start_tls, NULL)
|
120 | 123 | #endif
|
121 | 124 |
|
| 125 | +#ifdef HAVE_3ARG_SETREBINDPROC |
| 126 | + PHP_FE(ldap_set_rebind_proc, NULL) |
| 127 | +#endif |
| 128 | + |
122 | 129 | #ifdef STR_TRANSLATION
|
123 | 130 | PHP_FE(ldap_t61_to_8859, NULL)
|
124 | 131 | PHP_FE(ldap_8859_to_t61, NULL)
|
@@ -152,6 +159,12 @@ static void _close_ldap_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
152 | 159 | ldap_linkdata *ld = (ldap_linkdata *)rsrc->ptr;
|
153 | 160 |
|
154 | 161 | ldap_unbind_s(ld->link);
|
| 162 | +#ifdef HAVE_3ARG_SETREBINDPROC |
| 163 | + if (ld->rebindproc != NULL) { |
| 164 | + zval_dtor(ld->rebindproc); |
| 165 | + FREE_ZVAL(ld->rebindproc); |
| 166 | + } |
| 167 | +#endif |
155 | 168 | efree(ld);
|
156 | 169 | LDAPG(num_links)--;
|
157 | 170 | }
|
@@ -1992,6 +2005,89 @@ PHP_FUNCTION(ldap_start_tls)
|
1992 | 2005 | #endif
|
1993 | 2006 |
|
1994 | 2007 |
|
| 2008 | +#ifdef HAVE_3ARG_SETREBINDPROC |
| 2009 | +int _ldap_rebind_proc(LDAP *ldap, LDAP_CONST char *url, ber_tag_t req, ber_int_t msgid, void *params) { |
| 2010 | + ldap_linkdata *ld; |
| 2011 | + int retval; |
| 2012 | + zval *cb_url; |
| 2013 | + zval **cb_args[2]; |
| 2014 | + zval *cb_retval; |
| 2015 | + zval *cb_link = (zval *) params; |
| 2016 | + |
| 2017 | + ld = (ldap_linkdata *) zend_fetch_resource(&cb_link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); |
| 2018 | + |
| 2019 | + /* link exists and callback set? */ |
| 2020 | + if (ld == NULL || ld->rebindproc == NULL) { |
| 2021 | + php_error(E_WARNING, "%s(): Link not found or no callback set", get_active_function_name(TSRMLS_C)); |
| 2022 | + return LDAP_OTHER; |
| 2023 | + } |
| 2024 | + |
| 2025 | + /* callback */ |
| 2026 | + MAKE_STD_ZVAL(cb_url); |
| 2027 | + ZVAL_STRING(cb_url, estrdup(url), 0); |
| 2028 | + cb_args[0] = &cb_link; |
| 2029 | + cb_args[1] = &cb_url; |
| 2030 | + if (call_user_function_ex(EG(function_table), NULL, ld->rebindproc, &cb_retval, 2, cb_args, 0, NULL) == SUCCESS && cb_retval) { |
| 2031 | + convert_to_long_ex(&cb_retval); |
| 2032 | + retval = Z_LVAL_P(cb_retval); |
| 2033 | + zval_ptr_dtor(&cb_retval); |
| 2034 | + } else { |
| 2035 | + php_error(E_WARNING, "LDAP: rebind_proc php callback failed"); |
| 2036 | + retval = LDAP_OTHER; |
| 2037 | + } |
| 2038 | + zval_dtor(cb_url); |
| 2039 | + FREE_ZVAL(cb_url); |
| 2040 | + return retval; |
| 2041 | +} |
| 2042 | + |
| 2043 | + |
| 2044 | +/* {{{ proto int ldap_set_rebind_proc(int link, string callback) |
| 2045 | + Set a callback function to do re-binds on referral chasing. */ |
| 2046 | +PHP_FUNCTION(ldap_set_rebind_proc) |
| 2047 | +{ |
| 2048 | + zval *link, *callback; |
| 2049 | + ldap_linkdata *ld; |
| 2050 | + char *callback_name; |
| 2051 | + |
| 2052 | + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &link, &callback) == FAILURE) { |
| 2053 | + RETURN_FALSE; |
| 2054 | + } |
| 2055 | + |
| 2056 | + ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, &link, -1, "ldap link", le_link); |
| 2057 | + |
| 2058 | + if (Z_TYPE_P(callback) == IS_STRING && Z_STRLEN_P(callback) == 0) { |
| 2059 | + /* unregister rebind procedure */ |
| 2060 | + if (ld->rebindproc != NULL) { |
| 2061 | + zval_dtor(ld->rebindproc); |
| 2062 | + ld->rebindproc = NULL; |
| 2063 | + ldap_set_rebind_proc(ld->link, NULL, NULL); |
| 2064 | + } |
| 2065 | + RETURN_TRUE; |
| 2066 | + } |
| 2067 | + |
| 2068 | + /* callable? */ |
| 2069 | + if (!zend_is_callable(callback, 0, &callback_name)) { |
| 2070 | + php_error(E_WARNING, "%s() expects argument 2, '%s', to be a valid callback", get_active_function_name(TSRMLS_C), callback_name); |
| 2071 | + efree(callback_name); |
| 2072 | + RETURN_FALSE; |
| 2073 | + } |
| 2074 | + efree(callback_name); |
| 2075 | + |
| 2076 | + /* register rebind procedure */ |
| 2077 | + if (ld->rebindproc == NULL) { |
| 2078 | + ldap_set_rebind_proc(ld->link, _ldap_rebind_proc, (void *) link); |
| 2079 | + } else { |
| 2080 | + zval_dtor(ld->rebindproc); |
| 2081 | + } |
| 2082 | + |
| 2083 | + ALLOC_ZVAL(ld->rebindproc); |
| 2084 | + *ld->rebindproc = *callback; |
| 2085 | + zval_copy_ctor(ld->rebindproc); |
| 2086 | + RETURN_TRUE; |
| 2087 | +} |
| 2088 | +#endif |
| 2089 | + |
| 2090 | + |
1995 | 2091 | #ifdef STR_TRANSLATION
|
1996 | 2092 | /* {{{ php_ldap_do_translate
|
1997 | 2093 | */
|
|
0 commit comments