\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{lun. mai 12 11:00:06 CEST 2014}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={draft-chu-ldap-xordered-00},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Extension de schéma X-ORDERED},
CreationDate={D:20140512110006},
ModDate={D:20140512110006},
Keywords={LDAP;Lightweight Directory Access Protocol}
}}
\begin{document}
 
\begin{center}
{\Huge draft-chu-ldap-xordered-00 }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Extension de schéma X-ORDERED}
 
\vspace{10mm}
 
\hspace{1mm}  Ce document décrit un schéma pour attacher des informations ordonnées aux attributs dans un annuaire pour que l'ordre puisse être préservé et propagé aux autres applications LDAP.
\vspace{5mm} \\
 
 
\hspace{1mm}  L'extension de schéma \textbf{X-ORDERED} est ajouté à un AttributeTypeDescription pour signifier l'utilisation de ce mécanisme d'ordonnancement. L'extension a 2 variantes. En général cette extension est uniquement compatible avec AttributeType qui a une syntaxe orienté chaîne.
\vspace{5mm} \\
 
 
\hspace{1mm}  La variante \textbf{VALUES} est utilisée avec les attributs multi-valués pour maintenir l'ordre des valeurs. Par exemple, cette fonctionnalité est utile pour stocker des données telles que les ACL, qui doivent être évaluées dans un ordre spécifique.
\vspace{5mm} \\
 
 
\hspace{1mm}  La variante \textbf{SIBLINGS} est utilisée avec les attributs mono-valués pour maintenir l'ordre de tous les enfants onelevel de l'entrée parent. L'ordre sera ainsi maintenu pour toutes les entrées enfants dont le RDN est de même AttributeType. Par exemple, on pourrait stocker une liste prioritisée de serveurs en tant que jeu d'entrées séparées, chaque entrée contenant les attributs séparés pour une URL, un jeu d'accréditation et divers autres paramètres.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Encodage }
 
\
 
\hspace{1mm} L'information d'ordonnancement est encodée en préfixant un index ordinal à chaque valeur, entre accolade:
 
{\ttfamily
d = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"\\ numericstring = 1*d\\ ordering-prefix = "\{" numericstring "\}"\\ value = <any sequence of octets>\\ ordered-value = ordering-prefix value\\
}
\vspace{8mm}
 
\hspace{1mm}  Ils sont basés sur 0 et incrémentés de 1 à chaque valeur. Noter qu'en stockant les valeurs ordonnancées dans un annuaire, le préfixe pour généralement être omis vu qu'il sera généré automatiquement. Mais si la valeur original commence avec une séquence de caractères dans la forme d'un préfixe d'ordonnancement, le préfixe devra être fournis. Utiliser cette extension dans un attribut qui nécessite ce préfixe est une valeur de syntaxe LDAP légal de cet attribut.
\vspace{5mm} \\
\hspace{1mm}  [SECTION] name="Propriété d'ordonnancement" table="paragraphes" imbrication="0"
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} -]{Quand présenté avec une AssertionValue qui n'a pas de préfixe d'ordonnancement, le préfixe dans l'AttributeValue est ignoré.}
\item[\hspace{1mm} -]{Quand présenté avec une AssertionValue qui consiste uniquement de ce préfixe, seul le préfixe de cet AttributeValue est comparé, le reste de la valeur est ignoré}
\item[\hspace{1mm} -]{Quand présenté avec une AssertionValue contenant le préfixe et une valeur, les 2 composants sont comparés pour déterminer le match.}
\end{description}
 
\hspace{1mm}  Un effet de bord de ces propriétés et que même les attributs qui normalement n'ont pas de règle de correspondance d'égalité peuvent être matchés par un préfixe d'ordonnancement.
\vspace{5mm} \\
 
 
\hspace{1mm}  Le préfixe d'ordonnancement peut être également utilisé dans les requêtes de modification pour spécifier quelles valeur supprimer, et à quelle position devrait les valeurs devraient être ajoutées. Si une valeur ajoutée n'a pas de préfixe, elle est simplement ajoutée à la liste avec un préfixe automatiquement généré.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Exemple de schéma }
 
\
 
\hspace{1mm} Ce schéma est utilisé pour tous les exemples:
 
{\ttfamily
( EXAMPLE\_AT.1 NAME 'olcDatabase'\\ EQUALITY caseIgnoreMatch\\ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15\\ SINGLE-VALUE X-ORDERED 'SIBLINGS' )\\ \hspace{2mm}\\ ( EXAMPLE\_AT.2 NAME 'olcSuffix'\\ EQUALITY distinguishedNameMatch\\ SYNTAX 1.3.6.1.4.1.1466.115.121.1.12\\ X-ORDERED 'VALUES' )\\ \hspace{2mm}\\ ( EXAMPLE\_OC.1 NAME 'olcDatabaseConfig'\\ SUP top STRUCTURAL\\ MAY ( olcDatabase \$ olcSuffix ) )\\
}
\vspace{8mm}
 
