[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / inc / autoriser.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
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 include_spip('base/abstract_sql');
16
17 # faut-il tracer les autorisations dans tmp/spip.log ?
18 define ('_DEBUG_AUTORISER', false);
19
20 // Constantes surchargeables, cf. plugin autorite
21 // false pour ignorer la notion d'admin restreint # todo: une option a activer
22 define('_ADMINS_RESTREINTS', true);
23 // statut par defaut a la creation
24 define('_STATUT_AUTEUR_CREATION', '1comite');
25 // statuts associables a des rubriques (separes par des virgules)
26 define('_STATUT_AUTEUR_RUBRIQUE', _ADMINS_RESTREINTS ? '0minirezo' : '');
27
28
29 // mes_fonctions peut aussi declarer des autorisations, donc il faut donc le charger
30 if ($f = find_in_path('mes_fonctions.php')) {
31 global $dossier_squelettes;
32 include_once(_ROOT_CWD . $f);
33 }
34
35
36 // surcharge possible de autoriser(), sinon autoriser_dist()
37 if (!function_exists('autoriser')) {
38 // http://doc.spip.org/@autoriser
39 function autoriser() {
40 // Charger les fonctions d'autorisation supplementaires
41 static $pipe;
42 if (!isset($pipe)) { $pipe = 1; pipeline('autoriser'); }
43
44 $args = func_get_args();
45 return call_user_func_array('autoriser_dist', $args);
46 }
47 }
48
49
50 // API pour une fonction generique d'autorisation :
51 // $qui est : vide (on prend alors visiteur_session)
52 // un id_auteur (on regarde dans la base)
53 // un tableau auteur complet, y compris [restreint]
54 // $faire est une action ('modifier', 'publier'...)
55 // $type est un type d'objet ou nom de table ('article')
56 // $id est l'id de l'objet sur lequel on veut agir
57 // $opt (inutilise pour le moment) = options sous forme de tableau associatif
58 // (par exemple pour preciser si l'autorisation concerne tel ou tel champ)
59 //
60 // Seul le premier argument est obligatoire
61 //
62 // http://doc.spip.org/@autoriser_dist
63 function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
64
65 // Qui ? visiteur_session ?
66 // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge
67 if ($qui === NULL OR $qui==='')
68 $qui = $GLOBALS['visiteur_session'] ? $GLOBALS['visiteur_session'] : array('statut' => '', 'id_auteur' =>0, 'webmestre' => 'non');
69 elseif (is_numeric($qui)) {
70 $qui = sql_fetsel("*", "spip_auteurs", "id_auteur=".$qui);
71 }
72
73 // Admins restreints, on construit ici (pas generique mais...)
74 // le tableau de toutes leurs rubriques (y compris les sous-rubriques)
75 if (_ADMINS_RESTREINTS AND is_array($qui))
76 $qui['restreint'] = liste_rubriques_auteur($qui['id_auteur']);
77
78 if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ($qui[nom]) ?");
79
80 // Aliases pour les types pas generiques (a etendre et ameliorer)
81 if ($type == 'groupes_mot') $type = 'groupemots';
82 #if ($type == 'syndic_article') $type = 'syndicarticle';
83
84 // Si une exception a ete decretee plus haut dans le code, l'appliquer
85 if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id])
86 AND autoriser_exception($faire,$type,$id,'verifier'))
87 return true;
88
89 // Chercher une fonction d'autorisation
90 // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist],
91 // autoriser_faire[_dist], autoriser_defaut[_dist]
92 $fonctions = $type
93 ? array (
94 'autoriser_'.$type.'_'.$faire,
95 'autoriser_'.$type.'_'.$faire.'_dist',
96 'autoriser_'.$type,
97 'autoriser_'.$type.'_dist',
98 'autoriser_'.$faire,
99 'autoriser_'.$faire.'_dist',
100 'autoriser_defaut',
101 'autoriser_defaut_dist'
102 )
103 : array (
104 'autoriser_'.$faire,
105 'autoriser_'.$faire.'_dist',
106 'autoriser_defaut',
107 'autoriser_defaut_dist'
108 );
109
110 foreach ($fonctions as $f) {
111 if (function_exists($f)) {
112 $a = $f($faire,$type,$id,$qui,$opt);
113 break;
114 }
115 }
116
117 if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet'));
118
119 return $a;
120 }
121
122 // une globale pour aller au plus vite dans la fonction generique ci dessus
123 $GLOBALS['autoriser_exception']=array();
124 // http://doc.spip.org/@autoriser_exception
125 function autoriser_exception($faire,$type,$id,$autoriser=true){
126 // une static innaccessible par url pour verifier que la globale est positionnee a bon escient
127 static $autorisation;
128 if ($autoriser==='verifier')
129 return isset($autorisation[$faire][$type][$id]);
130 if ($autoriser===true)
131 $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true;
132 if ($autoriser===false) {
133 unset($GLOBALS['autoriser_exception'][$faire][$type][$id]);
134 unset($autorisation[$faire][$type][$id]);
135 }
136 return false;
137 }
138
139 // Autorisation par defaut : les admins complets OK, les autres non
140 // http://doc.spip.org/@autoriser_defaut_dist
141 function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) {
142 return
143 $qui['statut'] == '0minirezo'
144 AND !$qui['restreint'];
145 }
146
147 // A-t-on acces a l'espace prive ?
148 // http://doc.spip.org/@autoriser_ecrire_dist
149 function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) {
150 return in_array($qui['statut'], array('0minirezo', '1comite'));
151 }
152
153 // http://doc.spip.org/@autoriser_previsualiser_dist
154 function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) {
155
156 // Le visiteur a-t-il un statut prevu par la config ?
157 if (strpos($GLOBALS['meta']['preview'], ",". $qui['statut'] .",")
158 !==false)
159 return true;
160
161 // Sinon, on regarde s'il a un jeton (var_token) et on lui pose
162 // le cas echeant une session contenant l'autorisation
163 // de l'utilisateur ayant produit le jeton
164 if ($token = _request('var_previewtoken')) {
165 include_spip('inc/session');
166 session_set('previewtoken', $token);
167 }
168
169 // A-t-on un token valable ?
170 if (is_array($GLOBALS['visiteur_session'])
171 AND $token = session_get('previewtoken')
172 AND preg_match('/^(\d+)\*(.*)$/', $token, $r)
173 AND $action = 'previsualiser'
174 AND (include_spip('inc/securiser_action'))
175 AND (
176 $r[2] == _action_auteur($action, $r[1], null, 'alea_ephemere')
177 OR $r[2] == _action_auteur($action, $r[1], null, 'alea_ephemere_ancien')
178 )) {
179 return true;
180 }
181
182 return false;
183 }
184
185 function autoriser_dater_dist($faire, $type, $id, $qui, $opt) {
186 if (!isset($opt['statut'])){
187 $table = table_objet($type);
188 $trouver_table = charger_fonction('trouver_table','base');
189 $desc = $trouver_table($table);
190 if (!$desc)
191 return false;
192 if (isset($desc['field']['statut'])){
193 $statut = sql_getfetsel("statut", $desc['table'], id_table_objet($type)."=".intval($id));
194 }
195 else
196 $statut = 'publie'; // pas de statut => publie
197 }
198 else
199 $statut = $opt['statut'];
200
201 if ($statut == 'publie'
202 OR ($statut == 'prop' AND $type=='article' AND $GLOBALS['meta']["post_dates"] == "non"))
203 return autoriser('modifier', $type, $id);
204 return false;
205 }
206 // Autoriser a publier dans la rubrique $id
207 // http://doc.spip.org/@autoriser_rubrique_publierdans_dist
208 function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) {
209 return
210 ($qui['statut'] == '0minirezo')
211 AND (
212 !$qui['restreint'] OR !$id
213 OR in_array($id, $qui['restreint'])
214 );
215 }
216
217 // Autoriser a creer une rubrique dans la rubrique $id
218 // http://doc.spip.org/@autoriser_rubrique_creerrubriquedans_dist
219 function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $opt) {
220 return
221 ($id OR ($qui['statut'] == '0minirezo' AND !$qui['restreint']))
222 AND autoriser('voir','rubrique',$id)
223 AND autoriser('publierdans','rubrique',$id);
224 }
225
226 // Autoriser a creer un article dans la rubrique $id
227 // http://doc.spip.org/@autoriser_rubrique_creerarticledans_dist
228 function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) {
229 return
230 $id
231 AND autoriser('voir','rubrique',$id);
232 }
233
234 // Autoriser a creer une breve dans la rubrique $id
235 // http://doc.spip.org/@autoriser_rubrique_creerbrevedans_dist
236 function autoriser_rubrique_creerbrevedans_dist($faire, $type, $id, $qui, $opt) {
237 $r = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=".sql_quote($id));
238 return
239 $id
240 AND ($r['id_parent']==0)
241 AND ($GLOBALS['meta']["activer_breves"]!="non")
242 AND autoriser('voir','rubrique',$id);
243 }
244
245 // Autoriser a creer un site dans la rubrique $id
246 // http://doc.spip.org/@autoriser_rubrique_creersitedans_dist
247 function autoriser_rubrique_creersitedans_dist($faire, $type, $id, $qui, $opt) {
248 return
249 $id
250 AND autoriser('voir','rubrique',$id)
251 AND $GLOBALS['meta']['activer_sites'] != 'non'
252 AND (
253 $qui['statut']=='0minirezo'
254 OR ($GLOBALS['meta']["proposer_sites"] >=
255 ($qui['statut']=='1comite' ? 1 : 2)));
256 }
257
258 // Autoriser a modifier un site
259 // http://doc.spip.org/@autoriser_site_modifier_dist
260 function autoriser_site_modifier_dist($faire, $type, $id, $qui, $opt) {
261 if ($qui['statut'] == '0minirezo' AND !$qui['restreint'])
262 return true;
263
264 $t = sql_fetsel("id_rubrique,statut", "spip_syndic", "id_syndic=".sql_quote($id));
265 return ($t
266 AND autoriser('voir','rubrique',$t['id_rubrique'])
267 AND ($t['statut'] == 'prop'
268 OR autoriser('modifier', 'rubrique', $t['id_rubrique'])
269 )
270 );
271 }
272 // Autoriser a voir un site $id_syndic
273 // http://doc.spip.org/@autoriser_site_voir_dist
274 function autoriser_site_voir_dist($faire, $type, $id, $qui, $opt) {
275 return autoriser_site_modifier_dist($faire, $type, $id, $qui, $opt);
276 }
277
278 // Autoriser a modifier la rubrique $id
279 // = publierdans rubrique $id
280 // http://doc.spip.org/@autoriser_rubrique_modifier_dist
281 function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
282 return
283 autoriser('publierdans', 'rubrique', $id, $qui, $opt);
284 }
285
286 // On ne peut joindre un document qu'a un article qu'on a le droit d'editer
287 // mais il faut prevoir le cas d'une *creation* par un redacteur, qui correspond
288 // au hack id_article = 0-id_auteur
289 // http://doc.spip.org/@autoriser_joindredocument_dist
290 function autoriser_joindredocument_dist($faire, $type, $id, $qui, $opt){
291 return
292 autoriser('modifier', $type, $id, $qui, $opt)
293 OR (
294 $type == 'article'
295 AND $id<0
296 AND abs($id) == $qui['id_auteur']
297 AND autoriser('ecrire', $type, $id, $qui, $opt)
298 );
299 }
300
301 // On ne peut modifier un document que s'il est lie a un objet qu'on a le droit
302 // d'editer *et* qu'il n'est pas lie a un objet qu'on n'a pas le droit d'editer
303 // http://doc.spip.org/@autoriser_document_modifier_dist
304 function autoriser_document_modifier_dist($faire, $type, $id, $qui, $opt){
305 static $m = array();
306
307 if ($qui['statut'] == '0minirezo'
308 AND !$qui['restreint'])
309 return true;
310
311 if (!isset($m[$id])) {
312 $vu = false;
313 $interdit = false;
314
315 $s = sql_select("id_objet,objet", "spip_documents_liens", "id_document=".sql_quote($id));
316 while ($t = sql_fetch($s)) {
317 if (autoriser('modifier', $t['objet'], $t['id_objet'], $qui, $opt)) {
318 $vu = true;
319 }
320 else {
321 $interdit = true;
322 break;
323 }
324 }
325 $m[$id] = ($vu && !$interdit);
326 }
327
328 return $m[$id];
329 }
330
331
332 // On ne peut supprimer un document que s'il n'est lie a aucun objet
333 // c'est autorise pour tout auteur ayant acces a ecrire
334 // http://doc.spip.org/@autoriser_document_modifier_dist
335 function autoriser_document_supprimer_dist($faire, $type, $id, $qui, $opt){
336 if (!intval($id)
337 OR !$qui['id_auteur']
338 OR !autoriser('ecrire','','',$qui))
339 return false;
340 if (sql_countsel('spip_documents_liens', 'id_document='.intval($id)))
341 return false;
342
343 return true;
344 }
345
346 // Autoriser a modifier la breve $id
347 // = admins & redac si la breve n'est pas publiee
348 // = admins de rubrique parente si publiee
349 // http://doc.spip.org/@autoriser_breve_modifier_dist
350 function autoriser_breve_modifier_dist($faire, $type, $id, $qui, $opt) {
351 $r = sql_fetsel("id_rubrique,statut", "spip_breves", "id_breve=".sql_quote($id));
352 return
353 ($r['statut'] == 'publie')
354 ? autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
355 : in_array($qui['statut'], array('0minirezo', '1comite'));
356 }
357
358 // Autoriser a modifier l'article $id
359 // = publierdans rubrique parente
360 // = ou statut 'prop,prepa' et $qui est auteur
361 // http://doc.spip.org/@autoriser_article_modifier_dist
362 function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) {
363 $r = sql_fetsel("id_rubrique,statut", "spip_articles", "id_article=".sql_quote($id));
364
365 include_spip('inc/auth'); // pour auteurs_article si espace public
366
367 return
368 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
369 OR (
370 in_array($qui['statut'], array('0minirezo', '1comite'))
371 AND in_array($r['statut'], array('prop','prepa', 'poubelle'))
372 AND auteurs_article($id, "id_auteur=".$qui['id_auteur'])
373 );
374 }
375
376
377 // Autoriser a creer un groupe de mots
378 // http://doc.spip.org/@autoriser_groupemots_creer_dist
379 function autoriser_groupemots_creer_dist($faire, $type, $id, $qui, $opt) {
380 return
381 $qui['statut'] == '0minirezo'
382 AND !$qui['restreint'];
383 }
384
385 function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) {
386 return
387 $qui['statut'] == '0minirezo'
388 AND !$qui['restreint'];
389 }
390
391 // Autoriser a modifier un groupe de mots $id
392 // y compris en ajoutant/modifiant les mots lui appartenant
393 // http://doc.spip.org/@autoriser_groupemots_modifier_dist
394 function autoriser_groupemots_modifier_dist($faire, $type, $id, $qui, $opt) {
395 return
396 $qui['statut'] == '0minirezo'
397 AND !$qui['restreint'];
398 }
399
400 // Autoriser a modifier un mot $id ; note : si on passe l'id_groupe
401 // dans les options, on gagne du CPU (c'est ce que fait l'espace prive)
402 // http://doc.spip.org/@autoriser_mot_modifier_dist
403 function autoriser_mot_modifier_dist($faire, $type, $id, $qui, $opt) {
404 return
405 isset($opt['id_groupe'])
406 ? autoriser('modifier', 'groupemots', $opt['id_groupe'], $qui, $opt)
407 : (
408 $t = sql_getfetsel("id_groupe", "spip_mots", "id_mot=".sql_quote($id))
409 AND autoriser('modifier', 'groupemots', $t, $qui, $opt)
410 );
411 }
412
413 // Lire les stats ?
414 // = tous les admins
415 // http://doc.spip.org/@autoriser_voirstats_dist
416 function autoriser_voirstats_dist($faire, $type, $id, $qui, $opt) {
417 return
418 $qui['statut'] == '0minirezo';
419 }
420
421
422 // Voir un objet
423 // http://doc.spip.org/@autoriser_voir_dist
424 function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
425 if ($type == 'document')
426 return autoriser_document_voir_dist($faire, $type, $id, $qui, $opt);
427 if ($qui['statut'] == '0minirezo') return true;
428 if ($type == 'auteur') return false;
429 if ($type == 'groupemots') {
430 $acces = sql_fetsel("comite,forum", "spip_groupes_mots", "id_groupe=".intval($id));
431 if ($qui['statut']=='1comite' AND ($acces['comite'] == 'oui' OR $acces['forum'] == 'oui'))
432 return true;
433 if ($qui['statut']=='6forum' AND $acces['forum'] == 'oui')
434 return true;
435 return false;
436 }
437 if ($type != 'article') return true;
438 if (!$id) return false;
439
440 // un article 'prepa' ou 'poubelle' dont on n'est pas auteur : interdit
441 $r = sql_getfetsel("statut", "spip_articles", "id_article=".sql_quote($id));
442 include_spip('inc/auth'); // pour auteurs_article si espace public
443 return
444 in_array($r, array('prop', 'publie'))
445 OR auteurs_article($id, "id_auteur=".$qui['id_auteur']);
446 }
447
448 // Voir les revisions ?
449 // = voir l'objet
450 // http://doc.spip.org/@autoriser_voirrevisions_dist
451 function autoriser_voirrevisions_dist($faire, $type, $id, $qui, $opt) {
452 return
453 autoriser('voir', $type, $id, $qui, $opt);
454 }
455
456 // Moderer le forum ?
457 // = modifier l'objet correspondant (si forum attache a un objet)
458 // = droits par defaut sinon (admin complet pour moderation complete)
459 // http://doc.spip.org/@autoriser_modererforum_dist
460 function autoriser_modererforum_dist($faire, $type, $id, $qui, $opt) {
461 return
462 autoriser('modifier', $type, $id, $qui, $opt);
463 }
464
465 // Modifier un forum ?
466 // = jamais !
467 // http://doc.spip.org/@autoriser_forum_modifier_dist
468 function autoriser_forum_modifier_dist($faire, $type, $id, $qui, $opt) {
469 return
470 false;
471 }
472
473 // Modifier une signature ?
474 // = jamais !
475 // http://doc.spip.org/@autoriser_signature_modifier_dist
476 function autoriser_signature_modifier_dist($faire, $type, $id, $qui, $opt) {
477 return
478 false;
479 }
480
481 // Moderer la petition ?
482 // = modifier l'article correspondant
483 // = droits par defaut sinon (admin complet pour moderation de tout)
484 // http://doc.spip.org/@autoriser_modererpetition_dist
485 function autoriser_modererpetition_dist($faire, $type, $id, $qui, $opt) {
486 return
487 autoriser('modifier', $type, $id, $qui, $opt);
488 }
489
490 // Est-on webmestre ? Signifie qu'on n'a meme pas besoin de passer par ftp
491 // pour modifier les fichiers, cf. notamment inc/admin
492 // = rien ni personne sauf definition de
493 // a l'avenir peut-etre autoriser "admin numero 1" ou une interface de selection
494 // http://doc.spip.org/@autoriser_webmestre_dist
495 function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) {
496 return
497 (defined('_ID_WEBMESTRES')?
498 in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES))
499 :$qui['webmestre']=='oui')
500 AND $qui['statut'] == '0minirezo'
501 AND !$qui['restreint']
502 ;
503 }
504
505 // Configurer le site => idem autorisation par defaut
506 // http://doc.spip.org/@autoriser_configurer_dist
507 function autoriser_configurer_dist($faire, $type, $id, $qui, $opt) {
508 return
509 $qui['statut'] == '0minirezo'
510 AND !$qui['restreint']
511 ;
512 }
513
514 // Effectuer un backup ?
515 // admins y compris restreints
516 // http://doc.spip.org/@autoriser_sauvegarder_dist
517 function autoriser_sauvegarder_dist($faire, $type, $id, $qui, $opt) {
518 return
519 $qui['statut'] == '0minirezo'
520 ;
521 }
522
523 // Effacer la base de donnees ?
524 // webmestres seulement
525 // http://doc.spip.org/@autoriser_detruire_dist
526 function autoriser_detruire_dist($faire, $type, $id, $qui, $opt) {
527 return
528 autoriser('webmestre', null, null, $qui, $opt);
529 }
530
531 // Consulter le forum des admins ?
532 // admins y compris restreints
533 // http://doc.spip.org/@autoriser_forum_admin_dist
534 function autoriser_forum_admin_dist($faire, $type, $id, $qui, $opt) {
535 return
536 $qui['statut'] == '0minirezo'
537 ;
538 }
539
540 //
541 // http://doc.spip.org/@autoriser_auteur_previsualiser_dist
542 function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) {
543 // les admins peuvent "previsualiser" une page auteur
544 if ($qui['statut'] == '0minirezo'
545 AND !$qui['restreint']) return true;
546 // "Voir en ligne" si l'auteur a un article publie
547 $n = sql_fetsel('A.id_article', 'spip_auteurs_articles AS L LEFT JOIN spip_articles AS A ON L.id_article=A.id_article', "A.statut='publie' AND L.id_auteur=".sql_quote($id));
548 return $n ? true : false;
549 }
550
551 // Modifier un auteur ?
552 // Attention tout depend de ce qu'on veut modifier
553 // http://doc.spip.org/@autoriser_auteur_modifier_dist
554 function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
555
556 // Ni admin ni redacteur => non
557 if (!in_array($qui['statut'], array('0minirezo', '1comite')))
558 return false;
559
560 // Un redacteur peut modifier ses propres donnees mais ni son login/email
561 // ni son statut (qui sont le cas echeant passes comme option)
562 if ($qui['statut'] == '1comite') {
563 if ($opt['webmestre'])
564 return false;
565 elseif ($opt['statut'] OR $opt['restreintes'] OR $opt['email'])
566 return false;
567 elseif ($id == $qui['id_auteur'])
568 return true;
569 else
570 return false;
571 }
572
573 // Un admin restreint peut modifier/creer un auteur non-admin mais il
574 // n'a le droit ni de le promouvoir admin, ni de changer les rubriques
575 if ($qui['restreint']) {
576 if ($opt['webmestre'])
577 return false;
578 elseif ($opt['statut'] == '0minirezo' OR $opt['restreintes'])
579 return false;
580 else {
581 if ($id == $qui['id_auteur']) {
582 if ($opt['statut'])
583 return false;
584 else
585 return true;
586 }
587 else if ($id_auteur = intval($id)) {
588 $t = sql_fetsel("statut", "spip_auteurs", "id_auteur=$id_auteur");
589 if ($t AND $t['statut'] != '0minirezo')
590 return true;
591 else
592 return false;
593 }
594 // id = 0 => creation
595 else
596 return true;
597 }
598 }
599
600 // Un admin complet fait ce qu'elle veut
601 // sauf se degrader
602 if ($id == $qui['id_auteur'] && $opt['statut'])
603 return false;
604 // et toucher au statut webmestre si il ne l'est pas lui meme
605 // ou si les webmestres sont fixes par constante (securite)
606 elseif ($opt['webmestre'] AND (defined('_ID_WEBMESTRES') OR !autoriser('webmestre')))
607 return false;
608 // et modifier un webmestre si il ne l'est pas lui meme
609 elseif (intval($id) AND autoriser('webmestre','',0,$id) AND !autoriser('webmestre'))
610 return false;
611 else
612 return true;
613 }
614
615
616 //
617 // Peut-on faire de l'upload ftp ?
618 // par defaut, les administrateurs
619 //
620 // http://doc.spip.org/@autoriser_chargerftp_dist
621 function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) {
622 return $qui['statut'] == '0minirezo';
623 }
624
625
626 //
627 // Peut-on voir un document dans _DIR_IMG ?
628 // Tout le monde (y compris les visiteurs non enregistres), puisque par
629 // defaut ce repertoire n'est pas protege ; si une extension comme
630 // acces_restreint a positionne creer_htaccess, on regarde
631 // si le document est lie a un element publie
632 // (TODO: a revoir car c'est dommage de sortir de l'API true/false)
633 //
634 // http://doc.spip.org/@autoriser_document_voir_dist
635 function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
636
637 if (!isset($GLOBALS['meta']["creer_htaccess"])
638 OR $GLOBALS['meta']["creer_htaccess"] != 'oui')
639 return true;
640
641 if ((!is_numeric($id)) OR $id < 0) return false;
642
643 if (in_array($qui['statut'], array('0minirezo', '1comite')))
644 return 'htaccess';
645
646 if ($liens = sql_allfetsel('objet,id_objet', 'spip_documents_liens', 'id_document='.intval($id)))
647 foreach ($liens as $l) {
648 $table_sql = table_objet_sql($l['objet']);
649 $id_table = id_table_objet($l['objet']);
650 if (sql_countsel($table_sql, "$id_table = ". intval($l['id_objet'])
651 . (in_array($l['objet'], array('article', 'rubrique', 'breve'))
652 ? " AND statut = 'publie'"
653 : '')
654 ) > 0)
655 return 'htaccess';
656 }
657 return false;
658 }
659
660 // Qui peut activer le debugueur ?
661 // http://doc.spip.org/@autoriser_debug_dist
662 function autoriser_debug_dist($faire, $type, $id, $qui, $opt) {
663 return $qui['statut'] == '0minirezo';
664 }
665
666 // Renvoie la liste des rubriques liees a cet auteur, independamment de son
667 // statut (pour les admins restreints, il faut donc aussi verifier statut)
668 // Memorise le resultat dans un tableau statique indexe par les id_auteur.
669 // On peut reinitialiser un element en passant un 2e argument non vide
670 // http://doc.spip.org/@liste_rubriques_auteur
671 function liste_rubriques_auteur($id_auteur, $raz=false) {
672 static $restreint = array();
673
674 if (!$id_auteur = intval($id_auteur)) return array();
675 if ($raz) unset($restreint[$id_auteur]);
676 elseif (isset($restreint[$id_auteur])) return $restreint[$id_auteur];
677
678 $where = "id_auteur=$id_auteur AND id_rubrique!=0";
679 $table = "spip_auteurs_rubriques";
680 // Recurrence sur les sous-rubriques
681 $rubriques = array();
682 while (true) {
683 $q = sql_select("id_rubrique", $table, $where);
684 $r = array();
685 while ($row = sql_fetch($q)) {
686 $id_rubrique = $row['id_rubrique'];
687 $r[]= $rubriques[$id_rubrique] = $id_rubrique;
688 }
689
690 // Fin de la recurrence : $rubriques est complet
691 if (!$r) break;
692 $table = 'spip_rubriques';
693 $where = sql_in('id_parent', $r) . ' AND ' .
694 sql_in('id_rubrique', $r, 'NOT');
695 }
696
697 // Affecter l'auteur session le cas echeant
698 if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur)
699 $GLOBALS['visiteur_session']['restreint'] = $rubriques;
700
701
702 return $restreint[$id_auteur] = $rubriques;
703 }
704
705 // Autoriser a modifier l'URL d'un objet (cf. action=redirect)
706 // http://doc.spip.org/@autoriser_modifierurl_dist
707 function autoriser_modifierurl_dist($faire, $quoi, $id, $qui, $opt) {
708 return autoriser('modifier', $quoi, $id, $qui, $opt);
709 }
710
711 // http://doc.spip.org/@autoriser_rubrique_editermots_dist
712 function autoriser_rubrique_editermots_dist($faire,$quoi,$id,$qui,$opts){
713 // on recupere les champs du groupe s'ils ne sont pas passes en opt
714 if (!isset($opts['groupe_champs'])){
715 if (!$id_groupe = $opts['id_groupe'])
716 return false;
717 include_spip('base/abstract_sql');
718 $opts['groupe_champs'] = sql_fetsel("*", "spip_groupes_mots", "id_groupe=".intval($id_groupe));
719 }
720
721 return
722 ($opts['groupe_champs'][substr($qui['statut'],1)] == 'oui')
723 AND
724 // on verifie que l'objet demande est bien dans les tables liees
725 in_array(
726 table_objet($quoi),
727 explode(',', $opts['groupe_champs']['tables_liees'])
728 );
729 }
730 // http://doc.spip.org/@autoriser_article_editermots_dist
731 function autoriser_article_editermots_dist($faire,$quoi,$id,$qui,$opts){
732 return autoriser_rubrique_editermots_dist($faire,'article',0,$qui,$opts);
733 }
734 // http://doc.spip.org/@autoriser_breve_editermots_dist
735 function autoriser_breve_editermots_dist($faire,$quoi,$id,$qui,$opts){
736 return autoriser_rubrique_editermots_dist($faire,'breve',0,$qui,$opts);
737 }
738 // http://doc.spip.org/@autoriser_syndic_editermots_dist
739 function autoriser_syndic_editermots_dist($faire,$quoi,$id,$qui,$opts){
740 return autoriser_rubrique_editermots_dist($faire,'syndic',0,$qui,$opts);
741 }
742
743 // http://doc.spip.org/@autoriser_rubrique_iconifier_dist
744 function autoriser_rubrique_iconifier_dist($faire,$quoi,$id,$qui,$opts){
745 return autoriser('publierdans', 'rubrique', $id, $qui, $opt);
746 }
747 // http://doc.spip.org/@autoriser_auteur_iconifier_dist
748 function autoriser_auteur_iconifier_dist($faire,$quoi,$id,$qui,$opts){
749 return (($id == $qui['id_auteur']) OR
750 (($qui['statut'] == '0minirezo') AND !$qui['restreint']));
751 }
752 // http://doc.spip.org/@autoriser_mot_iconifier_dist
753 function autoriser_mot_iconifier_dist($faire,$quoi,$id,$qui,$opts){
754 return (($qui['statut'] == '0minirezo') AND !$qui['restreint']);
755 }
756 // http://doc.spip.org/@autoriser_article_iconifier_dist
757 function autoriser_iconifier_dist($faire,$quoi,$id,$qui,$opts){
758 // On reprend le code de l'ancien iconifier pour definir les autorisations pour les autres
759 // objets SPIP. De ce fait meme de nouveaux objets bases sur cet algorithme peuvent continuer
760 // a fonctionner. Cependant il est recommander de leur definir une autorisation specifique
761 $table = table_objet_sql($quoi);
762 $id_objet = id_table_objet($quoi);
763 $row = sql_fetsel("id_rubrique, statut", $table, "$id_objet=$id");
764 $droit = autoriser('publierdans','rubrique',$row['id_rubrique']);
765
766 if (!$droit AND ($row['statut'] == 'prepa' OR $row['statut'] == 'prop' OR $row['statut'] == 'poubelle')) {
767 $jointure = table_jointure('auteur', 'article');
768 if ($droit = sql_fetsel("id_auteur", "spip_$jointure", "id_article=".sql_quote($id) . " AND id_auteur=$connect_id_auteur"))
769 $droit = true;
770 }
771
772 return $droit;
773 }
774
775 // Autorisation des inscriptions libres
776 // a l'aide de la liste globale des statuts (tableau mode => nom du mode)
777
778 // http://doc.spip.org/@tester_config
779 function autoriser_inscrireauteur($faire, $quoi, $id, $qui, $opt){
780
781 switch (array_search($quoi, $GLOBALS['liste_des_statuts'])) {
782
783 case 'info_redacteurs' :
784 return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
785
786 case 'info_visiteurs' :
787 return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' OR $GLOBALS['meta']['forums_publics'] == 'abo');
788
789 default:
790 return false;
791 }
792 }
793
794 // Deux fonctions sans surprise pour permettre les tests
795 // Dire toujours OK
796 // http://doc.spip.org/@autoriser_ok_dist
797 function autoriser_ok_dist($faire, $type, $id, $qui, $opt) { return true; }
798 // Dire toujours niet
799 // http://doc.spip.org/@autoriser_niet_dist
800 function autoriser_niet_dist($faire, $type, $id, $qui, $opt) { return false; }
801
802 ?>