From acdb1043aec0f8c6e490b33eeacd9f1e0efeacd8 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Thu, 13 Mar 2008 18:36:18 +0000 Subject: [PATCH] "exceptions d'autorisation : permettre a un plugin qui veut realiser une action normalement interdite a l'utilisateur connecte d'accorder temporairement (sur le hit ou meme moins) une exception sans pour autant surcharger la fonction. Utile par exemple pour creer un article et le publier avec l'api articles_set sans pour autant bypasser les autorisations dans l'espace prive Une exception se delivre avec la syntaxe autoriser_exception('publierdans','rubrique',3); et peut s'annuler aussitot l'action faite avec autoriser_exception('publierdans','rubrique',3,false); " --- ecrire/inc/autoriser.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php index 82b755e0fe..33542bb301 100644 --- a/ecrire/inc/autoriser.php +++ b/ecrire/inc/autoriser.php @@ -74,6 +74,9 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) { if ($type == 'groupes_mot') $type = 'groupemots'; #if ($type == 'syndic_article') $type = 'syndicarticle'; + if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id]) + && 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 @@ -107,6 +110,22 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) { return $a; } +// une globale pour aller au plus vite dans la fonction generique ci dessus +$GLOBALS['autoriser_exception']=array(); +function autoriser_exception($faire,$type,$id,$autoriser=true){ + // une static innaccessible par url pour verifier que la globale est positionnee a bon escient + static $autorisation; + if ($autoriser==='verifier') + return isset($autorisation[$faire][$type][$id]); + if ($autoriser===true) + $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true; + if ($autoriser===false) { + unset($GLOBALS['autoriser_exception'][$faire][$type][$id]); + unset($autorisation[$faire][$type][$id]); + } + return false; +} + // Autorisation par defaut : les admins complets OK, les autres non // http://doc.spip.org/@autoriser_defaut_dist function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) { -- GitLab