Mise en route du suivi.
[aidenligne_francais_universite.git] / ecrire / inc / autoriser.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
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 \***************************************************************************/
12
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14
15
16 define ('_DEBUG_AUTORISER', false);
17
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);
25 }
26 }
27
28
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)
38 //
39 // Seul le premier argument est obligatoire
40 //
41 // http://doc.spip.org/@autoriser_dist
42 function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
43 static $restreint = array();
44
45 // Qui ? auteur_session ?
46 if ($qui === NULL)
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);
51 }
52
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
56 if (is_array($qui)
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']);
62 }
63 $qui['restreint'] = $restreint[$qui['id_auteur']];
64 }
65 if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ($qui[nom]) ?");
66
67 // Chercher une fonction d'autorisation explicite
68 if (
69 // 1. Sous la forme "autoriser_type_faire"
70 (
71 $type
72 AND $f = 'autoriser_'.$type.'_'.$faire
73 AND (function_exists($f) OR function_exists($f.='_dist'))
74 )
75
76 // 2. Sous la forme "autoriser_type"
77 // ne pas tester si $type est vide
78 OR (
79 $type
80 AND $f = 'autoriser_'.$type
81 AND (function_exists($f) OR function_exists($f.='_dist'))
82 )
83
84 // 3. Sous la forme "autoriser_faire"
85 OR (
86 $f = 'autoriser_'.$faire
87 AND (function_exists($f) OR function_exists($f.='_dist'))
88 )
89
90 // 4. Sinon autorisation generique
91 OR (
92 $f = 'autoriser_defaut'
93 AND (function_exists($f) OR function_exists($f.='_dist'))
94 )
95
96 )
97 $a = $f($faire,$type,intval($id),$qui,$opt);
98
99 if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet'));
100
101 return $a;
102 }
103
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) {
107 return
108 $qui['statut'] == '0minirezo'
109 AND !$qui['restreint'];
110 }
111
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) {
115 return
116 ($qui['statut'] == '0minirezo')
117 AND (!$qui['restreint']
118 ? true
119 : in_array($id, $qui['restreint'])
120 );
121 }
122
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) {
126 return
127 ($id OR ($qui['statut'] == '0minirezo' AND !$qui['restreint']))
128 AND autoriser('voir','rubrique',$id)
129 AND autoriser('publierdans','rubrique',$id);
130 }
131
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) {
135 return
136 $id
137 AND autoriser('voir','rubrique',$id);
138 }
139
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) {
143 $s = spip_query(
144 "SELECT id_parent FROM spip_rubriques WHERE id_rubrique="._q($id));
145 $r = spip_fetch_array($s);
146 return
147 $id
148 AND ($r['id_parent']==0)
149 AND ($GLOBALS['meta']["activer_breves"]!="non")
150 AND autoriser('voir','rubrique',$id);
151 }
152
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) {
156 return
157 $id
158 AND autoriser('voir','rubrique',$id)
159 AND $GLOBALS['meta']['activer_sites'] != 'non'
160 AND (
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) );
164 }
165
166
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) {
171 return
172 autoriser('publierdans', 'rubrique', $id, $qui, $opt);
173 }
174
175 // http://doc.spip.org/@autoriser_joindredocument_dist
176 function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
177 return
178 (!isset($GLOBALS['meta']["documents_$type"]) OR $GLOBALS['meta']["documents_$type"]!='non')
179 AND autoriser('modifier',$type, $id, $qui, $opt);
180 }
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) {
186 $s = spip_query(
187 "SELECT id_rubrique,statut FROM spip_breves WHERE id_breve="._q($id));
188 $r = spip_fetch_array($s);
189 return
190 ($r['statut'] == 'publie')
191 ? autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
192 : in_array($qui['statut'], array('0minirezo', '1comite'));
193 }
194
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) {
200 $s = spip_query(
201 "SELECT id_rubrique,statut FROM spip_articles WHERE id_article="._q($id));
202 $r = spip_fetch_array($s);
203 include_spip('inc/auth');
204 return
205 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
206 OR (
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']))
211 );
212 }
213 // Autoriser a modifir un site $id_syndic
214 function autoriser_site_modifier_dist($faire, $type, $id, $qui, $opt) {
215 $s = spip_query(
216 "SELECT id_rubrique,statut FROM spip_syndic WHERE id_syndic="._q($id));
217 $r = spip_fetch_array($s);
218 return
219 $r
220 AND $GLOBALS['meta']['activer_sites'] != 'non'
221 AND (
222 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
223 OR (
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'))
227 )
228 );
229 }
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);
233 }
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) {
237 return
238 $qui['statut'] == '0minirezo'
239 AND !$qui['restreint'];
240 }
241
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) {
245 return
246 $qui['statut'] == '0minirezo'
247 AND !$qui['restreint'];
248 }
249
250 // Lire les stats ?
251 // = tous les admins
252 // http://doc.spip.org/@autoriser_voirstats_dist
253 function autoriser_voirstats_dist($faire, $type, $id, $qui, $opt) {
254 return
255 $qui['statut'] == '0minirezo';
256 }
257
258
259 // Voir un objet
260 // http://doc.spip.org/@autoriser_voir_dist
261 function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
262 if (
263 ($qui['statut'] == '0minirezo')
264 OR ($type != 'article')
265 )
266 return true;
267
268 // un article 'prepa' ou 'poubelle' dont on n'est pas auteur : interdit
269 $s = spip_query(
270 "SELECT statut FROM spip_articles WHERE id_article="._q($id));
271 $r = spip_fetch_array($s);
272 return
273 in_array($r['statut'], array('prop', 'publie'))
274 OR (
275 include_spip('inc/auth')
276 AND spip_num_rows(auteurs_article($id, "id_auteur=".$qui['id_auteur']))
277 );
278 }
279
280 // Voir les revisions ?
281 // = voir l'objet
282 // http://doc.spip.org/@autoriser_voirrevisions_dist
283 function autoriser_voirrevisions_dist($faire, $type, $id, $qui, $opt) {
284 return
285 autoriser('voir', $type, $id, $qui, $opt);
286 }
287
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) {
293 return
294 autoriser('modifier', $type, $id, $qui, $opt);
295 }
296
297 // Modifier un forum ?
298 // = jamais !
299 // http://doc.spip.org/@autoriser_forum_modifier_dist
300 function autoriser_forum_modifier_dist($faire, $type, $id, $qui, $opt) {
301 return
302 false;
303 }
304
305 // Modifier une signature ?
306 // = jamais !
307 // http://doc.spip.org/@autoriser_signature_modifier_dist
308 function autoriser_signature_modifier_dist($faire, $type, $id, $qui, $opt) {
309 return
310 false;
311 }
312
313
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) {
319 return
320 autoriser('modifier', $type, $id, $qui, $opt);
321 }
322
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) {
329 return
330 (defined('_ID_WEBMESTRES') AND in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES)) AND $qui['statut'] == '0minirezo' AND !$qui['restreint'])
331 OR false;
332 }
333
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) {
338
339 // Ni admin ni redacteur => non
340 if (!in_array($qui['statut'], array('0minirezo', '1comite')))
341 return false;
342
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'])
347 return false;
348 else if ($id == $qui['id_auteur'])
349 return true;
350 else
351 return false;
352 }
353
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']) {
359 return false;
360 } else {
361 if ($id == $qui['id_auteur']) {
362 if ($opt['statut'])
363 return false;
364 else
365 return true;
366 }
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')
371 return true;
372 else
373 return false;
374 }
375 // id = 0 => creation
376 else
377 return true;
378 }
379 }
380
381 // Un admin complet fait ce qu'elle veut
382 return
383 true;
384 }
385
386 ?>