\vspace{1cm}{\huge Values ordonnées }
 
\
 
\hspace{1mm} En donnant cette entrée:
 
{\ttfamily
dn: olcDatabase=\{1\}bdb,cn=config\\ olcDatabase: \{1\}bdb\\ objectClass: olcDatabaseConfig\\ olcSuffix: \{0\}dc=example,dc=com\\ olcSuffix: \{1\}o=example.com\\ olcSuffix: \{2\}o=The Example Company\\ olcSuffix: \{3\}o=example,c=us\\
}
\vspace{8mm}
 
\hspace{1mm} 1. On peut effectuer les opérations Modify suivantes:
 
{\ttfamily
dn: olcDatabase=\{1\}bdb,cn=config\\ changetype: modify\\ delete: olcSuffix\\ olcSuffix: \{0\}\\ -\\
}
\vspace{8mm}
 
\hspace{1mm} Cette opération supprime le premier olcSuffix, Sans regardes sa valeur. Toutes les autres valeurs sont remotées d'un position. L'attribut olcSuffix contiendra au final:
 
{\ttfamily
olcSuffix: \{0\}o=example.com\\ olcSuffix: \{1\}o=The Example Company\\ olcSuffix: \{2\}o=example,c=us\\
}
\vspace{8mm}
 
\hspace{1mm} 2. En commançant depuis l'entrée originale, on pourrait fournir ce changement à la place:
 
{\ttfamily
delete: olcSuffix\\ olcSuffix: o=example.com\\ -\\
}
\vspace{8mm}
 
\hspace{1mm} Cette oppération supprime le olcSuffix qui matche la valeur, sans regarder sont préfixe. L'attribut olcSuffix va contenir:
 
{\ttfamily
olcSuffix: \{0\}dc=example,dc=com\\ olcSuffix: \{1\}o=The Example Company\\ olcSuffix: \{2\}o=example,c=us\\
}
\vspace{8mm}
 
\hspace{1mm} 3. Également, en commançant depuis l'entrée originale, on pourrait effectuer ce changement:
 
{\ttfamily
delete: olcSuffix\\ olcSuffix: \{2\}o=The Example Company\\ -\\
}
\vspace{8mm}
 
\hspace{1mm} Ici, le préfixe et la valeur doivent correspondre, sinon l'opération échoue:
 
{\ttfamily
olcSuffix: \{0\}dc=example,dc=com\\ olcSuffix: \{1\}o=example.com\\ olcSuffix: \{2\}o=example,c=us\\
}
\vspace{8mm}
 
\hspace{1mm} 4. Ajouter une nouvelle valeur sans préfixe l'ajoute simplement:
 
{\ttfamily
add: olcSuffix\\ olcSuffix: o=example.org\\ -\\
}
\vspace{8mm}
 
\hspace{1mm} L'attribut résultant est:
 
{\ttfamily
olcSuffix: \{0\}dc=example,dc=com\\ olcSuffix: \{1\}o=example.com\\ olcSuffix: \{2\}o=The Example Company\\ olcSuffix: \{3\}o=example,c=us\\ olcSuffix: \{4\}o=example.org\\
}
\vspace{8mm}
 
\hspace{1mm} 5. Ajouter une nouvelle valeur avec un préfixe l'insert à la position spécifiée:
 
{\ttfamily
add: olcSuffix\\ olcSuffix: \{0\}o=example.org\\ -\\
}
\vspace{8mm}
 
\hspace{1mm} Le résultat est:
 
{\ttfamily
olcSuffix: \{0\}o=example.org\\ olcSuffix: \{1\}dc=example,dc=com\\ olcSuffix: \{2\}o=example.com\\ olcSuffix: \{3\}o=The Example Company\\ olcSuffix: \{4\}o=example,c=us\\
}
\vspace{8mm}
 
\hspace{1mm} 6. Modifier plusieurs valeur en une opération:
 
{\ttfamily
add: olcSuffix\\ olcSuffix: \{0\}ou=Dis,o=example.com\\ olcSuffix: \{0\}ou=Dat,o=example,com\\ -\\ delete: olcSuffix:\\ olcSuffix: \{2\}\\ olcSuffix: \{1\}\\ -\\
}
\vspace{8mm}
 
\hspace{1mm} Le résultat est:
 
{\ttfamily
olcSuffix: \{0\}ou=Dat,o=example,com\\ olcSuffix: \{1\}dc=example,dc=com\\ olcSuffix: \{2\}o=example.com\\ olcSuffix: \{3\}o=The Example Company\\ olcSuffix: \{4\}o=example,c=us\\
}
\vspace{8mm}
 
