[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / inc / autoriser.php
index fbccc13..25aca2a 100644 (file)
@@ -3,7 +3,7 @@
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
- *  Copyright (c) 2001-2016                                                *
+ *  Copyright (c) 2001-2017                                                *
  *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
  *                                                                         *
  *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 /**
  * Gestion de l'API autoriser et fonctions d'autorisations de SPIP
  *
- * @package SPIP\Autorisations
-**/
-if (!defined('_ECRIRE_INC_VERSION')) return;
+ * @package SPIP\Core\Autorisations
+ **/
+if (!defined('_ECRIRE_INC_VERSION')) {
+       return;
+}
 
 include_spip('base/abstract_sql');
 
-/**
- * Tracer les autorisations dans tmp/spip.log pour débug ?
- */
-defined('_DEBUG_AUTORISER') || define('_DEBUG_AUTORISER', false);
-
 // Constantes surchargeables, cf. plugin autorite
 
 /**
  * Gérer les admins restreints ?
- * 
+ *
  * @todo une option à activer
  */
 defined('_ADMINS_RESTREINTS') || define('_ADMINS_RESTREINTS', true);
@@ -47,47 +44,73 @@ if ($f = find_in_path('mes_fonctions.php')) {
 
 
 if (!function_exists('autoriser')) {
-/**
- * Autoriser une action
- * 
- * Teste si une personne (par défaut le visiteur en cours) peut effectuer
- * une certaine action. Cette fonction est le point d'entrée de toutes
- * les autorisations.
- *
- * La fonction se charge d'appeler des fonctions d'autorisations spécifiques
- * aux actions demandées si elles existent. Elle cherche donc les fonctions
- * dans cet ordre :
- * - autoriser_{type}_{faire}, sinon avec _dist
- * - autoriser_{type}, sinon avec _dist
- * - autoriser_{faire}, sinon avec _dist
- * - autoriser_{defaut}, sinon avec _dist
- * 
- * Seul le premier argument est obligatoire
- *
- * @api
- * @see autoriser_dist()
- * 
- * @param string $faire
- *   une action ('modifier', 'publier'...)
- * @param string $type
- *   type d'objet ou nom de table ('article')
- * @param int $id
- *   id de l'objet sur lequel on veut agir
- * @param null|int|array $qui
- *   - si null on prend alors visiteur_session
- *   - un id_auteur (on regarde dans la base)
- *   - un tableau auteur complet, y compris [restreint]
- * @param null|array $opt
- *   options sous forme de tableau associatif
- * @return bool
- *   true si la personne peut effectuer l'action
- */
-       function autoriser($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
+       /**
+        * Autoriser une action
+        *
+        * Teste si une personne (par défaut le visiteur en cours) peut effectuer
+        * une certaine action. Cette fonction est le point d'entrée de toutes
+        * les autorisations.
+        *
+        * La fonction se charge d'appeler des fonctions d'autorisations spécifiques
+        * aux actions demandées si elles existent. Elle cherche donc les fonctions
+        * dans cet ordre :
+        *
+        * - autoriser_{type}_{faire}, sinon avec _dist
+        * - autoriser_{type}, sinon avec _dist
+        * - autoriser_{faire}, sinon avec _dist
+        * - autoriser_{defaut}, sinon avec _dist
+        *
+        * Seul le premier argument est obligatoire.
+        *
+        * @note
+        *     Le paramètre `$type` attend par défaut un type d'objet éditorial, et à ce titre,
+        *     la valeur transmise se verra appliquer la fonction 'objet_type' pour uniformiser
+        *     cette valeur.
+        *
+        *     Si ce paramètre n'a rien n'a voir avec un objet éditorial, par exemple
+        *     'statistiques', un souligné avant le terme est ajouté afin d'indiquer
+        *     explicitement à la fonction autoriser de ne pas transformer la chaîne en type
+        *     d'objet. Cela donne pour cet exemple : `autoriser('detruire', '_statistiques')`
+        *
+        * @note
+        *     Le paramètre `$type`, en plus de l'uniformisation en type d'objet, se voit retirer
+        *     tous les soulignés du terme. Ainsi le type d'objet `livre_art` deviendra `livreart`
+        *     et SPIP cherchera une fonction `autoriser_livreart_{faire}`. Ceci permet
+        *     d'éviter une possible confusion si une fonction `autoriser_livre_art` existait :
+        *     quel serait le type, quel serait l'action ?
+        *
+        *     Pour résumer, si le type d'objet éditorial a un souligné, tel que 'livre_art',
+        *     la fonction d'autorisation correspondante ne l'aura pas.
+        *     Exemple : `function autoriser_livreart_modifier_dist(...){...}`
+        *
+        * @api
+        * @see autoriser_dist()
+        *
+        * @param string $faire
+        *   une action ('modifier', 'publier'...)
+        * @param string $type
+        *   type d'objet ou nom de table ('article')
+        * @param int $id
+        *   id de l'objet sur lequel on veut agir
+        * @param null|int|array $qui
+        *   - si null on prend alors visiteur_session
+        *   - un id_auteur (on regarde dans la base)
+        *   - un tableau auteur complet, y compris [restreint]
+        * @param null|array $opt
+        *   options sous forme de tableau associatif
+        * @return bool
+        *   true si la personne peut effectuer l'action
+        */
+       function autoriser($faire, $type = '', $id = 0, $qui = null, $opt = null) {
                // Charger les fonctions d'autorisation supplementaires
                static $pipe;
-               if (!isset($pipe)) { $pipe = 1; pipeline('autoriser'); }
+               if (!isset($pipe)) {
+                       $pipe = 1;
+                       pipeline('autoriser');
+               }
 
                $args = func_get_args();
+
                return call_user_func_array('autoriser_dist', $args);
        }
 }
@@ -95,11 +118,11 @@ if (!function_exists('autoriser')) {
 
 /**
  * Autoriser une action
- * 
+ *
  * Voir autoriser() pour une description complète
- * 
+ *
  * @see autoriser()
- * 
+ *
  * @param string $faire
  *   une action ('modifier', 'publier'...)
  * @param string $type
@@ -115,126 +138,157 @@ if (!function_exists('autoriser')) {
  * @return bool
  *   true si la personne peut effectuer l'action
  */
-function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
+function autoriser_dist($faire, $type = '', $id = 0, $qui = null, $opt = null) {
 
        // Qui ? visiteur_session ?
        // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge
-       if ($qui === NULL OR $qui==='')
-         $qui = $GLOBALS['visiteur_session'] ? $GLOBALS['visiteur_session'] : array('statut' => '', 'id_auteur' =>0, 'webmestre' => 'non');
-       elseif (is_numeric($qui)) {
-               $qui = sql_fetsel("*", "spip_auteurs", "id_auteur=".$qui);
+       if ($qui === null or $qui === '') {
+               $qui = $GLOBALS['visiteur_session'] ? $GLOBALS['visiteur_session'] : array();
+               $qui = array_merge(array('statut' => '', 'id_auteur' => 0, 'webmestre' => 'non'), $qui);
+       } elseif (is_numeric($qui)) {
+               $qui = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . $qui);
        }
 
        // Admins restreints, on construit ici (pas generique mais...)
        // le tableau de toutes leurs rubriques (y compris les sous-rubriques)
-       if (_ADMINS_RESTREINTS AND is_array($qui)) {
+       if (_ADMINS_RESTREINTS and is_array($qui)) {
                $qui['restreint'] = isset($qui['id_auteur']) ? liste_rubriques_auteur($qui['id_auteur']) : array();
        }
 
-       if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id (" . (isset($qui['nom']) ? $qui['nom'] : '') . ") ?");
+       spip_log(
+               "autoriser $faire $type $id (" . (isset($qui['nom']) ? $qui['nom'] : '') . ') ?',
+               'autoriser' . _LOG_DEBUG
+       );
 
        // passer par objet_type pour avoir les alias
        // et supprimer les _
-       $type = str_replace('_','',  strncmp($type,"_",1)==0?$type:objet_type($type,false));
+       $type = str_replace('_', '', strncmp($type, '_', 1) == 0 ? $type : objet_type($type, false));
 
        // Si une exception a ete decretee plus haut dans le code, l'appliquer
        if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id])
-       AND autoriser_exception($faire,$type,$id,'verifier'))
+               and autoriser_exception($faire, $type, $id, 'verifier')
+       ) {
+               spip_log("autoriser ($faire, $type, $id, " . (isset($qui['nom']) ? $qui['nom'] : '') . ') : OK Exception', 'autoriser' . _LOG_DEBUG);
                return true;
+       }
 
        // Chercher une fonction d'autorisation
        // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist],
        // autoriser_faire[_dist], autoriser_defaut[_dist]
        $fonctions = $type
-               ? array (
-                       'autoriser_'.$type.'_'.$faire,
-                       'autoriser_'.$type.'_'.$faire.'_dist',
-                       'autoriser_'.$type,
-                       'autoriser_'.$type.'_dist',
-                       'autoriser_'.$faire,
-                       'autoriser_'.$faire.'_dist',
+               ? array(
+                       'autoriser_' . $type . '_' . $faire,
+                       'autoriser_' . $type . '_' . $faire . '_dist',
+                       'autoriser_' . $type,
+                       'autoriser_' . $type . '_dist',
+                       'autoriser_' . $faire,
+                       'autoriser_' . $faire . '_dist',
                        'autoriser_defaut',
                        'autoriser_defaut_dist'
                )
-               : array (
-                       'autoriser_'.$faire,
-                       'autoriser_'.$faire.'_dist',
+               : array(
+                       'autoriser_' . $faire,
+                       'autoriser_' . $faire . '_dist',
                        'autoriser_defaut',
                        'autoriser_defaut_dist'
                );
 
        foreach ($fonctions as $f) {
                if (function_exists($f)) {
-                       $a = $f($faire,$type,$id,$qui,$opt);
+                       $a = $f($faire, $type, $id, $qui, $opt);
                        break;
                }
        }
 
-       if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id," . (isset($qui['nom']) ? $qui['nom'] : '') . "): ".($a?'OK':'niet'));
+       spip_log(
+               "$f($faire, $type, $id, " . (isset($qui['nom']) ? $qui['nom'] : '') . ') : ' . ($a ? 'OK' : 'niet'),
+               'autoriser' . _LOG_DEBUG
+       );
 
        return $a;
 }
 
 // une globale pour aller au plus vite dans la fonction generique ci dessus
-$GLOBALS['autoriser_exception']=array();
+$GLOBALS['autoriser_exception'] = array();
 
 /**
  * Accorder une autorisation exceptionnel pour le hit en cours, ou la revoquer
  *
- * http://doc.spip.org/@autoriser_exception
+ * http://code.spip.net/@autoriser_exception
  *
- * @param string $faire   Action demandée
- * @param string $type    Type d'objet sur lequel appliquer l'action
- * @param int    $id      Identifiant de l'objet
+ * @param string $faire Action demandée
+ * @param string $type Type d'objet sur lequel appliquer l'action
+ * @param int $id Identifiant de l'objet
  * @param bool $autoriser accorder (true) ou revoquer (false)
  * @return bool
  */
-function autoriser_exception($faire,$type,$id,$autoriser=true){
+function autoriser_exception($faire, $type, $id, $autoriser = true) {
        // une static innaccessible par url pour verifier que la globale est positionnee a bon escient
        static $autorisation;
-       if ($autoriser==='verifier')
-                       return isset($autorisation[$faire][$type][$id]);
-       if ($autoriser===true)
+       if ($autoriser === 'verifier') {
+               return isset($autorisation[$faire][$type][$id]);
+       }
+       if ($autoriser === true) {
                $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true;
-       if ($autoriser===false) {
+       }
+       if ($autoriser === false) {
                unset($GLOBALS['autoriser_exception'][$faire][$type][$id]);
                unset($autorisation[$faire][$type][$id]);
        }
+
        return false;
 }
 
+
 /**
  * Autorisation par defaut
  *
  * Les admins complets OK, les autres non
  *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) {
        return
                $qui['statut'] == '0minirezo'
-               AND !$qui['restreint'];
+               and !$qui['restreint'];
 }
 
+/**
+ * Autorisation a se loger ? Retourne true pour tous les statuts sauf 5poubelle
+ * Peut etre surchargee pour interdire statut=nouveau a se connecter
+ * et forcer l'utilisation du lien de confirmation email pour valider le compte
+ *
+ * @param $faire
+ * @param $type
+ * @param $id
+ * @param $qui
+ * @param $opt
+ * @return bool
+ */
+function autoriser_loger_dist($faire, $type, $id, $qui, $opt) {
+       if ($qui['statut'] == '5poubelle') {
+               return false;
+       }
+       return true;
+}
 
 /**
- * Autorisation d'accès Ã¨ l'espace privé ?
- * 
+ * Autorisation d'accès Ã  l'espace privé ?
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) {
-       return in_array($qui['statut'], array('0minirezo', '1comite'));
+       return isset($qui['statut']) and in_array($qui['statut'], array('0minirezo', '1comite'));
 }
 
 /**
@@ -242,14 +296,14 @@ function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) {
  *
  * Accordée par defaut ceux qui accèdent à l'espace privé,
  * peut-être surchargée au cas par cas
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_creer_dist($faire, $type, $id, $qui, $opt) {
        return in_array($qui['statut'], array('0minirezo', '1comite'));
 }
@@ -257,39 +311,107 @@ function autoriser_creer_dist($faire, $type, $id, $qui, $opt) {
 /**
  * Autorisation de prévisualiser un contenu
  *
+ * @uses test_previsualiser_objet_champ()
+ * @uses decrire_token_previsu()
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) {
-       // si auteur pas autorise, NIET
-       if (strpos($GLOBALS['meta']['preview'], ",". $qui['statut'] .",")===false)
-               return false;
+
+       // Le visiteur a-t-il un statut prevu par la config ?
+       if (strpos($GLOBALS['meta']['preview'], ',' . $qui['statut'] . ',') !== false) {
+               return test_previsualiser_objet_champ($type, $id, $qui, $opt);
+       }
+
+       // A-t-on un token de prévisualisation valable ?
+       include_spip('inc/securiser_action');
+       if (decrire_token_previsu()) {
+               return true;
+       }
+
+       return false;
+}
+
+/**
+ * Teste qu'un objet éditorial peut être prévisualisé
+ *
+ * Cela permet ainsi de commander l'affichage dans l'espace prive du bouton "previsualiser"
+ * voir `prive/objets/infos/article.html` etc.
+ *
+ * Cela dépend du statut actuel de l'objet d'une part, et d'autre part de la
+ * clé `previsu` dans le tableau `statut` de la déclaration de l'objet éditorial.
+ * Cette clé `previsu` liste des statuts, séparés par des virgules,
+ * qui ont le droit d'avoir une prévisualisation. La présence de `xx/auteur` indique que pour le
+ * statut `xx`, l'auteur en cours doit être un des auteurs de l'objet éditorial en question
+ * pour que ce statut autorise la prévisualisation.
+ *
+ * Exemple pour les articles : `'previsu' => 'publie,prop,prepa/auteur',`
+ *
+ * @uses lister_tables_objets_sql()
+ *
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return boolean True si autorisé, false sinon.
+ */
+function test_previsualiser_objet_champ($type = null, $id = 0, $qui = array(), $opt = array()) {
+
        // si pas de type et statut fourni, c'est une autorisation generale => OK
-       if (!$type)
+       if (!$type) {
                return true;
+       }
 
        include_spip('base/objets');
        $infos = lister_tables_objets_sql(table_objet_sql($type));
-       if (isset($infos['statut']))
-               foreach($infos['statut'] as $c){
-                       if (isset($c['publie'])){
-                               if (!isset($c['previsu'])) return false; // pas de previsu definie => NIET
+       if (isset($infos['statut'])) {
+               foreach ($infos['statut'] as $c) {
+                       if (isset($c['publie'])) {
+                               if (!isset($c['previsu'])) {
+                                       return false;
+                               } // pas de previsu definie => NIET
                                $champ = $c['champ'];
-                               if (!isset($opt[$champ])) return false; // pas de champ passe a la demande => NIET
-                               $previsu = explode(',',$c['previsu']);
+                               if (!isset($opt[$champ])) {
+                                       return false;
+                               } // pas de champ passe a la demande => NIET
+                               $previsu = explode(',', $c['previsu']);
                                // regarder si ce statut est autorise pour l'auteur
-                               if (in_array($opt[$champ]."/auteur",$previsu)){
-                                       if (!sql_countsel("spip_auteurs_liens","id_auteur=".intval($qui['id_auteur'])." AND objet=".sql_quote($type)." AND id_objet=".intval($id)))
-                                               return false;  // pas auteur de cet objet => NIET
-                               }
-                               elseif (!in_array($opt[$champ],$previsu)) // le statut n'est pas dans ceux definis par la previsu => NIET
+                               if (in_array($opt[$champ] . '/auteur', $previsu)) {
+
+                                       // retrouver l’id_auteur qui a filé un lien de prévisu éventuellement,
+                                       // sinon l’auteur en session
+                                       include_spip('inc/securiser_action');
+                                       if ($desc = decrire_token_previsu()) {
+                                               $id_auteur = $desc['id_auteur'];
+                                       } elseif (isset($GLOBALS['visiteur_session']['id_auteur'])) {
+                                               $id_auteur = intval($GLOBALS['visiteur_session']['id_auteur']);
+                                       } else {
+                                               $id_auteur = null;
+                                       }
+
+                                       if (!$id_auteur) {
+                                               return false;
+                                       } elseif(autoriser('previsualiser' . $opt[$champ], $type, '', $id_auteur)) {
+                                               // dans ce cas (admin en general), pas de filtrage sur ce statut
+                                       } elseif (!sql_countsel(
+                                               'spip_auteurs_liens',
+                                               'id_auteur=' . intval($id_auteur) . ' AND objet=' . sql_quote($type) . ' AND id_objet=' . intval($id)
+                                       )) {
+                                               return false;
+                                       } // pas auteur de cet objet => NIET
+                               } elseif (!in_array($opt[$champ], $previsu)) {
+                                       // le statut n'est pas dans ceux definis par la previsu => NIET
                                        return false;
+                               }
                        }
                }
+       }
+
        return true;
 }
 
@@ -297,45 +419,102 @@ function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation de changer de langue un contenu
  *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_changerlangue_dist($faire, $type, $id, $qui, $opt) {
-       return autoriser('modifier',$type,$id,$qui,$opt);
+       $multi_objets = explode(',', lire_config('multi_objets'));
+       $gerer_trad_objets = explode(',', lire_config('gerer_trad_objets'));
+       $table = table_objet_sql($type);
+       if (in_array($table, $multi_objets)
+               or in_array($table, $gerer_trad_objets)) { // affichage du formulaire si la configuration l'accepte
+               $multi_secteurs = lire_config('multi_secteurs');
+               $champs = objet_info($type, 'field');
+               if ($multi_secteurs == 'oui'
+                       and array_key_exists('id_rubrique', $champs)) {
+                       // multilinguisme par secteur et objet rattaché à une rubrique
+                       $primary = id_table_objet($type);
+                       if ($table != 'spip_rubriques') {
+                               $id_rubrique = sql_getfetsel('id_rubrique', "$table", "$primary=" . intval($id));
+                       } else {
+                               $id_rubrique = $id;
+                       }
+                       $id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique));
+                       if (!$id_secteur > 0) {
+                               $id_secteur = $id_rubrique;
+                       }
+                       $langue_secteur = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_secteur));
+                       $langue_objet = sql_getfetsel('lang', "$table", "$primary=" . intval($id));
+                       if ($langue_secteur != $langue_objet) {
+                               // configuration incohérente, on laisse l'utilisateur corriger la situation
+                               return true;
+                       }
+                       if ($table != 'spip_rubriques') { // le choix de la langue se fait seulement sur les rubriques
+                               return false;
+                       } else {
+                               $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id));
+                               if ($id_parent != 0) {
+                                       // sous-rubriques : pas de choix de langue
+                                       return false;
+                               }
+                       }
+               }
+       } else {
+               return false;
+       }
+
+       return autoriser('modifier', $type, $id, $qui, $opt);
+}
+
+/**
+ * Autorisation de changer le lien de traduction
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_changertraduction_dist($faire, $type, $id, $qui, $opt) {
+       return autoriser('modifier', $type, $id, $qui, $opt);
 }
 
 /**
  * Autorisation de changer la date d'un contenu
  *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_dater_dist($faire, $type, $id, $qui, $opt) {
-       if (!isset($opt['statut'])){
+       if (!isset($opt['statut'])) {
                $table = table_objet($type);
-               $trouver_table = charger_fonction('trouver_table','base');
+               $trouver_table = charger_fonction('trouver_table', 'base');
                $desc = $trouver_table($table);
-               if (!$desc)
+               if (!$desc) {
                        return false;
-               if (isset($desc['field']['statut'])){
-                       $statut = sql_getfetsel("statut", $desc['table'], id_table_objet($type)."=".intval($id));
                }
-               else
-                       $statut = 'publie'; // pas de statut => publie
-       }
-       else
+               if (isset($desc['field']['statut'])) {
+                       $statut = sql_getfetsel('statut', $desc['table'], id_table_objet($type) . '=' . intval($id));
+               } else {
+                       $statut = 'publie';
+               } // pas de statut => publie
+       } else {
                $statut = $opt['statut'];
+       }
 
        if ($statut == 'publie'
-        OR ($statut == 'prop' AND $type=='article' AND $GLOBALS['meta']["post_dates"] == "non"))
+               or ($statut == 'prop' and $type == 'article' and $GLOBALS['meta']['post_dates'] == 'non')) {
                return autoriser('modifier', $type, $id);
+       }
+
        return false;
 }
 
@@ -346,53 +525,53 @@ function autoriser_dater_dist($faire, $type, $id, $qui, $opt) {
  * Par défaut, il faut l'autorisation de modifier le contenu
  *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_instituer_dist($faire, $type, $id, $qui, $opt) {
-       return autoriser('modifier',$type,$id,$qui,$opt);
+       return autoriser('modifier', $type, $id, $qui, $opt);
 }
 
 /**
  * Autorisation de publier dans une rubrique $id
  *
  * Il faut être administrateur ou administrateur restreint de la rubrique
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) {
        return
                ($qui['statut'] == '0minirezo')
-               AND (
-                       !$qui['restreint'] OR !$id
-                       OR in_array($id, $qui['restreint'])
+               and (
+                       !$qui['restreint'] or !$id
+                       or in_array($id, $qui['restreint'])
                );
 }
 
- /**
+/**
  * Autorisation de créer une rubrique
  *
  * Il faut être administrateur pour pouvoir publier à la racine
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_rubrique_creer_dist($faire, $type, $id, $qui, $opt) {
-       return 
-               ((!$id AND autoriser('defaut',null,null,$qui, $opt))
-               OR $id AND autoriser('creerrubriquedans','rubrique', $id, $qui, $opt)
+       return
+               ((!$id and autoriser('defaut', null, null, $qui, $opt))
+                       or $id and autoriser('creerrubriquedans', 'rubrique', $id, $qui, $opt)
                );
 }
 
@@ -400,38 +579,38 @@ function autoriser_rubrique_creer_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation de créer une sous rubrique dans une rubrique $id
  *
  * Il faut être administrateur et pouvoir publier dans la rubrique
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $opt) {
        return
-               ($id OR ($qui['statut'] == '0minirezo' AND !$qui['restreint']))
-               AND autoriser('voir','rubrique',$id)
-               AND autoriser('publierdans','rubrique',$id);
+               ($id or ($qui['statut'] == '0minirezo' and !$qui['restreint']))
+               and autoriser('voir', 'rubrique', $id)
+               and autoriser('publierdans', 'rubrique', $id);
 }
 
 /**
  * Autorisation de créer un article dans une rubrique $id
  *
- * Il faut pouvoir voir la rubrique
- * 
+ * Il faut pouvoir voir la rubrique et pouvoir créer un article…
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) {
        return
                $id
-               AND autoriser('voir','rubrique',$id)
-               AND autoriser('creer', 'article');
+               and autoriser('voir', 'rubrique', $id)
+               and autoriser('creer', 'article');
 }
 
 
@@ -439,14 +618,14 @@ function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt
  * Autorisation de modifier une rubrique $id
  *
  * Il faut pouvoir publier dans cette rubrique
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
        return
                autoriser('publierdans', 'rubrique', $id, $qui, $opt);
@@ -456,30 +635,38 @@ function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation de supprimer une rubrique $id
  *
  * Il faut quelle soit vide (pas d'enfant) et qu'on ait le droit de la modifier
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_rubrique_supprimer_dist($faire, $type, $id, $qui, $opt) {
-       if (!$id = intval($id))
+       if (!$id = intval($id)) {
                return false;
+       }
 
-       if (sql_countsel('spip_rubriques', "id_parent=".intval($id)))
+       if (sql_countsel('spip_rubriques', 'id_parent=' . intval($id))) {
                return false;
+       }
 
-       if (sql_countsel('spip_articles', "id_rubrique=".intval($id)." AND (statut<>'poubelle')"))
+       if (sql_countsel('spip_articles', 'id_rubrique=' . intval($id) . " AND (statut<>'poubelle')")) {
                return false;
+       }
 
-       $compte = pipeline('objet_compte_enfants',array('args'=>array('objet'=>'rubrique','id_objet'=>$id),'data'=>array()));
-       foreach($compte as $objet => $n)
-               if ($n)
+       $compte = pipeline(
+               'objet_compte_enfants',
+               array('args' => array('objet' => 'rubrique', 'id_objet' => $id), 'data' => array())
+       );
+       foreach ($compte as $objet => $n) {
+               if ($n) {
                        return false;
+               }
+       }
 
-       return autoriser('modifier','rubrique',$id);
+       return autoriser('modifier', 'rubrique', $id);
 }
 
 
@@ -488,48 +675,45 @@ function autoriser_rubrique_supprimer_dist($faire, $type, $id, $qui, $opt) {
  *
  * Il faut pouvoir publier dans le parent
  * ou, si on change le statut en proposé ou préparation être auteur de l'article
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) {
-       $r = sql_fetsel("id_rubrique,statut", "spip_articles", "id_article=".sql_quote($id));
-
-       if (!function_exists('auteurs_article'))
-               include_spip('inc/auth'); // pour auteurs_article si espace public
+       $r = sql_fetsel('id_rubrique,statut', 'spip_articles', 'id_article=' . sql_quote($id));
 
        return
                $r
-               AND
+               and
                (
                        autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt)
-                       OR (
-                               (!isset($opt['statut']) OR $opt['statut']!=='publie')
-                               AND in_array($qui['statut'], array('0minirezo', '1comite'))
-                               AND in_array($r['statut'], array('prop','prepa', 'poubelle'))
-                               AND auteurs_article($id, "id_auteur=".$qui['id_auteur'])
+                       or (
+                               (!isset($opt['statut']) or $opt['statut'] !== 'publie')
+                               and in_array($qui['statut'], array('0minirezo', '1comite'))
+                               and in_array($r['statut'], array('prop', 'prepa', 'poubelle'))
+                               and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur'])
                        )
                );
 }
 
- /**
+/**
  * Autorisation de créer un article
  *
  * Il faut qu'une rubrique existe et être au moins rédacteur
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) {
-       return (sql_countsel('spip_rubriques')>0 AND in_array($qui['statut'], array('0minirezo', '1comite')));
+       return (sql_countsel('spip_rubriques') > 0 and in_array($qui['statut'], array('0minirezo', '1comite')));
 }
 
 /**
@@ -537,25 +721,29 @@ function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) {
  *
  * Il faut être admin ou auteur de l'article, sinon il faut que l'article
  * soit publié ou proposé.
- * 
+ *
  * Peut-être appelée sans $id, mais avec un $opt['statut'] pour tester
  * la liste des status autorisés en fonction de $qui['statut']
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
  */
