Skip to content

Commit 73d5097

Browse files
committed
Merge branch 'master' of git.php.net:php-src
* 'master' of git.php.net:php-src: Added constants for known ldap controls OID and tests for ldap_get/set_option for controls Added support for controls to ldap_get_option
2 parents acffb7a + 274d841 commit 73d5097

File tree

4 files changed

+243
-7
lines changed

4 files changed

+243
-7
lines changed

ext/ldap/ldap.c

Lines changed: 101 additions & 1 deletion
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);
@@ -2129,6 +2199,8 @@ PHP_FUNCTION(ldap_sort)
21292199
PHP_FUNCTION(ldap_get_option)
21302200
{
21312201
zval *link, *retval;
2202+
zval tmp1;
2203+
int num_entries;
21322204
ldap_linkdata *ld;
21332205
zend_long option;
21342206

@@ -2273,9 +2345,37 @@ PHP_FUNCTION(ldap_get_option)
22732345
ZVAL_STRING(retval, val);
22742346
ldap_memfree(val);
22752347
} break;
2276-
/* options not implemented
22772348
case LDAP_OPT_SERVER_CONTROLS:
22782349
case LDAP_OPT_CLIENT_CONTROLS:
2350+
{
2351+
LDAPControl **ctrls = NULL, **ctrlp;
2352+
2353+
if (ldap_get_option(ld->link, option, &ctrls) || ctrls == NULL) {
2354+
if (ctrls) {
2355+
ldap_memfree(ctrls);
2356+
}
2357+
RETURN_FALSE;
2358+
}
2359+
2360+
zval_ptr_dtor(retval);
2361+
array_init(retval);
2362+
num_entries = 0;
2363+
ctrlp = ctrls;
2364+
while (*ctrlp != NULL)
2365+
{
2366+
array_init(&tmp1);
2367+
add_assoc_string(&tmp1, "oid", (*ctrlp)->ldctl_oid);
2368+
add_assoc_bool(&tmp1, "iscritical", ((*ctrlp)->ldctl_iscritical != 0));
2369+
if ((*ctrlp)->ldctl_value.bv_len) {
2370+
add_assoc_stringl(&tmp1, "value", (*ctrlp)->ldctl_value.bv_val, (*ctrlp)->ldctl_value.bv_len);
2371+
}
2372+
zend_hash_index_update(Z_ARRVAL_P(retval), num_entries, &tmp1);
2373+
num_entries++;
2374+
ctrlp++;
2375+
}
2376+
ldap_controls_free(ctrls);
2377+
} break;
2378+
/* options not implemented
22792379
case LDAP_OPT_API_INFO:
22802380
case LDAP_OPT_API_FEATURE_INFO:
22812381
*/
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)