Skip to content

Commit 274d841

Browse files
author
Côme Chilliet
committed
Added constants for known ldap controls OID and tests for ldap_get/set_option for controls
Also fixed existing tests which were expecting ldap_get_option to fail on controls
1 parent 3a09c12 commit 274d841

File tree

4 files changed

+212
-6
lines changed

4 files changed

+212
-6
lines changed

ext/ldap/ldap.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,76 @@ PHP_MINIT_FUNCTION(ldap)
291291
REGISTER_STRING_CONSTANT("LDAP_EXOP_TURN", LDAP_EXOP_TURN, CONST_PERSISTENT | CONST_CS);
292292
#endif
293293

294+
/* LDAP Controls */
295+
/* standard track controls */
296+
#ifdef LDAP_CONTROL_MANAGEDSAIT
297+
/* RFC 3296 */
298+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_MANAGEDSAIT", LDAP_CONTROL_MANAGEDSAIT, CONST_PERSISTENT | CONST_CS);
299+
#endif
300+
#ifdef LDAP_CONTROL_PROXY_AUTHZ
301+
/* RFC 4370 */
302+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_PROXY_AUTHZ", LDAP_CONTROL_PROXY_AUTHZ, CONST_PERSISTENT | CONST_CS);
303+
#endif
304+
#ifdef LDAP_CONTROL_SUBENTRIES
305+
/* RFC 3672 */
306+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_SUBENTRIES", LDAP_CONTROL_SUBENTRIES, CONST_PERSISTENT | CONST_CS);
307+
#endif
308+
#ifdef LDAP_CONTROL_VALUESRETURNFILTER
309+
/* RFC 3876 */
310+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_VALUESRETURNFILTER", LDAP_CONTROL_VALUESRETURNFILTER, CONST_PERSISTENT | CONST_CS);
311+
#endif
312+
#ifdef LDAP_CONTROL_ASSERT
313+
/* RFC 4528 */
314+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_ASSERT", LDAP_CONTROL_ASSERT, CONST_PERSISTENT | CONST_CS);
315+
/* RFC 4527 */
316+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_PRE_READ", LDAP_CONTROL_PRE_READ, CONST_PERSISTENT | CONST_CS);
317+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_POST_READ", LDAP_CONTROL_POST_READ, CONST_PERSISTENT | CONST_CS);
318+
#endif
319+
#ifdef LDAP_CONTROL_SORTREQUEST
320+
/* RFC 2891 */
321+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_SORTREQUEST", LDAP_CONTROL_SORTREQUEST, CONST_PERSISTENT | CONST_CS);
322+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_SORTRESPONSE", LDAP_CONTROL_SORTRESPONSE, CONST_PERSISTENT | CONST_CS);
323+
#endif
324+
/* non-standard track controls */
325+
#ifdef LDAP_CONTROL_PAGEDRESULTS
326+
/* RFC 2696 */
327+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_PAGEDRESULTS", LDAP_CONTROL_PAGEDRESULTS, CONST_PERSISTENT | CONST_CS);
328+
#endif
329+
#ifdef LDAP_CONTROL_AUTHZID_REQUEST
330+
/* RFC 3829 */
331+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_AUTHZID_REQUEST", LDAP_CONTROL_AUTHZID_REQUEST, CONST_PERSISTENT | CONST_CS);
332+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_AUTHZID_RESPONSE", LDAP_CONTROL_AUTHZID_RESPONSE, CONST_PERSISTENT | CONST_CS);
333+
#endif
334+
#ifdef LDAP_CONTROL_SYNC
335+
/* LDAP Content Synchronization Operation -- RFC 4533 */
336+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_SYNC", LDAP_CONTROL_SYNC, CONST_PERSISTENT | CONST_CS);
337+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_SYNC_STATE", LDAP_CONTROL_SYNC_STATE, CONST_PERSISTENT | CONST_CS);
338+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_SYNC_DONE", LDAP_CONTROL_SYNC_DONE, CONST_PERSISTENT | CONST_CS);
339+
#endif
340+
#ifdef LDAP_CONTROL_DONTUSECOPY
341+
/* LDAP Don't Use Copy Control (RFC 6171) */
342+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_DONTUSECOPY", LDAP_CONTROL_DONTUSECOPY, CONST_PERSISTENT | CONST_CS);
343+
#endif
344+
#ifdef LDAP_CONTROL_PASSWORDPOLICYREQUEST
345+
/* Password policy Controls */
346+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_PASSWORDPOLICYREQUEST", LDAP_CONTROL_PASSWORDPOLICYREQUEST, CONST_PERSISTENT | CONST_CS);
347+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_PASSWORDPOLICYRESPONSE", LDAP_CONTROL_PASSWORDPOLICYRESPONSE, CONST_PERSISTENT | CONST_CS);
348+
#endif
349+
#ifdef LDAP_CONTROL_X_INCREMENTAL_VALUES
350+
/* MS Active Directory controls */
351+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_INCREMENTAL_VALUES", LDAP_CONTROL_X_INCREMENTAL_VALUES, CONST_PERSISTENT | CONST_CS);
352+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_DOMAIN_SCOPE", LDAP_CONTROL_X_DOMAIN_SCOPE, CONST_PERSISTENT | CONST_CS);
353+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_PERMISSIVE_MODIFY", LDAP_CONTROL_X_PERMISSIVE_MODIFY, CONST_PERSISTENT | CONST_CS);
354+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_SEARCH_OPTIONS", LDAP_CONTROL_X_SEARCH_OPTIONS, CONST_PERSISTENT | CONST_CS);
355+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_TREE_DELETE", LDAP_CONTROL_X_TREE_DELETE, CONST_PERSISTENT | CONST_CS);
356+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_X_EXTENDED_DN", LDAP_CONTROL_X_EXTENDED_DN, CONST_PERSISTENT | CONST_CS);
357+
#endif
358+
#ifdef LDAP_CONTROL_X_INCREMENTAL_VALUES
359+
/* LDAP VLV */
360+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_VLVREQUEST", LDAP_CONTROL_VLVREQUEST, CONST_PERSISTENT | CONST_CS);
361+
REGISTER_STRING_CONSTANT("LDAP_CONTROL_VLVRESPONSE", LDAP_CONTROL_VLVRESPONSE, CONST_PERSISTENT | CONST_CS);
362+
#endif
363+
294364
le_link = zend_register_list_destructors_ex(_close_ldap_link, NULL, "ldap link", module_number);
295365
le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number);
296366
le_result_entry = zend_register_list_destructors_ex(_free_ldap_result_entry, NULL, "ldap result entry", module_number);
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
--TEST--
2+
ldap_get_option() and ldap_set_option() tests related to ldap controls
3+
--CREDITS--
4+
Côme Chilliet <mcmic@php.net>
5+
--SKIPIF--
6+
<?php
7+
require_once('skipif.inc');
8+
require_once('skipifbindfailure.inc');
9+
?>
10+
--FILE--
11+
<?php
12+
include "connect.inc";
13+
14+
$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
15+
insert_dummy_data($link, $base);
16+
17+
function build_ctrl_paged_value($int, $cookie)
18+
{
19+
// This is basic and will only work for small values
20+
$hex = '';
21+
if (!empty($int)) {
22+
$str = sprintf("%'.02x", $int);
23+
$hex .= '02'.sprintf("%'.02x%s", strlen($str)/2, $str);
24+
}
25+
$hex .= '04'.sprintf("%'.02x", strlen($cookie)).bin2hex($cookie);
26+
return hex2bin('30'.sprintf("%'.02x", strlen($hex)/2).$hex);
27+
}
28+
29+
$controls_set = array(
30+
array(
31+
'oid' => LDAP_CONTROL_PAGEDRESULTS,
32+
'iscritical' => TRUE,
33+
'value' => build_ctrl_paged_value(1, '')
34+
)
35+
);
36+
var_dump(
37+
bin2hex($controls_set[0]['value']),
38+
ldap_get_option($link, LDAP_OPT_SERVER_CONTROLS, $controls_get),
39+
ldap_set_option($link, LDAP_OPT_SERVER_CONTROLS, $controls_set),
40+
ldap_get_option($link, LDAP_OPT_SERVER_CONTROLS, $controls_get),
41+
count($controls_get),
42+
$controls_get[0]['oid'],
43+
$controls_get[0]['iscritical'],
44+
bin2hex($controls_get[0]['value']),
45+
$result = ldap_search($link, $base, "(objectClass=person)", array('cn')),
46+
ldap_get_entries($link, $result)['count']
47+
);
48+
?>
49+
===DONE===
50+
--CLEAN--
51+
<?php
52+
include "connect.inc";
53+
54+
$link = ldap_connect_and_bind($host, $port, $user, $passwd, $protocol_version);
55+
remove_dummy_data($link, $base);
56+
?>
57+
--EXPECTF--
58+
string(14) "30050201010400"
59+
bool(false)
60+
bool(true)
61+
bool(true)
62+
int(1)
63+
string(22) "1.2.840.113556.1.4.319"
64+
bool(true)
65+
string(14) "30050201010400"
66+
resource(%d) of type (ldap result)
67+
int(1)
68+
===DONE===

