3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2017 *
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\Core\Autorisations
18 if (!defined('_ECRIRE_INC_VERSION')) {
22 include_spip('base/abstract_sql');
24 // Constantes surchargeables, cf. plugin autorite
27 * Gérer les admins restreints ?
29 * @todo une option à activer
31 defined('_ADMINS_RESTREINTS') ||
define('_ADMINS_RESTREINTS', true);
33 /** Statut par defaut à la creation */
34 defined('_STATUT_AUTEUR_CREATION') ||
define('_STATUT_AUTEUR_CREATION', '1comite');
36 /** statuts associables a des rubriques (separes par des virgules) */
37 defined('_STATUT_AUTEUR_RUBRIQUE') ||
define('_STATUT_AUTEUR_RUBRIQUE', _ADMINS_RESTREINTS ?
'0minirezo' : '');
39 // mes_fonctions peut aussi declarer des autorisations, donc il faut donc le charger
40 if ($f = find_in_path('mes_fonctions.php')) {
41 global $dossier_squelettes;
42 include_once(_ROOT_CWD
. $f);
46 if (!function_exists('autoriser')) {
48 * Autoriser une action
50 * Teste si une personne (par défaut le visiteur en cours) peut effectuer
51 * une certaine action. Cette fonction est le point d'entrée de toutes
54 * La fonction se charge d'appeler des fonctions d'autorisations spécifiques
55 * aux actions demandées si elles existent. Elle cherche donc les fonctions
58 * - autoriser_{type}_{faire}, sinon avec _dist
59 * - autoriser_{type}, sinon avec _dist
60 * - autoriser_{faire}, sinon avec _dist
61 * - autoriser_{defaut}, sinon avec _dist
63 * Seul le premier argument est obligatoire.
66 * Le paramètre `$type` attend par défaut un type d'objet éditorial, et à ce titre,
67 * la valeur transmise se verra appliquer la fonction 'objet_type' pour uniformiser
70 * Si ce paramètre n'a rien n'a voir avec un objet éditorial, par exemple
71 * 'statistiques', un souligné avant le terme est ajouté afin d'indiquer
72 * explicitement à la fonction autoriser de ne pas transformer la chaîne en type
73 * d'objet. Cela donne pour cet exemple : `autoriser('detruire', '_statistiques')`
76 * Le paramètre `$type`, en plus de l'uniformisation en type d'objet, se voit retirer
77 * tous les soulignés du terme. Ainsi le type d'objet `livre_art` deviendra `livreart`
78 * et SPIP cherchera une fonction `autoriser_livreart_{faire}`. Ceci permet
79 * d'éviter une possible confusion si une fonction `autoriser_livre_art` existait :
80 * quel serait le type, quel serait l'action ?
82 * Pour résumer, si le type d'objet éditorial a un souligné, tel que 'livre_art',
83 * la fonction d'autorisation correspondante ne l'aura pas.
84 * Exemple : `function autoriser_livreart_modifier_dist(...){...}`
87 * @see autoriser_dist()
89 * @param string $faire
90 * une action ('modifier', 'publier'...)
92 * type d'objet ou nom de table ('article')
94 * id de l'objet sur lequel on veut agir
95 * @param null|int|array $qui
96 * - si null on prend alors visiteur_session
97 * - un id_auteur (on regarde dans la base)
98 * - un tableau auteur complet, y compris [restreint]
99 * @param null|array $opt
100 * options sous forme de tableau associatif
102 * true si la personne peut effectuer l'action
104 function autoriser($faire, $type = '', $id = 0, $qui = null, $opt = null) {
105 // Charger les fonctions d'autorisation supplementaires
109 pipeline('autoriser');
112 $args = func_get_args();
114 return call_user_func_array('autoriser_dist', $args);
120 * Autoriser une action
122 * Voir autoriser() pour une description complète
126 * @param string $faire
127 * une action ('modifier', 'publier'...)
128 * @param string $type
129 * type d'objet ou nom de table ('article')
131 * id de l'objet sur lequel on veut agir
132 * @param null|int|array $qui
133 * si null on prend alors visiteur_session
134 * un id_auteur (on regarde dans la base)
135 * un tableau auteur complet, y compris [restreint]
136 * @param null|array $opt
137 * options sous forme de tableau associatif
139 * true si la personne peut effectuer l'action
141 function autoriser_dist($faire, $type = '', $id = 0, $qui = null, $opt = null) {
143 // Qui ? visiteur_session ?
144 // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge
145 if ($qui === null or $qui === '') {
146 $qui = $GLOBALS['visiteur_session'] ?
$GLOBALS['visiteur_session'] : array();
147 $qui = array_merge(array('statut' => '', 'id_auteur' => 0, 'webmestre' => 'non'), $qui);
148 } elseif (is_numeric($qui)) {
149 $qui = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . $qui);
152 // Admins restreints, on construit ici (pas generique mais...)
153 // le tableau de toutes leurs rubriques (y compris les sous-rubriques)
154 if (_ADMINS_RESTREINTS
and is_array($qui)) {
155 $qui['restreint'] = isset($qui['id_auteur']) ?
liste_rubriques_auteur($qui['id_auteur']) : array();
159 "autoriser $faire $type $id (" . (isset($qui['nom']) ?
$qui['nom'] : '') . ') ?',
160 'autoriser' . _LOG_DEBUG
163 // passer par objet_type pour avoir les alias
164 // et supprimer les _
165 $type = str_replace('_', '', strncmp($type, '_', 1) == 0 ?
$type : objet_type($type, false));
167 // Si une exception a ete decretee plus haut dans le code, l'appliquer
168 if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id])
169 and autoriser_exception($faire, $type, $id, 'verifier')
171 spip_log("autoriser ($faire, $type, $id, " . (isset($qui['nom']) ?
$qui['nom'] : '') . ') : OK Exception', 'autoriser' . _LOG_DEBUG
);
175 // Chercher une fonction d'autorisation
176 // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist],
177 // autoriser_faire[_dist], autoriser_defaut[_dist]
180 'autoriser_' . $type . '_' . $faire,
181 'autoriser_' . $type . '_' . $faire . '_dist',
182 'autoriser_' . $type,
183 'autoriser_' . $type . '_dist',
184 'autoriser_' . $faire,
185 'autoriser_' . $faire . '_dist',
187 'autoriser_defaut_dist'
190 'autoriser_' . $faire,
191 'autoriser_' . $faire . '_dist',
193 'autoriser_defaut_dist'
196 foreach ($fonctions as $f) {
197 if (function_exists($f)) {
198 $a = $f($faire, $type, $id, $qui, $opt);
204 "$f($faire, $type, $id, " . (isset($qui['nom']) ?
$qui['nom'] : '') . ') : ' . ($a ?
'OK' : 'niet'),
205 'autoriser' . _LOG_DEBUG
211 // une globale pour aller au plus vite dans la fonction generique ci dessus
212 $GLOBALS['autoriser_exception'] = array();
215 * Accorder une autorisation exceptionnel pour le hit en cours, ou la revoquer
217 * http://code.spip.net/@autoriser_exception
219 * @param string $faire Action demandée
220 * @param string $type Type d'objet sur lequel appliquer l'action
221 * @param int $id Identifiant de l'objet
222 * @param bool $autoriser accorder (true) ou revoquer (false)
225 function autoriser_exception($faire, $type, $id, $autoriser = true) {
226 // une static innaccessible par url pour verifier que la globale est positionnee a bon escient
227 static $autorisation;
228 if ($autoriser === 'verifier') {
229 return isset($autorisation[$faire][$type][$id]);
231 if ($autoriser === true) {
232 $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true;
234 if ($autoriser === false) {
235 unset($GLOBALS['autoriser_exception'][$faire][$type][$id]);
236 unset($autorisation[$faire][$type][$id]);
244 * Autorisation par defaut
246 * Les admins complets OK, les autres non
248 * @param string $faire Action demandée
249 * @param string $type Type d'objet sur lequel appliquer l'action
250 * @param int $id Identifiant de l'objet
251 * @param array $qui Description de l'auteur demandant l'autorisation
252 * @param array $opt Options de cette autorisation
253 * @return bool true s'il a le droit, false sinon
255 function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) {
257 $qui['statut'] == '0minirezo'
258 and !$qui['restreint'];
262 * Autorisation a se loger ? Retourne true pour tous les statuts sauf 5poubelle
263 * Peut etre surchargee pour interdire statut=nouveau a se connecter
264 * et forcer l'utilisation du lien de confirmation email pour valider le compte
273 function autoriser_loger_dist($faire, $type, $id, $qui, $opt) {
274 if ($qui['statut'] == '5poubelle') {
281 * Autorisation d'accès à l'espace privé ?
283 * @param string $faire Action demandée
284 * @param string $type Type d'objet sur lequel appliquer l'action
285 * @param int $id Identifiant de l'objet
286 * @param array $qui Description de l'auteur demandant l'autorisation
287 * @param array $opt Options de cette autorisation
288 * @return bool true s'il a le droit, false sinon
290 function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) {
291 return isset($qui['statut']) and in_array($qui['statut'], array('0minirezo', '1comite'));
295 * Autorisation de créer un contenu
297 * Accordée par defaut ceux qui accèdent à l'espace privé,
298 * peut-être surchargée au cas par cas
300 * @param string $faire Action demandée
301 * @param string $type Type d'objet sur lequel appliquer l'action
302 * @param int $id Identifiant de l'objet
303 * @param array $qui Description de l'auteur demandant l'autorisation
304 * @param array $opt Options de cette autorisation
305 * @return bool true s'il a le droit, false sinon
307 function autoriser_creer_dist($faire, $type, $id, $qui, $opt) {
308 return in_array($qui['statut'], array('0minirezo', '1comite'));
312 * Autorisation de prévisualiser un contenu
314 * @uses test_previsualiser_objet_champ()
315 * @uses decrire_token_previsu()
317 * @param string $faire Action demandée
318 * @param string $type Type d'objet sur lequel appliquer l'action
319 * @param int $id Identifiant de l'objet
320 * @param array $qui Description de l'auteur demandant l'autorisation
321 * @param array $opt Options de cette autorisation
322 * @return bool true s'il a le droit, false sinon
324 function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) {
326 // Le visiteur a-t-il un statut prevu par la config ?
327 if (strpos($GLOBALS['meta']['preview'], ',' . $qui['statut'] . ',') !== false) {
328 return test_previsualiser_objet_champ($type, $id, $qui, $opt);
331 // A-t-on un token de prévisualisation valable ?
332 include_spip('inc/securiser_action');
333 if (decrire_token_previsu()) {
341 * Teste qu'un objet éditorial peut être prévisualisé
343 * Cela permet ainsi de commander l'affichage dans l'espace prive du bouton "previsualiser"
344 * voir `prive/objets/infos/article.html` etc.
346 * Cela dépend du statut actuel de l'objet d'une part, et d'autre part de la
347 * clé `previsu` dans le tableau `statut` de la déclaration de l'objet éditorial.
348 * Cette clé `previsu` liste des statuts, séparés par des virgules,
349 * qui ont le droit d'avoir une prévisualisation. La présence de `xx/auteur` indique que pour le
350 * statut `xx`, l'auteur en cours doit être un des auteurs de l'objet éditorial en question
351 * pour que ce statut autorise la prévisualisation.
353 * Exemple pour les articles : `'previsu' => 'publie,prop,prepa/auteur',`
355 * @uses lister_tables_objets_sql()
357 * @param string $type Type d'objet sur lequel appliquer l'action
358 * @param int $id Identifiant de l'objet
359 * @param array $qui Description de l'auteur demandant l'autorisation
360 * @param array $opt Options de cette autorisation
361 * @return boolean True si autorisé, false sinon.
363 function test_previsualiser_objet_champ($type = null, $id = 0, $qui = array(), $opt = array()) {
365 // si pas de type et statut fourni, c'est une autorisation generale => OK
370 include_spip('base/objets');
371 $infos = lister_tables_objets_sql(table_objet_sql($type));
372 if (isset($infos['statut'])) {
373 foreach ($infos['statut'] as $c) {
374 if (isset($c['publie'])) {
375 if (!isset($c['previsu'])) {
377 } // pas de previsu definie => NIET
378 $champ = $c['champ'];
379 if (!isset($opt[$champ])) {
381 } // pas de champ passe a la demande => NIET
382 $previsu = explode(',', $c['previsu']);
383 // regarder si ce statut est autorise pour l'auteur
384 if (in_array($opt[$champ] . '/auteur', $previsu)) {
386 // retrouver l’id_auteur qui a filé un lien de prévisu éventuellement,
387 // sinon l’auteur en session
388 include_spip('inc/securiser_action');
389 if ($desc = decrire_token_previsu()) {
390 $id_auteur = $desc['id_auteur'];
391 } elseif (isset($GLOBALS['visiteur_session']['id_auteur'])) {
392 $id_auteur = intval($GLOBALS['visiteur_session']['id_auteur']);
399 } elseif(autoriser('previsualiser' . $opt[$champ], $type, '', $id_auteur)) {
400 // dans ce cas (admin en general), pas de filtrage sur ce statut
401 } elseif (!sql_countsel(
402 'spip_auteurs_liens',
403 'id_auteur=' . intval($id_auteur) . ' AND objet=' . sql_quote($type) . ' AND id_objet=' . intval($id)
406 } // pas auteur de cet objet => NIET
407 } elseif (!in_array($opt[$champ], $previsu)) {
408 // le statut n'est pas dans ceux definis par la previsu => NIET
419 * Autorisation de changer de langue un contenu
421 * @param string $faire Action demandée
422 * @param string $type Type d'objet sur lequel appliquer l'action
423 * @param int $id Identifiant de l'objet
424 * @param array $qui Description de l'auteur demandant l'autorisation
425 * @param array $opt Options de cette autorisation
426 * @return bool true s'il a le droit, false sinon
428 function autoriser_changerlangue_dist($faire, $type, $id, $qui, $opt) {
429 $multi_objets = explode(',', lire_config('multi_objets'));
430 $gerer_trad_objets = explode(',', lire_config('gerer_trad_objets'));
431 $table = table_objet_sql($type);
432 if (in_array($table, $multi_objets)
433 or in_array($table, $gerer_trad_objets)) { // affichage du formulaire si la configuration l'accepte
434 $multi_secteurs = lire_config('multi_secteurs');
435 $champs = objet_info($type, 'field');
436 if ($multi_secteurs == 'oui'
437 and array_key_exists('id_rubrique', $champs)) {
438 // multilinguisme par secteur et objet rattaché à une rubrique
439 $primary = id_table_objet($type);
440 if ($table != 'spip_rubriques') {
441 $id_rubrique = sql_getfetsel('id_rubrique', "$table", "$primary=" . intval($id));
445 $id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
446 if (!$id_secteur > 0) {
447 $id_secteur = $id_rubrique;
449 $langue_secteur = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_secteur));
450 $langue_objet = sql_getfetsel('lang', "$table", "$primary=" . intval($id));
451 if ($langue_secteur != $langue_objet) {
452 // configuration incohérente, on laisse l'utilisateur corriger la situation
455 if ($table != 'spip_rubriques') { // le choix de la langue se fait seulement sur les rubriques
458 $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id));
459 if ($id_parent != 0) {
460 // sous-rubriques : pas de choix de langue
469 return autoriser('modifier', $type, $id, $qui, $opt);
473 * Autorisation de changer le lien de traduction
475 * @param string $faire Action demandée
476 * @param string $type Type d'objet sur lequel appliquer l'action
477 * @param int $id Identifiant de l'objet
478 * @param array $qui Description de l'auteur demandant l'autorisation
479 * @param array $opt Options de cette autorisation
480 * @return bool true s'il a le droit, false sinon
482 function autoriser_changertraduction_dist($faire, $type, $id, $qui, $opt) {
483 return autoriser('modifier', $type, $id, $qui, $opt);
487 * Autorisation de changer la date d'un contenu
489 * @param string $faire Action demandée
490 * @param string $type Type d'objet sur lequel appliquer l'action
491 * @param int $id Identifiant de l'objet
492 * @param array $qui Description de l'auteur demandant l'autorisation
493 * @param array $opt Options de cette autorisation
494 * @return bool true s'il a le droit, false sinon
496 function autoriser_dater_dist($faire, $type, $id, $qui, $opt) {
497 if (!isset($opt['statut'])) {
498 $table = table_objet($type);
499 $trouver_table = charger_fonction('trouver_table', 'base');
500 $desc = $trouver_table($table);
504 if (isset($desc['field']['statut'])) {
505 $statut = sql_getfetsel('statut', $desc['table'], id_table_objet($type) . '=' . intval($id));
508 } // pas de statut => publie
510 $statut = $opt['statut'];
513 if ($statut == 'publie'
514 or ($statut == 'prop' and $type == 'article' and $GLOBALS['meta']['post_dates'] == 'non')) {
515 return autoriser('modifier', $type, $id);
522 * Autorisation d'instituer un contenu
524 * C'est à dire de changer son statut ou son parent.
525 * Par défaut, il faut l'autorisation de modifier le contenu
527 * @param string $faire Action demandée
528 * @param string $type Type d'objet sur lequel appliquer l'action
529 * @param int $id Identifiant de l'objet
530 * @param array $qui Description de l'auteur demandant l'autorisation
531 * @param array $opt Options de cette autorisation
532 * @return bool true s'il a le droit, false sinon
534 function autoriser_instituer_dist($faire, $type, $id, $qui, $opt) {
535 return autoriser('modifier', $type, $id, $qui, $opt);
539 * Autorisation de publier dans une rubrique $id
541 * Il faut être administrateur ou administrateur restreint de la rubrique
543 * @param string $faire Action demandée
544 * @param string $type Type d'objet sur lequel appliquer l'action
545 * @param int $id Identifiant de l'objet
546 * @param array $qui Description de l'auteur demandant l'autorisation
547 * @param array $opt Options de cette autorisation
548 * @return bool true s'il a le droit, false sinon
550 function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) {
552 ($qui['statut'] == '0minirezo')
554 !$qui['restreint'] or !$id
555 or in_array($id, $qui['restreint'])
560 * Autorisation de créer une rubrique
562 * Il faut être administrateur pour pouvoir publier à la racine
564 * @param string $faire Action demandée
565 * @param string $type Type d'objet sur lequel appliquer l'action
566 * @param int $id Identifiant de l'objet
567 * @param array $qui Description de l'auteur demandant l'autorisation
568 * @param array $opt Options de cette autorisation
569 * @return bool true s'il a le droit, false sinon
571 function autoriser_rubrique_creer_dist($faire, $type, $id, $qui, $opt) {
573 ((!$id and autoriser('defaut', null, null, $qui, $opt))
574 or $id and autoriser('creerrubriquedans', 'rubrique', $id, $qui, $opt)
579 * Autorisation de créer une sous rubrique dans une rubrique $id
581 * Il faut être administrateur et pouvoir publier dans la rubrique
583 * @param string $faire Action demandée
584 * @param string $type Type d'objet sur lequel appliquer l'action
585 * @param int $id Identifiant de l'objet
586 * @param array $qui Description de l'auteur demandant l'autorisation
587 * @param array $opt Options de cette autorisation
588 * @return bool true s'il a le droit, false sinon
590 function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $opt) {
592 ($id or ($qui['statut'] == '0minirezo' and !$qui['restreint']))
593 and autoriser('voir', 'rubrique', $id)
594 and autoriser('publierdans', 'rubrique', $id);
598 * Autorisation de créer un article dans une rubrique $id
600 * Il faut pouvoir voir la rubrique et pouvoir créer un article…
602 * @param string $faire Action demandée
603 * @param string $type Type d'objet sur lequel appliquer l'action
604 * @param int $id Identifiant de l'objet
605 * @param array $qui Description de l'auteur demandant l'autorisation
606 * @param array $opt Options de cette autorisation
607 * @return bool true s'il a le droit, false sinon
609 function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) {
612 and autoriser('voir', 'rubrique', $id)
613 and autoriser('creer', 'article');
618 * Autorisation de modifier une rubrique $id
620 * Il faut pouvoir publier dans cette rubrique
622 * @param string $faire Action demandée
623 * @param string $type Type d'objet sur lequel appliquer l'action
624 * @param int $id Identifiant de l'objet
625 * @param array $qui Description de l'auteur demandant l'autorisation
626 * @param array $opt Options de cette autorisation
627 * @return bool true s'il a le droit, false sinon
629 function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
631 autoriser('publierdans', 'rubrique', $id, $qui, $opt);
635 * Autorisation de supprimer une rubrique $id
637 * Il faut quelle soit vide (pas d'enfant) et qu'on ait le droit de la modifier
639 * @param string $faire Action demandée
640 * @param string $type Type d'objet sur lequel appliquer l'action
641 * @param int $id Identifiant de l'objet
642 * @param array $qui Description de l'auteur demandant l'autorisation
643 * @param array $opt Options de cette autorisation
644 * @return bool true s'il a le droit, false sinon
646 function autoriser_rubrique_supprimer_dist($faire, $type, $id, $qui, $opt) {
647 if (!$id = intval($id)) {
651 if (sql_countsel('spip_rubriques', 'id_parent=' . intval($id))) {
655 if (sql_countsel('spip_articles', 'id_rubrique=' . intval($id) . " AND (statut<>'poubelle')")) {
660 'objet_compte_enfants',
661 array('args' => array('objet' => 'rubrique', 'id_objet' => $id), 'data' => array())
663 foreach ($compte as $objet => $n) {
669 return autoriser('modifier', 'rubrique', $id);
674 * Autorisation de modifier un article $id
676 * Il faut pouvoir publier dans le parent
677 * ou, si on change le statut en proposé ou préparation être auteur de l'article
679 * @param string $faire Action demandée
680 * @param string $type Type d'objet sur lequel appliquer l'action
681 * @param int $id Identifiant de l'objet
682 * @param array $qui Description de l'auteur demandant l'autorisation
683 * @param array $opt Options de cette autorisation
684 * @return bool true s'il a le droit, false sinon
686 function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) {
687 $r = sql_fetsel('id_rubrique,statut', 'spip_articles', 'id_article=' . sql_quote($id));
693 autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
695 (!isset($opt['statut']) or $opt['statut'] !== 'publie')
696 and in_array($qui['statut'], array('0minirezo', '1comite'))
697 and in_array($r['statut'], array('prop', 'prepa', 'poubelle'))
698 and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur'])
704 * Autorisation de créer un article
706 * Il faut qu'une rubrique existe et être au moins rédacteur
708 * @param string $faire Action demandée
709 * @param string $type Type d'objet sur lequel appliquer l'action
710 * @param int $id Identifiant de l'objet
711 * @param array $qui Description de l'auteur demandant l'autorisation
712 * @param array $opt Options de cette autorisation
713 * @return bool true s'il a le droit, false sinon
715 function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) {
716 return (sql_countsel('spip_rubriques') > 0 and in_array($qui['statut'], array('0minirezo', '1comite')));
720 * Autorisation de voir un article
722 * Il faut être admin ou auteur de l'article, sinon il faut que l'article
723 * soit publié ou proposé.
725 * Peut-être appelée sans $id, mais avec un $opt['statut'] pour tester
726 * la liste des status autorisés en fonction de $qui['statut']
728 * @param string $faire Action demandée
729 * @param string $type Type d'objet sur lequel appliquer l'action
730 * @param int $id Identifiant de l'objet
731 * @param array $qui Description de l'auteur demandant l'autorisation
732 * @param array $opt Options de cette autorisation
733 * @return bool true s'il a le droit, false sinon
735 function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt) {
736 if ($qui['statut'] == '0minirezo') {
739 // cas des articles : depend du statut de l'article et de l'auteur
740 if (isset($opt['statut'])) {
741 $statut = $opt['statut'];
746 $statut = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id));
750 // si on est pas auteur de l'article,
751 // seuls les propose et publies sont visibles
752 in_array($statut, array('prop', 'publie'))
753 // sinon si on est auteur, on a le droit de le voir, evidemment !
756 and $qui['id_auteur']
757 and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur']));
762 * Autorisation de voir un objet
764 * Tout est visible par défaut, sauf les auteurs où il faut au moins être rédacteur.
766 * @param string $faire Action demandée
767 * @param string $type Type d'objet sur lequel appliquer l'action
768 * @param int $id Identifiant de l'objet
769 * @param array $qui Description de l'auteur demandant l'autorisation
770 * @param array $opt Options de cette autorisation
771 * @return bool true s'il a le droit, false sinon
773 function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
774 # securite, mais on aurait pas du arriver ici !
775 if (function_exists($f = 'autoriser_' . $type . '_voir')
776 or function_exists($f = 'autoriser_' . $type . '_voir_dist')) {
777 return $f($faire, $type, $id, $qui, $opt);
780 if ($qui['statut'] == '0minirezo') {
783 // admins et redacteurs peuvent voir un auteur
784 if ($type == 'auteur') {
785 return in_array($qui['statut'], array('0minirezo', '1comite'));
787 // sinon par defaut tout est visible
788 // sauf cas particuliers traites separemment (ie article)
794 * Autorisation de webmestre
796 * Est-on webmestre ? Signifie qu'on n'a même pas besoin de passer par ftp
797 * pour modifier les fichiers, cf. notamment inc/admin
799 * Soit la liste des webmestres est définie via une constante _ID_WEBMESTRES,
800 * soit on regarde l'état "webmestre" de l'auteur
802 * @param string $faire Action demandée
803 * @param string $type Type d'objet sur lequel appliquer l'action
804 * @param int $id Identifiant de l'objet
805 * @param array $qui Description de l'auteur demandant l'autorisation
806 * @param array $opt Options de cette autorisation
807 * @return bool true s'il a le droit, false sinon
809 function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) {
811 (defined('_ID_WEBMESTRES') ?
812 in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES
))
813 : $qui['webmestre'] == 'oui')
814 and $qui['statut'] == '0minirezo'
815 and !$qui['restreint'];
819 * Autorisation Configurer le site
821 * Il faut être administrateur complet
823 * @param string $faire Action demandée
824 * @param string $type Type d'objet sur lequel appliquer l'action
825 * @param int $id Identifiant de l'objet
826 * @param array $qui Description de l'auteur demandant l'autorisation
827 * @param array $opt Options de cette autorisation
828 * @return bool true s'il a le droit, false sinon
830 function autoriser_configurer_dist($faire, $type, $id, $qui, $opt) {
832 $qui['statut'] == '0minirezo'
833 and !$qui['restreint'];
837 * Autorisation de sauvegarder la base de données
839 * Il faut être administrateur (y compris restreint)
841 * @param string $faire Action demandée
842 * @param string $type Type d'objet sur lequel appliquer l'action
843 * @param int $id Identifiant de l'objet
844 * @param array $qui Description de l'auteur demandant l'autorisation
845 * @param array $opt Options de cette autorisation
846 * @return bool true s'il a le droit, false sinon
848 function autoriser_sauvegarder_dist($faire, $type, $id, $qui, $opt) {
850 $qui['statut'] == '0minirezo';
854 * Autorisation d'effacer la base de données
856 * Il faut être webmestre
858 * @param string $faire Action demandée
859 * @param string $type Type d'objet sur lequel appliquer l'action
860 * @param int $id Identifiant de l'objet
861 * @param array $qui Description de l'auteur demandant l'autorisation
862 * @param array $opt Options de cette autorisation
863 * @return bool true s'il a le droit, false sinon
865 function autoriser_detruire_dist($faire, $type, $id, $qui, $opt) {
867 autoriser('webmestre', null, null, $qui, $opt);
871 * Autorisation de prévisualiser un auteur
873 * Il faut être administrateur ou que l'auteur à prévisualiser
874 * ait au moins publié un article
876 * @param string $faire Action demandée
877 * @param string $type Type d'objet sur lequel appliquer l'action
878 * @param int $id Identifiant de l'objet
879 * @param array $qui Description de l'auteur demandant l'autorisation
880 * @param array $opt Options de cette autorisation
881 * @return bool true s'il a le droit, false sinon
883 function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) {
884 // les admins peuvent "previsualiser" une page auteur
885 if ($qui['statut'] == '0minirezo'
886 and !$qui['restreint']
890 // "Voir en ligne" si l'auteur a un article publie
893 'spip_auteurs_liens AS L LEFT JOIN spip_articles AS A ON (L.objet=\'article\' AND L.id_objet=A.id_article)',
894 "A.statut='publie' AND L.id_auteur=" . sql_quote($id)
897 return $n ?
true : false;
902 * Autorisation de créer un auteur
904 * Il faut être administrateur (restreint compris).
907 * Seuls les administrateurs complets ont accès à tous les
908 * champs du formulaire d'édition d'un auteur. À la création
909 * d'un auteur, son statut est 'poubelle'. C'est l'autorisation
910 * de modifier qui permet de changer les informations sensibles
911 * (statut, login, pass, etc.) à l'institution.
913 * @see auteur_inserer()
914 * @see auteur_instituer()
915 * @see autoriser_auteur_modifier_dist()
917 * @param string $faire Action demandée
918 * @param string $type Type d'objet sur lequel appliquer l'action
919 * @param int $id Identifiant de l'objet
920 * @param array $qui Description de l'auteur demandant l'autorisation
921 * @param array $opt Options de cette autorisation
922 * @return bool true s'il a le droit, false sinon
924 function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) {
925 return ($qui['statut'] == '0minirezo');
930 * Autorisation de modifier un auteur
932 * Attention tout depend de ce qu'on veut modifier. Il faut être au moins
933 * rédacteur, mais on ne peut pas promouvoir (changer le statut) un auteur
934 * avec des droits supérieurs au sien.
936 * @param string $faire Action demandée
937 * @param string $type Type d'objet sur lequel appliquer l'action
938 * @param int $id Identifiant de l'objet
939 * @param array $qui Description de l'auteur demandant l'autorisation
940 * @param array $opt Options de cette autorisation
941 * @return bool true s'il a le droit, false sinon
943 function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
945 // Ni admin ni redacteur => non
946 if (!in_array($qui['statut'], array('0minirezo', '1comite'))) {
950 // Un redacteur peut modifier ses propres donnees mais ni son login/email
951 // ni son statut (qui sont le cas echeant passes comme option)
952 if ($qui['statut'] == '1comite') {
953 if (!empty($opt['webmestre'])) {
956 !empty($opt['statut'])
957 or !empty($opt['restreintes'])
958 or !empty($opt['email'])
961 } elseif ($id == $qui['id_auteur']) {
968 // Un admin restreint peut modifier/creer un auteur non-admin mais il
969 // n'a le droit ni de le promouvoir admin, ni de changer les rubriques
970 if ($qui['restreint']) {
971 if (isset($opt['webmestre']) and $opt['webmestre']) {
973 } elseif ((isset($opt['statut']) and ($opt['statut'] == '0minirezo'))
974 or (isset($opt['restreintes']) and $opt['restreintes'])
978 if ($id == $qui['id_auteur']) {
979 if (isset($opt['statut']) and $opt['statut']) {
985 if ($id_auteur = intval($id)) {
986 $t = sql_fetsel('statut', 'spip_auteurs', "id_auteur=$id_auteur");
987 if ($t and $t['statut'] != '0minirezo') {
992 } // id = 0 => creation
1000 // Un admin complet fait ce qu'il veut
1002 if ($id == $qui['id_auteur'] && (isset($opt['statut']) and $opt['statut'])) {
1004 } elseif (isset($opt['webmestre'])
1005 and $opt['webmestre']
1006 and (defined('_ID_WEBMESTRES')
1007 or !autoriser('webmestre'))) {
1008 // et toucher au statut webmestre si il ne l'est pas lui meme
1009 // ou si les webmestres sont fixes par constante (securite)
1011 } // et modifier un webmestre si il ne l'est pas lui meme
1012 elseif (intval($id) and autoriser('webmestre', '', 0, $id) and !autoriser('webmestre')) {
1021 * Autorisation d'associer un auteur sur un objet
1023 * Il faut pouvoir modifier l'objet en question
1025 * @param string $faire Action demandée
1026 * @param string $type Type d'objet sur lequel appliquer l'action
1027 * @param int $id Identifiant de l'objet
1028 * @param array $qui Description de l'auteur demandant l'autorisation
1029 * @param array $opt Options de cette autorisation
1030 * @return bool true s'il a le droit, false sinon
1032 function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt) {
1033 return autoriser('modifier', $type, $id, $qui, $opt);
1038 * Autorisation d'upload FTP
1040 * Il faut être administrateur.
1042 * @param string $faire Action demandée
1043 * @param string $type Type d'objet sur lequel appliquer l'action
1044 * @param int $id Identifiant de l'objet
1045 * @param array $qui Description de l'auteur demandant l'autorisation
1046 * @param array $opt Options de cette autorisation
1047 * @return bool true s'il a le droit, false sinon
1049 function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) {
1050 return $qui['statut'] == '0minirezo';
1054 * Autorisation d'activer le mode debug
1056 * Il faut être administrateur.
1058 * @param string $faire Action demandée
1059 * @param string $type Type d'objet sur lequel appliquer l'action
1060 * @param int $id Identifiant de l'objet
1061 * @param array $qui Description de l'auteur demandant l'autorisation
1062 * @param array $opt Options de cette autorisation
1063 * @return bool true s'il a le droit, false sinon
1065 function autoriser_debug_dist($faire, $type, $id, $qui, $opt) {
1066 return $qui['statut'] == '0minirezo';
1070 * Liste les rubriques d'un auteur
1072 * Renvoie la liste des rubriques liées à cet auteur, independamment de son
1073 * statut (pour les admins restreints, il faut donc aussi vérifier statut)
1075 * Mémorise le resultat dans un tableau statique indéxé par les id_auteur.
1076 * On peut reinitialiser un élément en passant un 2e argument non vide
1078 * @param int $id_auteur Identifiant de l'auteur
1079 * @param bool $raz Recalculer le résultat connu pour cet auteur
1080 * @return array Liste des rubriques
1082 function liste_rubriques_auteur($id_auteur, $raz = false) {
1083 static $restreint = array();
1085 if (!$id_auteur = intval($id_auteur)) {
1089 unset($restreint[$id_auteur]);
1090 } elseif (isset($restreint[$id_auteur])) {
1091 return $restreint[$id_auteur];
1094 $rubriques = array();
1095 if ((!isset($GLOBALS['meta']['version_installee'])
1096 or $GLOBALS['meta']['version_installee'] > 16428)
1097 and $r = sql_allfetsel(
1099 'spip_auteurs_liens',
1100 'id_auteur=' . intval($id_auteur) . " AND objet='rubrique' AND id_objet!=0"
1104 $r = array_map('reset', $r);
1106 // recuperer toute la branche, au format chaine enumeration
1107 include_spip('inc/rubriques');
1108 $r = calcul_branche_in($r);
1109 $r = explode(',', $r);
1111 // passer les rubriques en index, elimine les doublons
1112 $r = array_flip($r);
1113 // recuperer les index seuls
1114 $r = array_keys($r);
1115 // combiner pour avoir un tableau id_rubrique=>id_rubrique
1116 // est-ce vraiment utile ? (on preserve la forme donnee par le code precedent)
1117 $rubriques = array_combine($r, $r);
1120 // Affecter l'auteur session le cas echeant
1121 if (isset($GLOBALS['visiteur_session']['id_auteur'])
1122 and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
1124 $GLOBALS['visiteur_session']['restreint'] = $rubriques;
1128 return $restreint[$id_auteur] = $rubriques;
1132 * Autorisation de modifier l'URL d'un objet
1134 * Il faut pouvoir modifier l'objet.
1136 * @param string $faire Action demandée
1137 * @param string $type Type d'objet sur lequel appliquer l'action
1138 * @param int $id Identifiant de l'objet
1139 * @param array $qui Description de l'auteur demandant l'autorisation
1140 * @param array $opt Options de cette autorisation
1141 * @return bool true s'il a le droit, false sinon
1143 function autoriser_modifierurl_dist($faire, $type, $id, $qui, $opt) {
1144 return autoriser('modifier', $type, $id, $qui, $opt);
1148 * Autorisation de prévisualiser une rubrique
1150 * Il faut pouvoir prévisualiser.
1152 * @param string $faire Action demandée
1153 * @param string $type Type d'objet sur lequel appliquer l'action
1154 * @param int $id Identifiant de l'objet
1155 * @param array $qui Description de l'auteur demandant l'autorisation
1156 * @param array $opt Options de cette autorisation
1157 * @return bool true s'il a le droit, false sinon
1159 function autoriser_rubrique_previsualiser_dist($faire, $type, $id, $qui, $opt) {
1160 return autoriser('previsualiser');
1164 * Autorisation d'iconifier une rubrique (mettre un logo)
1166 * Il faut pouvoir publier dans la rubrique.
1168 * @param string $faire Action demandée
1169 * @param string $type Type d'objet sur lequel appliquer l'action
1170 * @param int $id Identifiant de l'objet
1171 * @param array $qui Description de l'auteur demandant l'autorisation
1172 * @param array $opt Options de cette autorisation
1173 * @return bool true s'il a le droit, false sinon
1175 function autoriser_rubrique_iconifier_dist($faire, $type, $id, $qui, $opt) {
1176 return autoriser('publierdans', 'rubrique', $id, $qui, $opt);
1180 * Autorisation d'iconifier un auteur (mettre un logo)
1182 * Il faut un administrateur ou que l'auteur soit celui qui demande l'autorisation
1184 * @param string $faire Action demandée
1185 * @param string $type Type d'objet sur lequel appliquer l'action
1186 * @param int $id Identifiant de l'objet
1187 * @param array $qui Description de l'auteur demandant l'autorisation
1188 * @param array $opt Options de cette autorisation
1189 * @return bool true s'il a le droit, false sinon
1191 function autoriser_auteur_iconifier_dist($faire, $type, $id, $qui, $opt) {
1192 return (($id == $qui['id_auteur']) or
1193 (($qui['statut'] == '0minirezo') and !$qui['restreint']));
1197 * Autorisation d'iconifier un objet (mettre un logo)
1199 * Il faut pouvoir modifier l'objet
1201 * @param string $faire Action demandée
1202 * @param string $type Type d'objet sur lequel appliquer l'action
1203 * @param int $id Identifiant de l'objet
1204 * @param array $qui Description de l'auteur demandant l'autorisation
1205 * @param array $opt Options de cette autorisation
1206 * @return bool true s'il a le droit, false sinon
1208 function autoriser_iconifier_dist($faire, $type, $id, $qui, $opt) {
1209 // par defaut, on a le droit d'iconifier si on a le droit de modifier
1210 return autoriser('modifier', $type, $id, $qui, $opt);
1217 * Autorise toujours !
1218 * Fonction sans surprise pour permettre les tests.
1220 * @param string $faire Action demandée
1221 * @param string $type Type d'objet sur lequel appliquer l'action
1222 * @param int $id Identifiant de l'objet
1223 * @param array $qui Description de l'auteur demandant l'autorisation
1224 * @param array $opt Options de cette autorisation
1227 function autoriser_ok_dist($faire, $type, $id, $qui, $opt) {
1235 * Fonction sans surprise pour permettre les tests.
1237 * @param string $faire Action demandée
1238 * @param string $type Type d'objet sur lequel appliquer l'action
1239 * @param int $id Identifiant de l'objet
1240 * @param array $qui Description de l'auteur demandant l'autorisation
1241 * @param array $opt Options de cette autorisation
1242 * @return bool false
1244 function autoriser_niet_dist($faire, $type, $id, $qui, $opt) {
1249 * Autorisation de réparer la base de données
1251 * Il faut pouvoir la détruire (et ne pas être en cours de réinstallation)
1253 * @param string $faire Action demandée
1254 * @param string $type Type d'objet sur lequel appliquer l'action
1255 * @param int $id Identifiant de l'objet
1256 * @param array $qui Description de l'auteur demandant l'autorisation
1257 * @param array $opt Options de cette autorisation
1258 * @return bool false
1260 function autoriser_base_reparer_dist($faire, $type, $id, $qui, $opt) {
1261 if (!autoriser('detruire') or _request('reinstall')) {
1269 * Autorisation de voir l'onglet infosperso
1273 * @param string $faire Action demandée
1274 * @param string $type Type d'objet sur lequel appliquer l'action
1275 * @param int $id Identifiant de l'objet
1276 * @param array $qui Description de l'auteur demandant l'autorisation
1277 * @param array $opt Options de cette autorisation
1278 * @return bool true s'il a le droit, false sinon
1280 function autoriser_infosperso_dist($faire, $type, $id, $qui, $opt) {
1285 * Autorisation de voir le formulaire configurer_langage
1289 * @param string $faire Action demandée
1290 * @param string $type Type d'objet sur lequel appliquer l'action
1291 * @param int $id Identifiant de l'objet
1292 * @param array $qui Description de l'auteur demandant l'autorisation
1293 * @param array $opt Options de cette autorisation
1294 * @return bool true s'il a le droit, false sinon
1296 function autoriser_langage_configurer_dist($faire, $type, $id, $qui, $opt) {
1301 * Autorisation de voir l'onglet configurerlangage
1303 * Calquée sur l'autorisation de voir le formulaire configurer_langage
1305 * @param string $faire Action demandée
1306 * @param string $type Type d'objet sur lequel appliquer l'action
1307 * @param int $id Identifiant de l'objet
1308 * @param array $qui Description de l'auteur demandant l'autorisation
1309 * @param array $opt Options de cette autorisation
1310 * @return bool true s'il a le droit, false sinon
1312 function autoriser_configurerlangage_dist($faire, $type, $id, $qui, $opt) {
1313 return autoriser('configurer', '_langage', $id, $qui, $opt);
1317 * Autorisation de voir le formulaire configurer_preferences
1321 * @param string $faire Action demandée
1322 * @param string $type Type d'objet sur lequel appliquer l'action
1323 * @param int $id Identifiant de l'objet
1324 * @param array $qui Description de l'auteur demandant l'autorisation
1325 * @param array $opt Options de cette autorisation
1326 * @return bool true s'il a le droit, false sinon
1328 function autoriser_preferences_configurer_dist($faire, $type, $id, $qui, $opt) {
1333 * Autorisation de voir l'onglet configurerpreferences
1335 * Calquée sur l'autorisation de voir le formulaire configurer_preferences
1337 * @param string $faire Action demandée
1338 * @param string $type Type d'objet sur lequel appliquer l'action
1339 * @param int $id Identifiant de l'objet
1340 * @param array $qui Description de l'auteur demandant l'autorisation
1341 * @param array $opt Options de cette autorisation
1342 * @return bool true s'il a le droit, false sinon
1344 function autoriser_configurerpreferences_dist($faire, $type, $id, $qui, $opt) {
1345 return autoriser('configurer', '_preferences', $id, $qui, $opt);
1349 * Autorisation d'afficher le menu développement
1351 * Dépend de la préférences utilisateur
1353 * @param string $faire Action demandée
1354 * @param string $type Type d'objet sur lequel appliquer l'action
1355 * @param int $id Identifiant de l'objet
1356 * @param array $qui Description de l'auteur demandant l'autorisation
1357 * @param array $opt Options de cette autorisation
1358 * @return bool true s'il a le droit, false sinon
1360 function autoriser_menudeveloppement_menugrandeentree_dist($faire, $type, $id, $qui, $opt) {
1361 return (isset($GLOBALS['visiteur_session']['prefs']['activer_menudev'])
1362 and $GLOBALS['visiteur_session']['prefs']['activer_menudev'] == 'oui');
1366 * Autorisation d'afficher une grande entrée de menu
1368 * Par defaut les grandes entrees (accueil, édition, publication, etc.)
1369 * sont visibles de tous
1371 * @param string $faire Action demandée
1372 * @param string $type Type d'objet sur lequel appliquer l'action
1373 * @param int $id Identifiant de l'objet
1374 * @param array $qui Description de l'auteur demandant l'autorisation
1375 * @param array $opt Options de cette autorisation
1376 * @return bool true s'il a le droit, false sinon
1378 function autoriser_menugrandeentree_dist($faire, $type, $id, $qui, $opt) {
1383 * Autorisation de voir le menu auteurs
1387 * @param string $faire Action demandée
1388 * @param string $type Type d'objet sur lequel appliquer l'action
1389 * @param int $id Identifiant de l'objet
1390 * @param array $qui Description de l'auteur demandant l'autorisation
1391 * @param array $opt Options de cette autorisation
1392 * @return bool true s'il a le droit, false sinon
1394 function autoriser_auteurs_menu_dist($faire, $type, $id, $qui, $opt) {
1399 * Autorisation de voir le menu articles
1403 * @param string $faire Action demandée
1404 * @param string $type Type d'objet sur lequel appliquer l'action
1405 * @param int $id Identifiant de l'objet
1406 * @param array $qui Description de l'auteur demandant l'autorisation
1407 * @param array $opt Options de cette autorisation
1408 * @return bool true s'il a le droit, false sinon
1410 function autoriser_articles_menu_dist($faire, $type, $id, $qui, $opt) {
1415 * Autorisation de voir le menu rubriques
1419 * @param string $faire Action demandée
1420 * @param string $type Type d'objet sur lequel appliquer l'action
1421 * @param int $id Identifiant de l'objet
1422 * @param array $qui Description de l'auteur demandant l'autorisation
1423 * @param array $opt Options de cette autorisation
1424 * @return bool true s'il a le droit, false sinon
1426 function autoriser_rubriques_menu_dist($faire, $type, $id, $qui, $opt) {
1431 * Autorisation de voir le menu articlecreer
1433 * Il faut au moins une rubrique présente.
1435 * @param string $faire Action demandée
1436 * @param string $type Type d'objet sur lequel appliquer l'action
1437 * @param int $id Identifiant de l'objet
1438 * @param array $qui Description de l'auteur demandant l'autorisation
1439 * @param array $opt Options de cette autorisation
1440 * @return bool true s'il a le droit, false sinon
1442 function autoriser_articlecreer_menu_dist($faire, $type, $id, $qui, $opt) {
1443 return verifier_table_non_vide();
1448 * Autorisation de voir le menu auteurcreer
1450 * Il faut pouvoir créer un auteur !
1452 * @see autoriser_auteur_creer_dist()
1454 * @param string $faire Action demandée
1455 * @param string $type Type d'objet sur lequel appliquer l'action
1456 * @param int $id Identifiant de l'objet
1457 * @param array $qui Description de l'auteur demandant l'autorisation
1458 * @param array $opt Options de cette autorisation
1459 * @return bool true s'il a le droit, false sinon
1461 function autoriser_auteurcreer_menu_dist($faire, $type, $id, $qui, $opt) {
1462 return autoriser('creer', 'auteur', $id, $qui, $opt);
1466 * Autorisation de voir le menu suiviedito
1468 * Il faut être administrateur (y compris restreint).
1470 * @param string $faire Action demandée
1471 * @param string $type Type d'objet sur lequel appliquer l'action
1472 * @param int $id Identifiant de l'objet
1473 * @param array $qui Description de l'auteur demandant l'autorisation
1474 * @param array $opt Options de cette autorisation
1475 * @return bool true s'il a le droit, false sinon
1477 function autoriser_suiviedito_menu_dist($faire, $type, $id, $qui, $opt) {
1478 return $qui['statut'] == '0minirezo';
1482 * Autorisation de voir le menu synchro
1484 * Il faut être administrateur (y compris restreint).
1486 * @param string $faire Action demandée
1487 * @param string $type Type d'objet sur lequel appliquer l'action
1488 * @param int $id Identifiant de l'objet
1489 * @param array $qui Description de l'auteur demandant l'autorisation
1490 * @param array $opt Options de cette autorisation
1491 * @return bool true s'il a le droit, false sinon
1493 function autoriser_synchro_menu_dist($faire, $type, $id, $qui, $opt) {
1494 return $qui['statut'] == '0minirezo';
1498 * Autorisation de voir le menu configurer_interactions
1500 * Il faut avoir accès à la page configurer_interactions
1502 * @param string $faire Action demandée
1503 * @param string $type Type d'objet sur lequel appliquer l'action
1504 * @param int $id Identifiant de l'objet
1505 * @param array $qui Description de l'auteur demandant l'autorisation
1506 * @param array $opt Options de cette autorisation
1507 * @return bool true s'il a le droit, false sinon
1509 function autoriser_configurerinteractions_menu_dist($faire, $type, $id, $qui, $opt) {
1510 return autoriser('configurer', '_interactions', $id, $qui, $opt);
1514 * Autorisation de voir le menu configurer_langue
1516 * Il faut avoir accès à la page configurer_langue
1518 * @param string $faire Action demandée
1519 * @param string $type Type d'objet sur lequel appliquer l'action
1520 * @param int $id Identifiant de l'objet
1521 * @param array $qui Description de l'auteur demandant l'autorisation
1522 * @param array $opt Options de cette autorisation
1523 * @return bool true s'il a le droit, false sinon
1525 function autoriser_configurerlangue_menu_dist($faire, $type, $id, $qui, $opt) {
1526 return autoriser('configurer', '_langue', $id, $qui, $opt);
1530 * Autorisation de voir le menu configurer_multilinguisme
1532 * Il faut avoir accès à la page configurer_multilinguisme
1534 * @param string $faire Action demandée
1535 * @param string $type Type d'objet sur lequel appliquer l'action
1536 * @param int $id Identifiant de l'objet
1537 * @param array $qui Description de l'auteur demandant l'autorisation
1538 * @param array $opt Options de cette autorisation
1539 * @return bool true s'il a le droit, false sinon
1541 function autoriser_configurermultilinguisme_menu_dist($faire, $type, $id, $qui, $opt) {
1542 return autoriser('configurer', '_multilinguisme', $id, $qui, $opt);
1546 * Autorisation de voir le menu configurer_contenu
1548 * Il faut avoir accès à la page configurer_contenu
1550 * @param string $faire Action demandée
1551 * @param string $type Type d'objet sur lequel appliquer l'action
1552 * @param int $id Identifiant de l'objet
1553 * @param array $qui Description de l'auteur demandant l'autorisation
1554 * @param array $opt Options de cette autorisation
1555 * @return bool true s'il a le droit, false sinon
1557 function autoriser_configurercontenu_menu_dist($faire, $type, $id, $qui, $opt) {
1558 return autoriser('configurer', '_contenu', $id, $qui, $opt);
1562 * Autorisation de voir le menu configurer_avancees
1564 * Il faut avoir accès à la page configurer_avancees
1566 * @param string $faire Action demandée
1567 * @param string $type Type d'objet sur lequel appliquer l'action
1568 * @param int $id Identifiant de l'objet
1569 * @param array $qui Description de l'auteur demandant l'autorisation
1570 * @param array $opt Options de cette autorisation
1571 * @return bool true s'il a le droit, false sinon
1573 function autoriser_configureravancees_menu_dist($faire, $type, $id, $qui, $opt) {
1574 return autoriser('configurer', '_avancees', $id, $qui, $opt);
1578 * Autorisation de voir le menu admin_plugin
1580 * Il faut avoir accès à la page admin_plugin
1582 * @param string $faire Action demandée
1583 * @param string $type Type d'objet sur lequel appliquer l'action
1584 * @param int $id Identifiant de l'objet
1585 * @param array $qui Description de l'auteur demandant l'autorisation
1586 * @param array $opt Options de cette autorisation
1587 * @return bool true s'il a le droit, false sinon
1589 function autoriser_adminplugin_menu_dist($faire, $type, $id, $qui, $opt) {
1590 return autoriser('configurer', '_plugins', $id, $qui, $opt);
1594 * Autorisation de voir le menu admin_tech
1596 * Il faut avoir accès à la page admin_tech
1598 * @param string $faire Action demandée
1599 * @param string $type Type d'objet sur lequel appliquer l'action
1600 * @param int $id Identifiant de l'objet
1601 * @param array $qui Description de l'auteur demandant l'autorisation
1602 * @param array $opt Options de cette autorisation
1603 * @return bool true s'il a le droit, false sinon
1605 function autoriser_admintech_menu_dist($faire, $type, $id, $qui, $opt) {
1606 return autoriser('detruire', $type, $id, $qui, $opt);
1610 * Autorisation de purger la queue de travaux
1612 * Il faut être webmestre.
1614 * @param string $faire Action demandée
1615 * @param string $type Type d'objet sur lequel appliquer l'action
1616 * @param int $id Identifiant de l'objet
1617 * @param array $qui Description de l'auteur demandant l'autorisation
1618 * @param array $opt Options de cette autorisation
1619 * @return bool true s'il a le droit, false sinon
1621 function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt) {
1622 return autoriser('webmestre');
1627 * Autorisation l'échafaudage de squelettes en Z
1629 * Il faut être dans l'espace privé (et authentifié),
1630 * sinon il faut être webmestre (pas de fuite d'informations publiées)
1632 * @param string $faire Action demandée
1633 * @param string $type Type d'objet sur lequel appliquer l'action
1634 * @param int $id Identifiant de l'objet
1635 * @param array $qui Description de l'auteur demandant l'autorisation
1636 * @param array $opt Options de cette autorisation
1637 * @return bool true s'il a le droit, false sinon
1639 function autoriser_echafauder_dist($faire, $type, $id, $qui, $opt) {
1640 if (test_espace_prive()) {
1641 return intval($qui['id_auteur']) ?
true : false;
1643 return autoriser('webmestre', '', $id, $qui, $opt);
1649 * Retourne les identifiants d'auteurs liés à un objet
1651 * @param string $objet
1652 * @param int $id_objet
1653 * @param string|array $cond
1654 * Condition(s) supplémentaire(s) pour le where de la requête
1656 * Identifiants d'auteurs
1658 function auteurs_objet($objet, $id_objet, $cond = '') {
1659 $objet = objet_type($objet);
1661 'objet=' . sql_quote($objet),
1662 'id_objet=' . intval($id_objet)
1664 if (!empty($cond)) {
1665 if (is_array($cond)) {
1666 $where = array_merge($where, $cond);
1671 $auteurs = sql_allfetsel(
1673 'spip_auteurs_liens',
1676 if (is_array($auteurs)) {
1677 return array_map('reset', $auteurs);
1683 * Lister les auteurs d'un article
1685 * @deprecated utiliser auteurs_objets()
1686 * @param int $id_article Identifiant de l'article
1687 * @param string $cond Condition en plus dans le where de la requête
1688 * @return array|bool
1689 * - array : liste des id_auteur trouvés
1690 * - false : serveur SQL indisponible
1692 function auteurs_article($id_article, $cond = '') {
1693 return sql_allfetsel(
1695 'spip_auteurs_liens',
1696 "objet='article' AND id_objet=$id_article" . ($cond ?
" AND $cond" : '')
1702 * Tester si on est admin restreint sur une rubrique donnée
1704 * Fonction générique utilisee dans des autorisations ou assimilée
1706 * @param int $id_rubrique Identifiant de la rubrique
1707 * @return bool true si administrateur de cette rubrique, false sinon.
1709 function acces_restreint_rubrique($id_rubrique) {
1711 return (isset($GLOBALS['connect_id_rubrique'][$id_rubrique]));
1716 * Verifier qu'il existe au moins un parent
1718 * Fonction utilisee dans des autorisations des boutons / menus du prive des objets enfants (articles, breves, sites)
1720 * @param string $table la table a vérifier
1721 * @return bool true si un parent existe
1723 function verifier_table_non_vide($table = 'spip_rubriques') {
1724 static $done = array();
1725 if (!isset($done[$table])) {
1726 $done[$table] = sql_countsel($table) > 0;
1729 return $done[$table];
1733 * Détermine la possibilité de s'inscire sur le site
1735 * Pour un statut et un éventuel id_rubrique donné, indique,
1736 * à l'aide de la liste globale des statuts (tableau mode => nom du mode)
1737 * si le visiteur peut s'inscrire sur le site.
1739 * Utile pour le formulaire d'inscription.
1741 * Par défaut, seuls `6forum` et `1comite` sont possibles, les autres sont
1742 * en `false`. Pour un nouveau mode il suffit de définir l'autorisation
1745 * @param string $faire Action demandée
1746 * @param string $quoi Statut demandé
1747 * @param int $id Identifiant éventuel, par exemple de rubrique
1748 * @param array $qui Description de l'auteur demandant l'autorisation
1749 * @param array $opt Options de cette autorisation
1750 * @return bool true s'il a le droit, false sinon
1752 function autoriser_inscrireauteur_dist($faire, $quoi, $id, $qui, $opt) {
1754 $s = array_search($quoi, $GLOBALS['liste_des_statuts']);
1756 case 'info_redacteurs':
1757 return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
1758 case 'info_visiteurs':
1759 return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' or $GLOBALS['meta']['forums_publics'] == 'abo');
1767 * Autorisation à voir le phpinfo
1769 * Il faut être webmestre
1771 * @param string $faire Action demandée
1772 * @param string $type Type d'objet sur lequel appliquer l'action
1773 * @param int $id Identifiant de l'objet
1774 * @param array $qui Description de l'auteur demandant l'autorisation
1775 * @param array $opt Options de cette autorisation
1776 * @return bool true s'il a le droit, false sinon
1778 function autoriser_phpinfos($faire, $type, $id, $qui, $opt) {
1779 return autoriser('webmestre');