Skip to content
Draft
375 changes: 324 additions & 51 deletions ext/ldap/ldap.c

Large diffs are not rendered by default.

25 changes: 24 additions & 1 deletion ext/ldap/ldap.stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -829,20 +829,43 @@ function ldap_parse_exop(LDAP\Connection $ldap, LDAP\Result $result, &$response_
}

namespace LDAP {
/** @strict-properties */
final class LdapException extends \Exception
{
}

/**
* @strict-properties
* @not-serializable
*/
final class Connection
{
public function __construct(?string $uri = null);
public function bind(
?string $dn = null,
#[\SensitiveParameter] ?string $password = null,
?array $controls = null,
): Result;
public function unbind(): bool;
public function add(string $dn, array $entry, ?array $controls = null): Result;
public function mod_add(string $dn, array $entry, ?array $controls = null): Result;
public function mod_del(string $dn, array $entry, ?array $controls = null): Result;
public function mod_replace(string $dn, array $entry, ?array $controls = null): Result;
public function delete(string $dn, ?array $controls = null): Result;
public function rename(string $dn, string $new_rdn, string $new_parent, bool $delete_old_rdn, ?array $controls = null): Result;
}

/**
* @strict-properties
* @not-serializable
*/
final class Result
final class Result implements \Iterator
{
public function current(): ResultEntry;
public function key(): string;
public function next(): void;
public function rewind(): void;
public function valid(): bool;
}

/**
Expand Down
109 changes: 105 additions & 4 deletions ext/ldap/ldap_arginfo.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions ext/ldap/tests/ldap_add_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@ require "connect.inc";

$link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);

function dumpResult(LDAP\Connection $link, LDAP\Result $result): void {
var_dump(
$result,
ldap_parse_result($link, $result, $errcode, $matcheddn, $errmsg, $referrals, $ctrls),
$errmsg,
$errcode,
);
}

// Invalid DN
var_dump(
ldap_add(
Expand All @@ -24,6 +33,15 @@ var_dump(
ldap_errno($link)
);

// Invalid DN
dumpResult(
$link,
$link->add(
"weirdAttribute=val",
["weirdAttribute" => "val"],
),
);

// Duplicate entry
for ($i = 0; $i < 2; $i++) {
var_dump(
Expand Down Expand Up @@ -77,6 +95,11 @@ Warning: ldap_add(): Add: Invalid DN syntax in %s on line %d
bool(false)
string(17) "Invalid DN syntax"
int(34)
object(LDAP\Result)#%d (0) {
}
bool(true)
string(10) "invalid DN"
int(34)
bool(true)

Warning: ldap_add(): Add: Already exists in %s on line %d
Expand Down
87 changes: 75 additions & 12 deletions ext/ldap/tests/ldap_add_ext.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,35 @@ require "connect.inc";

$link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);

var_dump(
$result = ldap_add_ext($link, "o=test_ldap_add_ext,$base", array(
$parameters = [
"o=test_ldap_add_ext,$base", array(
"objectClass" => array(
"top",
"organization"),
"o" => "test_ldap_add_ext",
), [['oid' => LDAP_CONTROL_POST_READ, 'iscritical' => TRUE, 'value' => ['attrs' => ['o']]]]),
ldap_parse_result($link, $result, $errcode, $matcheddn, $errmsg, $referrals, $ctrls),
$errcode,
$errmsg,
$ctrls[LDAP_CONTROL_POST_READ],
ldap_get_entries(
$link,
ldap_search($link, "$base", "(o=test_ldap_add_ext)")
)
);
), [['oid' => LDAP_CONTROL_POST_READ, 'iscritical' => TRUE, 'value' => ['attrs' => ['o']]]]
];

function dumpResult(LDAP\Connection $link, LDAP\Result $result): void {
global $base;
var_dump(
$result,
ldap_parse_result($link, $result, $errcode, $matcheddn, $errmsg, $referrals, $ctrls),
$errcode,
$errmsg,
$ctrls[LDAP_CONTROL_POST_READ],
ldap_get_entries(
$link,
ldap_search($link, "$base", "(o=test_ldap_add_ext)")
)
);
}

$result = ldap_add_ext($link, ...$parameters);
dumpResult($link, $result);
ldap_delete($link, "o=test_ldap_add_ext,$base");
$result = $link->add(...$parameters);
dumpResult($link, $result);
?>
--CLEAN--
<?php
Expand Down Expand Up @@ -92,3 +105,53 @@ array(2) {
string(%d) "o=test_ldap_add_ext,%s"
}
}
object(LDAP\Result)#%d (0) {
}
bool(true)
int(0)
string(0) ""
array(2) {
["oid"]=>
string(14) "1.3.6.1.1.13.2"
["value"]=>
array(2) {
["dn"]=>
string(%d) "o=test_ldap_add_ext,%s"
["o"]=>
array(1) {
[0]=>
string(17) "test_ldap_add_ext"
}
}
}
array(2) {
["count"]=>
int(1)
[0]=>
array(6) {
["objectclass"]=>
array(3) {
["count"]=>
int(2)
[0]=>
string(3) "top"
[1]=>
string(12) "organization"
}
[0]=>
string(11) "objectclass"
["o"]=>
array(2) {
["count"]=>
int(1)
[0]=>
string(17) "test_ldap_add_ext"
}
[1]=>
string(1) "o"
["count"]=>
int(2)
["dn"]=>
string(%d) "o=test_ldap_add_ext,%s"
}
}
28 changes: 28 additions & 0 deletions ext/ldap/tests/ldap_bind_ext.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,20 @@ var_dump(
$ctrls
);

// Same thing using Connection::bind
var_dump(
$result = $link->bind($user, $passwd),
ldap_parse_result($link, $result, $errcode, $matcheddn, $errmsg, $referrals, $ctrls),
$errcode,
$errmsg,
$ctrls,
$result = $link->bind($user, $passwd, [['oid' => LDAP_CONTROL_PASSWORDPOLICYREQUEST]]),
ldap_parse_result($link, $result, $errcode, $matcheddn, $errmsg, $referrals, $ctrls),
$errcode,
$errmsg,
$ctrls
);

/* Failures */
var_dump(
$result = ldap_bind_ext($link, $user, "wrongPassword", [['oid' => LDAP_CONTROL_PASSWORDPOLICYREQUEST]]),
Expand Down Expand Up @@ -62,6 +76,20 @@ array(0) {
object(LDAP\Result)#%d (0) {
}
bool(true)
int(0)
string(0) ""
array(0) {
}
object(LDAP\Result)#%d (0) {
}
bool(true)
int(0)
string(0) ""
array(0) {
}
object(LDAP\Result)#%d (0) {
}
bool(true)
int(49)
string(0) ""
array(0) {
Expand Down
Loading
Loading