Le 02/07/2013 18:09, Kevin Roy a écrit :
Bonjour,
Dans le cadre de tests de montée en version GLPI 0.83 vers 0.84, j'ai
rencontré une régression dans l'application des règles "Automatic user
assignment" sur l'affectation des entités à partir d'une expression régulière
vérifiant le DN de l'utilisateur.
Le résultat de cette régression est que les entités affectées par expression
régulière se retrouvent tronquées (ex: Entité 11 => Entité 1, Entité 25 =>
Entité 2).
Bonjour,
il serait déjà bon de comprendre pourquoi il tronque vos entités.
Je suppose que vous parlez des ID des entités et non de leur nom.
Est-ce que le test d'une règle vous donne une erreur ?
Cela nous permettrait de tester simplement.
- Le résultat de la méthode RuleRight::executeActions() renvoie actuellement 3
tableaux nommés différemment en fonction de la présence d'entités et/ou de
profils, qui sont ensuite traités différemment dans la fonction
User::applyRightRules().
La méthode renvoie 2 tableaux car on peut se trouver des 3 types de
règles :
- Une règle qui affecte une entité
- Une règle qui affecte un profile
- Une règle qui affecte un profile et une entité
Le système d'affectation réelle est alors le suivant :
- Pour les règles profile + entité on ajoute simplement le droit associé
- On combine l'ensemble des résultats entité / profile et on créé toutes
les combinaisons entité / profile. Si pas de profile on utilise le
profile par défaut.
Donc plusieurs règles peuvent être combinés pour produire des droits.
L'architecture de la solution proposée ne me semble pas forcément
compatible avec ce schéma.
- La boucle foreach sur les résultats d'une expression régulière, dans
RuleRight::executeActions() à la ligne 164 de inc/ruleright.class.php,
suggère qu'il est possible d'affecter plusieurs entités avec une seule
règle.
Or je n'ai pas réussi à trouver comment configurer une règle permettant ce
type de résultat puisque l'interface ne permet qu'une seule affectation
d'entité par regexp.
En utilisant plusieurs critères avec des regex je pense.
.Exemple de règle:
==================
Logical Operator: AND
Criteria:
- (LDAP)Distinguished Name | regular expression matches | /(OU=Développeurs)/
- (LDAP)Distinguished Name | regular expression matches | /(OU=Laboratoire)/
Actions:
- Entity based on LDAP information | Assign value from regexp | #0
Input:
[userdn] => CN=Kevin Roy,OU=Développeurs,OU=Laboratoire,DC=teclib,DC=info
Result:
[RuleRight::executeActions()] => Array
(
[this->regex_results] => Array
(
[0] => Array
(
[0] => OU=Développeurs
[1] => OU=Laboratoire
)
)
)
Vu ce que vous dites je pense avoir compris le problème.
On ajoute effectivement les entités dans un tableau hors par la suite on
traite $entity comme un champ standard.
Il faudrait donc boucler sur $entity.
Ci joint un patch essayant de corriger le problème (patch non testé,
juste pour l'idée)
Cordialement,
Julien Dombre
--- glpi/inc/ruleright.class.php 2013-07-02 07:55:29.086735426 +0200
+++ ../glpi-test/inc/ruleright.class.php 2013-07-02 18:50:33.895669563 +0200
@@ -126,13 +126,13 @@
$output_src = $output;
if (count($this->actions)) {
+ $entity = array();
foreach ($this->actions as $action) {
-
switch ($action->fields["action_type"]) {
case "assign" :
switch ($action->fields["field"]) {
case "entities_id" :
- $entity = $action->fields["value"];
+ $entity[] = $action->fields["value"];
break;
case "profiles_id" :
@@ -160,7 +160,6 @@
case "_affect_entity_by_tag" :
case "_affect_entity_by_domain" :
case "_affect_entity_by_completename" :
- $entity = array();
foreach ($this->regex_results as $regex_result) {
$res = RuleAction::getRegexResultById($action->fields["value"],
$regex_result);
@@ -208,23 +207,19 @@
} // count (actions)
if ($continue) {
+
//Nothing to be returned by the function :
//Store in session the entity and/or right
- if (($entity != '')
+ if (count($entity)
&& ($right != '')) {
- $output["_ldap_rules"]["rules_entities_rights"][] = array($entity, $right,
- $is_recursive);
- } else if ($entity != '') {
-
- if (!is_array($entity)) {
- $entities_array = array($entity, $is_recursive);
- $output["_ldap_rules"]["rules_entities"][] = array($entities_array);
-
- //If it comes from a regex with multiple results
- } else {
- $output["_ldap_rules"]["rules_entities"][] = $entity;
+ foreach ($entity as $entID) {
+ $output["_ldap_rules"]["rules_entities_rights"][] = array($entID, $right,
+ $is_recursive);
+ }
+ } else if (count($entity)) {
+ foreach ($entity as $entID) {
+ $output["_ldap_rules"]["rules_entities"][] = array($entity, $is_recursive);
}
-
} else if ($right != '') {
$output["_ldap_rules"]["rules_rights"][] = $right;
}
_______________________________________________
Glpi-dev mailing list
Glpi-dev@gna.org
https://mail.gna.org/listinfo/glpi-dev