Skip to content

Commit 088c7a6

Browse files
author
Stig Venaas
committed
Adding ldap_set_rebind_proc() for APIs with V3 3 arg variant, need more
testing.
1 parent ce4c65a commit 088c7a6

File tree

3 files changed

+111
-0
lines changed

3 files changed

+111
-0
lines changed

ext/ldap/config.m4

+11
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,15 @@ if test "$PHP_LDAP" != "no"; then
9090
PHP_ADD_INCLUDE($LDAP_INCDIR)
9191
PHP_SUBST(LDAP_SHARED_LIBADD)
9292
AC_DEFINE(HAVE_LDAP,1,[ ])
93+
94+
dnl Check for 3 arg ldap_set_rebind_proc
95+
_SAVE_CPPFLAGS=$CPPFLAGS
96+
CPPFLAGS="$CPPFLAGS -I$LDAP_INCDIR"
97+
AC_CACHE_CHECK([for 3 arg ldap_set_rebind_proc], ac_cv_3arg_setrebindproc,
98+
[AC_TRY_COMPILE([#include <ldap.h>], [ldap_set_rebind_proc(0,0,0)],
99+
ac_cv_3arg_setrebindproc=yes, ac_cv_3arg_setrebindproc=no)])
100+
if test "$ac_cv_3arg_setrebindproc" = yes; then
101+
AC_DEFINE(HAVE_3ARG_SETREBINDPROC,1,[Whether 3 arg set_rebind_proc()])
102+
fi
103+
CPPFLAGS=$_SAVE_CPPFLAGS
93104
fi

ext/ldap/ldap.c

+96
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353

5454
typedef struct {
5555
LDAP *link;
56+
#ifdef HAVE_3ARG_SETREBINDPROC
57+
zval *rebindproc;
58+
#endif
5659
} ldap_linkdata;
5760

5861
ZEND_DECLARE_MODULE_GLOBALS(ldap)
@@ -119,6 +122,10 @@ function_entry ldap_functions[] = {
119122
PHP_FE(ldap_start_tls, NULL)
120123
#endif
121124

125+
#ifdef HAVE_3ARG_SETREBINDPROC
126+
PHP_FE(ldap_set_rebind_proc, NULL)
127+
#endif
128+
122129
#ifdef STR_TRANSLATION
123130
PHP_FE(ldap_t61_to_8859, NULL)
124131
PHP_FE(ldap_8859_to_t61, NULL)
@@ -152,6 +159,12 @@ static void _close_ldap_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
152159
ldap_linkdata *ld = (ldap_linkdata *)rsrc->ptr;
153160

154161
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
155168
efree(ld);
156169
LDAPG(num_links)--;
157170
}
@@ -1992,6 +2005,89 @@ PHP_FUNCTION(ldap_start_tls)
19922005
#endif
19932006

19942007

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+
19952091
#ifdef STR_TRANSLATION
19962092
/* {{{ php_ldap_do_translate
19972093
*/

ext/ldap/php_ldap.h

+4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ PHP_FUNCTION(ldap_rename);
9494
PHP_FUNCTION(ldap_start_tls);
9595
#endif
9696

97+
#ifdef HAVE_3ARG_SETREBINDPROC
98+
PHP_FUNCTION(ldap_set_rebind_proc);
99+
#endif
100+
97101
#ifdef STR_TRANSLATION
98102
PHP_FUNCTION(ldap_t61_to_8859);
99103
PHP_FUNCTION(ldap_8859_to_t61);

0 commit comments

Comments
 (0)