nur-sery/nur_src/ldap/names.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);
}
}