\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]{sam. oct. 12 15:42:54 CEST 2013}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={slapo-rwm},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Overlay rwm},
CreationDate={D:20131012154254},
ModDate={D:20131012154254},
Keywords={LDAP;OpenLDAP;Lightweight Directory Access Protocol}
}}
\begin{document}
 
\begin{center}
{\Huge slapo-rwm }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Overlay rwm}
 
\vspace{10mm}
 
\hspace{1mm}  Overlay rewrite/remap. Permet d'effectuer des réécritures basiques de DN données et des mapping d'attribut/classe d'objet.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Mapping }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} rwm-map \{attribute | objectclass\} <local name> \{<foreign name> | *\}]{Map les attributeTypes et les objectClasse.}
\item[\hspace{1mm} rwm-normalize-mapped-attrs \{yes|no\}]{à yes, rwm tente de normaliser les valeurs des attributs mappés (utile lors que les attributs distant sont inconnus du serveur)}
\item[\hspace{1mm} rwm-drop-unrequested-attrs \{yes|no\}]{à yes, rwm drop les attributs qui ne sont pas explicitement demandés par une opération de recherche.}
\end{description}
 
\vspace{1cm}{\huge Suffix Massaging }
 
\
 
\hspace{1mm}  Permet de mapper un contexte de nommage réel et virtuel. Permet par exemple de créer des vues virtuelles.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} rwm-suffixmassage \texttt{[}<virtual naming context>\texttt{]} <real naming context>]{Réecriture de contexte de nommage.}
\end{description}
 
\vspace{1cm}{\huge Rewriting }
 
\
 
\hspace{1mm}  Une chaîne est réécrite en fonction d'un jeu de règles, appelé un contexte de réécriture. Les règles sont basé sur des expressions régulières étendue POSIX avec correspondance de sous-chaîne.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} <rewrite context>::= <rewrite rule> \texttt{[}...\texttt{]}]{}
\item[\hspace{1mm} <rewrite rule>::= <pattern> <action> \texttt{[}<flags>\texttt{]}]{}
\end{description}
 
\vspace{1cm}{\huge Passes }
 
\
 
\hspace{1mm}  Une chaîne entrante est matchée avec un jeu de \textbf{rewriteRules}. Les règles sont faites de \textbf{regex match pattern}, un \textbf{substitution pattern} et un jeu d'\textbf{actions}, décris par un jeu de \textbf{flags} optionnels. En cas de correspondance, la réécriture de chaîne est effectuée en accord avec le motif de substitution qui permet de référer à une sous-chaîne matchée dans la chaîne. Chaque règle est exécutée récursivement Un mappage est un objet générique qui map un motif de substitution à une valeur. Les flags sont divisés en "\textbf{Pattern Matching Flags}" et en "\textbf{Action Flags}".
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Pattern Matching Flags }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} C]{respecte la casse}
\item[\hspace{1mm} R]{Utilise les expressions régulière POSIX standard.}
\item[\hspace{1mm} M\{n\}]{Ne permet pas plus de n récursion pour un règle.}
\end{description}
 
