Index: ext/ldap/ldap.c =================================================================== RCS file: /repository/php-src/ext/ldap/ldap.c,v retrieving revision 1.162 diff -u -r1.162 ldap.c --- ext/ldap/ldap.c 22 Aug 2005 12:22:08 -0000 1.162 +++ ext/ldap/ldap.c 10 Nov 2005 17:25:16 -0000 @@ -163,6 +172,17 @@ PHP_FE(ldap_8859_to_t61, NULL) #endif +/* routines to handle standard track controls, Pierangelo Masarati */ +#ifdef LDAP_CONTROL_PAGEDRESULTS + PHP_FE(ldap_ctrl_paged_results, fourth_arg_force_ref) + PHP_FE(ldap_ctrl_paged_results_resp, arg3to4of4_force_ref) +#endif /* LDAP_CONTROL_PAGEDRESULTS */ +#ifdef LDAP_CONTROL_PASSWORDPOLICYREQUEST + PHP_FE(ldap_ctrl_ppolicy, NULL) + PHP_FE(ldap_ctrl_ppolicy_resp, NULL) +#endif /* LDAP_CONTROL_PASSWORDPOLICYREQUEST */ +/* end of ando */ + {NULL, NULL, NULL} }; /* }}} */ @@ -2297,6 +2461,193 @@ /* }}} */ #endif +#ifdef LDAP_CONTROL_PAGEDRESULTS +/* {{{ proto bool ldap_ctrl_paged_results(resource link, int pagesize, bool iscritical, string cookie) + Inject paged results control*/ +PHP_FUNCTION(ldap_ctrl_paged_results) +{ + zval **link, **pagesize, **iscritical, **cookie; + int lpagesize = 0; + struct berval lcookie = { 0, NULL }; + ldap_linkdata *ld; + LDAP *ldap; + BerElement *ber = NULL; + LDAPControl ctrl, *ctrlsp[2]; + int rc, myargcount = ZEND_NUM_ARGS(); + + if (myargcount < 1 || myargcount > 4 || zend_get_parameters_ex(myargcount, &link, &pagesize, &iscritical, &cookie) == FAILURE) { + WRONG_PARAM_COUNT; + } + + if (Z_TYPE_PP(link) == IS_NULL) { + ldap = NULL; + } else { + ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); + ldap = ld->link; + } + + ber = ber_alloc_t(LBER_USE_DER); + if (ber == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to alloc BER encoding resources"); + RETURN_FALSE; + } + + switch (myargcount) { + case 4: + convert_to_string_ex(cookie); + lcookie.bv_val = Z_STRVAL_PP(cookie); + lcookie.bv_len = Z_STRLEN_PP(cookie); + /* fallthru */ + case 3: + convert_to_boolean_ex(iscritical); + ctrl.ldctl_iscritical = Z_BVAL_PP(iscritical); + /* fallthru */ + case 2: + convert_to_long_ex(pagesize); + lpagesize = Z_LVAL_PP(pagesize); + } + + ber_printf(ber, "{iO}", lpagesize, &lcookie ); + rc = ber_flatten2( ber, &ctrl.ldctl_value, 0 ); + if ( rc == -1 ) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to BER encode pagedResults control"); + RETURN_FALSE; + } + + if (ldap) { + /* directly set the option */ + ctrl.ldctl_oid = LDAP_CONTROL_PAGEDRESULTS; + + ctrlsp[0] = &ctrl; + ctrlsp[1] = NULL; + + rc = ldap_set_option(ldap, LDAP_OPT_SERVER_CONTROLS, ctrlsp); + if (rc != LDAP_SUCCESS) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set pagedResults control: %s", ldap_err2string(rc)); + RETURN_FALSE; + } + + } else { + /* TODO: return a PHP control object */ + } + + if (ber != NULL) { + ber_free(ber, 1); + } +} +/* }}} */ + +/* {{{ proto bool ldap_ctrl_paged_results_resp(resource link, resource result, string cookie, int estimated) + Extract paged results control response */ +PHP_FUNCTION(ldap_ctrl_paged_results_resp) +{ + zval **link, **result, **cookie, **estimated; + struct berval lcookie; + int lestimated; + ldap_linkdata *ld; + LDAPMessage *ldap_result; + LDAPControl **lserverctrls; + BerElement *ber; + ber_tag_t tag; + int rc, i, lerrcode, myargcount = ZEND_NUM_ARGS(); + + if (myargcount < 3 || myargcount > 4 || zend_get_parameters_ex(myargcount, &link, &result, &cookie, &estimated) == FAILURE) { + WRONG_PARAM_COUNT; + } + + ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); + ZEND_FETCH_RESOURCE(ldap_result, LDAPMessage *, result, -1, "ldap result", le_result); + + rc = ldap_parse_result(ld->link, + ldap_result, + &lerrcode, + NULL, /* matcheddn */ + NULL, /* errmsg */ + NULL, /* referrals */ + &lserverctrls, + 0); + + if (rc != LDAP_SUCCESS) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to parse result: %s", ldap_err2string(rc)); + RETURN_FALSE; + } + + if (lerrcode != LDAP_SUCCESS) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Result is: %s", ldap_err2string(lerrcode)); + RETURN_FALSE; + } + + if (lserverctrls == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No server controls in result"); + RETURN_FALSE; + } + + for (i = 0; lserverctrls[i] != NULL; i++) { + if (strcmp(lserverctrls[i]->ldctl_oid, LDAP_CONTROL_PAGEDRESULTS) == 0) { + break; + } + } + + if (lserverctrls[i] == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No paged results control in result"); + RETURN_FALSE; + } + + ber = ber_init(&lserverctrls[i]->ldctl_value); + if (ber == NULL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to alloc BER decoding resources"); + RETURN_FALSE; + } + + tag = ber_scanf(ber, "{io}", &lestimated, &lcookie ); + (void)ber_free(ber, 1); + + if (tag == LBER_ERROR) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to decode paged results control response"); + RETURN_FALSE; + } + + if (lestimated < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid paged results control response value"); + RETURN_FALSE; + } + + ldap_controls_free(lserverctrls); + + if (myargcount == 4) { + zval_dtor(*estimated); + ZVAL_LONG(*estimated, lestimated); + } + + zval_dtor(*cookie); + if (lcookie.bv_len == 0) { + ZVAL_EMPTY_STRING(*cookie); + } else { + ZVAL_STRINGL(*cookie, lcookie.bv_val, lcookie.bv_len, 1); + } + ldap_memfree(lcookie.bv_val); + + RETURN_TRUE; +} +/* }}} */ +#endif + +#ifdef LDAP_CONTROL_PASSWORDPOLICYREQUEST +/* {{{ proto bool ldap_ctrl_ppolicy(resource link) + Inject password policy control */ +PHP_FUNCTION(ldap_ctrl_ppolicy) +{ +} +/* }}} */ + +/* {{{ proto bool ldap_ctrl_ppolicy_resp(resource link, resource result, string cookie, int estimated) + Extract password policy control response */ +PHP_FUNCTION(ldap_ctrl_ppolicy_resp) +{ +} +/* }}} */ +#endif + /* * Local variables: * tab-width: 4 Index: ext/ldap/php_ldap.h =================================================================== RCS file: /repository/php-src/ext/ldap/php_ldap.h,v retrieving revision 1.32 diff -u -r1.32 php_ldap.h --- ext/ldap/php_ldap.h 3 Aug 2005 14:07:23 -0000 1.32 +++ ext/ldap/php_ldap.h 10 Nov 2005 17:25:19 -0000 @@ -97,6 +97,15 @@ PHP_FUNCTION(ldap_8859_to_t61); #endif +#ifdef LDAP_CONTROL_PAGEDRESULTS +PHP_FUNCTION(ldap_ctrl_paged_results); +PHP_FUNCTION(ldap_ctrl_paged_results_resp); +#endif +#ifdef LDAP_CONTROL_PASSWORDPOLICYREQUEST +PHP_FUNCTION(ldap_ctrl_ppolicy); +PHP_FUNCTION(ldap_ctrl_ppolicy_resp); +#endif + ZEND_BEGIN_MODULE_GLOBALS(ldap) long num_links; long max_links;