]> granicus.if.org Git - php/commitdiff
Add ldap_count_references()
authorPaweł Tomulik <ptomulik@meil.pw.edu.pl>
Tue, 30 Jun 2020 14:12:12 +0000 (16:12 +0200)
committerCôme Chilliet <mcmic@php.net>
Wed, 1 Jul 2020 07:29:46 +0000 (09:29 +0200)
Closes GH-5784

UPGRADING
ext/ldap/ldap.c
ext/ldap/ldap.stub.php
ext/ldap/ldap_arginfo.h
ext/ldap/tests/ldap_count_references_basic.phpt [new file with mode: 0644]

index 913205e277340853704e3161a1d9e9f4a3021e4d..1b54be9cd079675d44ccc1f9f7933907a00c5a0a 100644 (file)
--- 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.
index d177b31255a152f5181d9f1f68c2dc9b60b7f8d9..0d96dd00d0ff16ec1415faed4528cfefb19ae364 100644 (file)
@@ -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)
index 4bad9915b873c11cd856e0e2e1c3738372b4fb36..b60d46a70b2b9d6bc3e13bdb932d063b529984f7 100644 (file)
@@ -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
index 9dcbad54dbcbd97be8139ca2357c369c193f9d96..8aa72a0276b9a147addba500655202aad9b1df28 100644 (file)
@@ -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 (file)
index 0000000..52ed8c0
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+ldap_count_references() - Basic ldap_count_references test
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+<?php require_once('skipifbindfailure.inc'); ?>
+--FILE--
+<?php
+require "connect.inc";
+$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
+insert_dummy_data($link, $base);
+ldap_add($link, "cn=userref,$base", array(
+        "objectClass" => 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--
+<?php
+include "connect.inc";
+
+$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
+// Referral can only be removed with Manage DSA IT Control
+ldap_delete($link, "cn=userref,$base", [['oid' => 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)