3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
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 \***************************************************************************/
14 * Gestion de l'API autoriser et fonctions d'autorisations de SPIP
16 * @package SPIP\Autorisations
18 if (!defined('_ECRIRE_INC_VERSION')) return;
20 include_spip('base/abstract_sql');
23 * Tracer les autorisations dans tmp/spip.log pour débug ?
25 defined('_DEBUG_AUTORISER') ||
define('_DEBUG_AUTORISER', false);
27 // Constantes surchargeables, cf. plugin autorite
30 * Gérer les admins restreints ?
32 * @todo une option à activer
34 defined('_ADMINS_RESTREINTS') ||
define('_ADMINS_RESTREINTS', true);
36 /** Statut par defaut à la creation */
37 defined('_STATUT_AUTEUR_CREATION') ||
define('_STATUT_AUTEUR_CREATION', '1comite');
39 /** statuts associables a des rubriques (separes par des virgules) */
40 defined('_STATUT_AUTEUR_RUBRIQUE') ||
define('_STATUT_AUTEUR_RUBRIQUE', _ADMINS_RESTREINTS ?
'0minirezo' : '');
42 // mes_fonctions peut aussi declarer des autorisations, donc il faut donc le charger
43 if ($f = find_in_path('mes_fonctions.php')) {
44 global $dossier_squelettes;
45 include_once(_ROOT_CWD
. $f);
49 if (!function_exists('autoriser')) {
51 * Autoriser une action
53 * Teste si une personne (par défaut le visiteur en cours) peut effectuer
54 * une certaine action. Cette fonction est le point d'entrée de toutes
57 * La fonction se charge d'appeler des fonctions d'autorisations spécifiques
58 * aux actions demandées si elles existent. Elle cherche donc les fonctions
60 * - autoriser_{type}_{faire}, sinon avec _dist
61 * - autoriser_{type}, sinon avec _dist
62 * - autoriser_{faire}, sinon avec _dist
63 * - autoriser_{defaut}, sinon avec _dist
65 * Seul le premier argument est obligatoire
68 * @see autoriser_dist()
70 * @param string $faire
71 * une action ('modifier', 'publier'...)
73 * type d'objet ou nom de table ('article')
75 * id de l'objet sur lequel on veut agir
76 * @param null|int|array $qui
77 * - si null on prend alors visiteur_session
78 * - un id_auteur (on regarde dans la base)
79 * - un tableau auteur complet, y compris [restreint]
80 * @param null|array $opt
81 * options sous forme de tableau associatif
83 * true si la personne peut effectuer l'action
85 function autoriser($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
86 // Charger les fonctions d'autorisation supplementaires
88 if (!isset($pipe)) { $pipe = 1; pipeline('autoriser'); }
90 $args = func_get_args();
91 return call_user_func_array('autoriser_dist', $args);
97 * Autoriser une action
99 * Voir autoriser() pour une description complète
103 * @param string $faire
104 * une action ('modifier', 'publier'...)
105 * @param string $type
106 * type d'objet ou nom de table ('article')
108 * id de l'objet sur lequel on veut agir
109 * @param null|int|array $qui
110 * si null on prend alors visiteur_session
111 * un id_auteur (on regarde dans la base)
112 * un tableau auteur complet, y compris [restreint]
113 * @param null|array $opt
114 * options sous forme de tableau associatif
116 * true si la personne peut effectuer l'action
118 function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
120 // Qui ? visiteur_session ?
121 // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge
122 if ($qui === NULL OR $qui==='')
123 $qui = $GLOBALS['visiteur_session'] ?
$GLOBALS['visiteur_session'] : array('statut' => '', 'id_auteur' =>0, 'webmestre' => 'non');
124 elseif (is_numeric($qui)) {
125 $qui = sql_fetsel("*", "spip_auteurs", "id_auteur=".$qui);
128 // Admins restreints, on construit ici (pas generique mais...)
129 // le tableau de toutes leurs rubriques (y compris les sous-rubriques)
130 if (_ADMINS_RESTREINTS
AND is_array($qui)) {
131 $qui['restreint'] = isset($qui['id_auteur']) ?
liste_rubriques_auteur($qui['id_auteur']) : array();
134 if (_DEBUG_AUTORISER
) spip_log("autoriser $faire $type $id (" . (isset($qui['nom']) ?
$qui['nom'] : '') . ") ?");
136 // passer par objet_type pour avoir les alias
137 // et supprimer les _
138 $type = str_replace('_','', strncmp($type,"_",1)==0?
$type:objet_type($type,false));
140 // Si une exception a ete decretee plus haut dans le code, l'appliquer
141 if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id])
142 AND autoriser_exception($faire,$type,$id,'verifier'))
145 // Chercher une fonction d'autorisation
146 // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist],
147 // autoriser_faire[_dist], autoriser_defaut[_dist]
150 'autoriser_'.$type.'_'.$faire,
151 'autoriser_'.$type.'_'.$faire.'_dist',
153 'autoriser_'.$type.'_dist',
155 'autoriser_'.$faire.'_dist',
157 'autoriser_defaut_dist'
161 'autoriser_'.$faire.'_dist',
163 'autoriser_defaut_dist'
166 foreach ($fonctions as $f) {
167 if (function_exists($f)) {
168 $a = $f($faire,$type,$id,$qui,$opt);
173 if (_DEBUG_AUTORISER
) spip_log("$f($faire,$type,$id," . (isset($qui['nom']) ?
$qui['nom'] : '') . "): ".($a?
'OK':'niet'));
178 // une globale pour aller au plus vite dans la fonction generique ci dessus
179 $GLOBALS['autoriser_exception']=array();
182 * Accorder une autorisation exceptionnel pour le hit en cours, ou la revoquer
184 * http://doc.spip.org/@autoriser_exception
186 * @param string $faire Action demandée
187 * @param string $type Type d'objet sur lequel appliquer l'action
188 * @param int $id Identifiant de l'objet
189 * @param bool $autoriser accorder (true) ou revoquer (false)
192 function autoriser_exception($faire,$type,$id,$autoriser=true){
193 // une static innaccessible par url pour verifier que la globale est positionnee a bon escient
194 static $autorisation;
195 if ($autoriser==='verifier')
196 return isset($autorisation[$faire][$type][$id]);
197 if ($autoriser===true)
198 $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true;
199 if ($autoriser===false) {
200 unset($GLOBALS['autoriser_exception'][$faire][$type][$id]);
201 unset($autorisation[$faire][$type][$id]);
208 * Autorisation par defaut
210 * Les admins complets OK, les autres non
212 * @param string $faire Action demandée
213 * @param string $type Type d'objet sur lequel appliquer l'action
214 * @param int $id Identifiant de l'objet
215 * @param array $qui Description de l'auteur demandant l'autorisation
216 * @param array $opt Options de cette autorisation
217 * @return bool true s'il a le droit, false sinon
219 function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) {
221 $qui['statut'] == '0minirezo'
222 AND !$qui['restreint'];
227 * Autorisation d'accès è l'espace privé ?
229 * @param string $faire Action demandée
230 * @param string $type Type d'objet sur lequel appliquer l'action
231 * @param int $id Identifiant de l'objet
232 * @param array $qui Description de l'auteur demandant l'autorisation
233 * @param array $opt Options de cette autorisation
234 * @return bool true s'il a le droit, false sinon
236 function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) {
237 return in_array($qui['statut'], array('0minirezo', '1comite'));
241 * Autorisation de créer un contenu
243 * Accordée par defaut ceux qui accèdent à l'espace privé,
244 * peut-être surchargée au cas par cas
246 * @param string $faire Action demandée
247 * @param string $type Type d'objet sur lequel appliquer l'action
248 * @param int $id Identifiant de l'objet
249 * @param array $qui Description de l'auteur demandant l'autorisation
250 * @param array $opt Options de cette autorisation
251 * @return bool true s'il a le droit, false sinon
253 function autoriser_creer_dist($faire, $type, $id, $qui, $opt) {
254 return in_array($qui['statut'], array('0minirezo', '1comite'));
258 * Autorisation de prévisualiser un contenu
260 * @param string $faire Action demandée
261 * @param string $type Type d'objet sur lequel appliquer l'action
262 * @param int $id Identifiant de l'objet
263 * @param array $qui Description de l'auteur demandant l'autorisation
264 * @param array $opt Options de cette autorisation
265 * @return bool true s'il a le droit, false sinon
267 function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) {
268 // si auteur pas autorise, NIET
269 if (strpos($GLOBALS['meta']['preview'], ",". $qui['statut'] .",")===false)
271 // si pas de type et statut fourni, c'est une autorisation generale => OK
275 include_spip('base/objets');
276 $infos = lister_tables_objets_sql(table_objet_sql($type));
277 if (isset($infos['statut']))
278 foreach($infos['statut'] as $c){
279 if (isset($c['publie'])){
280 if (!isset($c['previsu'])) return false; // pas de previsu definie => NIET
281 $champ = $c['champ'];
282 if (!isset($opt[$champ])) return false; // pas de champ passe a la demande => NIET
283 $previsu = explode(',',$c['previsu']);
284 if (!in_array($opt[$champ],$previsu)) // le statut n'est pas dans ceux definis par la previsu => NIET
292 * Autorisation de changer de langue un contenu
294 * @param string $faire Action demandée
295 * @param string $type Type d'objet sur lequel appliquer l'action
296 * @param int $id Identifiant de l'objet
297 * @param array $qui Description de l'auteur demandant l'autorisation
298 * @param array $opt Options de cette autorisation
299 * @return bool true s'il a le droit, false sinon
301 function autoriser_changerlangue_dist($faire, $type, $id, $qui, $opt) {
302 return autoriser('modifier',$type,$id,$qui,$opt);
306 * Autorisation de changer la date d'un contenu
308 * @param string $faire Action demandée
309 * @param string $type Type d'objet sur lequel appliquer l'action
310 * @param int $id Identifiant de l'objet
311 * @param array $qui Description de l'auteur demandant l'autorisation
312 * @param array $opt Options de cette autorisation
313 * @return bool true s'il a le droit, false sinon
315 function autoriser_dater_dist($faire, $type, $id, $qui, $opt) {
316 if (!isset($opt['statut'])){
317 $table = table_objet($type);
318 $trouver_table = charger_fonction('trouver_table','base');
319 $desc = $trouver_table($table);
322 if (isset($desc['field']['statut'])){
323 $statut = sql_getfetsel("statut", $desc['table'], id_table_objet($type)."=".intval($id));
326 $statut = 'publie'; // pas de statut => publie
329 $statut = $opt['statut'];
331 if ($statut == 'publie'
332 OR ($statut == 'prop' AND $type=='article' AND $GLOBALS['meta']["post_dates"] == "non"))
333 return autoriser('modifier', $type, $id);
338 * Autorisation d'instituer un contenu
340 * C'est à dire de changer son statut ou son parent.
341 * Par défaut, il faut l'autorisation de modifier le contenu
343 * @param string $faire Action demandée
344 * @param string $type Type d'objet sur lequel appliquer l'action
345 * @param int $id Identifiant de l'objet
346 * @param array $qui Description de l'auteur demandant l'autorisation
347 * @param array $opt Options de cette autorisation
348 * @return bool true s'il a le droit, false sinon
350 function autoriser_instituer_dist($faire, $type, $id, $qui, $opt) {
351 return autoriser('modifier',$type,$id,$qui,$opt);
355 * Autorisation de publier dans une rubrique $id
357 * Il faut être administrateur ou administrateur restreint de la rubrique
359 * @param string $faire Action demandée
360 * @param string $type Type d'objet sur lequel appliquer l'action
361 * @param int $id Identifiant de l'objet
362 * @param array $qui Description de l'auteur demandant l'autorisation
363 * @param array $opt Options de cette autorisation
364 * @return bool true s'il a le droit, false sinon
366 function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) {
368 ($qui['statut'] == '0minirezo')
370 !$qui['restreint'] OR !$id
371 OR in_array($id, $qui['restreint'])
376 * Autorisation de créer une rubrique
378 * Il faut être administrateur pour pouvoir publier à la racine
380 * @param string $faire Action demandée
381 * @param string $type Type d'objet sur lequel appliquer l'action
382 * @param int $id Identifiant de l'objet
383 * @param array $qui Description de l'auteur demandant l'autorisation
384 * @param array $opt Options de cette autorisation
385 * @return bool true s'il a le droit, false sinon
387 function autoriser_rubrique_creer_dist($faire, $type, $id, $qui, $opt) {
389 ((!$id AND autoriser('defaut',null,null,$qui, $opt))
390 OR $id AND autoriser('creerrubriquedans','rubrique', $id, $qui, $opt)
395 * Autorisation de créer une sous rubrique dans une rubrique $id
397 * Il faut être administrateur et pouvoir publier dans la rubrique
399 * @param string $faire Action demandée
400 * @param string $type Type d'objet sur lequel appliquer l'action
401 * @param int $id Identifiant de l'objet
402 * @param array $qui Description de l'auteur demandant l'autorisation
403 * @param array $opt Options de cette autorisation
404 * @return bool true s'il a le droit, false sinon
406 function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $opt) {
408 ($id OR ($qui['statut'] == '0minirezo' AND !$qui['restreint']))
409 AND autoriser('voir','rubrique',$id)
410 AND autoriser('publierdans','rubrique',$id);
414 * Autorisation de créer un article dans une rubrique $id
416 * Il faut pouvoir voir la rubrique
418 * @param string $faire Action demandée
419 * @param string $type Type d'objet sur lequel appliquer l'action
420 * @param int $id Identifiant de l'objet
421 * @param array $qui Description de l'auteur demandant l'autorisation
422 * @param array $opt Options de cette autorisation
423 * @return bool true s'il a le droit, false sinon
425 function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) {
428 AND autoriser('voir','rubrique',$id)
429 AND autoriser('creer', 'article');
434 * Autorisation de modifier une rubrique $id
436 * Il faut pouvoir publier dans cette rubrique
438 * @param string $faire Action demandée
439 * @param string $type Type d'objet sur lequel appliquer l'action
440 * @param int $id Identifiant de l'objet
441 * @param array $qui Description de l'auteur demandant l'autorisation
442 * @param array $opt Options de cette autorisation
443 * @return bool true s'il a le droit, false sinon
445 function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
447 autoriser('publierdans', 'rubrique', $id, $qui, $opt);
451 * Autorisation de supprimer une rubrique $id
453 * Il faut quelle soit vide (pas d'enfant) et qu'on ait le droit de la modifier
455 * @param string $faire Action demandée
456 * @param string $type Type d'objet sur lequel appliquer l'action
457 * @param int $id Identifiant de l'objet
458 * @param array $qui Description de l'auteur demandant l'autorisation
459 * @param array $opt Options de cette autorisation
460 * @return bool true s'il a le droit, false sinon
462 function autoriser_rubrique_supprimer_dist($faire, $type, $id, $qui, $opt) {
463 if (!$id = intval($id))
466 if (sql_countsel('spip_rubriques', "id_parent=".intval($id)))
469 if (sql_countsel('spip_articles', "id_rubrique=".intval($id)." AND (statut<>'poubelle')"))
472 $compte = pipeline('objet_compte_enfants',array('args'=>array('objet'=>'rubrique','id_objet'=>$id),'data'=>array()));
473 foreach($compte as $objet => $n)
477 return autoriser('modifier','rubrique',$id);
482 * Autorisation de modifier un article $id
484 * Il faut pouvoir publier dans le parent
485 * ou, si on change le statut en proposé ou préparation être auteur de l'article
487 * @param string $faire Action demandée
488 * @param string $type Type d'objet sur lequel appliquer l'action
489 * @param int $id Identifiant de l'objet
490 * @param array $qui Description de l'auteur demandant l'autorisation
491 * @param array $opt Options de cette autorisation
492 * @return bool true s'il a le droit, false sinon
494 function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) {
495 $r = sql_fetsel("id_rubrique,statut", "spip_articles", "id_article=".sql_quote($id));
497 if (!function_exists('auteurs_article'))
498 include_spip('inc/auth'); // pour auteurs_article si espace public
504 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
506 (!isset($opt['statut']) OR $opt['statut']!=='publie')
507 AND in_array($qui['statut'], array('0minirezo', '1comite'))
508 AND in_array($r['statut'], array('prop','prepa', 'poubelle'))
509 AND auteurs_article($id, "id_auteur=".$qui['id_auteur'])
515 * Autorisation de créer un article
517 * Il faut qu'une rubrique existe et être au moins rédacteur
519 * @param string $faire Action demandée
520 * @param string $type Type d'objet sur lequel appliquer l'action
521 * @param int $id Identifiant de l'objet
522 * @param array $qui Description de l'auteur demandant l'autorisation
523 * @param array $opt Options de cette autorisation
524 * @return bool true s'il a le droit, false sinon
526 function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) {
527 return (sql_countsel('spip_rubriques')>0 AND in_array($qui['statut'], array('0minirezo', '1comite')));
531 * Autorisation de voir un article
533 * Il faut être admin ou auteur de l'article, sinon il faut que l'article
534 * soit publié ou proposé.
536 * Peut-être appelée sans $id, mais avec un $opt['statut'] pour tester
537 * la liste des status autorisés en fonction de $qui['statut']
539 * @param string $faire Action demandée
540 * @param string $type Type d'objet sur lequel appliquer l'action
541 * @param int $id Identifiant de l'objet
542 * @param array $qui Description de l'auteur demandant l'autorisation
543 * @param array $opt Options de cette autorisation
544 * @return bool true s'il a le droit, false sinon
546 function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt){
547 if ($qui['statut'] == '0minirezo') return true;
548 // cas des articles : depend du statut de l'article et de l'auteur
549 if (isset($opt['statut']))
550 $statut = $opt['statut'];
552 if (!$id) return false;
553 $statut = sql_getfetsel("statut", "spip_articles", "id_article=".intval($id));
557 // si on est pas auteur de l'article,
558 // seuls les propose et publies sont visibles
559 in_array($statut, array('prop', 'publie'))
560 // sinon si on est auteur, on a le droit de le voir, evidemment !
562 ($id AND $qui['id_auteur']
563 AND (function_exists('auteurs_article') OR include_spip('inc/auth'))
564 AND auteurs_article($id, "id_auteur=".$qui['id_auteur']));
569 * Autorisation de voir un objet
571 * Tout est visible par défaut, sauf les auteurs où il faut au moins être rédacteur.
573 * @param string $faire Action demandée
574 * @param string $type Type d'objet sur lequel appliquer l'action
575 * @param int $id Identifiant de l'objet
576 * @param array $qui Description de l'auteur demandant l'autorisation
577 * @param array $opt Options de cette autorisation
578 * @return bool true s'il a le droit, false sinon
580 function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
581 # securite, mais on aurait pas du arriver ici !
582 if (function_exists($f='autoriser_'.$type.'_voir') OR function_exists($f='autoriser_'.$type.'_voir_dist')){
583 return $f($faire, $type, $id, $qui, $opt);
586 if ($qui['statut'] == '0minirezo') return true;
587 // admins et redacteurs peuvent voir un auteur
588 if ($type == 'auteur')
589 return in_array($qui['statut'], array('0minirezo', '1comite'));
590 // sinon par defaut tout est visible
591 // sauf cas particuliers traites separemment (ie article)
597 * Autorisation de webmestre
599 * Est-on webmestre ? Signifie qu'on n'a même pas besoin de passer par ftp
600 * pour modifier les fichiers, cf. notamment inc/admin
602 * Soit la liste des webmestres est définie via une constante _ID_WEBMESTRES,
603 * soit on regarde l'état "webmestre" de l'auteur
605 * @param string $faire Action demandée
606 * @param string $type Type d'objet sur lequel appliquer l'action
607 * @param int $id Identifiant de l'objet
608 * @param array $qui Description de l'auteur demandant l'autorisation
609 * @param array $opt Options de cette autorisation
610 * @return bool true s'il a le droit, false sinon
612 function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) {
614 (defined('_ID_WEBMESTRES')?
615 in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES
))
616 :$qui['webmestre']=='oui')
617 AND $qui['statut'] == '0minirezo'
618 AND !$qui['restreint']
623 * Autorisation Configurer le site
625 * Il faut être administrateur complet
627 * @param string $faire Action demandée
628 * @param string $type Type d'objet sur lequel appliquer l'action
629 * @param int $id Identifiant de l'objet
630 * @param array $qui Description de l'auteur demandant l'autorisation
631 * @param array $opt Options de cette autorisation
632 * @return bool true s'il a le droit, false sinon
634 function autoriser_configurer_dist($faire, $type, $id, $qui, $opt) {
636 $qui['statut'] == '0minirezo'
637 AND !$qui['restreint']
642 * Autorisation de sauvegarder la base de données
644 * Il faut être administrateur (y compris restreint)
646 * @param string $faire Action demandée
647 * @param string $type Type d'objet sur lequel appliquer l'action
648 * @param int $id Identifiant de l'objet
649 * @param array $qui Description de l'auteur demandant l'autorisation
650 * @param array $opt Options de cette autorisation
651 * @return bool true s'il a le droit, false sinon
653 function autoriser_sauvegarder_dist($faire, $type, $id, $qui, $opt) {
655 $qui['statut'] == '0minirezo'
660 * Autorisation d'effacer la base de données
662 * Il faut être webmestre
664 * @param string $faire Action demandée
665 * @param string $type Type d'objet sur lequel appliquer l'action
666 * @param int $id Identifiant de l'objet
667 * @param array $qui Description de l'auteur demandant l'autorisation
668 * @param array $opt Options de cette autorisation
669 * @return bool true s'il a le droit, false sinon
671 function autoriser_detruire_dist($faire, $type, $id, $qui, $opt) {
673 autoriser('webmestre', null, null, $qui, $opt);
677 * Autorisation de prévisialiser un auteur
679 * Il faut être administrateur ou que l'auteur à prévisualiser
680 * ait au moins publié un article
682 * @param string $faire Action demandée
683 * @param string $type Type d'objet sur lequel appliquer l'action
684 * @param int $id Identifiant de l'objet
685 * @param array $qui Description de l'auteur demandant l'autorisation
686 * @param array $opt Options de cette autorisation
687 * @return bool true s'il a le droit, false sinon
689 function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) {
690 // les admins peuvent "previsualiser" une page auteur
691 if ($qui['statut'] == '0minirezo'
692 AND !$qui['restreint']) return true;
693 // "Voir en ligne" si l'auteur a un article publie
694 $n = sql_fetsel('A.id_article', 'spip_auteurs_liens AS L LEFT JOIN spip_articles AS A ON (L.objet=\'article\' AND L.id_objet=A.id_article)', "A.statut='publie' AND L.id_auteur=".sql_quote($id));
695 return $n ?
true : false;
699 * Autorisation de créer un auteur
701 * Il faut être administrateur (restreint compris).
704 * Seuls les administrateurs complets ont accès à tous les
705 * champs du formulaire d'édition d'un auteur. À la création
706 * d'un auteur, son statut est 'poubelle'. C'est l'autorisation
707 * de modifier qui permet de changer les informations sensibles
708 * (statut, login, pass, etc.) à l'institution.
710 * @see auteur_inserer()
711 * @see auteur_instituer()
712 * @see autoriser_auteur_modifier_dist()
714 * @param string $faire Action demandée
715 * @param string $type Type d'objet sur lequel appliquer l'action
716 * @param int $id Identifiant de l'objet
717 * @param array $qui Description de l'auteur demandant l'autorisation
718 * @param array $opt Options de cette autorisation
719 * @return bool true s'il a le droit, false sinon
721 function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) {
722 return ($qui['statut'] == '0minirezo');
727 * Autorisation de modifier un auteur
729 * Attention tout depend de ce qu'on veut modifier. Il faut être au moins
730 * rédacteur, mais on ne peut pas promouvoir (changer le statut) un auteur
731 * avec des droits supérieurs au sien.
733 * @param string $faire Action demandée
734 * @param string $type Type d'objet sur lequel appliquer l'action
735 * @param int $id Identifiant de l'objet
736 * @param array $qui Description de l'auteur demandant l'autorisation
737 * @param array $opt Options de cette autorisation
738 * @return bool true s'il a le droit, false sinon
740 function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
742 // Ni admin ni redacteur => non
743 if (!in_array($qui['statut'], array('0minirezo', '1comite')))
746 // Un redacteur peut modifier ses propres donnees mais ni son login/email
747 // ni son statut (qui sont le cas echeant passes comme option)
748 if ($qui['statut'] == '1comite') {
749 if ($opt['webmestre'])
751 elseif ($opt['statut'] OR $opt['restreintes'] OR $opt['email'])
753 elseif ($id == $qui['id_auteur'])
759 // Un admin restreint peut modifier/creer un auteur non-admin mais il
760 // n'a le droit ni de le promouvoir admin, ni de changer les rubriques
761 if ($qui['restreint']) {
762 if ($opt['webmestre'])
764 elseif ($opt['statut'] == '0minirezo' OR $opt['restreintes'])
767 if ($id == $qui['id_auteur']) {
773 else if ($id_auteur = intval($id)) {
774 $t = sql_fetsel("statut", "spip_auteurs", "id_auteur=$id_auteur");
775 if ($t AND $t['statut'] != '0minirezo')
780 // id = 0 => creation
786 // Un admin complet fait ce qu'elle veut
788 if ($id == $qui['id_auteur'] && $opt['statut'])
790 // et toucher au statut webmestre si il ne l'est pas lui meme
791 // ou si les webmestres sont fixes par constante (securite)
792 elseif (isset($opt['webmestre']) AND $opt['webmestre'] AND (defined('_ID_WEBMESTRES') OR !autoriser('webmestre')))
794 // et modifier un webmestre si il ne l'est pas lui meme
795 elseif (intval($id) AND autoriser('webmestre','',0,$id) AND !autoriser('webmestre'))
803 * Autorisation d'associer un auteur sur un objet
805 * Il faut pouvoir modifier l'objet en question
807 * @param string $faire Action demandée
808 * @param string $type Type d'objet sur lequel appliquer l'action
809 * @param int $id Identifiant de l'objet
810 * @param array $qui Description de l'auteur demandant l'autorisation
811 * @param array $opt Options de cette autorisation
812 * @return bool true s'il a le droit, false sinon
814 function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt){
815 return autoriser('modifier', $type, $id, $qui, $opt);
820 * Autorisation d'upload FTP
822 * Il faut être administrateur.
824 * @param string $faire Action demandée
825 * @param string $type Type d'objet sur lequel appliquer l'action
826 * @param int $id Identifiant de l'objet
827 * @param array $qui Description de l'auteur demandant l'autorisation
828 * @param array $opt Options de cette autorisation
829 * @return bool true s'il a le droit, false sinon
831 function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) {
832 return $qui['statut'] == '0minirezo';
836 * Autorisation d'activer le mode debug
838 * Il faut être administrateur.
840 * @param string $faire Action demandée
841 * @param string $type Type d'objet sur lequel appliquer l'action
842 * @param int $id Identifiant de l'objet
843 * @param array $qui Description de l'auteur demandant l'autorisation
844 * @param array $opt Options de cette autorisation
845 * @return bool true s'il a le droit, false sinon
847 function autoriser_debug_dist($faire, $type, $id, $qui, $opt) {
848 return $qui['statut'] == '0minirezo';
852 * Liste les rubriques d'un auteur
854 * Renvoie la liste des rubriques liées à cet auteur, independamment de son
855 * statut (pour les admins restreints, il faut donc aussi vérifier statut)
857 * Mémorise le resultat dans un tableau statique indéxé par les id_auteur.
858 * On peut reinitialiser un élément en passant un 2e argument non vide
860 * @param int $id_auteur Identifiant de l'auteur
861 * @param bool $raz Recalculer le résultat connu pour cet auteur
862 * @return array Liste des rubriques
864 function liste_rubriques_auteur($id_auteur, $raz=false) {
865 static $restreint = array();
867 if (!$id_auteur = intval($id_auteur)) return array();
868 if ($raz) unset($restreint[$id_auteur]);
869 elseif (isset($restreint[$id_auteur])) return $restreint[$id_auteur];
871 $rubriques = array();
873 (!isset($GLOBALS['meta']['version_installee']) OR $GLOBALS['meta']['version_installee']>16428)
874 AND $r = sql_allfetsel('id_objet', 'spip_auteurs_liens', "id_auteur=".intval($id_auteur)." AND objet='rubrique' AND id_objet!=0")
876 $r = array_map('reset',$r);
878 // recuperer toute la branche, au format chaine enumeration
879 include_spip('inc/rubriques');
880 $r = calcul_branche_in($r);
881 $r = explode(',',$r);
883 // passer les rubriques en index, elimine les doublons
885 // recuperer les index seuls
887 // combiner pour avoir un tableau id_rubrique=>id_rubrique
888 // est-ce vraiment utile ? (on preserve la forme donnee par le code precedent)
889 $rubriques = array_combine($r,$r);
892 // Affecter l'auteur session le cas echeant
893 if (isset($GLOBALS['visiteur_session']['id_auteur'])
894 AND $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur)
895 $GLOBALS['visiteur_session']['restreint'] = $rubriques;
898 return $restreint[$id_auteur] = $rubriques;
902 * Autorisation de modifier l'URL d'un objet
904 * Il faut pouvoir modifier l'objet.
906 * @param string $faire Action demandée
907 * @param string $type Type d'objet sur lequel appliquer l'action
908 * @param int $id Identifiant de l'objet
909 * @param array $qui Description de l'auteur demandant l'autorisation
910 * @param array $opt Options de cette autorisation
911 * @return bool true s'il a le droit, false sinon
913 function autoriser_modifierurl_dist($faire, $type, $id, $qui, $opt) {
914 return autoriser('modifier', $type, $id, $qui, $opt);
918 * Autorisation de prévisualiser une rubrique
920 * Il faut pouvoir prévisualiser.
922 * @param string $faire Action demandée
923 * @param string $type Type d'objet sur lequel appliquer l'action
924 * @param int $id Identifiant de l'objet
925 * @param array $qui Description de l'auteur demandant l'autorisation
926 * @param array $opt Options de cette autorisation
927 * @return bool true s'il a le droit, false sinon
929 function autoriser_rubrique_previsualiser_dist($faire,$type,$id,$qui,$opt){
930 return autoriser('previsualiser');
934 * Autorisation d'iconifier une rubrique (mettre un logo)
936 * Il faut pouvoir publier dans la rubrique.
938 * @param string $faire Action demandée
939 * @param string $type Type d'objet sur lequel appliquer l'action
940 * @param int $id Identifiant de l'objet
941 * @param array $qui Description de l'auteur demandant l'autorisation
942 * @param array $opt Options de cette autorisation
943 * @return bool true s'il a le droit, false sinon
945 function autoriser_rubrique_iconifier_dist($faire,$type,$id,$qui,$opt){
946 return autoriser('publierdans', 'rubrique', $id, $qui, $opt);
950 * Autorisation d'iconifier un auteur (mettre un logo)
952 * Il faut un administrateur ou que l'auteur soit celui qui demande l'autorisation
954 * @param string $faire Action demandée
955 * @param string $type Type d'objet sur lequel appliquer l'action
956 * @param int $id Identifiant de l'objet
957 * @param array $qui Description de l'auteur demandant l'autorisation
958 * @param array $opt Options de cette autorisation
959 * @return bool true s'il a le droit, false sinon
961 function autoriser_auteur_iconifier_dist($faire,$type,$id,$qui,$opt){
962 return (($id == $qui['id_auteur']) OR
963 (($qui['statut'] == '0minirezo') AND !$qui['restreint']));
967 * Autorisation d'iconifier un objet (mettre un logo)
969 * Il faut pouvoir modifier l'objet
971 * @param string $faire Action demandée
972 * @param string $type Type d'objet sur lequel appliquer l'action
973 * @param int $id Identifiant de l'objet
974 * @param array $qui Description de l'auteur demandant l'autorisation
975 * @param array $opt Options de cette autorisation
976 * @return bool true s'il a le droit, false sinon
978 function autoriser_iconifier_dist($faire,$type,$id,$qui,$opt){
979 // par defaut, on a le droit d'iconifier si on a le droit de modifier
980 return autoriser('modifier', $type, $id, $qui, $opt);
987 * Autorise toujours !
988 * Fonction sans surprise pour permettre les tests.
990 * @param string $faire Action demandée
991 * @param string $type Type d'objet sur lequel appliquer l'action
992 * @param int $id Identifiant de l'objet
993 * @param array $qui Description de l'auteur demandant l'autorisation
994 * @param array $opt Options de cette autorisation
997 function autoriser_ok_dist($faire, $type, $id, $qui, $opt) { return true; }
1003 * Fonction sans surprise pour permettre les tests.
1005 * @param string $faire Action demandée
1006 * @param string $type Type d'objet sur lequel appliquer l'action
1007 * @param int $id Identifiant de l'objet
1008 * @param array $qui Description de l'auteur demandant l'autorisation
1009 * @param array $opt Options de cette autorisation
1010 * @return bool false
1012 function autoriser_niet_dist($faire, $type, $id, $qui, $opt) { return false; }
1015 * Autorisation de réparer la base de données
1017 * Il faut pouvoir la détruire (et ne pas être en cours de réinstallation)
1019 * @param string $faire Action demandée
1020 * @param string $type Type d'objet sur lequel appliquer l'action
1021 * @param int $id Identifiant de l'objet
1022 * @param array $qui Description de l'auteur demandant l'autorisation
1023 * @param array $opt Options de cette autorisation
1024 * @return bool false
1026 function autoriser_base_reparer_dist($faire, $type, $id, $qui, $opt) {
1027 if (!autoriser('detruire') OR _request('reinstall'))
1034 * Autorisation de voir l'onglet infosperso
1038 * @param string $faire Action demandée
1039 * @param string $type Type d'objet sur lequel appliquer l'action
1040 * @param int $id Identifiant de l'objet
1041 * @param array $qui Description de l'auteur demandant l'autorisation
1042 * @param array $opt Options de cette autorisation
1043 * @return bool true s'il a le droit, false sinon
1045 function autoriser_infosperso_onglet_dist($faire,$type,$id,$qui,$opt) {
1050 * Autorisation de voir l'onglet configurerlangage
1054 * @param string $faire Action demandée
1055 * @param string $type Type d'objet sur lequel appliquer l'action
1056 * @param int $id Identifiant de l'objet
1057 * @param array $qui Description de l'auteur demandant l'autorisation
1058 * @param array $opt Options de cette autorisation
1059 * @return bool true s'il a le droit, false sinon
1061 function autoriser_configurerlangage_onglet_dist($faire,$type,$id,$qui,$opt) {
1066 * Autorisation de voir l'onglet configurerpreferences
1070 * @param string $faire Action demandée
1071 * @param string $type Type d'objet sur lequel appliquer l'action
1072 * @param int $id Identifiant de l'objet
1073 * @param array $qui Description de l'auteur demandant l'autorisation
1074 * @param array $opt Options de cette autorisation
1075 * @return bool true s'il a le droit, false sinon
1077 function autoriser_configurerpreferences_onglet_dist($faire,$type,$id,$qui,$opt) {
1082 * Autorisation de voir le menu auteurs
1086 * @param string $faire Action demandée
1087 * @param string $type Type d'objet sur lequel appliquer l'action
1088 * @param int $id Identifiant de l'objet
1089 * @param array $qui Description de l'auteur demandant l'autorisation
1090 * @param array $opt Options de cette autorisation
1091 * @return bool true s'il a le droit, false sinon
1093 function autoriser_auteurs_menu_dist($faire, $type, $id, $qui, $opt){return true;}
1096 * Autorisation de voir le menu articles
1100 * @param string $faire Action demandée
1101 * @param string $type Type d'objet sur lequel appliquer l'action
1102 * @param int $id Identifiant de l'objet
1103 * @param array $qui Description de l'auteur demandant l'autorisation
1104 * @param array $opt Options de cette autorisation
1105 * @return bool true s'il a le droit, false sinon
1107 function autoriser_articles_menu_dist($faire, $type, $id, $qui, $opt){return true;}
1110 * Autorisation de voir le menu rubriques
1114 * @param string $faire Action demandée
1115 * @param string $type Type d'objet sur lequel appliquer l'action
1116 * @param int $id Identifiant de l'objet
1117 * @param array $qui Description de l'auteur demandant l'autorisation
1118 * @param array $opt Options de cette autorisation
1119 * @return bool true s'il a le droit, false sinon
1121 function autoriser_rubriques_menu_dist($faire, $type, $id, $qui, $opt){return true;}
1124 * Autorisation de voir le menu articlecreer
1126 * Il faut au moins une rubrique présente.
1128 * @param string $faire Action demandée
1129 * @param string $type Type d'objet sur lequel appliquer l'action
1130 * @param int $id Identifiant de l'objet
1131 * @param array $qui Description de l'auteur demandant l'autorisation
1132 * @param array $opt Options de cette autorisation
1133 * @return bool true s'il a le droit, false sinon
1135 function autoriser_articlecreer_menu_dist($faire, $type, $id, $qui, $opt){
1136 return verifier_table_non_vide();
1140 * Autorisation de voir le menu auteurcreer
1142 * Il faut pouvoir créer un auteur !
1144 * @see autoriser_auteur_creer_dist()
1146 * @param string $faire Action demandée
1147 * @param string $type Type d'objet sur lequel appliquer l'action
1148 * @param int $id Identifiant de l'objet
1149 * @param array $qui Description de l'auteur demandant l'autorisation
1150 * @param array $opt Options de cette autorisation
1151 * @return bool true s'il a le droit, false sinon
1153 function autoriser_auteurcreer_menu_dist($faire, $type, $id, $qui, $opt) {
1154 return autoriser('creer', 'auteur', $id, $qui, $opt);
1158 * Autorisation de voir le menu suiviedito
1160 * Il faut être administrateur (y compris restreint).
1162 * @param string $faire Action demandée
1163 * @param string $type Type d'objet sur lequel appliquer l'action
1164 * @param int $id Identifiant de l'objet
1165 * @param array $qui Description de l'auteur demandant l'autorisation
1166 * @param array $opt Options de cette autorisation
1167 * @return bool true s'il a le droit, false sinon
1169 function autoriser_suiviedito_menu_dist($faire, $type, $id, $qui, $opt){
1170 return $qui['statut']=='0minirezo';
1174 * Autorisation de voir le menu synchro
1176 * Il faut être administrateur (y compris restreint).
1178 * @param string $faire Action demandée
1179 * @param string $type Type d'objet sur lequel appliquer l'action
1180 * @param int $id Identifiant de l'objet
1181 * @param array $qui Description de l'auteur demandant l'autorisation
1182 * @param array $opt Options de cette autorisation
1183 * @return bool true s'il a le droit, false sinon
1185 function autoriser_synchro_menu_dist($faire, $type, $id, $qui, $opt){
1186 return $qui['statut']=='0minirezo';
1190 * Autorisation de purger la queue de travaux
1192 * Il faut être webmestre.
1194 * @param string $faire Action demandée
1195 * @param string $type Type d'objet sur lequel appliquer l'action
1196 * @param int $id Identifiant de l'objet
1197 * @param array $qui Description de l'auteur demandant l'autorisation
1198 * @param array $opt Options de cette autorisation
1199 * @return bool true s'il a le droit, false sinon
1201 function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt){
1202 return autoriser('webmestre');
1207 * Autorisation l'échafaudage de squelettes en Z
1209 * Il faut être dans l'espace privé (et authentifié),
1210 * sinon il faut être webmestre (pas de fuite d'informations publiées)
1212 * @param string $faire Action demandée
1213 * @param string $type Type d'objet sur lequel appliquer l'action
1214 * @param int $id Identifiant de l'objet
1215 * @param array $qui Description de l'auteur demandant l'autorisation
1216 * @param array $opt Options de cette autorisation
1217 * @return bool true s'il a le droit, false sinon
1219 function autoriser_echafauder_dist($faire, $type, $id, $qui, $opt){
1220 if (test_espace_prive())
1221 return intval($qui['id_auteur'])?
true:false;
1223 return autoriser('webmestre','',$id,$qui,$opt);
1228 * Lister les auteurs d'un article
1230 * Fonction générique utilisée par plusieurs autorisations
1232 * @param int $id_article Identifiant de l'article
1233 * @param string $cond Condition en plus dans le where de la requête
1234 * @return array|bool
1235 * - array : liste des id_auteur trouvés
1236 * - false : serveur SQL indisponible
1238 function auteurs_article($id_article, $cond='')
1240 return sql_allfetsel("id_auteur", "spip_auteurs_liens", "objet='article' AND id_objet=$id_article". ($cond ?
" AND $cond" : ''));
1245 * Tester si on est admin restreint sur une rubrique donnée
1247 * Fonction générique utilisee dans des autorisations ou assimilée
1249 * @param int $id_rubrique Identifiant de la rubrique
1250 * @return bool true si administrateur de cette rubrique, false sinon.
1252 function acces_restreint_rubrique($id_rubrique) {
1253 global $connect_id_rubrique;
1255 return (isset($connect_id_rubrique[$id_rubrique]));
1260 * Verifier qu'il existe au moins un parent
1262 * Fonction utilisee dans des autorisations des boutons / menus du prive des objets enfants (articles, breves, sites)
1264 * @param string $table la table a verifier
1265 * @return bool true si un parent existe
1267 function verifier_table_non_vide($table='spip_rubriques') {
1268 static $done = array();
1269 if (!isset($done[$table]))
1270 $done[$table] = sql_countsel($table)>0;
1271 return $done[$table];
1275 * Une autorisation determiner la possibilite de s'inscire pour un statut et un id_rubrique,
1276 * a l'aide de la liste globale des statuts (tableau mode => nom du mode)
1277 * Utile pour le formulaire d'inscription.
1278 * Par defaut, seuls 6forum et 1comite possibles, les autres sont en false
1279 * pour un nouveau mode il suffit de definir l'autorisation specifique
1283 * statut auteur demande
1285 * id_rubrique eventuel (pas utilise ici, utilise dans des usages persos)
1290 function autoriser_inscrireauteur_dist($faire, $quoi, $id, $qui, $opt){
1292 $s = array_search($quoi, $GLOBALS['liste_des_statuts']);
1295 case 'info_redacteurs' :
1296 return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
1298 case 'info_visiteurs' :
1299 return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' OR $GLOBALS['meta']['forums_publics'] == 'abo');