\hspace{1mm} 7. Si les add et delete de l'exemple précédent étaient fait dans l'ordre inversé:
 
{\ttfamily
opposite order:\\ delete: olcSuffix:\\ olcSuffix: \{2\}\\ olcSuffix: \{1\}\\ -\\ add: olcSuffix\\ olcSuffix: \{0\}ou=Dis,o=example.com\\ olcSuffix: \{0\}ou=Dat,o=example,com\\ -\\
}
\vspace{8mm}
 
\hspace{1mm} Le résultat serait:
 
{\ttfamily
olcSuffix: \{0\}ou=Dat,o=example,com\\ olcSuffix: \{1\}ou=Dis,o=example.com\\ olcSuffix: \{2\}o=example.org\\ olcSuffix: \{3\}o=The Example Company\\ olcSuffix: \{4\}o=example,c=us\\
}
\vspace{8mm}
 
\hspace{1mm}  Noter que matcher avec un préfixe d'ordonnancement peut aussi être fait dans les opération compare et dans les filtres de recherche. Par exemple, le filtre \textbf{"(olcSuffix=\{4\})"} va matcher toutes les entrées avec au moins 5 valeurs olcSuffix
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Siblings ordonnées }
 
\
 
\hspace{1mm}  Les règles pour le siblings ordonnées sont basiquement les même que pour les values ordonnées, excepté qu'au lieu de travailler principalement avec des opération modify, les opérations intéressantes sont add, delete et modrdn
\vspace{5mm} \\
 
 
\hspace{1mm} En donnant l'entrée suivante:
 
{\ttfamily
dn: olcDatabase=\{0\}config,cn=config\\ olcDatabase: \{0\}config\\ objectClass: olcDatabaseConfig\\ olcSuffix: \{0\}cn=config\\ \hspace{2mm}\\ dn: olcDatabase=\{1\}bdb,cn=config\\ olcDatabase: \{1\}bdb\\ objectClass: olcDatabaseConfig\\ olcSuffix: \{0\}dc=example,dc=com\\
}
\vspace{8mm}
 
\hspace{1mm} 1. Ajouter une nouvelle entrée sans préfixe d'ordonnancement:
 
{\ttfamily
dn: olcDatabase=hdb,cn=config\\ changetype: add\\ olcDatabase: hdb\\ objectClass: olcDatabaseConfig\\ olcSuffix: \{0\}dc=example,dc=org\\
}
\vspace{8mm}
 
\hspace{1mm} Le résultat sera:
 
{\ttfamily
dn: olcDatabase=\{2\}hdb,cn=config\\ olcDatabase: \{2\}hdb\\ objectClass: olcDatabaseConfig\\ olcSuffix: \{0\}dc=example,dc=org\\
}
\vspace{8mm}
 
\hspace{1mm} 2. En continuant avec ces 3 entrées, on peut ajouter une autre entrée avec un préfixe d'ordonnancement
 
{\ttfamily
dn: olcDatabase=\{1\}ldif,cn=config\\ changetype: add\\ olcDatabase: \{1\}ldif\\ objectClass: olcDatabaseConfig\\ olcSuffix: \{0\}o=example.com\\
}
\vspace{8mm}
 
\hspace{1mm} Ce qui nous donnera 4 entrées, dont les DN sont:
 
{\ttfamily
dn: olcDatabase=\{0\}config,cn=config\\ dn: olcDatabase=\{1\}ldif,cn=config\\ dn: olcDatabase=\{2\}bdb,cn=config\\ dn: olcDatabase=\{3\}hdb,cn=config\\
}
\vspace{8mm}
 
\hspace{1mm} 3. Fournir une requête modrdn va renommer plusieurs entrées:
 
{\ttfamily
dn: olcDatabase=\{1\}ldif,cn=config\\ changetype: modrdn\\ newrdn: olcDatabase=\{99\}ldif,cn=config\\ deleteoldrdn: 1\\
}
\vspace{8mm}
 
\hspace{1mm} Les entrées résultante seront nommées:
 
{\ttfamily
dn: olcDatabase=\{0\}config,cn=config\\ dn: olcDatabase=\{1\}bdb,cn=config\\ dn: olcDatabase=\{2\}hdb,cn=config\\ dn: olcDatabase=\{3\}ldif,cn=config\\
}
\vspace{8mm}
 
\hspace{1mm} 4. Une opération delete va également renommer les entrées restantes:
 
{\ttfamily
dn: olcDatabase=\{1\}bdb,cn=config\\ changetype: delete\\
}
\vspace{8mm}
 
\hspace{1mm} Donne:
 
{\ttfamily
dn: olcDatabase=\{0\}config,cn=config\\ dn: olcDatabase=\{1\}hdb,cn=config\\ dn: olcDatabase=\{2\}ldif,cn=config\\
}
\vspace{8mm}
\end{flushleft}
\end{document}