-function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt){
-       if ($qui['statut'] == '0minirezo') return true;
+function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt) {
+       if ($qui['statut'] == '0minirezo') {
+               return true;
+       }
        // cas des articles : depend du statut de l'article et de l'auteur
-       if (isset($opt['statut']))
+       if (isset($opt['statut'])) {
                $statut = $opt['statut'];
-       else {
-               if (!$id) return false;
-               $statut = sql_getfetsel("statut", "spip_articles", "id_article=".intval($id));
+       } else {
+               if (!$id) {
+                       return false;
+               }
+               $statut = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id));
        }
 
        return
@@ -563,10 +751,10 @@ function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt){
                // seuls les propose et publies sont visibles
                in_array($statut, array('prop', 'publie'))
                // sinon si on est auteur, on a le droit de le voir, evidemment !
-               OR
-               ($id AND $qui['id_auteur']
-                    AND (function_exists('auteurs_article') OR include_spip('inc/auth'))
-                    AND auteurs_article($id, "id_auteur=".$qui['id_auteur']));
+               or
+               ($id
+                       and $qui['id_auteur']
+                       and auteurs_objet('article', $id, 'id_auteur=' . $qui['id_auteur']));
 }
 
 
@@ -574,24 +762,28 @@ function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt){
  * Autorisation de voir un objet
  *
  * Tout est visible par défaut, sauf les auteurs où il faut au moins être rédacteur.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
        # securite, mais on aurait pas du arriver ici !
-       if (function_exists($f='autoriser_'.$type.'_voir') OR function_exists($f='autoriser_'.$type.'_voir_dist')){
+       if (function_exists($f = 'autoriser_' . $type . '_voir')
+               or function_exists($f = 'autoriser_' . $type . '_voir_dist')) {
                return $f($faire, $type, $id, $qui, $opt);
        }
 
-       if ($qui['statut'] == '0minirezo') return true;
+       if ($qui['statut'] == '0minirezo') {
+               return true;
+       }
        // admins et redacteurs peuvent voir un auteur
-       if ($type == 'auteur')
+       if ($type == 'auteur') {
                return in_array($qui['statut'], array('0minirezo', '1comite'));
+       }
        // sinon par defaut tout est visible
        // sauf cas particuliers traites separemment (ie article)
        return true;
@@ -603,103 +795,109 @@ function autoriser_voir_dist($faire, $type, $id, $qui, $opt) {
  *
  * Est-on webmestre ? Signifie qu'on n'a même pas besoin de passer par ftp
  * pour modifier les fichiers, cf. notamment inc/admin
- * 
+ *
  * Soit la liste des webmestres est définie via une constante _ID_WEBMESTRES,
  * soit on regarde l'état "webmestre" de l'auteur
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) {
        return
-               (defined('_ID_WEBMESTRES')?
+               (defined('_ID_WEBMESTRES') ?
                        in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES))
-                       :$qui['webmestre']=='oui')
-               AND $qui['statut'] == '0minirezo'
-               AND !$qui['restreint']
-               ;
+                       : $qui['webmestre'] == 'oui')
+               and $qui['statut'] == '0minirezo'
+               and !$qui['restreint'];
 }
 
 /**
  * Autorisation Configurer le site
  *
  * Il faut être administrateur complet
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_configurer_dist($faire, $type, $id, $qui, $opt) {
        return
                $qui['statut'] == '0minirezo'
-               AND !$qui['restreint']
-               ;
+               and !$qui['restreint'];
 }
 
 /**
  * Autorisation de sauvegarder la base de données
  *
  * Il faut être administrateur (y compris restreint)
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_sauvegarder_dist($faire, $type, $id, $qui, $opt) {
        return
-               $qui['statut'] == '0minirezo'
-               ;
+               $qui['statut'] == '0minirezo';
 }
 
 /**
  * Autorisation d'effacer la base de données
  *
  * Il faut être webmestre
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_detruire_dist($faire, $type, $id, $qui, $opt) {
        return
                autoriser('webmestre', null, null, $qui, $opt);
 }
 
 /**
- * Autorisation de prévisialiser un auteur
+ * Autorisation de prévisualiser un auteur
  *
  * Il faut être administrateur ou que l'auteur à prévisualiser
  * ait au moins publié un article
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) {
        // les admins peuvent "previsualiser" une page auteur
        if ($qui['statut'] == '0minirezo'
-               AND !$qui['restreint']) return true;
+               and !$qui['restreint']
+       ) {
+               return true;
+       }
        // "Voir en ligne" si l'auteur a un article publie
-       $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));
+       $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)
+       );
+
        return $n ? true : false;
 }
 
+
 /**
  * Autorisation de créer un auteur
  *
@@ -711,18 +909,18 @@ function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) {
  *     d'un auteur, son statut est 'poubelle'. C'est l'autorisation
  *     de modifier qui permet de changer les informations sensibles
  *     (statut, login, pass, etc.) à l'institution.
- * 
+ *
  * @see auteur_inserer()
  * @see auteur_instituer()
- * @see autoriser_auteur_modifier_dist() 
- * 
+ * @see autoriser_auteur_modifier_dist()
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) {
        return ($qui['statut'] == '0minirezo');
 }
@@ -734,73 +932,88 @@ function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) {
  * Attention tout depend de ce qu'on veut modifier. Il faut être au moins
  * rédacteur, mais on ne peut pas promouvoir (changer le statut) un auteur
  * avec des droits supérieurs au sien.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
 
        // Ni admin ni redacteur => non
-       if (!in_array($qui['statut'], array('0minirezo', '1comite')))
+       if (!in_array($qui['statut'], array('0minirezo', '1comite'))) {
                return false;
+       }
 
        // Un redacteur peut modifier ses propres donnees mais ni son login/email
        // ni son statut (qui sont le cas echeant passes comme option)
        if ($qui['statut'] == '1comite') {
-               if ($opt['webmestre'])
+               if (!empty($opt['webmestre'])) {
                        return false;
-               elseif ($opt['statut'] OR $opt['restreintes'] OR $opt['email'])
+               } elseif (
+                       !empty($opt['statut'])
+                       or !empty($opt['restreintes'])
+                       or !empty($opt['email'])
+               ) {
                        return false;
-               elseif ($id == $qui['id_auteur'])
+               } elseif ($id == $qui['id_auteur']) {
                        return true;
-               else
+               } else {
                        return false;
+               }
        }
 
        // Un admin restreint peut modifier/creer un auteur non-admin mais il
        // n'a le droit ni de le promouvoir admin, ni de changer les rubriques
        if ($qui['restreint']) {
-               if ($opt['webmestre'])
+               if (isset($opt['webmestre']) and $opt['webmestre']) {
                        return false;
-               elseif ($opt['statut'] == '0minirezo' OR $opt['restreintes'])
+               } elseif ((isset($opt['statut']) and ($opt['statut'] == '0minirezo'))
+                       or (isset($opt['restreintes']) and $opt['restreintes'])
+               ) {
                        return false;
-               else {
+               else {
                        if ($id == $qui['id_auteur']) {
-                               if ($opt['statut'])
+                               if (isset($opt['statut']) and $opt['statut']) {
                                        return false;
-                               else
+                               } else {
                                        return true;
-                       }
-                       else if ($id_auteur = intval($id)) {
-                               $t = sql_fetsel("statut", "spip_auteurs", "id_auteur=$id_auteur");
-                               if ($t AND $t['statut'] != '0minirezo')
+                               }
+                       } else {
+                               if ($id_auteur = intval($id)) {
+                                       $t = sql_fetsel('statut', 'spip_auteurs', "id_auteur=$id_auteur");
+                                       if ($t and $t['statut'] != '0minirezo') {
+                                               return true;
+                                       } else {
+                                               return false;
+                                       }
+                               } // id = 0 => creation
+                               else {
                                        return true;
-                               else
-                                       return false;
+                               }
                        }
-                       // id = 0 => creation
-                       else
-                               return true;
                }
        }
 
-       // Un admin complet fait ce qu'elle veut
+       // Un admin complet fait ce qu'il veut
        // sauf se degrader
-       if ($id == $qui['id_auteur'] && $opt['statut'])
+       if ($id == $qui['id_auteur'] && (isset($opt['statut']) and $opt['statut'])) {
                return false;
-       // et toucher au statut webmestre si il ne l'est pas lui meme
-       // ou si les webmestres sont fixes par constante (securite)
-       elseif (isset($opt['webmestre']) AND $opt['webmestre'] AND (defined('_ID_WEBMESTRES') OR !autoriser('webmestre')))
+       } elseif (isset($opt['webmestre'])
+                               and $opt['webmestre']
+                               and (defined('_ID_WEBMESTRES')
+                               or !autoriser('webmestre'))) {
+               // et toucher au statut webmestre si il ne l'est pas lui meme
+               // ou si les webmestres sont fixes par constante (securite)
                return false;
-       // et modifier un webmestre si il ne l'est pas lui meme
-       elseif (intval($id) AND autoriser('webmestre','',0,$id) AND !autoriser('webmestre'))
+       // et modifier un webmestre si il ne l'est pas lui meme
+       elseif (intval($id) and autoriser('webmestre', '', 0, $id) and !autoriser('webmestre')) {
                return false;
-       else
+       } else {
                return true;
+       }
 }
 
 
@@ -808,15 +1021,15 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation d'associer un auteur sur un objet
  *
  * Il faut pouvoir modifier l'objet en question
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt){
+ **/
+function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('modifier', $type, $id, $qui, $opt);
 }
 
