📄 ldap.c
字号:
case 8 : convert_to_long_ex(deref); ldap_deref = Z_LVAL_PP(deref); case 7 : convert_to_long_ex(timelimit); ldap_timelimit = Z_LVAL_PP(timelimit); case 6 : convert_to_long_ex(sizelimit); ldap_sizelimit = Z_LVAL_PP(sizelimit); case 5 : convert_to_long_ex(attrsonly); ldap_attrsonly = Z_LVAL_PP(attrsonly); case 4 : if (Z_TYPE_PP(attrs) != IS_ARRAY) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected Array as last element"); RETURN_FALSE; } num_attribs = zend_hash_num_elements(Z_ARRVAL_PP(attrs)); ldap_attrs = safe_emalloc((num_attribs+1), sizeof(char *), 0); for (i = 0; i<num_attribs; i++) { if (zend_hash_index_find(Z_ARRVAL_PP(attrs), i, (void **) &attr) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array initialization wrong"); efree(ldap_attrs); RETURN_FALSE; } SEPARATE_ZVAL(attr); convert_to_string_ex(attr); ldap_attrs[i] = Z_STRVAL_PP(attr); } ldap_attrs[num_attribs] = NULL; case 3 : /* parallel search? */ if (Z_TYPE_PP(link) != IS_ARRAY) { convert_to_string_ex(filter); ldap_filter = Z_STRVAL_PP(filter); convert_to_string_ex(base_dn); ldap_base_dn = Z_STRVAL_PP(base_dn); } break; default: WRONG_PARAM_COUNT; break; } /* parallel search? */ if (Z_TYPE_PP(link) == IS_ARRAY) { int i, nlinks, nbases, nfilters, *rcs; ldap_linkdata **lds; zval **entry, *resource; nlinks = zend_hash_num_elements(Z_ARRVAL_PP(link)); if (nlinks == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No links in link array"); if (ldap_attrs != NULL) { efree(ldap_attrs); } RETURN_FALSE; } if (Z_TYPE_PP(base_dn) == IS_ARRAY) { nbases = zend_hash_num_elements(Z_ARRVAL_PP(base_dn)); if (nbases != nlinks) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Base must either be a string, or an array with the same number of elements as the links array"); if (ldap_attrs != NULL) { efree(ldap_attrs); } RETURN_FALSE; } zend_hash_internal_pointer_reset(Z_ARRVAL_PP(base_dn)); } else { nbases = 0; /* this means string, not array */ convert_to_string_ex(base_dn); ldap_base_dn = Z_STRLEN_PP(base_dn) < 1 ? NULL : Z_STRVAL_PP(base_dn); } if (Z_TYPE_PP(filter) == IS_ARRAY) { nfilters = zend_hash_num_elements(Z_ARRVAL_PP(filter)); if (nfilters != nlinks) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filter must either be a string, or an array with the same number of elements as the links array"); if (ldap_attrs != NULL) { efree(ldap_attrs); } RETURN_FALSE; } zend_hash_internal_pointer_reset(Z_ARRVAL_PP(filter)); } else { nfilters = 0; /* this means string, not array */ convert_to_string_ex(filter); ldap_filter = Z_STRVAL_PP(filter); } lds = safe_emalloc(nlinks, sizeof(ldap_linkdata), 0); rcs = safe_emalloc(nlinks, sizeof(*rcs), 0); zend_hash_internal_pointer_reset(Z_ARRVAL_PP(link)); for (i=0; i<nlinks; i++) { zend_hash_get_current_data(Z_ARRVAL_PP(link), (void **)&entry); ld = (ldap_linkdata *) zend_fetch_resource(entry TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); if (ld == NULL) { efree(lds); efree(rcs); if (ldap_attrs != NULL) { efree(ldap_attrs); } RETURN_FALSE; } if (nbases != 0) { /* base_dn an array? */ zend_hash_get_current_data(Z_ARRVAL_PP(base_dn), (void **)&entry); zend_hash_move_forward(Z_ARRVAL_PP(base_dn)); convert_to_string_ex(entry); ldap_base_dn = Z_STRLEN_PP(entry) < 1 ? NULL : Z_STRVAL_PP(entry); } if (nfilters != 0) { /* filter an array? */ zend_hash_get_current_data(Z_ARRVAL_PP(filter), (void **)&entry); zend_hash_move_forward(Z_ARRVAL_PP(filter)); convert_to_string_ex(entry); ldap_filter = Z_STRVAL_PP(entry); } php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref); /* Run the actual search */ rcs[i] = ldap_search(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly); lds[i] = ld; zend_hash_move_forward(Z_ARRVAL_PP(link)); } if (ldap_attrs != NULL) { efree(ldap_attrs); } array_init(return_value); /* Collect results from the searches */ for (i=0; i<nlinks; i++) { MAKE_STD_ZVAL(resource); if (rcs[i] != -1) { rcs[i] = ldap_result(lds[i]->link, LDAP_RES_ANY, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res); } if (rcs[i] != -1) { ZEND_REGISTER_RESOURCE(resource, ldap_res, le_result); add_next_index_zval(return_value, resource); } else { add_next_index_bool(return_value, 0); } } efree(lds); efree(rcs); return; } /* fix to make null base_dn's work */ if (strlen(ldap_base_dn) < 1) { ldap_base_dn = NULL; } ld = (ldap_linkdata *) zend_fetch_resource(link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); if (ld == NULL) { if (ldap_attrs != NULL) { efree(ldap_attrs); } RETURN_FALSE; } php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref); /* Run the actual search */ errno = ldap_search_s(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly, &ldap_res); if (ldap_attrs != NULL) { efree(ldap_attrs); } if (errno != LDAP_SUCCESS && errno != LDAP_SIZELIMIT_EXCEEDED#ifdef LDAP_ADMINLIMIT_EXCEEDED && errno != LDAP_ADMINLIMIT_EXCEEDED#endif#ifdef LDAP_REFERRAL && errno != LDAP_REFERRAL#endif ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Search: %s", ldap_err2string(errno)); RETVAL_FALSE; } else { if (errno == LDAP_SIZELIMIT_EXCEEDED) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Sizelimit exceeded."); }#ifdef LDAP_ADMINLIMIT_EXCEEDED else if (errno == LDAP_ADMINLIMIT_EXCEEDED) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Adminlimit exceeded."); }#endif ZEND_REGISTER_RESOURCE(return_value, ldap_res, le_result); }}/* }}} *//* {{{ proto resource ldap_read(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) Read an entry */PHP_FUNCTION(ldap_read){ php_ldap_do_search(INTERNAL_FUNCTION_PARAM_PASSTHRU, LDAP_SCOPE_BASE);}/* }}} *//* {{{ proto resource ldap_list(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) Single-level search */PHP_FUNCTION(ldap_list){ php_ldap_do_search(INTERNAL_FUNCTION_PARAM_PASSTHRU, LDAP_SCOPE_ONELEVEL);}/* }}} *//* {{{ proto resource ldap_search(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) Search LDAP tree under base_dn */PHP_FUNCTION(ldap_search){ php_ldap_do_search(INTERNAL_FUNCTION_PARAM_PASSTHRU, LDAP_SCOPE_SUBTREE);}/* }}} *//* {{{ proto bool ldap_free_result(resource result) Free result memory */PHP_FUNCTION(ldap_free_result){ zval **result; LDAPMessage *ldap_result; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(ldap_result, LDAPMessage *, result, -1, "ldap result", le_result); zend_list_delete(Z_LVAL_PP(result)); /* Delete list entry and call registered destructor function */ RETVAL_TRUE;}/* }}} *//* {{{ proto int ldap_count_entries(resource link, resource result) Count the number of entries in a search result */PHP_FUNCTION(ldap_count_entries){ zval **link, **result; ldap_linkdata *ld; LDAPMessage *ldap_result; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result) == 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); RETURN_LONG(ldap_count_entries(ld->link, ldap_result));}/* }}} *//* {{{ proto resource ldap_first_entry(resource link, resource result) Return first result id */PHP_FUNCTION(ldap_first_entry){ zval **link, **result; ldap_linkdata *ld; ldap_resultentry *resultentry; LDAPMessage *ldap_result, *entry; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result) == 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); if ((entry = ldap_first_entry(ld->link, ldap_result)) == NULL) { RETVAL_FALSE; } else { resultentry = emalloc(sizeof(ldap_resultentry)); ZEND_REGISTER_RESOURCE(return_value, resultentry, le_result_entry); resultentry->id = Z_LVAL_PP(result); zend_list_addref(resultentry->id); resultentry->data = entry; }}/* }}} *//* {{{ proto resource ldap_next_entry(resource link, resource result_entry) Get next result entry */PHP_FUNCTION(ldap_next_entry){ zval **link, **result_entry; ldap_linkdata *ld; ldap_resultentry *resultentry, *resultentry_next; LDAPMessage *entry_next; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result_entry) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry); if ((entry_next = ldap_next_entry(ld->link, resultentry->data)) == NULL) { RETVAL_FALSE; } else { resultentry_next = emalloc(sizeof(ldap_resultentry)); ZEND_REGISTER_RESOURCE(return_value, resultentry_next, le_result_entry); resultentry_next->id = resultentry->id; zend_list_addref(resultentry->id); resultentry_next->data = entry_next; }}/* }}} *//* {{{ proto array ldap_get_entries(resource link, resource result) Get all result entries */PHP_FUNCTION(ldap_get_entries){ zval **link, **result; LDAPMessage *ldap_result, *ldap_result_entry; zval *tmp1, *tmp2; ldap_linkdata *ld; LDAP *ldap; int num_entries, num_attrib, num_values, i; BerElement *ber; char *attribute; size_t attr_len; char **ldap_value; char *dn; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result) == 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); ldap = ld->link; num_entries = ldap_count_entries(ldap, ldap_result); array_init(return_value); add_assoc_long(return_value, "count", num_entries); if (num_entries == 0) return; num_entries = 0; ldap_result_entry = ldap_first_entry(ldap, ldap_result); if (ldap_result_entry == NULL) RETURN_FALSE; while (ldap_result_entry != NULL) { MAKE_STD_ZVAL(tmp1); array_init(tmp1); num_attrib = 0; attribute = ldap_first_attribute(ldap, ldap_result_entry, &ber); while (attribute != NULL) { ldap_value = ldap_get_values(ldap, ldap_result_entry, attribute); num_values = ldap_count_values(ldap_value); MAKE_STD_ZVAL(tmp2); array_init(tmp2); add_assoc_long(tmp2, "count", num_values); for (i = 0; i < num_values; i++) { add_index_string(tmp2, i, ldap_value[i], 1); } ldap_value_free(ldap_value); attr_len = strlen(attribute); zend_hash_update(Z_ARRVAL_P(tmp1), php_strtolower(attribute, attr_len), attr_len+1, (void *) &tmp2, sizeof(zval *), NULL); add_index_string(tmp1, num_attrib, attribute, 1); num_attrib++;#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS ldap_memfree(attribute);#endif attribute = ldap_next_attribute(ldap, ldap_result_entry, ber); }#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS if (ber != NULL) ber_free(ber, 0);#endif add_assoc_long(tmp1, "count", num_attrib); dn = ldap_get_dn(ldap, ldap_result_entry); add_assoc_string(tmp1, "dn", dn, 1);#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS ldap_memfree(dn);#else free(dn);#endif zend_hash_index_update(Z_ARRVAL_P(return_value), num_entries, (void *) &tmp1, sizeof(zval *), NULL); num_entries++; ldap_result_entry = ldap_next_entry(ldap, ldap_result_entry); } add_assoc_long(return_value, "count", num_entries);}/* }}} *//* {{{ proto string ldap_first_attribute(resource link, resource result_entry, int ber) Return first attribute */PHP_FUNCTION(ldap_first_attribute){ zval **link, **result_entry, **berp; ldap_linkdata *ld; ldap_resultentry *resultentry; BerElement *ber; char *attribute; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &link, &result_entry, &berp) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry); if ((attribute = ldap_first_attribute(ld->link, resultentry->data, &ber)) == NULL) { RETURN_FALSE; } else { ZEND_REGISTER_RESOURCE(*berp, ber, le_ber_entry); RETVAL_STRING(attribute, 1);#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS ldap_memfree(attribute);#endif }}/* }}} *//* {{{ proto string ldap_next_attribute(resource link, resource result_entry, resource ber) Get the next attribute in result */PHP_FUNCTION(ldap_next_attribute){ zval **link, **result_entry, **berp; ldap_linkdata *ld; ldap_resultentry *resultentry; BerElement *ber; char *attribute; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &link, &result_entry, &berp) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry); ZEND_FETCH_RESOURCE(ber, BerElement *, berp, -1, "ldap ber entry", le_ber_entry); if ((attribute = ldap_next_attribute(ld->link, resultentry->data, ber)) == NULL) { RETURN_FALSE; } else { ZEND_REGISTER_RESOURCE(*berp, ber, le_ber_entry); RETVAL_STRING(attribute, 1);#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS ldap_memfree(attribute);#endif }}/* }}} *//* {{{ proto array ldap_get_attributes(resource link, resource result_entry) Get attributes from a search result entry */PHP_FUNCTION(ldap_get_attributes){ zval **link, **result_entry; zval *tmp; ldap_linkdata *ld; ldap_resultentry *resultentry; char *attribute; char **ldap_value; int i, num_values, num_attrib; BerElement *ber; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result_entry) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry); array_init(return_value); num_attrib = 0; attribute = ldap_first_attribute(ld->link, resultentry->data, &ber); while (attribute != NULL) { ldap_value = ldap_get_values(ld->link, resultentry->data, attribute); num_values = ldap_count_values(ldap_value); MAKE_STD_ZVAL(tmp); array_init(tmp); add_assoc_long(tmp, "count", num_values); for (i = 0; i < num_values; i++) { add_index_string(tmp, i, ldap_value[i], 1); } ldap_value_free(ldap_value); zend_hash_update(Z_ARRVAL_P(return_value), attribute, strlen(attribute)+1, (void *) &tmp, sizeof(zval *), NULL); add_index_string(return_value, num_attrib, attribute, 1); num_attrib++;#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS ldap_memfree(attribute);#endif attribute = ldap_next_attribute(ld->link, resultentry->data, ber); }#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS if (ber != NULL) { ber_free(ber, 0); }#endif add_assoc_long(return_value, "count", num_attrib);}/* }}} *//* {{{ proto array ldap_get_values(resource link, resource result_entry, string attribute) Get all values from a result entry */PHP_FUNCTION(ldap_get_values)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -