Index: autoriser.php =================================================================== --- autoriser.php (révision 14777) +++ autoriser.php (copie de travail) @@ -79,37 +79,34 @@ if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id]) AND autoriser_exception($faire,$type,$id,'verifier')) return true; - - // Chercher une fonction d'autorisation - // Dans l'ordre on va chercher autoriser_type_faire, autoriser_type, - // autoriser_faire, autoriser_defaut ; puis les memes avec _dist + + // Propager la demande d'autorisation tant qu'elle est positive, du plus general + // au plus particulier. Dans l'ordre on va appeler : + // autoriser_faire(*), autoriser_type(*) puis autoriser_type_faire(*) + // Si aucune fonction n'existe, on appelle alors autoriser_defaut(*) + // (*) : avec '_dist' si la fonction n'existe pas $fonctions = $type - ? array ( - 'autoriser_'.$type.'_'.$faire, - 'autoriser_'.$type, - 'autoriser_'.$faire, - 'autoriser_defaut', - 'autoriser_'.$type.'_'.$faire.'_dist', - 'autoriser_'.$type.'_dist', - 'autoriser_'.$faire.'_dist', - 'autoriser_defaut_dist' - ) - : array ( - 'autoriser_'.$faire, - 'autoriser_defaut', - 'autoriser_'.$faire.'_dist', - 'autoriser_defaut_dist' - ); - + ?array ('autoriser_'.$faire, 'autoriser_'.$type, 'autoriser_'.$type.'_'.$faire) + :array ('autoriser_'.$faire); + $def = 'autoriser_defaut'; + $a = true; + foreach ($fonctions as $f) { - if (function_exists($f)) { - $a = $f($faire,$type,$id,$qui,$opt); - break; + if (function_exists($f) OR function_exists($f.='_dist')) { + $a &= $f($faire,$type,$id,$qui,$opt); + $def = false; + if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet')); + // Si on trouve une opposition, pas besoin de rester la... + if(!$a) return false; } } + if($def) { + if (function_exists($def) OR function_exists($def.='_dist')) { + $a = $def($faire,$type,$id,$qui,$opt); + if (_DEBUG_AUTORISER) spip_log("$def($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet')); + } + } - if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet')); - return $a; }