@@ -825,14 +1038,14 @@ function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt){
  * Autorisation d'upload FTP
  *
  * Il faut être administrateur.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) {
        return $qui['statut'] == '0minirezo';
 }
@@ -841,14 +1054,14 @@ function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation d'activer le mode debug
  *
  * Il faut être administrateur.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_debug_dist($faire, $type, $id, $qui, $opt) {
        return $qui['statut'] == '0minirezo';
 }
@@ -861,29 +1074,39 @@ function autoriser_debug_dist($faire, $type, $id, $qui, $opt) {
  *
  * Mémorise le resultat dans un tableau statique indéxé par les id_auteur.
  * On peut reinitialiser un élément en passant un 2e argument non vide
- * 
- * @param int  $id_auteur Identifiant de l'auteur
- * @param bool $raz       Recalculer le résultat connu pour cet auteur
+ *
+ * @param int $id_auteur Identifiant de l'auteur
+ * @param bool $raz Recalculer le résultat connu pour cet auteur
  * @return array          Liste des rubriques
-**/
-function liste_rubriques_auteur($id_auteur, $raz=false) {
+ **/
+function liste_rubriques_auteur($id_auteur, $raz = false) {
        static $restreint = array();
 
-       if (!$id_auteur = intval($id_auteur)) return array();
-       if ($raz) unset($restreint[$id_auteur]);
-       elseif (isset($restreint[$id_auteur])) return $restreint[$id_auteur];
+       if (!$id_auteur = intval($id_auteur)) {
+               return array();
+       }
+       if ($raz) {
+               unset($restreint[$id_auteur]);
+       } elseif (isset($restreint[$id_auteur])) {
+               return $restreint[$id_auteur];
+       }
 
        $rubriques = array();
-       if (
-               (!isset($GLOBALS['meta']['version_installee']) OR $GLOBALS['meta']['version_installee']>16428)
-         AND $r = sql_allfetsel('id_objet', 'spip_auteurs_liens', "id_auteur=".intval($id_auteur)." AND objet='rubrique' AND id_objet!=0")
-         AND count($r)) {
-               $r = array_map('reset',$r);
+       if ((!isset($GLOBALS['meta']['version_installee'])
+               or $GLOBALS['meta']['version_installee'] > 16428)
+               and $r = sql_allfetsel(
+                       'id_objet',
+                       'spip_auteurs_liens',
+                       'id_auteur=' . intval($id_auteur) . " AND objet='rubrique' AND id_objet!=0"
+               )
+               and count($r)
+       ) {
+               $r = array_map('reset', $r);
 
                // recuperer toute la branche, au format chaine enumeration
                include_spip('inc/rubriques');
                $r = calcul_branche_in($r);
-               $r = explode(',',$r);
+               $r = explode(',', $r);
 
                // passer les rubriques en index, elimine les doublons
                $r = array_flip($r);
@@ -891,13 +1114,15 @@ function liste_rubriques_auteur($id_auteur, $raz=false) {
                $r = array_keys($r);
                // combiner pour avoir un tableau id_rubrique=>id_rubrique
                // est-ce vraiment utile ? (on preserve la forme donnee par le code precedent)
-               $rubriques = array_combine($r,$r);
+               $rubriques = array_combine($r, $r);
        }
 
        // Affecter l'auteur session le cas echeant
        if (isset($GLOBALS['visiteur_session']['id_auteur'])
-         AND $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur)
+               and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
+       ) {
                $GLOBALS['visiteur_session']['restreint'] = $rubriques;
+       }
 
 
        return $restreint[$id_auteur] = $rubriques;
@@ -907,14 +1132,14 @@ function liste_rubriques_auteur($id_auteur, $raz=false) {
  * Autorisation de modifier l'URL d'un objet
  *
  * Il faut pouvoir modifier l'objet.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_modifierurl_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('modifier', $type, $id, $qui, $opt);
 }
@@ -923,15 +1148,15 @@ function autoriser_modifierurl_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation de prévisualiser une rubrique
  *
  * Il faut pouvoir prévisualiser.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_rubrique_previsualiser_dist($faire,$type,$id,$qui,$opt){
+ **/
+function autoriser_rubrique_previsualiser_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('previsualiser');
 }
 
@@ -939,15 +1164,15 @@ function autoriser_rubrique_previsualiser_dist($faire,$type,$id,$qui,$opt){
  * Autorisation d'iconifier une rubrique (mettre un logo)
  *
  * Il faut pouvoir publier dans la rubrique.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_rubrique_iconifier_dist($faire,$type,$id,$qui,$opt){
+ **/
+function autoriser_rubrique_iconifier_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('publierdans', 'rubrique', $id, $qui, $opt);
 }
 
@@ -955,32 +1180,32 @@ function autoriser_rubrique_iconifier_dist($faire,$type,$id,$qui,$opt){
  * Autorisation d'iconifier un auteur (mettre un logo)
  *
  * Il faut un administrateur ou que l'auteur soit celui qui demande l'autorisation
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_auteur_iconifier_dist($faire,$type,$id,$qui,$opt){
- return (($id == $qui['id_auteur']) OR
-               (($qui['statut'] == '0minirezo') AND !$qui['restreint']));
+ **/
+function autoriser_auteur_iconifier_dist($faire, $type, $id, $qui, $opt) {
+       return (($id == $qui['id_auteur']) or
+               (($qui['statut'] == '0minirezo') and !$qui['restreint']));
 }
 
 /**
  * Autorisation d'iconifier un objet (mettre un logo)
  *
  * Il faut pouvoir modifier l'objet
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_iconifier_dist($faire,$type,$id,$qui,$opt){
+ **/
+function autoriser_iconifier_dist($faire, $type, $id, $qui, $opt) {
        // par defaut, on a le droit d'iconifier si on a le droit de modifier
        return autoriser('modifier', $type, $id, $qui, $opt);
 }
@@ -991,46 +1216,51 @@ function autoriser_iconifier_dist($faire,$type,$id,$qui,$opt){
  *
  * Autorise toujours !
  * Fonction sans surprise pour permettre les tests.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true
-**/
-function autoriser_ok_dist($faire, $type, $id, $qui, $opt) { return true; }
+ **/
+function autoriser_ok_dist($faire, $type, $id, $qui, $opt) {
+       return true;
+}
 
 /**
  * Autorisation NIET
  *
  * Refuse toujours !
  * Fonction sans surprise pour permettre les tests.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          false
-**/
-function autoriser_niet_dist($faire, $type, $id, $qui, $opt) { return false; }
+ **/
+function autoriser_niet_dist($faire, $type, $id, $qui, $opt) {
+       return false;
+}
 
 /**
  * Autorisation de réparer la base de données
  *
  * Il faut pouvoir la détruire (et ne pas être en cours de réinstallation)
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          false
-**/
+ **/
 function autoriser_base_reparer_dist($faire, $type, $id, $qui, $opt) {
-       if (!autoriser('detruire') OR _request('reinstall'))
+       if (!autoriser('detruire') or _request('reinstall')) {
                return false;
+       }
 
        return true;
 }
@@ -1039,15 +1269,15 @@ function autoriser_base_reparer_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation de voir l'onglet infosperso
  *
  * Toujours OK
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_infosperso_dist($faire,$type,$id,$qui,$opt) {
+ **/
+function autoriser_infosperso_dist($faire, $type, $id, $qui, $opt) {
        return true;
 }
 
@@ -1055,15 +1285,15 @@ function autoriser_infosperso_dist($faire,$type,$id,$qui,$opt) {
  * Autorisation de voir le formulaire configurer_langage
  *
  * Toujours OK
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_langage_configurer_dist($faire,$type,$id,$qui,$opt) {
+ **/
+function autoriser_langage_configurer_dist($faire, $type, $id, $qui, $opt) {
        return true;
 }
 
@@ -1071,15 +1301,15 @@ function autoriser_langage_configurer_dist($faire,$type,$id,$qui,$opt) {
  * Autorisation de voir l'onglet configurerlangage
  *
  * Calquée sur l'autorisation de voir le formulaire configurer_langage
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_configurerlangage_dist($faire,$type,$id,$qui,$opt) {
+ **/
+function autoriser_configurerlangage_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('configurer', '_langage', $id, $qui, $opt);
 }
 
@@ -1087,15 +1317,15 @@ function autoriser_configurerlangage_dist($faire,$type,$id,$qui,$opt) {
  * Autorisation de voir le formulaire configurer_preferences
  *
  * Toujours OK
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_preferences_configurer_dist($faire,$type,$id,$qui,$opt) {
+ **/
+function autoriser_preferences_configurer_dist($faire, $type, $id, $qui, $opt) {
        return true;
 }
 
@@ -1103,90 +1333,131 @@ function autoriser_preferences_configurer_dist($faire,$type,$id,$qui,$opt) {
  * Autorisation de voir l'onglet configurerpreferences
  *
  * Calquée sur l'autorisation de voir le formulaire configurer_preferences
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_configurerpreferences_dist($faire,$type,$id,$qui,$opt) {
+ **/
+function autoriser_configurerpreferences_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('configurer', '_preferences', $id, $qui, $opt);
 }
 
+/**
+ * Autorisation d'afficher le menu développement
+ *
+ * Dépend de la préférences utilisateur
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_menudeveloppement_menugrandeentree_dist($faire, $type, $id, $qui, $opt) {
+       return (isset($GLOBALS['visiteur_session']['prefs']['activer_menudev'])
+               and $GLOBALS['visiteur_session']['prefs']['activer_menudev'] == 'oui');
+}
+
+/**
+ * Autorisation d'afficher une grande entrée de menu
+ *
+ * Par defaut les grandes entrees (accueil, édition, publication, etc.)
+ * sont visibles de tous
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_menugrandeentree_dist($faire, $type, $id, $qui, $opt) {
+       return true;
+}
+
 /**
  * Autorisation de voir le menu auteurs
  *
  * Toujours OK
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_auteurs_menu_dist($faire, $type, $id, $qui, $opt){return true;}
+ **/
+function autoriser_auteurs_menu_dist($faire, $type, $id, $qui, $opt) {
+       return true;
+}
 
 /**
  * Autorisation de voir le menu articles
  *
  * Toujours OK
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_articles_menu_dist($faire, $type, $id, $qui, $opt){return true;}
+ **/
+function autoriser_articles_menu_dist($faire, $type, $id, $qui, $opt) {
+       return true;
+}
 
 /**
  * Autorisation de voir le menu rubriques
  *
  * Toujours OK
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_rubriques_menu_dist($faire, $type, $id, $qui, $opt){return true;}
+ **/
+function autoriser_rubriques_menu_dist($faire, $type, $id, $qui, $opt) {
+       return true;
+}
 
 /**
- * Autorisation de voir le menu articlecreer 
+ * Autorisation de voir le menu articlecreer
  *
  * Il faut au moins une rubrique présente.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_articlecreer_menu_dist($faire, $type, $id, $qui, $opt){
+ **/
+function autoriser_articlecreer_menu_dist($faire, $type, $id, $qui, $opt) {
        return verifier_table_non_vide();
 }
 
+
 /**
  * Autorisation de voir le menu auteurcreer
  *
  * Il faut pouvoir créer un auteur !
- * 
+ *
  * @see autoriser_auteur_creer_dist()
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
+ **/
 function autoriser_auteurcreer_menu_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('creer', 'auteur', $id, $qui, $opt);
 }
@@ -1195,47 +1466,159 @@ function autoriser_auteurcreer_menu_dist($faire, $type, $id, $qui, $opt) {
  * Autorisation de voir le menu suiviedito
  *
  * Il faut être administrateur (y compris restreint).
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_suiviedito_menu_dist($faire, $type, $id, $qui, $opt){
-       return $qui['statut']=='0minirezo';
+ **/
+function autoriser_suiviedito_menu_dist($faire, $type, $id, $qui, $opt) {
+       return $qui['statut'] == '0minirezo';
 }
 
 /**
  * Autorisation de voir le menu synchro
  *
  * Il faut être administrateur (y compris restreint).
- * 
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_synchro_menu_dist($faire, $type, $id, $qui, $opt) {
+       return $qui['statut'] == '0minirezo';
+}
+
+/**
+ * Autorisation de voir le menu configurer_interactions
+ *
+ * Il faut avoir accès à la page configurer_interactions
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_configurerinteractions_menu_dist($faire, $type, $id, $qui, $opt) {
+    return autoriser('configurer', '_interactions', $id, $qui, $opt);
+}
+
+/**
+ * Autorisation de voir le menu configurer_langue
+ *
+ * Il faut avoir accès à la page configurer_langue
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_configurerlangue_menu_dist($faire, $type, $id, $qui, $opt) {
+    return autoriser('configurer', '_langue', $id, $qui, $opt);
+}
+
+/**
+ * Autorisation de voir le menu configurer_multilinguisme
+ *
+ * Il faut avoir accès à la page configurer_multilinguisme
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_configurermultilinguisme_menu_dist($faire, $type, $id, $qui, $opt) {
+    return autoriser('configurer', '_multilinguisme', $id, $qui, $opt);
+}
+
+/**
+ * Autorisation de voir le menu configurer_contenu
+ *
+ * Il faut avoir accès à la page configurer_contenu
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_configurercontenu_menu_dist($faire, $type, $id, $qui, $opt) {
+    return autoriser('configurer', '_contenu', $id, $qui, $opt);
+}
+
+/**
+ * Autorisation de voir le menu configurer_avancees
+ *
+ * Il faut avoir accès à la page configurer_avancees
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_configureravancees_menu_dist($faire, $type, $id, $qui, $opt) {
+    return autoriser('configurer', '_avancees', $id, $qui, $opt);
+}
+
+/**
+ * Autorisation de voir le menu admin_plugin
+ *
+ * Il faut avoir accès à la page admin_plugin
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_synchro_menu_dist($faire, $type, $id, $qui, $opt){
-       return $qui['statut']=='0minirezo';
+ **/
+function autoriser_adminplugin_menu_dist($faire, $type, $id, $qui, $opt) {
+    return autoriser('configurer', '_plugins', $id, $qui, $opt);
+}
+
+/**
+ * Autorisation de voir le menu admin_tech
+ *
+ * Il faut avoir accès à la page admin_tech
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_admintech_menu_dist($faire, $type, $id, $qui, $opt) {
+    return autoriser('detruire', $type, $id, $qui, $opt);
 }
 
 /**
  * Autorisation de purger la queue de travaux
  *
  * Il faut être webmestre.
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt){
+ **/
+function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt) {
        return autoriser('webmestre');
 }
 
@@ -1245,98 +1628,153 @@ function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt){
  *
  * Il faut être dans l'espace privé (et authentifié),
  * sinon il faut être webmestre (pas de fuite d'informations publiées)
- * 
+ *
  * @param  string $faire Action demandée
- * @param  string $type  Type d'objet sur lequel appliquer l'action
- * @param  int    $id    Identifiant de l'objet
- * @param  array  $qui   Description de l'auteur demandant l'autorisation
- * @param  array  $opt   Options de cette autorisation
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
  * @return bool          true s'il a le droit, false sinon
-**/
-function autoriser_echafauder_dist($faire, $type, $id, $qui, $opt){
-       if (test_espace_prive())
-               return intval($qui['id_auteur'])?true:false;
-       else
-               return autoriser('webmestre','',$id,$qui,$opt);
+ **/
+function autoriser_echafauder_dist($faire, $type, $id, $qui, $opt) {
+       if (test_espace_prive()) {
+               return intval($qui['id_auteur']) ? true : false;
+       } else {
+               return autoriser('webmestre', '', $id, $qui, $opt);
+       }
 }
 
 
+/**
+ * Retourne les identifiants d'auteurs liés à un objet
+ *
+ * @param string $objet
+ * @param int $id_objet
+ * @param string|array $cond
+ *     Condition(s) supplémentaire(s) pour le where de la requête
+ * @return int[]
+ *     Identifiants d'auteurs
+ */
+function auteurs_objet($objet, $id_objet, $cond = '') {
+       $objet = objet_type($objet);
+       $where = array(
+               'objet=' . sql_quote($objet),
+               'id_objet=' . intval($id_objet)
+       );
+       if (!empty($cond)) {
+               if (is_array($cond)) {
+                       $where = array_merge($where, $cond);
+               } else {
+                       $where[] = $cond;
+               }
+       }
+       $auteurs = sql_allfetsel(
+               'id_auteur',
+               'spip_auteurs_liens',
+               $where
+       );
+       if (is_array($auteurs)) {
+               return array_map('reset', $auteurs);
+       }
+       return array();
+}
+
 /**
  * Lister les auteurs d'un article
- * 
- * Fonction générique utilisée par plusieurs autorisations
  *
+ * @deprecated utiliser auteurs_objets()
  * @param int $id_article Identifiant de l'article
- * @param string $cond    Condition en plus dans le where de la requête
+ * @param string $cond Condition en plus dans le where de la requête
  * @return array|bool
  *     - array : liste des id_auteur trouvés
  *     - false : serveur SQL indisponible
  */
-function auteurs_article($id_article, $cond='')
-{
-       return sql_allfetsel("id_auteur", "spip_auteurs_liens", "objet='article' AND id_objet=$id_article". ($cond ? " AND $cond" : ''));
+function auteurs_article($id_article, $cond = '') {
+       return sql_allfetsel(
+               'id_auteur',
+               'spip_auteurs_liens',
+               "objet='article' AND id_objet=$id_article" . ($cond ? " AND $cond" : '')
+       );
 }
 
 
 /**
  * Tester si on est admin restreint sur une rubrique donnée
- * 
+ *
  * Fonction générique utilisee dans des autorisations ou assimilée
  *
- * @param int $id_rubrique  Identifiant de la rubrique
+ * @param int $id_rubrique Identifiant de la rubrique
  * @return bool             true si administrateur de cette rubrique, false sinon.
  */
 function acces_restreint_rubrique($id_rubrique) {
-       global $connect_id_rubrique;
 
-       return (isset($connect_id_rubrique[$id_rubrique]));
+       return (isset($GLOBALS['connect_id_rubrique'][$id_rubrique]));
 }
 
 
 /**
  * Verifier qu'il existe au moins un parent
- * 
+ *
  * Fonction utilisee dans des autorisations des boutons / menus du prive des objets enfants (articles, breves, sites)
  *
- * @param string $table        la table a verifier
+ * @param string $table la table a vérifier
  * @return bool             true si un parent existe
  */
-function verifier_table_non_vide($table='spip_rubriques') {
+function verifier_table_non_vide($table = 'spip_rubriques') {
        static $done = array();
-       if (!isset($done[$table]))
-                $done[$table] = sql_countsel($table)>0;
+       if (!isset($done[$table])) {
+               $done[$table] = sql_countsel($table) > 0;
+       }
+
        return $done[$table];
 }
 
 /**
- * Une autorisation determiner la possibilite de s'inscire pour un statut et un id_rubrique,
- * a l'aide de la liste globale des statuts (tableau mode => nom du mode)
+ * Détermine la possibilité de s'inscire sur le site
+ *
+ * Pour un statut et un éventuel id_rubrique donné, indique,
+ * à l'aide de la liste globale des statuts (tableau mode => nom du mode)
+ * si le visiteur peut s'inscrire sur le site.
+ *
  * Utile pour le formulaire d'inscription.
- * Par defaut, seuls 6forum et 1comite possibles, les autres sont en false
- * pour un nouveau mode il suffit de definir l'autorisation specifique
  *
- * @param $faire
- * @param $quoi
- *   statut auteur demande
- * @param $id
- *   id_rubrique eventuel (pas utilise ici, utilise dans des usages persos)
- * @param $qui
- * @param $opt
- * @return bool
+ * Par défaut, seuls `6forum` et `1comite` sont possibles, les autres sont
+ * en `false`. Pour un nouveau mode il suffit de définir l'autorisation
+ * spécifique.
+ *
+ * @param  string $faire Action demandée
+ * @param  string $quoi Statut demandé
+ * @param  int $id Identifiant éventuel, par exemple de rubrique
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
  */
-function autoriser_inscrireauteur_dist($faire, $quoi, $id, $qui, $opt){
+function autoriser_inscrireauteur_dist($faire, $quoi, $id, $qui, $opt) {
 
        $s = array_search($quoi, $GLOBALS['liste_des_statuts']);
        switch ($s) {
-
-               case 'info_redacteurs' :
-                 return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
-
-               case 'info_visiteurs' :
-                 return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' OR $GLOBALS['meta']['forums_publics'] == 'abo');
-
+               case 'info_redacteurs':
+                       return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui');
+               case 'info_visiteurs':
+                       return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' or $GLOBALS['meta']['forums_publics'] == 'abo');
        }
 
        return false;
 }
-?>
+
+
+/**
+ * Autorisation à voir le phpinfo
+ *
+ * Il faut être webmestre
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type Type d'objet sur lequel appliquer l'action
+ * @param  int $id Identifiant de l'objet
+ * @param  array $qui Description de l'auteur demandant l'autorisation
+ * @param  array $opt Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+ **/
+function autoriser_phpinfos($faire, $type, $id, $qui, $opt) {
+       return autoriser('webmestre');
+}