]> granicus.if.org Git - php/commitdiff
Added constants for known ldap controls OID and tests for ldap_get/set_option for...
authorCôme Chilliet <mcmic@php.net>
Wed, 5 Jul 2017 12:19:09 +0000 (14:19 +0200)
committerCôme Chilliet <mcmic@php.net>
Wed, 5 Jul 2017 14:41:52 +0000 (16:41 +0200)
Also fixed existing tests which were expecting ldap_get_option to fail on controls

ext/ldap/ldap.c
ext/ldap/tests/ldap_get_option_controls.phpt [new file with mode: 0644]
ext/ldap/tests/ldap_get_option_variation.phpt
ext/ldap/tests/ldap_set_option_variation.phpt

index 8263e70cf1fcb38bd0f2ca2e9c7cc5902ed1bdfe..9b0edf38303799aee1232f523f3a4e60e87d7f78 100644 (file)
@@ -291,6 +291,76 @@ PHP_MINIT_FUNCTION(ldap)
        REGISTER_STRING_CONSTANT("LDAP_EXOP_TURN", LDAP_EXOP_TURN, CONST_PERSISTENT | CONST_CS);
 #endif
 
+/* LDAP Controls */
+/*     standard track controls */
+#ifdef LDAP_CONTROL_MANAGEDSAIT
+       /* RFC 3296 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_MANAGEDSAIT", LDAP_CONTROL_MANAGEDSAIT, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_PROXY_AUTHZ
+       /* RFC 4370 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_PROXY_AUTHZ", LDAP_CONTROL_PROXY_AUTHZ, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_SUBENTRIES
+       /* RFC 3672 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_SUBENTRIES", LDAP_CONTROL_SUBENTRIES, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_VALUESRETURNFILTER
+       /* RFC 3876 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_VALUESRETURNFILTER", LDAP_CONTROL_VALUESRETURNFILTER, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_ASSERT
+       /* RFC 4528 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_ASSERT", LDAP_CONTROL_ASSERT, CONST_PERSISTENT | CONST_CS);
+       /* RFC 4527 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_PRE_READ", LDAP_CONTROL_PRE_READ, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_POST_READ", LDAP_CONTROL_POST_READ, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_SORTREQUEST
+       /* RFC 2891 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_SORTREQUEST", LDAP_CONTROL_SORTREQUEST, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_SORTRESPONSE", LDAP_CONTROL_SORTRESPONSE, CONST_PERSISTENT | CONST_CS);
+#endif
+/*     non-standard track controls */
+#ifdef LDAP_CONTROL_PAGEDRESULTS
+       /* RFC 2696 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_PAGEDRESULTS", LDAP_CONTROL_PAGEDRESULTS, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_AUTHZID_REQUEST
+       /* RFC 3829 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_AUTHZID_REQUEST", LDAP_CONTROL_AUTHZID_REQUEST, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_AUTHZID_RESPONSE", LDAP_CONTROL_AUTHZID_RESPONSE, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_SYNC
+       /* LDAP Content Synchronization Operation -- RFC 4533 */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_SYNC", LDAP_CONTROL_SYNC, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_SYNC_STATE", LDAP_CONTROL_SYNC_STATE, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_SYNC_DONE", LDAP_CONTROL_SYNC_DONE, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_DONTUSECOPY
+       /* LDAP Don't Use Copy Control (RFC 6171) */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_DONTUSECOPY", LDAP_CONTROL_DONTUSECOPY, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_PASSWORDPOLICYREQUEST
+       /* Password policy Controls */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_PASSWORDPOLICYREQUEST", LDAP_CONTROL_PASSWORDPOLICYREQUEST, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_PASSWORDPOLICYRESPONSE", LDAP_CONTROL_PASSWORDPOLICYRESPONSE, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_X_INCREMENTAL_VALUES
+       /* MS Active Directory controls */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_INCREMENTAL_VALUES", LDAP_CONTROL_X_INCREMENTAL_VALUES, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_DOMAIN_SCOPE", LDAP_CONTROL_X_DOMAIN_SCOPE, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_PERMISSIVE_MODIFY", LDAP_CONTROL_X_PERMISSIVE_MODIFY, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_SEARCH_OPTIONS", LDAP_CONTROL_X_SEARCH_OPTIONS, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_TREE_DELETE", LDAP_CONTROL_X_TREE_DELETE, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_EXTENDED_DN", LDAP_CONTROL_X_EXTENDED_DN, CONST_PERSISTENT | CONST_CS);
+#endif
+#ifdef LDAP_CONTROL_X_INCREMENTAL_VALUES
+       /* LDAP VLV */
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_VLVREQUEST", LDAP_CONTROL_VLVREQUEST, CONST_PERSISTENT | CONST_CS);
+       REGISTER_STRING_CONSTANT("LDAP_CONTROL_VLVRESPONSE", LDAP_CONTROL_VLVRESPONSE, CONST_PERSISTENT | CONST_CS);
+#endif
+
        le_link = zend_register_list_destructors_ex(_close_ldap_link, NULL, "ldap link", module_number);
        le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number);
        le_result_entry = zend_register_list_destructors_ex(_free_ldap_result_entry, NULL, "ldap result entry", module_number);
