92 lines
2.5 KiB
PHP
92 lines
2.5 KiB
PHP
|
<?php
|
||
|
namespace nur\ldap;
|
||
|
|
||
|
use nur\A;
|
||
|
use nur\b\ValueException;
|
||
|
|
||
|
class names {
|
||
|
static function split_dn(string $dn, ?string &$rdn, ?string &$parent_dn): bool {
|
||
|
$dparts = ldap_explode_dn($dn, 0);
|
||
|
$count = $dparts["count"];
|
||
|
if ($count > 0) {
|
||
|
$rdn = $dparts[0];
|
||
|
$sparts = [];
|
||
|
for ($i = 1; $i < $count; $i++) {
|
||
|
$sparts[] = $dparts[$i];
|
||
|
}
|
||
|
$parent_dn = implode(",", $sparts);
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
static function ldap_unescape($string) {
|
||
|
$hex2bin = function ($ms) {
|
||
|
$m = array_shift($ms);
|
||
|
return hex2bin(substr($m, 1));
|
||
|
};
|
||
|
return preg_replace_callback('/\\\\[0-9a-fA-F]{2}/', $hex2bin, $string);
|
||
|
}
|
||
|
|
||
|
static function split_rdn(string $rdn): array {
|
||
|
$attrs = [];
|
||
|
$rparts = explode("+", $rdn);
|
||
|
foreach ($rparts as $rpart) {
|
||
|
if (strpos($rpart, "=") === false) {
|
||
|
throw ValueException::invalid_value($rdn, "rdn");
|
||
|
}
|
||
|
[$name, $value] = explode("=", $rpart, 2);
|
||
|
$name = self::ldap_unescape($name);
|
||
|
$value = self::ldap_unescape($value);
|
||
|
$attrs[$name][] = $value;
|
||
|
}
|
||
|
return $attrs;
|
||
|
}
|
||
|
|
||
|
static function build_rdn(string $name, string $value): string {
|
||
|
$name = ldap_escape($name, 0, LDAP_ESCAPE_DN);
|
||
|
$value = ldap_escape($value, 0, LDAP_ESCAPE_DN);
|
||
|
return "$name=$value";
|
||
|
}
|
||
|
|
||
|
static function get_dn_names(?string $dn, ?array $lkeys2names=null): ?array {
|
||
|
$dn_names = null;
|
||
|
if ($dn !== null) {
|
||
|
$dn_names = [];
|
||
|
if (self::split_dn($dn, $rdn, $parent_dn)) {
|
||
|
foreach (array_keys(self::split_rdn($rdn)) as $name) {
|
||
|
$dn_names[] = A::get($lkeys2names, strtolower($name), $name);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $dn_names;
|
||
|
}
|
||
|
|
||
|
static function join($rdn, string $parent_dn): string {
|
||
|
if (is_array($rdn)) {
|
||
|
$rparts = [];
|
||
|
foreach ($rdn as $name => $values) {
|
||
|
$name = ldap_escape($name, 0, LDAP_ESCAPE_DN);
|
||
|
foreach (A::with($values) as $value) {
|
||
|
$value = ldap_escape($value, 0, LDAP_ESCAPE_DN);
|
||
|
$rparts[] = "$name=$value";
|
||
|
}
|
||
|
}
|
||
|
$rdn = implode("+", $rparts);
|
||
|
}
|
||
|
$dparts = [];
|
||
|
if ($rdn) $dparts[] = $rdn;
|
||
|
if ($parent_dn) $dparts[] = $parent_dn;
|
||
|
return implode(",", $dparts);
|
||
|
}
|
||
|
|
||
|
|
||
|
/** tester si $dn a le suffixe $suffix */
|
||
|
static function have_suffix(string $dn, string $suffix): bool {
|
||
|
$dparts = ldap_explode_dn($dn, 0);
|
||
|
$sparts = ldap_explode_dn($suffix, 0);
|
||
|
$count = $sparts["count"];
|
||
|
return array_slice($dparts, -$count) === array_slice($sparts, -$count);
|
||
|
}
|
||
|
}
|