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);
 | 
						|
  }
 | 
						|
}
 |