Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
251 changes: 206 additions & 45 deletions ext/ldap/ldap.c

Large diffs are not rendered by default.

17 changes: 17 additions & 0 deletions ext/ldap/ldap.stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -829,12 +829,29 @@ 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;
}

/**
Expand Down
67 changes: 65 additions & 2 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
36 changes: 29 additions & 7 deletions ext/ldap/tests/ldap_constructor.phpt
Original file line number Diff line number Diff line change
@@ -1,15 +1,37 @@
--TEST--
Attempt to instantiate an LDAP\Connection directly
new \LDAP\Connection() - Variation
--EXTENSIONS--
ldap
--FILE--
Comment thread
MCMic marked this conversation as resolved.
<?php
$constructorCalls = [
// no hostname, no port
[],
// URI
["ldap://hostname:389"],
// ldaps URI
["ldaps://hostname:689"],
// URI no port
["ldap://hostname"],
];

try {
new LDAP\Connection();
} catch (Error $ex) {
echo $ex::class, ': ', $ex->getMessage(), "\n";
foreach ($constructorCalls as $parameters) {
$link = new \LDAP\Connection(...$parameters);
var_dump($link);
ldap_get_option($link, LDAP_OPT_HOST_NAME, $hostname);
var_dump($hostname);
}
?>
--EXPECT--
Error: Cannot directly construct LDAP\Connection, use ldap_connect() instead
--EXPECTF--
object(LDAP\Connection)#%d (0) {
}
string(%d) "%s:%d"
object(LDAP\Connection)#%d (0) {
}
string(12) "hostname:389"
object(LDAP\Connection)#%d (0) {
}
string(12) "hostname:689"
object(LDAP\Connection)#%d (0) {
}
string(12) "hostname:389"
5 changes: 5 additions & 0 deletions ext/ldap/tests/ldap_unbind_basic.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ require "connect.inc";
$link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);

var_dump(ldap_unbind($link));

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

var_dump($link->unbind());
?>
--EXPECT--
bool(true)
bool(true)
Loading