From 9081faaeaf74980caf293fa0cee1ee43d2f379d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Tomulik?= Date: Tue, 30 Jun 2020 16:12:12 +0200 Subject: [PATCH] added ldap_count_references() --- UPGRADING | 4 +++ ext/ldap/ldap.c | 24 +++++++++++++ ext/ldap/ldap.stub.php | 6 ++++ ext/ldap/ldap_arginfo.h | 15 +++++++- .../tests/ldap_count_references_basic.phpt | 36 +++++++++++++++++++ 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 ext/ldap/tests/ldap_count_references_basic.phpt diff --git a/UPGRADING b/UPGRADING index 913205e277340..1b54be9cd0796 100644 --- a/UPGRADING +++ b/UPGRADING @@ -711,6 +711,10 @@ PHP 8.0 UPGRADE NOTES . Added get_resource_id($resource) function, which returns the same value as (int) $resource. It provides the same functionality under a clearer API. +- LDAP: + . Added ldap_count_references(), which returns the number of reference + messages in a search result. + - OpenSSL: . Added openssl_cms_encrypt() encrypts the message in the file with the certificates and outputs the result to the supplied file. diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index d177b31255a15..0d96dd00d0ff1 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -3464,6 +3464,30 @@ PHP_FUNCTION(ldap_parse_exop) #endif /* }}} */ +/* {{{ proto int ldap_count_references(resource link, resource result) + Count the number of references in a search result */ +PHP_FUNCTION(ldap_count_references) +{ + zval *link, *result; + ldap_linkdata *ld; + LDAPMessage *ldap_result; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr", &link, &result) != SUCCESS) { + RETURN_THROWS(); + } + + if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) { + RETURN_THROWS(); + } + + if ((ldap_result = (LDAPMessage *)zend_fetch_resource(Z_RES_P(result), "ldap result", le_result)) == NULL) { + RETURN_THROWS(); + } + + RETURN_LONG(ldap_count_references(ld->link, ldap_result)); +} +/* }}} */ + /* {{{ proto resource ldap_first_reference(resource link, resource result) Return first reference */ PHP_FUNCTION(ldap_first_reference) diff --git a/ext/ldap/ldap.stub.php b/ext/ldap/ldap.stub.php index 4bad9915b873c..b60d46a70b2b9 100644 --- a/ext/ldap/ldap.stub.php +++ b/ext/ldap/ldap.stub.php @@ -226,6 +226,12 @@ function ldap_get_option($link_identifier, int $option, &$retval = null): bool { /** @param resource|null $link_identifier */ function ldap_set_option($link_identifier, int $option, $newval): bool {} +/** + * @param resource $link_identifier + * @param resource $result_identifier + */ +function ldap_count_references($link_identifier, $result_identifier): int {} + /** * @param resource $link * @param resource $result diff --git a/ext/ldap/ldap_arginfo.h b/ext/ldap/ldap_arginfo.h index 9dcbad54dbcbd..8aa72a0276b9a 100644 --- a/ext/ldap/ldap_arginfo.h +++ b/ext/ldap/ldap_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: c9ce0e98ab386130b6332ae017808bec67b1cd07 */ + * Stub hash: 63d7fc9e11bd2821a77f6ee709ceaf1fdcbf190e */ #if defined(HAVE_ORALDAP) ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_connect, 0, 0, 0) @@ -243,6 +243,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_set_option, 0, 3, _IS_BOOL, ZEND_END_ARG_INFO() #endif +#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ldap_count_references, 0, 2, IS_LONG, 0) + ZEND_ARG_INFO(0, link_identifier) + ZEND_ARG_INFO(0, result_identifier) +ZEND_END_ARG_INFO() +#endif + #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_first_reference, 0, 0, 2) ZEND_ARG_INFO(0, link) @@ -412,6 +419,9 @@ ZEND_FUNCTION(ldap_get_option); ZEND_FUNCTION(ldap_set_option); #endif #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) +ZEND_FUNCTION(ldap_count_references); +#endif +#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) ZEND_FUNCTION(ldap_first_reference); #endif #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) @@ -517,6 +527,9 @@ static const zend_function_entry ext_functions[] = { #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) ZEND_FE(ldap_set_option, arginfo_ldap_set_option) #endif +#if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) + ZEND_FE(ldap_count_references, arginfo_ldap_count_references) +#endif #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP) ZEND_FE(ldap_first_reference, arginfo_ldap_first_reference) #endif diff --git a/ext/ldap/tests/ldap_count_references_basic.phpt b/ext/ldap/tests/ldap_count_references_basic.phpt new file mode 100644 index 0000000000000..52ed8c0253ad2 --- /dev/null +++ b/ext/ldap/tests/ldap_count_references_basic.phpt @@ -0,0 +1,36 @@ +--TEST-- +ldap_count_references() - Basic ldap_count_references test +--SKIPIF-- + + +--FILE-- + array("extensibleObject", "referral"), + "cn" => "userref", + "ref" => "cn=userA,$base", +)); +ldap_add($link, "cn=userref2,$base", array( + "objectClass" => array("extensibleObject", "referral"), + "cn" => "userref2", + "ref" => "cn=userB,$base", +)); +ldap_set_option($link, LDAP_OPT_DEREF, LDAP_DEREF_NEVER); +$result = ldap_search($link, "$base", "(cn=*)"); +var_dump(ldap_count_references($link, $result)); +?> +--CLEAN-- + LDAP_CONTROL_MANAGEDSAIT, 'iscritical' => TRUE]]); +ldap_delete($link, "cn=userref2,$base", [['oid' => LDAP_CONTROL_MANAGEDSAIT, 'iscritical' => TRUE]]); +remove_dummy_data($link, $base); +?> +--EXPECTF-- +int(2)