160 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\ldap;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\b\coll\BaseArray;
 | |
| use nur\b\ValueException;
 | |
| use nur\data\types\Metadata;
 | |
| use nur\ldap\syntaxes\AbstractSyntax;
 | |
| use nur\ldap\syntaxes\cvalues;
 | |
| 
 | |
| /**
 | |
|  * Class CompositeValue: une valeur composite
 | |
|  */
 | |
| abstract class CompositeValue extends BaseArray {
 | |
|   /** @var array schéma des champs de la valeur composite */
 | |
|   const SCHEMA = null;
 | |
| 
 | |
|   /** @var array syntaxes associées aux champs */
 | |
|   const SYNTAXES = null;
 | |
|   
 | |
|   /** @var array liste et ordre des éléments obligatoires */
 | |
|   const MANDATORY_KEYS = null;
 | |
|   
 | |
|   /** @var array liste et ordre des éléments facultatifs connus */
 | |
|   const OPTIONAL_KEYS = null;
 | |
| 
 | |
|   /** @var array liste des clés qui identifient cet objet */
 | |
|   const KEY_KEYS = null;
 | |
| 
 | |
|   static function compute_keys(array $values): string {
 | |
|     $keys = static::KEY_KEYS;
 | |
|     if ($keys === null) $keys = static::MANDATORY_KEYS;
 | |
|     if ($keys === null) $keys = array_keys($values);
 | |
|     $parts = [];
 | |
|     foreach ($keys as $key) {
 | |
|       $parts[] = A::get($values, $key);
 | |
|     }
 | |
|     return implode("-", $parts);
 | |
|   }
 | |
| 
 | |
|   protected $ldapKeys, $keys, $optionalKeys;
 | |
| 
 | |
|   protected $syntaxes;
 | |
| 
 | |
|   /** initialiser l'objet */
 | |
|   function setup(LdapConn $conn): self {
 | |
|     $ldapKeys = [];
 | |
|     $keys = [];
 | |
|     $mandatoryKeys = ValueException::check_nn(static::MANDATORY_KEYS
 | |
|       , "Vous devez définir MANDATORY_KEYS");
 | |
|     $index = 0;
 | |
|     foreach ($mandatoryKeys as $key => $ldapKey) {
 | |
|       if ($key === $index) {
 | |
|         $index++;
 | |
|         $key = $ldapKey;
 | |
|       }
 | |
|       $ldapKeys[$key] = $ldapKey;
 | |
|       $keys[$ldapKey] = $key;
 | |
|     }
 | |
|     $optionalKeys = [];
 | |
|     $index = 0;
 | |
|     foreach (A::with(static::OPTIONAL_KEYS) as $key => $ldapKey) {
 | |
|       if ($key === $index) {
 | |
|         $index++;
 | |
|         $key = $ldapKey;
 | |
|       }
 | |
|       $ldapKeys[$key] = $ldapKey;
 | |
|       $keys[$ldapKey] = $key;
 | |
|       $optionalKeys[] = $key;
 | |
|     }
 | |
|     $schemaKeys = A::keys(static::SCHEMA);
 | |
|     foreach ($schemaKeys as $key) {
 | |
|       if (!in_array($key, $keys)) {
 | |
|         $ldapKeys[$key] = $key;
 | |
|         $keys[$key] = $key;
 | |
|         $optionalKeys[] = $key;
 | |
|       }
 | |
|     }
 | |
|     $this->ldapKeys = $ldapKeys;
 | |
|     $this->keys = $keys;
 | |
|     $this->optionalKeys = $optionalKeys;
 | |
|     ##
 | |
|     $syntaxClasses = static::SYNTAXES;
 | |
|     if ($syntaxClasses !== null) {
 | |
|       $syntaxes = [];
 | |
|       foreach ($schemaKeys as $key) {
 | |
|         $class = A::get($syntaxClasses, $key);
 | |
|         if ($class !== null) {
 | |
|           $syntaxes[$key] = $conn->getSyntax($class);
 | |
|         }
 | |
|       }
 | |
|       $this->syntaxes = $syntaxes;
 | |
|     }
 | |
|     ##
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   function has($key): bool { return $this->_has($key); }
 | |
|   function &get($key, $default=null) { return $this->_get($key, $default); }
 | |
|   function set($key, $value): self { return $this->_set($key, $value); }
 | |
|   function add($value): self { return $this->_set(null, $value); }
 | |
|   function del($key): self { return $this->_del($key); }
 | |
| 
 | |
|   /** obtenir la clé qui identifie cet objet */
 | |
|   function getKey(): string {
 | |
|     return self::compute_keys($this->data);
 | |
|   }
 | |
| 
 | |
|   /** initialiser cet objet avec une valeur LDAP */
 | |
|   function parseLdap(string $value): self {
 | |
|     if (!preg_match_all('/\[.*?]/', $value, $ms)) {
 | |
|       throw ValueException::invalid_value($value, "composite value");
 | |
|     }
 | |
|     $this->data = [];
 | |
|     foreach ($ms[0] as $nameValue) {
 | |
|       if (preg_match('/\[(.*?)=(.*)]/', $nameValue, $ms)) {
 | |
|         $ldapKey = names::ldap_unescape($ms[1]);
 | |
|         $key = A::get($this->keys, $ldapKey, $ldapKey);
 | |
|         $value = names::ldap_unescape($ms[2]);
 | |
|         /** @var AbstractSyntax $syntax */
 | |
|         $syntax = A::get($this->syntaxes, $key);
 | |
|         if ($syntax !== null) $value = $syntax->ldap2php($value);
 | |
|         $this->data[$key] = $value;
 | |
|       }
 | |
|     }
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   /** retourner cette valeur au format LDAP */
 | |
|   function formatLdap(): string {
 | |
|     $optionalKeys = $this->optionalKeys;
 | |
|     $parts = [];
 | |
|     foreach ($this->ldapKeys as $key => $ldapKey) {
 | |
|       $value = A::get($this->data, $key);
 | |
|       if ($value === null && in_array($key, $optionalKeys)) continue;
 | |
|       /** @var AbstractSyntax $syntax */
 | |
|       $syntax = A::get($this->syntaxes, $key);
 | |
|       if ($syntax !== null) $value = $syntax->php2ldap($value);
 | |
|       $ldapKey = ldap_escape($ldapKey, 0, LDAP_ESCAPE_FILTER);
 | |
|       $value = ldap_escape($value, 0, LDAP_ESCAPE_FILTER);
 | |
|       $parts[] = "[$ldapKey=$value]";
 | |
|     }
 | |
|     return implode("", $parts);
 | |
|   }
 | |
| 
 | |
|   function reset(?array $values): CompositeValue {
 | |
|     $md = Metadata::with(static::SCHEMA);
 | |
|     $md->ensureSchema($values);
 | |
|     $this->data = $values;
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   #############################################################################
 | |
|   static function _AUTOGEN_PROPERTIES(): array {
 | |
|     return cvalues::autogen_properties(static::SCHEMA);
 | |
|   }
 | |
|   ## rajouter ceci dans les classes dérivées
 | |
|   #const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
 | |
| }
 |