\vspace{1cm}{\huge Action Flags }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} :]{Applique la règle une seule fois (pas de récursion)}
\item[\hspace{1mm} @]{Arrête d'appliquer une règle en cas de correspondance}
\item[\hspace{1mm} \#]{Stop l'opération courante si la règle correspond et retourne un unwilling to perform}
\item[\hspace{1mm} G\{n\}]{Saute n règles en arrière}
\item[\hspace{1mm} I]{Ignore les erreurs dans les règles}
\item[\hspace{1mm} U\{n\}]{Utilise n comme code de retour si la règle match.}
\end{description}
 
\vspace{1cm}{\huge Substitution Pattern Syntax }
 
\
 
\hspace{1mm}  Tout ce qui commence avec '\textbf{\$}' nécessite une substitution. La seule exception est '\textbf{\$\$}', qui est retourné en un simple '\textbf{\$}'. La substitution de base est '\textbf{\$<d>}', où \textbf{<d>} est un chiffre; \textbf{0} signifie toute la chaîne, de \textbf{1} à \textbf{9} pour des submatch.
\vspace{5mm} \\
 
 
\hspace{1mm} un '\$' suivi d'un '\{' invoque une substitution avancée: \\
\hspace{1mm} \textbf{'\$' '\{' [ <operator> ] <name> '(' <substitution> ')' '\}'} \\
\hspace{1mm} où \\
\hspace{1mm} \textbf{<name>::= [a-z][a-z0-9]* (case insensitive)} \\
\hspace{1mm} \textbf{<operator>::= '>' '|' '\&' '\&\&' '*' '**' '\$'} \\
 
\begin{description} \normalsize
\item[\hspace{1mm} <substitution>]{doit être un motif de substitution valide, sans limite de niveau d'imbrication. les opérateurs sont:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} >]{Invocation de sous-contexte}
\item[\hspace{6mm} |]{Invocation de commande externe}
\item[\hspace{6mm} \&]{Assignement de variable}
\item[\hspace{6mm} * ]{Déréferencement de variable}
\item[\hspace{6mm} \$]{Déréférencement de paramètre}
\end{description}
 
\vspace{1cm}{\huge Rewrite Context }
 
\
 
\hspace{1mm}  Un contexte de réécriture est un jeu de règles qui sont appliquées en séquence. Quand une réécriture de chaîne est requise, on invoque le contexte de réécriture appropriée. Chaque opération serveur de base est associée à un contexte de réécriture, ils sont divisés en 2 groupes principaux: \textbf{client -> serveur} et \textbf{serveur -> client}:
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Client->serveur }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} (default)]{Si définis et sans contexte spécifique}
\item[\hspace{1mm} bindDN]{bind}
\item[\hspace{1mm} searchDN]{search}
\item[\hspace{1mm} searchFilter]{search}
\item[\hspace{1mm} searchFilterAttrDN]{search}
\item[\hspace{1mm} compareDN]{compare}
\item[\hspace{1mm} compareAttrDN]{compare AVA}
\item[\hspace{1mm} addDN]{add}
\item[\hspace{1mm} addAttrDN]{add AVA (DN portion of "ref" excluded)}
\item[\hspace{1mm} modifyDN]{modify}
\item[\hspace{1mm} modifyAttrDN]{modify AVA (DN portion of "ref" excluded)}
\item[\hspace{1mm} referralAttrDN]{add/modify DN portion of referrals}
\item[\hspace{1mm} renameDN]{modrdn (the old DN)}
\item[\hspace{1mm} newSuperiorDN]{modrdn (the new parent DN, if any)}
\item[\hspace{1mm} newRDN]{modrdn (the new relative DN)}
\item[\hspace{1mm} deleteDN]{delete}
\item[\hspace{1mm} exopPasswdDN]{password modify extended operation DN}
\end{description}
 
\vspace{1cm}{\huge Serveur->client }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} searchEntryDN]{search (seulement si défini, pas de défaut, agis sur le DN des entrées recherchées)}
\item[\hspace{1mm} searchAttrDN]{search AVA (seulement si défini, défaut sur searchEntryDN, agis sur les attributs type DN des entrées recherchées)}
\item[\hspace{1mm} matchedDN]{all ops (Seulement si applicable; défaut à searchEntryDN)}
\item[\hspace{1mm} referralDN]{all ops (Seulement si applicable; défaut: none)}
\end{description}
 
\vspace{1cm}{\huge Basic Configuration Syntax }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} rwm-rewriteEngine \{ on | off \}]{Autorise la réécriture}
\item[\hspace{1mm} rwm-rewriteContext <context name> \texttt{[} alias <aliased context name> \texttt{]} <Context Name>]{est le nom qui identifie le contexte, par ex le nom utilisé par l'application pour référer au jeu de règles qu'il contient. Un contexte peut être un alias d'un autre. Dans ce cas il ne contient pas de règle.}
\item[\hspace{1mm} rwm-rewriteRule <regex match pattern> <substitution pattern> \texttt{[} <flags> \texttt{]}]{Détermine comment une chaîne peut être réécrite si un motif est matché.}
\end{description}
 
\vspace{1cm}{\huge Additional Configuration Syntax }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} rwm-rewriteMap <map type> <map name> \texttt{[} <map attrs> \texttt{]}]{Permet de définir un map qui transforme des réécritures en quelque chose d'autre. Le map est référencé dans le motif de substitution d'une règle.}
\item[\hspace{1mm} rwm-rewriteParam <param name> <param value>]{Définis une valeur avec un scope global, qui peut être dé-référencé par la commande \$\verb|{|\$paramName\verb|}|}
\item[\hspace{1mm} rwm-rewriteMaxPasses <number of passes> \texttt{[}<number of passes per rule>\texttt{]}]{Définis un nombre maximum de réécritures totales en une seul opération de réécriture.}
\end{description}
 
