3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
16 define ('_DEBUG_AUTORISER', false
);
18 // surcharge possible de autoriser(), sinon autoriser_dist()
19 // http://doc.spip.org/@autoriser
20 if (!function_exists('autoriser')) {
21 // http://doc.spip.org/@autoriser
22 function autoriser() {
23 $args = func_get_args();
24 return call_user_func_array('autoriser_dist', $args);
29 // API pour une fonction generique d'autorisation :
30 // $qui est : vide (on prend alors auteur_session)
31 // un id_auteur (on regarde dans la base)
32 // un tableau auteur complet, y compris [restreint]
33 // $faire est une action ('modifier', 'publier'...)
34 // $type est un type d'objet ou nom de table ('article')
35 // $id est l'id de l'objet sur lequel on veut agir
36 // $opt (inutilise pour le moment) = options sous forme de tableau associatif
37 // (par exemple pour preciser si l'autorisation concerne tel ou tel champ)
39 // Seul le premier argument est obligatoire
41 // http://doc.spip.org/@autoriser_dist
42 function autoriser_dist($faire, $type='', $id=0, $qui = NULL
, $opt = NULL
) {
43 static $restreint = array();
45 // Qui ? auteur_session ?
47 $qui = $GLOBALS['auteur_session']; // "" si pas connecte
48 elseif (is_int($qui)) {
49 $s = spip_query("SELECT * FROM spip_auteurs WHERE id_auteur=".$qui);
50 $qui = spip_fetch_array($s);
53 // Admins restreints, les verifier ici (pas generique mais...)
54 // Par convention $restreint est un array des rubriques autorisees
55 // (y compris leurs sous-rubriques), ou 0 si admin complet
57 AND $qui['statut'] == '0minirezo'
58 AND !isset($qui['restreint'])) {
59 if (!isset($restreint[$qui['id_auteur']])) {
60 include_spip('inc/auth'); # pour auth_rubrique
61 $restreint[$qui['id_auteur']] = auth_rubrique($qui['id_auteur'], $qui['statut']);
63 $qui['restreint'] = $restreint[$qui['id_auteur']];
65 if (_DEBUG_AUTORISER
) spip_log("autoriser $faire $type $id ($qui[nom]) ?");
67 // Chercher une fonction d'autorisation explicite
69 // 1. Sous la forme "autoriser_type_faire"
72 AND $f = 'autoriser_'.$type.'_'.$faire
73 AND (function_exists($f) OR function_exists($f.='_dist'))
76 // 2. Sous la forme "autoriser_type"
77 // ne pas tester si $type est vide
80 AND $f = 'autoriser_'.$type
81 AND (function_exists($f) OR function_exists($f.='_dist'))
84 // 3. Sous la forme "autoriser_faire"
86 $f = 'autoriser_'.$faire
87 AND (function_exists($f) OR function_exists($f.='_dist'))
90 // 4. Sinon autorisation generique
92 $f = 'autoriser_defaut'
93 AND (function_exists($f) OR function_exists($f.='_dist'))
97 $a = $f($faire,$type,intval($id),$qui,$opt);
99 if (_DEBUG_AUTORISER
) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?
'OK':'niet'));
104 // Autorisation par defaut : les admins complets OK, les autres non
105 // http://doc.spip.org/@autoriser_defaut_dist
106 function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) {
108 $qui['statut'] == '0minirezo'
109 AND !$qui['restreint'];
112 // Autoriser a publier dans la rubrique $id
113 // http://doc.spip.org/@autoriser_rubrique_publierdans_dist
114 function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) {
116 ($qui['statut'] == '0minirezo')
117 AND (!$qui['restreint']
119 : in_array($id, $qui['restreint'])
123 // Autoriser a creer un article dans la rubrique $id
124 // http://doc.spip.org/@autoriser_rubrique_creerrubriquedans_dist
125 function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $opt) {
127 ($id OR ($qui['statut'] == '0minirezo' AND !$qui['restreint']))
128 AND autoriser('voir','rubrique',$id)
129 AND autoriser('publierdans','rubrique',$id);
132 // Autoriser a creer un article dans la rubrique $id
133 // http://doc.spip.org/@autoriser_rubrique_creerarticledans_dist
134 function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) {
137 AND autoriser('voir','rubrique',$id);
140 // Autoriser a creer une breve dans la rubrique $id
141 // http://doc.spip.org/@autoriser_rubrique_creerbrevedans_dist
142 function autoriser_rubrique_creerbrevedans_dist($faire, $type, $id, $qui, $opt) {
144 "SELECT id_parent FROM spip_rubriques WHERE id_rubrique="._q($id));
145 $r = spip_fetch_array($s);
148 AND ($r['id_parent']==0)
149 AND ($GLOBALS['meta']["activer_breves"]!="non")
150 AND autoriser('voir','rubrique',$id);
153 // Autoriser a creer un site dans la rubrique $id
154 // http://doc.spip.org/@autoriser_rubrique_creersitedans_dist
155 function autoriser_rubrique_creersitedans_dist($faire, $type, $id, $qui, $opt) {
158 AND autoriser('voir','rubrique',$id)
159 AND $GLOBALS['meta']['activer_sites'] != 'non'
161 ($qui['statut']=='0minirezo')
162 OR ($qui['statut']=='1comite' AND $GLOBALS['meta']["proposer_sites"]>=1)
163 OR ($qui['statut']=='6forum' AND $GLOBALS['meta']["proposer_sites"]>=2) );
167 // Autoriser a modifier la rubrique $id
168 // = publierdans rubrique $id
169 // http://doc.spip.org/@autoriser_rubrique_modifier_dist
170 function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
172 autoriser('publierdans', 'rubrique', $id, $qui, $opt);
175 // http://doc.spip.org/@autoriser_joindredocument_dist
176 function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
178 (!isset($GLOBALS['meta']["documents_$type"]) OR $GLOBALS['meta']["documents_$type"]!='non')
179 AND autoriser('modifier',$type, $id, $qui, $opt);
181 // Autoriser a modifier la breve $id
182 // = admins & redac si la breve n'est pas publiee
183 // = admins de rubrique parente si publiee
184 // http://doc.spip.org/@autoriser_breve_modifier_dist
185 function autoriser_breve_modifier_dist($faire, $type, $id, $qui, $opt) {
187 "SELECT id_rubrique,statut FROM spip_breves WHERE id_breve="._q($id));
188 $r = spip_fetch_array($s);
190 ($r['statut'] == 'publie')
191 ?
autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
192 : in_array($qui['statut'], array('0minirezo', '1comite'));
195 // Autoriser a modifier l'article $id
196 // = publierdans rubrique parente
197 // = ou statut 'prop,prepa' et $qui est auteur
198 // http://doc.spip.org/@autoriser_article_modifier_dist
199 function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) {
201 "SELECT id_rubrique,statut FROM spip_articles WHERE id_article="._q($id));
202 $r = spip_fetch_array($s);
203 include_spip('inc/auth');
205 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
207 in_array($qui['statut'], array('0minirezo', '1comite'))
208 AND in_array($r['statut'], array('prop','prepa', 'poubelle'))
209 AND include_spip('inc/auth')
210 AND spip_num_rows(auteurs_article($id, "id_auteur=".$qui['id_auteur']))
213 // Autoriser a modifir un site $id_syndic
214 function autoriser_site_modifier_dist($faire, $type, $id, $qui, $opt) {
216 "SELECT id_rubrique,statut FROM spip_syndic WHERE id_syndic="._q($id));
217 $r = spip_fetch_array($s);
220 AND $GLOBALS['meta']['activer_sites'] != 'non'
222 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
224 ( ($qui['statut']=='0minirezo')
225 OR ($qui['statut']=='1comite' AND $GLOBALS['meta']["proposer_sites"]>=1) )
226 AND in_array($r['statut'], array('prop','prepa', 'poubelle'))
230 // Autoriser a voir un site $id_syndic
231 function autoriser_site_voir_dist($faire, $type, $id, $qui, $opt) {
232 return autoriser_site_modifier_dist($faire, $type, $id, $qui, $opt);
234 // Autoriser a creer un groupe de mots
235 // http://doc.spip.org/@autoriser_groupemots_creer_dist
236 function autoriser_groupemots_creer_dist($faire, $type, $id, $qui, $opt) {
238 $qui['statut'] == '0minirezo'
239 AND !$qui['restreint'];
242 // Autoriser a modifier un groupe de mots $id
243 // http://doc.spip.org/@autoriser_groupemots_modifier_dist
244 function autoriser_groupemots_modifier_dist($faire, $type, $id, $qui, $opt) {
246 $qui['statut'] == '0minirezo'
247 AND !$qui['restreint'];
252 // http://doc.spip.org/@autoriser_voirstats_dist
253 function autoriser_voirstats_dist($faire, $type, $id, $qui, $opt) {
255 $qui['statut'] == '0minirezo';
260 // http://doc.spip.org/@autoriser_voir_dist
261 function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
263 ($qui['statut'] == '0minirezo')
264 OR ($type != 'article')
268 // un article 'prepa' ou 'poubelle' dont on n'est pas auteur : interdit
270 "SELECT statut FROM spip_articles WHERE id_article="._q($id));
271 $r = spip_fetch_array($s);
273 in_array($r['statut'], array('prop', 'publie'))
275 include_spip('inc/auth')
276 AND spip_num_rows(auteurs_article($id, "id_auteur=".$qui['id_auteur']))
280 // Voir les revisions ?
282 // http://doc.spip.org/@autoriser_voirrevisions_dist
283 function autoriser_voirrevisions_dist($faire, $type, $id, $qui, $opt) {
285 autoriser('voir', $type, $id, $qui, $opt);
288 // Moderer le forum ?
289 // = modifier l'objet correspondant (si forum attache a un objet)
290 // = droits par defaut sinon (admin complet pour moderation complete)
291 // http://doc.spip.org/@autoriser_modererforum_dist
292 function autoriser_modererforum_dist($faire, $type, $id, $qui, $opt) {
294 autoriser('modifier', $type, $id, $qui, $opt);
297 // Modifier un forum ?
299 // http://doc.spip.org/@autoriser_forum_modifier_dist
300 function autoriser_forum_modifier_dist($faire, $type, $id, $qui, $opt) {
305 // Modifier une signature ?
307 // http://doc.spip.org/@autoriser_signature_modifier_dist
308 function autoriser_signature_modifier_dist($faire, $type, $id, $qui, $opt) {
314 // Moderer la petition ?
315 // = modifier l'article correspondant
316 // = droits par defaut sinon (admin complet pour moderation de tout)
317 // http://doc.spip.org/@autoriser_modererpetition_dist
318 function autoriser_modererpetition_dist($faire, $type, $id, $qui, $opt) {
320 autoriser('modifier', $type, $id, $qui, $opt);
323 // Est-on webmestre ? Signifie qu'on n'a meme pas besoin de passer par ftp
324 // pour modifier les fichiers, cf. notamment inc/admin
325 // = rien ni personne sauf definition de
326 // a l'avenir peut-etre autoriser "admin numero 1" ou une interface de selection
327 // http://doc.spip.org/@autoriser_webmestre_dist
328 function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) {
330 (defined('_ID_WEBMESTRES') AND in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES
)) AND $qui['statut'] == '0minirezo' AND !$qui['restreint'])
334 // Modifier un auteur ?
335 // Attention tout depend de ce qu'on veut modifier
336 // http://doc.spip.org/@autoriser_auteur_modifier_dist
337 function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
339 // Ni admin ni redacteur => non
340 if (!in_array($qui['statut'], array('0minirezo', '1comite')))
343 // Un redacteur peut modifier ses propres donnees mais ni son login
344 // ni son statut (qui sont le cas echeant passes comme option)
345 if ($qui['statut'] == '1comite') {
346 if ($opt['statut'] OR $opt['restreintes'])
348 else if ($id == $qui['id_auteur'])
354 // Un admin restreint peut modifier/creer un auteur non-admin mais il
355 // n'a le droit ni de le promouvoir admin, ni de changer les rubriques
356 if ($qui['restreint']) {
357 if ($opt['statut'] == '0minirezo'
358 OR $opt['restreintes']) {
361 if ($id == $qui['id_auteur']) {
367 else if ($id_auteur = intval($id)) {
368 $s = spip_query("SELECT statut FROM spip_auteurs WHERE id_auteur=$id_auteur");
369 if ($t = spip_fetch_array($s)
370 AND $t['statut'] != '0minirezo')
375 // id = 0 => creation
381 // Un admin complet fait ce qu'elle veut