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"]];
|
||
|
}
|