\vspace{1cm}{\huge Maps }
 
\
 
\hspace{1mm}  les mappages supportés sont:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} LDAP <URI> \texttt{[}bindwhen=<when>\texttt{]} \texttt{[}version=<version>\texttt{]} \texttt{[}binddn=<DN>\texttt{]} \texttt{[}credentials=<cred>\texttt{]}]{Étend la valeur en effectuant une simple recherche LDAP. bindwhen détermine quand la connection est établie (now - créée au démarrage, later - quand nécessaire, everytime - a chaque fois).}
\item[\hspace{1mm} slapd <URI>]{étend une valeur en effectuant une recherche LDAP interne.}
\end{description}
 
\vspace{1cm}{\huge Exemple }
 
\
 
\hspace{1mm} activer le rewriting \\
\hspace{1mm} \textbf{rwm-rewriteEngine on} \\
\hspace{1mm} Tous les flux de données du client vers le serveur référrant au DN \\
\hspace{1mm} \textbf{rwm-rewriteContext default} \\
\hspace{1mm} \textbf{rwm-rewriteRule "(.+,)?<virtualnamingcontext>\$" "\$1<realnamingcontext>" ":"} \\
\hspace{1mm} Règle de filtre vide \\
\hspace{1mm} \textbf{rwm-rewriteContext searchFilter} \\
\hspace{1mm} Tous les flux de données du serveur vers le client \\
\hspace{1mm} \textbf{rwm-rewriteContext searchEntryDN} \\
\hspace{1mm} \textbf{rwm-rewriteRule "(.+,)?<realnamingcontext>\$" "\$1<virtualnamingcontext>" ":"} \\
\hspace{1mm} \textbf{rwm-rewriteContext searchAttrDN alias searchEntryDN} \\
\hspace{1mm} \textbf{rwm-rewriteContext matchedDN alias searchEntryDN} \\
\hspace{1mm} Diverses règles vides \\
\hspace{1mm} \textbf{rwm-rewriteContext referralAttrDN} \\
\hspace{1mm} \textbf{rwm-rewriteContext referralDN} \\
\hspace{1mm} Tout ce qui est définis ici va dans le contexte default. Change le contexte de nommage de tout ce qui est envoyé \\
\hspace{1mm} \textbf{rwm-rewriteRule "(.+,)?dc=home,[ ]?dc=net\$" "\$1dc=OpenLDAP, dc=org" ":"} \\
\hspace{1mm} Commence un nouveau contexte (termine l'entrée du précédent) Ajoute un blanc entre les parties du DN si non présent \\
\hspace{1mm} \textbf{rwm-rewriteContext addBlanks} \\
\hspace{1mm} \textbf{rwm-rewriteRule "(.*),([\textasciicircum  ].*)" "\$1, \$2"} \\
\hspace{1mm} Celui-ci supprime les blanc: \\
\hspace{1mm} \textbf{rwm-rewriteContext eatBlanks} \\
\hspace{1mm} \textbf{rwm-rewriteRule "(.*), (.*)" "\$1,\$2"} \\
\hspace{1mm} Chaque contrôle revient au context default, les règles sont ajoutée à celles existantes, et pipe dans addBlanks: \\
\hspace{1mm} \textbf{rwm-rewriteContext default} \\
\hspace{1mm} \textbf{rwm-rewriteRule ".*" "\$\{>addBlanks(\$0)\}" ":"} \\
\hspace{1mm} Réecrit la base de recherche sur les règles default: \\
\hspace{1mm} \textbf{rwm-rewriteContext searchDN alias default} \\
\hspace{1mm} Les résultats de recherche avec un DN openldap sont réecris avec dc=home,dc=net. \\
\hspace{1mm} \textbf{rwm-rewriteContext searchEntryDN} \\
\hspace{1mm} \textbf{rwm-rewriteRule "(.*[\textasciicircum  ],)?[ ]?dc=OpenLDAP,[ ]?dc=org\$" "\$\{>eatBlanks(\$1)\}dc=home,dc=net" ":"} \\
\hspace{1mm} Bind avec le mail au lieu du DN. on fait un map ldap qui transforme les attributs en DN \\
\hspace{1mm} \textbf{rwm-rewriteMap ldap attr2dn "ldap://host/dc=my,dc=org?dn?sub"} \\
\hspace{1mm} puis on détecte le DN fait d'un simple email. \\
\hspace{1mm} \textbf{rwm-rewriteContext bindDN} \\
\hspace{1mm} \textbf{rwm-rewriteRule "\textasciicircum mail=[\textasciicircum ,]+@[\textasciicircum ,]+\$" "\$\{attr2dn(\$0)\}" ":@I"} \\
\hspace{1mm} exemple plus sophistiqué \\
\hspace{1mm} \textbf{rwm-rewriteContext bindDN} \\
\hspace{1mm} \textbf{rwm-rewriteRule ".+" "\$\{\&\&binddn(\$0)\}\$0" ":"} \\
\hspace{1mm} \# A search filter containing 'uid=' is rewritten only if an appropriate DN is bound. To do this, in the first rule the bound DN is \\
\hspace{1mm} \# dereferenced, while the filter is decomposed in a prefix, in the value of the 'uid=<arg>' AVA, and in a suffix. A tag '<>' is appended to the DN. \\
\hspace{1mm} \# If the DN refers to an entry in the 'ou=admin' subtree, the filter is rewritten OR-ing the 'uid=<arg>' with 'cn=<arg>'; otherwise it is left as is. This could be \\
\hspace{1mm} \# useful, for instance, to allow apache's auth\_ldap-1.4 module to authenticate users with both 'uid' and 'cn', but only if the request comes from a possible \\
\hspace{1mm} \# 'cn=Web auth,ou=admin,dc=home,dc=net' user. \\
\hspace{1mm} \textbf{rwm-rewriteContext searchFilter} \\
\hspace{1mm} \textbf{rwm-rewriteRule "(.*\textbackslash{}\textbackslash{}()uid=([a-z0-9\_]+)(\textbackslash{}\textbackslash{}).*)" "\$\{**binddn\}<>\$\{\&prefix(\$1)\}\$\{\&arg(\$2)\}\$\{\&suffix(\$3)\}" ":I"} \\
\hspace{1mm} \textbf{rwm-rewriteRule "\textasciicircum [\textasciicircum ,]+,ou=admin,dc=home,dc=net\$" "\$\{*prefix\}|(uid=\$\{*arg\})(cn=\$\{*arg\})\$\{*suffix\}" ":@I"} \\
\hspace{1mm} \textbf{rwm-rewriteRule ".*<>\$" "\$\{*prefix\}uid=\$\{*arg\}\$\{*suffix\}" ":"} \\
\hspace{1mm} \# This example shows how to strip unwanted DN-valued attribute values from a search result; the first rule matches DN values below "ou=People,dc=example,dc=com"; \\
\hspace{1mm} \# in case of match the rewriting exits successfully. The second rule matches everything else and causes the value to be rejected. \\
\hspace{1mm} \textbf{rwm-rewriteContext searchEntryDN} \\
\hspace{1mm} \textbf{rwm-rewriteRule ".+,ou=People,dc=example,dc=com\$" "\$0" ":@"} \\
\hspace{1mm} \textbf{rwm-rewriteRule ".*" "" "\#"} \\
 
\vspace{1cm}{\huge Exemple de mapping }
 
\
 
\hspace{1mm} \textbf{map objectclass groupOfNames groupOfUniqueNames} \\
\hspace{1mm} \textbf{map attribute uniqueMember member} \\
\hspace{1mm} Jeu d'attribut limité, map cn, sn, manager, description a eux-même, tous les autres sont supprimés. \\
\hspace{1mm} \textbf{map attribute cn *} \\
\hspace{1mm} \textbf{map attribute sn *} \\
\hspace{1mm} \textbf{map attribute manager *} \\
\hspace{1mm} \textbf{map attribute description *} \\
\hspace{1mm} \textbf{map attribute *} \\
\end{flushleft}
\end{document}
