cvs: php4 /ext/ldap config.m4 ldap.c php_ldap.h
| From: | Stig Venaas | Date: | Thu, 29 Nov 2001 20:26:20 +0000 |
| Subject: | cvs: php4 /ext/ldap config.m4 ldap.c php_ldap.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-8332@lists.php.net to get a copy of this message | ||
venaas Thu Nov 29 15:26:20 2001 EDT
Modified files:
/php4/ext/ldap config.m4 ldap.c php_ldap.h
Log:
Adding ldap_set_rebind_proc() for APIs with V3 3 arg variant, need more
testing.
Index: php4/ext/ldap/config.m4
diff -u php4/ext/ldap/config.m4:1.19 php4/ext/ldap/config.m4:1.20
--- php4/ext/ldap/config.m4:1.19 Mon May 21 15:47:15 2001
+++ php4/ext/ldap/config.m4 Thu Nov 29 15:26:20 2001
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.19 2001/05/21 19:47:15 sniper Exp $
+dnl $Id: config.m4,v 1.20 2001/11/29 20:26:20 venaas Exp $
AC_DEFUN(PHP_LDAP_CHECKS, [
if test -f $1/include/ldap.h; then
@@ -90,4 +90,15 @@
PHP_ADD_INCLUDE($LDAP_INCDIR)
PHP_SUBST(LDAP_SHARED_LIBADD)
AC_DEFINE(HAVE_LDAP,1,[ ])
+
+ dnl Check for 3 arg ldap_set_rebind_proc
+ _SAVE_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS -I$LDAP_INCDIR"
+ AC_CACHE_CHECK([for 3 arg ldap_set_rebind_proc], ac_cv_3arg_setrebindproc,
+ [AC_TRY_COMPILE([#include <ldap.h>], [ldap_set_rebind_proc(0,0,0)],
+ ac_cv_3arg_setrebindproc=yes, ac_cv_3arg_setrebindproc=no)])
+ if test "$ac_cv_3arg_setrebindproc" = yes; then
+ AC_DEFINE(HAVE_3ARG_SETREBINDPROC,1,[Whether 3 arg set_rebind_proc()])
+ fi
+ CPPFLAGS=$_SAVE_CPPFLAGS
fi
Index: php4/ext/ldap/ldap.c
diff -u php4/ext/ldap/ldap.c:1.106 php4/ext/ldap/ldap.c:1.107
--- php4/ext/ldap/ldap.c:1.106 Thu Nov 29 15:17:17 2001
+++ php4/ext/ldap/ldap.c Thu Nov 29 15:26:20 2001
@@ -22,7 +22,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: ldap.c,v 1.106 2001/11/29 20:17:17 venaas Exp $ */
+/* $Id: ldap.c,v 1.107 2001/11/29 20:26:20 venaas Exp $ */
#define IS_EXT_MODULE
#ifdef HAVE_CONFIG_H
@@ -53,6 +53,9 @@
typedef struct {
LDAP *link;
+#ifdef HAVE_3ARG_SETREBINDPROC
+ zval *rebindproc;
+#endif
} ldap_linkdata;
ZEND_DECLARE_MODULE_GLOBALS(ldap)
@@ -119,6 +122,10 @@
PHP_FE(ldap_start_tls, NULL)
#endif
+#ifdef HAVE_3ARG_SETREBINDPROC
+ PHP_FE(ldap_set_rebind_proc, NULL)
+#endif
+
#ifdef STR_TRANSLATION
PHP_FE(ldap_t61_to_8859, NULL)
PHP_FE(ldap_8859_to_t61, NULL)
@@ -152,6 +159,12 @@
ldap_linkdata *ld = (ldap_linkdata *)rsrc->ptr;
ldap_unbind_s(ld->link);
+#ifdef HAVE_3ARG_SETREBINDPROC
+ if (ld->rebindproc != NULL) {
+ zval_dtor(ld->rebindproc);
+ FREE_ZVAL(ld->rebindproc);
+ }
+#endif
efree(ld);
LDAPG(num_links)--;
}
@@ -262,7 +275,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "LDAP Support", "enabled" );
- php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 1.106 2001/11/29 20:17:17
venaas Exp $" );
+ php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 1.107 2001/11/29 20:26:20
venaas Exp $" );
php_info_print_table_row(2, "Total Links", maxl );
#ifdef LDAP_API_VERSION
@@ -1989,6 +2002,89 @@
}
}
/* }}} */
+#endif
+
+
+#ifdef HAVE_3ARG_SETREBINDPROC
+int _ldap_rebind_proc(LDAP *ldap, LDAP_CONST char *url, ber_tag_t req, ber_int_t msgid, void
*params) {
+ ldap_linkdata *ld;
+ int retval;
+ zval *cb_url;
+ zval **cb_args[2];
+ zval *cb_retval;
+ zval *cb_link = (zval *) params;
+
+ ld = (ldap_linkdata *) zend_fetch_resource(&cb_link TSRMLS_CC, -1, "ldap link",
NULL, 1, le_link);
+
+ /* link exists and callback set? */
+ if (ld == NULL || ld->rebindproc == NULL) {
+ php_error(E_WARNING, "%s(): Link not found or no callback set",
get_active_function_name(TSRMLS_C));
+ return LDAP_OTHER;
+ }
+
+ /* callback */
+ MAKE_STD_ZVAL(cb_url);
+ ZVAL_STRING(cb_url, estrdup(url), 0);
+ cb_args[0] = &cb_link;
+ cb_args[1] = &cb_url;
+ if (call_user_function_ex(EG(function_table), NULL, ld->rebindproc, &cb_retval, 2, cb_args,
0, NULL) == SUCCESS && cb_retval) {
+ convert_to_long_ex(&cb_retval);
+ retval = Z_LVAL_P(cb_retval);
+ zval_ptr_dtor(&cb_retval);
+ } else {
+ php_error(E_WARNING, "LDAP: rebind_proc php callback failed");
+ retval = LDAP_OTHER;
+ }
+ zval_dtor(cb_url);
+ FREE_ZVAL(cb_url);
+ return retval;
+}
+
+
+/* {{{ proto int ldap_set_rebind_proc(int link, string callback)
+ Set a callback function to do re-binds on referral chasing. */
+PHP_FUNCTION(ldap_set_rebind_proc)
+{
+ zval *link, *callback;
+ ldap_linkdata *ld;
+ char *callback_name;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &link, &callback) ==
FAILURE) {
+ RETURN_FALSE;
+ }
+
+ ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, &link, -1, "ldap link", le_link);
+
+ if (Z_TYPE_P(callback) == IS_STRING && Z_STRLEN_P(callback) == 0) {
+ /* unregister rebind procedure */
+ if (ld->rebindproc != NULL) {
+ zval_dtor(ld->rebindproc);
+ ld->rebindproc = NULL;
+ ldap_set_rebind_proc(ld->link, NULL, NULL);
+ }
+ RETURN_TRUE;
+ }
+
+ /* callable? */
+ if (!zend_is_callable(callback, 0, &callback_name)) {
+ php_error(E_WARNING, "%s() expects argument 2, '%s', to be a valid callback",
get_active_function_name(TSRMLS_C), callback_name);
+ efree(callback_name);
+ RETURN_FALSE;
+ }
+ efree(callback_name);
+
+ /* register rebind procedure */
+ if (ld->rebindproc == NULL) {
+ ldap_set_rebind_proc(ld->link, _ldap_rebind_proc, (void *) link);
+ } else {
+ zval_dtor(ld->rebindproc);
+ }
+
+ ALLOC_ZVAL(ld->rebindproc);
+ *ld->rebindproc = *callback;
+ zval_copy_ctor(ld->rebindproc);
+ RETURN_TRUE;
+}
#endif
Index: php4/ext/ldap/php_ldap.h
diff -u php4/ext/ldap/php_ldap.h:1.21 php4/ext/ldap/php_ldap.h:1.22
--- php4/ext/ldap/php_ldap.h:1.21 Wed Nov 21 15:14:17 2001
+++ php4/ext/ldap/php_ldap.h Thu Nov 29 15:26:20 2001
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_ldap.h,v 1.21 2001/11/21 20:14:17 venaas Exp $ */
+/* $Id: php_ldap.h,v 1.22 2001/11/29 20:26:20 venaas Exp $ */
#ifndef PHP_LDAP_H
#define PHP_LDAP_H
@@ -92,6 +92,10 @@
#if LDAP_API_VERSION > 2000
PHP_FUNCTION(ldap_start_tls);
+#endif
+
+#ifdef HAVE_3ARG_SETREBINDPROC
+PHP_FUNCTION(ldap_set_rebind_proc);
#endif
#ifdef STR_TRANSLATION