diff --git a/ext/ldap/tests/ldap_get_option_controls.phpt b/ext/ldap/tests/ldap_get_option_controls.phpt
new file mode 100644 (file)
index 0000000..2ec87eb
--- /dev/null
@@ -0,0 +1,68 @@
+--TEST--
+ldap_get_option() and ldap_set_option() tests related to ldap controls
+--CREDITS--
+Côme Chilliet <mcmic@php.net>
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifbindfailure.inc');
+?>
+--FILE--
+<?php
+include "connect.inc";
+
+$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
+insert_dummy_data($link, $base);
+
+function build_ctrl_paged_value($int, $cookie)
+{
+       // This is basic and will only work for small values
+       $hex = '';
+       if (!empty($int)) {
+               $str = sprintf("%'.02x", $int);
+               $hex .= '02'.sprintf("%'.02x%s", strlen($str)/2, $str);
+       }
+       $hex .= '04'.sprintf("%'.02x", strlen($cookie)).bin2hex($cookie);
+       return hex2bin('30'.sprintf("%'.02x", strlen($hex)/2).$hex);
+}
+
+$controls_set = array(
+       array(
+               'oid' => LDAP_CONTROL_PAGEDRESULTS,
+               'iscritical' => TRUE,
+               'value' => build_ctrl_paged_value(1, '')
+       )
+);
+var_dump(
+       bin2hex($controls_set[0]['value']),
+       ldap_get_option($link, LDAP_OPT_SERVER_CONTROLS, $controls_get),
+       ldap_set_option($link, LDAP_OPT_SERVER_CONTROLS, $controls_set),
+       ldap_get_option($link, LDAP_OPT_SERVER_CONTROLS, $controls_get),
+       count($controls_get),
+       $controls_get[0]['oid'],
+       $controls_get[0]['iscritical'],
+       bin2hex($controls_get[0]['value']),
+       $result = ldap_search($link, $base, "(objectClass=person)", array('cn')),
+       ldap_get_entries($link, $result)['count']
+);
+?>
+===DONE===
+--CLEAN--
+<?php
+include "connect.inc";
+
+$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
+remove_dummy_data($link, $base);
+?>
+--EXPECTF--
+string(14) "30050201010400"
+bool(false)
+bool(true)
+bool(true)
+int(1)
+string(22) "1.2.840.113556.1.4.319"
+bool(true)
+string(14) "30050201010400"
+resource(%d) of type (ldap result)
+int(1)
+===DONE===
index f83c505571ed53e5d3f39714af429a620fc8f57b..759936ec629b6b2dfc599b0ce94222116826a3e2 100644 (file)
@@ -64,8 +64,42 @@ bool(true)
 int(0)
 bool(true)
 int(0)
-bool(false)
-int(0)
-bool(false)
-int(0)
+bool(true)
+array(2) {
+  [0]=>
+  array(2) {
+    ["oid"]=>
+    string(15) "1.2.752.58.10.1"
+    ["iscritical"]=>
+    bool(true)
+  }
+  [1]=>
+  array(3) {
+    ["oid"]=>
+    string(15) "1.2.752.58.1.10"
+    ["iscritical"]=>
+    bool(false)
+    ["value"]=>
+    string(5) "magic"
+  }
+}
+bool(true)
+array(2) {
+  [0]=>
+  array(2) {
+    ["oid"]=>
+    string(15) "1.2.752.58.10.1"
+    ["iscritical"]=>
+    bool(true)
+  }
+  [1]=>
+  array(3) {
+    ["oid"]=>
+    string(15) "1.2.752.58.1.10"
+    ["iscritical"]=>
+    bool(false)
+    ["value"]=>
+    string(5) "magic"
+  }
+}
 ===DONE===
index 6e082beb0c7d74a7b1b8c7b5a9f2c321a2504d43..bb8a3f1051899e58788cd43f5d5c1fb9f99e9a71 100644 (file)
@@ -76,9 +76,43 @@ bool(true)
 bool(true)
 bool(false)
 bool(true)
-int(0)
+array(2) {
+  [0]=>
+  array(2) {
+    ["oid"]=>
+    string(15) "1.2.752.58.10.1"
+    ["iscritical"]=>
+    bool(true)
+  }
+  [1]=>
+  array(3) {
+    ["oid"]=>
+    string(15) "1.2.752.58.1.10"
+    ["iscritical"]=>
+    bool(false)
+    ["value"]=>
+    string(5) "magic"
+  }
+}
 bool(true)
-int(0)
+array(2) {
+  [0]=>
+  array(2) {
+    ["oid"]=>
+    string(15) "1.2.752.58.10.1"
+    ["iscritical"]=>
+    bool(true)
+  }
+  [1]=>
+  array(3) {
+    ["oid"]=>
+    string(15) "1.2.752.58.1.10"
+    ["iscritical"]=>
+    bool(false)
+    ["value"]=>
+    string(5) "magic"
+  }
+}
 bool(true)
 string(14) "dc=test,dc=com"
 ===DONE===