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