déplacer ce qui est spécifique à php7.4 dans un autre module

This commit is contained in:
Jephté Clain 2024-11-14 19:35:33 +04:00
parent 6a44ab7727
commit 2d4801e135
86 changed files with 3 additions and 16554 deletions

View File

@ -3,6 +3,5 @@ defaults:
master: master:
allow_link: true allow_link: true
require: require:
nulib/php: dev-wip
branch: branch:
master: master:

View File

@ -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",

View File

@ -1,5 +0,0 @@
#!/usr/bin/php
<?php
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';
\nur\ldap\app\LdapDeleteApp::run();

View File

@ -1,5 +0,0 @@
#!/usr/bin/php
<?php
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';
\nur\ldap\app\LdapGetInfosApp::run();

View File

@ -1,5 +0,0 @@
#!/usr/bin/php
<?php
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';
\nur\ldap\app\LdapSearchApp::run();

View File

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

View File

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

View File

@ -1,10 +0,0 @@
<?php
namespace nur\ldap;
use nur\b\ICloseable;
interface ILdapWalker extends ICloseable {
function resetSearch(LdapSearch $search): ILdapWalker;
function next(): bool;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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],
],
],
];
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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,
])));
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
*/
}
}

View File

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

View File

@ -1,5 +0,0 @@
<?php
namespace nur\ldap\syntaxes;
class MailSyntax extends StringSyntax {
}

View File

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

View File

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

View File

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

View File

@ -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 {
}

View File

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

View File

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

View File

@ -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',
]
);

View File

@ -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,
]
);

View File

@ -1 +0,0 @@
admin.ldapconf

View File

@ -1 +0,0 @@
../../nur_bin/ldap-get-infos.php

View File

@ -1 +0,0 @@
../../nur_bin/ldap-search.php

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

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

View File

@ -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

View File

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

View File

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

View File

@ -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,
],
];
}

View File

@ -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,
],
];
}

View File

@ -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,
],
];
}

View File

@ -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,
],
];
}

View File

@ -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,
],
];
}

View File

@ -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", "*"));
}
}

View File

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

View File

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

View File

@ -1,11 +0,0 @@
<?php
namespace nur\ldap\sub;
use nur\ldap\PersonObject;
class Sub {
function testSub() {
$p = new PersonObject();
$p->sn();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +0,0 @@
<?php
namespace nur\ldap\syntaxes\pri;
use nur\ldap\syntaxes\CompositeSyntax;
class MyValueSyntax extends CompositeSyntax {
const CVCLASS = MyValue::class;
}

View File

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

View File

@ -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++;
}
}
}

View File

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

View File

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

View File

@ -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 {
}

View File

@ -1,8 +0,0 @@
<?php
namespace nur\sery\ext\spreadsheet;
use nur\sery\file\csv\TAbstractReader;
class SsReader extends SpoutReader {
use TAbstractReader;
}

View File

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

View File

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