ext/ldap/tests/ldap_get_option_variation.phpt

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,42 @@ bool(true)
6464
int(0)
6565
bool(true)
6666
int(0)
67-
bool(false)
68-
int(0)
69-
bool(false)
70-
int(0)
67+
bool(true)
68+
array(2) {
69+
[0]=>
70+
array(2) {
71+
["oid"]=>
72+
string(15) "1.2.752.58.10.1"
73+
["iscritical"]=>
74+
bool(true)
75+
}
76+
[1]=>
77+
array(3) {
78+
["oid"]=>
79+
string(15) "1.2.752.58.1.10"
80+
["iscritical"]=>
81+
bool(false)
82+
["value"]=>
83+
string(5) "magic"
84+
}
85+
}
86+
bool(true)
87+
array(2) {
88+
[0]=>
89+
array(2) {
90+
["oid"]=>
91+
string(15) "1.2.752.58.10.1"
92+
["iscritical"]=>
93+
bool(true)
94+
}
95+
[1]=>
96+
array(3) {
97+
["oid"]=>
98+
string(15) "1.2.752.58.1.10"
99+
["iscritical"]=>
100+
bool(false)
101+
["value"]=>
102+
string(5) "magic"
103+
}
104+
}
71105
===DONE===

ext/ldap/tests/ldap_set_option_variation.phpt

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,43 @@ bool(true)
7676
bool(true)
7777
bool(false)
7878
bool(true)
79-
int(0)
79+
array(2) {
80+
[0]=>
81+
array(2) {
82+
["oid"]=>
83+
string(15) "1.2.752.58.10.1"
84+
["iscritical"]=>
85+
bool(true)
86+
}
87+
[1]=>
88+
array(3) {
89+
["oid"]=>
90+
string(15) "1.2.752.58.1.10"
91+
["iscritical"]=>
92+
bool(false)
93+
["value"]=>
94+
string(5) "magic"
95+
}
96+
}
8097
bool(true)
81-
int(0)
98+
array(2) {
99+
[0]=>
100+
array(2) {
101+
["oid"]=>
102+
string(15) "1.2.752.58.10.1"
103+
["iscritical"]=>
104+
bool(true)
105+
}
106+
[1]=>
107+
array(3) {
108+
["oid"]=>
109+
string(15) "1.2.752.58.1.10"
110+
["iscritical"]=>
111+
bool(false)
112+
["value"]=>
113+
string(5) "magic"
114+
}
115+
}
82116
bool(true)
83117
string(14) "dc=test,dc=com"
84118
===DONE===

0 commit comments

Comments
 (0)