Analyse du projet de déploiement de règles ECA rules sous Oracle
Structure générale
Comme indiqué dans le mémoire, le déploiement des règles repose sur le formalisme XML et les technologies et langages associés (XSD, XSLT, ...). Le projet est composé d'un ensemble de fichier shells (sh), XML Schema Definition (XSD) et XML Schema Language (XSL). Le tableau ci-dessous illustre l'arborescence du projet.
+ check_interactive.sh + xmls / + templates -----+ basic.xsl -----+ ecarules.xsl -----+ oracle.xsl -----+ triggerPatterns.xsl -----+ varDisplay.xsl -----+ varTransitivity.xsl + ECA_simple -----+ ECA_activeXQuery.xsd -----+ ECA_activeXQueryDisplay.xsl -----+ ECA_activeXQueryTriggersOracle.xsl + ECA_confid -----+ ECA_activeXQuery2Confid.xsl -----+ ECA_activeXQueryConfid.xsd -----+ ECA_activeXQueryConfidDisplay.xsl -----+ ECA_activeXQueryConfidTriggersVPD.xsl + ECA_integrity -----+ ECA_activeXQueryConfid2Integrity.xsl -----+ ECA_activeXQueryIntegrity.xsd -----+ ECA_activeXQueryIntegrityDisplay.xsl -----+ ECA_activeXQueryIntegrityTriggersVPD.xsl
Pour rappel, les déploiements sous Oracle reposent également sur le mécanisme de Virtual Private Databases (VPD) défini dans Oracle 8i.
Génération des règles au format ECA rules ou Oracle
Le but du projet étant de générer des règles à partir d'une spécification XML, un ensemble de commandes permet de contrôler les informations produites. Cette génération repose sur le fichier shell check_interactive.sh et les paramètres suivants :
- #1 : nom sans l'extension du fichier XML source. Par exemple, dans le cas de test.xml, #1 vaut test
- #2 : niveau de génération (progressif, #2 équivaut donc à une condition d'arrêt)
- 00: analyse du fichier XML
- 01: génération des règles au format ECA rules
- 02 : génération des règles au format Oracle
- 10 : génération du fichier avec règle de confidentialité et analyse
- 11 : génération des règles au format ECA rules
- 12 : génération des règles au format Oracle
- 20 : génération du fichier avec règle d'intégrité et analyse
- 21 : génération des règles au format ECA rules
- 22 : génération des règles au format Oracle
Pour générer l'ensemble des fichiers associés à tests.xml, il faut donc générer la commande ./check_interactive.sh test 22. Cette génération repose également sur des outils opensources. Les fichiers sont ainsi analysés avec xmllint et transformés avec xsltproc. Par exemple, les étapes 00, 01 et 02 sont contrôlées comme suit :
echo "- Check initial XML file validity wrt to xsd file"
xmllint -noout -schema ECA_simple/ECA_activeXQuery.xsd \
$1.xml
if(test $2 -eq "0" ) then echo "end at step 0" & exit 0; fi
echo "- Process Initial Display "
xsltproc --output $1-display.html \
ECA_simple/ECA_activeXQueryDisplay.xsl \
$1.xml
if(test $2 -eq "01" ) then echo "end at step 01" & exit 0; fi
echo "- Process Initial triggers for Oracle"
xsltproc --output $1.html \
ECA_simple/ECA_activeXQueryTriggersOracle.xsl \
$1.xml
if(test $2 -eq "02" ) then echo "end at step 02" & exit 0; fi
Les fichiers de définitions (formalisme XML)
Afin de valider les règles rédigées au format XML et les transformations associées, plusieurs fichiers ont été définis. Premièrement, le fichier ECA_activeXQueryConfid.xsd contient l'ensemble des définitions nécessaires pour formuler en XML les règles ECA rules. On pourra noter les types particuliers arithmeticCondition et simpleCondition : l'attribut freevariable permet de différencier les conditions des règles d'instanciations, ce qui est nécessaire en raison du changement de formalisme entre les spécifications logiques (du type prolog), XML et par la suite les règles Oracle.
<xs:element name="arithmeticCondition">
<xs:complexType>
<xs:sequence>
<xs:element name="predicate" type="xs:string"/>
<xs:element name="input" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="output" type="xs:string" />
</xs:sequence>
<xs:attribute name="negate" type="xs:boolean" default="false"/>
<xs:attribute name="freevariable" type="xs:boolean" default="false" />
</xs:complexType>
</xs:element>
<xs:element name="simpleCondition">
<xs:complexType>
<xs:sequence>
<xs:element name="predicate" type="xs:string"/>
</xs:sequence>
<xs:attribute name="negate" type="xs:boolean" default="false" />
<xs:attribute name="freevariable" type="xs:string" />
</xs:complexType>
Le deuxième fichier, ECA_activeXQueryConfid.xsd, étend le premier en considérant des conditions de confidentialité et des niveaux de confidentialité pour les actions, les évènements et les règles :
- confidCondition : augmentation du niveau de confidentialité
- confidPolicyCondition : conditions
- confidGetCondition : évaluation de variables de confidentialité
Enfin, le fichier ECA_activeXQueryIntegrity.xsd étend ECA_activeXQueryConfid.xsd et considère des conditions de intégrité et des niveaux d'intégrité pour les actions, les évènements et les règles :
- integrityCondition : augmentation du niveau de intégrité
- integrityPolicyCondition : conditions
- integrityGetCondition : évaluation de variables de intégrité
Les fichiers templates
Les « templates » ont été définies afin de regrouper les méthodes essentielles et génériques. Pour la génération des ECA rules, on dispose ainsi des méthodes suivantes du fichier ecarules.xsl :
- displaySimpleCondition, displayArithmeticCondition
- displayIntegrityCondition, displayIntegrityPolicyCondition, displayIntegrityGetCondition
- displayConfidCondition, displayConfidPolicyCondition, displayConfidGetCondition
Le fichier basic.xsl contient quand à lui des règles template pour gérer des opérations sur les chaines de caractères et aussi les nom des tables de la base de données.
Le fichier oracle.xsl fourni des méthodes pour gérer la génération des triggers, d'une manière similaire à ecarules.xsl :
- (set/get)EffectPredicate permet de contrôler les effets sur la table
- les templates generateNAME génèrent la liste des select, variables et variables de sécurités à instancier par la suite
- initializeFromHeaders permet de récupérer les variables de type current level
- displayConditions affiche l'ensemble des conditions
- ifSelectVariables génère la règle associée aux select
Enfin, le fichier varTransitivity.xsl permet de contrôler les changements de nom de variables lors des appels action --> événement, événement --> règle, règle --> action.
Les règles de transformation
Les transformations s'effectuent de manière successive et progressive.
Premièrement, le fichier ECA_activeXQuery2Confid.xsl récupère les règles au format XML sans notion de sécurité et intègre les informations de confidentialité. Ce sont les règles ActionsUpdate, EventsUpdate et RulesUpdate. La règle ActionsDuplicate permet le passage entre actions sans notion de sécurité et action avec notion de confidentialité. Associée à ActionsDuplicate, la règle EPrules considère toutes les actions possibles et génère les évènements et les règles sans notion de sécurité, afin d'appeler par la suite les actions avec notion de sécurité et donc un niveau hiérarchique à 0.
Deuxièmement, le fichier ECA_activeXQueryConfid2Integrity.xsl récupère les règles au format XML avec confidentialité et intègre les informations d'intégrité. Le principe est similaire à celui de ECA_activeXQuery2Confid.xsl.
Les règles de génération des ECA rules
La génération des ECA rules est assez simple étant donné que les fichiers XML se basent sur une version « formalisée » de celles-ci. Les fichiers permettant l'affichage sont ECA_activeXQuery-IntegrityDisplay.xsl, ECA_activeXQueryConfidDisplay.xsl et ECA_activeXQueryDisplay.xsl.
Principe général
L'affichage des actions, des évènements et des règles repose sur l'utilisation de la boucle for-each, appliquée successivement à action, event et rule. La template associée (telle actionDesc) est appelée pour chaque occurrence trouvée.
<xsl:for-each select="action">
<xsl:call-template name="actionDesc"></xsl:call-template>
<xsl:if test="position()!=last()"><br/></xsl:if>
</xsl:for-each>
Ces templates affichent par la suite l'entête de l'élément et reposent sur le fichier eacrules.xsl pour afficher les conditions :
<xsl:template name="actionDesc">
do(<xsl:value-of select="actionHeader/user"/>, <xsl:value-of select="actionHeader/right" />,
<xsl:value-of select="actionHeader/object" />)
causes <xsl:value-of select="effect/right" />(<xsl:call-template name="clearObject">
<xsl:with-param name="text" select="effect/object" /> </xsl:call-template>)
<xsl:if test="conditions">
if <ul>
<xsl:for-each select="conditions" > <xsl:for-each select="child::*">
<xsl:if test="name()='simpleCondition'"><xsl:call-template name="displaySimpleCondition" /></xsl:if>
<xsl:if test="name()='arithmeticCondition'"><xsl:call-template name="displayArithmeticCondition" /></xsl:if>
</xsl:for-each> </xsl:for-each>
</ul>
</xsl:if>
</xsl:template>
...
<xsl:include href="../templates/ecarules.xsl" />
Cas particuliers, extensions
Bien que les différentes règles d'affichages reposent sur une structure similaire, elles sont progressivement raffinées pour exprimer l'ensemble des besoins. En effet, les entêtes sont étendues ainsi que les tests au niveaux des conditions, en fonction des nouveaux éléments à considérer. Les conditions sont testées dans le raffinement final comme suit :
<xsl:if test="name()='simpleCondition'"><xsl:call-template name="displaySimpleCondition" /></xsl:if> <xsl:if test="name()='confidCondition'"><xsl:call-template name="displayConfidCondition" /></xsl:if> <xsl:if test="name()='confidPolicyCondition'"><xsl:call-template name="displayConfidPolicyCondition" /></xsl:if> <xsl:if test="name()='confidGetCondition'"><xsl:call-template name="displayConfidGetCondition" /></xsl:if> <xsl:if test="name()='arithmeticCondition'"><xsl:call-template name="displayArithmeticCondition" /></xsl:if> <xsl:if test="name()='integrityCondition'"><xsl:call-templatename="displayIntegrityCondition" /></xsl:if> <xsl:if test="name()='integrityPolicyCondition'"><xsl:call-template name="displayIntegrityPolicyCondition" /></xsl:if> <xsl:if test="name()='integrityGetCondition'"><xsl:call-template name="displayIntegrityGetCondition" /></xsl:if>
Les règles de génération des triggers
Fichier de base
Les fichiers haut-niveaux associés à la génération de triggers sont ceux directement appelés par le script de génération : ECA_activeXQueryTriggersOracle.xsl, ECA_activeXQueryConfidTriggers-VPD.xsl et ECA_activeXQueryIntegrityTriggersVPD.xsl. Ils récupèrent en entrée des fichiers XML valides et conformes aux besoins et génèrent par la suite des triggers compatibles Oracle en respectant le procédé suivant :
- Rappel des modules VPD nécessaires, comme indiqué dans le chapitre 7 du mémoire.
- Calcul des transformations de nom de variables afin d'assurer la cohérence entres les transitions action -> événement -> règle -> action. Cette évaluation des transformations repose sur le fichier varTransitivity.xsl
- Définition de l'entête standard de chaque triggers. Celles-ci reposent sur le fichier triggerPatterns.xsl et consistent généralement à afficher
- les conditions d'activation du trigger
- la définition des variables nécessaires : select, nom des variables libres, nom des variables de type niveau de sécurité
- Définition du corps du trigger
- conditions définies dans les règles
- conditions de sécurité
- Définition des effets
Conditions de sécurité
Afin de gérer les conditions de sécurité, plusieurs types ont été définis et leurs affichages diffèrent. Dans la suite de ce paragraphe, Type fait référence soit à integrity, soit à confid et Module fait référence au module associé. L'affichage des conditions repose sur le fichier oracle.xsl :
- Les conditions du type TypeCondition sont affichées sous la forme de définition du niveau de sécurité, laquelle est contrôlée dans le module VPD concerné.
- Les conditions du type TypePolicyCondition sont affichées sous la forme de conditions à respecter :
- IF(not(MODULE_pkg.PREDICAT(PARAM)))return;
- Les conditions du type TypeGetCondition sont considérées comme des requêtes d'instanciation de variable libre (pour le moment, une seule variable libre est supportée) :
- OUTPUT = MODULE_pkg.PREDICAT(INPUT);


Accueil
