40#include "config.w32.h"
53#define PHP_LDAP_ESCAPE_FILTER 0x01
54#define PHP_LDAP_ESCAPE_DN 0x02
58#if defined(LDAP_CONTROL_PAGEDRESULTS) && !defined(HAVE_LDAP_CONTROL_FIND)
59LDAPControl *ldap_control_find(
const char *oid, LDAPControl **ctrls, LDAPControl ***nextctrlp)
62 return ldap_find_control(oid, ctrls);
66#if !defined(LDAP_API_FEATURE_X_OPENLDAP)
69 ldap_value_free((
char **)
v);
75#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
96static zend_class_entry *ldap_link_ce, *ldap_result_ce, *ldap_result_entry_ce;
97static zend_object_handlers ldap_link_object_handlers, ldap_result_object_handlers, ldap_result_entry_object_handlers;
110#define Z_LDAP_LINK_P(zv) ldap_link_from_obj(Z_OBJ_P(zv))
122 zend_throw_error(
NULL,
"Cannot directly construct LDAP\\Connection, use ldap_connect() instead");
130 ldap_destroy(ld->
link);
133#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
155#define Z_LDAP_RESULT_P(zv) ldap_result_from_obj(Z_OBJ_P(zv))
167 zend_throw_error(
NULL,
"Cannot directly construct LDAP\\Result, use the dedicated functions instead");
173 ldap_msgfree(
result->result);
192#define Z_LDAP_RESULT_ENTRY_P(zv) ldap_result_entry_from_obj(Z_OBJ_P(zv))
204 zend_throw_error(
NULL,
"Cannot directly construct LDAP\\ResultEntry, use the dedicated functions instead");
208static void ldap_result_entry_free_obj(
zend_object *obj)
213 ber_free(entry->
ber, 0);
221#define VERIFY_LDAP_LINK_CONNECTED(ld) \
224 zend_throw_error(NULL, "LDAP connection has already been closed"); \
229#define VERIFY_LDAP_RESULT_OPEN(lr) \
232 zend_throw_error(NULL, "LDAP result has already been closed"); \
237static bool php_ldap_is_numerically_indexed_array(
zend_array *arr)
239 if (zend_hash_num_elements(arr) == 0 ||
HT_IS_PACKED(arr)) {
254static void _php_ldap_control_to_array(
LDAP *ld, LDAPControl* ctrl,
zval* array,
int request)
258 add_assoc_string(array,
"oid", ctrl->ldctl_oid);
261 add_assoc_bool(array,
"iscritical", (ctrl->ldctl_iscritical != 0));
266 int expire = 0, grace = 0, rc;
267 LDAPPasswordPolicyError pperr;
270 rc = ldap_parse_passwordpolicy_control(ld, ctrl, &expire, &grace, &pperr);
271 if ( rc == LDAP_SUCCESS ) {
273 add_assoc_long(&
value,
"expire", expire);
274 add_assoc_long(&
value,
"grace", grace);
276 if ( pperr != PP_noError ) {
277 add_assoc_long(&
value,
"error", pperr);
279 add_assoc_zval(array,
"value", &
value);
281 add_assoc_null(array,
"value");
285 struct berval lcookie = { 0L,
NULL };
288 if (ctrl->ldctl_value.bv_len) {
290 rc = ldap_parse_pageresponse_control(ld, ctrl, &lestimated, &lcookie);
296 if ( rc == LDAP_SUCCESS ) {
298 add_assoc_long(&
value,
"size", lestimated);
299 add_assoc_stringl(&
value,
"cookie", lcookie.bv_val, lcookie.bv_len);
300 add_assoc_zval(array,
"value", &
value);
302 add_assoc_null(array,
"value");
305 if (lcookie.bv_val) {
306 ldap_memfree(lcookie.bv_val);
312 ber = ber_init(&ctrl->ldctl_value);
314 add_assoc_null(array,
"value");
315 }
else if (ber_scanf(ber,
"{m{" , &bv) == LBER_ERROR) {
316 add_assoc_null(array,
"value");
321 add_assoc_stringl(&
value,
"dn", bv.bv_val, bv.bv_len);
323 while (ber_scanf(ber,
"{m" , &bv) != LBER_ERROR) {
325 BerVarray vals =
NULL;
328 if (ber_scanf(ber,
"[W]", &vals) == LBER_ERROR || vals ==
NULL)
334 for (i = 0; vals[i].bv_val !=
NULL; i++) {
337 add_assoc_zval(&
value, bv.bv_val, &tmp);
339 ber_bvarray_free(vals);
341 add_assoc_zval(array,
"value", &
value);
352 if (ctrl->ldctl_value.bv_len) {
353 rc = ldap_parse_sortresponse_control(ld, ctrl, &errcode, &attribute);
357 if ( rc == LDAP_SUCCESS ) {
359 add_assoc_long(&
value,
"errcode", errcode);
361 add_assoc_string(&
value,
"attribute", attribute);
362 ldap_memfree(attribute);
364 add_assoc_zval(array,
"value", &
value);
366 add_assoc_null(array,
"value");
369 int target,
count, errcode, rc;
373 if (ctrl->ldctl_value.bv_len) {
374 rc = ldap_parse_vlvresponse_control(ld, ctrl, &target, &
count, &
context, &errcode);
378 if ( rc == LDAP_SUCCESS ) {
380 add_assoc_long(&
value,
"target", target);
382 add_assoc_long(&
value,
"errcode", errcode);
386 add_assoc_zval(array,
"value", &
value);
389 add_assoc_null(array,
"value");
392 if (ctrl->ldctl_value.bv_len) {
393 add_assoc_stringl(array,
"value", ctrl->ldctl_value.bv_val, ctrl->ldctl_value.bv_len);
395 add_assoc_null(array,
"value");
400static int _php_ldap_control_from_array(
LDAP *ld, LDAPControl** ctrl,
zval* array)
404 int control_iscritical = 0, rc = LDAP_SUCCESS;
405 char** ldap_attrs =
NULL;
406 LDAPSortKey** sort_keys =
NULL;
408 size_t num_tmpstrings1 = 0, num_tmpstrings2 = 0;
415 control_oid = zval_get_string(
val);
423 control_iscritical = 0;
426 BerElement *ber =
NULL;
427 struct berval control_value = { 0L,
NULL };
428 int control_value_alloc = 0;
432 tmpstring = zval_get_string(
val);
437 control_value.bv_val =
ZSTR_VAL(tmpstring);
438 control_value.bv_len =
ZSTR_LEN(tmpstring);
442 struct berval cookie = { 0L,
NULL };
444 pagesize = zval_get_long(tmp);
447 tmpstring = zval_get_string(tmp);
452 cookie.bv_val =
ZSTR_VAL(tmpstring);
453 cookie.bv_len =
ZSTR_LEN(tmpstring);
456 control_value_alloc = 1;
457 rc = ldap_create_page_control_value(ld, pagesize, &cookie, &control_value);
458 if (rc != LDAP_SUCCESS) {
468 assert = zval_get_string(tmp);
475 int success = LDAP_SUCCESS;
478 control_value_alloc = 1;
479 rc = ldap_create_assertion_control_value(ld,
ZSTR_VAL(
assert), &control_value);
480 if (rc != LDAP_SUCCESS) {
483 zend_string_release(
assert);
491 ber = ber_alloc_t(LBER_USE_DER);
496 tmpstring = zval_get_string(tmp);
501 if (ldap_put_vrFilter(ber,
ZSTR_VAL(tmpstring)) == -1) {
504 }
else if (ber_flatten2(ber, &control_value, control_value_alloc) == -1) {
515 ber = ber_alloc_t(LBER_USE_DER);
524 num_attribs = zend_hash_num_elements(
Z_ARRVAL_P(tmp));
525 ldap_attrs =
safe_emalloc((num_attribs+1),
sizeof(
char *), 0);
529 for (i = 0; i<num_attribs; i++) {
536 tmpstrings1[num_tmpstrings1] = zval_get_string(
attr);
541 ldap_attrs[i] =
ZSTR_VAL(tmpstrings1[num_tmpstrings1]);
544 ldap_attrs[num_attribs] =
NULL;
546 ber_init2( ber,
NULL, LBER_USE_DER );
548 if (ber_printf(ber,
"{v}", ldap_attrs) == -1) {
553 err = ber_flatten2(ber, &control_value, control_value_alloc);
566 sort_keys =
safe_emalloc((num_keys+1),
sizeof(LDAPSortKey*), 0);
572 for (i = 0; i<num_keys; i++) {
584 sort_keys[i] =
emalloc(
sizeof(LDAPSortKey));
585 tmpstrings1[num_tmpstrings1] = zval_get_string(tmp);
590 sort_keys[i]->attributeType =
ZSTR_VAL(tmpstrings1[num_tmpstrings1]);
594 tmpstrings2[num_tmpstrings2] = zval_get_string(tmp);
599 sort_keys[i]->orderingRule =
ZSTR_VAL(tmpstrings2[num_tmpstrings2]);
602 sort_keys[i]->orderingRule =
NULL;
608 sort_keys[i]->reverseOrder = 0;
611 sort_keys[num_keys] =
NULL;
613 control_value_alloc = 1;
614 rc = ldap_create_sort_control_value(ld, sort_keys, &control_value);
615 if (rc != LDAP_SUCCESS) {
621 struct berval attrValue;
625 vlvInfo.ldvlv_before_count = zval_get_long(tmp);
633 vlvInfo.ldvlv_after_count = zval_get_long(tmp);
641 tmpstring = zval_get_string(tmp);
646 attrValue.bv_val =
ZSTR_VAL(tmpstring);
647 attrValue.bv_len =
ZSTR_LEN(tmpstring);
648 vlvInfo.ldvlv_attrvalue = &attrValue;
650 vlvInfo.ldvlv_attrvalue =
NULL;
651 vlvInfo.ldvlv_offset = zval_get_long(tmp);
654 vlvInfo.ldvlv_count = zval_get_long(tmp);
667 tmpstring = zval_get_string(tmp);
674 vlvInfo.ldvlv_context = &
context;
676 vlvInfo.ldvlv_context =
NULL;
680 control_value_alloc = 1;
681 rc = ldap_create_vlv_control_value(ld, &vlvInfo, &control_value);
682 if (rc != LDAP_SUCCESS) {
691 if (rc == LDAP_SUCCESS) {
692 rc = ldap_control_create(
ZSTR_VAL(control_oid), control_iscritical, &control_value, 1, ctrl);
696 zend_string_release(control_oid);
697 if (tmpstring !=
NULL) {
698 zend_string_release(tmpstring);
700 if (tmpstrings1 !=
NULL) {
702 for (i = 0; i < num_tmpstrings1; ++i) {
703 zend_string_release(tmpstrings1[i]);
707 if (tmpstrings2 !=
NULL) {
709 for (i = 0; i < num_tmpstrings2; ++i) {
710 zend_string_release(tmpstrings2[i]);
714 if (control_value.bv_val !=
NULL && control_value_alloc != 0) {
715 ber_memfree(control_value.bv_val);
720 if (ldap_attrs !=
NULL) {
723 if (sort_keys !=
NULL) {
724 LDAPSortKey** sortp = sort_keys;
733 if (rc == LDAP_SUCCESS) {
742static void _php_ldap_controls_to_array(
LDAP *ld, LDAPControl** ctrls,
zval* array,
int request)
747 array = zend_try_array_init(array);
756 while (*ctrlp !=
NULL) {
757 _php_ldap_control_to_array(ld, *ctrlp, &
tmp1, request);
758 add_assoc_zval(array, (*ctrlp)->ldctl_oid, &
tmp1);
761 ldap_controls_free(ctrls);
764static LDAPControl** _php_ldap_controls_from_array(
LDAP *ld,
zval* array, uint32_t
arg_num)
767 LDAPControl** ctrlp, **ctrls =
NULL;
771 ncontrols = zend_hash_num_elements(
Z_ARRVAL_P(array));
772 ctrls =
safe_emalloc((1 + ncontrols),
sizeof(*ctrls), 0);
782 if (_php_ldap_control_from_array(ld, ctrlp, ctrlarray) == LDAP_SUCCESS) {
795 ldap_control_free(*ctrlp);
805static void _php_ldap_controls_free (LDAPControl*** ctrls)
812 ldap_control_free(*ctrlp);
830#if defined(COMPILE_DL_LDAP) && defined(ZTS)
833 ldap_globals->num_links = 0;
840#if defined(COMPILE_DL_LDAP) && defined(ZTS)
857 ldap_link_ce = register_class_LDAP_Connection();
858 ldap_link_ce->create_object = ldap_link_create_object;
859 ldap_link_ce->default_object_handlers = &ldap_link_object_handlers;
863 ldap_link_object_handlers.free_obj = ldap_link_free_obj;
864 ldap_link_object_handlers.get_constructor = ldap_link_get_constructor;
865 ldap_link_object_handlers.clone_obj =
NULL;
868 ldap_result_ce = register_class_LDAP_Result();
869 ldap_result_ce->create_object = ldap_result_create_object;
870 ldap_result_ce->default_object_handlers = &ldap_result_object_handlers;
874 ldap_result_object_handlers.free_obj = ldap_result_free_obj;
875 ldap_result_object_handlers.get_constructor = ldap_result_get_constructor;
876 ldap_result_object_handlers.clone_obj =
NULL;
879 ldap_result_entry_ce = register_class_LDAP_ResultEntry();
880 ldap_result_entry_ce->create_object = ldap_result_entry_create_object;
881 ldap_result_entry_ce->default_object_handlers = &ldap_result_entry_object_handlers;
885 ldap_result_entry_object_handlers.free_obj = ldap_result_entry_free_obj;
886 ldap_result_entry_object_handlers.get_constructor = ldap_result_entry_get_constructor;
887 ldap_result_entry_object_handlers.clone_obj =
NULL;
890 register_ldap_symbols(module_number);
921#ifdef LDAP_API_VERSION
922 snprintf(tmp, 31,
"%d", LDAP_API_VERSION);
926#ifdef LDAP_VENDOR_NAME
930#ifdef LDAP_VENDOR_VERSION
931 snprintf(tmp, 31,
"%d", LDAP_VENDOR_VERSION);
951 char *wallet =
NULL, *walletpasswd =
NULL;
952 size_t walletlen = 0, walletpasswdlen = 0;
961 "use ldap_connect_wallet() instead");
993 int rc = LDAP_SUCCESS;
995 if (url && !ldap_is_ldap_url(url)) {
996 size_t urllen = hostlen +
sizeof(
"ldap://:65535" );
998 if (port <= 0 || port > 65535) {
1007#ifdef LDAP_OPT_X_TLS_NEWCTX
1021#ifdef LDAP_API_FEATURE_X_OPENLDAP
1024 rc = ldap_initialize(&ldap, url);
1029 ldap = ldap_init(host, port);
1039 if (rc != LDAP_SUCCESS) {
1052 if (ldap_init_SSL(&ldap->ld_sb, wallet, walletpasswd, authmode)) {
1066#if defined(HAVE_ORALDAP) && defined(LDAP_API_FEATURE_X_OPENLDAP)
1070 char *wallet =
NULL, *walletpasswd =
NULL;
1071 size_t walletlen = 0, walletpasswdlen = 0;
1079 &host, &hostlen, &wallet, &walletlen, &walletpasswd, &walletpasswdlen, &authmode) !=
SUCCESS
1084 if (authmode != 0) {
1097 int rc = LDAP_SUCCESS;
1099 if (url && !ldap_is_ldap_url(url)) {
1100 size_t urllen = hostlen +
sizeof(
"ldap://:65535" );
1103 snprintf( url, urllen,
"ldap://%s", host );
1107 rc = ldap_initialize(&ldap, url);
1111 if (rc != LDAP_SUCCESS) {
1123 if (ldap_init_SSL(&ldap->ld_sb, wallet, walletpasswd, authmode)) {
1136static int _get_lderrno(
LDAP *ldap)
1138#if LDAP_API_VERSION > 2000 || defined(HAVE_ORALDAP)
1145 return ldap->ld_errno;
1151static void _set_lderrno(
LDAP *ldap,
int lderr)
1153#if LDAP_API_VERSION > 2000 || defined(HAVE_ORALDAP)
1157 ldap->ld_errno = lderr;
1166 char *ldap_bind_dn =
NULL, *ldap_bind_pw =
NULL;
1167 size_t ldap_bind_dnlen, ldap_bind_pwlen;
1178 if (ldap_bind_dn !=
NULL && memchr(ldap_bind_dn,
'\0', ldap_bind_dnlen) !=
NULL) {
1179 _set_lderrno(ld->
link, LDAP_INVALID_CREDENTIALS);
1184 if (ldap_bind_pw !=
NULL && memchr(ldap_bind_pw,
'\0', ldap_bind_pwlen) !=
NULL) {
1185 _set_lderrno(ld->
link, LDAP_INVALID_CREDENTIALS);
1191#ifdef LDAP_API_FEATURE_X_OPENLDAP
1196 cred.bv_val = ldap_bind_pw;
1197 cred.bv_len = ldap_bind_pw ? ldap_bind_pwlen : 0;
1198 rc = ldap_sasl_bind_s(ld->
link, ldap_bind_dn, LDAP_SASL_SIMPLE, &cred,
1202 rc = ldap_simple_bind_s(ld->
link, ldap_bind_dn, ldap_bind_pw);
1205 if ( rc != LDAP_SUCCESS) {
1219 char *ldap_bind_dn =
NULL, *ldap_bind_pw =
NULL;
1220 size_t ldap_bind_dnlen, ldap_bind_pwlen;
1222 LDAPControl **lserverctrls =
NULL;
1224 LDAPMessage *ldap_res;
1234 if (ldap_bind_dn !=
NULL && memchr(ldap_bind_dn,
'\0', ldap_bind_dnlen) !=
NULL) {
1235 _set_lderrno(ld->
link, LDAP_INVALID_CREDENTIALS);
1240 if (ldap_bind_pw !=
NULL && memchr(ldap_bind_pw,
'\0', ldap_bind_pwlen) !=
NULL) {
1241 _set_lderrno(ld->
link, LDAP_INVALID_CREDENTIALS);
1247 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 4);
1248 if (lserverctrls ==
NULL) {
1259 cred.bv_val = ldap_bind_pw;
1260 cred.bv_len = ldap_bind_pw ? ldap_bind_pwlen : 0;
1263 lserverctrls,
NULL, &msgid);
1264 if (rc != LDAP_SUCCESS ) {
1270 rc = ldap_result(ld->
link, msgid, 1 ,
NULL, &ldap_res);
1280 result->result = ldap_res;
1285 _php_ldap_controls_free(&lserverctrls);
1292#ifdef HAVE_LDAP_SASL
1302static php_ldap_bictx *_php_sasl_setdefs(
LDAP *ld,
char *sasl_mech,
char *sasl_realm,
char *sasl_authc_id,
char *passwd,
char *sasl_authz_id)
1304 php_ldap_bictx *ctx;
1306 ctx = ber_memalloc(
sizeof(php_ldap_bictx));
1307 ctx->mech = (sasl_mech) ? ber_strdup(sasl_mech) :
NULL;
1308 ctx->realm = (sasl_realm) ? ber_strdup(sasl_realm) :
NULL;
1309 ctx->authcid = (sasl_authc_id) ? ber_strdup(sasl_authc_id) :
NULL;
1310 ctx->passwd = (passwd) ? ber_strdup(passwd) :
NULL;
1311 ctx->authzid = (sasl_authz_id) ? ber_strdup(sasl_authz_id) :
NULL;
1313 if (ctx->mech ==
NULL) {
1316 if (ctx->realm ==
NULL) {
1319 if (ctx->authcid ==
NULL) {
1322 if (ctx->authzid ==
NULL) {
1331static void _php_sasl_freedefs(php_ldap_bictx *ctx)
1333 if (ctx->mech) ber_memfree(ctx->mech);
1334 if (ctx->realm) ber_memfree(ctx->realm);
1335 if (ctx->authcid) ber_memfree(ctx->authcid);
1336 if (ctx->passwd) ber_memfree(ctx->passwd);
1337 if (ctx->authzid) ber_memfree(ctx->authzid);
1344static int _php_sasl_interact(
LDAP *ld,
unsigned flags,
void *defaults,
void *in)
1346 sasl_interact_t *interact = in;
1348 php_ldap_bictx *ctx = defaults;
1350 for (;interact->id != SASL_CB_LIST_END;interact++) {
1352 switch(interact->id) {
1353 case SASL_CB_GETREALM:
1356 case SASL_CB_AUTHNAME:
1367 interact->result =
p;
1368 interact->len =
strlen(interact->result);
1371 return LDAP_SUCCESS;
1380 char *binddn =
NULL;
1381 char *passwd =
NULL;
1382 char *sasl_mech =
NULL;
1383 char *sasl_realm =
NULL;
1384 char *sasl_authz_id =
NULL;
1385 char *sasl_authc_id =
NULL;
1387 size_t rc, dn_len, passwd_len, mech_len, realm_len, authc_id_len, authz_id_len, props_len;
1388 php_ldap_bictx *ctx;
1390 if (
zend_parse_parameters(
ZEND_NUM_ARGS(),
"O|s!s!s!s!s!s!s!", &
link, ldap_link_ce, &binddn, &dn_len, &passwd, &passwd_len, &sasl_mech, &mech_len, &sasl_realm, &realm_len, &sasl_authc_id, &authc_id_len, &sasl_authz_id, &authz_id_len, &props, &props_len) !=
SUCCESS) {
1397 ctx = _php_sasl_setdefs(ld->
link, sasl_mech, sasl_realm, sasl_authc_id, passwd, sasl_authz_id);
1403 rc = ldap_sasl_interactive_bind_s(ld->
link, binddn, ctx->mech,
NULL,
NULL, LDAP_SASL_QUIET, _php_sasl_interact, ctx);
1404 if (rc != LDAP_SUCCESS) {
1410 _php_sasl_freedefs(ctx);
1435static void php_set_opts(
LDAP *ldap,
int sizelimit,
int timelimit,
int deref,
int *old_sizelimit,
int *old_timelimit,
int *old_deref)
1438 if (sizelimit > -1) {
1439#if (LDAP_API_VERSION >= 2004) || defined(HAVE_ORALDAP)
1443 *old_sizelimit = ldap->ld_sizelimit;
1444 ldap->ld_sizelimit = sizelimit;
1449 if (timelimit > -1) {
1450#if (LDAP_API_VERSION >= 2004) || defined(HAVE_ORALDAP)
1454 *old_timelimit = ldap->ld_timelimit;
1455 ldap->ld_timelimit = timelimit;
1461#if (LDAP_API_VERSION >= 2004) || defined(HAVE_ORALDAP)
1465 *old_deref = ldap->ld_deref;
1466 ldap->ld_deref = deref;
1478 zend_long attrsonly, sizelimit, timelimit, deref;
1480 char **ldap_attrs =
NULL;
1483 LDAPMessage *ldap_res =
NULL;
1484 LDAPControl **lserverctrls =
NULL;
1485 int ldap_attrsonly = 0, ldap_sizelimit = -1, ldap_timelimit = -1, ldap_deref = -1;
1486 int old_ldap_sizelimit = -1, old_ldap_timelimit = -1, old_ldap_deref = -1;
1509 ldap_timelimit = timelimit;
1512 ldap_sizelimit = sizelimit;
1515 ldap_attrsonly = attrsonly;
1518 num_attribs = zend_hash_num_elements(
Z_ARRVAL_P(attrs));
1519 ldap_attrs =
safe_emalloc((num_attribs+1),
sizeof(
char *), 0);
1521 if (!php_ldap_is_numerically_indexed_array(
Z_ARRVAL_P(attrs))) {
1537 ldap_attrs[num_attribs] =
NULL;
1545 int i, nlinks, nbases, nfilters, *rcs;
1562 nbases = zend_hash_num_elements(base_dn_ht);
1563 if (nbases != nlinks) {
1568 zend_hash_internal_pointer_reset(base_dn_ht);
1571 ldap_base_dn = zend_string_copy(base_dn_str);
1579 nfilters = zend_hash_num_elements(filter_ht);
1580 if (nfilters != nlinks) {
1585 zend_hash_internal_pointer_reset(filter_ht);
1588 ldap_filter = zend_string_copy(filter_str);
1595 for (i=0; i<nlinks; i++) {
1601 goto cleanup_parallel;
1608 goto cleanup_parallel;
1612 entry = zend_hash_get_current_data(base_dn_ht);
1613 zend_hash_move_forward(base_dn_ht);
1614 ldap_base_dn = zval_get_string(entry);
1617 goto cleanup_parallel;
1620 if (nfilters != 0) {
1621 entry = zend_hash_get_current_data(filter_ht);
1622 zend_hash_move_forward(filter_ht);
1623 ldap_filter = zval_get_string(entry);
1626 goto cleanup_parallel;
1632 _php_ldap_controls_free(&lserverctrls);
1633 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 9);
1634 if (lserverctrls ==
NULL) {
1640 php_set_opts(ld->
link, ldap_sizelimit, ldap_timelimit, ldap_deref, &old_ldap_sizelimit, &old_ldap_timelimit, &old_ldap_deref);
1643 ldap_search_ext(ld->
link,
ZSTR_VAL(ldap_base_dn),
scope,
ZSTR_VAL(ldap_filter), ldap_attrs, ldap_attrsonly, lserverctrls,
NULL,
NULL, ldap_sizelimit, &rcs[i]);
1651 for (i=0; i<nlinks; i++) {
1653 rcs[i] = ldap_result(lds[i]->
link, LDAP_RES_ANY, 1 ,
NULL, &ldap_res);
1658 result->result = ldap_res;
1681 ldap_base_dn = zend_string_copy(base_dn_str);
1688 ldap_filter = zend_string_copy(filter_str);
1691 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 9);
1692 if (lserverctrls ==
NULL) {
1698 php_set_opts(ld->
link, ldap_sizelimit, ldap_timelimit, ldap_deref, &old_ldap_sizelimit, &old_ldap_timelimit, &old_ldap_deref);
1701 ldap_errno = ldap_search_ext_s(ld->
link,
ZSTR_VAL(ldap_base_dn),
scope,
ZSTR_VAL(ldap_filter), ldap_attrs, ldap_attrsonly, lserverctrls,
NULL,
NULL, ldap_sizelimit, &ldap_res);
1705#ifdef LDAP_ADMINLIMIT_EXCEEDED
1714 if (ldap_res !=
NULL) {
1715 ldap_msgfree(ldap_res);
1723#ifdef LDAP_ADMINLIMIT_EXCEEDED
1724 else if (
ldap_errno == LDAP_ADMINLIMIT_EXCEEDED) {
1730 result->result = ldap_res;
1739 php_set_opts(ld->
link, old_ldap_sizelimit, old_ldap_timelimit, old_ldap_deref, &ldap_sizelimit, &ldap_timelimit, &ldap_deref);
1742 zend_string_release(ldap_filter);
1745 zend_string_release(ldap_base_dn);
1747 if (ldap_attrs !=
NULL) {
1754 _php_ldap_controls_free(&lserverctrls);
1793 ldap_result_free(ldap_result);
1845 resultentry->
data = entry;
1857 LDAPMessage *entry_next;
1874 resultentry_next->
data = entry_next;
1889 int num_entries, num_attrib, num_values, i;
1893 struct berval **ldap_value;
1912 if (num_entries == 0) {
1929 while (attribute !=
NULL) {
1931 num_values = ldap_count_values_len(ldap_value);
1934 add_assoc_long(&tmp2,
"count", num_values);
1935 for (i = 0; i < num_values; i++) {
1938 ldap_value_free_len(ldap_value);
1940 attr_len =
strlen(attribute);
1946#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
1947 ldap_memfree(attribute);
1951#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
1957 add_assoc_long(&
tmp1,
"count", num_attrib);
1960 add_assoc_string(&
tmp1,
"dn", dn);
1962 add_assoc_null(&
tmp1,
"dn");
1964#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2002#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2003 ldap_memfree(attribute);
2026 if (resultentry->
ber ==
NULL) {
2032#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2033 if (resultentry->
ber !=
NULL) {
2034 ber_free(resultentry->
ber, 0);
2041#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2042 ldap_memfree(attribute);
2056 struct berval **ldap_value;
2057 int i, num_values, num_attrib;
2073 while (attribute !=
NULL) {
2075 num_values = ldap_count_values_len(ldap_value);
2078 add_assoc_long(&tmp,
"count", num_values);
2079 for (i = 0; i < num_values; i++) {
2082 ldap_value_free_len(ldap_value);
2088#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2089 ldap_memfree(attribute);
2093#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2110 struct berval **ldap_value_len;
2128 num_values = ldap_count_values_len(ldap_value_len);
2131 for (i=0; i<num_values; i++) {
2136 ldap_value_free_len(ldap_value_len);
2161#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2176 char *dn, **ldap_value;
2190 while (ldap_value[i] !=
NULL) i++;
2196 for (i = 0; i<
count; i++) {
2218#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
2229#define PHP_LD_FULL_ADD 0xff
2237 LDAPMod **ldap_mods;
2238 LDAPControl **lserverctrls =
NULL;
2240 LDAPMessage *ldap_res;
2241 int i,
j, num_attribs, num_values, msgid;
2255 num_attribs = zend_hash_num_elements(
Z_ARRVAL_P(entry));
2256 ldap_mods =
safe_emalloc((num_attribs+1),
sizeof(LDAPMod *), 0);
2257 num_berval =
safe_emalloc(num_attribs,
sizeof(
int), 0);
2258 zend_hash_internal_pointer_reset(
Z_ARRVAL_P(entry));
2262 oper = LDAP_MOD_ADD;
2267 for (i = 0; i < num_attribs; i++) {
2268 ldap_mods[i] =
emalloc(
sizeof(LDAPMod));
2269 ldap_mods[i]->mod_op = oper | LDAP_MOD_BVALUES;
2270 ldap_mods[i]->mod_type =
NULL;
2278 num_attribs = i + 1;
2279 ldap_mods[i]->mod_bvalues =
NULL;
2293 num_berval[i] = num_values;
2294 ldap_mods[i]->mod_bvalues =
safe_emalloc((num_values + 1),
sizeof(
struct berval *), 0);
2302 num_attribs = i + 1;
2305 ldap_mods[i]->mod_bvalues[0] = (
struct berval *)
emalloc (
sizeof(
struct berval));
2313 num_attribs = i + 1;
2322 num_attribs = i + 1;
2326 ldap_mods[i]->mod_bvalues[
j] = (
struct berval *)
emalloc (
sizeof(
struct berval));
2327 ldap_mods[i]->mod_bvalues[
j]->bv_val =
Z_STRVAL_P(ivalue);
2328 ldap_mods[i]->mod_bvalues[
j]->bv_len =
Z_STRLEN_P(ivalue);
2332 ldap_mods[i]->mod_bvalues[num_values] =
NULL;
2335 ldap_mods[num_attribs] =
NULL;
2338 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 4);
2339 if (lserverctrls ==
NULL) {
2346 if (is_full_add == 1) {
2350 i = ldap_add_ext_s(ld->
link, dn, ldap_mods, lserverctrls,
NULL);
2352 if (i != LDAP_SUCCESS) {
2356 i = ldap_result(ld->
link, msgid, 1 ,
NULL, &ldap_res);
2366 result->result = ldap_res;
2370 i = ldap_modify_ext(ld->
link, dn, ldap_mods, lserverctrls,
NULL, &msgid);
2372 i = ldap_modify_ext_s(ld->
link, dn, ldap_mods, lserverctrls,
NULL);
2374 if (i != LDAP_SUCCESS) {
2378 i = ldap_result(ld->
link, msgid, 1 ,
NULL, &ldap_res);
2388 result->result = ldap_res;
2393 for (i = 0; i < num_attribs; i++) {
2394 efree(ldap_mods[i]->mod_type);
2395 for (
j = 0;
j < num_berval[i];
j++) {
2396 efree(ldap_mods[i]->mod_bvalues[
j]);
2398 efree(ldap_mods[i]->mod_bvalues);
2399 efree(ldap_mods[i]);
2405 _php_ldap_controls_free(&lserverctrls);
2477 LDAPControl **lserverctrls =
NULL;
2479 LDAPMessage *ldap_res;
2492 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 3);
2493 if (lserverctrls ==
NULL) {
2502 rc = ldap_delete_ext_s(ld->
link, dn, lserverctrls,
NULL);
2504 if (rc != LDAP_SUCCESS) {
2509 rc = ldap_result(ld->
link, msgid, 1 ,
NULL, &ldap_res);
2519 result->result = ldap_res;
2526 _php_ldap_controls_free(&lserverctrls);
2548static size_t _ldap_str_equal_to_const(
const char *str,
size_t str_len,
const char *cstr)
2552 if (
strlen(cstr) != str_len)
2555 for (i = 0; i < str_len; ++i) {
2556 if (str[i] != cstr[i]) {
2566static size_t _ldap_strlen_max(
const char *str,
size_t max_len)
2570 for (i = 0; i < max_len; ++i) {
2571 if (str[i] ==
'\0') {
2581static void _ldap_hash_fetch(
zval *hashTbl,
const char *
key,
zval **
out)
2594 zval *attrib, *modtype, *vals;
2599 int num_mods, num_modprops, num_modvals;
2600 LDAPMod **ldap_mods;
2601 LDAPControl **lserverctrls =
NULL;
2644 if (_ldap_strlen_max(dn, dn_len) != dn_len) {
2650 zend_hash_internal_pointer_reset(
Z_ARRVAL_P(mods));
2656 num_mods = zend_hash_num_elements(
Z_ARRVAL_P(mods));
2658 if (!php_ldap_is_numerically_indexed_array(
Z_ARRVAL_P(mods))) {
2676 zend_hash_internal_pointer_reset(
Z_ARRVAL_P(mod));
2677 num_modprops = zend_hash_num_elements(
Z_ARRVAL_P(mod));
2678 bool has_attrib_key =
false;
2679 bool has_modtype_key =
false;
2681 for (
j = 0;
j < num_modprops;
j++) {
2699 fetched = zend_hash_get_current_data(
Z_ARRVAL_P(mod));
2704 has_attrib_key =
true;
2716 has_modtype_key =
true;
2756 zend_hash_internal_pointer_reset(
Z_ARRVAL_P(modinfo));
2757 num_modvals = zend_hash_num_elements(
Z_ARRVAL_P(modinfo));
2758 if (num_modvals == 0) {
2763 if (!php_ldap_is_numerically_indexed_array(
Z_ARRVAL_P(modinfo))) {
2772 if (!has_attrib_key) {
2776 if (!has_modtype_key) {
2787 ldap_mods =
safe_emalloc((num_mods+1),
sizeof(LDAPMod *), 0);
2805 oper = LDAP_MOD_ADD;
2809 oper = LDAP_MOD_DELETE;
2812 oper = LDAP_MOD_REPLACE;
2817 efree(ldap_mods[i]);
2823 ldap_mods[i]->mod_op = oper | LDAP_MOD_BVALUES;
2828 ldap_mods[i]->mod_bvalues =
NULL;
2832 num_modvals = zend_hash_num_elements(
Z_ARRVAL_P(vals));
2833 ldap_mods[i]->mod_bvalues =
safe_emalloc((num_modvals+1),
sizeof(
struct berval *), 0);
2839 modval = zval_get_string(fetched);
2842 ldap_mods[i]->mod_bvalues[
j] =
NULL;
2848 ldap_mods[i]->mod_bvalues[
j] =
safe_emalloc(1,
sizeof(
struct berval), 0);
2851 ldap_mods[i]->mod_bvalues[
j]->bv_len =
ZSTR_LEN(modval);
2853 zend_string_release(modval);
2858 ldap_mods[i]->mod_bvalues[num_modvals] =
NULL;
2865 ldap_mods[num_mods] =
NULL;
2868 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 4);
2869 if (lserverctrls ==
NULL) {
2876 if ((i = ldap_modify_ext_s(ld->
link, dn, ldap_mods, lserverctrls,
NULL)) != LDAP_SUCCESS) {
2883 for (i = 0; i < num_mods; i++) {
2885 efree(ldap_mods[i]->mod_type);
2887 if (ldap_mods[i]->mod_bvalues !=
NULL) {
2889 for (
j = 0; ldap_mods[i]->mod_bvalues[
j] !=
NULL;
j++) {
2891 efree(ldap_mods[i]->mod_bvalues[
j]->bv_val);
2894 efree(ldap_mods[i]->mod_bvalues[
j]);
2898 efree(ldap_mods[i]->mod_bvalues);
2902 efree(ldap_mods[i]);
2909 _php_ldap_controls_free(&lserverctrls);
2959 ld_errno = _get_lderrno(ld->
link);
2971 size_t dn_len, attr_len, value_len;
2973 LDAPControl **lserverctrls =
NULL;
2975 struct berval lvalue;
2977 if (
zend_parse_parameters(
ZEND_NUM_ARGS(),
"Osss|a!", &
link, ldap_link_ce, &dn, &dn_len, &
attr, &attr_len, &
value, &value_len, &serverctrls) !=
SUCCESS) {
2985 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 5);
2986 if (lserverctrls ==
NULL) {
2992 lvalue.bv_val =
value;
2993 lvalue.bv_len = value_len;
2998 case LDAP_COMPARE_TRUE:
3002 case LDAP_COMPARE_FALSE:
3013 _php_ldap_controls_free(&lserverctrls);
3020#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
3043#ifdef LDAP_OPT_RESTART
3046#ifdef LDAP_OPT_X_SASL_NOCANON
3049#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT
3052#ifdef LDAP_OPT_X_TLS_CRLCHECK
3055#ifdef LDAP_OPT_X_TLS_PROTOCOL_MIN
3058#ifdef LDAP_OPT_X_TLS_PROTOCOL_MAX
3061#ifdef LDAP_OPT_X_KEEPALIVE_IDLE
3074#ifdef LDAP_OPT_NETWORK_TIMEOUT
3077 struct timeval *timeout =
NULL;
3081 ldap_memfree(timeout);
3089 ldap_memfree(timeout);
3091#elif defined(LDAP_X_OPT_CONNECT_TIMEOUT)
3092 case LDAP_X_OPT_CONNECT_TIMEOUT:
3102#ifdef LDAP_OPT_TIMEOUT
3105 struct timeval *timeout =
NULL;
3109 ldap_memfree(timeout);
3117 ldap_memfree(timeout);
3122#ifdef LDAP_OPT_HOST_NAME
3125#ifdef HAVE_LDAP_SASL
3131#ifdef LDAP_OPT_X_SASL_USERNAME
3134#if (LDAP_API_VERSION > 2000)
3142#ifdef LDAP_OPT_X_TLS_PACKAGE
3145#ifdef LDAP_OPT_X_TLS_CRLFILE
3148#ifdef LDAP_OPT_X_TLS_DHFILE
3151#ifdef LDAP_OPT_MATCHED_DN
3169 LDAPControl **ctrls =
NULL;
3173 ldap_memfree(ctrls);
3177 _php_ldap_controls_to_array(ld->
link, ctrls,
retval, 1);
3212#ifdef LDAP_OPT_X_TLS_REQUIRE_CERT
3215#ifdef LDAP_OPT_X_TLS_CRLCHECK
3218#ifdef LDAP_OPT_X_TLS_PROTOCOL_MIN
3221#ifdef LDAP_OPT_X_TLS_PROTOCOL_MAX
3233#ifdef LDAP_OPT_DEBUG_LEVEL
3236#ifdef LDAP_OPT_X_KEEPALIVE_IDLE
3254#ifdef LDAP_OPT_NETWORK_TIMEOUT
3257 struct timeval timeout;
3261 timeout.tv_usec = 0;
3266#elif defined(LDAP_X_OPT_CONNECT_TIMEOUT)
3267 case LDAP_X_OPT_CONNECT_TIMEOUT:
3278#ifdef LDAP_OPT_TIMEOUT
3281 struct timeval timeout;
3285 timeout.tv_usec = 0;
3292#if (LDAP_API_VERSION > 2000)
3300#ifdef LDAP_OPT_X_TLS_CRLFILE
3303#ifdef LDAP_OPT_X_TLS_DHFILE
3311#ifdef LDAP_OPT_HOST_NAME
3314#ifdef HAVE_LDAP_SASL
3320#ifdef LDAP_OPT_MATCHED_DN
3325 val = zval_get_string(newval);
3330 zend_string_release(
val);
3333 zend_string_release(
val);
3337#ifdef LDAP_OPT_RESTART
3340#ifdef LDAP_OPT_X_SASL_NOCANON
3354 LDAPControl **ctrls;
3362 ctrls = _php_ldap_controls_from_array(ldap, newval, 3);
3364 if (ctrls ==
NULL) {
3368 _php_ldap_controls_free(&ctrls);
3369 if (rc != LDAP_SUCCESS) {
3381#ifdef HAVE_LDAP_PARSE_RESULT
3385 zval *
link, *
result, *errcode, *matcheddn, *errmsg, *referrals, *serverctrls;
3388 LDAPControl **lserverctrls =
NULL;
3389 char **lreferrals, **refp;
3390 char *lmatcheddn, *lerrmsg;
3393 if (
zend_parse_parameters(myargcount,
"OOz|zzzz", &
link, ldap_link_ce, &
result, ldap_result_ce, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) !=
SUCCESS) {
3404 myargcount > 3 ? &lmatcheddn :
NULL,
3405 myargcount > 4 ? &lerrmsg :
NULL,
3406 myargcount > 5 ? &lreferrals :
NULL,
3407 myargcount > 6 ? &lserverctrls :
NULL,
3409 if (rc != LDAP_SUCCESS) {
3417 switch (myargcount) {
3419 _php_ldap_controls_to_array(ld->
link, lserverctrls, serverctrls, 0);
3422 referrals = zend_try_array_init(referrals);
3426 if (lreferrals !=
NULL) {
3436 if (lerrmsg ==
NULL) {
3440 ldap_memfree(lerrmsg);
3444 if (lmatcheddn ==
NULL) {
3448 ldap_memfree(lmatcheddn);
3457#ifdef HAVE_LDAP_PARSE_EXTENDED_RESULT
3465 struct berval *lretdata;
3478 rc = ldap_parse_extended_result(ld->
link, ldap_result->
result,
3479 myargcount > 3 ? &lretoid:
NULL,
3480 myargcount > 2 ? &lretdata:
NULL,
3482 if (rc != LDAP_SUCCESS) {
3488 switch (myargcount) {
3490 if (lretoid ==
NULL) {
3494 ldap_memfree(lretoid);
3499 if (lretdata ==
NULL) {
3503 ldap_memfree(lretdata->bv_val);
3504 ldap_memfree(lretdata);
3559 resultentry->
data = entry;
3571 LDAPMessage *entry_next;
3588 resultentry_next->
data = entry_next;
3594#ifdef HAVE_LDAP_PARSE_REFERENCE
3598 zval *
link, *result_entry, *referrals;
3601 char **lreferrals, **refp;
3616 referrals = zend_try_array_init(referrals);
3621 if (lreferrals !=
NULL) {
3640 LDAPControl **lserverctrls =
NULL;
3642 LDAPMessage *ldap_res;
3644 char *dn, *newrdn, *newparent;
3645 size_t dn_len, newrdn_len, newparent_len;
3648 if (
zend_parse_parameters(
ZEND_NUM_ARGS(),
"Osssb|a!", &
link, ldap_link_ce, &dn, &dn_len, &newrdn, &newrdn_len, &newparent, &newparent_len, &deleteoldrdn, &serverctrls) !=
SUCCESS) {
3655 if (newparent_len == 0) {
3659#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
3661 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 6);
3662 if (lserverctrls ==
NULL) {
3669 rc =
ldap_rename(ld->
link, dn, newrdn, newparent, deleteoldrdn, lserverctrls,
NULL, &msgid);
3671 rc = ldap_rename_s(ld->
link, dn, newrdn, newparent, deleteoldrdn, lserverctrls,
NULL);
3674 if (newparent_len != 0) {
3687 rc = ldap_modrdn2_s(ld->
link, dn, newrdn, deleteoldrdn);
3690 if (rc != LDAP_SUCCESS) {
3693 rc = ldap_result(ld->
link, msgid, 1 ,
NULL, &ldap_res);
3703 result->result = ldap_res;
3710 _php_ldap_controls_free(&lserverctrls);
3731#ifdef HAVE_LDAP_START_TLS_S
3736static int _php_ldap_tls_newctx(
LDAP *ld)
3738 int val = 0, i, opts[] = {
3739#if (LDAP_API_VERSION > 2000)
3747#ifdef LDAP_OPT_X_TLS_CRLFILE
3750#ifdef LDAP_OPT_X_TLS_DHFILE
3753#ifdef LDAP_OPT_X_TLS_ECNAME
3754 LDAP_OPT_X_TLS_ECNAME,
3758 for (i=0 ; opts[i] ; i++) {
3781 int rc, protocol = LDAP_VERSION3;
3791#ifdef LDAP_OPT_X_TLS_NEWCTX
3794 ((rc = ldap_start_tls_s(ld->
link,
NULL,
NULL)) != LDAP_SUCCESS)
3806#if defined(LDAP_API_FEATURE_X_OPENLDAP) && defined(HAVE_3ARG_SETREBINDPROC)
3808int _ldap_rebind_proc(
LDAP *ldap,
const char *url, ber_tag_t req, ber_int_t msgid,
void *params)
3832 retval = zval_get_long(&cb_retval);
3883 char hex[] =
"0123456789abcdef";
3888 for (i = 0; i < valuelen; i++) {
3889 size_t addend = (map[(
unsigned char)
value[i]]) ? 3 : 1;
3909 ret = zend_string_alloc(
len, 0);
3911 for (i = 0; i < valuelen; i++) {
3912 unsigned char v = (
unsigned char)
value[i];
3928static void php_ldap_escape_map_set_chars(
bool *map,
const char *chars,
const size_t charslen,
char escape)
3931 while (i < charslen) {
3932 map[(
unsigned char) chars[i++]] = escape;
3938 char *
value, *ignores;
3939 size_t valuelen = 0, ignoreslen = 0;
3942 bool map[256] = {0}, havecharlist = 0;
3954 php_ldap_escape_map_set_chars(map,
"\\*()\0",
sizeof(
"\\*()\0") - 1, 1);
3959 php_ldap_escape_map_set_chars(map,
"\\,=+<>;\"#\r",
sizeof(
"\\,=+<>;\"#\r") - 1, 1);
3962 if (!havecharlist) {
3963 for (i = 0; i < 256; i++) {
3969 php_ldap_escape_map_set_chars(map, ignores, ignoreslen, 0);
3981#ifdef STR_TRANSLATION
3993 if (value_len == 0) {
4003 if (
result == LDAP_SUCCESS) {
4029#ifdef HAVE_LDAP_EXTENDED_OPERATION_S
4033 char *lretoid =
NULL;
4035 struct berval lreqdata, *lretdata =
NULL;
4038 LDAPMessage *ldap_res;
4039 LDAPControl **lserverctrls =
NULL;
4043 zend_error(
E_DEPRECATED,
"Calling ldap_exop() with more than 4 arguments is deprecated, use ldap_exop_sync() instead");
4057 lreqdata.bv_val =
ZSTR_VAL(reqdata);
4058 lreqdata.bv_len =
ZSTR_LEN(reqdata);
4060 lreqdata.bv_len = 0;
4064 lserverctrls = _php_ldap_controls_from_array(ld->
link, serverctrls, 4);
4065 if (lserverctrls ==
NULL) {
4071 if (force_sync || retdata) {
4073 rc = ldap_extended_operation_s(ld->
link,
ZSTR_VAL(reqoid),
4074 lreqdata.bv_len > 0 ? &lreqdata:
NULL,
4077 retoid ? &lretoid :
NULL,
4079 if (rc != LDAP_SUCCESS ) {
4088 ldap_memfree(lretoid);
4096 ldap_memfree(lretdata->bv_val);
4097 ldap_memfree(lretdata);
4107 rc = ldap_extended_operation(ld->
link,
ZSTR_VAL(reqoid),
4108 lreqdata.bv_len > 0 ? &lreqdata:
NULL,
4112 if (rc != LDAP_SUCCESS ) {
4118 rc = ldap_result(ld->
link, msgid, 1 ,
NULL, &ldap_res);
4128 result->result = ldap_res;
4132 _php_ldap_controls_free(&lserverctrls);
4149#ifdef HAVE_LDAP_PASSWD
4154 struct berval luser = { 0L,
NULL };
4155 struct berval loldpw = { 0L,
NULL };
4156 struct berval lnewpw = { 0L,
NULL };
4157 struct berval lgenpasswd = { 0L,
NULL };
4158 LDAPControl *ctrl, **lserverctrls =
NULL, *requestctrls[2] = {
NULL,
NULL };
4159 LDAPMessage* ldap_res =
NULL;
4162 char* errmsg =
NULL;
4164 if (
zend_parse_parameters(myargcount,
"O|sssz/", &
link, ldap_link_ce, &luser.bv_val, &luser.bv_len, &loldpw.bv_val, &loldpw.bv_len, &lnewpw.bv_val, &lnewpw.bv_len, &serverctrls) ==
FAILURE) {
4171 switch (myargcount) {
4174 if (ldap_create_passwordpolicy_control(ld->
link, &ctrl) == LDAP_SUCCESS) {
4175 requestctrls[0] = ctrl;
4180 rc = ldap_passwd(ld->
link, &luser,
4181 loldpw.bv_len > 0 ? &loldpw :
NULL,
4182 lnewpw.bv_len > 0 ? &lnewpw :
NULL,
4186 if (requestctrls[0] !=
NULL) {
4187 ldap_control_free(requestctrls[0]);
4190 if (rc != LDAP_SUCCESS ) {
4196 rc = ldap_result(ld->
link, msgid, 1 ,
NULL, &ldap_res);
4197 if ((rc < 0) || !ldap_res) {
4198 rc = _get_lderrno(ld->
link);
4204 rc = ldap_parse_passwd(ld->
link, ldap_res, &lgenpasswd);
4205 if( rc != LDAP_SUCCESS ) {
4212 if( rc != LDAP_SUCCESS ) {
4218 if (myargcount > 4) {
4219 _php_ldap_controls_to_array(ld->
link, lserverctrls, serverctrls, 0);
4223 if (lnewpw.bv_len == 0) {
4224 if (lgenpasswd.bv_len == 0) {
4229 }
else if (
err == LDAP_SUCCESS) {
4237 if (lgenpasswd.bv_val !=
NULL) {
4238 ldap_memfree(lgenpasswd.bv_val);
4240 if (ldap_res !=
NULL) {
4241 ldap_msgfree(ldap_res);
4243 if (errmsg !=
NULL) {
4244 ldap_memfree(errmsg);
4250#ifdef HAVE_LDAP_WHOAMI_S
4255 struct berval *lauthzid;
4268 if (rc != LDAP_SUCCESS ) {
4273 if (lauthzid ==
NULL) {
4277 ldap_memfree(lauthzid->bv_val);
4278 ldap_memfree(lauthzid);
4284#ifdef HAVE_LDAP_REFRESH_S
4303 lttl = (ber_int_t) ttl;
4305 rc = ldap_refresh_s(ld->
link, &ldn, lttl, &newttl,
NULL,
NULL);
4306 if (rc != LDAP_SUCCESS ) {
file_private const char ext[]
count(Countable|array $value, int $mode=COUNT_NORMAL)
assert(mixed $assertion, Throwable|string|null $description=null)
link(string $target, string $link)
#define Z_LDAP_RESULT_P(zv)
void ldap_memvfree(void **v)
#define PHP_LDAP_ESCAPE_FILTER
#define VERIFY_LDAP_RESULT_OPEN(lr)
#define VERIFY_LDAP_LINK_CONNECTED(ld)
#define Z_LDAP_LINK_P(zv)
#define PHP_LDAP_ESCAPE_DN
#define Z_LDAP_RESULT_ENTRY_P(zv)
zend_module_entry ldap_module_entry
const LDAP_OPT_X_TLS_DHFILE
const LDAP_OPT_ERROR_NUMBER
const LDAP_OPT_ERROR_STRING
ldap_parse_exop(LDAP\Connection $ldap, LDAP\Result $result, &$response_data=null, &$response_oid=null)
ldap_mod_replace(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
ldap_set_rebind_proc(LDAP\Connection $ldap, ?callable $callback)
const LDAP_OPT_X_TLS_CACERTFILE
ldap_compare(LDAP\Connection $ldap, string $dn, string $attribute, string $value, ?array $controls=null)
ldap_list($ldap, array|string $base, array|string $filter, array $attributes=[], int $attributes_only=0, int $sizelimit=-1, int $timelimit=-1, int $deref=LDAP_DEREF_NEVER, ?array $controls=null)
const LDAP_CONTROL_PAGEDRESULTS
ldap_connect_wallet(?string $uri=null, string $wallet, #[\SensitiveParameter] string $password, int $auth_mode=GSLC_SSL_NO_AUTH)
ldap_unbind(LDAP\Connection $ldap)
ldap_modify_batch(LDAP\Connection $ldap, string $dn, array $modifications_info, ?array $controls=null)
const LDAP_OPT_X_KEEPALIVE_IDLE
ldap_count_entries(LDAP\Connection $ldap, LDAP\Result $result)
ldap_first_reference(LDAP\Connection $ldap, LDAP\Result $result)
ldap_parse_result(LDAP\Connection $ldap, LDAP\Result $result, &$error_code, &$matched_dn=null, &$error_message=null, &$referrals=null, &$controls=null)
ldap_escape(string $value, string $ignore="", int $flags=0)
const LDAP_CONTROL_ASSERT
const LDAP_OPT_X_TLS_CACERTDIR
ldap_delete_ext(LDAP\Connection $ldap, string $dn, ?array $controls=null)
ldap_first_attribute(LDAP\Connection $ldap, LDAP\ResultEntry $entry)
const LDAP_CONTROL_PASSWORDPOLICYRESPONSE
ldap_next_entry(LDAP\Connection $ldap, LDAP\ResultEntry $entry)
ldap_start_tls(LDAP\Connection $ldap)
const LDAP_OPT_X_TLS_REQUIRE_CERT
const LDAP_CONTROL_POST_READ
ldap_read($ldap, array|string $base, array|string $filter, array $attributes=[], int $attributes_only=0, int $sizelimit=-1, int $timelimit=-1, int $deref=LDAP_DEREF_NEVER, ?array $controls=null)
const LDAP_OPT_PROTOCOL_VERSION
const LDAP_OPT_X_TLS_CIPHER_SUITE
const LDAP_OPT_X_KEEPALIVE_INTERVAL
ldap_connect(?string $uri=null, int $port=389, string $wallet=UNKNOWN, #[\SensitiveParameter] string $password=UNKNOWN, int $auth_mode=GSLC_SSL_NO_AUTH)
ldap_set_option(?LDAP\Connection $ldap, int $option, $value)
const LDAP_OPT_X_SASL_REALM
const LDAP_OPT_X_TLS_KEYFILE
ldap_free_result(LDAP\Result $result)
ldap_add(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
ldap_mod_add(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
const LDAP_OPT_X_SASL_MECH
ldap_get_attributes(LDAP\Connection $ldap, LDAP\ResultEntry $entry)
ldap_exop_sync(LDAP\Connection $ldap, string $request_oid, ?string $request_data=null, ?array $controls=null, &$response_data=null, &$response_oid=null)
ldap_search($ldap, array|string $base, array|string $filter, array $attributes=[], int $attributes_only=0, int $sizelimit=-1, int $timelimit=-1, int $deref=LDAP_DEREF_NEVER, ?array $controls=null)
ldap_mod_replace_ext(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
ldap_delete(LDAP\Connection $ldap, string $dn, ?array $controls=null)
const LDAP_CONTROL_PRE_READ
ldap_next_attribute(LDAP\Connection $ldap, LDAP\ResultEntry $entry)
ldap_parse_reference(LDAP\Connection $ldap, LDAP\ResultEntry $entry, &$referrals)
const LDAP_CONTROL_VLVRESPONSE
ldap_next_reference(LDAP\Connection $ldap, LDAP\ResultEntry $entry)
ldap_exop_passwd(LDAP\Connection $ldap, string $user="", #[\SensitiveParameter] string $old_password="", #[\SensitiveParameter] string $new_password="", &$controls=null)
const LDAP_OPT_X_TLS_PACKAGE
ldap_t61_to_8859(string $value)
ldap_8859_to_t61(string $value)
ldap_mod_del_ext(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
ldap_first_entry(LDAP\Connection $ldap, LDAP\Result $result)
ldap_rename_ext(LDAP\Connection $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls=null)
const LDAP_OPT_X_SASL_NOCANON
ldap_explode_dn(string $dn, int $with_attrib)
const LDAP_CONTROL_SORTREQUEST
const LDAP_OPT_X_SASL_AUTHCID
const LDAP_OPT_CLIENT_CONTROLS
const LDAP_OPT_X_TLS_CRLFILE
ldap_exop(LDAP\Connection $ldap, string $request_oid, ?string $request_data=null, ?array $controls=null, &$response_data=UNKNOWN, &$response_oid=null)
const LDAP_OPT_X_TLS_PROTOCOL_MIN
const LDAP_OPT_SERVER_CONTROLS
ldap_get_entries(LDAP\Connection $ldap, LDAP\Result $result)
const LDAP_OPT_MATCHED_DN
const LDAP_OPT_X_SASL_USERNAME
const LDAP_CONTROL_VALUESRETURNFILTER
ldap_mod_add_ext(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
ldap_bind_ext(LDAP\Connection $ldap, ?string $dn=null, #[\SensitiveParameter] ?string $password=null, ?array $controls=null)
const LDAP_OPT_X_TLS_CERTFILE
ldap_exop_refresh(LDAP\Connection $ldap, string $dn, int $ttl)
ldap_get_dn(LDAP\Connection $ldap, LDAP\ResultEntry $entry)
ldap_get_values_len(LDAP\Connection $ldap, LDAP\ResultEntry $entry, string $attribute)
const LDAP_OPT_X_TLS_RANDOM_FILE
ldap_sasl_bind(LDAP\Connection $ldap, ?string $dn=null, #[\SensitiveParameter] ?string $password=null, ?string $mech=null, ?string $realm=null, ?string $authc_id=null, ?string $authz_id=null, ?string $props=null)
const LDAP_CONTROL_VLVREQUEST
const LDAP_OPT_X_KEEPALIVE_PROBES
const LDAP_OPT_X_TLS_PROTOCOL_MAX
ldap_bind(LDAP\Connection $ldap, ?string $dn=null, #[\SensitiveParameter] ?string $password=null)
const LDAP_OPT_DEBUG_LEVEL
const LDAP_CONTROL_SORTRESPONSE
const LDAP_OPT_X_SASL_AUTHZID
ldap_mod_del(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
ldap_error(LDAP\Connection $ldap)
ldap_get_option(LDAP\Connection $ldap, int $option, &$value=null)
const LDAP_OPT_X_TLS_CRLCHECK
const LDAP_OPT_NETWORK_TIMEOUT
ldap_exop_whoami(LDAP\Connection $ldap)
ldap_errno(LDAP\Connection $ldap)
ldap_add_ext(LDAP\Connection $ldap, string $dn, array $entry, ?array $controls=null)
ldap_count_references(LDAP\Connection $ldap, LDAP\Result $result)
ldap_rename(LDAP\Connection $ldap, string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls=null)
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
php_info_print_table_start()
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
php_info_print_table_end()
#define PHP_MSHUTDOWN_FUNCTION
#define PHP_MINIT_FUNCTION
#define PHP_MINFO_FUNCTION
#define PHP_GINIT_FUNCTION
#define PHP_RINIT_FUNCTION
#define PHP_MODULE_GLOBALS
unsigned const char * text
#define STD_PHP_INI_ENTRY_EX
#define LDAP_MODIFY_BATCH_ATTRIB
#define LDAP_MODIFY_BATCH_ADD
#define LDAP_MODIFY_BATCH_MODTYPE
#define LDAP_MODIFY_BATCH_REPLACE
#define LDAP_MODIFY_BATCH_VALUES
#define LDAP_MODIFY_BATCH_REMOVE_ALL
#define LDAP_MODIFY_BATCH_REMOVE
unsigned char key[REFLECTION_KEY_LEN]
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API ZEND_COLD void zend_type_error(const char *format,...)
ZEND_API ZEND_COLD void zend_value_error(const char *format,...)
ZEND_API ZEND_COLD void zend_error(int type, const char *format,...)
#define ZEND_TSRMLS_CACHE_UPDATE()
#define INTERNAL_FUNCTION_PARAMETERS
#define ZEND_TSRMLS_CACHE_DEFINE()
#define INTERNAL_FUNCTION_PARAM_PASSTHRU
ZEND_API zend_result add_next_index_bool(zval *arg, bool b)
ZEND_API const char * zend_zval_value_name(const zval *arg)
ZEND_API zend_result add_next_index_stringl(zval *arg, const char *str, size_t length)
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API void add_index_stringl(zval *arg, zend_ulong index, const char *str, size_t length)
ZEND_API void add_index_string(zval *arg, zend_ulong index, const char *str)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type)
ZEND_API ZEND_COLD void zend_argument_must_not_be_empty_error(uint32_t arg_num)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format,...)
ZEND_API zend_result add_next_index_string(zval *arg, const char *str)
struct _zend_fcall_info_cache zend_fcall_info_cache
#define ZEND_TRY_ASSIGN_REF_STRINGL(zv, string, len)
#define ZEND_PARSE_PARAMETERS_END()
#define ZVAL_STRING(z, s)
#define ZEND_DECLARE_MODULE_GLOBALS(module_name)
#define ZEND_GET_MODULE(name)
#define ZEND_FCI_INITIALIZED(fci)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define RETVAL_EMPTY_STRING()
#define ZEND_TRY_ASSIGN_REF_LONG(zv, lval)
#define Z_PARAM_ARRAY_HT_OR_STR(dest_ht, dest_str)
#define Z_PARAM_LONG(dest)
#define RETURN_NEW_STR(s)
struct _zend_fcall_info zend_fcall_info
#define ZEND_TRY_ASSIGN_REF_EMPTY_STRING(zv)
#define call_user_function(function_table, object, function_name, retval_ptr, param_count, params)
#define Z_PARAM_ARRAY_EX(dest, check_null, separate)
#define RETURN_EMPTY_STRING()
#define Z_PARAM_ZVAL(dest)
#define WRONG_PARAM_COUNT
#define ZEND_TRY_ASSIGN_REF_STRING(zv, string)
#define RETVAL_STRINGL(s, l)
#define estrndup(s, length)
#define safe_emalloc(nmemb, size, offset)
strncmp(string $string1, string $string2, int $length)
strcmp(string $string1, string $string2)
ZEND_API const char * get_active_function_name(void)
union _zend_function zend_function
ZEND_API zval *ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *str, size_t len)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval *pData)
ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
ZEND_API zval *ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
#define HASH_KEY_IS_STRING
#define ZEND_HASH_MAP_FOREACH_STR_KEY(ht, _key)
#define ZEND_HASH_FOREACH_END()
#define ZEND_HASH_FOREACH_VAL(ht, _val)
#define UNREGISTER_INI_ENTRIES()
#define REGISTER_INI_ENTRIES()
#define DISPLAY_INI_ENTRIES()
struct _zend_string zend_string
#define STANDARD_MODULE_HEADER
struct _zend_module_entry zend_module_entry
#define STANDARD_MODULE_PROPERTIES_EX
ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
ZEND_API bool ZEND_FASTCALL zend_is_true(const zval *op)
ZEND_API void ZEND_FASTCALL zend_str_tolower(char *str, size_t length)
ZEND_API void ZEND_FASTCALL convert_to_long(zval *op)
#define convert_to_string(op)
#define XtOffsetOf(s_type, field)
#define UNEXPECTED(condition)
struct _zend_array zend_array
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
#define ZEND_LONG_EXCEEDS_INT(zlong)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
struct _zend_array HashTable
#define Z_STRLEN_P(zval_p)
#define Z_OBJCE_P(zval_p)
struct _zend_object_handlers zend_object_handlers
#define SEPARATE_ARRAY(zv)
#define ZVAL_COPY_VALUE(z, v)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)