déplacer ce qui est spécifique à php7.4 dans un autre module
This commit is contained in:
parent
6a44ab7727
commit
2d4801e135
|
@ -3,6 +3,5 @@ defaults:
|
||||||
master:
|
master:
|
||||||
allow_link: true
|
allow_link: true
|
||||||
require:
|
require:
|
||||||
nulib/php: dev-wip
|
|
||||||
branch:
|
branch:
|
||||||
master:
|
master:
|
||||||
|
|
|
@ -10,12 +10,10 @@
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"symfony/yaml": "^5.0",
|
"symfony/yaml": "^5.0",
|
||||||
"php": "^7.4"
|
"php": ">=7.4"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"nulib/tests": "7.4",
|
"nulib/tests": ">=7.4",
|
||||||
"lib/spout": "^3",
|
|
||||||
"phpoffice/phpspreadsheet": "^1.0",
|
|
||||||
"ext-posix": "*",
|
"ext-posix": "*",
|
||||||
"ext-pcntl": "*",
|
"ext-pcntl": "*",
|
||||||
"ext-fileinfo": "*",
|
"ext-fileinfo": "*",
|
||||||
|
@ -29,8 +27,7 @@
|
||||||
"ext-oci8": "*",
|
"ext-oci8": "*",
|
||||||
"ext-pdo": "*",
|
"ext-pdo": "*",
|
||||||
"ext-pgsql": "*",
|
"ext-pgsql": "*",
|
||||||
"ext-sqlite3": "*",
|
"ext-sqlite3": "*"
|
||||||
"ext-ldap": "*"
|
|
||||||
},
|
},
|
||||||
"replace": {
|
"replace": {
|
||||||
"nur/tests": "dev-master",
|
"nur/tests": "dev-master",
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';
|
|
||||||
|
|
||||||
\nur\ldap\app\LdapDeleteApp::run();
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';
|
|
||||||
|
|
||||||
\nur\ldap\app\LdapGetInfosApp::run();
|
|
|
@ -1,5 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';
|
|
||||||
|
|
||||||
\nur\ldap\app\LdapSearchApp::run();
|
|
|
@ -1,62 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\IllegalAccessException;
|
|
||||||
use nur\ldap\syntaxes\CompositeSyntax;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class CompositeAttr: une liste de valeurs composites
|
|
||||||
*/
|
|
||||||
class CompositeAttr extends LdapAttr {
|
|
||||||
function reset(?array &$values): self {
|
|
||||||
if ($values !== null) {
|
|
||||||
/** @var CompositeSyntax $syntax */
|
|
||||||
$syntax = $this->syntax;
|
|
||||||
$tmp = [];
|
|
||||||
foreach ($values as $value) {
|
|
||||||
$cvalue = $syntax->ldap2php($value);
|
|
||||||
$key = $cvalue->getKey();
|
|
||||||
$value = $cvalue->formatLdap();
|
|
||||||
$tmp[$key] = $value;
|
|
||||||
}
|
|
||||||
$values = $tmp;
|
|
||||||
}
|
|
||||||
$this->data =& $values;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function add($value, bool $unique=true, bool $strict=false): self {
|
|
||||||
/** @var CompositeSyntax $syntax */
|
|
||||||
$syntax = $this->syntax;
|
|
||||||
$value = A::first($syntax->ensureArray($value));
|
|
||||||
$cvalue = $syntax->ensureComposite($value);
|
|
||||||
if ($cvalue !== null) {
|
|
||||||
$key = $cvalue->getKey();
|
|
||||||
$value = $cvalue->formatLdap();
|
|
||||||
$this->data[$key] = $value;
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function del($value, int $maxCount=-1, bool $strict=false): self {
|
|
||||||
if ($value !== null && $this->data !== null) {
|
|
||||||
/** @var CompositeSyntax $syntax */
|
|
||||||
$syntax = $this->syntax;
|
|
||||||
$value = A::first($syntax->ensureArray($value));
|
|
||||||
$cvalue = $syntax->ensureComposite($value);
|
|
||||||
if ($cvalue !== null) {
|
|
||||||
$key = $cvalue->getKey();
|
|
||||||
unset($this->data[$key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function ins(int $index, $value): self {
|
|
||||||
throw IllegalAccessException::not_allowed("composite attrs don't use indexes");
|
|
||||||
}
|
|
||||||
function unset(int $index): self {
|
|
||||||
throw IllegalAccessException::not_allowed("composite attrs don't use indexes");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,159 +0,0 @@
|
||||||
<?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"]];
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\b\ICloseable;
|
|
||||||
|
|
||||||
interface ILdapWalker extends ICloseable {
|
|
||||||
function resetSearch(LdapSearch $search): ILdapWalker;
|
|
||||||
|
|
||||||
function next(): bool;
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface IObjectWorkflow: un objet permettant de créer et/ou mettre à jour
|
|
||||||
* un objet LDAP dans le cadre d'une synchronisation
|
|
||||||
*/
|
|
||||||
interface IObjectWorkflow {
|
|
||||||
/** retourner le nom du workflox */
|
|
||||||
function getWorkflowName(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* synchroniser les données spécifiées vers l'objet correspndant, en le créant
|
|
||||||
* si nécessaire.
|
|
||||||
*
|
|
||||||
* $updated=true si l'objet a été créé ou mis à jour, false sinon
|
|
||||||
*/
|
|
||||||
function createOrUpdate(array $data, ?array $params=null, ?bool &$updated=null): ?LdapObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* modifier uniquement le mot de passe de l'objet correspondant
|
|
||||||
*
|
|
||||||
* @return bool true si l'objet correspondant a été trouvé et qu'il a été mis
|
|
||||||
* à jour
|
|
||||||
*/
|
|
||||||
function updatePassword(array $data, string $password): bool;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* supprimer l'objet correspondant. retourner true si l'objet a été supprimé,
|
|
||||||
* false s'il n'existait pas
|
|
||||||
*/
|
|
||||||
function delete(array $data, ?array $params=null): bool;
|
|
||||||
}
|
|
|
@ -1,225 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use ArrayAccess;
|
|
||||||
use Countable;
|
|
||||||
use Iterator;
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\coll\TIterableArray;
|
|
||||||
use nur\ldap\syntaxes\AbstractSyntax;
|
|
||||||
use nur\str;
|
|
||||||
|
|
||||||
class LdapAttr implements ArrayAccess, Countable, Iterator {
|
|
||||||
use TIterableArray;
|
|
||||||
|
|
||||||
const MONOVALUED = 1, BINARY = 2, ORDERED = 4, NOT_HUMAN_READABLE = 8;
|
|
||||||
|
|
||||||
function __construct(string $name, ?array &$values, ?AbstractSyntax $syntax, ?int $flags) {
|
|
||||||
$this->name = $name;
|
|
||||||
$this->syntax = $syntax;
|
|
||||||
$this->flags = $flags;
|
|
||||||
$this->reset($values);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $name;
|
|
||||||
|
|
||||||
function name(): string {
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var ?array */
|
|
||||||
protected $data;
|
|
||||||
|
|
||||||
function reset(?array &$values): self {
|
|
||||||
$this->data =& $values;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var AbstractSyntax */
|
|
||||||
protected $syntax;
|
|
||||||
|
|
||||||
/** @var int */
|
|
||||||
protected $flags;
|
|
||||||
|
|
||||||
function isMonovalued(): bool {
|
|
||||||
return $this->flags !== null && $this->flags & self::MONOVALUED != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isBinary(): bool {
|
|
||||||
return $this->flags !== null && $this->flags & self::BINARY != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isOrdered(): bool {
|
|
||||||
return $this->flags !== null && $this->flags & self::ORDERED != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isNotHumanReadable(): bool {
|
|
||||||
return $this->flags !== null && $this->flags & self::NOT_HUMAN_READABLE != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function fromLdap($value) {
|
|
||||||
$syntax = $this->syntax;
|
|
||||||
if ($syntax !== null) {
|
|
||||||
if ($this->isMonovalued()) $value = $syntax->fromMonovaluedLdap($value);
|
|
||||||
else $value = $syntax->fromMultivaluedLdap($value);
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
protected function fromPhp($value): ?iterable {
|
|
||||||
$syntax = $this->syntax;
|
|
||||||
if ($syntax !== null) $value = $syntax->fromPhp($value);
|
|
||||||
else A::ensure_narray($value);
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** retourner un tableau si multivalué, une valeur scalaire si monovalué */
|
|
||||||
function get($index=null) {
|
|
||||||
$value = $this->fromLdap($this->data);
|
|
||||||
if ($index !== null && is_array($value)) {
|
|
||||||
$value = array_key_exists($index, $value)? $value[$index]: null;
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* retourner toutes les valeurs
|
|
||||||
*
|
|
||||||
* @param string $checkPrefixDel ne retourner que les valeurs qui commencent
|
|
||||||
* par ce préfixe ET enlever le préfixe
|
|
||||||
*/
|
|
||||||
function all(?string $checkPrefixDel=null): ?array {
|
|
||||||
if ($this->syntax === null) $values = $this->data;
|
|
||||||
else $values = $this->syntax->fromMultivaluedLdap($this->data);
|
|
||||||
if ($checkPrefixDel !== null && $values !== null) {
|
|
||||||
$filtered = [];
|
|
||||||
foreach ($values as $value) {
|
|
||||||
if (str::del_prefix($value, $checkPrefixDel)) {
|
|
||||||
$filtered[] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$values = $filtered;
|
|
||||||
}
|
|
||||||
return $values;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** retourner la première valeur */
|
|
||||||
function first(?string $checkPrefixDel=null) {
|
|
||||||
return A::first($this->all($checkPrefixDel));
|
|
||||||
}
|
|
||||||
|
|
||||||
function set($values, bool $unlessNn=false): self {
|
|
||||||
if ($values instanceof LdapAttr) $values = $values->array();
|
|
||||||
if (!$unlessNn || $this->data === null) {
|
|
||||||
$this->data = $this->fromPhp($values);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function in_array(string $needle, array $haystack, bool $strict, ?int &$index=null): bool {
|
|
||||||
if (!$strict) $needle = strtolower($needle);
|
|
||||||
foreach ($haystack as $index => $hay) {
|
|
||||||
if ($strict && $hay === $needle) return true;
|
|
||||||
if (!$strict && strtolower($hay) == $needle) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** vérifier si la valeur spécifiée figure dans l'attribut */
|
|
||||||
function contains($value, bool $strict=false): bool {
|
|
||||||
$value = A::first($this->fromPhp($value));
|
|
||||||
if ($value === null || $this->data === null) return false;
|
|
||||||
return self::in_array($value, $this->data, $strict);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* l'unicité est calculée ainsi:
|
|
||||||
* - en mode strict, ce doit être une égalité parfaite
|
|
||||||
* - en mode non strict, la comparaison est insensible à la casse
|
|
||||||
* XXX à terme, implémenter la comparaison en fonction de la syntaxe
|
|
||||||
*/
|
|
||||||
function add($value, bool $unique=true, bool $strict=false): self {
|
|
||||||
$value = A::first($this->fromPhp($value));
|
|
||||||
if ($value !== null) {
|
|
||||||
if (!$unique || $this->data === null ||
|
|
||||||
!self::in_array($value, $this->data, $strict)) {
|
|
||||||
$this->data[] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function addAll(?iterable $values): self {
|
|
||||||
if ($values !== null) {
|
|
||||||
foreach ($values as $value) {
|
|
||||||
$this->add($value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function del($value, int $maxCount=-1, bool $strict=false): self {
|
|
||||||
if ($value !== null && $this->data !== null) {
|
|
||||||
$value = A::first($this->fromPhp($value));
|
|
||||||
$rekey = false;
|
|
||||||
while ($maxCount != 0) {
|
|
||||||
if (!self::in_array($value, $this->data, $strict, $index)) break;
|
|
||||||
unset($this->data[$index]);
|
|
||||||
$rekey = true;
|
|
||||||
if ($maxCount > 0) $maxCount--;
|
|
||||||
}
|
|
||||||
if ($rekey) $this->data = array_values($this->data);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function ins(int $index, $value): self {
|
|
||||||
$value = A::first($this->fromPhp($value));
|
|
||||||
if ($value !== null) {
|
|
||||||
A::insert($this->data, $index, $value);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function unset(int $index): self {
|
|
||||||
if ($this->data !== null) {
|
|
||||||
$count = count($this->array());
|
|
||||||
if ($count > 0 && $index < 0) {
|
|
||||||
while ($index < 0) $index += $count;
|
|
||||||
}
|
|
||||||
unset($this->data[$index]);
|
|
||||||
$this->data = array_values($this->data);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function key() { return $this->_key(); }
|
|
||||||
function current() {
|
|
||||||
$current = $this->_current();
|
|
||||||
$syntax = $this->syntax;
|
|
||||||
if ($syntax !== null) $current = $syntax->ldap2php($current);
|
|
||||||
return $current;
|
|
||||||
}
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
# données au format LDAP
|
|
||||||
|
|
||||||
function __toString() {
|
|
||||||
return implode("\n", $this->data);
|
|
||||||
}
|
|
||||||
/** retourner les données au format LDAP */
|
|
||||||
function &array(): ?array { return $this->data; }
|
|
||||||
function count(): int { return count($this->data); }
|
|
||||||
function keys(): array { return array_keys($this->data); }
|
|
||||||
function offsetExists($key) {
|
|
||||||
return $this->data !== null && array_key_exists($key, $this->data);
|
|
||||||
}
|
|
||||||
function offsetGet($key) { return array_key_exists($key, $this->data)? $this->data[$key]: null; }
|
|
||||||
function offsetSet($key, $value) { $this->data[$key] = $value; }
|
|
||||||
function offsetUnset($key) { unset($this->data[$key]); }
|
|
||||||
|
|
||||||
function __isset($key) { return $this->offsetExists($key); }
|
|
||||||
function __get($key) { return $this->offsetGet($key); }
|
|
||||||
function __set($key, $value) { $this->offsetSet($key, $value); }
|
|
||||||
function __unset($key) { $this->offsetUnset($key); }
|
|
||||||
}
|
|
|
@ -1,445 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\ICloseable;
|
|
||||||
use nur\b\params\Parametrable;
|
|
||||||
use nur\b\params\Tparametrable;
|
|
||||||
use nur\ldap\schemas\LdapSchemaExtractor;
|
|
||||||
use nur\ldap\schemas\SchemaManager;
|
|
||||||
use nur\ldap\syntaxes\AbstractSyntax;
|
|
||||||
use nur\path;
|
|
||||||
use nur\php\SrcGenerator;
|
|
||||||
use nur\str;
|
|
||||||
use nur\writer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LdapConn: une connexion à un serveur LDAP
|
|
||||||
*/
|
|
||||||
class LdapConn extends Parametrable implements ICloseable {
|
|
||||||
use Tparametrable;
|
|
||||||
|
|
||||||
const URI = "ldap://localhost:389";
|
|
||||||
const BINDDN = null;
|
|
||||||
const PASSWORD = null;
|
|
||||||
const CONTROLS = null;
|
|
||||||
|
|
||||||
const PARAMETRABLE_PARAMS_SCHEMA = [
|
|
||||||
"uri" => ["string", null, "URI du serveur LDAP"],
|
|
||||||
"binddn" => ["?string", null, "DN avec lequel se lier"],
|
|
||||||
"password" => ["?string", null, "mot de passe"],
|
|
||||||
"controls" => ["array", [], "contrôle de connexion"],
|
|
||||||
"protocol" => ["int", 3, "version du protocole"],
|
|
||||||
"autoconnect" => ["bool", true, "faut-il se connecter dès la création de l'objet?"],
|
|
||||||
# paramètres par défaut
|
|
||||||
"suffix" => ["?string", null, "DN de base du serveur"],
|
|
||||||
"domain" => ["?string", null, "domaine DNS de l'établissement"],
|
|
||||||
"etab" => ["?string", null, "code de l'établissement"],
|
|
||||||
"autofill_params" => ["bool", true, "faut-il calculer automatiquement les paramètres par défaut?"],
|
|
||||||
# configuration du serveur
|
|
||||||
"root_dse" => ["?array", null, "configuration du serveur"],
|
|
||||||
"ldap_syntaxes" => ["?array", null, "définition des syntaxes"],
|
|
||||||
"attribute_types" => ["?array", null, "définition des attributs"],
|
|
||||||
"object_classes" => ["?array", null, "définition des classes d'objets"],
|
|
||||||
];
|
|
||||||
|
|
||||||
function __construct(?array $params=null) {
|
|
||||||
self::set_parametrable_params_defaults($params, [
|
|
||||||
"uri" => static::URI,
|
|
||||||
"binddn" => static::BINDDN,
|
|
||||||
"password" => static::PASSWORD,
|
|
||||||
"controls" => static::CONTROLS,
|
|
||||||
]);
|
|
||||||
parent::__construct($params);
|
|
||||||
if ($this->ppAutoconnect) $this->connect();
|
|
||||||
if ($this->ppAutofillParams) $this->fillParams();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $ppUri;
|
|
||||||
|
|
||||||
/** @var ?string */
|
|
||||||
protected $ppBinddn;
|
|
||||||
|
|
||||||
/** @var ?string */
|
|
||||||
protected $ppPassword;
|
|
||||||
|
|
||||||
/** @var ?array */
|
|
||||||
protected $ppControls;
|
|
||||||
|
|
||||||
/** @var int */
|
|
||||||
protected $ppProtocol;
|
|
||||||
|
|
||||||
/** @var bool */
|
|
||||||
protected $ppAutoconnect;
|
|
||||||
|
|
||||||
/** @var ?string */
|
|
||||||
protected $ppSuffix;
|
|
||||||
|
|
||||||
function getSuffix(): ?string {
|
|
||||||
return $this->ppSuffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var ?string */
|
|
||||||
protected $ppDomain;
|
|
||||||
|
|
||||||
function getDomain(): ?string {
|
|
||||||
return $this->ppDomain;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var ?string */
|
|
||||||
protected $ppEtab;
|
|
||||||
|
|
||||||
function getEtab(bool $withPrefix=true): ?string {
|
|
||||||
$etab = $this->ppEtab;
|
|
||||||
if (!$withPrefix) {
|
|
||||||
$etab = preg_replace('/^\{[^}]+}/', "", $etab);
|
|
||||||
}
|
|
||||||
return $etab;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var bool */
|
|
||||||
protected $ppAutofillParams;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param resource $conn
|
|
||||||
* @throws LdapException
|
|
||||||
*/
|
|
||||||
function tryConnect(?string $binddn=null, ?string $password=null, ?array $controls=null, $conn=null) {
|
|
||||||
if ($conn === null) {
|
|
||||||
$uri = $this->ppUri;
|
|
||||||
$conn = LdapException::check("connect $uri", null
|
|
||||||
, ldap_connect($uri));
|
|
||||||
$procotol = $this->ppProtocol;
|
|
||||||
LdapException::check("set_option protocol=$procotol", $conn
|
|
||||||
, ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, $procotol));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($binddn === null) $binddn = $this->ppBinddn;
|
|
||||||
if ($password === null) $password = $this->ppPassword;
|
|
||||||
if ($controls === null) $controls = $this->ppControls;
|
|
||||||
$operation = "bind $binddn";
|
|
||||||
$r = LdapException::check($operation, $conn
|
|
||||||
, ldap_bind_ext($conn, $binddn, $password, $controls));
|
|
||||||
LdapException::check_result($operation, $conn, $r);
|
|
||||||
|
|
||||||
return $conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var resource */
|
|
||||||
protected $conn;
|
|
||||||
|
|
||||||
function connect(?string $binddn=null, ?string $password=null, ?array $controls=null): void {
|
|
||||||
$this->conn = $this->tryConnect($binddn, $password, $controls, $this->conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* se reconnecter, mais seulement s'il y a une erreur sur la connection
|
|
||||||
*
|
|
||||||
* @return true si la reconnexion a effectivement eu lieu
|
|
||||||
*/
|
|
||||||
function reconnect(bool $force=false): bool {
|
|
||||||
if (!$force) {
|
|
||||||
try {
|
|
||||||
$this->_search(null, [
|
|
||||||
"attrs" => ["objectClass"],
|
|
||||||
"scope" => "base",
|
|
||||||
"suffix" => "",
|
|
||||||
])->first();
|
|
||||||
} catch (LdapException $e) {
|
|
||||||
$force = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($force) $this->connect();
|
|
||||||
return $force;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return resource */
|
|
||||||
protected function conn() {
|
|
||||||
if ($this->conn === null) $this->connect();
|
|
||||||
return $this->conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** retourner un objet vide permettant de construire un objet depuis zéro */
|
|
||||||
function empty(?LdapObject $object=null): LdapObject {
|
|
||||||
if ($object === null) $object = new LdapObject();
|
|
||||||
return $object->reset(null, null, [], $this);
|
|
||||||
}
|
|
||||||
|
|
||||||
function _search(?string $searchbase=null, $params=null): LdapSearch {
|
|
||||||
LdapSearch::search_md()->ensureSchema($params);
|
|
||||||
A::replace_n($params, "searchbase", $searchbase);
|
|
||||||
A::replace_n($params, "suffix", $this->ppSuffix);
|
|
||||||
return new LdapSearch($this->conn(), $params);
|
|
||||||
}
|
|
||||||
|
|
||||||
function search(?string $searchbase=null, $params=null, ?ILdapWalker $walker=null): ILdapWalker {
|
|
||||||
if ($walker === null) {
|
|
||||||
$walker = new LdapWalker($this);
|
|
||||||
} else {
|
|
||||||
$walker->close();
|
|
||||||
$walker->reset(null, null, null, $this);
|
|
||||||
}
|
|
||||||
return $walker->resetSearch($this->_search($searchbase, $params));
|
|
||||||
}
|
|
||||||
|
|
||||||
function first(?string $searchbase=null, $params=null, ?LdapObject $object=null): ?LdapObject {
|
|
||||||
$search = $this->_search($searchbase, $params);
|
|
||||||
$entry = $search->first($dn);
|
|
||||||
if ($entry === null) return null;
|
|
||||||
else return $this->empty($object)->load($dn, $entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
function read(string $dn, ?array $params=null, ?LdapObject $object=null): ?LdapObject {
|
|
||||||
A::merge($params, [
|
|
||||||
"scope" => "base",
|
|
||||||
"suffix" => $dn,
|
|
||||||
]);
|
|
||||||
return $this->first(null, $params, $object);
|
|
||||||
}
|
|
||||||
|
|
||||||
function add(string $dn, array $attrs, $params=null): void {
|
|
||||||
ldap::add($this->conn(), $dn, $attrs, $params);
|
|
||||||
}
|
|
||||||
|
|
||||||
function modify(string $dn, array $modattrs, $params=null): void {
|
|
||||||
ldap::modify($this->conn(), $dn, $modattrs, $params);
|
|
||||||
}
|
|
||||||
|
|
||||||
function rename(string $dn, string $newRdn, $params=null): string {
|
|
||||||
if (ldap::prepare_rename($dn, $newRdn, $params)) {
|
|
||||||
return ldap::rename($this->conn(), $dn, $newRdn, $params);
|
|
||||||
} else {
|
|
||||||
# renommage non nécessaire
|
|
||||||
return $dn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function delete(string $dn, $params=null): void {
|
|
||||||
ldap::delete($this->conn(), $dn, $params);
|
|
||||||
}
|
|
||||||
|
|
||||||
function close(): void {
|
|
||||||
if ($this->conn !== null) {
|
|
||||||
ldap_unbind($this->conn);
|
|
||||||
$this->conn = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Si $rdn se termine par le suffixe, le retourner tel quel, sinon rajouter
|
|
||||||
* le suffixe si ce n'est pas un DN qui est dans un des contextes valides
|
|
||||||
*/
|
|
||||||
function ensureDn(string $rdn): string {
|
|
||||||
$suffix = $this->ppSuffix;
|
|
||||||
if (names::have_suffix($rdn, $suffix)) return $rdn;
|
|
||||||
$rootDse = $this->getRootDseForContexts();
|
|
||||||
$namingContexts = $rootDse->get("namingContexts", []);
|
|
||||||
foreach ($namingContexts as $namingContext) {
|
|
||||||
if (names::have_suffix($rdn, $suffix)) return $rdn;
|
|
||||||
}
|
|
||||||
return names::join($rdn, $suffix);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Corriger un label de la forme {UAI::XXX} en insérant le code de
|
|
||||||
* l'établissement
|
|
||||||
*/
|
|
||||||
function fixLabel(string $labeledValue): string {
|
|
||||||
if (!preg_match('/^(\{[A-Za-z0-9:._-]+})(.*)/', $labeledValue, $ms)) {
|
|
||||||
return $labeledValue;
|
|
||||||
}
|
|
||||||
$label = $ms[1];
|
|
||||||
$value = $ms[2];
|
|
||||||
if (str::del_prefix($label, "{UAI::")) {
|
|
||||||
$label = "{UAI:".$this->getEtab(false).":$label";
|
|
||||||
} elseif (str::del_prefix($label, "{UAI:}")) {
|
|
||||||
$label = "{UAI:".$this->getEtab(false)."}$label";
|
|
||||||
}
|
|
||||||
return $label.$value;
|
|
||||||
}
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
/** @var SchemaManager */
|
|
||||||
protected $scheman;
|
|
||||||
|
|
||||||
protected function scheman(): SchemaManager {
|
|
||||||
if ($this->scheman === null) {
|
|
||||||
$this->scheman = new SchemaManager($this);
|
|
||||||
}
|
|
||||||
return $this->scheman;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSyntax($class): AbstractSyntax {
|
|
||||||
$syntax = $this->scheman()->getSyntax($class);
|
|
||||||
$syntax->initConn($this);
|
|
||||||
return $syntax;
|
|
||||||
}
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
protected function loadRootDse(?array $attrs=null): LdapObject {
|
|
||||||
if ($attrs === null) $attrs = ["+", "*"];
|
|
||||||
$entry = $this->_search(null, [
|
|
||||||
"attrs" => $attrs,
|
|
||||||
"scope" => "base",
|
|
||||||
"suffix" => "",
|
|
||||||
])->first($dn);
|
|
||||||
return $this->empty()->load($dn, $entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var LdapObject */
|
|
||||||
protected $ppRootDse;
|
|
||||||
|
|
||||||
function pp_setRootDse(array $rootDse) {
|
|
||||||
$this->ppRootDse = $this->empty()->reset("", $rootDse);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRootDse(): LdapObject {
|
|
||||||
if ($this->ppRootDse === null) $this->ppRootDse = $this->loadRootDse();
|
|
||||||
return $this->ppRootDse;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getRootDseForContexts(): LdapObject {
|
|
||||||
$rootDse = $this->ppRootDse;
|
|
||||||
if ($rootDse === null) {
|
|
||||||
$rootDse = $this->loadRootDse(["defaultNamingContext", "namingContexts"]);
|
|
||||||
}
|
|
||||||
return $rootDse;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function loadTopObject(?array $attrs=null): LdapObject {
|
|
||||||
if ($attrs === null) $attrs = ["+", "*"];
|
|
||||||
$entry = $this->_search("", [
|
|
||||||
"attrs" => $attrs,
|
|
||||||
"scope" => "base",
|
|
||||||
])->first($dn);
|
|
||||||
return $this->empty()->load($dn, $entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected $ppLdapSyntaxes;
|
|
||||||
|
|
||||||
protected $ppAttributeTypes;
|
|
||||||
|
|
||||||
protected $ppObjectClasses;
|
|
||||||
|
|
||||||
function getSchemaInfos(): array {
|
|
||||||
$ldapSyntaxes = $this->ppLdapSyntaxes;
|
|
||||||
$attributeTypes = $this->ppAttributeTypes;
|
|
||||||
$objectClasses = $this->ppObjectClasses;
|
|
||||||
if ($ldapSyntaxes === null || $attributeTypes === null || $objectClasses === null) {
|
|
||||||
$lse = new LdapSchemaExtractor();
|
|
||||||
[
|
|
||||||
"ldap_syntaxes" => $ldapSyntaxes,
|
|
||||||
"attribute_types" => $attributeTypes,
|
|
||||||
"object_classes" => $objectClasses,
|
|
||||||
] = $lse->loadSchema($this);
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
"ldap_syntaxes" => $this->ppLdapSyntaxes = $ldapSyntaxes,
|
|
||||||
"attribute_types" => $this->ppAttributeTypes = $attributeTypes,
|
|
||||||
"object_classes" => $this->ppObjectClasses = $objectClasses,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveConfig($output, bool $overwriteShared=false): void {
|
|
||||||
$uri = $this->ppUri;
|
|
||||||
$sharedname = ldap_config::get_shared_file($uri);
|
|
||||||
if (is_string($output)) {
|
|
||||||
# corriger éventuellement le nom du fichier
|
|
||||||
$output = ldap_config::get_file($output);
|
|
||||||
# calculer le chemin vers fichier partagé
|
|
||||||
$shared = path::join(path::dirname($output), $sharedname);
|
|
||||||
# écrire la configuration partagée
|
|
||||||
if ($overwriteShared) {
|
|
||||||
# forcer le recalcul
|
|
||||||
$this->ppRootDse = null;
|
|
||||||
$this->ppLdapSyntaxes = null;
|
|
||||||
$this->ppAttributeTypes = null;
|
|
||||||
$this->ppObjectClasses = null;
|
|
||||||
}
|
|
||||||
if (!file_exists($shared) || $overwriteShared) {
|
|
||||||
$rootDse = $this->getRootDse()->array();
|
|
||||||
[
|
|
||||||
"ldap_syntaxes" => $ldapSyntaxes,
|
|
||||||
"attribute_types" => $attributeTypes,
|
|
||||||
"object_classes" => $objectClasses,
|
|
||||||
] = $this->getSchemaInfos();
|
|
||||||
$config = [
|
|
||||||
"uri" => $uri,
|
|
||||||
"controls" => $this->ppControls,
|
|
||||||
"protocol" => $this->ppProtocol,
|
|
||||||
"suffix" => $this->ppSuffix,
|
|
||||||
"domain" => $this->ppDomain,
|
|
||||||
"etab" => $this->ppEtab,
|
|
||||||
"root_dse" => $rootDse,
|
|
||||||
"ldap_syntaxes" => $ldapSyntaxes,
|
|
||||||
"attribute_types" => $attributeTypes,
|
|
||||||
"object_classes" => $objectClasses,
|
|
||||||
];
|
|
||||||
$src = new SrcGenerator();
|
|
||||||
$literals = [];
|
|
||||||
foreach (consts::LDAP_CONTROL_CONSTANTS as $constant) {
|
|
||||||
if (defined($constant)) {
|
|
||||||
$literals[] = [constant($constant), $constant];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
A::merge($literals, consts::ROOT_DSE_LITERALS);
|
|
||||||
$src
|
|
||||||
->genSof()
|
|
||||||
->genLiteral("# shared configuration for $uri")
|
|
||||||
->genReturn($config, null, $literals);
|
|
||||||
writer::with($shared, "wb")->writeLines($src->getLines())->close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# écrire la configuration
|
|
||||||
$config = [
|
|
||||||
"binddn" => $this->ppBinddn,
|
|
||||||
"password" => $this->ppPassword,
|
|
||||||
];
|
|
||||||
$src = new SrcGenerator();
|
|
||||||
$src
|
|
||||||
->genSof()
|
|
||||||
->genLiteral("return array_merge(require __DIR__.'/$sharedname',")
|
|
||||||
->addValue($config)
|
|
||||||
->genLiteral(");");
|
|
||||||
writer::with($output, "wb")->writeLines($src->getLines())->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* calculer automatiquement les paramètres par défaut s'ils ne sont pas
|
|
||||||
* spécifiés, tels que:
|
|
||||||
* - suffix
|
|
||||||
* - domain
|
|
||||||
* - etab
|
|
||||||
*/
|
|
||||||
function fillParams(): void {
|
|
||||||
if ($this->ppSuffix === null) {
|
|
||||||
$rootDse = $this->getRootDseForContexts();
|
|
||||||
$suffix = $rootDse->get("defaultNamingContext");
|
|
||||||
if ($suffix === null) {
|
|
||||||
$namingContexts = $rootDse->get("namingContexts", []);
|
|
||||||
foreach ($namingContexts as $namingContext) {
|
|
||||||
if (str::_starts_with("dc=", strtolower($namingContext))) {
|
|
||||||
$suffix = $namingContext;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($suffix === null) $suffix = $namingContexts[0];
|
|
||||||
}
|
|
||||||
$this->ppSuffix = $suffix;
|
|
||||||
}
|
|
||||||
if ($this->ppDomain === null) {
|
|
||||||
$parts = ldap_explode_dn($this->ppSuffix, 1);
|
|
||||||
unset($parts["count"]);
|
|
||||||
$this->ppDomain = implode(".", $parts);
|
|
||||||
}
|
|
||||||
if ($this->ppEtab === null) {
|
|
||||||
$topObject = $this->loadTopObject();
|
|
||||||
$this->ppEtab = $topObject->first("supannEtablissement");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,76 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\b\UserException;
|
|
||||||
|
|
||||||
class LdapException extends UserException {
|
|
||||||
/** @param $r ?resource */
|
|
||||||
static function check(string $message, $r, $value, ?int $allow_errno=null) {
|
|
||||||
if ($value !== false) return $value;
|
|
||||||
if ($r !== null) {
|
|
||||||
$errno = ldap_errno($r);
|
|
||||||
if ($allow_errno !== null && $errno === $allow_errno) return $value;
|
|
||||||
throw new self($message, $errno, null, ldap_error($r));
|
|
||||||
} else {
|
|
||||||
throw new self($message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static function check_result(string $message, $conn, $r) {
|
|
||||||
ldap_parse_result($conn, $r, $errorCode, $matchedDn, $errorMessage, $referrals, $controls);
|
|
||||||
if ($errorCode != 0) {
|
|
||||||
if (!$errorMessage) $errorMessage = ldap_err2str($errorCode);
|
|
||||||
throw new LdapException($message, $errorCode, $matchedDn, $errorMessage, $referrals, $controls);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function __construct(string $userMessage
|
|
||||||
, ?int $errorCode=null, ?string $matchedDn=null, ?string $errorMessage=null
|
|
||||||
, ?array $referrals=null, ?array $controls=null) {
|
|
||||||
if ($errorCode == 0) {
|
|
||||||
parent::__construct($userMessage);
|
|
||||||
} else {
|
|
||||||
$this->matchedDn = $matchedDn;
|
|
||||||
$this->errorMessage = $errorMessage;
|
|
||||||
$this->referrals = $referrals;
|
|
||||||
$this->controls = $controls;
|
|
||||||
$parts = ["error $errorCode"];
|
|
||||||
if ($errorMessage) $parts[] = $errorMessage;
|
|
||||||
if ($matchedDn) $parts[] = "matched_dn: $matchedDn";
|
|
||||||
if ($referrals) $parts[] = "referrals: ".implode(" ", $referrals);
|
|
||||||
$techMessage = implode(", ", $parts);
|
|
||||||
parent::__construct([
|
|
||||||
"user" => $userMessage,
|
|
||||||
"tech" => $techMessage,
|
|
||||||
], $errorCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $matchedDn;
|
|
||||||
|
|
||||||
function getMatchedDn(): ?string {
|
|
||||||
return $this->matchedDn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $errorMessage;
|
|
||||||
|
|
||||||
function getErrorMessage(): ?string {
|
|
||||||
return $this->errorMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var ?array */
|
|
||||||
protected $referrals;
|
|
||||||
|
|
||||||
function getReferrals(): ?array {
|
|
||||||
return $this->referrals;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var ?array */
|
|
||||||
protected $controls;
|
|
||||||
|
|
||||||
function getControls(): ?array {
|
|
||||||
return $this->controls;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,375 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use ArrayAccess;
|
|
||||||
use Countable;
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\IllegalAccessException;
|
|
||||||
use nur\ldap\syntaxes\StringSyntax;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LdapObject: un objet LDAP
|
|
||||||
*/
|
|
||||||
class LdapObject implements ArrayAccess, Countable {
|
|
||||||
static function with(?string $dn, ?array $entry): ?self {
|
|
||||||
if ($entry === null) return null;
|
|
||||||
else return (new self())->load($dn, $entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var string[] liste des classes par défaut lors de la création de l'objet */
|
|
||||||
const OBJECT_CLASSES = ["top"];
|
|
||||||
/** @var string DN dans lequel cet objet est créé par défaut */
|
|
||||||
const PARENT_RDN = null;
|
|
||||||
/**
|
|
||||||
* @var array|string nom des attribut(s) utilisé(s) pour nommer cet objet par
|
|
||||||
* défaut
|
|
||||||
*/
|
|
||||||
const DN_NAMES = null;
|
|
||||||
|
|
||||||
function __construct(?string $dn=null, ?array $attrs=null, ?array $initialNames=null, ?LdapConn $conn=null) {
|
|
||||||
$this->reset($dn, $attrs, A::with($initialNames), $conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var LdapConn */
|
|
||||||
protected $conn;
|
|
||||||
|
|
||||||
function getConn(): LdapConn {
|
|
||||||
return $this->conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var array attributs initialement demandés lors de la recherche */
|
|
||||||
protected $initialNames;
|
|
||||||
|
|
||||||
protected function initialNames(): array {
|
|
||||||
return $this->initialNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var array valeurs originale des attributs avant modification */
|
|
||||||
protected $orig;
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
protected $data;
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
protected $lkey2names;
|
|
||||||
|
|
||||||
/** @var array liste des attributs utilisés pour nommer l'objet */
|
|
||||||
protected $dnNames;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var LdapAttr[] pour chaque attribut, l'instance de {@link LdapAttr} qui
|
|
||||||
* gère les valeurs correspondantes de $data
|
|
||||||
*/
|
|
||||||
protected $attrs;
|
|
||||||
|
|
||||||
protected function resetAttrs(): void {
|
|
||||||
# refaire les attributs le cas échéant
|
|
||||||
if ($this->attrs === null) return;
|
|
||||||
foreach (array_keys($this->data) as $name) {
|
|
||||||
if (array_key_exists($name, $this->attrs)) {
|
|
||||||
$this->attrs[$name]->reset($this->data[$name]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function n($key): string {
|
|
||||||
$lkey = strtolower(strval($key));
|
|
||||||
$name = A::get($this->lkey2names, $lkey);
|
|
||||||
if ($name === null) {
|
|
||||||
# si $key n'existe pas, l'ajouter
|
|
||||||
$name = $this->lkey2names[$lkey] = $key;
|
|
||||||
}
|
|
||||||
return $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
function &array(): ?array { return $this->data; }
|
|
||||||
function count(): int { return count($this->data); }
|
|
||||||
function keys(): array { return array_keys($this->data); }
|
|
||||||
function has($name): bool {
|
|
||||||
return $this->data !== null && array_key_exists($this->n($name), $this->data);
|
|
||||||
}
|
|
||||||
function _get(string $name): LdapAttr {
|
|
||||||
$name = $this->n($name);
|
|
||||||
if ($this->attrs === null || !array_key_exists($name, $this->attrs)) {
|
|
||||||
$attribute = A::get(static::SCHEMA(), strtolower($name));
|
|
||||||
if ($attribute !== null && $this->conn !== null) {
|
|
||||||
["class" => $class, "flags" => $flags] = $attribute;
|
|
||||||
$syntax = $this->conn->getSyntax($class);
|
|
||||||
} else {
|
|
||||||
$syntax = $flags = null;
|
|
||||||
}
|
|
||||||
if ($syntax !== null) {
|
|
||||||
$attr = $syntax->newAttr($name, $this->data[$name], $flags);
|
|
||||||
} else {
|
|
||||||
$attr = new LdapAttr($name, $this->data[$name], $syntax, $flags);
|
|
||||||
}
|
|
||||||
$this->attrs[$name] = $attr;
|
|
||||||
}
|
|
||||||
return $this->attrs[$name];
|
|
||||||
}
|
|
||||||
function _del(string $name): void {
|
|
||||||
unset($this->data[$this->n($name)]);
|
|
||||||
}
|
|
||||||
function get($name) { return $this->_get($name)->get(); }
|
|
||||||
function first($name) { return $this->_get($name)->first(); }
|
|
||||||
function all($name): iterable { return $this->_get($name)->all(); }
|
|
||||||
function set($name, $values, bool $unlessNn=false): self { $this->_get($name)->set($values, $unlessNn); return $this; }
|
|
||||||
function add($name, $value, bool $unique=true): self { $this->_get($name)->add($value, $unique); return $this; }
|
|
||||||
function del($name, $value, int $maxCount=-1, bool $strict=false): self { $this->_get($name)->del($value, $maxCount, $strict); return $this; }
|
|
||||||
function ins($name, int $index, $value): self { $this->_get($name)->ins($index, $value); return $this; }
|
|
||||||
function unset($name, int $index): self { $this->_get($name)->unset($index); return $this; }
|
|
||||||
function merge(?array $attrs): self {
|
|
||||||
if ($attrs !== null) {
|
|
||||||
foreach ($attrs as $name => $values) {
|
|
||||||
$this->set($name, $values);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function offsetExists($key) { return $this->has($key); }
|
|
||||||
function offsetGet($key) { return $this->_get($key)->get(); }
|
|
||||||
function offsetSet($key, $value) { $this->_get($key)->set($value); }
|
|
||||||
function offsetUnset($key) { $this->_del($key); }
|
|
||||||
|
|
||||||
function __isset($key) { return $this->has($key); }
|
|
||||||
function __get($key) { return $this->_get($key)->get(); }
|
|
||||||
function __set($key, $value) { $this->_get($key)->set($value); }
|
|
||||||
function __unset($key) { $this->_del($key); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* initialiser cet objet avec des données construites à la volée.
|
|
||||||
* - si $dn === null, c'est un nouvel objet
|
|
||||||
* - sinon c'est un objet existant déjà dans LDAP
|
|
||||||
*/
|
|
||||||
function reset(?string $dn, ?array $attrs=null, ?array $initialNames=null, ?LdapConn $conn=null): self {
|
|
||||||
if ($conn !== null) $this->conn = $conn;
|
|
||||||
if ($initialNames !== null) $this->initialNames = $initialNames;
|
|
||||||
# attributs demandés
|
|
||||||
$lkey2names = ["dn" => "dn"];
|
|
||||||
foreach ($this->initialNames() as $name) {
|
|
||||||
if ($name == "+" || $name == "*") continue;
|
|
||||||
$lkey2names[strtolower($name)] = $name;
|
|
||||||
}
|
|
||||||
# attributs obtenus effectivement
|
|
||||||
A::merge_nn($attrs, [
|
|
||||||
"objectClass" => static::OBJECT_CLASSES,
|
|
||||||
]);
|
|
||||||
$orig = ["dn" => [$dn]];
|
|
||||||
foreach ($attrs as $name => $value) {
|
|
||||||
$orig[$name] = $value;
|
|
||||||
$lkey2names[strtolower($name)] = $name;
|
|
||||||
}
|
|
||||||
# ensuite, mettre à null les attributs qui n'ont pas été obtenus
|
|
||||||
foreach ($lkey2names as $name) {
|
|
||||||
if (!array_key_exists($name, $orig)) {
|
|
||||||
$orig[$name] = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# calculer les clés qui composent le DN
|
|
||||||
$dnNames = names::get_dn_names($dn, $lkey2names);
|
|
||||||
# finaliser le paramétrage
|
|
||||||
$this->data = $this->orig = $orig;
|
|
||||||
$this->lkey2names = $lkey2names;
|
|
||||||
$this->dnNames = $dnNames;
|
|
||||||
$this->resetAttrs();
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** initialiser cet objet avec le résultat d'une recherche */
|
|
||||||
function load(string $dn, array $entry): self {
|
|
||||||
[$this->orig, $this->lkey2names, $this->dnNames,
|
|
||||||
] = LdapSearch::cook($this->initialNames(), $dn, $entry);
|
|
||||||
$this->data = $this->orig;
|
|
||||||
$this->resetAttrs();
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** recharger l'objet depuis le serveur */
|
|
||||||
function reload(?LdapConn $conn=null): self {
|
|
||||||
if ($conn === null) $conn = $this->conn;
|
|
||||||
$dn = $this->data["dn"][0];
|
|
||||||
$entry = $conn->_search($dn, [
|
|
||||||
"attrs" => $this->initialNames(),
|
|
||||||
"scope" => "base",
|
|
||||||
])->first($dn);
|
|
||||||
if ($entry === null) {
|
|
||||||
throw new IllegalAccessException("object $dn no longer exists");
|
|
||||||
}
|
|
||||||
return $this->load($dn, $entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
function initDn(?string $parentDn=null, $dnNames=null, ?LdapConn $conn=null): void {
|
|
||||||
if ($conn === null) $conn = $this->conn;
|
|
||||||
if ($parentDn === null) $parentDn = static::PARENT_RDN;
|
|
||||||
if ($conn !== null) $parentDn = $conn->ensureDn($parentDn);
|
|
||||||
if ($dnNames === null) $dnNames = static::DN_NAMES;
|
|
||||||
$rdn = [];
|
|
||||||
foreach (A::with($dnNames) as $name) {
|
|
||||||
$rdn[$name] = $this->get($name);
|
|
||||||
}
|
|
||||||
$dn = names::join($rdn, $parentDn);
|
|
||||||
$this->data["dn"] = [$dn];
|
|
||||||
$this->dnNames = names::get_dn_names($dn, $this->lkey2names);
|
|
||||||
}
|
|
||||||
|
|
||||||
function computeAddattrs(array $data): array {
|
|
||||||
$attrs = [];
|
|
||||||
$first = true;
|
|
||||||
foreach ($data as $name => $values) {
|
|
||||||
if ($first) {
|
|
||||||
# ne pas inclure le DN
|
|
||||||
$first = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
# ne pas inclure les valeurs vides et nulles
|
|
||||||
if ($values === null || $values === []) continue;
|
|
||||||
# utiliser array_values pour être sûr d'avoir un tableau séquentiel (les
|
|
||||||
# valeurs composites sont indexées sur la clé calculée)
|
|
||||||
$attrs[$name] = array_values(A::with($values));
|
|
||||||
}
|
|
||||||
return $attrs;
|
|
||||||
}
|
|
||||||
function computeModattr(string $name, $orig, $value): array {
|
|
||||||
# utiliser array_values pour être sûr d'avoir un tableau séquentiel (les
|
|
||||||
# valeurs composites sont indexées sur la clé calculée)
|
|
||||||
$orig = array_values(A::with($orig));
|
|
||||||
$value = array_values(A::with($value));
|
|
||||||
if ($value === $orig) return [];
|
|
||||||
if (!$orig) return [["add", $name => $value]];
|
|
||||||
elseif (!$value) return [["delete", $name]];
|
|
||||||
else return [["replace", $name => $value]];
|
|
||||||
#XXX pour certains attributs (comme member), ou si le nombre d'éléments
|
|
||||||
# dépasse un certain seuil, remplacer replace par un ensemble de add et/ou
|
|
||||||
# delete
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* retourner true si update() provoquerait une mise à jour du serveur LDAP, en
|
|
||||||
* d'autres termes si l'objet est nouveau ou a des modifications
|
|
||||||
*/
|
|
||||||
function willUpdate(): bool {
|
|
||||||
$create = $this->orig["dn"][0] === null;
|
|
||||||
if ($create) return true;
|
|
||||||
foreach ($this->data as $name => $value) {
|
|
||||||
$orig = A::get($this->orig, $name);
|
|
||||||
$modattr = $this->computeModattr($name, $orig, $value);
|
|
||||||
if ($modattr != null) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool true si la modification a été faite, false si elle n'était pas
|
|
||||||
* nécessaire
|
|
||||||
*/
|
|
||||||
function update($params=null, ?LdapConn $conn=null, ?bool $create=null): bool {
|
|
||||||
if ($conn === null) $conn = $this->conn;
|
|
||||||
$dn = $this->data["dn"][0];
|
|
||||||
if ($create === null) {
|
|
||||||
$origDn = $this->orig["dn"][0];
|
|
||||||
$create = $origDn === null;
|
|
||||||
}
|
|
||||||
if ($create) {
|
|
||||||
# création de l'objet
|
|
||||||
$attrs = $this->computeAddattrs($this->data);
|
|
||||||
$conn->add($dn, $attrs, $params);
|
|
||||||
} else {
|
|
||||||
# mise à jour de l'objet
|
|
||||||
$modattrs = [];
|
|
||||||
foreach ($this->data as $name => $value) {
|
|
||||||
$orig = A::get($this->orig, $name);
|
|
||||||
$modattr = $this->computeModattr($name, $orig, $value);
|
|
||||||
if ($modattr != null) {
|
|
||||||
if (in_array($name, $this->dnNames)) {
|
|
||||||
throw IllegalAccessException::not_allowed("modifying DN attrs");
|
|
||||||
}
|
|
||||||
A::merge($modattrs, $modattr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!$modattrs) return false;
|
|
||||||
$conn->modify($dn, $modattrs);
|
|
||||||
}
|
|
||||||
# s'il y a des références sur $this->data, alors une simple "copie" fera
|
|
||||||
# que $this->orig garde ces références. c'est la raison pour laquelle on
|
|
||||||
# doit refaire les attributs
|
|
||||||
$this->orig = $this->data;
|
|
||||||
$this->attrs = null;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function rename(string $newRdn, $params=null, ?LdapConn $conn=null): void {
|
|
||||||
if ($conn === null) $conn = $this->conn;
|
|
||||||
$dn = $this->data["dn"][0];
|
|
||||||
if (ldap::prepare_rename($dn, $newRdn, $params)) {
|
|
||||||
$dn = $conn->rename($dn, $newRdn, $params);
|
|
||||||
$this->orig["dn"] = [$dn];
|
|
||||||
$this->data["dn"] = [$dn];
|
|
||||||
$this->dnNames = names::get_dn_names($dn, $this->lkey2names);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function delete($params=null, ?LdapConn $conn=null): void {
|
|
||||||
if ($conn === null) $conn = $this->conn;
|
|
||||||
$conn->delete($this->data["dn"][0], $params);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* tester s'il existe un objet nommé $attr=$value dans branche $parent qui
|
|
||||||
* vaut par défaut la branche dans laquelle est situé cet objet
|
|
||||||
*/
|
|
||||||
function existsSibling(string $value, ?string $attr=null, ?string $parent=null, ?LdapConn $conn=null): bool {
|
|
||||||
if ($conn === null) $conn = $this->conn;
|
|
||||||
$dn = $this->data["dn"][0];
|
|
||||||
names::split_dn($dn, $myRdn, $myParent);
|
|
||||||
if ($attr === null) {
|
|
||||||
$myAttrs = names::split_rdn($myRdn);
|
|
||||||
$attr = A::first_key($myAttrs);
|
|
||||||
}
|
|
||||||
if ($parent === null) $parent = $myParent;
|
|
||||||
$entry = $conn->_search(null, [
|
|
||||||
"scope" => "one",
|
|
||||||
"suffix" => $parent,
|
|
||||||
"filter" => [$attr => $value],
|
|
||||||
"attrs" => ["dn"],
|
|
||||||
])->first();
|
|
||||||
return $entry !== null;
|
|
||||||
}
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
static function _AUTOGEN_SCHEMA(): array {
|
|
||||||
return scheman::autogen_schema(static::OBJECT_CLASSES);
|
|
||||||
}
|
|
||||||
static function _AUTOGEN_PROPERTIES(): array {
|
|
||||||
return scheman::autogen_properties(self::_AUTOGEN_SCHEMA());
|
|
||||||
}
|
|
||||||
static function _AUTOGEN_METHODS(): array {
|
|
||||||
return scheman::autogen_methods(self::_AUTOGEN_SCHEMA());
|
|
||||||
}
|
|
||||||
const SCHEMA = null;
|
|
||||||
protected static function SCHEMA(): array {
|
|
||||||
# il faut au moins la définition qui indique que dn est monovalué
|
|
||||||
$schema = static::SCHEMA;
|
|
||||||
if ($schema === null) {
|
|
||||||
$schema = [
|
|
||||||
"dn" => [
|
|
||||||
"name" => "dn",
|
|
||||||
"class" => StringSyntax::class,
|
|
||||||
"flags" => LdapAttr::MONOVALUED,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return $schema;
|
|
||||||
}
|
|
||||||
function __call(string $name, ?array $args) {
|
|
||||||
$schema = static::SCHEMA();
|
|
||||||
if (is_array($schema) && array_key_exists(strtolower($name), $schema)) {
|
|
||||||
return $this->_get($name);
|
|
||||||
}
|
|
||||||
throw IllegalAccessException::not_implemented($name);
|
|
||||||
}
|
|
||||||
## rajouter ceci dans les classes dérivées
|
|
||||||
#const _AUTOGEN_CONSTS = ["SCHEMA"];
|
|
||||||
#const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
|
|
||||||
#const _AUTOGEN_METHODS = [[self::class, "_AUTOGEN_METHODS"]];
|
|
||||||
}
|
|
|
@ -1,223 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use IteratorAggregate;
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\params\Parametrable;
|
|
||||||
use nur\b\params\Tparametrable;
|
|
||||||
use nur\b\StopException;
|
|
||||||
use nur\b\ValueException;
|
|
||||||
use nur\data\types\md_utils;
|
|
||||||
use nur\data\types\Metadata;
|
|
||||||
use nur\iter;
|
|
||||||
use nur\sery\output\msg;
|
|
||||||
|
|
||||||
class LdapSearch extends Parametrable implements IteratorAggregate {
|
|
||||||
use Tparametrable;
|
|
||||||
|
|
||||||
static function parse_args(?array &$params, ?array $args
|
|
||||||
, ?string $searchbase=null, ?string $searchbase_exact=null
|
|
||||||
, ?string $scope=null): void {
|
|
||||||
$first = true;
|
|
||||||
$filter = null;
|
|
||||||
$attrs = null;
|
|
||||||
foreach ($args as $arg) {
|
|
||||||
if ($first) {
|
|
||||||
$first = false;
|
|
||||||
if (strpos($arg, "=") !== false) $filter = $arg;
|
|
||||||
else $attrs[] = $arg;
|
|
||||||
} else {
|
|
||||||
$attrs[] = $arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($filter !== null) $params["filter"] = $filter;
|
|
||||||
if ($attrs !== null) $params["attrs"] = $attrs;
|
|
||||||
if ($searchbase_exact !== null) {
|
|
||||||
$searchbase = $searchbase_exact;
|
|
||||||
$params["suffix"] = "";
|
|
||||||
}
|
|
||||||
if ($searchbase !== null) $params["searchbase"] = $searchbase;
|
|
||||||
if ($scope !== null) $params["scope"] = $scope;
|
|
||||||
}
|
|
||||||
|
|
||||||
const SCOPE_SUBTREE = 2, SCOPE_ONELEVEL = 1, SCOPE_BASE = 0;
|
|
||||||
|
|
||||||
const PARAMETRABLE_PARAMS_SCHEMA = [
|
|
||||||
"filter" => ["?content", "objectClass=*", "filtre de recherche"],
|
|
||||||
"attrs" => ["?array", [], "attributs à retourner"],
|
|
||||||
"searchbase" => ["?string", null, "DN de base pour la recherche"],
|
|
||||||
"scope" => ["?string", "sub", "étendue de la recherche"],
|
|
||||||
"suffix" => ["?string", null, "DN de base du serveur"],
|
|
||||||
"attributes_only" => ["bool", false, "faut-il ne retourner que les attributs?"],
|
|
||||||
"sizelimit" => ["int", -1, "limite de taille"],
|
|
||||||
"timelimit" => ["int", -1, "limite de temps"],
|
|
||||||
"deref" => ["int", LDAP_DEREF_NEVER, "type de déférencement"],
|
|
||||||
"controls" => ["array", [], "contrôles de la recherche"],
|
|
||||||
];
|
|
||||||
|
|
||||||
private static $search_md;
|
|
||||||
|
|
||||||
static function search_md(): Metadata {
|
|
||||||
return md_utils::ensure_md(self::$search_md, self::PARAMETRABLE_PARAMS_SCHEMA);
|
|
||||||
}
|
|
||||||
|
|
||||||
function __construct($conn, array $params) {
|
|
||||||
$this->conn = $conn;
|
|
||||||
parent::__construct($params);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var resource */
|
|
||||||
protected $conn;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $ppSearchbase;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $filter;
|
|
||||||
|
|
||||||
function pp_setFilter($filter): void {
|
|
||||||
$this->filter = filters::parse($filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
protected $ppAttrs;
|
|
||||||
|
|
||||||
/** retourner la liste des attributs demandés */
|
|
||||||
function getAttrs(): array {
|
|
||||||
return $this->ppAttrs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var int */
|
|
||||||
protected $scope;
|
|
||||||
|
|
||||||
function pp_setScope(string $scope): void {
|
|
||||||
switch ($scope) {
|
|
||||||
case self::SCOPE_SUBTREE:
|
|
||||||
case "subtree":
|
|
||||||
case "sub":
|
|
||||||
case "s":
|
|
||||||
$this->scope = self::SCOPE_SUBTREE;
|
|
||||||
break;
|
|
||||||
case self::SCOPE_ONELEVEL:
|
|
||||||
case "onelevel":
|
|
||||||
case "one":
|
|
||||||
case "o":
|
|
||||||
$this->scope = self::SCOPE_ONELEVEL;
|
|
||||||
break;
|
|
||||||
case self::SCOPE_BASE:
|
|
||||||
case "base":
|
|
||||||
case "b":
|
|
||||||
$this->scope = self::SCOPE_BASE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw ValueException::invalid_value($scope, "scope");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
protected $ppSuffix;
|
|
||||||
|
|
||||||
/** @var bool */
|
|
||||||
protected $ppAttributesOnly;
|
|
||||||
|
|
||||||
/** @var int */
|
|
||||||
protected $ppSizelimit;
|
|
||||||
|
|
||||||
/** @var int */
|
|
||||||
protected $ppTimelimit;
|
|
||||||
|
|
||||||
/** @var int */
|
|
||||||
protected $ppDeref;
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
protected $ppControls;
|
|
||||||
|
|
||||||
/** @throws LdapException */
|
|
||||||
function getIterator() {
|
|
||||||
$conn = $this->conn;
|
|
||||||
$args = [$conn];
|
|
||||||
$base = [];
|
|
||||||
if ($this->ppSearchbase) $base[] = $this->ppSearchbase;
|
|
||||||
if ($this->ppSuffix) $base[] = $this->ppSuffix;
|
|
||||||
$args[] = implode(",", $base);
|
|
||||||
A::merge($args, [
|
|
||||||
$this->filter?: "",
|
|
||||||
$this->ppAttrs?: [],
|
|
||||||
$this->ppAttributesOnly,
|
|
||||||
$this->ppSizelimit,
|
|
||||||
$this->ppTimelimit,
|
|
||||||
$this->ppDeref,
|
|
||||||
$this->ppControls,
|
|
||||||
]);
|
|
||||||
msg::debug("Searching searchbase=$args[1] filter=$args[2]");
|
|
||||||
|
|
||||||
$scope = $this->scope;
|
|
||||||
if ($scope == self::SCOPE_SUBTREE) $rr = @ldap_search(...$args);
|
|
||||||
elseif ($scope == self::SCOPE_ONELEVEL) $rr = @ldap_list(...$args);
|
|
||||||
elseif ($scope == self::SCOPE_BASE) $rr = @ldap_read(...$args);
|
|
||||||
else throw ValueException::invalid_value($scope, "scope");
|
|
||||||
|
|
||||||
$rr = LdapException::check("search", $conn, $rr, 32);
|
|
||||||
if ($rr === false) return; // pas trouvé
|
|
||||||
|
|
||||||
try {
|
|
||||||
$er = ldap_first_entry($conn, $rr);
|
|
||||||
while ($er !== false) {
|
|
||||||
$dn = ldap_get_dn($conn, $er);
|
|
||||||
$entry = ldap_get_attributes($conn, $er);
|
|
||||||
yield $dn => $entry;
|
|
||||||
$er = ldap_next_entry($conn, $er);
|
|
||||||
}
|
|
||||||
} catch (StopException $e) {
|
|
||||||
} finally {
|
|
||||||
ldap_free_result($rr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* retourner la première entrée du résultat de la recherche ou null si la
|
|
||||||
* recherche ne retourne aucun résultat
|
|
||||||
*
|
|
||||||
* @throws LdapException
|
|
||||||
*/
|
|
||||||
function first(?string &$dn=null): ?array {
|
|
||||||
$it = $this->getIterator();
|
|
||||||
$it->rewind();
|
|
||||||
if (!$it->valid()) return null;
|
|
||||||
try {
|
|
||||||
$dn = $it->key();
|
|
||||||
return $it->current();
|
|
||||||
} finally {
|
|
||||||
iter::close($it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static function cook(array $initial_names, string $dn, array $entry): array {
|
|
||||||
# attributs demandés
|
|
||||||
$lkey2names = ["dn" => "dn"];
|
|
||||||
foreach ($initial_names as $name) {
|
|
||||||
if ($name == "+" || $name == "*") continue;
|
|
||||||
$lkey2names[strtolower($name)] = $name;
|
|
||||||
}
|
|
||||||
# attributs obtenus effectivement
|
|
||||||
$count = $entry["count"];
|
|
||||||
$attrs = ["dn" => [$dn]];
|
|
||||||
for ($i = 0; $i < $count; $i++) {
|
|
||||||
$name = $entry[$i];
|
|
||||||
$attr = $entry[$name];
|
|
||||||
unset($attr["count"]);
|
|
||||||
$attrs[$name] = $attr;
|
|
||||||
$lkey2names[strtolower($name)] = $name;
|
|
||||||
}
|
|
||||||
# ensuite, mettre à null les attributs qui n'ont pas été obtenus
|
|
||||||
foreach ($lkey2names as $name) {
|
|
||||||
if (!array_key_exists($name, $attrs)) {
|
|
||||||
$attrs[$name] = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# calculer les clés qui composent le DN
|
|
||||||
$dn_names = names::get_dn_names($dn, $lkey2names);
|
|
||||||
|
|
||||||
return [$attrs, $lkey2names, $dn_names];
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LdapWalker: une classe permettant de parcourir les résultats d'une
|
|
||||||
* recherche
|
|
||||||
*/
|
|
||||||
class LdapWalker extends LdapObject implements ILdapWalker {
|
|
||||||
use TLdapWalker;
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\b\coll\TArrayMd;
|
|
||||||
|
|
||||||
trait TCompositeValue {
|
|
||||||
use TArrayMd;
|
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
private static $optional_keys;
|
|
||||||
|
|
||||||
protected function getOptionalKeys(): array {
|
|
||||||
$optionalKeys = self::$optional_keys;
|
|
||||||
if ($optionalKeys === null) {
|
|
||||||
$optionalKeys = self::$optional_keys = parent::getOptionalKeys();
|
|
||||||
}
|
|
||||||
return $optionalKeys;
|
|
||||||
}
|
|
||||||
|
|
||||||
function reset(?array $values): CompositeValue {
|
|
||||||
$this->md()->ensureSchema($values);
|
|
||||||
$this->data = $values;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use Iterator;
|
|
||||||
use nur\iter;
|
|
||||||
|
|
||||||
trait TLdapWalker {
|
|
||||||
function __construct(?LdapConn $conn=null, ?LdapSearch $search=null) {
|
|
||||||
parent::__construct(null, null, null, $conn);
|
|
||||||
if ($search !== null) $this->resetSearch($search);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var LdapSearch */
|
|
||||||
protected $search;
|
|
||||||
|
|
||||||
function resetSearch(LdapSearch $search): ILdapWalker {
|
|
||||||
$this->close();
|
|
||||||
$this->reset(null, null, $search->getAttrs());
|
|
||||||
$this->search = $search;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var Iterator */
|
|
||||||
protected $it;
|
|
||||||
|
|
||||||
protected function loadNext(): bool {
|
|
||||||
$it = $this->it;
|
|
||||||
if (!$it->valid()) {
|
|
||||||
$this->close();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$this->load($it->key(), $it->current());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function next(?bool &$found=null): bool {
|
|
||||||
if ($this->it === null) {
|
|
||||||
$this->it = $this->search->getIterator();
|
|
||||||
$this->it->rewind();
|
|
||||||
$updateFound = true;
|
|
||||||
} else {
|
|
||||||
$this->it->next();
|
|
||||||
$updateFound = false;
|
|
||||||
}
|
|
||||||
$haveNext = $this->loadNext();
|
|
||||||
if ($updateFound) $found = $haveNext;
|
|
||||||
return $haveNext;
|
|
||||||
}
|
|
||||||
|
|
||||||
function close(): void {
|
|
||||||
iter::close($this->it);
|
|
||||||
$this->it = null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\app;
|
|
||||||
|
|
||||||
use nur\cli\Application;
|
|
||||||
|
|
||||||
abstract class LdapApplication extends Application {
|
|
||||||
use TLdapApplication;
|
|
||||||
|
|
||||||
const LOAD_PARAMS = true;
|
|
||||||
|
|
||||||
const ARGS = [
|
|
||||||
"sections" => [
|
|
||||||
self::VERBOSITY_SECTION,
|
|
||||||
[
|
|
||||||
"title" => "CONNEXION LDAP",
|
|
||||||
["-C", "--config", "args" => "file"],
|
|
||||||
["-H", "--uri", "args" => 1],
|
|
||||||
["-D", "--binddn", "args" => 1],
|
|
||||||
["-w", "--password", "args" => 1],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\app;
|
|
||||||
|
|
||||||
use nur\ldap\LdapSearch;
|
|
||||||
use nur\ldap\LdapWalker;
|
|
||||||
use nur\sery\output\msg;
|
|
||||||
|
|
||||||
class LdapDeleteApp extends LdapApplication {
|
|
||||||
const ARGS = [
|
|
||||||
"merge" => parent::ARGS,
|
|
||||||
["-s", "--scope", "args" => 1],
|
|
||||||
["-b", "--searchbase", "args" => 1],
|
|
||||||
["-B", "--searchbase-exact", "args" => 1],
|
|
||||||
];
|
|
||||||
|
|
||||||
protected $scope;
|
|
||||||
protected $searchbase, $searchbaseExact;
|
|
||||||
protected $args;
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
$conn = $this->getConn();
|
|
||||||
|
|
||||||
$params = [];
|
|
||||||
LdapSearch::parse_args($params, $this->args
|
|
||||||
, $this->searchbase, $this->searchbaseExact
|
|
||||||
, $this->scope);
|
|
||||||
/** @var LdapWalker $lo */
|
|
||||||
$lo = $conn->search(null, $params);
|
|
||||||
while ($lo->next($first)) {
|
|
||||||
msg::action("Suppression $lo[dn]");
|
|
||||||
$lo->delete();
|
|
||||||
msg::asuccess();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\app;
|
|
||||||
|
|
||||||
class LdapGetInfosApp extends LdapApplication {
|
|
||||||
const ARGS = [
|
|
||||||
"merge" => parent::ARGS,
|
|
||||||
["-o", "--output", "args" => 1],
|
|
||||||
["-f", "--overwrite-shared", "value" => true],
|
|
||||||
["-u", "--update", "value" => true, "help" => "Mettre à jour le fichier de connexion (nécessite --config et implique --output et --overwrite-shared)"]
|
|
||||||
];
|
|
||||||
|
|
||||||
protected $output, $overwriteShared = false;
|
|
||||||
protected $update = false;
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
$conn = $this->getConn();
|
|
||||||
if ($this->update) {
|
|
||||||
$config = $this->config;
|
|
||||||
if ($config === null) {
|
|
||||||
self::die("Vous devez spécifier la configuration à mettre à jour");
|
|
||||||
}
|
|
||||||
$this->output = $config;
|
|
||||||
$this->overwriteShared = true;
|
|
||||||
}
|
|
||||||
$conn->saveConfig($this->output, $this->overwriteShared);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\app;
|
|
||||||
|
|
||||||
use nur\b\IllegalAccessException;
|
|
||||||
use nur\ldap\io\LdapWriter;
|
|
||||||
use nur\ldap\io\LdifWriter;
|
|
||||||
use nur\ldap\io\YamlWriter;
|
|
||||||
use nur\ldap\LdapSearch;
|
|
||||||
use nur\ldap\LdapWalker;
|
|
||||||
|
|
||||||
class LdapSearchApp extends LdapApplication {
|
|
||||||
const ARGS = [
|
|
||||||
"merge" => parent::ARGS,
|
|
||||||
["-s", "--scope", "args" => 1],
|
|
||||||
["-b", "--searchbase", "args" => 1],
|
|
||||||
["-B", "--searchbase-exact", "args" => 1],
|
|
||||||
["-o", "--output", "args" => "file"],
|
|
||||||
["group",
|
|
||||||
["-F", "--format", "args" => 1],
|
|
||||||
["--ldif", "dest" => "format", "value" => "ldif"],
|
|
||||||
["--yaml", "dest" => "format", "value" => "yaml"],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
protected $scope;
|
|
||||||
protected $searchbase, $searchbaseExact;
|
|
||||||
protected $output;
|
|
||||||
protected $format = "ldif";
|
|
||||||
protected $args;
|
|
||||||
|
|
||||||
function getWriter(): LdapWriter {
|
|
||||||
switch ($this->format) {
|
|
||||||
case "ldif":
|
|
||||||
case "l":
|
|
||||||
return new LdifWriter($this->output);
|
|
||||||
case "yaml":
|
|
||||||
case "y":
|
|
||||||
return new YamlWriter($this->output);
|
|
||||||
}
|
|
||||||
throw IllegalAccessException::unexpected_state();
|
|
||||||
}
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
$conn = $this->getConn();
|
|
||||||
|
|
||||||
$params = [];
|
|
||||||
LdapSearch::parse_args($params, $this->args
|
|
||||||
, $this->searchbase, $this->searchbaseExact
|
|
||||||
, $this->scope);
|
|
||||||
/** @var LdapWalker $lo */
|
|
||||||
$lo = $conn->search(null, $params);
|
|
||||||
$writer = null;
|
|
||||||
while ($lo->next($first)) {
|
|
||||||
if ($first) {
|
|
||||||
$first = false;
|
|
||||||
$writer = $this->getWriter();
|
|
||||||
}
|
|
||||||
$writer->write($lo);
|
|
||||||
}
|
|
||||||
if ($writer !== null) $writer->close();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\app;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\ldap\LdapConn;
|
|
||||||
|
|
||||||
trait TLdapApplication {
|
|
||||||
protected $config;
|
|
||||||
protected $uri, $binddn, $password;
|
|
||||||
|
|
||||||
protected function fixConfig(?string &$config): void {
|
|
||||||
}
|
|
||||||
|
|
||||||
function getConn(?array $supplParams=null): LdapConn {
|
|
||||||
$config = $this->config;
|
|
||||||
$this->fixConfig($config);
|
|
||||||
$loadParams = static::LOAD_PARAMS;
|
|
||||||
$autoconnect = $autofillParams = null;
|
|
||||||
if ($config === null) {
|
|
||||||
$params = [];
|
|
||||||
} else {
|
|
||||||
$params = require $config;
|
|
||||||
if (!$loadParams) $autoconnect = $autofillParams = false;
|
|
||||||
}
|
|
||||||
A::merge($params, A::filter_n([
|
|
||||||
"uri" => $this->uri,
|
|
||||||
"binddn" => $this->binddn,
|
|
||||||
"password" => $this->password,
|
|
||||||
"autoconnect" => $autoconnect,
|
|
||||||
"autofill_params" => $autofillParams,
|
|
||||||
]), $supplParams);
|
|
||||||
return new LdapConn($params);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,324 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\ldap\syntaxes\BinarySyntax;
|
|
||||||
use nur\ldap\syntaxes\BooleanSyntax;
|
|
||||||
use nur\ldap\syntaxes\DateSyntax;
|
|
||||||
use nur\ldap\syntaxes\IntegerSyntax;
|
|
||||||
use nur\ldap\syntaxes\MailSyntax;
|
|
||||||
use nur\ldap\syntaxes\PostalAddressSyntax;
|
|
||||||
use nur\ldap\syntaxes\PrintableSyntax;
|
|
||||||
use nur\ldap\syntaxes\StringSyntax;
|
|
||||||
use nur\ldap\syntaxes\TelephoneSyntax;
|
|
||||||
|
|
||||||
class consts {
|
|
||||||
/**
|
|
||||||
* @var array[] définitions connues des syntaxes, au cas où le serveur ne les
|
|
||||||
* retourne pas
|
|
||||||
*/
|
|
||||||
const KNOWN_SLAPD_SYNTAXES = [
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.4' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.4',
|
|
||||||
'desc' => 'Audio',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.5' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.5',
|
|
||||||
'desc' => 'Binary',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.6' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.6',
|
|
||||||
'desc' => 'Bit String',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.7' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.7',
|
|
||||||
'desc' => 'Boolean',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.8' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.8',
|
|
||||||
'desc' => 'Certificate',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => true,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.9' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.9',
|
|
||||||
'desc' => 'Certificate List',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => true,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.10' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.10',
|
|
||||||
'desc' => 'Certificate Pair',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => true,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.4203.666.11.10.2.1' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.4203.666.11.10.2.1',
|
|
||||||
'desc' => 'X.509 AttributeCertificate',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => true,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.12' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.12',
|
|
||||||
'desc' => 'Distinguished Name',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.2.36.79672281.1.5.0' => [
|
|
||||||
'oid' => '1.2.36.79672281.1.5.0',
|
|
||||||
'desc' => 'RDN',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.14' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.14',
|
|
||||||
'desc' => 'Delivery Method',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.15' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.15',
|
|
||||||
'desc' => 'Directory String',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.22' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.22',
|
|
||||||
'desc' => 'Facsimile Telephone Number',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.23' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.23',
|
|
||||||
'desc' => 'Fax image',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.24' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.24',
|
|
||||||
'desc' => 'Generalized Time',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.25' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.25',
|
|
||||||
'desc' => 'Guide',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.26' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.26',
|
|
||||||
'desc' => 'IA5 String',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.27' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.27',
|
|
||||||
'desc' => 'Integer',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.28' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.28',
|
|
||||||
'desc' => 'JPEG',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.34' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.34',
|
|
||||||
'desc' => 'Name And Optional UID',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.36' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.36',
|
|
||||||
'desc' => 'Numeric String',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.38' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.38',
|
|
||||||
'desc' => 'OID',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.39' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.39',
|
|
||||||
'desc' => 'Other Mailbox',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.40' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.40',
|
|
||||||
'desc' => 'Octet String',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.41' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.41',
|
|
||||||
'desc' => 'Postal Address',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.44' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.44',
|
|
||||||
'desc' => 'Printable String',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.11' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.11',
|
|
||||||
'desc' => 'Country String',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.45' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.45',
|
|
||||||
'desc' => 'SubtreeSpecification',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.49' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.49',
|
|
||||||
'desc' => 'Supported Algorithm',
|
|
||||||
'x_not_human_readable' => true,
|
|
||||||
'x_binary_transfer_required' => true,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.50' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.50',
|
|
||||||
'desc' => 'Telephone Number',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.51' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.51',
|
|
||||||
'desc' => 'Teletex Terminal Identifier',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.52' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.52',
|
|
||||||
'desc' => 'Telex Number',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.53' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.53',
|
|
||||||
'desc' => 'UTC Time',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.54' => [
|
|
||||||
'oid' => '1.3.6.1.4.1.1466.115.121.1.54',
|
|
||||||
'desc' => 'LDAP Syntax Description',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.1.1.0.0' => [
|
|
||||||
'oid' => '1.3.6.1.1.1.0.0',
|
|
||||||
'desc' => 'RFC2307 NIS Netgroup Triple',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.1.1.0.1' => [
|
|
||||||
'oid' => '1.3.6.1.1.1.0.1',
|
|
||||||
'desc' => 'RFC2307 Boot Parameter',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
'1.3.6.1.1.16.1' => [
|
|
||||||
'oid' => '1.3.6.1.1.16.1',
|
|
||||||
'desc' => 'UUID',
|
|
||||||
'x_not_human_readable' => false,
|
|
||||||
'x_binary_transfer_required' => false,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
const KNOWN_SYNTAX_CLASSES = [
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.4' => BinarySyntax::class, // audio
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.5' => BinarySyntax::class, // binary
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.6' => BinarySyntax::class, // bit string
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.7' => BooleanSyntax::class, // boolean
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.8' => BinarySyntax::class, // certificate
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.9' => BinarySyntax::class, // certificate list
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.10' => BinarySyntax::class, // certificate pair
|
|
||||||
'1.3.6.1.4.1.4203.666.11.10.2.1' => BinarySyntax::class, // X.509 AttributeCertificate
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.12' => StringSyntax::class, // DN
|
|
||||||
'1.2.36.79672281.1.5.0' => StringSyntax::class, // RDN
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.14' => StringSyntax::class, // delivery method
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.15' => StringSyntax::class, // directory string
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.22' => TelephoneSyntax::class, // fax number
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.24' => DateSyntax::class, // generalized time
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.26' => StringSyntax::class, // IA5 string
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.27' => IntegerSyntax::class, // integer
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.28' => BinarySyntax::class, // jpeg
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.34' => StringSyntax::class, // name and (opt.) oid
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.36' => IntegerSyntax::class, // numeric string
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.38' => StringSyntax::class, // oid
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.39' => MailSyntax::class, // other mailbox
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.40' => StringSyntax::class, // octet string
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.41' => PostalAddressSyntax::class, // postal address
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.44' => PrintableSyntax::class, // printable string
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.11' => StringSyntax::class, // country string
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.45' => StringSyntax::class, // subtree spec
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.49' => BinarySyntax::class, // supported algorithm
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.50' => TelephoneSyntax::class, // telephone number
|
|
||||||
'1.3.6.1.4.1.1466.115.121.1.52' => TelephoneSyntax::class, // telex number
|
|
||||||
'1.3.6.1.1.1.0.0' => StringSyntax::class, // RFC2307 NIS Netgroup Triple
|
|
||||||
'1.3.6.1.1.1.0.1' => StringSyntax::class, // RFC2307 Boot Parameter
|
|
||||||
'1.3.6.1.1.16.1' => StringSyntax::class, // uuid
|
|
||||||
];
|
|
||||||
|
|
||||||
const LDAP_CONTROL_CONSTANTS = [
|
|
||||||
# pas toutes ne sont définies en fonction de la version de PHP
|
|
||||||
"LDAP_CONTROL_MANAGEDSAIT",
|
|
||||||
"LDAP_CONTROL_PROXY_AUTHZ",
|
|
||||||
"LDAP_CONTROL_SUBENTRIES",
|
|
||||||
"LDAP_CONTROL_VALUESRETURNFILTER",
|
|
||||||
"LDAP_CONTROL_ASSERT",
|
|
||||||
"LDAP_CONTROL_PRE_READ",
|
|
||||||
"LDAP_CONTROL_POST_READ",
|
|
||||||
"LDAP_CONTROL_SORTREQUEST",
|
|
||||||
"LDAP_CONTROL_SORTRESPONSE",
|
|
||||||
"LDAP_CONTROL_PAGEDRESULTS",
|
|
||||||
"LDAP_CONTROL_SYNC",
|
|
||||||
"LDAP_CONTROL_SYNC_STATE",
|
|
||||||
"LDAP_CONTROL_SYNC_DONE",
|
|
||||||
"LDAP_CONTROL_DONTUSECOPY",
|
|
||||||
"LDAP_CONTROL_PASSWORDPOLICYREQUEST",
|
|
||||||
"LDAP_CONTROL_PASSWORDPOLICYRESPONSE",
|
|
||||||
"LDAP_CONTROL_X_INCREMENTAL_VALUES",
|
|
||||||
"LDAP_CONTROL_X_DOMAIN_SCOPE",
|
|
||||||
"LDAP_CONTROL_X_PERMISSIVE_MODIFY",
|
|
||||||
"LDAP_CONTROL_X_SEARCH_OPTIONS",
|
|
||||||
"LDAP_CONTROL_X_TREE_DELETE",
|
|
||||||
"LDAP_CONTROL_X_EXTENDED_DN",
|
|
||||||
"LDAP_CONTROL_VLVREQUEST",
|
|
||||||
"LDAP_CONTROL_VLVRESPONSE",
|
|
||||||
"LDAP_EXOP_MODIFY_PASSWD",
|
|
||||||
"LDAP_EXOP_REFRESH",
|
|
||||||
"LDAP_EXOP_START_TLS",
|
|
||||||
"LDAP_EXOP_TURN",
|
|
||||||
"LDAP_EXOP_WHO_AM_I",
|
|
||||||
"LDAP_CONTROL_AUTHZID_REQUEST",
|
|
||||||
"LDAP_CONTROL_AUTHZID_RESPONSE",
|
|
||||||
];
|
|
||||||
|
|
||||||
const ROOT_DSE_LITERALS = [
|
|
||||||
# Constantes non définies de façon normalisée
|
|
||||||
["1.3.6.1.1.8", "/*Cancel Extended Request*/ \"1.3.6.1.1.8\""],
|
|
||||||
["1.3.6.1.1.14", "/*Modify-Increment*/ \"1.3.6.1.1.14\""],
|
|
||||||
["1.3.6.1.4.1.4203.1.5.1", "/*All Op Attrs*/ \"1.3.6.1.4.1.4203.1.5.1\""],
|
|
||||||
["1.3.6.1.4.1.4203.1.5.2", "/*OC AD Lists*/ \"1.3.6.1.4.1.4203.1.5.2\""],
|
|
||||||
["1.3.6.1.4.1.4203.1.5.3", "/*LDAP Protocol Mechanism*/ \"1.3.6.1.4.1.4203.1.5.3\""],
|
|
||||||
["1.3.6.1.4.1.4203.1.5.4", "/*draft-zeilenga-ldap-rfc2596*/ \"1.3.6.1.4.1.4203.1.5.4\""],
|
|
||||||
["1.3.6.1.4.1.4203.1.5.5", "/*draft-zeilenga-ldap-rfc2596*/ \"1.3.6.1.4.1.4203.1.5.5\""],
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,98 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\str;
|
|
||||||
|
|
||||||
class filters {
|
|
||||||
private static function _escape(array $parts): string {
|
|
||||||
$op = false;
|
|
||||||
$first = true;
|
|
||||||
$fparts = [];
|
|
||||||
$index = 0;
|
|
||||||
foreach ($parts as $name => $part) {
|
|
||||||
if ($first) {
|
|
||||||
$first = false;
|
|
||||||
switch ($part) {
|
|
||||||
case "&": case "and": $op = "&"; break;
|
|
||||||
case "|": case "or": $op = "|"; break;
|
|
||||||
case "!": case "not": $op = "!"; break;
|
|
||||||
}
|
|
||||||
if ($op) {
|
|
||||||
if ($index === $name) $index++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($index === $name) {
|
|
||||||
# séquentiel
|
|
||||||
$index++;
|
|
||||||
if (is_array($part)) {
|
|
||||||
$fparts[] = self::_escape($part);
|
|
||||||
} else {
|
|
||||||
str::add_prefix($part, "(");
|
|
||||||
str::add_suffix($part, ")");
|
|
||||||
$fparts[] = $part;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
# associatif
|
|
||||||
$name = ldap_escape($name, "", LDAP_ESCAPE_FILTER);
|
|
||||||
foreach (A::with($part) as $value) {
|
|
||||||
$value = ldap_escape($value, "", LDAP_ESCAPE_FILTER);
|
|
||||||
$fparts[] = "($name=$value)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$filter = implode("", $fparts);
|
|
||||||
if (count($fparts) > 1 || $op === "!") {
|
|
||||||
if (!$op) $op = "&";
|
|
||||||
$filter = "($op$filter)";
|
|
||||||
}
|
|
||||||
return $filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function parse($filter): string {
|
|
||||||
if (!$filter) $filter = "objectClass=*";
|
|
||||||
return self::_escape(A::with($filter));
|
|
||||||
}
|
|
||||||
|
|
||||||
static function not(string $filter): string {
|
|
||||||
str::add_prefix($filter, "(");
|
|
||||||
str::add_suffix($filter, ")");
|
|
||||||
return "(!$filter)";
|
|
||||||
}
|
|
||||||
|
|
||||||
/** mettre en échappement ($attr$op$value) en ignorant les wildcards */
|
|
||||||
private static function _filter(string $name, string $op, string $value): string {
|
|
||||||
$name = ldap_escape($name, "*", LDAP_ESCAPE_FILTER);
|
|
||||||
$value = ldap_escape($value, "*", LDAP_ESCAPE_FILTER);
|
|
||||||
return "($name$op$value)";
|
|
||||||
}
|
|
||||||
|
|
||||||
static function exists(string $name): string {
|
|
||||||
return self::_filter($name, "=", "*");
|
|
||||||
}
|
|
||||||
|
|
||||||
static function eq(string $name, string $value): string {
|
|
||||||
return self::_filter($name, "=", $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function ge(string $name, string $value): string {
|
|
||||||
return self::_filter($name, ">=", $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function le(string $name, string $value): string {
|
|
||||||
return self::_filter($name, "<=", $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function gt(string $name, string $value): string {
|
|
||||||
return self::not(self::le($name, $value));
|
|
||||||
}
|
|
||||||
|
|
||||||
static function lt(string $name, string $value): string {
|
|
||||||
return self::not(self::ge($name, $value));
|
|
||||||
}
|
|
||||||
|
|
||||||
static function approx(string $name, string $value): string {
|
|
||||||
return self::_filter($name, "~=", $value);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\io;
|
|
||||||
|
|
||||||
use nur\b\io\IWriter;
|
|
||||||
use nur\ldap\LdapObject;
|
|
||||||
use nur\writer;
|
|
||||||
|
|
||||||
abstract class LdapWriter {
|
|
||||||
static function write_object($output, LdapObject $object, ?array $names=null): void {
|
|
||||||
$writer = new static($output);
|
|
||||||
$writer->write($object, $names);
|
|
||||||
$writer->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
function __construct($output=null) {
|
|
||||||
$this->writer = writer::with($output);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var IWriter */
|
|
||||||
protected $writer;
|
|
||||||
|
|
||||||
function close(): void {
|
|
||||||
$this->writer->close();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\io;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\ldap\LdapObject;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LdifWriter
|
|
||||||
*/
|
|
||||||
class LdifWriter extends LdapWriter {
|
|
||||||
function write(?LdapObject $object, ?array $names=null): self {
|
|
||||||
if ($object !== null) {
|
|
||||||
$writer = $this->writer;
|
|
||||||
if ($names === null) $names = $object->keys();
|
|
||||||
if (!in_array("dn", $names)) {
|
|
||||||
A::insert($names, 0, "dn");
|
|
||||||
}
|
|
||||||
foreach ($names as $name) {
|
|
||||||
$values = $object->_get($name)->array();
|
|
||||||
if ($values !== null) {
|
|
||||||
foreach ($values as $value) {
|
|
||||||
$writer->wnl("$name: $value");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$writer->wnl();
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\io;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\ldap\LdapObject;
|
|
||||||
use nur\yaml;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class YamlWriter
|
|
||||||
*/
|
|
||||||
class YamlWriter extends LdapWriter {
|
|
||||||
function write(?LdapObject $object, ?array $names=null): self {
|
|
||||||
if ($object !== null) {
|
|
||||||
if ($names === null) $names = $object->keys();
|
|
||||||
if (!in_array("dn", $names)) {
|
|
||||||
A::insert($names, 0, "dn");
|
|
||||||
}
|
|
||||||
$values = [];
|
|
||||||
foreach ($names as $name) {
|
|
||||||
$value = $object->all($name);
|
|
||||||
if (count($value) == 1) $value = $value[0];
|
|
||||||
$values[$name] = $value;
|
|
||||||
}
|
|
||||||
$writer = $this->writer;
|
|
||||||
$writer->wnl(yaml::with($values));
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\str;
|
|
||||||
|
|
||||||
class labels {
|
|
||||||
static function strip(?string &$value, ?string &$label=null): void {
|
|
||||||
if ($value === null) return;
|
|
||||||
if (preg_match('/^(\{[^}]*})/', $value, $ms, PREG_OFFSET_CAPTURE)) {
|
|
||||||
$label = $ms[1][0];
|
|
||||||
$value = substr($value, $ms[1][1] + strlen($label));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static function add(?string $value, ?string $label): ?string {
|
|
||||||
if ($value === null) return null;
|
|
||||||
if ($label !== null) {
|
|
||||||
str::add_prefix($label, "{");
|
|
||||||
str::add_suffix($label, "}");
|
|
||||||
}
|
|
||||||
return "$label$value";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,160 +0,0 @@
|
||||||
<?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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\ValueException;
|
|
||||||
use nur\path;
|
|
||||||
|
|
||||||
class ldap_config {
|
|
||||||
static function get_shared_file(string $uri): string {
|
|
||||||
if ($uri == "ldapi://") {
|
|
||||||
$file = "ldapi__.ldaphost";
|
|
||||||
} else {
|
|
||||||
$parts = parse_url($uri);
|
|
||||||
if ($parts === false) throw ValueException::invalid_value($uri, "uri");
|
|
||||||
$scheme = A::get($parts, "scheme", "ldap");
|
|
||||||
$host = A::get($parts, "host");
|
|
||||||
$port = A::get($parts, "port");
|
|
||||||
if ($port === null) {
|
|
||||||
if ($scheme === "ldap") $port = 389;
|
|
||||||
elseif ($scheme === "ldaps") $port = 636;
|
|
||||||
}
|
|
||||||
$file = "${scheme}_${host}_${port}.ldaphost";
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function get_file(string $file, ?string $profile=null): string {
|
|
||||||
if (!path::is_qualified($file) && !path::have_ext($file)) {
|
|
||||||
if ($profile !== null) $file .= ".$profile";
|
|
||||||
$file .= ".ldapconf";
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,66 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\ValueException;
|
|
||||||
use nur\config;
|
|
||||||
use nur\path;
|
|
||||||
use nur\sery\output\msg;
|
|
||||||
use nur\SL;
|
|
||||||
|
|
||||||
abstract class ldap_server {
|
|
||||||
const NAME = null;
|
|
||||||
|
|
||||||
protected static function name(?string $suffix=null): string {
|
|
||||||
$name = static::NAME;
|
|
||||||
if ($suffix !== null) {
|
|
||||||
$name .= "_";
|
|
||||||
$name .= $suffix;
|
|
||||||
}
|
|
||||||
return $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static function map_profile(string $profile): string {
|
|
||||||
$profile_map = config::k(self::name("profile_map"));
|
|
||||||
return A::get($profile_map, $profile, $profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
static $profile;
|
|
||||||
|
|
||||||
/** obtenir le profil LDAP courant */
|
|
||||||
static function get_profile(): string {
|
|
||||||
$profile = self::$profile;
|
|
||||||
if ($profile === null) {
|
|
||||||
if ($profile === null) $profile = config::k(self::name("profile"));
|
|
||||||
if ($profile === null) $profile = self::map_profile(config::get_profile());
|
|
||||||
self::$profile = $profile;
|
|
||||||
}
|
|
||||||
return $profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** spécifier le profil LDAP courant */
|
|
||||||
static function set_profile(?string $profile): void {
|
|
||||||
if ($profile === null) $profile = config::get_profile();
|
|
||||||
self::$profile = self::map_profile($profile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** adapter le chemin vers le fichier de configuration */
|
|
||||||
protected static function fix_path(string $config): string {
|
|
||||||
return $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function conn(?array $config=null, ?string $profile=null): LdapConn {
|
|
||||||
if ($profile === null) $profile = self::get_profile();
|
|
||||||
$name = self::name();
|
|
||||||
msg::debug("Profil $name: $profile");
|
|
||||||
$configFile = static::fix_path(ldap_config::get_file($name, $profile));
|
|
||||||
if (!file_exists($configFile)) {
|
|
||||||
$configname = path::filename($configFile);
|
|
||||||
throw new ValueException("$name: profil LDAP invalide (fichier '$configname' non trouvé)");
|
|
||||||
}
|
|
||||||
return new LdapConn(array_merge(...SL::filter_n([
|
|
||||||
require $configFile,
|
|
||||||
$config,
|
|
||||||
])));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,91 +0,0 @@
|
||||||
<?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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\ldap\schemas\SchemaManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class scheman: gestionnaire de schéma global partagé
|
|
||||||
*
|
|
||||||
* Cette classe ne peut être utilisée correctement que pour une seule instance
|
|
||||||
* de {@link LdapConn}
|
|
||||||
*/
|
|
||||||
class scheman {
|
|
||||||
/** @var SchemaManager */
|
|
||||||
protected static $scheman;
|
|
||||||
|
|
||||||
static function init(LdapConn $conn, ?array $overrides=null): void {
|
|
||||||
self::$scheman = new SchemaManager($conn, $overrides);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function autogen_schema(array $objectClasses): array {
|
|
||||||
return self::$scheman->autogenSchema($objectClasses);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function autogen_properties(array $schema): array {
|
|
||||||
return self::$scheman->autogenProperties($schema);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function autogen_methods(array $schema): array {
|
|
||||||
return self::$scheman->autogenMethods($schema);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,247 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\schemas;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\IllegalAccessException;
|
|
||||||
use nur\b\ValueException;
|
|
||||||
use nur\data\types\md_utils;
|
|
||||||
use nur\data\types\Metadata;
|
|
||||||
use nur\ldap\consts;
|
|
||||||
use nur\ldap\LdapAttr;
|
|
||||||
use nur\ldap\LdapConn;
|
|
||||||
use nur\ldap\syntaxes\BinarySyntax;
|
|
||||||
use nur\ldap\syntaxes\StringSyntax;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class LdapSchemaExtractor: extracteur de schéma LDAP, pour utilisation avec
|
|
||||||
* PHP
|
|
||||||
*/
|
|
||||||
class LdapSchemaExtractor {
|
|
||||||
function __construct(?array $schemaInfos=null) {
|
|
||||||
if ($schemaInfos !== null) {
|
|
||||||
[
|
|
||||||
"ldap_syntaxes" => $this->ldapSyntaxes,
|
|
||||||
"attribute_types" => $this->attributeTypes,
|
|
||||||
"object_classes" => $this->objectClasses,
|
|
||||||
] = $schemaInfos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected $ldapSyntaxes;
|
|
||||||
|
|
||||||
protected $attributeTypes;
|
|
||||||
|
|
||||||
protected $objectClasses;
|
|
||||||
|
|
||||||
function loadSchema(LdapConn $conn): array {
|
|
||||||
$schema = null;
|
|
||||||
$schemaDn = $conn->getRootDse()->first("subschemaSubentry");
|
|
||||||
if ($schemaDn !== null) {
|
|
||||||
$schema = $conn->empty()->load($schemaDn, $conn->_search($schemaDn, [
|
|
||||||
"suffix" => "",
|
|
||||||
"attrs" => [
|
|
||||||
"ldapSyntaxes",
|
|
||||||
"attributeTypes",
|
|
||||||
"objectClasses",
|
|
||||||
],
|
|
||||||
"scope" => "base",
|
|
||||||
])->first());
|
|
||||||
}
|
|
||||||
if ($schema === null) {
|
|
||||||
throw new IllegalAccessException("unable to find subschemaSubentry attribute");
|
|
||||||
}
|
|
||||||
|
|
||||||
$parser = new LseSyntax();
|
|
||||||
$ldapSyntaxes = [];
|
|
||||||
foreach ($schema->get("ldapSyntaxes", []) as $ldapSyntax) {
|
|
||||||
$ldapSyntax = $parser->parse($ldapSyntax);
|
|
||||||
$ldapSyntaxes[$ldapSyntax["oid"]] = $ldapSyntax;
|
|
||||||
}
|
|
||||||
$parser = new LseAttribute();
|
|
||||||
$attributeTypes = [];
|
|
||||||
foreach ($schema->get("attributeTypes", []) as $attributeType) {
|
|
||||||
$attributeType = $parser->parse($attributeType);
|
|
||||||
$attributeTypes[$attributeType["oid"]] = $attributeType;
|
|
||||||
}
|
|
||||||
$parser = new LseObjectClass();
|
|
||||||
$objectClasses = [];
|
|
||||||
foreach ($schema->get("objectClasses", []) as $objectClass) {
|
|
||||||
$objectClass = $parser->parse($objectClass);
|
|
||||||
$objectClasses[$objectClass["oid"]] = $objectClass;
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
"ldap_syntaxes" => $this->ldapSyntaxes = $ldapSyntaxes,
|
|
||||||
"attribute_types" => $this->attributeTypes = $attributeTypes,
|
|
||||||
"object_classes" => $this->objectClasses = $objectClasses,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected $syntaxes;
|
|
||||||
protected $attributes;
|
|
||||||
protected $canonAttrs;
|
|
||||||
protected $classes;
|
|
||||||
protected $canonClasses;
|
|
||||||
|
|
||||||
function init(): array {
|
|
||||||
## calculer la liste des syntaxes, et les classer par OID
|
|
||||||
$ldapSyntaxes = $this->ldapSyntaxes;
|
|
||||||
# rajouter une liste connue de syntaxes
|
|
||||||
A::merge($ldapSyntaxes, consts::KNOWN_SLAPD_SYNTAXES);
|
|
||||||
$syntaxes = [];
|
|
||||||
foreach ($ldapSyntaxes as $syntax) {
|
|
||||||
$oid = $syntax["oid"];
|
|
||||||
# si la syntaxe a déjà été définie, ignorer
|
|
||||||
if (array_key_exists($oid, $syntaxes)) continue;
|
|
||||||
$class = A::get(consts::KNOWN_SYNTAX_CLASSES, $oid);
|
|
||||||
if ($class === null) {
|
|
||||||
$binary = $syntax["x_not_human_readable"] || $syntax["x_binary_transfer_required"];
|
|
||||||
$class = $binary? BinarySyntax::class: StringSyntax::class;
|
|
||||||
}
|
|
||||||
$syntax["class"] = $class;
|
|
||||||
$syntaxes[$oid] = $syntax;
|
|
||||||
}
|
|
||||||
|
|
||||||
## calculer la liste des attributs, et les classer par nom canonique
|
|
||||||
$attributes = [];
|
|
||||||
$canonAttrs = [];
|
|
||||||
foreach ($this->attributeTypes as $attribute) {
|
|
||||||
$names = $attribute["names"];
|
|
||||||
$canonName = $names[0];
|
|
||||||
$attribute["name"] = $canonName;
|
|
||||||
foreach ($names as $name) {
|
|
||||||
$canonAttrs[strtolower($name)] = $canonName;
|
|
||||||
}
|
|
||||||
$attribute["class"] = A::_pget($syntaxes, [$attribute["syntax"], "class"]);
|
|
||||||
$attributes[strtolower($canonName)] = $attribute;
|
|
||||||
}
|
|
||||||
# résoudre l'héritage des attributs
|
|
||||||
foreach ($attributes as &$attribute) {
|
|
||||||
foreach ($attribute["sups"] as $sup) {
|
|
||||||
$sup = strtolower(A::get($canonAttrs, strtolower($sup), $sup));
|
|
||||||
A::update_n($attribute, $attributes[$sup]);
|
|
||||||
}
|
|
||||||
}; unset($attribute);
|
|
||||||
# puis mettre à false les valeurs booléennes nulles
|
|
||||||
foreach ($attributes as &$attribute) {
|
|
||||||
foreach (LseAttribute::BOOL_ATTRS as $name) {
|
|
||||||
$attribute[$name] = boolval($attribute[$name]);
|
|
||||||
}
|
|
||||||
}; unset($attribute);
|
|
||||||
|
|
||||||
## calculer la liste des classes, et les classer par nom canonique.
|
|
||||||
## les noms des attributs sont aussi canonisés
|
|
||||||
$classes = [];
|
|
||||||
$canonClasses = [];
|
|
||||||
foreach ($this->objectClasses as $class) {
|
|
||||||
$names = $class["names"];
|
|
||||||
$canonName = $names[0];
|
|
||||||
$class["name"] = $canonName;
|
|
||||||
foreach ($names as $name) {
|
|
||||||
$canonClasses[strtolower($name)] = $canonName;
|
|
||||||
}
|
|
||||||
$musts = A::with($class["musts"]);
|
|
||||||
foreach ($musts as &$name) {
|
|
||||||
$name = A::get($canonAttrs, strtolower($name), $name);
|
|
||||||
}; unset($name);
|
|
||||||
$class["musts"] = $musts;
|
|
||||||
$mays = A::with($class["mays"]);
|
|
||||||
foreach ($mays as &$name) {
|
|
||||||
$name = A::get($canonAttrs, strtolower($name), $name);
|
|
||||||
}; unset($name);
|
|
||||||
$class["mays"] = $mays;
|
|
||||||
$class["attrs"] = array_merge($musts, $mays);
|
|
||||||
$classes[strtolower($canonName)] = $class;
|
|
||||||
}
|
|
||||||
# résoudre l'héritage des classes
|
|
||||||
foreach ($classes as &$class) {
|
|
||||||
foreach ($class["sups"] as $sup) {
|
|
||||||
$sup = strtolower(A::get($canonAttrs, strtolower($sup), $sup));
|
|
||||||
$sup = $classes[$sup];
|
|
||||||
A::update_n($class, $sup);
|
|
||||||
A::merge($class["musts"], $sup["musts"]);
|
|
||||||
A::merge($class["mays"], $sup["mays"]);
|
|
||||||
}
|
|
||||||
}; unset($class);
|
|
||||||
|
|
||||||
## fin de l'initialisation
|
|
||||||
return [
|
|
||||||
"syntaxes" => $this->syntaxes = $syntaxes,
|
|
||||||
"attributes" => $this->attributes = $attributes,
|
|
||||||
"canon_attrs" => $this->canonAttrs = $canonAttrs,
|
|
||||||
"classes" => $this->classes = $classes,
|
|
||||||
"canon_classes" => $this->canonClasses = $canonClasses,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
const getAttributes_overrides_SCHEMA = [
|
|
||||||
"name" => "string",
|
|
||||||
"class" => "?string",
|
|
||||||
"set" => "?int",
|
|
||||||
"reset" => "?int",
|
|
||||||
];
|
|
||||||
/** @var Metadata */
|
|
||||||
private static $getAttributes_overrides_md;
|
|
||||||
|
|
||||||
function getAttributes(array $objectClasses, ?array $overrides=null): array {
|
|
||||||
if ($overrides !== null) {
|
|
||||||
$tmp = [];
|
|
||||||
foreach ($overrides as $name => $override) {
|
|
||||||
$attribute = ValueException::check_nn(
|
|
||||||
A::get($this->attributes, strtolower($name))
|
|
||||||
, "$name: attribut non défini");
|
|
||||||
$tmp[$attribute["name"]] = $override;
|
|
||||||
}
|
|
||||||
$overrides = $tmp;
|
|
||||||
$md = md_utils::ensure_md(self::$getAttributes_overrides_md, self::getAttributes_overrides_SCHEMA);
|
|
||||||
$md->eachEnsureSchema($overrides);
|
|
||||||
}
|
|
||||||
|
|
||||||
$nameRequired = [];
|
|
||||||
foreach ($objectClasses as $name) {
|
|
||||||
$name = A::get($this->canonClasses, strtolower($name), $name);
|
|
||||||
$class = ValueException::check_nn(
|
|
||||||
A::get($this->classes, strtolower($name))
|
|
||||||
, "$name: classe non définie");
|
|
||||||
foreach ($class["musts"] as $must) {
|
|
||||||
$nameRequired[$must] = true;
|
|
||||||
}
|
|
||||||
foreach ($class["mays"] as $may) {
|
|
||||||
A::replace_nx($nameRequired, $may, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$attributes = [
|
|
||||||
"dn" => [
|
|
||||||
"name" => "dn",
|
|
||||||
"class" => StringSyntax::class,
|
|
||||||
"flags" => LdapAttr::MONOVALUED,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
foreach ($nameRequired as $name => $required) {
|
|
||||||
$lname = strtolower($name);
|
|
||||||
$attribute = ValueException::check_nn(
|
|
||||||
A::get($this->attributes, $lname)
|
|
||||||
, "$name: attribut non défini");
|
|
||||||
$syntax = ValueException::check_nn(
|
|
||||||
A::get($this->syntaxes, $attribute["syntax"])
|
|
||||||
, "$attribute[syntax]: syntaxe non définie");
|
|
||||||
$class = $attribute["class"];
|
|
||||||
$monovalued = $attribute["single_value"]? LdapAttr::MONOVALUED: 0;
|
|
||||||
$binary = $syntax["x_binary_transfer_required"]? LdapAttr::BINARY: 0;
|
|
||||||
$ordered = $attribute["x_ordered"]? LdapAttr::ORDERED: 0;
|
|
||||||
$notHumanReadable = $syntax["x_not_human_readable"]? LdapAttr::NOT_HUMAN_READABLE: 0;
|
|
||||||
$flags = $monovalued + $binary + $ordered + $notHumanReadable;
|
|
||||||
$override = A::get($overrides, $name);
|
|
||||||
if ($override !== null) {
|
|
||||||
if ($override["class"] !== null) $class = $override["class"];
|
|
||||||
if ($override["set"] !== null) $flags = $flags | $override["set"];
|
|
||||||
if ($override["reset"] !== null) $flags = $flags & ~$override["reset"];
|
|
||||||
}
|
|
||||||
$attributes[$lname] = [
|
|
||||||
"name" => $name,
|
|
||||||
"class" => $class,
|
|
||||||
"flags" => $flags,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return $attributes;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\schemas;
|
|
||||||
|
|
||||||
use nur\sery\output\log;
|
|
||||||
|
|
||||||
class LseAttribute extends LseParser {
|
|
||||||
protected $data;
|
|
||||||
|
|
||||||
const BOOL_ATTRS = [
|
|
||||||
"single_value",
|
|
||||||
"no_user_modification",
|
|
||||||
"x_ordered",
|
|
||||||
"obsolete",
|
|
||||||
];
|
|
||||||
|
|
||||||
protected function reset(): array {
|
|
||||||
return $this->data = [
|
|
||||||
"oid" => null,
|
|
||||||
"names" => [],
|
|
||||||
"desc" => null,
|
|
||||||
"sups" => [],
|
|
||||||
"equality" => null,
|
|
||||||
"substr" => null,
|
|
||||||
"ordering" => null,
|
|
||||||
"syntax" => null,
|
|
||||||
"single_value" => null,
|
|
||||||
"no_user_modification" => null,
|
|
||||||
"usage" => null,
|
|
||||||
"x_ordered" => null,
|
|
||||||
"x_origin" => null,
|
|
||||||
"obsolete" => null,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse(?string $s=null): array {
|
|
||||||
if ($s !== null) $this->s = $s;
|
|
||||||
$data = $this->reset();
|
|
||||||
$this->skipLiteral('(');
|
|
||||||
$data["oid"] = self::fix_oid($this->parseName());
|
|
||||||
while ($this->isName()) {
|
|
||||||
$okey = $this->parseName();
|
|
||||||
$key = str_replace("-", "_", strtolower($okey));
|
|
||||||
switch ($key) {
|
|
||||||
case "name":
|
|
||||||
$data["${key}s"] = $this->parseStrings();
|
|
||||||
break;
|
|
||||||
case "sup":
|
|
||||||
$data["${key}s"] = $this->parseNames();
|
|
||||||
break;
|
|
||||||
case "desc":
|
|
||||||
case "x_ordered":
|
|
||||||
case "x_origin":
|
|
||||||
$data[$key] = $this->parseString();
|
|
||||||
break;
|
|
||||||
case "equality":
|
|
||||||
case "substr":
|
|
||||||
case "ordering":
|
|
||||||
case "usage":
|
|
||||||
$data[$key] = $this->parseName();
|
|
||||||
break;
|
|
||||||
case "syntax":
|
|
||||||
$data[$key] = self::fix_oid($this->parseName());
|
|
||||||
break;
|
|
||||||
case "single_value":
|
|
||||||
case "no_user_modification":
|
|
||||||
case "obsolete":
|
|
||||||
$data[$key] = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log::warning("unknown key $okey in |$s|");
|
|
||||||
$data["unknown_keys"][] = $okey;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->skipLiteral(')');
|
|
||||||
# ne pas mettre de suite les valeurs false: elle sont mises à jour dans
|
|
||||||
# LdapSchemaExtractor
|
|
||||||
## puis mettre à jour les valeurs booléennes
|
|
||||||
#foreach (self::BOOL_ATTRS as $name) {
|
|
||||||
# $data[$name] = boolval($data[$name]);
|
|
||||||
#}
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\schemas;
|
|
||||||
|
|
||||||
use nur\sery\output\log;
|
|
||||||
|
|
||||||
class LseObjectClass extends LseParser {
|
|
||||||
const BOOL_ATTRS = [];
|
|
||||||
|
|
||||||
protected $data;
|
|
||||||
|
|
||||||
protected function reset(): array {
|
|
||||||
return $this->data = [
|
|
||||||
"oid" => null,
|
|
||||||
"names" => [],
|
|
||||||
"desc" => null,
|
|
||||||
"sups" => [],
|
|
||||||
"type" => null,
|
|
||||||
"musts" => null,
|
|
||||||
"mays" => null,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse(?string $s=null): array {
|
|
||||||
if ($s !== null) $this->s = $s;
|
|
||||||
$data = $this->reset();
|
|
||||||
$this->skipLiteral('(');
|
|
||||||
$data["oid"] = self::fix_oid($this->parseName());
|
|
||||||
while ($this->isName()) {
|
|
||||||
$okey = $this->parseName();
|
|
||||||
$key = str_replace("-", "_", strtolower($okey));
|
|
||||||
switch ($key) {
|
|
||||||
case "name":
|
|
||||||
$data["${key}s"] = $this->parseStrings();
|
|
||||||
break;
|
|
||||||
case "sup":
|
|
||||||
case "must":
|
|
||||||
case "may":
|
|
||||||
$data["${key}s"] = $this->parseNames();
|
|
||||||
break;
|
|
||||||
case "desc":
|
|
||||||
$data[$key] = $this->parseString();
|
|
||||||
break;
|
|
||||||
case "abstract":
|
|
||||||
case "structural":
|
|
||||||
case "auxiliary":
|
|
||||||
$data["type"] = $key;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log::warning("unknown key $okey in |$s|");
|
|
||||||
$data["unknown_keys"][] = $okey;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->skipLiteral(')');
|
|
||||||
# puis mettre à jour les valeurs booléennes
|
|
||||||
foreach (self::BOOL_ATTRS as $name) {
|
|
||||||
$data[$name] = boolval($data[$name]);
|
|
||||||
}
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,119 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\schemas;
|
|
||||||
|
|
||||||
use nur\b\ValueException;
|
|
||||||
|
|
||||||
class LseParser {
|
|
||||||
/** supprimer le {size} à la fin d'un OID */
|
|
||||||
protected static function fix_oid(string $oid): string {
|
|
||||||
return preg_replace('/\{\d+}$/', "", $oid);
|
|
||||||
}
|
|
||||||
|
|
||||||
function __construct(?string $s=null) {
|
|
||||||
$this->s = $s;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function expected(string $expected): ValueException {
|
|
||||||
return new ValueException("expected $expected, got $this->s");
|
|
||||||
}
|
|
||||||
protected function unexpected(string $value): ValueException {
|
|
||||||
return new ValueException("unexpected $value");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected $s;
|
|
||||||
|
|
||||||
#~~~~
|
|
||||||
|
|
||||||
const SPACES_PATTERN = '/^\s+/';
|
|
||||||
|
|
||||||
protected function skipSpaces(): void {
|
|
||||||
if (preg_match(self::SPACES_PATTERN, $this->s, $ms)) {
|
|
||||||
$this->s = substr($this->s, strlen($ms[0]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#~~~~
|
|
||||||
protected function isLiteral(string $literal): bool {
|
|
||||||
return substr($this->s, 0, strlen($literal)) === $literal;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function skipLiteral(string $literal): void {
|
|
||||||
$pos = strlen($literal);
|
|
||||||
if (substr($this->s, 0, $pos) === $literal) {
|
|
||||||
$this->s = substr($this->s, $pos);
|
|
||||||
} else {
|
|
||||||
throw $this->expected($literal);
|
|
||||||
}
|
|
||||||
$this->skipSpaces();
|
|
||||||
}
|
|
||||||
|
|
||||||
#~~~~
|
|
||||||
|
|
||||||
const NAME_PATTERN = '/^\S+/';
|
|
||||||
|
|
||||||
protected function isName(): bool {
|
|
||||||
if (!preg_match(self::NAME_PATTERN, $this->s, $ms)) return false;
|
|
||||||
$name = $ms[0];
|
|
||||||
return !in_array($name, ['(', ')', '$']);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function parseName(): string {
|
|
||||||
if (!preg_match(self::NAME_PATTERN, $this->s, $ms)) {
|
|
||||||
throw $this->expected("<NAME>");
|
|
||||||
}
|
|
||||||
$name = $ms[0];
|
|
||||||
$this->s = substr($this->s, strlen($name));
|
|
||||||
$this->skipSpaces();
|
|
||||||
return $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
#~~~~
|
|
||||||
|
|
||||||
const STRING_PATTERN = "/^'([^']*)'/";
|
|
||||||
|
|
||||||
protected function isString(): bool {
|
|
||||||
return preg_match(self::STRING_PATTERN, $this->s, $ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function parseString(): string {
|
|
||||||
if (!preg_match(self::STRING_PATTERN, $this->s, $ms)) {
|
|
||||||
throw $this->expected("<STRING>");
|
|
||||||
}
|
|
||||||
$this->s = substr($this->s, strlen($ms[0]));
|
|
||||||
$this->skipSpaces();
|
|
||||||
return $ms[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
#~~~~
|
|
||||||
|
|
||||||
protected function parseNames(): array {
|
|
||||||
if ($this->isName()) return [$this->parseName()];
|
|
||||||
$names = [];
|
|
||||||
if ($this->isLiteral('(')) {
|
|
||||||
$this->skipLiteral('(');
|
|
||||||
while ($this->isName()) {
|
|
||||||
$names[] = $this->parseName();
|
|
||||||
if ($this->isLiteral('$')) $this->skipLiteral('$');
|
|
||||||
}
|
|
||||||
$this->skipLiteral(')');
|
|
||||||
} else {
|
|
||||||
$names[] = $this->parseName();
|
|
||||||
}
|
|
||||||
return $names;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function parseStrings(): array {
|
|
||||||
if ($this->isString()) return [$this->parseString()];
|
|
||||||
$strings = [];
|
|
||||||
if ($this->isLiteral('(')) {
|
|
||||||
$this->skipLiteral('(');
|
|
||||||
while ($this->isString()) {
|
|
||||||
$strings[] = $this->parseString();
|
|
||||||
}
|
|
||||||
$this->skipLiteral(')');
|
|
||||||
} else {
|
|
||||||
$strings[] = $this->parseString();
|
|
||||||
}
|
|
||||||
return $strings;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\schemas;
|
|
||||||
|
|
||||||
use nur\sery\output\log;
|
|
||||||
|
|
||||||
class LseSyntax extends LseParser {
|
|
||||||
const BOOL_ATTRS = [
|
|
||||||
"x_not_human_readable",
|
|
||||||
"x_binary_transfer_required",
|
|
||||||
];
|
|
||||||
|
|
||||||
protected $data;
|
|
||||||
|
|
||||||
protected function reset(): array {
|
|
||||||
return $this->data = [
|
|
||||||
"oid" => null,
|
|
||||||
"desc" => null,
|
|
||||||
"x_not_human_readable" => null,
|
|
||||||
"x_binary_transfer_required" => null,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse(?string $s=null): array {
|
|
||||||
if ($s !== null) $this->s = $s;
|
|
||||||
$data =$this->reset();
|
|
||||||
$this->skipLiteral('(');
|
|
||||||
$data["oid"] = self::fix_oid($this->parseName());
|
|
||||||
while ($this->isName()) {
|
|
||||||
$okey = $this->parseName();
|
|
||||||
$key = str_replace("-", "_", strtolower($okey));
|
|
||||||
switch ($key) {
|
|
||||||
case "desc":
|
|
||||||
$data[$key] = $this->parseString();
|
|
||||||
break;
|
|
||||||
case "x_not_human_readable":
|
|
||||||
case "x_binary_transfer_required":
|
|
||||||
$data[$key] = boolval($this->parseString());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log::warning("unknown key $okey in $s");
|
|
||||||
$data["unknown_keys"][] = $okey;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->skipLiteral(')');
|
|
||||||
# puis mettre à jour les valeurs booléennes
|
|
||||||
foreach (self::BOOL_ATTRS as $name) {
|
|
||||||
$data[$name] = boolval($data[$name]);
|
|
||||||
}
|
|
||||||
return $this->data = $data;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,81 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\schemas;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\func;
|
|
||||||
use nur\ldap\LdapAttr;
|
|
||||||
use nur\ldap\LdapConn;
|
|
||||||
use nur\ldap\syntaxes\AbstractSyntax;
|
|
||||||
use nur\ldap\syntaxes\CompositeSyntax;
|
|
||||||
use nur\php\Autogen;
|
|
||||||
|
|
||||||
class SchemaManager {
|
|
||||||
function __construct(LdapConn $conn, ?array $overrides=null) {
|
|
||||||
$lse = new LdapSchemaExtractor($conn->getSchemaInfos());
|
|
||||||
$lse->init();
|
|
||||||
$this->lse = $lse;
|
|
||||||
$this->overrides = $overrides;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var LdapSchemaExtractor */
|
|
||||||
protected $lse;
|
|
||||||
|
|
||||||
/** @var array|null */
|
|
||||||
protected $overrides;
|
|
||||||
|
|
||||||
function getAttributes(array $objectClasses): array {
|
|
||||||
return $this->lse->getAttributes($objectClasses, $this->overrides);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var AbstractSyntax[] */
|
|
||||||
protected $syntaxes;
|
|
||||||
|
|
||||||
function getSyntax($class): AbstractSyntax {
|
|
||||||
if (is_array($class)) return func::cons(...$class);
|
|
||||||
$syntax = A::get($this->syntaxes, $class);
|
|
||||||
if ($syntax === null) {
|
|
||||||
$syntax = $this->syntaxes[$class] = func::cons($class);
|
|
||||||
}
|
|
||||||
return $syntax;
|
|
||||||
}
|
|
||||||
|
|
||||||
function autogenSchema(array $objectClasses): array {
|
|
||||||
return $this->getAttributes($objectClasses);
|
|
||||||
}
|
|
||||||
|
|
||||||
static function fix_type(AbstractSyntax $syntax, bool $monovalued): array {
|
|
||||||
if ($syntax instanceof CompositeSyntax) {
|
|
||||||
if ($monovalued) $phpType = $syntax->getPhpType();
|
|
||||||
else $phpType = $syntax->getAttrClass();
|
|
||||||
} else {
|
|
||||||
$phpType = $syntax->getPhpType();
|
|
||||||
if (!$monovalued) $phpType .= "[]";
|
|
||||||
}
|
|
||||||
return Autogen::fix_type($phpType);
|
|
||||||
}
|
|
||||||
|
|
||||||
function autogenProperties(array $schema): array {
|
|
||||||
$properties = [];
|
|
||||||
foreach ($schema as $attribute) {
|
|
||||||
$name = $attribute["name"];
|
|
||||||
/** @var AbstractSyntax $syntax */
|
|
||||||
$syntax = $this->getSyntax($attribute["class"]);
|
|
||||||
$monovalued = ($attribute["flags"] & LdapAttr::MONOVALUED) != 0;
|
|
||||||
[$phpType, $returnType] = self::fix_type($syntax, $monovalued);
|
|
||||||
$properties[] = "$returnType \$$name";
|
|
||||||
}
|
|
||||||
return $properties;
|
|
||||||
}
|
|
||||||
|
|
||||||
function autogenMethods(array $schema): array {
|
|
||||||
$methods = [];
|
|
||||||
foreach ($schema as $attribute) {
|
|
||||||
$name = $attribute["name"];
|
|
||||||
/** @var AbstractSyntax $syntax */
|
|
||||||
$syntax = $this->getSyntax($attribute["class"]);
|
|
||||||
$returnType = $syntax instanceof CompositeSyntax? $syntax->getAttrClass(): LdapAttr::class;
|
|
||||||
$methods[] = "\\$returnType $name()";
|
|
||||||
}
|
|
||||||
return $methods;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\ldap\LdapAttr;
|
|
||||||
use nur\ldap\LdapConn;
|
|
||||||
|
|
||||||
abstract class AbstractSyntax {
|
|
||||||
/** @var LdapConn */
|
|
||||||
protected $conn;
|
|
||||||
|
|
||||||
function initConn(LdapConn $conn) {
|
|
||||||
$this->conn = $conn;
|
|
||||||
}
|
|
||||||
|
|
||||||
function newAttr(string $name, ?array &$values, ?int $flags): LdapAttr {
|
|
||||||
return new LdapAttr($name, $values, $this, $flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPhpType(): ?string {
|
|
||||||
return "string";
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @throws SyntaxException si $value est invalide */
|
|
||||||
abstract function php2ldap($value): ?string;
|
|
||||||
|
|
||||||
abstract function ldap2php(string $value);
|
|
||||||
|
|
||||||
/** transformer les valeurs d'un attribut LDAP en PHP */
|
|
||||||
function fromMultivaluedLdap($values): ?array {
|
|
||||||
A::ensure_narray($values);
|
|
||||||
if ($values !== null) {
|
|
||||||
foreach ($values as &$value) {
|
|
||||||
$value = $this->ldap2php($value);
|
|
||||||
}; unset($value);
|
|
||||||
}
|
|
||||||
return A::filter_n($values)?: null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** transformer la valeur d'un attribut LDAP en PHP */
|
|
||||||
function fromMonovaluedLdap($value) {
|
|
||||||
if (is_array($value)) $value = A::first($value);
|
|
||||||
if ($value === null) return null;
|
|
||||||
else return $this->ldap2php($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** transformer une(des) valeur(s) PHP en attribut LDAP */
|
|
||||||
function fromPhp($values): ?array {
|
|
||||||
A::ensure_narray($values);
|
|
||||||
if ($values !== null) {
|
|
||||||
foreach ($values as &$value) {
|
|
||||||
$value = $this->php2ldap($value);
|
|
||||||
}; unset($value);
|
|
||||||
}
|
|
||||||
return A::filter_n($values)?: null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\b\IllegalAccessException;
|
|
||||||
|
|
||||||
class BinarySyntax extends AbstractSyntax {
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
throw IllegalAccessException::not_implemented();
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value) {
|
|
||||||
throw IllegalAccessException::not_implemented();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
class BooleanSyntax extends AbstractSyntax {
|
|
||||||
function getPhpType(): ?string {
|
|
||||||
return "bool";
|
|
||||||
}
|
|
||||||
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
if ($value === null) return null;
|
|
||||||
else return $value? "TRUE": "FALSE";
|
|
||||||
}
|
|
||||||
|
|
||||||
function fromPhp($values): ?array {
|
|
||||||
if (is_bool($values)) $values = [$values];
|
|
||||||
return parent::fromPhp($values);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value): bool {
|
|
||||||
return $value === "TRUE";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\A;
|
|
||||||
use nur\b\ValueException;
|
|
||||||
use nur\ldap\CompositeAttr;
|
|
||||||
use nur\ldap\CompositeValue;
|
|
||||||
|
|
||||||
class CompositeSyntax extends AbstractSyntax {
|
|
||||||
/**
|
|
||||||
* @var string la classe dérivée de {@link CompositeAttr} qui porte l'attribut
|
|
||||||
*/
|
|
||||||
const CACLASS = CompositeAttr::class;
|
|
||||||
|
|
||||||
function getAttrClass(): string {
|
|
||||||
return static::CACLASS;
|
|
||||||
}
|
|
||||||
|
|
||||||
function newAttr(string $name, ?array &$values, ?int $flags): CompositeAttr {
|
|
||||||
$attrClass = $this->getAttrClass();
|
|
||||||
return new $attrClass($name, $values, $this, $flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string la classe dérivée de {@link CompositeValue} qui porte les
|
|
||||||
* valeurs de cette syntaxe
|
|
||||||
*/
|
|
||||||
const CVCLASS = CompositeValue::class;
|
|
||||||
|
|
||||||
/** retourner la classe d'une valeur composite */
|
|
||||||
function getPhpType(): ?string {
|
|
||||||
return static::CVCLASS;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function newCompositeValue(): CompositeValue {
|
|
||||||
$class = $this->getPhpType();
|
|
||||||
/** @var CompositeValue $cvalue */
|
|
||||||
$cvalue = new $class;
|
|
||||||
return $cvalue->setup($this->conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensureArray($values): ?array {
|
|
||||||
A::ensure_narray($values);
|
|
||||||
if ($values === null) return null;
|
|
||||||
# déterminer si $values est *une* valeur ou une liste de valeurs
|
|
||||||
$list = false;
|
|
||||||
foreach ($values as $value) {
|
|
||||||
if (is_array($value) || $value instanceof CompositeValue) {
|
|
||||||
$list = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!$list) $values = [$values];
|
|
||||||
return $values;
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensureComposite($value): ?CompositeValue {
|
|
||||||
if ($value === null) return null;
|
|
||||||
if (is_array($value)) {
|
|
||||||
$value = $this->newCompositeValue()->reset($value);
|
|
||||||
}
|
|
||||||
ValueException::check_class($value, $this->getPhpType());
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param ?CompositeValue $value */
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
$cvalue = $this->ensureComposite($value);
|
|
||||||
if ($cvalue === null) return null;
|
|
||||||
else return $cvalue->formatLdap();
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value): CompositeValue {
|
|
||||||
return $this->newCompositeValue()->parseLdap($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
function fromMultivaluedLdap($values): ?array {
|
|
||||||
A::ensure_narray($values);
|
|
||||||
if ($values !== null) {
|
|
||||||
$tmp = [];
|
|
||||||
foreach ($values as $value) {
|
|
||||||
$value = $this->ldap2php($value);
|
|
||||||
$key = $value->getKey();
|
|
||||||
$tmp[$key] = $value;
|
|
||||||
}
|
|
||||||
$values = $tmp;
|
|
||||||
}
|
|
||||||
return A::filter_n($values)?: null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function fromPhp($values): ?array {
|
|
||||||
$values = $this->ensureArray($values);
|
|
||||||
return parent::fromPhp($values);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use DateTimeImmutable;
|
|
||||||
use nur\b\date\Datetime;
|
|
||||||
use nur\data\types\SDatetimeType;
|
|
||||||
|
|
||||||
class DateSyntax extends AbstractSyntax {
|
|
||||||
function __construct() {
|
|
||||||
$this->type = new SDatetimeType();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var SDatetimeType */
|
|
||||||
protected $type;
|
|
||||||
|
|
||||||
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
$value = $this->type->with($value);
|
|
||||||
if ($value === null) return null;
|
|
||||||
$datetime = new Datetime($value);
|
|
||||||
return $datetime->formatRfc4517();
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value) {
|
|
||||||
$d = DateTimeImmutable::createFromFormat("YmdHisT", $value);
|
|
||||||
$value = $d->format("d/m/Y H:i:s");
|
|
||||||
$value = preg_replace('/ 00:00:00$/', "", $value);
|
|
||||||
return $value;
|
|
||||||
/*
|
|
||||||
[$y, $m, $d, $H, $M, $S] = [
|
|
||||||
substr($value, 0, 4),
|
|
||||||
substr($value, 4, 2),
|
|
||||||
substr($value, 6, 2),
|
|
||||||
substr($value, 8, 2),
|
|
||||||
substr($value, 10, 2),
|
|
||||||
substr($value, 12, 2),
|
|
||||||
];
|
|
||||||
$datetime = new Datetime(gmmktime($H, $M, $S, $m, $d, $y));
|
|
||||||
$value = preg_replace('/ 00:00:00$/', "", $datetime->format());
|
|
||||||
return $value;
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
class IntegerSyntax extends AbstractSyntax {
|
|
||||||
function getPhpType(): ?string {
|
|
||||||
return "int";
|
|
||||||
}
|
|
||||||
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
if ($value === null) return null;
|
|
||||||
else return strval($value);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value): int {
|
|
||||||
return intval($value);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
class MailSyntax extends StringSyntax {
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
class PostalAddressSyntax extends StringSyntax {
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
$value = parent::php2ldap($value);
|
|
||||||
if ($value === null) return null;
|
|
||||||
// mettre en échappement tout caractère $
|
|
||||||
$value = str_replace('$', '\$', $value);
|
|
||||||
$value = preg_replace('/\r?\n/', '$', $value);
|
|
||||||
$value = preg_replace('/\s*(?<!\\\\)\$\s*/', ' $ ', $value);
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value): string {
|
|
||||||
$value = preg_replace('/\s*(?<!\\\\)\$\s*/', "\n", $value);
|
|
||||||
$value = preg_replace('/\\\\\$/', '$', $value);
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
class PrintableSyntax extends StringSyntax {
|
|
||||||
const DISALLOWED = '/[^a-zA-Z0-9"()+,-.\/:? -]+/';
|
|
||||||
|
|
||||||
/** enlever les caractères interdit de la chaine */
|
|
||||||
function filter(?string $value): ?string {
|
|
||||||
if ($value === null) return null;
|
|
||||||
return preg_replace(self::DISALLOWED, "", $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
$value = parent::php2ldap($value);
|
|
||||||
if (preg_match(self::DISALLOWED, $value)) {
|
|
||||||
throw new SyntaxException("invalid string: $value");
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
class StringSyntax extends AbstractSyntax {
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
if ($value === null) return null;
|
|
||||||
else return trim(strval($value));
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value): string {
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\b\ValueException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class SyntaxException: indique qu'une valeur PHP ne peut être convertie en
|
|
||||||
* valeur LDAP
|
|
||||||
*/
|
|
||||||
class SyntaxException extends ValueException {
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\data\types\TelephoneType;
|
|
||||||
use nur\ldap\labels;
|
|
||||||
|
|
||||||
class TelephoneSyntax extends StringSyntax {
|
|
||||||
function __construct() {
|
|
||||||
$this->type = new TelephoneType();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var TelephoneType */
|
|
||||||
protected $type;
|
|
||||||
|
|
||||||
function php2ldap($value): ?string {
|
|
||||||
$value = parent::php2ldap($value);
|
|
||||||
if ($value === null) return null;
|
|
||||||
labels::strip($value, $label);
|
|
||||||
$type = $this->type;
|
|
||||||
$value = $type->ensureInternational($type->with($value));
|
|
||||||
return labels::add($value, $label);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ldap2php(string $value): string {
|
|
||||||
labels::strip($value, $label);
|
|
||||||
$value = $this->type->ensureLocal($value);
|
|
||||||
return labels::add($value, $label);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,18 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\data\types\Metadata;
|
|
||||||
use nur\php\Autogen;
|
|
||||||
|
|
||||||
class cvalues {
|
|
||||||
static function autogen_properties(array $schema): array {
|
|
||||||
$md = Metadata::with($schema);
|
|
||||||
$properties = [];
|
|
||||||
foreach ($md->getKeys() as $key) {
|
|
||||||
$type = $md->getType($key);
|
|
||||||
[$phpType, $returnType] = Autogen::fix_type($type->getPhpType());
|
|
||||||
$properties[] = "$returnType \$$key";
|
|
||||||
}
|
|
||||||
return $properties;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?php # -*- coding: utf-8 mode: php -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
|
|
||||||
return array_merge(require __DIR__.'/ldap_localhost_389.ldaphost',
|
|
||||||
[
|
|
||||||
'binddn' => 'cn=admin,dc=univ-reunion,dc=fr',
|
|
||||||
'password' => 'admin',
|
|
||||||
]
|
|
||||||
);
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?php # -*- coding: utf-8 mode: php -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
|
|
||||||
return array_merge(require __DIR__.'/ldap_localhost_389.ldaphost',
|
|
||||||
[
|
|
||||||
'binddn' => null,
|
|
||||||
'password' => null,
|
|
||||||
]
|
|
||||||
);
|
|
|
@ -1 +0,0 @@
|
||||||
admin.ldapconf
|
|
|
@ -1 +0,0 @@
|
||||||
../../nur_bin/ldap-get-infos.php
|
|
|
@ -1 +0,0 @@
|
||||||
../../nur_bin/ldap-search.php
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,32 +0,0 @@
|
||||||
dn:
|
|
||||||
structuralObjectClass: OpenLDAProotDSE
|
|
||||||
configContext: cn=config
|
|
||||||
namingContexts: cn=modiflog
|
|
||||||
namingContexts: dc=univ-reunion,dc=fr
|
|
||||||
monitorContext: cn=Monitor
|
|
||||||
supportedControl: 1.3.6.1.4.1.4203.1.9.1.1
|
|
||||||
supportedControl: 2.16.840.1.113730.3.4.18
|
|
||||||
supportedControl: 2.16.840.1.113730.3.4.2
|
|
||||||
supportedControl: 1.3.6.1.4.1.4203.1.10.1
|
|
||||||
supportedControl: 1.3.6.1.1.22
|
|
||||||
supportedControl: 1.2.840.113556.1.4.319
|
|
||||||
supportedControl: 1.2.826.0.1.3344810.2.3
|
|
||||||
supportedControl: 1.3.6.1.1.13.2
|
|
||||||
supportedControl: 1.3.6.1.1.13.1
|
|
||||||
supportedControl: 1.3.6.1.1.12
|
|
||||||
supportedExtension: 1.3.6.1.4.1.4203.1.11.1
|
|
||||||
supportedExtension: 1.3.6.1.4.1.4203.1.11.3
|
|
||||||
supportedExtension: 1.3.6.1.1.8
|
|
||||||
supportedFeatures: 1.3.6.1.1.14
|
|
||||||
supportedFeatures: 1.3.6.1.4.1.4203.1.5.1
|
|
||||||
supportedFeatures: 1.3.6.1.4.1.4203.1.5.2
|
|
||||||
supportedFeatures: 1.3.6.1.4.1.4203.1.5.3
|
|
||||||
supportedFeatures: 1.3.6.1.4.1.4203.1.5.4
|
|
||||||
supportedFeatures: 1.3.6.1.4.1.4203.1.5.5
|
|
||||||
supportedLDAPVersion: 3
|
|
||||||
supportedSASLMechanisms: DIGEST-MD5
|
|
||||||
supportedSASLMechanisms: NTLM
|
|
||||||
supportedSASLMechanisms: CRAM-MD5
|
|
||||||
entryDN:
|
|
||||||
subschemaSubentry: cn=Subschema
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
require __DIR__.'/../../vendor/autoload.php';
|
|
||||||
|
|
||||||
use nur\ldap\app\LdapApplication;
|
|
||||||
use nur\ldap\schemas\LdapSchemaExtractor;
|
|
||||||
|
|
||||||
LdapApplication::run(new class extends LdapApplication {
|
|
||||||
const ARGS = [
|
|
||||||
"merge" => parent::ARGS,
|
|
||||||
["-o", "--output", "args" => 1],
|
|
||||||
];
|
|
||||||
|
|
||||||
protected $output;
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
$conn = $this->getConn();
|
|
||||||
$extractor = new LdapSchemaExtractor($conn->getSchemaInfos());
|
|
||||||
Txx($extractor->init());
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,788 +0,0 @@
|
||||||
dn: cn=Subschema
|
|
||||||
structuralObjectClass: subentry
|
|
||||||
createTimestamp: 20230324045227Z
|
|
||||||
modifyTimestamp: 20230324045227Z
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.7 DESC 'Boolean' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.8 DESC 'Certificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.9 DESC 'Certificate List' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.10 DESC 'Certificate Pair' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.4203.666.11.10.2.1 DESC 'X.509 AttributeCertificate' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )
|
|
||||||
ldapSyntaxes: ( 1.2.36.79672281.1.5.0 DESC 'RDN' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.49 DESC 'Supported Algorithm' X-BINARY-TRANSFER-REQUIRED 'TRUE' X-NOT-HUMAN-READABLE 'TRUE' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.1.1.0.0 DESC 'RFC2307 NIS Netgroup Triple' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.1.1.0.1 DESC 'RFC2307 Boot Parameter' )
|
|
||||||
ldapSyntaxes: ( 1.3.6.1.1.16.1 DESC 'UUID' )
|
|
||||||
matchingRules: ( 1.3.6.1.1.16.3 NAME 'UUIDOrderingMatch' SYNTAX 1.3.6.1.1.16.1 )
|
|
||||||
matchingRules: ( 1.3.6.1.1.16.2 NAME 'UUIDMatch' SYNTAX 1.3.6.1.1.16.1 )
|
|
||||||
matchingRules: ( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
|
|
||||||
matchingRules: ( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
|
|
||||||
matchingRules: ( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
matchingRules: ( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
matchingRules: ( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
matchingRules: ( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
matchingRules: ( 2.5.13.38 NAME 'certificateListExactMatch' SYNTAX 1.3.6.1.1.15.5 )
|
|
||||||
matchingRules: ( 2.5.13.34 NAME 'certificateExactMatch' SYNTAX 1.3.6.1.1.15.1 )
|
|
||||||
matchingRules: ( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
|
|
||||||
matchingRules: ( 2.5.13.29 NAME 'integerFirstComponentMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
|
|
||||||
matchingRules: ( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
|
|
||||||
matchingRules: ( 2.5.13.27 NAME 'generalizedTimeMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
|
|
||||||
matchingRules: ( 2.5.13.23 NAME 'uniqueMemberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )
|
|
||||||
matchingRules: ( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
|
|
||||||
matchingRules: ( 2.5.13.20 NAME 'telephoneNumberMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )
|
|
||||||
matchingRules: ( 2.5.13.19 NAME 'octetStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
|
|
||||||
matchingRules: ( 2.5.13.18 NAME 'octetStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
|
|
||||||
matchingRules: ( 2.5.13.17 NAME 'octetStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
|
|
||||||
matchingRules: ( 2.5.13.16 NAME 'bitStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )
|
|
||||||
matchingRules: ( 2.5.13.15 NAME 'integerOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
|
|
||||||
matchingRules: ( 2.5.13.14 NAME 'integerMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
|
|
||||||
matchingRules: ( 2.5.13.13 NAME 'booleanMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )
|
|
||||||
matchingRules: ( 2.5.13.11 NAME 'caseIgnoreListMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )
|
|
||||||
matchingRules: ( 2.5.13.10 NAME 'numericStringSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
|
|
||||||
matchingRules: ( 2.5.13.9 NAME 'numericStringOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )
|
|
||||||
matchingRules: ( 2.5.13.8 NAME 'numericStringMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )
|
|
||||||
matchingRules: ( 2.5.13.7 NAME 'caseExactSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
|
|
||||||
matchingRules: ( 2.5.13.6 NAME 'caseExactOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
matchingRules: ( 2.5.13.5 NAME 'caseExactMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
matchingRules: ( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
|
|
||||||
matchingRules: ( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
matchingRules: ( 2.5.13.2 NAME 'caseIgnoreMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
matchingRules: ( 1.2.36.79672281.1.13.3 NAME 'rdnMatch' SYNTAX 1.2.36.79672281.1.5.0 )
|
|
||||||
matchingRules: ( 2.5.13.1 NAME 'distinguishedNameMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
matchingRules: ( 2.5.13.0 NAME 'objectIdentifierMatch' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
|
|
||||||
matchingRuleUse: ( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbRtxnSize $ olcDbSearchStack $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ sambaPwdLastSet $ sambaPwdCanChange $ sambaPwdMustChange $ sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ sambaBadPasswordCount $ sambaBadPasswordTime $ sambaGroupType $ sambaNextUserRid $ sambaNextGroupRid $ sambaNextRid $ sambaAlgorithmicRidBase $ sambaIntegerOption $ sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ sambaMaxPwdAge $ sambaMinPwdAge $ sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ sambaForceLogoff $ sambaRefuseMachinePwdChange $ radiusSimultaneousUse ) )
|
|
||||||
matchingRuleUse: ( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbRtxnSize $ olcDbSearchStack $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ sambaPwdLastSet $ sambaPwdCanChange $ sambaPwdMustChange $ sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ sambaBadPasswordCount $ sambaBadPasswordTime $ sambaGroupType $ sambaNextUserRid $ sambaNextGroupRid $ sambaNextRid $ sambaAlgorithmicRidBase $ sambaIntegerOption $ sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ sambaMaxPwdAge $ sambaMinPwdAge $ sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ sambaForceLogoff $ sambaRefuseMachinePwdChange $ radiusSimultaneousUse ) )
|
|
||||||
matchingRuleUse: ( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' APPLIES ( altServer $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox $ gecos $ homeDirectory $ loginShell $ memberUid $ memberNisNetgroup $ ipHostNumber $ ipNetworkNumber $ ipNetmaskNumber $ macAddress $ bootFile $ nisMapEntry $ sambaLMPassword $ sambaNTPassword $ sambaAcctFlags $ sambaLogonHours $ sambaHomeDrive $ sambaPasswordHistory $ sambaSID $ sambaPrimaryGroupSID $ sambaSIDList $ sambaStringOption $ sambaTrustFlags $ supannCodeEntite $ supannCodeEntiteParent $ supannEntiteAffectation $ supannEntiteAffectationPrincipale $ supannMailPerso $ supannAutreMail $ runUnivMailAlias $ runUnivMailGroup $ runUnivMailRoute $ runUnivMailHost $ runUnivMailMember $ runUnivLocalisation $ runUnivLsc $ runUnivAccountUid $ runUnivHeliosAccountUid $ runUnivGaiaAccountUid $ runUnivExtAccountUid $ runUnivBvMailExterne $ runUnivGoogleGroupOwner $ urBvMailExterne $ radiusArapFeatures $ radiusArapSecurity $ radiusArapZoneAccess $ radiusAuthType $ radiusCallbackId $ radiusCallbackNumber $ radiusCalledStationId $ radiusCallingStationId $ radiusClass $ radiusClientIPAddress $ radiusFilterId $ radiusFramedAppleTalkLink $ radiusFramedAppleTalkNetwork $ radiusFramedAppleTalkZone $ radiusFramedCompression $ radiusFramedIPAddress $ radiusFramedIPNetmask $ radiusFramedIPXNetwork $ radiusFramedMTU $ radiusFramedProtocol $ radiusFramedRoute $ radiusFramedRouting $ radiusGroupName $ radiusHint $ radiusHuntgroupName $ radiusIdleTimeout $ radiusLoginIPHost $ radiusLoginLATGroup $ radiusLoginLATNode $ radiusLoginLATPort $ radiusLoginLATService $ radiusLoginService $ radiusLoginTCPPort $ radiusPasswordRetry $ radiusPortLimit $ radiusPrompt $ radiusProxyToRealm $ radiusReplicateToRealm $ radiusRealm $ radiusServiceType $ radiusSessionTimeout $ radiusTerminationAction $ radiusTunnelAssignmentId $ radiusTunnelMediumType $ radiusTunnelPassword $ radiusTunnelPreference $ radiusTunnelPrivateGroupId $ radiusTunnelServerEndpoint $ radiusTunnelType $ radiusVSA $ radiusTunnelClientEndpoint $ radiusLoginTime $ radiusUserCategory $ dialupAccess $ radiusExpiration $ radiusCheckItem $ radiusReplyItem $ radiusNASIpAddress $ radiusReplyMessage ) )
|
|
||||||
matchingRuleUse: ( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' APPLIES ( altServer $ c $ mail $ dc $ associatedDomain $ email $ aRecord $ mDRecord $ mXRecord $ nSRecord $ sOARecord $ cNAMERecord $ janetMailbox $ gecos $ homeDirectory $ loginShell $ memberUid $ memberNisNetgroup $ ipHostNumber $ ipNetworkNumber $ ipNetmaskNumber $ macAddress $ bootFile $ nisMapEntry $ sambaLMPassword $ sambaNTPassword $ sambaAcctFlags $ sambaLogonHours $ sambaHomeDrive $ sambaPasswordHistory $ sambaSID $ sambaPrimaryGroupSID $ sambaSIDList $ sambaStringOption $ sambaTrustFlags $ supannCodeEntite $ supannCodeEntiteParent $ supannEntiteAffectation $ supannEntiteAffectationPrincipale $ supannMailPerso $ supannAutreMail $ runUnivMailAlias $ runUnivMailGroup $ runUnivMailRoute $ runUnivMailHost $ runUnivMailMember $ runUnivLocalisation $ runUnivLsc $ runUnivAccountUid $ runUnivHeliosAccountUid $ runUnivGaiaAccountUid $ runUnivExtAccountUid $ runUnivBvMailExterne $ runUnivGoogleGroupOwner $ urBvMailExterne $ radiusArapFeatures $ radiusArapSecurity $ radiusArapZoneAccess $ radiusAuthType $ radiusCallbackId $ radiusCallbackNumber $ radiusCalledStationId $ radiusCallingStationId $ radiusClass $ radiusClientIPAddress $ radiusFilterId $ radiusFramedAppleTalkLink $ radiusFramedAppleTalkNetwork $ radiusFramedAppleTalkZone $ radiusFramedCompression $ radiusFramedIPAddress $ radiusFramedIPNetmask $ radiusFramedIPXNetwork $ radiusFramedMTU $ radiusFramedProtocol $ radiusFramedRoute $ radiusFramedRouting $ radiusGroupName $ radiusHint $ radiusHuntgroupName $ radiusIdleTimeout $ radiusLoginIPHost $ radiusLoginLATGroup $ radiusLoginLATNode $ radiusLoginLATPort $ radiusLoginLATService $ radiusLoginService $ radiusLoginTCPPort $ radiusPasswordRetry $ radiusPortLimit $ radiusPrompt $ radiusProxyToRealm $ radiusReplicateToRealm $ radiusRealm $ radiusServiceType $ radiusSessionTimeout $ radiusTerminationAction $ radiusTunnelAssignmentId $ radiusTunnelMediumType $ radiusTunnelPassword $ radiusTunnelPreference $ radiusTunnelPrivateGroupId $ radiusTunnelServerEndpoint $ radiusTunnelType $ radiusVSA $ radiusTunnelClientEndpoint $ radiusLoginTime $ radiusUserCategory $ dialupAccess $ radiusExpiration $ radiusCheckItem $ radiusReplyItem $ radiusNASIpAddress $ radiusReplyMessage ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.38 NAME 'certificateListExactMatch' APPLIES ( authorityRevocationList $ certificateRevocationList $ deltaRevocationList ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.34 NAME 'certificateExactMatch' APPLIES ( userCertificate $ cACertificate ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ ldapSyntaxes $ supportedApplicationContext ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.29 NAME 'integerFirstComponentMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbRtxnSize $ olcDbSearchStack $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ sambaPwdLastSet $ sambaPwdCanChange $ sambaPwdMustChange $ sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ sambaBadPasswordCount $ sambaBadPasswordTime $ sambaGroupType $ sambaNextUserRid $ sambaNextGroupRid $ sambaNextRid $ sambaAlgorithmicRidBase $ sambaIntegerOption $ sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ sambaMaxPwdAge $ sambaMinPwdAge $ sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ sambaForceLogoff $ sambaRefuseMachinePwdChange $ radiusSimultaneousUse ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' APPLIES ( createTimestamp $ modifyTimestamp $ attuhbdatenais $ attuhbdatefin $ attuhbdateouvcompte $ attuhbdatemaj $ supannGroupeDateFin $ runUnivJpegPhotoDate $ runUnivLastModified $ runUnivDateFin $ runUnivDateNaissance ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.27 NAME 'generalizedTimeMatch' APPLIES ( createTimestamp $ modifyTimestamp $ attuhbdatenais $ attuhbdatefin $ attuhbdateouvcompte $ attuhbdatemaj $ supannGroupeDateFin $ runUnivJpegPhotoDate $ runUnivLastModified $ runUnivDateFin $ runUnivDateNaissance ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.24 NAME 'protocolInformationMatch' APPLIES protocolInformation )
|
|
||||||
matchingRuleUse: ( 2.5.13.23 NAME 'uniqueMemberMatch' APPLIES uniqueMember )
|
|
||||||
matchingRuleUse: ( 2.5.13.22 NAME 'presentationAddressMatch' APPLIES presentationAddress )
|
|
||||||
matchingRuleUse: ( 2.5.13.20 NAME 'telephoneNumberMatch' APPLIES ( telephoneNumber $ homePhone $ mobile $ pager $ supannAutreTelephone $ runUnivTelephonePerso ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.18 NAME 'octetStringOrderingMatch' APPLIES ( userPassword $ sambaClearTextPassword $ sambaPreviousClearTextPassword $ sshPublicKey $ runUnivPassword $ runUnivSshPublicKey ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.17 NAME 'octetStringMatch' APPLIES ( userPassword $ sambaClearTextPassword $ sambaPreviousClearTextPassword $ sshPublicKey $ runUnivPassword $ runUnivSshPublicKey ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.16 NAME 'bitStringMatch' APPLIES x500UniqueIdentifier )
|
|
||||||
matchingRuleUse: ( 2.5.13.15 NAME 'integerOrderingMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbRtxnSize $ olcDbSearchStack $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ sambaPwdLastSet $ sambaPwdCanChange $ sambaPwdMustChange $ sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ sambaBadPasswordCount $ sambaBadPasswordTime $ sambaGroupType $ sambaNextUserRid $ sambaNextGroupRid $ sambaNextRid $ sambaAlgorithmicRidBase $ sambaIntegerOption $ sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ sambaMaxPwdAge $ sambaMinPwdAge $ sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ sambaForceLogoff $ sambaRefuseMachinePwdChange $ radiusSimultaneousUse ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.14 NAME 'integerMatch' APPLIES ( supportedLDAPVersion $ entryTtl $ uidNumber $ gidNumber $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcIdleTimeout $ olcIndexSubstrIfMinLen $ olcIndexSubstrIfMaxLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcMaxDerefDepth $ olcReplicationInterval $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcThreads $ olcToolThreads $ olcWriteTimeout $ olcDbMaxReaders $ olcDbMaxSize $ olcDbRtxnSize $ olcDbSearchStack $ olcSpSessionlog $ mailPreferenceOption $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ ipServicePort $ ipProtocolNumber $ oncRpcNumber $ sambaPwdLastSet $ sambaPwdCanChange $ sambaPwdMustChange $ sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ sambaBadPasswordCount $ sambaBadPasswordTime $ sambaGroupType $ sambaNextUserRid $ sambaNextGroupRid $ sambaNextRid $ sambaAlgorithmicRidBase $ sambaIntegerOption $ sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ sambaMaxPwdAge $ sambaMinPwdAge $ sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ sambaForceLogoff $ sambaRefuseMachinePwdChange $ radiusSimultaneousUse ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.13 NAME 'booleanMatch' APPLIES ( hasSubordinates $ olcAddContentAcl $ olcGentleHUP $ olcHidden $ olcLastMod $ olcMirrorMode $ olcMonitoring $ olcReadOnly $ olcReverseLookup $ olcSyncUseSubentry $ olcDbNoSync $ olcSpNoPresent $ olcSpReloadHint $ olcAccessLogSuccess $ sambaBoolOption $ attuhbintranet $ attuhbextranet $ supannListeRouge $ runUnivToipEnabled $ runUnivAccessDenied $ runUnivAccessAllowed $ runUnivLegacyWebProhibited $ urAccessAllowed $ radiusStripUserName ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.11 NAME 'caseIgnoreListMatch' APPLIES ( postalAddress $ registeredAddress $ homePostalAddress $ runUnivAdressePerso ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.9 NAME 'numericStringOrderingMatch' APPLIES ( x121Address $ internationaliSDNNumber $ supannEtuAnneeInscription $ runUnivToipInternal $ runUnivToipExternal ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.8 NAME 'numericStringMatch' APPLIES ( x121Address $ internationaliSDNNumber $ supannEtuAnneeInscription $ runUnivToipInternal $ runUnivToipExternal ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.7 NAME 'caseExactSubstringsMatch' APPLIES ( serialNumber $ c $ telephoneNumber $ destinationIndicator $ dnQualifier $ homePhone $ mobile $ pager $ supannCivilite $ supannCodeINE $ supannAutreTelephone $ runUnivTelephonePerso ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.6 NAME 'caseExactOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSECName $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ olcSpCheckpoint $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcDlAttrSet $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ homePhone $ personalTitle $ mobile $ pager $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ ipServiceProtocol $ nisMapName $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ eduOrgHomePageURI $ eduOrgIdentityAuthNPolicyURI $ eduOrgLegalName $ eduOrgSuperiorURI $ eduOrgWhitePagesURI $ eduPersonAffiliation $ eduPersonNickname $ eduPersonPrimaryAffiliation $ eduPersonPrincipalName $ eduPersonEntitlement $ eduPersonScopedAffiliation $ eduPersonTargetedID $ eduPersonAssurance $ isMemberOf $ hasMember $ sambaLogonScript $ sambaProfilePath $ sambaUserWorkstations $ sambaHomePath $ sambaDomainName $ sambaMungedDial $ sambaShareName $ sambaOptionName $ sambaStringListOption $ attuhbcategorie $ attuhbcodecorps $ attuhbcorps $ attuhbcodetype $ attuhbtype $ attuhbcodecnu $ attuhbcnu $ attuhbetab $ attuhbcomp $ attuhbResponsabilite $ attuhbmanager $ attuhbalias $ attuhbcodelr $ attuhbcampus $ attuhbaffectation $ attuhbcodevalid $ attuhbhashid $ attuhbLastSetPasswordID $ attuhbPays $ attuhbetp $ attuhbins $ attuhbdroitacces $ attuhbWebmasterHome $ attuhbstatut $ attuhbregins $ attuhbprofil $ attuhbetaPmt $ attuhbelp $ attuhbcleactivation $ attuhblibade $ attuhbgfocod $ attuhbcompType $ attuhbcompRespEns $ attuhbcompRespTech $ attuhbcompRespAdm $ attuhbcompLibelleCourt $ attuhbcompLibelle $ supannActivite $ supannOrganisme $ supannCivilite $ supannAffectation $ supannCodeINE $ supannEtuId $ supannEmpId $ supannAutreTelephone $ supannEtablissement $ supannTypeEntite $ supannAliasLogin $ supannRole $ supannRoleGenerique $ supannRoleEntite $ supannEtuCursusAnnee $ supannEtuDiplome $ supannEtuElementPedagogique $ supannEtuEtape $ supannEtuInscription $ supannEtuRegimeInscription $ supannEtuSecteurDisciplinaire $ supannEtuTypeDiplome $ supannEmpCorps $ supannTypeEntiteAffectation $ supannRefId $ mailForwardingAddress $ runUnivMemberURL $ runUnivToipAffectation $ runUnivSihamId $ runUnivAuthorization $ runUnivNoInsee $ runUnivAttribute $ runUnivIndAffectation $ runUnivPersInfos $ runUnivTelephonePerso $ runUnivStrInfos $ runUnivStrResp $ runUnivIndInfos $ runUnivNom $ runUnivPrenom $ runUnivDiplome $ runUnivWgClient $ runUnivCasAccepted $ runUnivCategorie $ runUnivScheduledOperation $ runUnivHarpTypePopulation $ runUnivHarpStructure $ harpegeStructureCode $ harpegeStructureCodePere $ harpegeStructureLibelleCourt $ harpegeStructureLibelle $ harpegeStructureType $ harpegeStructureCodeRNE $ runUnivApoComposante $ runUnivApoEtape $ runUnivBvProfil $ urBvProfil $ urMail $ memberURL ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.5 NAME 'caseExactMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSECName $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ olcSpCheckpoint $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcDlAttrSet $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ homePhone $ personalTitle $ mobile $ pager $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ ipServiceProtocol $ nisMapName $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ eduOrgHomePageURI $ eduOrgIdentityAuthNPolicyURI $ eduOrgLegalName $ eduOrgSuperiorURI $ eduOrgWhitePagesURI $ eduPersonAffiliation $ eduPersonNickname $ eduPersonPrimaryAffiliation $ eduPersonPrincipalName $ eduPersonEntitlement $ eduPersonScopedAffiliation $ eduPersonTargetedID $ eduPersonAssurance $ isMemberOf $ hasMember $ sambaLogonScript $ sambaProfilePath $ sambaUserWorkstations $ sambaHomePath $ sambaDomainName $ sambaMungedDial $ sambaShareName $ sambaOptionName $ sambaStringListOption $ attuhbcategorie $ attuhbcodecorps $ attuhbcorps $ attuhbcodetype $ attuhbtype $ attuhbcodecnu $ attuhbcnu $ attuhbetab $ attuhbcomp $ attuhbResponsabilite $ attuhbmanager $ attuhbalias $ attuhbcodelr $ attuhbcampus $ attuhbaffectation $ attuhbcodevalid $ attuhbhashid $ attuhbLastSetPasswordID $ attuhbPays $ attuhbetp $ attuhbins $ attuhbdroitacces $ attuhbWebmasterHome $ attuhbstatut $ attuhbregins $ attuhbprofil $ attuhbetaPmt $ attuhbelp $ attuhbcleactivation $ attuhblibade $ attuhbgfocod $ attuhbcompType $ attuhbcompRespEns $ attuhbcompRespTech $ attuhbcompRespAdm $ attuhbcompLibelleCourt $ attuhbcompLibelle $ supannActivite $ supannOrganisme $ supannCivilite $ supannAffectation $ supannCodeINE $ supannEtuId $ supannEmpId $ supannAutreTelephone $ supannEtablissement $ supannTypeEntite $ supannAliasLogin $ supannRole $ supannRoleGenerique $ supannRoleEntite $ supannEtuCursusAnnee $ supannEtuDiplome $ supannEtuElementPedagogique $ supannEtuEtape $ supannEtuInscription $ supannEtuRegimeInscription $ supannEtuSecteurDisciplinaire $ supannEtuTypeDiplome $ supannEmpCorps $ supannTypeEntiteAffectation $ supannRefId $ mailForwardingAddress $ runUnivMemberURL $ runUnivToipAffectation $ runUnivSihamId $ runUnivAuthorization $ runUnivNoInsee $ runUnivAttribute $ runUnivIndAffectation $ runUnivPersInfos $ runUnivTelephonePerso $ runUnivStrInfos $ runUnivStrResp $ runUnivIndInfos $ runUnivNom $ runUnivPrenom $ runUnivDiplome $ runUnivWgClient $ runUnivCasAccepted $ runUnivCategorie $ runUnivScheduledOperation $ runUnivHarpTypePopulation $ runUnivHarpStructure $ harpegeStructureCode $ harpegeStructureCodePere $ harpegeStructureLibelleCourt $ harpegeStructureLibelle $ harpegeStructureType $ harpegeStructureCodeRNE $ runUnivApoComposante $ runUnivApoEtape $ runUnivBvProfil $ urBvProfil $ urMail $ memberURL ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' APPLIES ( serialNumber $ c $ telephoneNumber $ destinationIndicator $ dnQualifier $ homePhone $ mobile $ pager $ supannCivilite $ supannCodeINE $ supannAutreTelephone $ runUnivTelephonePerso ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSECName $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ olcSpCheckpoint $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcDlAttrSet $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ homePhone $ personalTitle $ mobile $ pager $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ ipServiceProtocol $ nisMapName $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ eduOrgHomePageURI $ eduOrgIdentityAuthNPolicyURI $ eduOrgLegalName $ eduOrgSuperiorURI $ eduOrgWhitePagesURI $ eduPersonAffiliation $ eduPersonNickname $ eduPersonPrimaryAffiliation $ eduPersonPrincipalName $ eduPersonEntitlement $ eduPersonScopedAffiliation $ eduPersonTargetedID $ eduPersonAssurance $ isMemberOf $ hasMember $ sambaLogonScript $ sambaProfilePath $ sambaUserWorkstations $ sambaHomePath $ sambaDomainName $ sambaMungedDial $ sambaShareName $ sambaOptionName $ sambaStringListOption $ attuhbcategorie $ attuhbcodecorps $ attuhbcorps $ attuhbcodetype $ attuhbtype $ attuhbcodecnu $ attuhbcnu $ attuhbetab $ attuhbcomp $ attuhbResponsabilite $ attuhbmanager $ attuhbalias $ attuhbcodelr $ attuhbcampus $ attuhbaffectation $ attuhbcodevalid $ attuhbhashid $ attuhbLastSetPasswordID $ attuhbPays $ attuhbetp $ attuhbins $ attuhbdroitacces $ attuhbWebmasterHome $ attuhbstatut $ attuhbregins $ attuhbprofil $ attuhbetaPmt $ attuhbelp $ attuhbcleactivation $ attuhblibade $ attuhbgfocod $ attuhbcompType $ attuhbcompRespEns $ attuhbcompRespTech $ attuhbcompRespAdm $ attuhbcompLibelleCourt $ attuhbcompLibelle $ supannActivite $ supannOrganisme $ supannCivilite $ supannAffectation $ supannCodeINE $ supannEtuId $ supannEmpId $ supannAutreTelephone $ supannEtablissement $ supannTypeEntite $ supannAliasLogin $ supannRole $ supannRoleGenerique $ supannRoleEntite $ supannEtuCursusAnnee $ supannEtuDiplome $ supannEtuElementPedagogique $ supannEtuEtape $ supannEtuInscription $ supannEtuRegimeInscription $ supannEtuSecteurDisciplinaire $ supannEtuTypeDiplome $ supannEmpCorps $ supannTypeEntiteAffectation $ supannRefId $ mailForwardingAddress $ runUnivMemberURL $ runUnivToipAffectation $ runUnivSihamId $ runUnivAuthorization $ runUnivNoInsee $ runUnivAttribute $ runUnivIndAffectation $ runUnivPersInfos $ runUnivTelephonePerso $ runUnivStrInfos $ runUnivStrResp $ runUnivIndInfos $ runUnivNom $ runUnivPrenom $ runUnivDiplome $ runUnivWgClient $ runUnivCasAccepted $ runUnivCategorie $ runUnivScheduledOperation $ runUnivHarpTypePopulation $ runUnivHarpStructure $ harpegeStructureCode $ harpegeStructureCodePere $ harpegeStructureLibelleCourt $ harpegeStructureLibelle $ harpegeStructureType $ harpegeStructureCodeRNE $ runUnivApoComposante $ runUnivApoEtape $ runUnivBvProfil $ urBvProfil $ urMail $ memberURL ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.2 NAME 'caseIgnoreMatch' APPLIES ( supportedSASLMechanisms $ vendorName $ vendorVersion $ ref $ name $ cn $ uid $ labeledURI $ description $ olcConfigFile $ olcConfigDir $ olcAccess $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcBackend $ olcDatabase $ olcDisallows $ olcDitContentRules $ olcExtraAttrs $ olcInclude $ olcLdapSyntaxes $ olcLimits $ olcLogFile $ olcLogLevel $ olcModuleLoad $ olcModulePath $ olcObjectClasses $ olcObjectIdentifier $ olcOverlay $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPlugin $ olcPluginLogFile $ olcReferral $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDSE $ olcRootPW $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSortVals $ olcSubordinate $ olcSyncrepl $ olcTCPBuffer $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSCRLFile $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSECName $ olcTLSProtocolMin $ olcUpdateRef $ olcDbDirectory $ olcDbCheckpoint $ olcDbEnvFlags $ olcDbIndex $ olcDbMode $ olcSpCheckpoint $ olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase $ olcDlAttrSet $ knowledgeInformation $ sn $ serialNumber $ c $ l $ st $ street $ o $ ou $ title $ businessCategory $ postalCode $ postOfficeBox $ physicalDeliveryOfficeName $ telephoneNumber $ destinationIndicator $ givenName $ initials $ generationQualifier $ dnQualifier $ houseIdentifier $ dmdName $ pseudonym $ textEncodedORAddress $ info $ drink $ roomNumber $ userClass $ host $ documentIdentifier $ documentTitle $ documentVersion $ documentLocation $ homePhone $ personalTitle $ mobile $ pager $ co $ uniqueIdentifier $ organizationalStatus $ buildingName $ documentPublisher $ ipServiceProtocol $ nisMapName $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ preferredLanguage $ eduOrgHomePageURI $ eduOrgIdentityAuthNPolicyURI $ eduOrgLegalName $ eduOrgSuperiorURI $ eduOrgWhitePagesURI $ eduPersonAffiliation $ eduPersonNickname $ eduPersonPrimaryAffiliation $ eduPersonPrincipalName $ eduPersonEntitlement $ eduPersonScopedAffiliation $ eduPersonTargetedID $ eduPersonAssurance $ isMemberOf $ hasMember $ sambaLogonScript $ sambaProfilePath $ sambaUserWorkstations $ sambaHomePath $ sambaDomainName $ sambaMungedDial $ sambaShareName $ sambaOptionName $ sambaStringListOption $ attuhbcategorie $ attuhbcodecorps $ attuhbcorps $ attuhbcodetype $ attuhbtype $ attuhbcodecnu $ attuhbcnu $ attuhbetab $ attuhbcomp $ attuhbResponsabilite $ attuhbmanager $ attuhbalias $ attuhbcodelr $ attuhbcampus $ attuhbaffectation $ attuhbcodevalid $ attuhbhashid $ attuhbLastSetPasswordID $ attuhbPays $ attuhbetp $ attuhbins $ attuhbdroitacces $ attuhbWebmasterHome $ attuhbstatut $ attuhbregins $ attuhbprofil $ attuhbetaPmt $ attuhbelp $ attuhbcleactivation $ attuhblibade $ attuhbgfocod $ attuhbcompType $ attuhbcompRespEns $ attuhbcompRespTech $ attuhbcompRespAdm $ attuhbcompLibelleCourt $ attuhbcompLibelle $ supannActivite $ supannOrganisme $ supannCivilite $ supannAffectation $ supannCodeINE $ supannEtuId $ supannEmpId $ supannAutreTelephone $ supannEtablissement $ supannTypeEntite $ supannAliasLogin $ supannRole $ supannRoleGenerique $ supannRoleEntite $ supannEtuCursusAnnee $ supannEtuDiplome $ supannEtuElementPedagogique $ supannEtuEtape $ supannEtuInscription $ supannEtuRegimeInscription $ supannEtuSecteurDisciplinaire $ supannEtuTypeDiplome $ supannEmpCorps $ supannTypeEntiteAffectation $ supannRefId $ mailForwardingAddress $ runUnivMemberURL $ runUnivToipAffectation $ runUnivSihamId $ runUnivAuthorization $ runUnivNoInsee $ runUnivAttribute $ runUnivIndAffectation $ runUnivPersInfos $ runUnivTelephonePerso $ runUnivStrInfos $ runUnivStrResp $ runUnivIndInfos $ runUnivNom $ runUnivPrenom $ runUnivDiplome $ runUnivWgClient $ runUnivCasAccepted $ runUnivCategorie $ runUnivScheduledOperation $ runUnivHarpTypePopulation $ runUnivHarpStructure $ harpegeStructureCode $ harpegeStructureCodePere $ harpegeStructureLibelleCourt $ harpegeStructureLibelle $ harpegeStructureType $ harpegeStructureCodeRNE $ runUnivApoComposante $ runUnivApoEtape $ runUnivBvProfil $ urBvProfil $ urMail $ memberURL ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.1 NAME 'distinguishedNameMatch' APPLIES ( creatorsName $ modifiersName $ subschemaSubentry $ entryDN $ namingContexts $ aliasedObjectName $ dynamicSubtrees $ distinguishedName $ seeAlso $ olcDefaultSearchBase $ olcRootDN $ olcSchemaDN $ olcSuffix $ olcUpdateDN $ olcAccessLogDB $ member $ owner $ roleOccupant $ manager $ documentAuthor $ secretary $ associatedName $ dITRedirect $ eduPersonOrgDN $ eduPersonOrgUnitDN $ eduPersonPrimaryOrgUnitDN $ supannParrainDN $ supannGroupeAdminDN $ supannGroupeLecteurDN $ urHeliosAccount $ urGaiaAccount $ dgIdentity $ radiusProfileDn ) )
|
|
||||||
matchingRuleUse: ( 2.5.13.0 NAME 'objectIdentifierMatch' APPLIES ( supportedControl $ supportedExtension $ supportedFeatures $ supportedApplicationContext ) )
|
|
||||||
attributeTypes: ( 2.5.4.0 NAME 'objectClass' DESC 'RFC4512: object classes of the entity' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
|
|
||||||
attributeTypes: ( 2.5.21.9 NAME 'structuralObjectClass' DESC 'RFC4512: structural object class of entry' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.18.1 NAME 'createTimestamp' DESC 'RFC4512: time which object was created' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.18.2 NAME 'modifyTimestamp' DESC 'RFC4512: time which object was last modified' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.18.3 NAME 'creatorsName' DESC 'RFC4512: name of creator' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.18.4 NAME 'modifiersName' DESC 'RFC4512: name of last modifier' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.18.9 NAME 'hasSubordinates' DESC 'X.501: entry has children' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.18.10 NAME 'subschemaSubentry' DESC 'RFC4512: name of controlling subschema entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.20 NAME 'entryDN' DESC 'DN of the entry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.16.4 NAME 'entryUUID' DESC 'UUID of the entry' EQUALITY UUIDMatch ORDERING UUIDOrderingMatch SYNTAX 1.3.6.1.1.16.1 SINGLE-VALUE NO-USER-MODIFICATION USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.120.6 NAME 'altServer' DESC 'RFC4512: alternative servers' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.120.5 NAME 'namingContexts' DESC 'RFC4512: naming contexts' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.120.13 NAME 'supportedControl' DESC 'RFC4512: supported controls' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.120.7 NAME 'supportedExtension' DESC 'RFC4512: supported extended operations' SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.120.15 NAME 'supportedLDAPVersion' DESC 'RFC4512: supported LDAP versions' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.120.14 NAME 'supportedSASLMechanisms' DESC 'RFC4512: supported SASL mechanisms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.3.5 NAME 'supportedFeatures' DESC 'RFC4512: features supported by the server' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.4 NAME 'vendorName' DESC 'RFC3045: name of implementation vendor' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.5 NAME 'vendorVersion' DESC 'RFC3045: version of implementation' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 2.5.21.4 NAME 'matchingRules' DESC 'RFC4512: matching rules' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.30 USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.21.5 NAME 'attributeTypes' DESC 'RFC4512: attribute types' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.21.6 NAME 'objectClasses' DESC 'RFC4512: object classes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.21.8 NAME 'matchingRuleUse' DESC 'RFC4512: matching rule uses' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.31 USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.120.16 NAME 'ldapSyntaxes' DESC 'RFC4512: LDAP syntaxes' EQUALITY objectIdentifierFirstComponentMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.54 USAGE directoryOperation )
|
|
||||||
attributeTypes: ( 2.5.4.1 NAME ( 'aliasedObjectName' 'aliasedEntryName' ) DESC 'RFC4512: name of aliased object' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.34 NAME 'ref' DESC 'RFC3296: subordinate referral URL' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 USAGE distributedOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.119.3 NAME 'entryTtl' DESC 'RFC2589: entry time-to-live' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE NO-USER-MODIFICATION USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.1466.101.119.4 NAME 'dynamicSubtrees' DESC 'RFC2589: dynamic subtrees' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION USAGE dSAOperation )
|
|
||||||
attributeTypes: ( 2.5.4.49 NAME 'distinguishedName' DESC 'RFC4519: common supertype of DN attributes' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 2.5.4.41 NAME 'name' DESC 'RFC4519: common supertype of name attributes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
|
|
||||||
attributeTypes: ( 2.5.4.3 NAME ( 'cn' 'commonName' ) DESC 'RFC4519: common name(s) for which the entity is known by' SUP name )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.1 NAME ( 'uid' 'userid' ) DESC 'RFC4519: user identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.0 NAME 'uidNumber' DESC 'RFC2307: An integer uniquely identifying a user in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.1 NAME 'gidNumber' DESC 'RFC2307: An integer uniquely identifying a group in an administrative domain' EQUALITY integerMatch ORDERING integerOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.5.4.35 NAME 'userPassword' DESC 'RFC4519/2307: password of user' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.250.1.57 NAME 'labeledURI' DESC 'RFC2079: Uniform Resource Identifier with optional label' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 2.5.4.13 NAME 'description' DESC 'RFC4519: descriptive information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} )
|
|
||||||
attributeTypes: ( 2.5.4.34 NAME 'seeAlso' DESC 'RFC4519: DN of related object' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.78 NAME 'olcConfigFile' DESC 'File for slapd configuration directives' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.79 NAME 'olcConfigDir' DESC 'Directory for slapd configuration backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.1 NAME 'olcAccess' DESC 'Access Control List' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.86 NAME 'olcAddContentAcl' DESC 'Check ACLs against content of Add ops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.2 NAME 'olcAllows' DESC 'Allowed set of deprecated features' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.3 NAME 'olcArgsFile' DESC 'File for slapd command line options' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.5 NAME 'olcAttributeOptions' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.4 NAME 'olcAttributeTypes' DESC 'OpenLDAP attributeTypes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.6 NAME 'olcAuthIDRewrite' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.7 NAME 'olcAuthzPolicy' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.8 NAME 'olcAuthzRegexp' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.9 NAME 'olcBackend' DESC 'A type of backend' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORDERED 'SIBLINGS' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.10 NAME 'olcConcurrency' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.11 NAME 'olcConnMaxPending' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.12 NAME 'olcConnMaxPendingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.13 NAME 'olcDatabase' DESC 'The backend type for a database instance' SUP olcBackend SINGLE-VALUE X-ORDERED 'SIBLINGS' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.14 NAME 'olcDefaultSearchBase' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.15 NAME 'olcDisallows' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.16 NAME 'olcDitContentRules' DESC 'OpenLDAP DIT content rules' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.20 NAME 'olcExtraAttrs' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.17 NAME 'olcGentleHUP' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.17 NAME 'olcHidden' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.18 NAME 'olcIdleTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.19 NAME 'olcInclude' SUP labeledURI )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.20 NAME 'olcIndexSubstrIfMinLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.21 NAME 'olcIndexSubstrIfMaxLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.22 NAME 'olcIndexSubstrAnyLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.23 NAME 'olcIndexSubstrAnyStep' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.84 NAME 'olcIndexIntLen' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.4 NAME 'olcLastMod' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.85 NAME 'olcLdapSyntaxes' DESC 'OpenLDAP ldapSyntax' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.5 NAME 'olcLimits' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.93 NAME 'olcListenerThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.26 NAME 'olcLocalSSF' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.27 NAME 'olcLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.28 NAME 'olcLogLevel' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.6 NAME 'olcMaxDerefDepth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.16 NAME 'olcMirrorMode' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.30 NAME 'olcModuleLoad' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.31 NAME 'olcModulePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.18 NAME 'olcMonitoring' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.32 NAME 'olcObjectClasses' DESC 'OpenLDAP object classes' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.33 NAME 'olcObjectIdentifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.34 NAME 'olcOverlay' SUP olcDatabase SINGLE-VALUE X-ORDERED 'SIBLINGS' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.35 NAME 'olcPasswordCryptSaltFormat' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.36 NAME 'olcPasswordHash' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.37 NAME 'olcPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.38 NAME 'olcPlugin' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.39 NAME 'olcPluginLogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.40 NAME 'olcReadOnly' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.41 NAME 'olcReferral' SUP labeledURI SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.7 NAME 'olcReplica' SUP labeledURI EQUALITY caseIgnoreMatch X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.43 NAME 'olcReplicaArgsFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.44 NAME 'olcReplicaPidFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.45 NAME 'olcReplicationInterval' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.46 NAME 'olcReplogFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.47 NAME 'olcRequires' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.48 NAME 'olcRestrict' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.49 NAME 'olcReverseLookup' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.8 NAME 'olcRootDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.51 NAME 'olcRootDSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.9 NAME 'olcRootPW' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.89 NAME 'olcSaslAuxprops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.53 NAME 'olcSaslHost' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.54 NAME 'olcSaslRealm' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.56 NAME 'olcSaslSecProps' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.58 NAME 'olcSchemaDN' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.59 NAME 'olcSecurity' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.81 NAME 'olcServerID' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.60 NAME 'olcSizeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.61 NAME 'olcSockbufMaxIncoming' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.62 NAME 'olcSockbufMaxIncomingAuth' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.83 NAME 'olcSortVals' DESC 'Attributes whose values will always be sorted' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.15 NAME 'olcSubordinate' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.10 NAME 'olcSuffix' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.19 NAME 'olcSyncUseSubentry' DESC 'Store sync context in a subentry' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.11 NAME 'olcSyncrepl' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.90 NAME 'olcTCPBuffer' DESC 'Custom TCP buffer size' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.66 NAME 'olcThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.67 NAME 'olcTimeLimit' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.68 NAME 'olcTLSCACertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.69 NAME 'olcTLSCACertificatePath' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.70 NAME 'olcTLSCertificateFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.71 NAME 'olcTLSCertificateKeyFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.72 NAME 'olcTLSCipherSuite' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.73 NAME 'olcTLSCRLCheck' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.82 NAME 'olcTLSCRLFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.74 NAME 'olcTLSRandFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.75 NAME 'olcTLSVerifyClient' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.77 NAME 'olcTLSDHParamFile' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.96 NAME 'olcTLSECName' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.87 NAME 'olcTLSProtocolMin' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.80 NAME 'olcToolThreads' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.12 NAME 'olcUpdateDN' SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.13 NAME 'olcUpdateRef' SUP labeledURI EQUALITY caseIgnoreMatch )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.0.88 NAME 'olcWriteTimeout' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.1 NAME 'olcDbDirectory' DESC 'Directory for database content' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.1.2 NAME 'olcDbCheckpoint' DESC 'Database checkpoint interval in kbytes and minutes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.1.4 NAME 'olcDbNoSync' DESC 'Disable synchronous database writes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.12.3 NAME 'olcDbEnvFlags' DESC 'Database environment flags' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.2 NAME 'olcDbIndex' DESC 'Attribute index parameters' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.12.1 NAME 'olcDbMaxReaders' DESC 'Maximum number of threads that may access the DB concurrently' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.12.2 NAME 'olcDbMaxSize' DESC 'Maximum size of DB in bytes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.0.3 NAME 'olcDbMode' DESC 'Unix permissions of database files' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.12.5 NAME 'olcDbRtxnSize' DESC 'Number of entries to process in one read transaction' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.2.1.9 NAME 'olcDbSearchStack' DESC 'Depth of search stack in IDLs' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.1.1 NAME 'olcSpCheckpoint' DESC 'ContextCSN checkpoint interval in ops and minutes' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.1.2 NAME 'olcSpSessionlog' DESC 'Session log size in ops' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.1.3 NAME 'olcSpNoPresent' DESC 'Omit Present phase processing' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.1.4 NAME 'olcSpReloadHint' DESC 'Observe Reload Hint in Request control' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.4.1 NAME 'olcAccessLogDB' DESC 'Suffix of database for log content' SUP distinguishedName SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.4.2 NAME 'olcAccessLogOps' DESC 'Operation types to log' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.4.3 NAME 'olcAccessLogPurge' DESC 'Log cleanup parameters' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.4.4 NAME 'olcAccessLogSuccess' DESC 'Log successful ops only' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.4.5 NAME 'olcAccessLogOld' DESC 'Log old values when modifying entries matching the filter' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.4.6 NAME 'olcAccessLogOldAttr' DESC 'Log old values of these attributes even if unmodified' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.4.7 NAME 'olcAccessLogBase' DESC 'Operation types to log under a specific branch' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.1.12.2.3.3.8.1 NAME 'olcDlAttrSet' DESC 'Dynamic list: <group objectClass>, <URL attributeDescription>, <member attributeDescription>' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 2.5.4.2 NAME 'knowledgeInformation' DESC 'RFC2256: knowledge information' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
|
|
||||||
attributeTypes: ( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.5 NAME 'serialNumber' DESC 'RFC2256: serial number of the entity' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{64} )
|
|
||||||
attributeTypes: ( 2.5.4.6 NAME ( 'c' 'countryName' ) DESC 'RFC4519: two-letter ISO-3166 country code' SUP name SYNTAX 1.3.6.1.4.1.1466.115.121.1.11 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.5.4.7 NAME ( 'l' 'localityName' ) DESC 'RFC2256: locality which this object resides in' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.8 NAME ( 'st' 'stateOrProvinceName' ) DESC 'RFC2256: state or province which this object resides in' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.9 NAME ( 'street' 'streetAddress' ) DESC 'RFC2256: street address of this object' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 2.5.4.10 NAME ( 'o' 'organizationName' ) DESC 'RFC2256: organization this object belongs to' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.11 NAME ( 'ou' 'organizationalUnitName' ) DESC 'RFC2256: organizational unit this object belongs to' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.12 NAME 'title' DESC 'RFC2256: title associated with the entity' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.14 NAME 'searchGuide' DESC 'RFC2256: search guide, deprecated by enhancedSearchGuide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.25 )
|
|
||||||
attributeTypes: ( 2.5.4.15 NAME 'businessCategory' DESC 'RFC2256: business category' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 2.5.4.16 NAME 'postalAddress' DESC 'RFC2256: postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )
|
|
||||||
attributeTypes: ( 2.5.4.17 NAME 'postalCode' DESC 'RFC2256: postal code' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} )
|
|
||||||
attributeTypes: ( 2.5.4.18 NAME 'postOfficeBox' DESC 'RFC2256: Post Office Box' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{40} )
|
|
||||||
attributeTypes: ( 2.5.4.19 NAME 'physicalDeliveryOfficeName' DESC 'RFC2256: Physical Delivery Office Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 2.5.4.20 NAME 'telephoneNumber' DESC 'RFC2256: Telephone Number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} )
|
|
||||||
attributeTypes: ( 2.5.4.21 NAME 'telexNumber' DESC 'RFC2256: Telex Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.52 )
|
|
||||||
attributeTypes: ( 2.5.4.22 NAME 'teletexTerminalIdentifier' DESC 'RFC2256: Teletex Terminal Identifier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.51 )
|
|
||||||
attributeTypes: ( 2.5.4.23 NAME ( 'facsimileTelephoneNumber' 'fax' ) DESC 'RFC2256: Facsimile (Fax) Telephone Number' SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 )
|
|
||||||
attributeTypes: ( 2.5.4.24 NAME 'x121Address' DESC 'RFC2256: X.121 Address' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{15} )
|
|
||||||
attributeTypes: ( 2.5.4.25 NAME 'internationaliSDNNumber' DESC 'RFC2256: international ISDN number' EQUALITY numericStringMatch SUBSTR numericStringSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} )
|
|
||||||
attributeTypes: ( 2.5.4.26 NAME 'registeredAddress' DESC 'RFC2256: registered postal address' SUP postalAddress SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )
|
|
||||||
attributeTypes: ( 2.5.4.27 NAME 'destinationIndicator' DESC 'RFC2256: destination indicator' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} )
|
|
||||||
attributeTypes: ( 2.5.4.28 NAME 'preferredDeliveryMethod' DESC 'RFC2256: preferred delivery method' SYNTAX 1.3.6.1.4.1.1466.115.121.1.14 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.5.4.29 NAME 'presentationAddress' DESC 'RFC2256: presentation address' EQUALITY presentationAddressMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.5.4.30 NAME 'supportedApplicationContext' DESC 'RFC2256: supported application context' EQUALITY objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
|
|
||||||
attributeTypes: ( 2.5.4.31 NAME 'member' DESC 'RFC2256: member of a group' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 2.5.4.32 NAME 'owner' DESC 'RFC2256: owner (of the object)' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 2.5.4.33 NAME 'roleOccupant' DESC 'RFC2256: occupant of role' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 2.5.4.36 NAME 'userCertificate' DESC 'RFC2256: X.509 user certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )
|
|
||||||
attributeTypes: ( 2.5.4.37 NAME 'cACertificate' DESC 'RFC2256: X.509 CA certificate, use ;binary' EQUALITY certificateExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.8 )
|
|
||||||
attributeTypes: ( 2.5.4.38 NAME 'authorityRevocationList' DESC 'RFC2256: X.509 authority revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )
|
|
||||||
attributeTypes: ( 2.5.4.39 NAME 'certificateRevocationList' DESC 'RFC2256: X.509 certificate revocation list, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )
|
|
||||||
attributeTypes: ( 2.5.4.40 NAME 'crossCertificatePair' DESC 'RFC2256: X.509 cross certificate pair, use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.10 )
|
|
||||||
attributeTypes: ( 2.5.4.42 NAME ( 'givenName' 'gn' ) DESC 'RFC2256: first name(s) for which the entity is known by' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.43 NAME 'initials' DESC 'RFC2256: initials of some or all of names, but not the surname(s).' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.44 NAME 'generationQualifier' DESC 'RFC2256: name qualifier indicating a generation' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.45 NAME 'x500UniqueIdentifier' DESC 'RFC2256: X.500 unique identifier' EQUALITY bitStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )
|
|
||||||
attributeTypes: ( 2.5.4.46 NAME 'dnQualifier' DESC 'RFC2256: DN qualifier' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 )
|
|
||||||
attributeTypes: ( 2.5.4.47 NAME 'enhancedSearchGuide' DESC 'RFC2256: enhanced search guide' SYNTAX 1.3.6.1.4.1.1466.115.121.1.21 )
|
|
||||||
attributeTypes: ( 2.5.4.48 NAME 'protocolInformation' DESC 'RFC2256: protocol information' EQUALITY protocolInformationMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )
|
|
||||||
attributeTypes: ( 2.5.4.50 NAME 'uniqueMember' DESC 'RFC2256: unique member of a group' EQUALITY uniqueMemberMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )
|
|
||||||
attributeTypes: ( 2.5.4.51 NAME 'houseIdentifier' DESC 'RFC2256: house identifier' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )
|
|
||||||
attributeTypes: ( 2.5.4.52 NAME 'supportedAlgorithms' DESC 'RFC2256: supported algorithms' SYNTAX 1.3.6.1.4.1.1466.115.121.1.49 )
|
|
||||||
attributeTypes: ( 2.5.4.53 NAME 'deltaRevocationList' DESC 'RFC2256: delta revocation list; use ;binary' SYNTAX 1.3.6.1.4.1.1466.115.121.1.9 )
|
|
||||||
attributeTypes: ( 2.5.4.54 NAME 'dmdName' DESC 'RFC2256: name of DMD' SUP name )
|
|
||||||
attributeTypes: ( 2.5.4.65 NAME 'pseudonym' DESC 'X.520(4th): pseudonym for the object' SUP name )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.3 NAME ( 'mail' 'rfc822Mailbox' ) DESC 'RFC1274: RFC822 Mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.25 NAME ( 'dc' 'domainComponent' ) DESC 'RFC1274/2247: domain component' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.37 NAME 'associatedDomain' DESC 'RFC1274: domain associated with object' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.2.840.113549.1.9.1 NAME ( 'email' 'emailAddress' 'pkcs9email' ) DESC 'RFC3280: legacy attribute for email addresses in DNs' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.2 NAME 'textEncodedORAddress' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.4 NAME 'info' DESC 'RFC1274: general information' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2048} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.5 NAME ( 'drink' 'favouriteDrink' ) DESC 'RFC1274: favorite drink' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.6 NAME 'roomNumber' DESC 'RFC1274: room number' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.7 NAME 'photo' DESC 'RFC1274: photo (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23{25000} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.8 NAME 'userClass' DESC 'RFC1274: category of user' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.9 NAME 'host' DESC 'RFC1274: host computer' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.10 NAME 'manager' DESC 'RFC1274: DN of manager' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.11 NAME 'documentIdentifier' DESC 'RFC1274: unique identifier of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.12 NAME 'documentTitle' DESC 'RFC1274: title of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.13 NAME 'documentVersion' DESC 'RFC1274: version of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.14 NAME 'documentAuthor' DESC 'RFC1274: DN of author of document' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.15 NAME 'documentLocation' DESC 'RFC1274: location of document original' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.20 NAME ( 'homePhone' 'homeTelephoneNumber' ) DESC 'RFC1274: home telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.21 NAME 'secretary' DESC 'RFC1274: DN of secretary' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.22 NAME 'otherMailbox' SYNTAX 1.3.6.1.4.1.1466.115.121.1.39 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.26 NAME 'aRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.27 NAME 'mDRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.28 NAME 'mXRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.29 NAME 'nSRecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.30 NAME 'sOARecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.31 NAME 'cNAMERecord' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.38 NAME 'associatedName' DESC 'RFC1274: DN of entry associated with domain' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.39 NAME 'homePostalAddress' DESC 'RFC1274: home postal address' EQUALITY caseIgnoreListMatch SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.40 NAME 'personalTitle' DESC 'RFC1274: personal title' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.41 NAME ( 'mobile' 'mobileTelephoneNumber' ) DESC 'RFC1274: mobile telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.42 NAME ( 'pager' 'pagerTelephoneNumber' ) DESC 'RFC1274: pager telephone number' EQUALITY telephoneNumberMatch SUBSTR telephoneNumberSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.43 NAME ( 'co' 'friendlyCountryName' ) DESC 'RFC1274: friendly country name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.44 NAME 'uniqueIdentifier' DESC 'RFC1274: unique identifer' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.45 NAME 'organizationalStatus' DESC 'RFC1274: organizational status' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.46 NAME 'janetMailbox' DESC 'RFC1274: Janet mailbox' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.47 NAME 'mailPreferenceOption' DESC 'RFC1274: mail preference option' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.48 NAME 'buildingName' DESC 'RFC1274: name of building' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.49 NAME 'dSAQuality' DESC 'RFC1274: DSA Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.19 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.50 NAME 'singleLevelQuality' DESC 'RFC1274: Single Level Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.51 NAME 'subtreeMinimumQuality' DESC 'RFC1274: Subtree Mininum Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.52 NAME 'subtreeMaximumQuality' DESC 'RFC1274: Subtree Maximun Quality' SYNTAX 1.3.6.1.4.1.1466.115.121.1.13 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.53 NAME 'personalSignature' DESC 'RFC1274: Personal Signature (G3 fax)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.23 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.54 NAME 'dITRedirect' DESC 'RFC1274: DIT Redirect' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.55 NAME 'audio' DESC 'RFC1274: audio (u-law)' SYNTAX 1.3.6.1.4.1.1466.115.121.1.4{25000} )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.56 NAME 'documentPublisher' DESC 'RFC1274: publisher of document' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.2 NAME 'gecos' DESC 'The GECOS field; the common name' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'The absolute path to the home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.4 NAME 'loginShell' DESC 'The path to the login shell' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.5 NAME 'shadowLastChange' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.6 NAME 'shadowMin' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.7 NAME 'shadowMax' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.8 NAME 'shadowWarning' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.9 NAME 'shadowInactive' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.10 NAME 'shadowExpire' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.11 NAME 'shadowFlag' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.12 NAME 'memberUid' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.13 NAME 'memberNisNetgroup' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.14 NAME 'nisNetgroupTriple' DESC 'Netgroup triple' SYNTAX 1.3.6.1.1.1.0.0 )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.15 NAME 'ipServicePort' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.16 NAME 'ipServiceProtocol' SUP name )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.17 NAME 'ipProtocolNumber' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.18 NAME 'oncRpcNumber' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.19 NAME 'ipHostNumber' DESC 'IP address' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.20 NAME 'ipNetworkNumber' DESC 'IP network' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.21 NAME 'ipNetmaskNumber' DESC 'IP netmask' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.22 NAME 'macAddress' DESC 'MAC address' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.23 NAME 'bootParameter' DESC 'rpc.bootparamd parameter' SYNTAX 1.3.6.1.1.1.0.1 )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.24 NAME 'bootFile' DESC 'Boot image name' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.26 NAME 'nisMapName' SUP name )
|
|
||||||
attributeTypes: ( 1.3.6.1.1.1.1.27 NAME 'nisMapEntry' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{1024} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.1 NAME 'carLicense' DESC 'RFC2798: vehicle license or registration plate' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.2 NAME 'departmentNumber' DESC 'RFC2798: identifies a department within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.241 NAME 'displayName' DESC 'RFC2798: preferred name to be used when displaying entries' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.3 NAME 'employeeNumber' DESC 'RFC2798: numerically identifies an employee within an organization' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.4 NAME 'employeeType' DESC 'RFC2798: type of employment for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 0.9.2342.19200300.100.1.60 NAME 'jpegPhoto' DESC 'RFC2798: a JPEG image' SYNTAX 1.3.6.1.4.1.1466.115.121.1.28 )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.39 NAME 'preferredLanguage' DESC 'RFC2798: preferred written or spoken language for a person' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.40 NAME 'userSMIMECertificate' DESC 'RFC2798: PKCS#7 SignedData used to support S/MIME' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.216 NAME 'userPKCS12' DESC 'RFC2798: personal identity information, a PKCS #12 PFX' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.2.1.2 NAME 'eduOrgHomePageURI' DESC 'eduOrg per Internet2 and EDUCAUSE' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.2.1.3 NAME 'eduOrgIdentityAuthNPolicyURI' DESC 'eduOrg per Internet2 and EDUCAUSE' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.2.1.4 NAME 'eduOrgLegalName' DESC 'eduOrg per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.2.1.5 NAME 'eduOrgSuperiorURI' DESC 'eduOrg per Internet2 and EDUCAUSE' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.2.1.6 NAME 'eduOrgWhitePagesURI' DESC 'eduOrg per Internet2 and EDUCAUSE' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.1 NAME 'eduPersonAffiliation' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.2 NAME 'eduPersonNickname' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.3 NAME 'eduPersonOrgDN' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.4 NAME 'eduPersonOrgUnitDN' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.5 NAME 'eduPersonPrimaryAffiliation' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.6 NAME 'eduPersonPrincipalName' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.7 NAME 'eduPersonEntitlement' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.8 NAME 'eduPersonPrimaryOrgUnitDN' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.9 NAME 'eduPersonScopedAffiliation' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.10 NAME 'eduPersonTargetedID' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.1.1.11 NAME 'eduPersonAssurance' DESC 'eduPerson per Internet2 and EDUCAUSE' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.5.1.1 NAME 'isMemberOf' DESC 'identifiers for groups to which containing entity belongs' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.5923.1.5.1.2 NAME 'hasMember' DESC 'identifiers for entities that are members of the group' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.24 NAME 'sambaLMPassword' DESC 'LanManager Password' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.25 NAME 'sambaNTPassword' DESC 'MD4 hash of the unicode password' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.26 NAME 'sambaAcctFlags' DESC 'Account Flags' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{16} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.27 NAME 'sambaPwdLastSet' DESC 'Timestamp of the last password update' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.28 NAME 'sambaPwdCanChange' DESC 'Timestamp of when the user is allowed to update the password' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.29 NAME 'sambaPwdMustChange' DESC 'Timestamp of when the password will expire' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.30 NAME 'sambaLogonTime' DESC 'Timestamp of last logon' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.31 NAME 'sambaLogoffTime' DESC 'Timestamp of last logoff' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.32 NAME 'sambaKickoffTime' DESC 'Timestamp of when the user will be logged off automatically' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.48 NAME 'sambaBadPasswordCount' DESC 'Bad password attempt count' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.49 NAME 'sambaBadPasswordTime' DESC 'Time of the last bad password attempt' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.55 NAME 'sambaLogonHours' DESC 'Logon Hours' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{42} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.33 NAME 'sambaHomeDrive' DESC 'Driver letter of home directory mapping' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{4} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.34 NAME 'sambaLogonScript' DESC 'Logon script path' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.35 NAME 'sambaProfilePath' DESC 'Roaming profile path' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.36 NAME 'sambaUserWorkstations' DESC 'List of user workstations the user is allowed to logon to' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.37 NAME 'sambaHomePath' DESC 'Home directory UNC path' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.38 NAME 'sambaDomainName' DESC 'Windows NT domain to which the user belongs' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.47 NAME 'sambaMungedDial' DESC 'Base64 encoded user parameter string' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1050} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.54 NAME 'sambaPasswordHistory' DESC 'Concatenated MD5 hashes of the salted NT passwords used on this account' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.20 NAME 'sambaSID' DESC 'Security ID' EQUALITY caseIgnoreIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.23 NAME 'sambaPrimaryGroupSID' DESC 'Primary Group Security ID' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.51 NAME 'sambaSIDList' DESC 'Security ID List' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.19 NAME 'sambaGroupType' DESC 'NT Group Type' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.21 NAME 'sambaNextUserRid' DESC 'Next NT rid to give our for users' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.22 NAME 'sambaNextGroupRid' DESC 'Next NT rid to give out for groups' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.39 NAME 'sambaNextRid' DESC 'Next NT rid to give out for anything' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.40 NAME 'sambaAlgorithmicRidBase' DESC 'Base at which the samba RID generation algorithm should operate' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.41 NAME 'sambaShareName' DESC 'Share Name' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.42 NAME 'sambaOptionName' DESC 'Option Name' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.43 NAME 'sambaBoolOption' DESC 'A boolean option' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.44 NAME 'sambaIntegerOption' DESC 'An integer option' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.45 NAME 'sambaStringOption' DESC 'A string option' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.46 NAME 'sambaStringListOption' DESC 'A string list option' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.53 NAME 'sambaTrustFlags' DESC 'Trust Password Flags' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.58 NAME 'sambaMinPwdLength' DESC 'Minimal password length (default: 5)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.59 NAME 'sambaPwdHistoryLength' DESC 'Length of Password History Entries (default: 0 => off)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.60 NAME 'sambaLogonToChgPwd' DESC 'Force Users to logon for password change (default: 0 => off, 2 => on)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.61 NAME 'sambaMaxPwdAge' DESC 'Maximum password age, in seconds (default: -1 => never expire passwords)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.62 NAME 'sambaMinPwdAge' DESC 'Minimum password age, in seconds (default: 0 => allow immediate password change)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.63 NAME 'sambaLockoutDuration' DESC 'Lockout duration in minutes (default: 30, -1 => forever)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.64 NAME 'sambaLockoutObservationWindow' DESC 'Reset time after lockout in minutes (default: 30)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.65 NAME 'sambaLockoutThreshold' DESC 'Lockout users after bad logon attempts (default: 0 => off)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.66 NAME 'sambaForceLogoff' DESC 'Disconnect Users outside logon hours (default: -1 => off, 0 => on)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.67 NAME 'sambaRefuseMachinePwdChange' DESC 'Allow Machine Password changes (default: 0 => off)' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.68 NAME 'sambaClearTextPassword' DESC 'Clear text password (used for trusted domain passwords)' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7165.2.1.69 NAME 'sambaPreviousClearTextPassword' DESC 'Previous clear text password (used for trusted domain passwords)' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey' DESC 'MANDATORY: OpenSSH Public key' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.1 NAME 'attuhbcategorie' DESC 'categorie de personnel : doctorant,retraite,...' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.2 NAME 'attuhbcodecorps' DESC 'corps (IGE,Attache...)' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.3 NAME 'attuhbcorps' DESC 'corps (IGE,Attache...)' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.4 NAME 'attuhbcodetype' DESC 'type (enseignant, ATER, ...)' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.5 NAME 'attuhbtype' DESC 'type (enseignant, ATER, ...)' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.6 NAME 'attuhbcodecnu' DESC 'Code discipline' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.7 NAME 'attuhbcnu' DESC 'Code discipline' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.8 NAME 'attuhbetab' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.9 NAME 'attuhbcomp' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.10 NAME 'attuhbResponsabilite' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.11 NAME 'attuhbmanager' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.12 NAME 'attuhbalias' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.13 NAME 'attuhbdatenais' DESC 'indique la date de naissance de l"entree correspondante' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.14 NAME 'attuhbcodelr' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.15 NAME 'attuhbintranet' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.16 NAME 'attuhbextranet' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.17 NAME 'attuhbcampus' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.18 NAME 'attuhbaffectation' DESC 'Code Affectation' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.19 NAME 'attuhbdatefin' DESC 'indique la date de fin de validite de l"entree correspondante' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.20 NAME 'attuhbcodevalid' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.21 NAME 'attuhbhashid' DESC 'hash id' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.22 NAME 'attuhbdateouvcompte' DESC 'indique la date de creation de l"entree correspondante' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.23 NAME 'attuhbdatemaj' DESC 'indique la date de la derniere mise a jour de l"entree correspondante' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.24 NAME 'attuhbLastSetPasswordID' DESC 'Indique qui a mis a jour le mot de passe en dernier' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.25 NAME 'attuhbPays' DESC 'Nom du pays pour l"adresse' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.26 NAME 'attuhbetp' DESC 'Code etape DGRUS1' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.27 NAME 'attuhbins' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.28 NAME 'attuhbdroitacces' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.29 NAME 'attuhbWebmasterHome' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.30 NAME 'attuhbstatut' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.31 NAME 'attuhbregins' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.32 NAME 'attuhbprofil' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.33 NAME 'attuhbetaPmt' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.34 NAME 'attuhbelp' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.35 NAME 'attuhbcleactivation' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.36 NAME 'attuhblibade' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.1.37 NAME 'attuhbgfocod' EQUALITY caseIgnoreMatch ORDERING caseIgnoreOrderingMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.3.2 NAME 'attuhbcompType' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.3.3 NAME 'attuhbcompRespEns' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.3.4 NAME 'attuhbcompRespTech' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.3.5 NAME 'attuhbcompRespAdm' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.3.6 NAME 'attuhbcompLibelleCourt' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.149.2.1.1.1.3.7 NAME 'attuhbcompLibelle' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.1 NAME 'supannListeRouge' DESC 'indique que l entree correspondante n est pas publique' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.2 NAME 'supannActivite' DESC 'activite ou metier de la personne' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.3 NAME 'supannOrganisme' DESC 'code organisme d appartenance' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.4 NAME 'supannCivilite' DESC 'civilite : M., Mme, Mlle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{32} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.5 NAME 'supannAffectation' DESC 'affectation' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.6 NAME 'supannCodeEntite' DESC 'identifiant d entite' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.7 NAME 'supannCodeEntiteParent' DESC 'identifiant d entite parente' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.8 NAME 'supannEntiteAffectation' DESC 'identifiant d entite d affectation' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.9 NAME 'supannCodeINE' DESC 'code INE' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.10 NAME 'supannEtuId' DESC 'identifiant scolarite' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.11 NAME 'supannEmpId' DESC 'identifiant personnel' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.12 NAME 'supannAutreTelephone' DESC 'numeros de telephone secondaires' SUP telephoneNumber )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.13 NAME 'supannEntiteAffectationPrincipale' DESC 'identifiant d entite principale d affectation' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.14 NAME 'supannEtablissement' DESC 'code d etablissement' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.15 NAME 'supannMailPerso' DESC 'Mailbox RFC822 privee' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.16 NAME 'supannTypeEntite' DESC 'type de structure ou entite' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.17 NAME 'supannParrainDN' DESC 'dn du responsable de cette entree' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.18 NAME 'supannGroupeDateFin' DESC 'indique la date de fin de validite de l entree correspondante' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.19 NAME 'supannGroupeAdminDN' DESC 'dn des administrateurs du groupe concerne' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.20 NAME 'supannAliasLogin' DESC 'login personalise' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.21 NAME 'supannRole' DESC 'role' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.22 NAME 'supannGroupeLecteurDN' DESC 'dn des entites habilite a lire le contenu d un groupe' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.23 NAME 'supannRoleGenerique' DESC 'role generique d une personne' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.24 NAME 'supannRoleEntite' DESC 'role contextuel' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{512} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.25 NAME 'supannEtuAnneeInscription' DESC 'annee inscription' EQUALITY numericStringMatch ORDERING numericStringOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{4} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.26 NAME 'supannEtuCursusAnnee' DESC 'cursus et annee dans le diplome' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.27 NAME 'supannEtuDiplome' DESC 'diplome' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.28 NAME 'supannEtuElementPedagogique' DESC 'element pedagogique' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.29 NAME 'supannEtuEtape' DESC 'etape' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.30 NAME 'supannEtuInscription' DESC 'description d inscriptions' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.31 NAME 'supannEtuRegimeInscription' DESC 'regime d inscription' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.32 NAME 'supannEtuSecteurDisciplinaire' DESC 'secteur disciplinaire' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.33 NAME 'supannEtuTypeDiplome' DESC 'type de diplome' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.34 NAME 'supannAutreMail' DESC 'adresses mail non institutionnelles' SUP mail )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.35 NAME 'supannEmpCorps' DESC 'corps d appartenance d un agent' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.36 NAME 'supannTypeEntiteAffectation' DESC 'type de structure ou entite d affectation' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.2.1.37 NAME 'supannRefId' DESC 'identifiant partage avec autre brique du SI' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.17 NAME 'mailForwardingAddress' DESC 'Netscape Messaging Server 4.x defined attribute' EQUALITY caseIgnoreMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 X-ORIGIN 'Netscape Messaging Server 4.x' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.1 NAME 'runUnivMemberURL' DESC 'URL associated with each member of an auto group' SUP labeledURI )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.2 NAME 'runUnivPassword' DESC 'Mot de passe RFC2256/2307 d"un utilisateur, pour besoins speciaux' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.4 NAME 'runUnivToipInternal' DESC 'Numero TOIP interne' EQUALITY numericStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.5 NAME 'runUnivToipExternal' DESC 'Numero TOIP externe (SDA)' EQUALITY numericStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.36{16} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.6 NAME 'runUnivToipEnabled' DESC 'L"acces a la TOIP est-il actif?' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.7 NAME 'runUnivToipAffectation' DESC 'Chemin de l"affectation a une structure' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.8 NAME 'runUnivJpegPhotoDate' DESC 'Date de reference' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.1.9 NAME 'runUnivSihamId' DESC 'Identifiant SIHAM' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.1 NAME 'runUnivLastModified' DESC 'Date de derniere modification' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.2 NAME 'runUnivAuthorization' DESC 'Autorisations pour un service' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.3 NAME 'runUnivNoInsee' DESC 'Numero de securite sociale et cle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{15} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.4 NAME 'runUnivDateFin' DESC 'Date de fin de validite de cet objet' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.5 NAME 'runUnivAttribute' DESC 'Attributs d"un objet' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.6 NAME 'runUnivIndAffectation' DESC 'Informations sur l"affectation d"un individu a une structure' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.7 NAME 'runUnivPersInfos' DESC 'Informations sur un personnel' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.10.8 NAME 'runUnivDateNaissance' DESC 'Date de naissance d"un individu' EQUALITY generalizedTimeMatch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.5 NAME 'runUnivMailAlias' DESC 'Alias mail locaux' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.6 NAME 'runUnivMailGroup' DESC 'Groupe dont le mail de l"objet fait partie' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.7 NAME 'runUnivMailRoute' DESC 'Adresse de routage' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.8 NAME 'runUnivMailHost' DESC 'Serveur SMTP / MTA à qui router le mail' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.9 NAME 'runUnivMailMember' DESC 'Mail faisant partie du groupe de l"objet' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.12 NAME 'runUnivTelephonePerso' DESC 'Numero de telephone personnel' SUP telephoneNumber )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.13 NAME 'runUnivStrInfos' DESC 'Informations sur la structure' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.14 NAME 'runUnivStrResp' DESC 'Responsables de la structure' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.16 NAME 'runUnivLocalisation' DESC 'Localisation d"un individu ou d"une structure' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.17 NAME 'runUnivIndInfos' DESC 'Informations sur l"individu' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.18 NAME 'runUnivNom' DESC 'Nom sans les accents' SUP name )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.19 NAME 'runUnivPrenom' DESC 'Prenom sans les accents' SUP name )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.20 NAME 'runUnivDiplome' DESC 'Diplomes d"un individu' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.21 NAME 'runUnivAdressePerso' DESC 'Adresse personnelle d"un individu' SUP postalAddress )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.1.3.1 NAME 'runUnivWgClient' DESC 'Informations client WireGuard' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.4 NAME 'runUnivSshPublicKey' DESC 'Cle publique pour un acces par ssh' EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.10 NAME 'runUnivLsc' DESC 'Mot de passe crypté pour lsc' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.11 NAME 'runUnivCasAccepted' DESC 'Contrats acceptés par un utilisateur' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.30.1 NAME 'runUnivCategorie' DESC 'Categories et services autorises' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.50.1 NAME 'runUnivAccountUid' DESC 'uid d"un compte' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.1 NAME 'runUnivScheduledOperation' DESC 'Operations devant etre replanifiees' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.2 NAME 'runUnivAccessDenied' DESC 'L"acces au service est-il interdit?' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.70.3 NAME 'runUnivAccessAllowed' DESC 'L"acces au service est-il autorise?' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.110.2 NAME 'runUnivHeliosAccountUid' DESC 'uid d"un compte sur helios.univ-reunion.fr' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.110.3 NAME 'runUnivGaiaAccountUid' DESC 'uid d"un compte sur gaia.univ-reunion.fr' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.110.4 NAME 'runUnivExtAccountUid' DESC 'uid d"un compte sur sirius.univ-reunion.fr' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.1 NAME 'runUnivHarpTypePopulation' DESC 'Type de population dans HARPEGE' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{43} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.2 NAME 'runUnivHarpStructure' DESC 'Structure d"affectation' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{66} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.3 NAME 'harpegeStructureCode' DESC 'Code structure dans HARPEGE' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{5} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.4 NAME 'harpegeStructureCodePere' DESC 'Code structure pere dans HARPEGE' EQUALITY caseExactMatch SUBSTR caseExactSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{5} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.5 NAME 'harpegeStructureLibelleCourt' DESC 'Libelle court de la structure' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{20} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.6 NAME 'harpegeStructureLibelle' DESC 'Libelle long de la structure' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{60} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.7 NAME 'harpegeStructureType' DESC 'Type de structure parmi E, C, A' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{2} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.120.8 NAME 'harpegeStructureCodeRNE' DESC 'Code RNE pour la structure' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{8} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.130.1 NAME 'runUnivApoComposante' DESC 'Composante d"inscription' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{44} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.130.2 NAME 'runUnivApoEtape' DESC 'Etape d"inscription' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{67} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.205.1 NAME 'runUnivBvProfil' DESC 'Profil dans le BV (XL, M, ...)' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.205.2 NAME 'runUnivBvMailExterne' DESC 'Mail externe pour le BV' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.207.1 NAME 'runUnivGoogleGroupOwner' DESC 'Propriétaire du groupe' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.100.3 NAME 'urHeliosAccount' DESC 'un compte sur helios.univ-reunion.fr' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.100.4 NAME 'urGaiaAccount' DESC 'un compte sur gaia.univ-reunion.fr' SUP distinguishedName )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.110.1 NAME 'runUnivLegacyWebProhibited' DESC 'autorisation d"aller sur le web' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.200.2 NAME 'urAccessAllowed' DESC 'L"acces au service est-il autorise?' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.204.1 NAME 'urBvProfil' DESC 'Profil dans le BV (XL, M, ...)' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.204.2 NAME 'urMail' DESC 'Mail universite' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.7135.1.3.164.204.3 NAME 'urBvMailExterne' DESC 'Mail externe pour le BV' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 2.16.840.1.113730.3.1.198 NAME 'memberURL' DESC 'Identifies an URL associated with each member of a group. Any type of labeled URL can be used.' SUP labeledURI )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.666.11.8.1.1 NAME 'dgIdentity' DESC 'Identity to use when processing the memberURL' SUP distinguishedName SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.4203.666.11.8.1.2 NAME 'dgAuthz' DESC 'Optional authorization rules that determine who is allowed to assume the dgIdentity' EQUALITY authzMatch SYNTAX 1.3.6.1.4.1.4203.666.2.7 X-ORDERED 'VALUES' )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.1 NAME 'radiusArapFeatures' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.2 NAME 'radiusArapSecurity' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.3 NAME 'radiusArapZoneAccess' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.44 NAME 'radiusAuthType' DESC 'checkItem: Auth-Type' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.4 NAME 'radiusCallbackId' DESC 'replyItem: Callback-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.5 NAME 'radiusCallbackNumber' DESC 'replyItem: Callback-Number' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.6 NAME 'radiusCalledStationId' DESC 'checkItem: Called-Station-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.7 NAME 'radiusCallingStationId' DESC 'checkItem: Calling-Station-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.8 NAME 'radiusClass' DESC 'replyItem: Class' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.45 NAME 'radiusClientIPAddress' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.9 NAME 'radiusFilterId' DESC 'replyItem: Filter-Id' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.10 NAME 'radiusFramedAppleTalkLink' DESC 'replyItem: Framed-AppleTalk-Link' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.11 NAME 'radiusFramedAppleTalkNetwork' DESC 'replyItem: Framed-AppleTalk-Network' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.12 NAME 'radiusFramedAppleTalkZone' DESC 'replyItem: Framed-AppleTalk-Zone' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.13 NAME 'radiusFramedCompression' DESC 'replyItem: Framed-Compression' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.14 NAME 'radiusFramedIPAddress' DESC 'replyItem: Framed-IP-Address' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.15 NAME 'radiusFramedIPNetmask' DESC 'replyItem: Framed-IP-Netmask' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.16 NAME 'radiusFramedIPXNetwork' DESC 'replyItem: Framed-IPX-Network' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.17 NAME 'radiusFramedMTU' DESC 'replyItem: Framed-MTU' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.18 NAME 'radiusFramedProtocol' DESC 'replyItem: Framed-Protocol' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.19 NAME 'radiusFramedRoute' DESC 'replyItem: Framed-Route' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.20 NAME 'radiusFramedRouting' DESC 'replyItem: Framed-Routing' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.46 NAME 'radiusGroupName' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.47 NAME 'radiusHint' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.48 NAME 'radiusHuntgroupName' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.21 NAME 'radiusIdleTimeout' DESC 'replyItem: Idle-Timeout' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.22 NAME 'radiusLoginIPHost' DESC 'replyItem: Login-IP-Host' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.23 NAME 'radiusLoginLATGroup' DESC 'replyItem: Login-LAT-Group' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.24 NAME 'radiusLoginLATNode' DESC 'replyItem: Login-LAT-Node' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.25 NAME 'radiusLoginLATPort' DESC 'replyItem: Login-LAT-Port' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.26 NAME 'radiusLoginLATService' DESC 'replyItem: Login-LAT-Service' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.27 NAME 'radiusLoginService' DESC 'replyItem: Login-Service' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.28 NAME 'radiusLoginTCPPort' DESC 'replyItem: Login-TCP-Port' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.29 NAME 'radiusPasswordRetry' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.30 NAME 'radiusPortLimit' DESC 'replyItem: Port-Limit' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.49 NAME 'radiusProfileDn' DESC '' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.31 NAME 'radiusPrompt' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.50 NAME 'radiusProxyToRealm' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.51 NAME 'radiusReplicateToRealm' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.52 NAME 'radiusRealm' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.32 NAME 'radiusServiceType' DESC 'replyItem: Service-Type' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.33 NAME 'radiusSessionTimeout' DESC 'replyItem: Session-Timeout' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.34 NAME 'radiusTerminationAction' DESC 'replyItem: Termination-Action' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.35 NAME 'radiusTunnelAssignmentId' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.36 NAME 'radiusTunnelMediumType' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.37 NAME 'radiusTunnelPassword' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.38 NAME 'radiusTunnelPreference' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.39 NAME 'radiusTunnelPrivateGroupId' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.40 NAME 'radiusTunnelServerEndpoint' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.41 NAME 'radiusTunnelType' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.42 NAME 'radiusVSA' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.43 NAME 'radiusTunnelClientEndpoint' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.53 NAME 'radiusSimultaneousUse' DESC 'checkItem: Simultaneous-Use' SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.54 NAME 'radiusLoginTime' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.55 NAME 'radiusUserCategory' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.56 NAME 'radiusStripUserName' DESC '' SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.57 NAME 'dialupAccess' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.58 NAME 'radiusExpiration' DESC 'checkItem: Expiration' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.59 NAME 'radiusCheckItem' DESC 'checkItem: $GENERIC$' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.60 NAME 'radiusReplyItem' DESC 'replyItem: $GENERIC$' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.61 NAME 'radiusNASIpAddress' DESC '' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
|
|
||||||
attributeTypes: ( 1.3.6.1.4.1.3317.4.3.1.62 NAME 'radiusReplyMessage' DESC 'replyItem: Reply-Message' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
|
|
||||||
objectClasses: ( 2.5.6.0 NAME 'top' DESC 'top of the superclass chain' ABSTRACT MUST objectClass )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject' DESC 'RFC4512: extensible object' SUP top AUXILIARY )
|
|
||||||
objectClasses: ( 2.5.6.1 NAME 'alias' DESC 'RFC4512: an alias' SUP top STRUCTURAL MUST aliasedObjectName )
|
|
||||||
objectClasses: ( 2.16.840.1.113730.3.2.6 NAME 'referral' DESC 'namedref: named subordinate referral' SUP top STRUCTURAL MUST ref )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.4.1 NAME ( 'OpenLDAProotDSE' 'LDAProotDSE' ) DESC 'OpenLDAP Root DSE object' SUP top STRUCTURAL MAY cn )
|
|
||||||
objectClasses: ( 2.5.17.0 NAME 'subentry' DESC 'RFC3672: subentry' SUP top STRUCTURAL MUST ( cn $ subtreeSpecification ) )
|
|
||||||
objectClasses: ( 2.5.20.1 NAME 'subschema' DESC 'RFC4512: controlling subschema (sub)entry' AUXILIARY MAY ( dITStructureRules $ nameForms $ dITContentRules $ objectClasses $ attributeTypes $ matchingRules $ matchingRuleUse ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.1466.101.119.2 NAME 'dynamicObject' DESC 'RFC2589: Dynamic Object' SUP top AUXILIARY )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.0 NAME 'olcConfig' DESC 'OpenLDAP configuration object' SUP top ABSTRACT )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.1 NAME 'olcGlobal' DESC 'OpenLDAP Global configuration options' SUP olcConfig STRUCTURAL MAY ( cn $ olcConfigFile $ olcConfigDir $ olcAllows $ olcArgsFile $ olcAttributeOptions $ olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ olcDisallows $ olcGentleHUP $ olcIdleTimeout $ olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcIndexIntLen $ olcListenerThreads $ olcLocalSSF $ olcLogFile $ olcLogLevel $ olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ olcPluginLogFile $ olcReadOnly $ olcReferral $ olcReplogFile $ olcRequires $ olcRestrict $ olcReverseLookup $ olcRootDSE $ olcSaslAuxprops $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ olcSecurity $ olcServerID $ olcSizeLimit $ olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcTCPBuffer $ olcThreads $ olcTimeLimit $ olcTLSCACertificateFile $ olcTLSCACertificatePath $ olcTLSCertificateFile $ olcTLSCertificateKeyFile $ olcTLSCipherSuite $ olcTLSCRLCheck $ olcTLSRandFile $ olcTLSVerifyClient $ olcTLSDHParamFile $ olcTLSECName $ olcTLSCRLFile $ olcTLSProtocolMin $ olcToolThreads $ olcWriteTimeout $ olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules $ olcLdapSyntaxes ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.2 NAME 'olcSchemaConfig' DESC 'OpenLDAP schema object' SUP olcConfig STRUCTURAL MAY ( cn $ olcObjectIdentifier $ olcLdapSyntaxes $ olcAttributeTypes $ olcObjectClasses $ olcDitContentRules ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.3 NAME 'olcBackendConfig' DESC 'OpenLDAP Backend-specific options' SUP olcConfig STRUCTURAL MUST olcBackend )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.4 NAME 'olcDatabaseConfig' DESC 'OpenLDAP Database-specific options' SUP olcConfig STRUCTURAL MUST olcDatabase MAY ( olcHidden $ olcSuffix $ olcSubordinate $ olcAccess $ olcAddContentAcl $ olcLastMod $ olcLimits $ olcMaxDerefDepth $ olcPlugin $ olcReadOnly $ olcReplica $ olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncUseSubentry $ olcSyncrepl $ olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode $ olcMonitoring $ olcExtraAttrs ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.5 NAME 'olcOverlayConfig' DESC 'OpenLDAP Overlay-specific options' SUP olcConfig STRUCTURAL MUST olcOverlay )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.6 NAME 'olcIncludeFile' DESC 'OpenLDAP configuration include file' SUP olcConfig STRUCTURAL MUST olcInclude MAY ( cn $ olcRootDSE ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.7 NAME 'olcFrontendConfig' DESC 'OpenLDAP frontend configuration' AUXILIARY MAY ( olcDefaultSearchBase $ olcPasswordHash $ olcSortVals ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.0.8 NAME 'olcModuleList' DESC 'OpenLDAP dynamic module info' SUP olcConfig STRUCTURAL MAY ( cn $ olcModulePath $ olcModuleLoad ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.2.2.1 NAME 'olcLdifConfig' DESC 'LDIF backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.2.12.1 NAME 'olcMdbConfig' DESC 'MDB backend configuration' SUP olcDatabaseConfig STRUCTURAL MUST olcDbDirectory MAY ( olcDbCheckpoint $ olcDbEnvFlags $ olcDbNoSync $ olcDbIndex $ olcDbMaxReaders $ olcDbMaxSize $ olcDbMode $ olcDbSearchStack $ olcDbRtxnSize ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.2.4.1 NAME 'olcMonitorConfig' DESC 'Monitor backend configuration' SUP olcDatabaseConfig STRUCTURAL )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.3.1.1 NAME 'olcSyncProvConfig' DESC 'SyncRepl Provider configuration' SUP olcOverlayConfig STRUCTURAL MAY ( olcSpCheckpoint $ olcSpSessionlog $ olcSpNoPresent $ olcSpReloadHint ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.3.4.1 NAME 'olcAccessLogConfig' DESC 'Access log configuration' SUP olcOverlayConfig STRUCTURAL MUST olcAccessLogDB MAY ( olcAccessLogOps $ olcAccessLogPurge $ olcAccessLogSuccess $ olcAccessLogOld $ olcAccessLogOldAttr $ olcAccessLogBase ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.1.12.2.4.3.8.1 NAME 'olcDynamicList' DESC 'Dynamic list configuration' SUP olcOverlayConfig STRUCTURAL MAY olcDLattrSet )
|
|
||||||
objectClasses: ( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country' SUP top STRUCTURAL MUST c MAY ( searchGuide $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.3 NAME 'locality' DESC 'RFC2256: a locality' SUP top STRUCTURAL MAY ( street $ seeAlso $ searchGuide $ st $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.4 NAME 'organization' DESC 'RFC2256: an organization' SUP top STRUCTURAL MUST o MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.5 NAME 'organizationalUnit' DESC 'RFC2256: an organizational unit' SUP top STRUCTURAL MUST ou MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.7 NAME 'organizationalPerson' DESC 'RFC2256: an organizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )
|
|
||||||
objectClasses: ( 2.5.6.8 NAME 'organizationalRole' DESC 'RFC2256: an organizational role' SUP top STRUCTURAL MUST cn MAY ( x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ seeAlso $ roleOccupant $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.9 NAME 'groupOfNames' DESC 'RFC2256: a group of names (DNs)' SUP top STRUCTURAL MUST ( member $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.10 NAME 'residentialPerson' DESC 'RFC2256: an residential person' SUP person STRUCTURAL MUST l MAY ( businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ preferredDeliveryMethod $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l ) )
|
|
||||||
objectClasses: ( 2.5.6.11 NAME 'applicationProcess' DESC 'RFC2256: an application process' SUP top STRUCTURAL MUST cn MAY ( seeAlso $ ou $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.12 NAME 'applicationEntity' DESC 'RFC2256: an application entity' SUP top STRUCTURAL MUST ( presentationAddress $ cn ) MAY ( supportedApplicationContext $ seeAlso $ ou $ o $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.13 NAME 'dSA' DESC 'RFC2256: a directory system agent (a server)' SUP applicationEntity STRUCTURAL MAY knowledgeInformation )
|
|
||||||
objectClasses: ( 2.5.6.14 NAME 'device' DESC 'RFC2256: a device' SUP top STRUCTURAL MUST cn MAY ( serialNumber $ seeAlso $ owner $ ou $ o $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.15 NAME 'strongAuthenticationUser' DESC 'RFC2256: a strong authentication user' SUP top AUXILIARY MUST userCertificate )
|
|
||||||
objectClasses: ( 2.5.6.16 NAME 'certificationAuthority' DESC 'RFC2256: a certificate authority' SUP top AUXILIARY MUST ( authorityRevocationList $ certificateRevocationList $ cACertificate ) MAY crossCertificatePair )
|
|
||||||
objectClasses: ( 2.5.6.17 NAME 'groupOfUniqueNames' DESC 'RFC2256: a group of unique names (DN and Unique Identifier)' SUP top STRUCTURAL MUST ( uniqueMember $ cn ) MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.18 NAME 'userSecurityInformation' DESC 'RFC2256: a user security information' SUP top AUXILIARY MAY supportedAlgorithms )
|
|
||||||
objectClasses: ( 2.5.6.16.2 NAME 'certificationAuthority-V2' SUP certificationAuthority AUXILIARY MAY deltaRevocationList )
|
|
||||||
objectClasses: ( 2.5.6.19 NAME 'cRLDistributionPoint' SUP top STRUCTURAL MUST cn MAY ( certificateRevocationList $ authorityRevocationList $ deltaRevocationList ) )
|
|
||||||
objectClasses: ( 2.5.6.20 NAME 'dmd' SUP top STRUCTURAL MUST dmdName MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $ x121Address $ registeredAddress $ destinationIndicator $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $ postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )
|
|
||||||
objectClasses: ( 2.5.6.21 NAME 'pkiUser' DESC 'RFC2587: a PKI user' SUP top AUXILIARY MAY userCertificate )
|
|
||||||
objectClasses: ( 2.5.6.22 NAME 'pkiCA' DESC 'RFC2587: PKI certificate authority' SUP top AUXILIARY MAY ( authorityRevocationList $ certificateRevocationList $ cACertificate $ crossCertificatePair ) )
|
|
||||||
objectClasses: ( 2.5.6.23 NAME 'deltaCRL' DESC 'RFC2587: PKI user' SUP top AUXILIARY MAY deltaRevocationList )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.250.3.15 NAME 'labeledURIObject' DESC 'RFC2079: object that contains the URI attribute type' SUP top AUXILIARY MAY labeledURI )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.1466.344 NAME 'dcObject' DESC 'RFC2247: domain component object' SUP top AUXILIARY MUST dc )
|
|
||||||
objectClasses: ( 1.3.6.1.1.3.1 NAME 'uidObject' DESC 'RFC2377: uid object' SUP top AUXILIARY MUST uid )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.4 NAME ( 'pilotPerson' 'newPilotPerson' ) SUP person STRUCTURAL MAY ( userid $ textEncodedORAddress $ rfc822Mailbox $ favouriteDrink $ roomNumber $ userClass $ homeTelephoneNumber $ homePostalAddress $ secretary $ personalTitle $ preferredDeliveryMethod $ businessCategory $ janetMailbox $ otherMailbox $ mobileTelephoneNumber $ pagerTelephoneNumber $ organizationalStatus $ mailPreferenceOption $ personalSignature ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.5 NAME 'account' SUP top STRUCTURAL MUST userid MAY ( description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ host ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.6 NAME 'document' SUP top STRUCTURAL MUST documentIdentifier MAY ( commonName $ description $ seeAlso $ localityName $ organizationName $ organizationalUnitName $ documentTitle $ documentVersion $ documentAuthor $ documentLocation $ documentPublisher ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.7 NAME 'room' SUP top STRUCTURAL MUST commonName MAY ( roomNumber $ description $ seeAlso $ telephoneNumber ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.9 NAME 'documentSeries' SUP top STRUCTURAL MUST commonName MAY ( description $ seeAlso $ telephonenumber $ localityName $ organizationName $ organizationalUnitName ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.13 NAME 'domain' SUP top STRUCTURAL MUST domainComponent MAY ( associatedName $ organizationName $ description $ businessCategory $ seeAlso $ searchGuide $ userPassword $ localityName $ stateOrProvinceName $ streetAddress $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.14 NAME 'RFC822localPart' SUP domain STRUCTURAL MAY ( commonName $ surname $ description $ seeAlso $ telephoneNumber $ physicalDeliveryOfficeName $ postalAddress $ postalCode $ postOfficeBox $ streetAddress $ facsimileTelephoneNumber $ internationalISDNNumber $ telephoneNumber $ teletexTerminalIdentifier $ telexNumber $ preferredDeliveryMethod $ destinationIndicator $ registeredAddress $ x121Address ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.15 NAME 'dNSDomain' SUP domain STRUCTURAL MAY ( ARecord $ MDRecord $ MXRecord $ NSRecord $ SOARecord $ CNAMERecord ) )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.17 NAME 'domainRelatedObject' DESC 'RFC1274: an object related to an domain' SUP top AUXILIARY MUST associatedDomain )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.18 NAME 'friendlyCountry' SUP country STRUCTURAL MUST friendlyCountryName )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.20 NAME 'pilotOrganization' SUP ( organization $ organizationalUnit ) STRUCTURAL MAY buildingName )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.21 NAME 'pilotDSA' SUP dsa STRUCTURAL MAY dSAQuality )
|
|
||||||
objectClasses: ( 0.9.2342.19200300.100.4.22 NAME 'qualityLabelledData' SUP top AUXILIARY MUST dsaQuality MAY ( subtreeMinimumQuality $ subtreeMaximumQuality ) )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction of an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' DESC 'Additional attributes for shadow passwords' SUP top AUXILIARY MUST uid MAY ( userPassword $ shadowLastChange $ shadowMin $ shadowMax $ shadowWarning $ shadowInactive $ shadowExpire $ shadowFlag $ description ) )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.2 NAME 'posixGroup' DESC 'Abstraction of a group of accounts' SUP top STRUCTURAL MUST ( cn $ gidNumber ) MAY ( userPassword $ memberUid $ description ) )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.3 NAME 'ipService' DESC 'Abstraction an Internet Protocol service' SUP top STRUCTURAL MUST ( cn $ ipServicePort $ ipServiceProtocol ) MAY description )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.4 NAME 'ipProtocol' DESC 'Abstraction of an IP protocol' SUP top STRUCTURAL MUST ( cn $ ipProtocolNumber $ description ) MAY description )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.5 NAME 'oncRpc' DESC 'Abstraction of an ONC/RPC binding' SUP top STRUCTURAL MUST ( cn $ oncRpcNumber $ description ) MAY description )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.6 NAME 'ipHost' DESC 'Abstraction of a host, an IP device' SUP top AUXILIARY MUST ( cn $ ipHostNumber ) MAY ( l $ description $ manager ) )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.7 NAME 'ipNetwork' DESC 'Abstraction of an IP network' SUP top STRUCTURAL MUST ( cn $ ipNetworkNumber ) MAY ( ipNetmaskNumber $ l $ description $ manager ) )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.8 NAME 'nisNetgroup' DESC 'Abstraction of a netgroup' SUP top STRUCTURAL MUST cn MAY ( nisNetgroupTriple $ memberNisNetgroup $ description ) )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.9 NAME 'nisMap' DESC 'A generic abstraction of a NIS map' SUP top STRUCTURAL MUST nisMapName MAY description )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.10 NAME 'nisObject' DESC 'An entry in a NIS map' SUP top STRUCTURAL MUST ( cn $ nisMapEntry $ nisMapName ) MAY description )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.11 NAME 'ieee802Device' DESC 'A device with a MAC address' SUP top AUXILIARY MAY macAddress )
|
|
||||||
objectClasses: ( 1.3.6.1.1.1.2.12 NAME 'bootableDevice' DESC 'A device with boot parameters' SUP top AUXILIARY MAY ( bootFile $ bootParameter ) )
|
|
||||||
objectClasses: ( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.5923.1.2.2 NAME 'eduOrg' AUXILIARY MAY ( cn $ eduOrgHomePageURI $ eduOrgIdentityAuthNPolicyURI $ eduOrgLegalName $ eduOrgSuperiorURI $ eduOrgWhitePagesURI ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.5923.1.1.2 NAME 'eduPerson' DESC 'eduPerson per Internet2 and EDUCAUSE' AUXILIARY MAY ( eduPersonAffiliation $ eduPersonNickname $ eduPersonOrgDN $ eduPersonOrgUnitDN $ eduPersonPrimaryAffiliation $ eduPersonPrincipalName $ eduPersonEntitlement $ eduPersonPrimaryOrgUnitDN $ eduPersonScopedAffiliation $ eduPersonTargetedID $ eduPersonAssurance ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.5923.1.5.2 NAME 'eduMember' AUXILIARY MAY ( isMemberOf $ hasMember ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.6 NAME 'sambaSamAccount' DESC 'Samba 3.0 Auxilary SAM Account' SUP top AUXILIARY MUST ( uid $ sambaSID ) MAY ( cn $ sambaLMPassword $ sambaNTPassword $ sambaPwdLastSet $ sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ sambaPwdCanChange $ sambaPwdMustChange $ sambaAcctFlags $ displayName $ sambaHomePath $ sambaHomeDrive $ sambaLogonScript $ sambaProfilePath $ description $ sambaUserWorkstations $ sambaPrimaryGroupSID $ sambaDomainName $ sambaMungedDial $ sambaBadPasswordCount $ sambaBadPasswordTime $ sambaPasswordHistory $ sambaLogonHours ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.4 NAME 'sambaGroupMapping' DESC 'Samba Group Mapping' SUP top AUXILIARY MUST ( gidNumber $ sambaSID $ sambaGroupType ) MAY ( displayName $ description $ sambaSIDList ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.14 NAME 'sambaTrustPassword' DESC 'Samba Trust Password' SUP top STRUCTURAL MUST ( sambaDomainName $ sambaNTPassword $ sambaTrustFlags ) MAY ( sambaSID $ sambaPwdLastSet ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.15 NAME 'sambaTrustedDomainPassword' DESC 'Samba Trusted Domain Password' SUP top STRUCTURAL MUST ( sambaDomainName $ sambaSID $ sambaClearTextPassword $ sambaPwdLastSet ) MAY sambaPreviousClearTextPassword )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.5 NAME 'sambaDomain' DESC 'Samba Domain Information' SUP top STRUCTURAL MUST ( sambaDomainName $ sambaSID ) MAY ( sambaNextRid $ sambaNextGroupRid $ sambaNextUserRid $ sambaAlgorithmicRidBase $ sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ sambaMaxPwdAge $ sambaMinPwdAge $ sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ sambaForceLogoff $ sambaRefuseMachinePwdChange ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.7 NAME 'sambaUnixIdPool' DESC 'Pool for allocating UNIX uids/gids' SUP top AUXILIARY MUST ( uidNumber $ gidNumber ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.8 NAME 'sambaIdmapEntry' DESC 'Mapping from a SID to an ID' SUP top AUXILIARY MUST sambaSID MAY ( uidNumber $ gidNumber ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.9 NAME 'sambaSidEntry' DESC 'Structural Class for a SID' SUP top STRUCTURAL MUST sambaSID )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.10 NAME 'sambaConfig' DESC 'Samba Configuration Section' SUP top AUXILIARY MAY description )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.11 NAME 'sambaShare' DESC 'Samba Share Section' SUP top STRUCTURAL MUST sambaShareName MAY description )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7165.2.2.12 NAME 'sambaConfigOption' DESC 'Samba Configuration Option' SUP top STRUCTURAL MUST sambaOptionName MAY ( sambaBoolOption $ sambaIntegerOption $ sambaStringOption $ sambaStringListoption $ description ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' DESC 'MANDATORY: OpenSSH LPK objectclass' SUP top AUXILIARY MAY ( sshPublicKey $ uid ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.149.2.2.1.1.1 NAME 'uhbperson' DESC 'personnel de l"universite de rennes 2' SUP top AUXILIARY MAY ( attuhbcategorie $ attuhbcodecorps $ attuhbcorps $ attuhbcodetype $ attuhbtype $ attuhbcodecnu $ attuhbcnu $ attuhbetab $ attuhbmanager $ attuhbalias $ attuhbdatenais $ attuhbcodelr $ attuhbintranet $ attuhbextranet $ attuhbCampus $ attuhbaffectation $ attuhbdatefin $ attuhbcodevalid $ attuhbhashid $ attuhbdateouvcompte $ attuhbdatemaj $ attuhbLastSetPasswordID $ buildingName $ attuhbWebmasterHome $ attuhbResponsabilite $ attuhbgfocod ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.149.2.2.1.1.2 NAME 'uhbetudiant' DESC 'etudiants de l"universite de rennes 2' SUP top AUXILIARY MAY ( attuhbetp $ attuhbins $ attuhbdroitacces $ attuhbdateouvcompte $ attuhbdatefin $ attuhbdatemaj $ attuhbalias $ attuhbdatenais $ attuhbcodelr $ attuhbintranet $ attuhbextranet $ attuhbCampus $ attuhbcodevalid $ attuhbstatut $ attuhbregins $ attuhbprofil $ attuhbetaPmt $ attuhbLastSetPasswordID $ attuhbaffectation $ attuhbhashid $ attuhbPays $ attuhbelp $ attuhbcleactivation $ attuhblibade ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.149.2.2.1.1.3 NAME 'uhbcomposante' DESC 'composantes de l"universite de rennes 2' SUP top STRUCTURAL MUST cn MAY ( attuhbcompType $ attuhbcompRespEns $ attuhbcompRespTech $ attuhbcompRespAdm $ attuhbcompLibelleCourt $ attuhbcompLibelle ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.2.2.1 NAME 'supannPerson' DESC 'classe d infos complementaires sur personnes supann' SUP top AUXILIARY MAY ( supannOrganisme $ supannCivilite $ supannAutreTelephone $ supannAffectation $ supannEmpId $ supannCodeINE $ supannEtuId $ supannAliasLogin $ supannParrainDN $ supannActivite $ supannEntiteAffectation $ supannEntiteAffectationPrincipale $ supannMailPerso $ supannRole $ supannRoleEntite $ supannRoleGenerique $ supannEtuAnneeInscription $ supannEtuCursusAnnee $ supannEtuDiplome $ supannEtuElementPedagogique $ supannEtuEtape $ supannEtuInscription $ supannEtuRegimeInscription $ supannEtuSecteurDisciplinaire $ supannEtuTypeDiplome $ supannEtablissement $ supannListeRouge $ supannAutreMail $ mailForwardingAddress $ supannEmpCorps $ supannTypeEntiteAffectation $ supannRefId ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.2.2.2 NAME 'supannOrg' DESC 'classe d infos complementaires pour etablissement' SUP top AUXILIARY MAY supannEtablissement )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.2.2.3 NAME 'supannEntite' DESC 'classe d infos complementaires pour entite' SUP top AUXILIARY MUST supannCodeEntite MAY ( supannTypeEntite $ supannCodeEntiteParent $ supannRefId ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.2.2.6 NAME 'supannGroupe' DESC 'attributs specifiques des groupes' SUP top AUXILIARY MAY ( supannGroupeDateFin $ supannGroupeAdminDN $ supannGroupeLecteurDN $ supannRefId ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.11.1 NAME 'sambaSecurityObject' DESC 'Mot de passe Samba' AUXILIARY MAY ( sambaLMPassword $ sambaNTPassword ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.11.2 NAME 'runUnivNamedObject' DESC 'Objet nomme' AUXILIARY MAY ( cn $ sn $ givenName ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.11.3 NAME 'runUnivAuthorizedObject' DESC 'Objet autorise' AUXILIARY MAY runUnivAuthorization )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.11.4 NAME 'runUnivLabeledObject' DESC 'Objet ayant certains attributs permettant de l"identifier' AUXILIARY MAY runUnivAttribute )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.31.2 NAME 'runUnivCategorizedObject' DESC 'Objet categorise' AUXILIARY MAY runUnivCategorie )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.7 NAME 'runUnivMail' DESC 'Objet qui peut contenir un mail' AUXILIARY MAY ( mail $ runUnivMailAlias $ runUnivMailGroup $ runUnivMailHost $ runUnivMailRoute ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.2.2.1 NAME 'runUnivAutoGroup' DESC 'Un groupe automatique' SUP top STRUCTURAL MUST cn MAY ( businessCategory $ seeAlso $ owner $ ou $ o $ description $ runUnivMemberURL $ member ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.8 NAME 'runUnivUidObject' DESC 'Objet identifie par uid' SUP top STRUCTURAL MUST uid )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.9 NAME 'runUnivCnObject' DESC 'Objet identifie par cn' SUP top STRUCTURAL MUST cn )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.10 NAME 'runUnivMailObject' DESC 'Objet identifie par mail' SUP top STRUCTURAL MUST mail )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.2 NAME 'runUnivAccount' DESC 'Compte pour un service generique' SUP top STRUCTURAL MUST ( uid $ userPassword ) MAY ( owner $ runUnivLsc $ runUnivAuthorization $ runUnivDateFin ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.3 NAME 'runUnivMailAccount' DESC 'Compte pour un service de mail' SUP runUnivAccount STRUCTURAL MUST mail MAY ( runUnivMailAlias $ runUnivMailGroup $ runUnivMailHost $ runUnivMailRoute ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.4 NAME 'runUnivSambaAccount' DESC 'Compte pour un service Samba' SUP top STRUCTURAL MUST ( uid $ sambaSID $ sambaLMPassword $ sambaNTPassword ) MAY ( owner $ cn $ eduPersonAffiliation $ eduPersonPrimaryAffiliation ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.5 NAME 'runUnivPersonAccount' DESC 'Compte de personne' SUP runUnivAccount STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description $ title $ facsimileTelephoneNumber $ postalAddress $ displayName $ givenName $ labeledURI $ mail $ mobile $ userCertificate $ preferredLanguage $ x500uniqueIdentifier $ userSMIMECertificate $ userPKCS12 ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.6 NAME 'runUnivUnixAccount' DESC 'Compte pour un service unix accessible par ssh' SUP top STRUCTURAL MUST uid MAY ( owner $ runUnivSshPublicKey ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.12 NAME 'runUnivCasObject' DESC 'Configuration du serveur CAS' AUXILIARY MAY runUnivCasAccepted )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.13 NAME 'runUnivPeopleObject' DESC 'Informations locales sur un individu' AUXILIARY MAY ( runUnivNom $ runUnivPrenom $ runUnivIndInfos $ runUnivDiplome $ runUnivSihamId $ runUnivIndAffectation $ runUnivCategorie $ runUnivPersInfos $ runUnivDateFin $ runUnivDateNaissance $ runUnivAdressePerso $ runUnivTelephonePerso $ runUnivToipInternal $ runUnivToipExternal $ runUnivToipEnabled $ runUnivToipAffectation $ runUnivAuthorization $ runUnivLastModified $ runUnivLsc $ runUnivCasAccepted $ runUnivAttribute $ runUnivWgClient $ runUnivJpegPhotoDate ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.14 NAME 'runUnivStructureObject' DESC 'Informations locales sur une structure' AUXILIARY MAY ( cn $ runUnivLocalisation $ supannEtablissement $ runUnivStrInfos $ mail $ labeledURI $ jpegPhoto $ runUnivStrResp $ runUnivCategorie $ runUnivLastModified $ runUnivAttribute ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.15 NAME 'runUnivGroupObject' DESC 'Informations locales sur un groupe' AUXILIARY MAY ( runUnivCategorie $ runUnivLastModified $ runUnivAttribute ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.16 NAME 'runUnivPeopleRestricted' DESC 'Informations sur un individu qui ne doivent pas etre accessibles par anonymous' AUXILIARY MAY ( runUnivIndInfos $ runUnivDiplome $ runUnivAdressePerso $ runUnivTelephonePerso $ supannMailPerso $ runUnivIndAffectation $ runUnivPersInfos $ runUnivDateNaissance $ runUnivCasAccepted $ runUnivAttribute $ jpegPhoto $ runUnivJpegPhotoDate ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.7135.1.3.164.71.17 NAME 'runUnivNomenclatureObject' DESC 'Un element de nomenclature' SUP top STRUCTURAL MUST cn MAY ( title $ description $ runUnivDateFin ) )
|
|
||||||
objectClasses: ( 2.16.840.1.113730.3.2.33 NAME 'groupOfURLs' SUP top STRUCTURAL MUST cn MAY ( memberURL $ businessCategory $ description $ o $ ou $ owner $ seeAlso ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.4203.666.11.8.2.1 NAME 'dgIdentityAux' SUP top AUXILIARY MAY ( dgIdentity $ dgAuthz ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.3317.4.3.2.1 NAME 'radiusprofile' DESC '' AUXILIARY MUST cn MAY ( radiusArapFeatures $ radiusArapSecurity $ radiusArapZoneAccess $ radiusAuthType $ radiusCallbackId $ radiusCallbackNumber $ radiusCalledStationId $ radiusCallingStationId $ radiusClass $ radiusClientIPAddress $ radiusFilterId $ radiusFramedAppleTalkLink $ radiusFramedAppleTalkNetwork $ radiusFramedAppleTalkZone $ radiusFramedCompression $ radiusFramedIPAddress $ radiusFramedIPNetmask $ radiusFramedIPXNetwork $ radiusFramedMTU $ radiusFramedProtocol $ radiusCheckItem $ radiusReplyItem $ radiusFramedRoute $ radiusFramedRouting $ radiusIdleTimeout $ radiusGroupName $ radiusHint $ radiusHuntgroupName $ radiusLoginIPHost $ radiusLoginLATGroup $ radiusLoginLATNode $ radiusLoginLATPort $ radiusLoginLATService $ radiusLoginService $ radiusLoginTCPPort $ radiusLoginTime $ radiusPasswordRetry $ radiusPortLimit $ radiusPrompt $ radiusProxyToRealm $ radiusRealm $ radiusReplicateToRealm $ radiusServiceType $ radiusSessionTimeout $ radiusStripUserName $ radiusTerminationAction $ radiusTunnelClientEndpoint $ radiusProfileDn $ radiusSimultaneousUse $ radiusTunnelAssignmentId $ radiusTunnelMediumType $ radiusTunnelPassword $ radiusTunnelPreference $ radiusTunnelPrivateGroupId $ radiusTunnelServerEndpoint $ radiusTunnelType $ radiusUserCategory $ radiusVSA $ radiusExpiration $ dialupAccess $ radiusNASIpAddress $ radiusReplyMessage ) )
|
|
||||||
objectClasses: ( 1.3.6.1.4.1.3317.4.3.2.2 NAME 'radiusObjectProfile' DESC 'A Container Objectclass to be used for creating radius profile object' SUP top STRUCTURAL MUST cn MAY ( uid $ userPassword $ description ) )
|
|
||||||
entryDN: cn=Subschema
|
|
||||||
subschemaSubentry: cn=Subschema
|
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
require __DIR__.'/../../vendor/autoload.php';
|
|
||||||
|
|
||||||
use nur\ldap\app\LdapApplication;
|
|
||||||
use nur\ldap\LdapObject;
|
|
||||||
|
|
||||||
LdapApplication::run(new class extends LdapApplication {
|
|
||||||
const ARGS = [
|
|
||||||
"merge" => parent::ARGS,
|
|
||||||
["-a", "--action", "args" => 1],
|
|
||||||
];
|
|
||||||
|
|
||||||
protected $action;
|
|
||||||
protected $args;
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
if ($this->config === null) $this->config = __DIR__.'/admin.ldapconf';
|
|
||||||
$conn = $this->getConn();
|
|
||||||
|
|
||||||
switch ($this->action) {
|
|
||||||
case "search": # sélection
|
|
||||||
case "s": # sélection
|
|
||||||
$pouet = $conn->first("", ["filter" => ["uid" => "pouet"]]);
|
|
||||||
if ($pouet !== null) {
|
|
||||||
Txx("trouvé", $pouet->array());
|
|
||||||
} else {
|
|
||||||
Txx("pas trouvé");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "create": # création
|
|
||||||
case "c": # création
|
|
||||||
$pouet = new LdapObject();
|
|
||||||
$pouet->merge([
|
|
||||||
"objectClass" => [
|
|
||||||
"top",
|
|
||||||
"account",
|
|
||||||
"simpleSecurityObject",
|
|
||||||
],
|
|
||||||
"uid" => "pouet",
|
|
||||||
"userPassword" => "plouf",
|
|
||||||
]);
|
|
||||||
$pouet->initDn("dc=univ-reunion,dc=fr", "uid", $conn);
|
|
||||||
$pouet->update(null, $conn);
|
|
||||||
Txx("créé");
|
|
||||||
break;
|
|
||||||
case "modify": # modification
|
|
||||||
case "m": # modification
|
|
||||||
$pouet = $conn->first("uid=pouet");
|
|
||||||
if ($pouet !== null) {
|
|
||||||
$pouet["userPassword"] = "pass".random_int(1, 1000);
|
|
||||||
Txx("userPassword: $pouet[userPassword]");
|
|
||||||
$pouet->update(null, $conn);
|
|
||||||
Txx("mis à jour");
|
|
||||||
} else {
|
|
||||||
Txx("pas trouvé");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "delete": # suppression
|
|
||||||
case "d": # suppression
|
|
||||||
$pouet = $conn->first("uid=pouet");
|
|
||||||
if ($pouet !== null) {
|
|
||||||
Txx("trouvé", $pouet->array());
|
|
||||||
$pouet->delete(null, $conn);
|
|
||||||
Txx("supprimé");
|
|
||||||
} else {
|
|
||||||
Txx("pas trouvé");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,46 +0,0 @@
|
||||||
#!/usr/bin/php
|
|
||||||
<?php
|
|
||||||
require(__DIR__.'/../../vendor/autoload.php');
|
|
||||||
|
|
||||||
use nur\ldap\AccountObject;
|
|
||||||
use nur\ldap\app\LdapApplication;
|
|
||||||
use nur\ldap\app\TLdapApplication;
|
|
||||||
use nur\ldap\OrganizationalRoleObject;
|
|
||||||
use nur\ldap\OrganizationalUnitObject;
|
|
||||||
use nur\ldap\OrganizationObject;
|
|
||||||
use nur\ldap\PersonObject;
|
|
||||||
use nur\ldap\scheman;
|
|
||||||
use nur\ldap\syntaxes\pri\MyValue;
|
|
||||||
use nur\php\UpdateClassesApp;
|
|
||||||
|
|
||||||
UpdateClassesApp::run(new class extends UpdateClassesApp {
|
|
||||||
use TLdapApplication;
|
|
||||||
|
|
||||||
const MAPPINGS = [
|
|
||||||
"src" => [
|
|
||||||
"package" => "nur\\ldap\\",
|
|
||||||
"path" => __DIR__."/../tests",
|
|
||||||
"classes" => [
|
|
||||||
AccountObject::class,
|
|
||||||
OrganizationObject::class,
|
|
||||||
OrganizationalUnitObject::class,
|
|
||||||
OrganizationalRoleObject::class,
|
|
||||||
PersonObject::class,
|
|
||||||
MyValue::class,
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
|
|
||||||
const ARGS = [
|
|
||||||
"merge" => LdapApplication::ARGS,
|
|
||||||
];
|
|
||||||
|
|
||||||
const LOAD_PARAMS = false;
|
|
||||||
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
if ($this->config === null) $this->config = __DIR__.'/default.ldapconf';
|
|
||||||
scheman::init($this->getConn());
|
|
||||||
parent::main();
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,83 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class PersonObject: une personne au sens inetOrg
|
|
||||||
*
|
|
||||||
* --autogen-properties-and-methods--
|
|
||||||
* @property string $dn
|
|
||||||
* @property string[] $uid
|
|
||||||
* @property string[] $objectClass
|
|
||||||
* @property string[] $description
|
|
||||||
* @property string[] $seeAlso
|
|
||||||
* @property string[] $l
|
|
||||||
* @property string[] $o
|
|
||||||
* @property string[] $ou
|
|
||||||
* @property string[] $host
|
|
||||||
* @property string[] $userPassword
|
|
||||||
* @method \nur\ldap\LdapAttr dn()
|
|
||||||
* @method \nur\ldap\LdapAttr uid()
|
|
||||||
* @method \nur\ldap\LdapAttr objectClass()
|
|
||||||
* @method \nur\ldap\LdapAttr description()
|
|
||||||
* @method \nur\ldap\LdapAttr seeAlso()
|
|
||||||
* @method \nur\ldap\LdapAttr l()
|
|
||||||
* @method \nur\ldap\LdapAttr o()
|
|
||||||
* @method \nur\ldap\LdapAttr ou()
|
|
||||||
* @method \nur\ldap\LdapAttr host()
|
|
||||||
* @method \nur\ldap\LdapAttr userPassword()
|
|
||||||
*/
|
|
||||||
class AccountObject extends LdapObject {
|
|
||||||
const OBJECT_CLASSES = [
|
|
||||||
"account",
|
|
||||||
"simpleSecurityObject",
|
|
||||||
];
|
|
||||||
const PARENT_RDN = "ou=People";
|
|
||||||
const DN_NAMES = "uid";
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
const _AUTOGEN_CONSTS = ["SCHEMA"];
|
|
||||||
const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
|
|
||||||
const _AUTOGEN_METHODS = [[self::class, "_AUTOGEN_METHODS"]];
|
|
||||||
const SCHEMA = /*autogen*/[
|
|
||||||
'dn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'uid' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'objectClass' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'description' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'seeAlso' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'l' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'o' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'ou' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'host' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'userPassword' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,166 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class PersonObject: une personne au sens inetOrg
|
|
||||||
*
|
|
||||||
* --autogen-properties-and-methods--
|
|
||||||
* @property string $dn
|
|
||||||
* @property string[] $o
|
|
||||||
* @property string[] $objectClass
|
|
||||||
* @property string[] $userPassword
|
|
||||||
* @property string[] $searchGuide
|
|
||||||
* @property string[] $seeAlso
|
|
||||||
* @property string[] $businessCategory
|
|
||||||
* @property int[] $x121Address
|
|
||||||
* @property string[] $registeredAddress
|
|
||||||
* @property string[] $destinationIndicator
|
|
||||||
* @property string $preferredDeliveryMethod
|
|
||||||
* @property string[] $telexNumber
|
|
||||||
* @property string[] $teletexTerminalIdentifier
|
|
||||||
* @property string[] $telephoneNumber
|
|
||||||
* @property int[] $internationaliSDNNumber
|
|
||||||
* @property string[] $facsimileTelephoneNumber
|
|
||||||
* @property string[] $street
|
|
||||||
* @property string[] $postOfficeBox
|
|
||||||
* @property string[] $postalCode
|
|
||||||
* @property string[] $postalAddress
|
|
||||||
* @property string[] $physicalDeliveryOfficeName
|
|
||||||
* @property string[] $st
|
|
||||||
* @property string[] $l
|
|
||||||
* @property string[] $description
|
|
||||||
* @method \nur\ldap\LdapAttr dn()
|
|
||||||
* @method \nur\ldap\LdapAttr o()
|
|
||||||
* @method \nur\ldap\LdapAttr objectClass()
|
|
||||||
* @method \nur\ldap\LdapAttr userPassword()
|
|
||||||
* @method \nur\ldap\LdapAttr searchGuide()
|
|
||||||
* @method \nur\ldap\LdapAttr seeAlso()
|
|
||||||
* @method \nur\ldap\LdapAttr businessCategory()
|
|
||||||
* @method \nur\ldap\LdapAttr x121Address()
|
|
||||||
* @method \nur\ldap\LdapAttr registeredAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr destinationIndicator()
|
|
||||||
* @method \nur\ldap\LdapAttr preferredDeliveryMethod()
|
|
||||||
* @method \nur\ldap\LdapAttr telexNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr teletexTerminalIdentifier()
|
|
||||||
* @method \nur\ldap\LdapAttr telephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr internationaliSDNNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr facsimileTelephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr street()
|
|
||||||
* @method \nur\ldap\LdapAttr postOfficeBox()
|
|
||||||
* @method \nur\ldap\LdapAttr postalCode()
|
|
||||||
* @method \nur\ldap\LdapAttr postalAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr physicalDeliveryOfficeName()
|
|
||||||
* @method \nur\ldap\LdapAttr st()
|
|
||||||
* @method \nur\ldap\LdapAttr l()
|
|
||||||
* @method \nur\ldap\LdapAttr description()
|
|
||||||
*/
|
|
||||||
class OrganizationObject extends LdapObject {
|
|
||||||
const OBJECT_CLASSES = [
|
|
||||||
"organization",
|
|
||||||
];
|
|
||||||
const PARENT_RDN = "ou=People";
|
|
||||||
const DN_NAMES = "o";
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
const _AUTOGEN_CONSTS = ["SCHEMA"];
|
|
||||||
const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
|
|
||||||
const _AUTOGEN_METHODS = [[self::class, "_AUTOGEN_METHODS"]];
|
|
||||||
const SCHEMA = /*autogen*/[
|
|
||||||
'dn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'o' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'objectClass' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'userPassword' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'searchGuide' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'seeAlso' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'businessCategory' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'x121Address' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'registeredAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'destinationIndicator' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PrintableSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'preferredDeliveryMethod' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'telexNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'teletexTerminalIdentifier' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'telephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'internationaliSDNNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'facsimileTelephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'street' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postOfficeBox' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalCode' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'physicalDeliveryOfficeName' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'st' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'l' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'description' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,160 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class PersonObject: une personne au sens inetOrg
|
|
||||||
*
|
|
||||||
* --autogen-properties-and-methods--
|
|
||||||
* @property string $dn
|
|
||||||
* @property string[] $cn
|
|
||||||
* @property string[] $objectClass
|
|
||||||
* @property int[] $x121Address
|
|
||||||
* @property string[] $registeredAddress
|
|
||||||
* @property string[] $destinationIndicator
|
|
||||||
* @property string $preferredDeliveryMethod
|
|
||||||
* @property string[] $telexNumber
|
|
||||||
* @property string[] $teletexTerminalIdentifier
|
|
||||||
* @property string[] $telephoneNumber
|
|
||||||
* @property int[] $internationaliSDNNumber
|
|
||||||
* @property string[] $facsimileTelephoneNumber
|
|
||||||
* @property string[] $seeAlso
|
|
||||||
* @property string[] $roleOccupant
|
|
||||||
* @property string[] $street
|
|
||||||
* @property string[] $postOfficeBox
|
|
||||||
* @property string[] $postalCode
|
|
||||||
* @property string[] $postalAddress
|
|
||||||
* @property string[] $physicalDeliveryOfficeName
|
|
||||||
* @property string[] $ou
|
|
||||||
* @property string[] $st
|
|
||||||
* @property string[] $l
|
|
||||||
* @property string[] $description
|
|
||||||
* @method \nur\ldap\LdapAttr dn()
|
|
||||||
* @method \nur\ldap\LdapAttr cn()
|
|
||||||
* @method \nur\ldap\LdapAttr objectClass()
|
|
||||||
* @method \nur\ldap\LdapAttr x121Address()
|
|
||||||
* @method \nur\ldap\LdapAttr registeredAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr destinationIndicator()
|
|
||||||
* @method \nur\ldap\LdapAttr preferredDeliveryMethod()
|
|
||||||
* @method \nur\ldap\LdapAttr telexNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr teletexTerminalIdentifier()
|
|
||||||
* @method \nur\ldap\LdapAttr telephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr internationaliSDNNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr facsimileTelephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr seeAlso()
|
|
||||||
* @method \nur\ldap\LdapAttr roleOccupant()
|
|
||||||
* @method \nur\ldap\LdapAttr street()
|
|
||||||
* @method \nur\ldap\LdapAttr postOfficeBox()
|
|
||||||
* @method \nur\ldap\LdapAttr postalCode()
|
|
||||||
* @method \nur\ldap\LdapAttr postalAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr physicalDeliveryOfficeName()
|
|
||||||
* @method \nur\ldap\LdapAttr ou()
|
|
||||||
* @method \nur\ldap\LdapAttr st()
|
|
||||||
* @method \nur\ldap\LdapAttr l()
|
|
||||||
* @method \nur\ldap\LdapAttr description()
|
|
||||||
*/
|
|
||||||
class OrganizationalRoleObject extends LdapObject {
|
|
||||||
const OBJECT_CLASSES = [
|
|
||||||
"organizationalRole",
|
|
||||||
];
|
|
||||||
const PARENT_RDN = "ou=People";
|
|
||||||
const DN_NAMES = "cn";
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
const _AUTOGEN_CONSTS = ["SCHEMA"];
|
|
||||||
const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
|
|
||||||
const _AUTOGEN_METHODS = [[self::class, "_AUTOGEN_METHODS"]];
|
|
||||||
const SCHEMA = /*autogen*/[
|
|
||||||
'dn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'cn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'objectClass' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'x121Address' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'registeredAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'destinationIndicator' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PrintableSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'preferredDeliveryMethod' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'telexNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'teletexTerminalIdentifier' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'telephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'internationaliSDNNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'facsimileTelephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'seeAlso' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'roleOccupant' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'street' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postOfficeBox' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalCode' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'physicalDeliveryOfficeName' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'ou' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'st' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'l' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'description' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,166 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class PersonObject: une personne au sens inetOrg
|
|
||||||
*
|
|
||||||
* --autogen-properties-and-methods--
|
|
||||||
* @property string $dn
|
|
||||||
* @property string[] $ou
|
|
||||||
* @property string[] $objectClass
|
|
||||||
* @property string[] $userPassword
|
|
||||||
* @property string[] $searchGuide
|
|
||||||
* @property string[] $seeAlso
|
|
||||||
* @property string[] $businessCategory
|
|
||||||
* @property int[] $x121Address
|
|
||||||
* @property string[] $registeredAddress
|
|
||||||
* @property string[] $destinationIndicator
|
|
||||||
* @property string $preferredDeliveryMethod
|
|
||||||
* @property string[] $telexNumber
|
|
||||||
* @property string[] $teletexTerminalIdentifier
|
|
||||||
* @property string[] $telephoneNumber
|
|
||||||
* @property int[] $internationaliSDNNumber
|
|
||||||
* @property string[] $facsimileTelephoneNumber
|
|
||||||
* @property string[] $street
|
|
||||||
* @property string[] $postOfficeBox
|
|
||||||
* @property string[] $postalCode
|
|
||||||
* @property string[] $postalAddress
|
|
||||||
* @property string[] $physicalDeliveryOfficeName
|
|
||||||
* @property string[] $st
|
|
||||||
* @property string[] $l
|
|
||||||
* @property string[] $description
|
|
||||||
* @method \nur\ldap\LdapAttr dn()
|
|
||||||
* @method \nur\ldap\LdapAttr ou()
|
|
||||||
* @method \nur\ldap\LdapAttr objectClass()
|
|
||||||
* @method \nur\ldap\LdapAttr userPassword()
|
|
||||||
* @method \nur\ldap\LdapAttr searchGuide()
|
|
||||||
* @method \nur\ldap\LdapAttr seeAlso()
|
|
||||||
* @method \nur\ldap\LdapAttr businessCategory()
|
|
||||||
* @method \nur\ldap\LdapAttr x121Address()
|
|
||||||
* @method \nur\ldap\LdapAttr registeredAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr destinationIndicator()
|
|
||||||
* @method \nur\ldap\LdapAttr preferredDeliveryMethod()
|
|
||||||
* @method \nur\ldap\LdapAttr telexNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr teletexTerminalIdentifier()
|
|
||||||
* @method \nur\ldap\LdapAttr telephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr internationaliSDNNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr facsimileTelephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr street()
|
|
||||||
* @method \nur\ldap\LdapAttr postOfficeBox()
|
|
||||||
* @method \nur\ldap\LdapAttr postalCode()
|
|
||||||
* @method \nur\ldap\LdapAttr postalAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr physicalDeliveryOfficeName()
|
|
||||||
* @method \nur\ldap\LdapAttr st()
|
|
||||||
* @method \nur\ldap\LdapAttr l()
|
|
||||||
* @method \nur\ldap\LdapAttr description()
|
|
||||||
*/
|
|
||||||
class OrganizationalUnitObject extends LdapObject {
|
|
||||||
const OBJECT_CLASSES = [
|
|
||||||
"organizationalUnit",
|
|
||||||
];
|
|
||||||
const PARENT_RDN = "ou=People";
|
|
||||||
const DN_NAMES = "ou";
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
const _AUTOGEN_CONSTS = ["SCHEMA"];
|
|
||||||
const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
|
|
||||||
const _AUTOGEN_METHODS = [[self::class, "_AUTOGEN_METHODS"]];
|
|
||||||
const SCHEMA = /*autogen*/[
|
|
||||||
'dn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'ou' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'objectClass' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'userPassword' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'searchGuide' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'seeAlso' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'businessCategory' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'x121Address' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'registeredAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'destinationIndicator' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PrintableSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'preferredDeliveryMethod' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'telexNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'teletexTerminalIdentifier' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'telephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'internationaliSDNNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'facsimileTelephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'street' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postOfficeBox' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalCode' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'physicalDeliveryOfficeName' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'st' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'l' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'description' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,431 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class PersonObject: une personne au sens inetOrg
|
|
||||||
*
|
|
||||||
* --autogen-properties-and-methods--
|
|
||||||
* @property string $dn
|
|
||||||
* @property string[] $sn
|
|
||||||
* @property string[] $cn
|
|
||||||
* @property string[] $objectClass
|
|
||||||
* @property string[] $audio
|
|
||||||
* @property string[] $businessCategory
|
|
||||||
* @property string[] $carLicense
|
|
||||||
* @property string[] $departmentNumber
|
|
||||||
* @property string $displayName
|
|
||||||
* @property string $employeeNumber
|
|
||||||
* @property string[] $employeeType
|
|
||||||
* @property string[] $givenName
|
|
||||||
* @property string[] $homePhone
|
|
||||||
* @property string[] $homePostalAddress
|
|
||||||
* @property string[] $initials
|
|
||||||
* @property string[] $jpegPhoto
|
|
||||||
* @property string[] $labeledURI
|
|
||||||
* @property string[] $mail
|
|
||||||
* @property string[] $manager
|
|
||||||
* @property string[] $mobile
|
|
||||||
* @property string[] $o
|
|
||||||
* @property string[] $pager
|
|
||||||
* @property string[] $photo
|
|
||||||
* @property string[] $roomNumber
|
|
||||||
* @property string[] $secretary
|
|
||||||
* @property string[] $uid
|
|
||||||
* @property string[] $userCertificate
|
|
||||||
* @property string[] $x500UniqueIdentifier
|
|
||||||
* @property string $preferredLanguage
|
|
||||||
* @property string[] $userSMIMECertificate
|
|
||||||
* @property string[] $userPKCS12
|
|
||||||
* @property string[] $title
|
|
||||||
* @property int[] $x121Address
|
|
||||||
* @property string[] $registeredAddress
|
|
||||||
* @property string[] $destinationIndicator
|
|
||||||
* @property string $preferredDeliveryMethod
|
|
||||||
* @property string[] $telexNumber
|
|
||||||
* @property string[] $teletexTerminalIdentifier
|
|
||||||
* @property string[] $telephoneNumber
|
|
||||||
* @property int[] $internationaliSDNNumber
|
|
||||||
* @property string[] $facsimileTelephoneNumber
|
|
||||||
* @property string[] $street
|
|
||||||
* @property string[] $postOfficeBox
|
|
||||||
* @property string[] $postalCode
|
|
||||||
* @property string[] $postalAddress
|
|
||||||
* @property string[] $physicalDeliveryOfficeName
|
|
||||||
* @property string[] $ou
|
|
||||||
* @property string[] $st
|
|
||||||
* @property string[] $l
|
|
||||||
* @property string[] $userPassword
|
|
||||||
* @property string[] $seeAlso
|
|
||||||
* @property string[] $description
|
|
||||||
* @property string[] $eduPersonAffiliation
|
|
||||||
* @property string[] $eduPersonNickname
|
|
||||||
* @property string $eduPersonOrgDN
|
|
||||||
* @property string[] $eduPersonOrgUnitDN
|
|
||||||
* @property string $eduPersonPrimaryAffiliation
|
|
||||||
* @property string $eduPersonPrincipalName
|
|
||||||
* @property string[] $eduPersonPrincipalNamePrior
|
|
||||||
* @property string[] $eduPersonEntitlement
|
|
||||||
* @property string $eduPersonPrimaryOrgUnitDN
|
|
||||||
* @property string[] $eduPersonScopedAffiliation
|
|
||||||
* @property string[] $eduPersonTargetedID
|
|
||||||
* @property string[] $eduPersonAssurance
|
|
||||||
* @property string[] $eduPersonUniqueId
|
|
||||||
* @property string[] $eduPersonOrcid
|
|
||||||
* @property string[] $eduPersonAnalyticsTag
|
|
||||||
* @property string $eduPersonDisplayPronouns
|
|
||||||
* @method \nur\ldap\LdapAttr dn()
|
|
||||||
* @method \nur\ldap\LdapAttr sn()
|
|
||||||
* @method \nur\ldap\LdapAttr cn()
|
|
||||||
* @method \nur\ldap\LdapAttr objectClass()
|
|
||||||
* @method \nur\ldap\LdapAttr audio()
|
|
||||||
* @method \nur\ldap\LdapAttr businessCategory()
|
|
||||||
* @method \nur\ldap\LdapAttr carLicense()
|
|
||||||
* @method \nur\ldap\LdapAttr departmentNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr displayName()
|
|
||||||
* @method \nur\ldap\LdapAttr employeeNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr employeeType()
|
|
||||||
* @method \nur\ldap\LdapAttr givenName()
|
|
||||||
* @method \nur\ldap\LdapAttr homePhone()
|
|
||||||
* @method \nur\ldap\LdapAttr homePostalAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr initials()
|
|
||||||
* @method \nur\ldap\LdapAttr jpegPhoto()
|
|
||||||
* @method \nur\ldap\LdapAttr labeledURI()
|
|
||||||
* @method \nur\ldap\LdapAttr mail()
|
|
||||||
* @method \nur\ldap\LdapAttr manager()
|
|
||||||
* @method \nur\ldap\LdapAttr mobile()
|
|
||||||
* @method \nur\ldap\LdapAttr o()
|
|
||||||
* @method \nur\ldap\LdapAttr pager()
|
|
||||||
* @method \nur\ldap\LdapAttr photo()
|
|
||||||
* @method \nur\ldap\LdapAttr roomNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr secretary()
|
|
||||||
* @method \nur\ldap\LdapAttr uid()
|
|
||||||
* @method \nur\ldap\LdapAttr userCertificate()
|
|
||||||
* @method \nur\ldap\LdapAttr x500UniqueIdentifier()
|
|
||||||
* @method \nur\ldap\LdapAttr preferredLanguage()
|
|
||||||
* @method \nur\ldap\LdapAttr userSMIMECertificate()
|
|
||||||
* @method \nur\ldap\LdapAttr userPKCS12()
|
|
||||||
* @method \nur\ldap\LdapAttr title()
|
|
||||||
* @method \nur\ldap\LdapAttr x121Address()
|
|
||||||
* @method \nur\ldap\LdapAttr registeredAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr destinationIndicator()
|
|
||||||
* @method \nur\ldap\LdapAttr preferredDeliveryMethod()
|
|
||||||
* @method \nur\ldap\LdapAttr telexNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr teletexTerminalIdentifier()
|
|
||||||
* @method \nur\ldap\LdapAttr telephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr internationaliSDNNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr facsimileTelephoneNumber()
|
|
||||||
* @method \nur\ldap\LdapAttr street()
|
|
||||||
* @method \nur\ldap\LdapAttr postOfficeBox()
|
|
||||||
* @method \nur\ldap\LdapAttr postalCode()
|
|
||||||
* @method \nur\ldap\LdapAttr postalAddress()
|
|
||||||
* @method \nur\ldap\LdapAttr physicalDeliveryOfficeName()
|
|
||||||
* @method \nur\ldap\LdapAttr ou()
|
|
||||||
* @method \nur\ldap\LdapAttr st()
|
|
||||||
* @method \nur\ldap\LdapAttr l()
|
|
||||||
* @method \nur\ldap\LdapAttr userPassword()
|
|
||||||
* @method \nur\ldap\LdapAttr seeAlso()
|
|
||||||
* @method \nur\ldap\LdapAttr description()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonAffiliation()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonNickname()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonOrgDN()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonOrgUnitDN()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonPrimaryAffiliation()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonPrincipalName()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonPrincipalNamePrior()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonEntitlement()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonPrimaryOrgUnitDN()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonScopedAffiliation()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonTargetedID()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonAssurance()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonUniqueId()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonOrcid()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonAnalyticsTag()
|
|
||||||
* @method \nur\ldap\LdapAttr eduPersonDisplayPronouns()
|
|
||||||
*/
|
|
||||||
class PersonObject extends LdapObject {
|
|
||||||
const OBJECT_CLASSES = [
|
|
||||||
"inetOrgPerson",
|
|
||||||
"eduPerson",
|
|
||||||
];
|
|
||||||
const PARENT_RDN = "ou=People";
|
|
||||||
const DN_NAMES = "uid";
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
const _AUTOGEN_CONSTS = ["SCHEMA"];
|
|
||||||
const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
|
|
||||||
const _AUTOGEN_METHODS = [[self::class, "_AUTOGEN_METHODS"]];
|
|
||||||
const SCHEMA = /*autogen*/[
|
|
||||||
'dn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'sn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'cn' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'objectClass' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'audio' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\BinarySyntax',
|
|
||||||
'flags' => 8,
|
|
||||||
],
|
|
||||||
'businessCategory' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'carLicense' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'departmentNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'displayName' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'employeeNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'employeeType' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'givenName' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'homePhone' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'homePostalAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'initials' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'jpegPhoto' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\BinarySyntax',
|
|
||||||
'flags' => 8,
|
|
||||||
],
|
|
||||||
'labeledURI' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'mail' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'manager' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'mobile' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'o' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'pager' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'photo' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'roomNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'secretary' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'uid' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'userCertificate' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\BinarySyntax',
|
|
||||||
'flags' => 10,
|
|
||||||
],
|
|
||||||
'x500UniqueIdentifier' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\BinarySyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'preferredLanguage' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'userSMIMECertificate' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\BinarySyntax',
|
|
||||||
'flags' => 8,
|
|
||||||
],
|
|
||||||
'userPKCS12' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\BinarySyntax',
|
|
||||||
'flags' => 8,
|
|
||||||
],
|
|
||||||
'title' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'x121Address' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'registeredAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'destinationIndicator' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PrintableSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'preferredDeliveryMethod' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'telexNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'teletexTerminalIdentifier' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'telephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'internationaliSDNNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\IntegerSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'facsimileTelephoneNumber' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\TelephoneSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'street' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postOfficeBox' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalCode' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'postalAddress' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\PostalAddressSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'physicalDeliveryOfficeName' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'ou' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'st' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'l' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'userPassword' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'seeAlso' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'description' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonAffiliation' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonNickname' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonOrgDN' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'eduPersonOrgUnitDN' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonPrimaryAffiliation' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'eduPersonPrincipalName' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'eduPersonPrincipalNamePrior' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonEntitlement' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonPrimaryOrgUnitDN' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
'eduPersonScopedAffiliation' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonTargetedID' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonAssurance' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonUniqueId' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonOrcid' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonAnalyticsTag' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 0,
|
|
||||||
],
|
|
||||||
'eduPersonDisplayPronouns' => [
|
|
||||||
'class' => 'nur\\ldap\\syntaxes\\StringSyntax',
|
|
||||||
'flags' => 1,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -1,79 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
class filtersTest extends TestCase {
|
|
||||||
function testParse(): void {
|
|
||||||
self::assertSame("(objectClass=*)", filters::parse(null));
|
|
||||||
self::assertSame("(objectClass=*)", filters::parse(""));
|
|
||||||
self::assertSame("(abc)", filters::parse("abc"));
|
|
||||||
self::assertSame("(a=b)", filters::parse("a=b"));
|
|
||||||
self::assertSame("(a=b)", filters::parse("(a=b)"));
|
|
||||||
self::assertSame("(a=*)", filters::parse("a=*"));
|
|
||||||
self::assertSame("(a=*)", filters::parse("(a=*)"));
|
|
||||||
self::assertSame("(a=b)", filters::parse([
|
|
||||||
"a=b",
|
|
||||||
]));
|
|
||||||
self::assertSame("(a=b)", filters::parse([
|
|
||||||
"(a=b)",
|
|
||||||
]));
|
|
||||||
self::assertSame("(a=b)", filters::parse([
|
|
||||||
"a" => "b",
|
|
||||||
]));
|
|
||||||
self::assertSame("(a=\\2a)", filters::parse([
|
|
||||||
"a" => "*",
|
|
||||||
]));
|
|
||||||
self::assertSame("(&(a=b)(c=d))", filters::parse([
|
|
||||||
"a=b",
|
|
||||||
"c=d",
|
|
||||||
]));
|
|
||||||
self::assertSame("(&(a=b)(c=d))", filters::parse([
|
|
||||||
"a" => "b",
|
|
||||||
"c" => "d",
|
|
||||||
]));
|
|
||||||
self::assertSame("(|(a=b)(c=d)(&(x=y)(z=t)))",
|
|
||||||
filters::parse([
|
|
||||||
"|",
|
|
||||||
"a" => "b",
|
|
||||||
"c" => "d",
|
|
||||||
["&",
|
|
||||||
"x" => "y",
|
|
||||||
"z" => "t",
|
|
||||||
],
|
|
||||||
]));
|
|
||||||
self::assertSame("(a=b)", filters::parse([
|
|
||||||
"&",
|
|
||||||
"a" => "b",
|
|
||||||
]));
|
|
||||||
self::assertSame("(a=b)", filters::parse([
|
|
||||||
"|",
|
|
||||||
"a" => "b",
|
|
||||||
]));
|
|
||||||
self::assertSame("(!(a=b))", filters::parse([
|
|
||||||
"!",
|
|
||||||
"a" => "b",
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testParseArrayValues(): void {
|
|
||||||
self::assertSame("(&(a=x)(a=y))", filters::parse([
|
|
||||||
"a" => ["x", "y"],
|
|
||||||
]));
|
|
||||||
self::assertSame("(&(a=x)(a=y))", filters::parse([
|
|
||||||
"&",
|
|
||||||
"a" => ["x", "y"],
|
|
||||||
]));
|
|
||||||
self::assertSame("(|(a=x)(a=y))", filters::parse([
|
|
||||||
"|",
|
|
||||||
"a" => ["x", "y"],
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testOps(): void {
|
|
||||||
self::assertSame("(a=b)", filters::eq("a", "b"));
|
|
||||||
self::assertSame("(a=b*)", filters::eq("a", "b*"));
|
|
||||||
self::assertSame("(a=*b*)", filters::eq("a", "*b*"));
|
|
||||||
self::assertSame("(a=*)", filters::eq("a", "*"));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
class ldapTest extends TestCase {
|
|
||||||
function testPrepare_rename() {
|
|
||||||
$rdn = "uid=ouid";
|
|
||||||
$params = null;
|
|
||||||
self::assertFalse(ldap::prepare_rename("uid=ouid,dc=osuffix", $rdn, $params));
|
|
||||||
|
|
||||||
# renommage
|
|
||||||
$rdn = "uid=nuid";
|
|
||||||
$params = null;
|
|
||||||
self::assertTrue(ldap::prepare_rename("uid=ouid,dc=osuffix", $rdn, $params));
|
|
||||||
self::assertSame("uid=nuid", $rdn);
|
|
||||||
self::assertSame([
|
|
||||||
"new_parent" => "dc=osuffix",
|
|
||||||
"delete_old_rdn" => true,
|
|
||||||
"controls" => [],
|
|
||||||
], $params);
|
|
||||||
|
|
||||||
# renommage + déplacement
|
|
||||||
$rdn = "uid=nuid";
|
|
||||||
$params = "dc=nsuffix";
|
|
||||||
self::assertTrue(ldap::prepare_rename("uid=ouid,dc=osuffix", $rdn, $params));
|
|
||||||
self::assertSame("uid=nuid", $rdn);
|
|
||||||
self::assertSame([
|
|
||||||
"new_parent" => "dc=nsuffix",
|
|
||||||
"delete_old_rdn" => true,
|
|
||||||
"controls" => [],
|
|
||||||
], $params);
|
|
||||||
|
|
||||||
# déplacement uniquement
|
|
||||||
$rdn = "";
|
|
||||||
$params = "dc=nsuffix";
|
|
||||||
self::assertTrue(ldap::prepare_rename("uid=ouid,dc=osuffix", $rdn, $params));
|
|
||||||
self::assertSame("uid=ouid", $rdn);
|
|
||||||
self::assertSame([
|
|
||||||
"new_parent" => "dc=nsuffix",
|
|
||||||
"delete_old_rdn" => true,
|
|
||||||
"controls" => [],
|
|
||||||
], $params);
|
|
||||||
|
|
||||||
# rdn complexe
|
|
||||||
$rdn = "uid=nuid,ou=groups";
|
|
||||||
$params = "dc=nsuffix,dc=tld";
|
|
||||||
self::assertTrue(ldap::prepare_rename("uid=ouid,dc=osuffix", $rdn, $params));
|
|
||||||
self::assertSame("uid=nuid", $rdn);
|
|
||||||
self::assertSame([
|
|
||||||
"new_parent" => "ou=groups,dc=nsuffix,dc=tld",
|
|
||||||
"delete_old_rdn" => true,
|
|
||||||
"controls" => [],
|
|
||||||
], $params);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap;
|
|
||||||
|
|
||||||
use nur\b\ValueException;
|
|
||||||
use nur\t\TestCase;
|
|
||||||
|
|
||||||
class namesTest extends TestCase {
|
|
||||||
function testSplit(): void {
|
|
||||||
$valid = names::split_dn("", $rdn, $suffix);
|
|
||||||
self::assertFalse($valid);
|
|
||||||
|
|
||||||
$valid = names::split_dn("a=b", $rdn, $suffix);
|
|
||||||
self::assertTrue($valid);
|
|
||||||
self::assertSame("a=b", $rdn);
|
|
||||||
self::assertSame("", $suffix);
|
|
||||||
|
|
||||||
$valid = names::split_dn("a=b\\2ac", $rdn, $suffix);
|
|
||||||
self::assertTrue($valid);
|
|
||||||
self::assertSame("a=b*c", $rdn);
|
|
||||||
self::assertSame("", $suffix);
|
|
||||||
|
|
||||||
$valid = names::split_dn("a=b\\2bc", $rdn, $suffix);
|
|
||||||
self::assertTrue($valid);
|
|
||||||
self::assertSame("a=b\\2Bc", $rdn);
|
|
||||||
self::assertSame("", $suffix);
|
|
||||||
|
|
||||||
$valid = names::split_dn("a=b,x=y,z=t", $rdn, $suffix);
|
|
||||||
self::assertTrue($valid);
|
|
||||||
self::assertSame("a=b", $rdn);
|
|
||||||
self::assertSame("x=y,z=t", $suffix);
|
|
||||||
|
|
||||||
$valid = names::split_dn("a=b+c=d,x=y,z=t", $rdn, $suffix);
|
|
||||||
self::assertTrue($valid);
|
|
||||||
self::assertSame("a=b+c=d", $rdn);
|
|
||||||
self::assertSame("x=y,z=t", $suffix);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testSplit_rdn() {
|
|
||||||
self::assertException(ValueException::class, function () {
|
|
||||||
names::split_rdn("");
|
|
||||||
});
|
|
||||||
self::assertException(ValueException::class, function () {
|
|
||||||
names::split_rdn("xxx");
|
|
||||||
});
|
|
||||||
self::assertSame([
|
|
||||||
"a" => ["b"],
|
|
||||||
], names::split_rdn("a=b"));
|
|
||||||
self::assertSame([
|
|
||||||
"a" => ["b"],
|
|
||||||
"c" => ["d"],
|
|
||||||
], names::split_rdn("a=b+c=d"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testJoin() {
|
|
||||||
self::assertSame("", names::join("", ""));
|
|
||||||
self::assertSame("a=b", names::join("a=b", ""));
|
|
||||||
self::assertSame("a=b,x=y,z=t", names::join("a=b", "x=y,z=t"));
|
|
||||||
self::assertSame("a=b,x=y,z=t", names::join([
|
|
||||||
"a" => "b",
|
|
||||||
], "x=y,z=t"));
|
|
||||||
self::assertSame("a=b+c=d,x=y,z=t", names::join([
|
|
||||||
"a" => "b",
|
|
||||||
"c" => "d",
|
|
||||||
], "x=y,z=t"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testUnescape() {
|
|
||||||
self::assertSame("(", names::ldap_unescape("\\28"));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\sub;
|
|
||||||
|
|
||||||
use nur\ldap\PersonObject;
|
|
||||||
|
|
||||||
class Sub {
|
|
||||||
function testSub() {
|
|
||||||
$p = new PersonObject();
|
|
||||||
$p->sn();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,47 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\ldap\app\TLdapApplication;
|
|
||||||
use nur\ldap\LdapConn;
|
|
||||||
use nur\ldap\syntaxes\pri\MyValue;
|
|
||||||
use nur\t\TestCase;
|
|
||||||
|
|
||||||
class CompositeSyntaxTest extends TestCase {
|
|
||||||
use TLdapApplication;
|
|
||||||
|
|
||||||
const LOAD_PARAMS = false;
|
|
||||||
|
|
||||||
protected function setUp(): void {
|
|
||||||
parent::setUp();
|
|
||||||
if ($this->config === null) $this->config = __DIR__.'/../../tbin/default.ldapconf';
|
|
||||||
$this->conn = $this->getConn();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var LdapConn */
|
|
||||||
protected $conn;
|
|
||||||
|
|
||||||
const LDAP_VALUE1 = "[mvalue=first \\28value\\29][mdate=20230718200000Z]";
|
|
||||||
|
|
||||||
function testQuote() {
|
|
||||||
$mv = new MyValue();
|
|
||||||
$mv->setup($this->conn);
|
|
||||||
|
|
||||||
$mv->reset(null);
|
|
||||||
self::assertSame("", $mv->mvalue);
|
|
||||||
self::assertSame(null, $mv->mdate);
|
|
||||||
|
|
||||||
$mv->reset([
|
|
||||||
"mvalue" => "first (value)",
|
|
||||||
"mdate" => "19/07/2023",
|
|
||||||
]);
|
|
||||||
self::assertSame("first (value)", $mv->mvalue);
|
|
||||||
self::assertSame("19/07/2023", $mv->mdate);
|
|
||||||
self::assertSame(self::LDAP_VALUE1, $mv->formatLdap());
|
|
||||||
|
|
||||||
$mv->reset(null);
|
|
||||||
$mv->parseLdap(self::LDAP_VALUE1);
|
|
||||||
self::assertSame("first (value)", $mv->mvalue);
|
|
||||||
self::assertSame("19/07/2023", $mv->mdate);
|
|
||||||
self::assertSame(self::LDAP_VALUE1, $mv->formatLdap());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\t\TestCase;
|
|
||||||
|
|
||||||
class DateSyntaxTest extends TestCase {
|
|
||||||
function testPhp2ldap(): void {
|
|
||||||
$syn = new DateSyntax();
|
|
||||||
self::assertSame(null, $syn->php2ldap(null));
|
|
||||||
self::assertSame(null, $syn->php2ldap(""));
|
|
||||||
self::assertSame("20230324200000Z", $syn->php2ldap("25/3/23"));
|
|
||||||
self::assertSame("20230325110000Z", $syn->php2ldap("25/3/23 15:0"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testLdap2php(): void {
|
|
||||||
$syn = new DateSyntax();
|
|
||||||
self::assertSame("25/03/2023", $syn->ldap2php("20230324200000Z"));
|
|
||||||
self::assertSame("25/03/2023 15:00:00", $syn->ldap2php("20230325110000Z"));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\t\TestCase;
|
|
||||||
|
|
||||||
class PostalAddressSyntaxTest extends TestCase {
|
|
||||||
function testPhp2ldap(): void {
|
|
||||||
$syn = new PostalAddressSyntax();
|
|
||||||
self::assertNull($syn->php2ldap(null));
|
|
||||||
self::assertSame('', $syn->php2ldap(''));
|
|
||||||
self::assertSame('mon adresse', $syn->php2ldap(' mon adresse '));
|
|
||||||
self::assertSame('mon adre\$\$e', $syn->php2ldap(' mon adre$$e '));
|
|
||||||
self::assertSame('mon $ adresse', $syn->php2ldap(" mon \n adresse "));
|
|
||||||
self::assertSame('mon $ adre\$\$e', $syn->php2ldap(" mon \n adre\$\$e "));
|
|
||||||
}
|
|
||||||
|
|
||||||
function testLdap2php(): void {
|
|
||||||
$syn = new PostalAddressSyntax();
|
|
||||||
self::assertSame('', $syn->ldap2php(''));
|
|
||||||
self::assertSame('mon adresse', $syn->ldap2php('mon adresse'));
|
|
||||||
self::assertSame('mon adre$$e', $syn->ldap2php('mon adre\$\$e'));
|
|
||||||
self::assertSame("mon\nadresse", $syn->ldap2php('mon $ adresse'));
|
|
||||||
self::assertSame("mon\nadre\$\$e", $syn->ldap2php('mon $ adre\$\$e'));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes;
|
|
||||||
|
|
||||||
use nur\t\TestCase;
|
|
||||||
|
|
||||||
class TelephoneSyntaxTest extends TestCase {
|
|
||||||
function testPhp2ldap(): void {
|
|
||||||
$syn = new TelephoneSyntax();
|
|
||||||
self::assertNull($syn->php2ldap(null));
|
|
||||||
self::assertNull($syn->php2ldap(''));
|
|
||||||
self::assertSame('+262 262 30 65 00', $syn->php2ldap('306500'));
|
|
||||||
self::assertSame('+262 262 30 65 00', $syn->php2ldap('0262306500'));
|
|
||||||
self::assertSame('+262 692 29 58 24', $syn->php2ldap('0692295824'));
|
|
||||||
self::assertSame('+33 156 12 34 56', $syn->php2ldap('0156123456'));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes\pri;
|
|
||||||
|
|
||||||
use nur\ldap\CompositeValue;
|
|
||||||
use nur\ldap\syntaxes\BooleanSyntax;
|
|
||||||
use nur\ldap\syntaxes\DateSyntax;
|
|
||||||
use nur\ldap\TCompositeValue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class MyCValue
|
|
||||||
*
|
|
||||||
* --autogen-properties-and-methods--
|
|
||||||
* @property string $mvalue
|
|
||||||
* @property string $mdate
|
|
||||||
* @property string|null $ovalue
|
|
||||||
* @property string|null $odate
|
|
||||||
* @property bool|null $obool
|
|
||||||
*/
|
|
||||||
class MyValue extends CompositeValue {
|
|
||||||
use TCompositeValue;
|
|
||||||
|
|
||||||
const SCHEMA = [
|
|
||||||
"mvalue" => "string",
|
|
||||||
"mdate" => "date",
|
|
||||||
"ovalue" => "?string",
|
|
||||||
"odate" => "?date",
|
|
||||||
"obool" => "?bool",
|
|
||||||
];
|
|
||||||
|
|
||||||
const SYNTAXES = [
|
|
||||||
"mdate" => DateSyntax::class,
|
|
||||||
"odate" => DateSyntax::class,
|
|
||||||
"obool" => BooleanSyntax::class,
|
|
||||||
];
|
|
||||||
|
|
||||||
const MANDATORY_KEYS = [
|
|
||||||
"mvalue", "mdate",
|
|
||||||
];
|
|
||||||
|
|
||||||
const OPTIONAL_KEYS = [
|
|
||||||
"ovalue", "odate", "obool",
|
|
||||||
];
|
|
||||||
|
|
||||||
const KEY_KEYS = ["mvalue"];
|
|
||||||
|
|
||||||
#############################################################################
|
|
||||||
const _AUTOGEN_PROPERTIES = [[self::class, "_AUTOGEN_PROPERTIES"]];
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\ldap\syntaxes\pri;
|
|
||||||
|
|
||||||
use nur\ldap\syntaxes\CompositeSyntax;
|
|
||||||
|
|
||||||
class MyValueSyntax extends CompositeSyntax {
|
|
||||||
const CVCLASS = MyValue::class;
|
|
||||||
}
|
|
|
@ -1,112 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
use nur\sery\file\csv\AbstractBuilder;
|
|
||||||
use nur\sery\file\csv\TAbstractBuilder;
|
|
||||||
use nur\sery\os\path;
|
|
||||||
use nur\sery\web\http;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Cell\IValueBinder;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Cell\StringValueBinder;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Writer\Ods;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
||||||
|
|
||||||
class PhpSpreadsheetBuilder extends AbstractBuilder {
|
|
||||||
use TAbstractBuilder;
|
|
||||||
|
|
||||||
/** @var string|int|null nom de la feuille dans laquelle écrire */
|
|
||||||
const WSNAME = null;
|
|
||||||
|
|
||||||
function __construct(?string $output, ?array $params=null) {
|
|
||||||
parent::__construct($output, $params);
|
|
||||||
$this->ss = new Spreadsheet();
|
|
||||||
$this->valueBinder = new StringValueBinder();
|
|
||||||
$this->setWsname($params["wsname"] ?? static::WSNAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Spreadsheet $ss;
|
|
||||||
|
|
||||||
protected IValueBinder $valueBinder;
|
|
||||||
|
|
||||||
protected ?Worksheet $ws;
|
|
||||||
|
|
||||||
protected int $nrow;
|
|
||||||
|
|
||||||
const STYLE_ROW = 0, STYLE_HEADER = 1;
|
|
||||||
|
|
||||||
protected int $rowStyle;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string|int|null $wsname
|
|
||||||
*/
|
|
||||||
function setWsname($wsname): self {
|
|
||||||
$ss = $this->ss;
|
|
||||||
$this->ws = null;
|
|
||||||
$this->nrow = 0;
|
|
||||||
$this->rowStyle = self::STYLE_ROW;
|
|
||||||
|
|
||||||
$ws = wsutils::get_ws($wsname, $ss);
|
|
||||||
if ($ws === null) {
|
|
||||||
$ws = $ss->createSheet()->setTitle($wsname);
|
|
||||||
$this->wroteHeaders = false;
|
|
||||||
} else {
|
|
||||||
$maxRow = wsutils::compute_max_coords($ws)[1];
|
|
||||||
$this->nrow = $maxRow - 1;
|
|
||||||
$this->wroteHeaders = $maxRow > 1;
|
|
||||||
}
|
|
||||||
$this->ws = $ws;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _write(array $row): void {
|
|
||||||
$ws = $this->ws;
|
|
||||||
$styleHeader = $this->rowStyle === self::STYLE_HEADER;
|
|
||||||
$nrow = ++$this->nrow;
|
|
||||||
$ncol = 1;
|
|
||||||
foreach ($row as $col) {
|
|
||||||
$ws->getCellByColumnAndRow($ncol++, $nrow)->setValue($col, $this->valueBinder);
|
|
||||||
}
|
|
||||||
if ($styleHeader) {
|
|
||||||
$ws->getStyle("$nrow:$nrow")->getFont()->setBold(true);
|
|
||||||
$maxcol = count($row);
|
|
||||||
for ($ncol = 1; $ncol <= $maxcol; $ncol++) {
|
|
||||||
$ws->getColumnDimensionByColumn($ncol)->setAutoSize(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function writeHeaders(?array $headers=null): void {
|
|
||||||
$this->rowStyle = self::STYLE_HEADER;
|
|
||||||
parent::writeHeaders($headers);
|
|
||||||
$this->rowStyle = self::STYLE_ROW;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _sendContentType(): void {
|
|
||||||
switch (path::ext($this->output)) {
|
|
||||||
case ".ods":
|
|
||||||
$contentType = "application/vnd.oasis.opendocument.spreadsheet";
|
|
||||||
break;
|
|
||||||
case ".xlsx":
|
|
||||||
default:
|
|
||||||
$contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
http::content_type($contentType);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _checkOk(): bool {
|
|
||||||
switch (path::ext($this->output)) {
|
|
||||||
case ".ods":
|
|
||||||
$writer = new Ods($this->ss);
|
|
||||||
break;
|
|
||||||
case ".xlsx":
|
|
||||||
default:
|
|
||||||
$writer = new Xlsx($this->ss);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$writer->save($this->getResource());
|
|
||||||
$this->rewind();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,116 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
use nur\sery\cl;
|
|
||||||
use nur\sery\file\csv\AbstractReader;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Cell\DataType;
|
|
||||||
use PhpOffice\PhpSpreadsheet\IOFactory;
|
|
||||||
use PhpOffice\PhpSpreadsheet\RichText\RichText;
|
|
||||||
|
|
||||||
class PhpSpreadsheetReader extends AbstractReader {
|
|
||||||
const DATETIME_FORMAT = 'dd/mm/yyyy hh:mm:ss';
|
|
||||||
const DATE_FORMAT = 'dd/mm/yyyy';
|
|
||||||
const TIME_FORMAT = 'hh:mm:ss';
|
|
||||||
const FORMAT_MAPPINGS = [
|
|
||||||
'mm/dd hh' => self::DATETIME_FORMAT,
|
|
||||||
'dd/mm hh' => self::DATETIME_FORMAT,
|
|
||||||
'mm/dd hh:mm' => self::DATETIME_FORMAT,
|
|
||||||
'dd/mm hh:mm' => self::DATETIME_FORMAT,
|
|
||||||
'mm/dd hh:mm:ss' => self::DATETIME_FORMAT,
|
|
||||||
'dd/mm hh:mm:ss' => self::DATETIME_FORMAT,
|
|
||||||
'mm/dd/yyyy hh' => self::DATETIME_FORMAT,
|
|
||||||
'dd/mm/yyyy hh' => self::DATETIME_FORMAT,
|
|
||||||
'mm/dd/yyyy hh:mm' => self::DATETIME_FORMAT,
|
|
||||||
'dd/mm/yyyy hh:mm' => self::DATETIME_FORMAT,
|
|
||||||
'mm/dd/yyyy hh:mm:ss' => self::DATETIME_FORMAT,
|
|
||||||
'dd/mm/yyyy hh:mm:ss' => self::DATETIME_FORMAT,
|
|
||||||
'yyyy/mm/dd hh' => self::DATETIME_FORMAT,
|
|
||||||
'yyyy/mm/dd hh:mm' => self::DATETIME_FORMAT,
|
|
||||||
'yyyy/mm/dd hh:mm:ss' => self::DATETIME_FORMAT,
|
|
||||||
|
|
||||||
'mm/dd' => self::DATE_FORMAT,
|
|
||||||
'dd/mm' => self::DATE_FORMAT,
|
|
||||||
'mm/dd/yyyy' => self::DATE_FORMAT,
|
|
||||||
'dd/mm/yyyy' => self::DATE_FORMAT,
|
|
||||||
'yyyy/mm/dd' => self::DATE_FORMAT,
|
|
||||||
'mm/yyyy' => self::DATE_FORMAT,
|
|
||||||
|
|
||||||
'hh AM/PM' => self::TIME_FORMAT,
|
|
||||||
'hh:mm AM/PM' => self::TIME_FORMAT,
|
|
||||||
'hh:mm:ss AM/PM' => self::TIME_FORMAT,
|
|
||||||
'hh' => self::TIME_FORMAT,
|
|
||||||
'hh:mm' => self::TIME_FORMAT,
|
|
||||||
'hh:mm:ss' => self::TIME_FORMAT,
|
|
||||||
'[hh]:mm:ss' => self::TIME_FORMAT,
|
|
||||||
'mm:ss' => self::TIME_FORMAT,
|
|
||||||
];
|
|
||||||
|
|
||||||
/** @var string|int|null nom de la feuille depuis laquelle lire */
|
|
||||||
const WSNAME = null;
|
|
||||||
|
|
||||||
function __construct($input, ?array $params=null) {
|
|
||||||
parent::__construct($input, $params);
|
|
||||||
$this->wsname = $params["wsname"] ?? static::WSNAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected $wsname;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string|int|null $wsname
|
|
||||||
*/
|
|
||||||
function setWsname($wsname): self {
|
|
||||||
$this->wsname = $wsname;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIterator() {
|
|
||||||
$ss = IOFactory::load($this->input);
|
|
||||||
$ws = wsutils::get_ws($this->wsname, $ss);
|
|
||||||
|
|
||||||
[$nbCols, $nbRows] = wsutils::compute_max_coords($ws);
|
|
||||||
$this->isrc = $this->idest = 0;
|
|
||||||
for ($nrow = 1; $nrow <= $nbRows; $nrow++) {
|
|
||||||
$row = [];
|
|
||||||
for ($ncol = 1; $ncol <= $nbCols; $ncol++) {
|
|
||||||
if ($ws->cellExistsByColumnAndRow($ncol, $nrow)) {
|
|
||||||
$cell = $ws->getCellByColumnAndRow($ncol, $nrow);
|
|
||||||
$col = $cell->getValue();
|
|
||||||
if ($col instanceof RichText) {
|
|
||||||
$col = $col->getPlainText();
|
|
||||||
} else {
|
|
||||||
$dataType = $cell->getDataType();
|
|
||||||
if ($dataType == DataType::TYPE_NUMERIC || $dataType == DataType::TYPE_FORMULA) {
|
|
||||||
# si c'est un format date, le forcer à une valeur standard
|
|
||||||
$origFormatCode = $cell->getStyle()->getNumberFormat()->getFormatCode();
|
|
||||||
if (strpbrk($origFormatCode, "ymdhs") !== false) {
|
|
||||||
$formatCode = $origFormatCode;
|
|
||||||
$formatCode = preg_replace('/y+/', "yyyy", $formatCode);
|
|
||||||
$formatCode = preg_replace('/m+/', "mm", $formatCode);
|
|
||||||
$formatCode = preg_replace('/d+/', "dd", $formatCode);
|
|
||||||
$formatCode = preg_replace('/h+/', "hh", $formatCode);
|
|
||||||
$formatCode = preg_replace('/s+/', "ss", $formatCode);
|
|
||||||
$formatCode = preg_replace('/-+/', "/", $formatCode);
|
|
||||||
$formatCode = preg_replace('/\\\\ /', " ", $formatCode);
|
|
||||||
$formatCode = preg_replace('/;@$/', "", $formatCode);
|
|
||||||
$formatCode = cl::get(self::FORMAT_MAPPINGS, $formatCode, $formatCode);
|
|
||||||
if ($formatCode !== $origFormatCode) {
|
|
||||||
$cell->getStyle()->getNumberFormat()->setFormatCode($formatCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$col = $cell->getFormattedValue();
|
|
||||||
$this->verifixCol($col);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$col = null;
|
|
||||||
}
|
|
||||||
$row[] = $col;
|
|
||||||
}
|
|
||||||
if ($this->cookRow($row)) {
|
|
||||||
yield $row;
|
|
||||||
$this->idest++;
|
|
||||||
}
|
|
||||||
$this->isrc++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,202 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
use nur\sery\file\csv\AbstractBuilder;
|
|
||||||
use nur\sery\file\csv\TAbstractBuilder;
|
|
||||||
use nur\sery\os\path;
|
|
||||||
use nur\sery\php\nur_func;
|
|
||||||
use nur\sery\php\time\Date;
|
|
||||||
use nur\sery\php\time\DateTime;
|
|
||||||
use nur\sery\web\http;
|
|
||||||
use OpenSpout\Common\Entity\Cell;
|
|
||||||
use OpenSpout\Common\Entity\Style\Style;
|
|
||||||
use OpenSpout\Common\Helper\CellTypeHelper;
|
|
||||||
use OpenSpout\Writer\Common\Creator\WriterEntityFactory;
|
|
||||||
use OpenSpout\Writer\WriterMultiSheetsAbstract;
|
|
||||||
use OpenSpout\Writer\XLSX\Entity\SheetView;
|
|
||||||
|
|
||||||
class SpoutBuilder extends AbstractBuilder {
|
|
||||||
use TAbstractBuilder;
|
|
||||||
|
|
||||||
const DATE_FORMAT = "mm/dd/yyyy";
|
|
||||||
|
|
||||||
const DATETIME_FORMAT = "mm/dd/yyyy hh:mm:ss";
|
|
||||||
|
|
||||||
/** @var bool faut-il choisir le type numérique pour une chaine numérique? */
|
|
||||||
const TYPE_NUMERIC = true;
|
|
||||||
|
|
||||||
/** @var bool faut-il choisir le type date pour une chaine au bon format? */
|
|
||||||
const TYPE_DATE = true;
|
|
||||||
|
|
||||||
/** @var string|int|null nom de la feuille dans laquelle écrire */
|
|
||||||
const WSNAME = null;
|
|
||||||
|
|
||||||
function __construct(?string $output, ?array $params=null) {
|
|
||||||
parent::__construct($output, $params);
|
|
||||||
$ssType = $params["ss_type"] ?? null;
|
|
||||||
if ($ssType === null) {
|
|
||||||
switch (path::ext($this->output)) {
|
|
||||||
case ".ods":
|
|
||||||
$ssType = "ods";
|
|
||||||
break;
|
|
||||||
case ".xlsx":
|
|
||||||
default:
|
|
||||||
$ssType = "xlsx";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch ($ssType) {
|
|
||||||
case "ods":
|
|
||||||
$ss = WriterEntityFactory::createODSWriter();
|
|
||||||
break;
|
|
||||||
case "xlsx":
|
|
||||||
default:
|
|
||||||
$ss = WriterEntityFactory::createXLSXWriter();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$ss->setDefaultColumnWidth(10.5);
|
|
||||||
$ss->writeToStream($this->getResource());
|
|
||||||
$this->ss = $ss;
|
|
||||||
$this->typeNumeric = boolval($params["type_numeric"] ?? static::TYPE_NUMERIC);
|
|
||||||
$this->typeDate = boolval($params["type_date"] ?? static::TYPE_DATE);
|
|
||||||
$this->firstSheet = true;
|
|
||||||
$this->setWsname($params["wsname"] ?? static::WSNAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected WriterMultiSheetsAbstract $ss;
|
|
||||||
|
|
||||||
protected bool $typeNumeric;
|
|
||||||
|
|
||||||
protected bool $typeDate;
|
|
||||||
|
|
||||||
const STYLE_ROW = 0, STYLE_HEADER = 1;
|
|
||||||
|
|
||||||
protected int $rowStyle;
|
|
||||||
|
|
||||||
protected bool $firstSheet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string|int|null $wsname
|
|
||||||
*/
|
|
||||||
function setWsname($wsname, ?array $params=null): self {
|
|
||||||
$ss = $this->ss;
|
|
||||||
$this->rowStyle = self::STYLE_ROW;
|
|
||||||
if ($this->firstSheet) {
|
|
||||||
$this->firstSheet = false;
|
|
||||||
$ws = $ss->getCurrentSheet();
|
|
||||||
} else {
|
|
||||||
$ws = $ss->addNewSheetAndMakeItCurrent();
|
|
||||||
$this->wroteHeaders = false;
|
|
||||||
$this->built = false;
|
|
||||||
}
|
|
||||||
$wsname ??= $params["wsname"] ?? null;
|
|
||||||
if ($wsname !== null) $ws->setName($wsname);
|
|
||||||
$sheetView = (new SheetView())
|
|
||||||
->setFreezeRow(2);
|
|
||||||
$ws->setSheetView($sheetView);
|
|
||||||
if ($params !== null) {
|
|
||||||
if (array_key_exists("schema", $params)) {
|
|
||||||
$this->schema = $params["schema"] ?? null;
|
|
||||||
}
|
|
||||||
if (array_key_exists("headers", $params)) {
|
|
||||||
$this->headers = $params["headers"] ?? null;
|
|
||||||
}
|
|
||||||
if (array_key_exists("rows", $params)) {
|
|
||||||
$rows = $params["rows"] ?? null;
|
|
||||||
if (is_callable($rows)) $rows = $rows();
|
|
||||||
$this->rows = $rows;
|
|
||||||
}
|
|
||||||
if (array_key_exists("cook_func", $params)) {
|
|
||||||
$cookFunc = $params["cook_func"] ?? null;
|
|
||||||
$cookCtx = $cookArgs = null;
|
|
||||||
if ($cookFunc !== null) {
|
|
||||||
nur_func::ensure_func($cookFunc, $this, $cookArgs);
|
|
||||||
$cookCtx = nur_func::_prepare($cookFunc);
|
|
||||||
}
|
|
||||||
$this->cookCtx = $cookCtx;
|
|
||||||
$this->cookArgs = $cookArgs;
|
|
||||||
}
|
|
||||||
if (array_key_exists("type_numeric", $params)) {
|
|
||||||
$this->typeNumeric = boolval($params["type_numeric"] ?? static::TYPE_NUMERIC);
|
|
||||||
}
|
|
||||||
if (array_key_exists("type_date", $params)) {
|
|
||||||
$this->typeDate = boolval($params["type_date"] ?? static::TYPE_DATE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function isNumeric($value): bool {
|
|
||||||
if ($this->typeNumeric && is_numeric($value)) return true;
|
|
||||||
if (!is_string($value) && is_numeric($value)) return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function isDate(&$value, &$style): bool {
|
|
||||||
if (CellTypeHelper::isDateTimeOrDateInterval($value)) {
|
|
||||||
$style = (new Style())->setFormat(self::DATE_FORMAT);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!is_string($value) || !$this->typeDate) return false;
|
|
||||||
if (DateTime::isa_datetime($value, true)) {
|
|
||||||
$value = new DateTime($value);
|
|
||||||
$style = (new Style())->setFormat(self::DATETIME_FORMAT);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (DateTime::isa_date($value, true)) {
|
|
||||||
$value = new Date($value);
|
|
||||||
$style = (new Style())->setFormat(self::DATE_FORMAT);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _write(array $row): void {
|
|
||||||
$cells = [];
|
|
||||||
$rowStyle = null;
|
|
||||||
foreach ($row as $col) {
|
|
||||||
$style = null;
|
|
||||||
if ($col === null || $col === "") {
|
|
||||||
$type = Cell::TYPE_EMPTY;
|
|
||||||
} elseif ($this->isNumeric($col)) {
|
|
||||||
$type = Cell::TYPE_NUMERIC;
|
|
||||||
} elseif ($this->isDate($col, $style)) {
|
|
||||||
$type = Cell::TYPE_DATE;
|
|
||||||
} else {
|
|
||||||
$type = Cell::TYPE_STRING;
|
|
||||||
}
|
|
||||||
$cell = WriterEntityFactory::createCell($col, $style);
|
|
||||||
$cell->setType($type);
|
|
||||||
$cells[] = $cell;
|
|
||||||
}
|
|
||||||
if ($this->rowStyle === self::STYLE_HEADER) {
|
|
||||||
$rowStyle = (new Style())->setFontBold();
|
|
||||||
}
|
|
||||||
$this->ss->addRow(WriterEntityFactory::createRow($cells, $rowStyle));
|
|
||||||
}
|
|
||||||
|
|
||||||
function writeHeaders(?array $headers=null): void {
|
|
||||||
$this->rowStyle = self::STYLE_HEADER;
|
|
||||||
parent::writeHeaders($headers);
|
|
||||||
$this->rowStyle = self::STYLE_ROW;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _sendContentType(): void {
|
|
||||||
switch (path::ext($this->output)) {
|
|
||||||
case ".ods":
|
|
||||||
$contentType = "application/vnd.oasis.opendocument.spreadsheet";
|
|
||||||
break;
|
|
||||||
case ".xlsx":
|
|
||||||
default:
|
|
||||||
$contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
http::content_type($contentType);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _checkOk(): bool {
|
|
||||||
$this->ss->close();
|
|
||||||
$this->rewind();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,121 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
use nur\sery\cl;
|
|
||||||
use nur\sery\file\csv\AbstractReader;
|
|
||||||
use OpenSpout\Reader\Common\Creator\ReaderEntityFactory;
|
|
||||||
|
|
||||||
class SpoutReader extends AbstractReader {
|
|
||||||
/** @var string|int|null nom de la feuille depuis laquelle lire */
|
|
||||||
const WSNAME = null;
|
|
||||||
|
|
||||||
function __construct($input, ?array $params=null) {
|
|
||||||
parent::__construct($input, $params);
|
|
||||||
$this->ssType = $params["ss_type"] ?? null;
|
|
||||||
$this->allSheets = $params["all_sheets"] ?? true;
|
|
||||||
$wsname = static::WSNAME;
|
|
||||||
if ($params !== null && array_key_exists("wsname", $params)) {
|
|
||||||
# spécifié par l'utilisateur: $allSheets = false
|
|
||||||
$this->setWsname($params["wsname"]);
|
|
||||||
} elseif ($wsname !== null) {
|
|
||||||
# valeur non nulle de la classe: $allSheets = false
|
|
||||||
$this->setWsname($wsname);
|
|
||||||
} else {
|
|
||||||
# pas de valeur définie dans la classe, laisser $allSheets à sa valeur
|
|
||||||
# actuelle
|
|
||||||
$this->wsname = null;
|
|
||||||
}
|
|
||||||
$this->includeWsnames = cl::withn($params["include_wsnames"] ?? null);
|
|
||||||
$this->excludeWsnames = cl::withn($params["exclude_wsnames"] ?? null);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ?string $ssType;
|
|
||||||
|
|
||||||
/** @var bool faut-il retourner les lignes de toutes les feuilles? */
|
|
||||||
protected bool $allSheets;
|
|
||||||
|
|
||||||
function setAllSheets(bool $allSheets=true): self {
|
|
||||||
$this->allSheets = $allSheets;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array|null si non null, liste de feuilles à inclure. n'est pris en
|
|
||||||
* compte que si $allSheets===true
|
|
||||||
*/
|
|
||||||
protected ?array $includeWsnames;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array|null si non null, liste de feuilles à exclure. n'est pris en
|
|
||||||
* compte que si $allSheets===true
|
|
||||||
*/
|
|
||||||
protected ?array $excludeWsnames;
|
|
||||||
|
|
||||||
protected $wsname;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string|int|null $wsname l'unique feuille à sélectionner
|
|
||||||
*
|
|
||||||
* NB: appeler cette méthode réinitialise $allSheets à false
|
|
||||||
*/
|
|
||||||
function setWsname($wsname): self {
|
|
||||||
$this->wsname = $wsname;
|
|
||||||
$this->allSheets = true;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getIterator() {
|
|
||||||
switch ($this->ssType) {
|
|
||||||
case "ods":
|
|
||||||
$ss = ReaderEntityFactory::createODSReader();
|
|
||||||
break;
|
|
||||||
case "xlsx":
|
|
||||||
$ss = ReaderEntityFactory::createXLSXReader();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$ss = ReaderEntityFactory::createReaderFromFile($this->input);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$ss->open($this->input);
|
|
||||||
try {
|
|
||||||
$allSheets = $this->allSheets;
|
|
||||||
$includeWsnames = $this->includeWsnames;
|
|
||||||
$excludeWsnames = $this->excludeWsnames;
|
|
||||||
$wsname = $this->wsname;
|
|
||||||
$first = true;
|
|
||||||
foreach ($ss->getSheetIterator() as $ws) {
|
|
||||||
if ($allSheets) {
|
|
||||||
$wsname = $ws->getName();
|
|
||||||
$found = ($includeWsnames === null || in_array($wsname, $includeWsnames))
|
|
||||||
&& ($excludeWsnames === null || !in_array($wsname, $excludeWsnames));
|
|
||||||
} else {
|
|
||||||
$found = $wsname === null || $wsname === $ws->getName();
|
|
||||||
}
|
|
||||||
if ($found) {
|
|
||||||
if ($first) {
|
|
||||||
$first = false;
|
|
||||||
} else {
|
|
||||||
yield null;
|
|
||||||
# on garde le même schéma le cas échéant, mais supprimer headers
|
|
||||||
# pour permettre son recalcul
|
|
||||||
$this->headers = null;
|
|
||||||
}
|
|
||||||
$this->isrc = $this->idest = 0;
|
|
||||||
foreach ($ws->getRowIterator() as $row) {
|
|
||||||
$row = $row->toArray();
|
|
||||||
foreach ($row as &$col) {
|
|
||||||
$this->verifixCol($col);
|
|
||||||
}; unset($col);
|
|
||||||
if ($this->cookRow($row)) {
|
|
||||||
yield $row;
|
|
||||||
$this->idest++;
|
|
||||||
}
|
|
||||||
$this->isrc++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
$ss->close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class SsBuilder: construction d'une feuille de calcul, pour envoi à
|
|
||||||
* l'utilisateur
|
|
||||||
*/
|
|
||||||
class SsBuilder extends SpoutBuilder {
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
use nur\sery\file\csv\TAbstractReader;
|
|
||||||
|
|
||||||
class SsReader extends SpoutReader {
|
|
||||||
use TAbstractReader;
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
||||||
|
|
||||||
class ssutils {
|
|
||||||
static function each_compute_max_coords(Spreadsheet $ss): array {
|
|
||||||
$max_coords = [];
|
|
||||||
foreach ($ss->getAllSheets() as $ws) {
|
|
||||||
$max_coords[$ws->getTitle()] = wsutils::compute_max_coords($ws);
|
|
||||||
}
|
|
||||||
return $max_coords;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
<?php
|
|
||||||
namespace nur\sery\ext\spreadsheet;
|
|
||||||
|
|
||||||
use nur\sery\ValueException;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
||||||
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
|
||||||
|
|
||||||
class wsutils {
|
|
||||||
static function get_ws(?string $wsname, Spreadsheet $ss, bool $create=false): ?Worksheet {
|
|
||||||
if ($wsname == null) {
|
|
||||||
$ws = $ss->getActiveSheet();
|
|
||||||
} elseif (is_numeric($wsname)) {
|
|
||||||
$sheetCount = $ss->getSheetCount();
|
|
||||||
if ($wsname < 1 || $wsname > $sheetCount) {
|
|
||||||
throw ValueException::invalid_value($wsname, "sheet index");
|
|
||||||
}
|
|
||||||
$ws = $ss->getSheet($wsname - 1);
|
|
||||||
} else {
|
|
||||||
$ws = $ss->getSheetByName($wsname);
|
|
||||||
if ($ws === null) {
|
|
||||||
if ($create) $ws = $ss->createSheet()->setTitle($wsname);
|
|
||||||
else throw ValueException::invalid_value($wsname, "sheet name");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $ws;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function get_highest_coords(Worksheet $ws): array {
|
|
||||||
$highestColumnA = $ws->getHighestColumn();
|
|
||||||
$highestCol = Coordinate::columnIndexFromString($highestColumnA);
|
|
||||||
$highestRow = $ws->getHighestRow();
|
|
||||||
return [$highestCol, $highestRow];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int nombre de colonnes/lignes au bout desquels on arrête de chercher
|
|
||||||
* si on n'a trouvé que des cellules vides.
|
|
||||||
*
|
|
||||||
* c'est nécessaire à cause de certains fichiers provenant d'Excel que j'ai
|
|
||||||
* reçus qui ont jusqu'à 10000 colonne vides et/ou 1048576 lignes vides. un
|
|
||||||
* algorithme "bête" perd énormément de temps à chercher dans le vide, donnant
|
|
||||||
* l'impression que le processus a planté.
|
|
||||||
*/
|
|
||||||
const MAX_EMPTY_THRESHOLD = 150;
|
|
||||||
|
|
||||||
static function compute_max_coords(Worksheet $ws): array {
|
|
||||||
[$highestCol, $highestRow] = self::get_highest_coords($ws);
|
|
||||||
|
|
||||||
$maxCol = 1;
|
|
||||||
$maxRow = 1;
|
|
||||||
$maxEmptyRows = self::MAX_EMPTY_THRESHOLD;
|
|
||||||
for ($row = 1; $row <= $highestRow; $row++) {
|
|
||||||
$emptyRow = true;
|
|
||||||
$maxEmptyCols = self::MAX_EMPTY_THRESHOLD;
|
|
||||||
for ($col = 1; $col <= $highestCol; $col++) {
|
|
||||||
$value = null;
|
|
||||||
if ($ws->cellExistsByColumnAndRow($col, $row)) {
|
|
||||||
$value = $ws->getCellByColumnAndRow($col, $row)->getValue();
|
|
||||||
}
|
|
||||||
if ($value === null) {
|
|
||||||
$maxEmptyCols--;
|
|
||||||
if ($maxEmptyCols == 0) break;
|
|
||||||
} else {
|
|
||||||
$maxEmptyCols = self::MAX_EMPTY_THRESHOLD;
|
|
||||||
if ($row > $maxRow) $maxRow = $row;
|
|
||||||
if ($col > $maxCol) $maxCol = $col;
|
|
||||||
$emptyRow = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($emptyRow) {
|
|
||||||
$maxEmptyRows--;
|
|
||||||
if ($maxEmptyRows == 0) break;
|
|
||||||
} else {
|
|
||||||
$maxEmptyRows = self::MAX_EMPTY_THRESHOLD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [$maxCol, $maxRow];
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue