Hi,
I just created a patch for a customer
who needed ldap_set_rebind_proc for
named rebinding on a sun ldap server.
The #if statements are a bit dirty, but i
did not manage to find the correct
ifdef condition.
Maybe someone can use it or even integrate
it into cvs.
If you have any questions regarding this
patch, do not hesitate to contact me.
Greetings
Matthias Lange
--
Matthias Lange, Dipl.-Ing. (FH)
NetUSE AG Dr.-Hell-Stra�e Fon: +49 431 38643500
http://www.netuse.de/ D-24107 Kiel, Germany Fax: +49 431 38643599
Infos �ber den neuen NetUSE Workflow Manager: http://workflow.NetUSE.de
*** ldap.c.original Thu Jan 30 17:38:28 2003
--- ldap.c Thu Feb 13 16:11:51 2003
***************
*** 61,67 ****
typedef struct {
LDAP *link;
! #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
zval *rebindproc;
#endif
} ldap_linkdata;
--- 61,67 ----
typedef struct {
LDAP *link;
! #if 1 || defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
zval *rebindproc;
#endif
} ldap_linkdata;
***************
*** 121,127 ****
PHP_FE(ldap_compare,
NULL)
PHP_FE(ldap_sort,
NULL)
! #if ( LDAP_API_VERSION > 2000 ) || HAVE_NSLDAP
PHP_FE(ldap_get_option, third_argument_force_ref)
PHP_FE(ldap_set_option,
NULL)
PHP_FE(ldap_parse_result, arg3to6of6_force_ref)
--- 121,127 ----
PHP_FE(ldap_compare,
NULL)
PHP_FE(ldap_sort,
NULL)
! #if 1 || ( LDAP_API_VERSION > 2000 ) || HAVE_NSLDAP
PHP_FE(ldap_get_option, third_argument_force_ref)
PHP_FE(ldap_set_option,
NULL)
PHP_FE(ldap_parse_result, arg3to6of6_force_ref)
***************
*** 136,142 ****
#endif
#endif
! #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
PHP_FE(ldap_set_rebind_proc, NULL)
#endif
--- 136,142 ----
#endif
#endif
! #if 1 || defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
PHP_FE(ldap_set_rebind_proc, NULL)
#endif
***************
*** 173,179 ****
ldap_linkdata *ld = (ldap_linkdata *)rsrc->ptr;
ldap_unbind_s(ld->link);
! #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
if (ld->rebindproc != NULL) {
zval_dtor(ld->rebindproc);
FREE_ZVAL(ld->rebindproc);
--- 173,179 ----
ldap_linkdata *ld = (ldap_linkdata *)rsrc->ptr;
ldap_unbind_s(ld->link);
! #if 1 || defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
if (ld->rebindproc != NULL) {
zval_dtor(ld->rebindproc);
FREE_ZVAL(ld->rebindproc);
***************
*** 508,514 ****
/* deref */
if (deref > -1) {
! #if ( LDAP_API_VERSION >= 2004 ) || HAVE_NSLDAP
ldap_set_option(ldap, LDAP_OPT_DEREF, &deref);
#else
ldap->ld_deref = deref;
--- 508,514 ----
/* deref */
if (deref > -1) {
! #if 1 || ( LDAP_API_VERSION >= 2004 ) || HAVE_NSLDAP
ldap_set_option(ldap, LDAP_OPT_DEREF, &deref);
#else
ldap->ld_deref = deref;
***************
*** 2003,2010 ****
#endif /* ( LDAP_API_VERSION > 2000 ) || HAVE_NSLDAP */
#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
! int _ldap_rebind_proc(LDAP *ldap, const char *url, ber_tag_t req, ber_int_t msgid,
void *params) {
ldap_linkdata *ld;
int retval;
zval *cb_url;
--- 2003,2013 ----
#endif /* ( LDAP_API_VERSION > 2000 ) || HAVE_NSLDAP */
+ #if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP ||
+defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
+
+ int _ldap_rebind_proc
#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
! (LDAP *ldap, const char *url, ber_tag_t req, ber_int_t msgid,
void *params) {
ldap_linkdata *ld;
int retval;
zval *cb_url;
***************
*** 2037,2045 ****
zval_dtor(cb_url);
FREE_ZVAL(cb_url);
return retval;
! }
/* {{{ proto bool ldap_set_rebind_proc(resource link, string callback)
Set a callback function to do re-binds on referral chasing. */
PHP_FUNCTION(ldap_set_rebind_proc)
--- 2040,2129 ----
zval_dtor(cb_url);
FREE_ZVAL(cb_url);
return retval;
! #else
! /**
! * 2003-02-13 Matthias Lange <[EMAIL PROTECTED]>
! */
! (LDAP *ldap, char **dn, char **passwd, int *authmethod, int
freeit, void *extraArg) {
! ldap_linkdata *ld;
! zval *cb_retval;
! zval **ret_code, **ret_dn, **ret_passwd;
! zval *cb_link = (zval *) extraArg;
+ if(freeit) {
+ free(*dn);
+ free(*passwd);
+ return LDAP_SUCCESS;
+ }
+ *authmethod = LDAP_AUTH_SIMPLE;
+
+ TSRMLS_FETCH();
+
+ ld = (ldap_linkdata *) zend_fetch_resource(&cb_link TSRMLS_C, -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;
+ }
+
+ /* execute callback function */
+ if ( call_user_function_ex(EG(function_table), NULL, ld->rebindproc,
+ &cb_retval, 0, 0, 0, NULL TSRMLS_CC)
+ == SUCCESS
+ && cb_retval) {
+ if (Z_TYPE_P(cb_retval) != IS_ARRAY) {
+ php_error(E_WARNING, "%s(): Callback did not return an
+array",get_active_function_name(TSRMLS_C));
+ return LDAP_OTHER;
+ }
+ if(3 != zend_hash_num_elements(Z_ARRVAL_P(cb_retval))) {
+ php_error(E_WARNING, "%s(): Callback array did not have three
+elements",get_active_function_name(TSRMLS_C));
+ return LDAP_OTHER;
+ }
+
+ zend_hash_internal_pointer_reset(Z_ARRVAL_P(cb_retval));
+ zend_hash_get_current_data(Z_ARRVAL_P(cb_retval), (void **)&ret_code);
+ zend_hash_move_forward(Z_ARRVAL_P(cb_retval));
+ zend_hash_get_current_data(Z_ARRVAL_P(cb_retval), (void **)&ret_dn);
+ zend_hash_move_forward(Z_ARRVAL_P(cb_retval));
+ zend_hash_get_current_data(Z_ARRVAL_P(cb_retval), (void **)&ret_passwd);
+
+ if(Z_TYPE_PP(ret_code) != IS_LONG ) {
+ php_error(E_WARNING, "%s(): Element 1 is not an
+int",get_active_function_name(TSRMLS_C));
+ return LDAP_OTHER;
+ }
+ if(LDAP_SUCCESS != Z_LVAL_PP(ret_code)) {
+ php_error(E_WARNING, "%s(): Ldap Error: Return Code %d",
+ get_active_function_name(TSRMLS_C), Z_LVAL_PP(ret_code));
+ return Z_LVAL_PP(ret_code);
+ }
+ if(Z_TYPE_PP(ret_dn) != IS_STRING) {
+ php_error(E_WARNING, "%s(): Element 2 is not a
+string",get_active_function_name(TSRMLS_C));
+ return LDAP_OTHER;
+ }
+ if(Z_TYPE_PP(ret_passwd) != IS_STRING) {
+ php_error(E_WARNING, "%s(): Element 3 is not a
+string",get_active_function_name(TSRMLS_C));
+ return LDAP_OTHER;
+ }
+
+ *dn = calloc(sizeof(char), Z_STRLEN_PP(ret_dn)+1);
+ strncpy(*dn,Z_STRVAL_PP(ret_dn),Z_STRLEN_PP(ret_dn));
+ dn[Z_STRLEN_PP(ret_dn)+1] = 0;
+
+ *passwd = calloc(sizeof(char), Z_STRLEN_PP(ret_passwd)+1);
+ strncpy(*passwd,Z_STRVAL_PP(ret_passwd),Z_STRLEN_PP(ret_passwd));
+ passwd[Z_STRLEN_PP(ret_passwd)+1] = 0;
+
+ return LDAP_SUCCESS;
+ }
+ php_error(E_WARNING, "%s(): rebind_proc PHP callback failed",
+get_active_function_name(TSRMLS_C));
+ return LDAP_OTHER;
+
+ #endif
+ }
+
/* {{{ proto bool ldap_set_rebind_proc(resource link, string callback)
Set a callback function to do re-binds on referral chasing. */
PHP_FUNCTION(ldap_set_rebind_proc)
*** php_ldap.h Thu Feb 13 15:44:24 2003
--- /var/tmp/php-4.3.0/ext/ldap/php_ldap.h Fri Jan 4 21:56:03 2002
***************
*** 93,99 ****
PHP_FUNCTION(ldap_start_tls);
#endif
! #if 1 || defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
PHP_FUNCTION(ldap_set_rebind_proc);
#endif
--- 93,99 ----
PHP_FUNCTION(ldap_start_tls);
#endif
! #if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
PHP_FUNCTION(ldap_set_rebind_proc);
#endif
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php