161 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace nur\ldap;
 | 
						|
 | 
						|
use nur\A;
 | 
						|
use nur\data\types\md_utils;
 | 
						|
use nur\data\types\Metadata;
 | 
						|
 | 
						|
class ldap {
 | 
						|
  #############################################################################
 | 
						|
  const ADD_SCHEMA = [
 | 
						|
    "controls" => ["array", []],
 | 
						|
  ];
 | 
						|
 | 
						|
  /** @var Metadata */
 | 
						|
  private static $add_md;
 | 
						|
  static function add_md(): Metadata {
 | 
						|
    return md_utils::ensure_md(self::$add_md, self::ADD_SCHEMA);
 | 
						|
  }
 | 
						|
 | 
						|
  static function add($conn, string $dn, array $attrs, $params=null): void {
 | 
						|
    self::add_md()->ensureSchema($params);
 | 
						|
    $r = LdapException::check("add", $conn
 | 
						|
      , @ldap_add_ext($conn, $dn, $attrs, $params["controls"]));
 | 
						|
    LdapException::check_result("add", $conn, $r);
 | 
						|
  }
 | 
						|
 | 
						|
  #############################################################################
 | 
						|
  const MODIFY_SCHEMA = [
 | 
						|
    "controls" => ["array", []],
 | 
						|
  ];
 | 
						|
 | 
						|
  /** @var Metadata */
 | 
						|
  private static $modify_md;
 | 
						|
  static function modify_md(): Metadata {
 | 
						|
    return md_utils::ensure_md(self::$modify_md, self::MODIFY_SCHEMA);
 | 
						|
  }
 | 
						|
 | 
						|
  static function prepare_modify(array $modattrs): array {
 | 
						|
    $modifs = [];
 | 
						|
    foreach ($modattrs as $modattr) {
 | 
						|
      $modtype = false;
 | 
						|
      $first = true;
 | 
						|
      $index = 0;
 | 
						|
      foreach ($modattr as $name => $value) {
 | 
						|
        if ($first && $name === $index) {
 | 
						|
          $first = false;
 | 
						|
          $index++;
 | 
						|
          switch ($value) {
 | 
						|
          case "add":
 | 
						|
            $modtype = LDAP_MODIFY_BATCH_ADD;
 | 
						|
            break;
 | 
						|
          case "delete":
 | 
						|
            $modtype = LDAP_MODIFY_BATCH_REMOVE;
 | 
						|
            break;
 | 
						|
          case "replace":
 | 
						|
            $modtype = LDAP_MODIFY_BATCH_REPLACE;
 | 
						|
            break;
 | 
						|
          }
 | 
						|
          continue;
 | 
						|
        }
 | 
						|
        if ($name === $index) {
 | 
						|
          $index++;
 | 
						|
          $modifs[] = [
 | 
						|
            "modtype" => LDAP_MODIFY_BATCH_REMOVE_ALL,
 | 
						|
            "attrib" => $value,
 | 
						|
          ];
 | 
						|
        } else {
 | 
						|
          $modifs[] = [
 | 
						|
            "modtype" => $modtype,
 | 
						|
            "attrib" => $name,
 | 
						|
            "values" => $value
 | 
						|
          ];
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return $modifs;
 | 
						|
  }
 | 
						|
 | 
						|
  static function modify($conn, string $dn, array $modattrs, $params=null): void {
 | 
						|
    self::modify_md()->ensureSchema($params);
 | 
						|
    $modifs = self::prepare_modify($modattrs);
 | 
						|
    LdapException::check("modify", $conn
 | 
						|
      , @ldap_modify_batch($conn, $dn, $modifs, $params["controls"]));
 | 
						|
  }
 | 
						|
 | 
						|
  #############################################################################
 | 
						|
  const RENAME_SCHEMA = [
 | 
						|
    "new_parent" => ["?string", null],
 | 
						|
    "delete_old_rdn" => ["bool", true],
 | 
						|
    "controls" => ["array", []],
 | 
						|
  ];
 | 
						|
 | 
						|
  /** @var Metadata */
 | 
						|
  private static $rename_md;
 | 
						|
  static function rename_md(): Metadata {
 | 
						|
    return md_utils::ensure_md(self::$rename_md, self::RENAME_SCHEMA);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * préparer les paramètres pour le renommage
 | 
						|
   *
 | 
						|
   * si $newRdn n'est pas vide:
 | 
						|
   * - si $params["new_parent"] n'est pas spécifié ou null, alors on ne fait
 | 
						|
   * qu'un renommage: prendre le suffixe de $dn
 | 
						|
   * - sinon, le nouveau DN est "$newRdn,$params[new_parent]"
 | 
						|
   *
 | 
						|
   * si $newRdn est vide:
 | 
						|
   * - il s'agit d'un déplacement de branche. $params["new_parent"] ne doit pas
 | 
						|
   * être vide et c'est la nouvelle destination. le RDN n'est pas modifié
 | 
						|
   */
 | 
						|
  static function prepare_rename(string $dn, string &$newRdn, &$params = null): bool {
 | 
						|
    self::rename_md()->ensureSchema($params);
 | 
						|
    names::split_dn($dn, $origRdn, $origParent);
 | 
						|
    $newParent = $params["new_parent"];
 | 
						|
    if ($newRdn != "") {
 | 
						|
      # renommage et éventuellement déplacement
 | 
						|
      if (strpos($newRdn, "=") === false) {
 | 
						|
        # si le rdn ne comporte que la valeur, alors prendre le nom de
 | 
						|
        # l'attribut depuis origRdn
 | 
						|
        $name = A::first_key(names::split_rdn($origRdn));
 | 
						|
        $newRdn = names::build_rdn($name, $newRdn);
 | 
						|
      }
 | 
						|
      if ($newParent === null) $newParent = $origParent;
 | 
						|
    } else {
 | 
						|
      # déplacement avec le même RDN
 | 
						|
      $newRdn = $origRdn;
 | 
						|
    }
 | 
						|
    $newDn = names::join($newRdn, $newParent);
 | 
						|
    names::split_dn($newDn, $newRdn, $newParent);
 | 
						|
    $params["new_parent"] = $newParent;
 | 
						|
    return $newDn !== $dn;
 | 
						|
  }
 | 
						|
 | 
						|
  static function rename($conn, string $dn, string $newRdn, array $params): string {
 | 
						|
    $newParent = $params["new_parent"];
 | 
						|
    $r = LdapException::check("rename", $conn
 | 
						|
      , @ldap_rename_ext($conn, $dn, $newRdn, $newParent
 | 
						|
        , $params["delete_old_rdn"], $params["controls"]));
 | 
						|
    LdapException::check_result("rename", $conn, $r);
 | 
						|
    return names::join($newRdn, $newParent);
 | 
						|
  }
 | 
						|
 | 
						|
  #############################################################################
 | 
						|
  const DELETE_SCHEMA = [
 | 
						|
    "controls" => ["array", []],
 | 
						|
  ];
 | 
						|
 | 
						|
  /** @var Metadata */
 | 
						|
  private static $delete_md;
 | 
						|
  static function delete_md(): Metadata {
 | 
						|
    return md_utils::ensure_md(self::$delete_md, self::DELETE_SCHEMA);
 | 
						|
  }
 | 
						|
 | 
						|
  static function delete($conn, string $dn, $params=null): void {
 | 
						|
    self::delete_md()->ensureSchema($params);
 | 
						|
    $r = LdapException::check("delete", $conn
 | 
						|
      , @ldap_delete_ext($conn, $dn, $params["controls"]));
 | 
						|
    LdapException::check_result("delete", $conn, $r);
 | 
						|
  }
 | 
						|
}
 |