SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 199 visiteurs en ce moment

Accueil > Outils pour plugins > Le Couteau Suisse > [dev] Les autorisations du Couteau Suisse

[dev] Les autorisations du Couteau Suisse

6 décembre 2009 – par Patrice Vanneufville, Pierre KUHN – commentaires

30 votes

... Ou comment ne pas mettre un Couteau Suisse entre toutes les mains !

Introduction

Il s’agit ici de montrer comment utiliser l’API de SPIP sur les autorisations, pour donner (ou non !) aux utilisateurs des droits de configuration :
-  sur le Couteau Suisse en entier,
-  sur une lame [1] en particulier
-  sur une catégorie entière de lames
-  ou sur une variable en particulier.

Dans le cas d’une mutualisation, cela multiplie les possibilités car là, les autorisations peuvent être différentes pour chacun des sites mutualisés. Ces paramètres se définissent dans le fichier mes_options.php de /config qui se trouve en racine de SPIP. Nous conseillons pour des sites mutualisés de tout mettre dans ce mes_options.php, même si cela est possible aussi d’utiliser le config/mes_options.php de chaque site.

Les fonctions d’autorisation sont appelées :
-  à chaque fois qu’un outil est sollicité en partie privée pour être manipulé (vu ou configuré)
-  à chaque fois qu’une variable est appelée à être modifiée

Une fonction d’autorisation doit renvoyer :
-  vrai, si l’autorisation est donnée
-  faux, si l’autorisation est refusée

Notez que cet article s’adresse aux utilisateurs du Couteau Suisse dont la version est supérieure à 1.8.10.03. N’hésitez pas à mettre à jour votre plugin régulièrement. Pour en savoir plus sur l’API des autorisation SPIP : http://programmer.spip.org/-Gestion...

Autorisation générale sur le Couteau Suisse

Voici un bout de code du Couteau Suisse, trouvé dans le fichier cout_options.php :

  1. // Droits pour configurer le Couteau Suisse (fonction surchargeable sans le _dist)
  2. // Droits par défaut équivalents à 'configurer' les 'plugins', donc tous les administrateurs non restreints
  3. function autoriser_cs_configurer_dist($faire, $type, $id, $qui, $opt) {
  4. return autoriser('configurer', 'plugins', $id, $qui, $opt);
  5. }

Télécharger

Ce code montre que ce plugin peut être configuré par tous les utilisateurs qui ont le droit de configurer l’ensemble des plugins. En fait, ce sont par défaut tous les administrateurs non restreints. Le ’_dist’ de la fonction ci-dessus indique qu’elle peut être surchargée en fonction de vos propres besoins en écrivant vous même la fonction autoriser_cs_configurer($faire, $type, $id, $qui, $opt). Attention cette surcharge ne doit être présente qu’une seule fois !

Voici quelques exemples, histoire d’y voir plus clair.

-  Ici, seuls les webmestres peuvent configurer le Couteau Suisse et ce réglage concerne tous les sites dans le cas d’une mutualisation :

  1. // Autorisons seulement les webmestres à configurer le CS
  2. function autoriser_cs_configurer($faire, $type, $id, $qui, $opt) {
  3. return autoriser('webmestre', $type, $id, $qui, $opt);
  4. }

Télécharger

-  Ici, seuls les auteurs avec l’id X peuvent configurer le Couteau Suisse et ce réglage concerne tous les sites dans le cas d’une mutualisation :

  1. // Autorisons tous les id 1 de la mutualisation a configurer le CS
  2. function autoriser_cs_configurer($faire, $type, $id, $qui, $opt) {
  3. return $qui['id']===1;
  4. }

Télécharger

-  Ici, seul l’auteur connu sous le non de kifkif peut configurer le Couteau Suisse et ce réglage concerne tous les sites dans le cas d’une mutualisation :

  1. // Autoriser seulement l'auteur appeler kifkif a configurer le CS
  2. function autoriser_cs_configurer($faire, $type, $id, $qui, $opt) {
  3. return $qui['nom']==='kifkif';
  4. }

Télécharger

-  Ici, dans une mutualisation, seuls les administrateurs non restreints (réglage par défaut) d’un site précis peuvent le configurer le Couteau Suisse (évidement dans le cas ou vous avez un seul site ce réglage ne sert à rien) :

  1. // Autorisons le CS seulement sur le site 'www.toto.ici'
  2. function autoriser_cs_configurer($faire, $type, $id, $qui, $opt) {
  3. return $_SERVER['HTTP_HOST']==='www.toto.ici';
  4. }

Télécharger

-  Ici, dans une mutualisation, seuls les webmestres (déclarés dans mes_options avec un define) peuvent configurer le couteau suisse SAUF sur le site nommé où tous les administrateurs non restreints ont les droits.

  1. // Sur tous les sites, seul le webmestre peut configurer SAUF sur le site 'www.toto.ici' où le réglage par défaut est demandé
  2. function autoriser_cs_configurer($faire, $type, $id, $qui, $opt) {
  3. return $_SERVER['HTTP_HOST']==='www.toto.ici'
  4. ?autoriser_cs_configurer_dist($faire, $type, $id, $qui, $opt)
  5. :autoriser('webmestre', $type, $id, $qui, $opt);
  6. }

Télécharger

Autoriser une lame [1] grâce aux autorisations SPIP

Lorsqu’un outil est sollicité en partie privée, le Couteau Suisse va s’assurer de toutes les lignes suivantes avant d’en donner les droits à l’utilisateur :
-  Vérifier l’autorisation générale pour l’utilisateur de manipuler le Couteau Suisse
-  Vérifier que la version de SPIP est la bonne pour l’outil en question
-  Vérifier l’autorisation de manipuler cet outil
-  Vérifier l’autorisation de manipuler la catégorie de cet outil
-  Et enfin vérifier l’autorisation définie dans l’outil lui-même, si elle existe (paramètre ’autoriser’ du tableau de configuration)

Lorsqu’un outil est bloqué par les autorisations, alors :
-  Il n’apparait pas dans la liste des outils actifs ou inactifs
-  S’il tape l’adresse à la main, l’utilisateur tombe sur une page indiquant : Accès interdit
-  Une information apparait dans le cadre d’information à gauche de la page : Non paramétrables : 1

La fonction dont nous avons besoin ici doit être nommée comme ceci : ’autoriser_outil_’ auquel on ajoute l’id de l’outil, suivi de ’_configurer’.

Utilisons par exemple ce système pour interdire totalement une lame :

  1. // Interdire la "Corbeille" pour tout le monde
  2. // $opt est un tableau qui contient quelques infos sur l'outil appelant
  3. function autoriser_outil_corbeille_configurer($faire, $type, $id, $qui, $opt) {
  4. return false;
  5. }

Télécharger

Dans ce 2e exemple, laissons la configuration d’une lame en particulier (ici maj_auto) à tel ou tel site quand on a des sites mutualisés et interdisons-la dans les autres sites :

  1. // Interdire la "Mise à jour automatique" sur tous les sites mutualisés sauf sur 'www.toto.ici'
  2. // $opt est un tableau qui contient quelques infos sur l'outil appelant
  3. function autoriser_outil_maj_auto_configurer($faire, $type, $id, $qui, $opt) {
  4. return $_SERVER['HTTP_HOST']==='www.toto.ici';
  5. }

Télécharger

Afin de vous aider à écrire facilement les fonctions dont vous avez besoin, voici la liste des lames pour la version 2.0 de SPIP (au 17/01/10) :

Outilsid outilid catégorie
Dossier du squelette dossier_squelettes admin
Format des URLs type_urls admin
Gestion du JavaScript filtrer_javascript admin
La corbeille corbeille admin
Limites mémoire SPIP_tailles admin
Liste des webmestres webmestres admin
Lutte contre le SPAM spam admin
Mises à jour automatiques maj_auto admin
Modération modérée moderation_moderee admin
Paragrapher paragrapher2 admin
Pas de forums anonymes auteur_forum admin
Pas de stockage IP no_IP admin
Pas de verrouillage de fichiers flock admin
Prévisualisation des articles previsualisation admin
SPIP et le cache… spip_cache admin
Site en travaux en_travaux admin
Suivi des forums publics suivi_forums admin
Taille des forums forum_lgrmaxi admin
Allègement de l’interface privée simpl_interface interface
Boîtes privées boites_privees interface
Bouton « Visiter » icone_visiter interface
Largeur d’écran spip_ecran interface
Les tris de SPIP tri_articles interface
Page des auteurs auteurs interface
Réglage du sélecteur de rubrique brouteur interface
Type d’interface privée set_options interface
Ancres douces soft_scroller public
Désactive jQuery f_jQuery public
Désactive les objets flash desactiver_flash public
Force la langue forcer_langue public
Jolis Coins jcorner public
SPIP et les liens… externes SPIP_liens public
SPIP et ses raccourcis… class_spip public
Supprime le numéro supprimer_numero public
Validateur XML xml public
Visiteurs connectés visiteurs_connectes public
Balise #INSERT_HEAD insert_head spip
Balise #INTRODUCTION introduction spip
Balises #TITRE_PARENT/OBJET titre_parent spip
Horloge horloge spip
Liens en clair liens_en_clair spip
Masquer du contenu masquer spip
Orientation des images orientation spip
Trousse à balises trousse_balises spip
Version texte verstexte spip
Belles URLs liens_orphelins typo-corr
Belles puces pucesli typo-corr
Citations bien balisées citations_bb typo-corr
Corrections automatiques insertions typo-corr
Exposants typographiques typo_exposants typo-corr
Glossaire interne glossaire typo-corr
Guillemets typographiques guillemets typo-corr
Intertitres en image titres_typo typo-corr
MailCrypt mailcrypt typo-corr
Smileys smileys typo-corr
Sommaire automatique sommaire typo-corr
Blocs Dépliables blocs typo-racc
Blocs multilingues toutmulti typo-racc
Chatons chatons typo-racc
Décoration decoration typo-racc
Découpe en pages et onglets decoupe typo-racc
Filets de Séparation filets_sep typo-racc
Tout en couleurs couleurs typo-racc
Comportements du Couteau Suisse cs_comportement divers
// à placer à la fin de config_outils
// lancer ensuite exec=admin_couteau_suisse
global $outils;
include_spip('inc/cs_outils');
$x = array();
foreach($outils as $o) {
        $description_outil = charger_fonction('description_outil', 'inc');
        cs_initialisation_d_un_outil($o['id'], charger_fonction('description_outil', 'inc'), true);
        $oo = &$outils[$o['id']];
        $x[$oo['categorie']][]="|$oo[nom]|$oo[id]|$oo[categorie]|";
}
ksort($x);
foreach(array_keys($x) as $k) { sort($x[$k]); $x[$k]=join("\n",$x[$k]); }
$x=join("\n",$x);
print_r($x);

Et une liste des lames spécifiques à la version 1.9.2 de SPIP (au 05/12/09) :

idOutilsid catégorie
set_options Type d’interface privée interface
suivi_forums Suivi des forums publics admin

Autoriser une lame grâce à une constante

La définition d’une constante ’_CS_OUTILS_CACHES’ vous permet facilement de cacher certaines lames. Il suffit d’y lister les ids en les séparant par deux points. Exemple :

  1. define('_CS_OUTILS_CACHES',
  2. 'cs_comportement:insert_head:verstexte:type_urls');

Télécharger

En mutualisation, nous pouvons par exemple cacher certaines lames pour tous les sites sauf pour un, qui sera le site maitre :

  1. switch($_SERVER['HTTP_HOST']) {
  2. case 'www.toto.ici':
  3. break;
  4. default:
  5. define('_CS_OUTILS_CACHES', 'maj_auto');
  6. }

Télécharger

Autoriser une catégorie

La fonction dont nous avons besoin ici doit être nommée comme ceci : ’autoriser_categorie_’ auquel on ajoute l’id de la catégorie, suivi de ’_configurer’.

Utilisons par exemple ce système pour interdire totalement la visualisation et la configuration des outils d’une catégorie entière :

  1. // Nous cachons la catégorie 'admin' du Couteau Suisse
  2. // $opt est un tableau qui contient quelques infos sur l'outil sollicité
  3. function autoriser_categorie_admin_configurer($faire, $type, $id, $qui, $opt) {
  4. return false;
  5. }

Télécharger

Ici, une catégorie n’est visible que sur le site nommé et invisible pour le reste de la mutualisation :

  1. // Catégorie absente partout en mutualisation, sauf sur le site
  2. function autoriser_categorie_admin_configurer($faire, $type, $id, $qui, $opt) {
  3. return $_SERVER['HTTP_HOST']==='www.toto.ici';
  4. }

Télécharger

Voici la liste des catégories (au 05/12/09) :

idCatégories
admin Administration
interface Interface privée
typo-corr Améliorations des textes
typo-racc Raccourcis typographiques
public Affichage public
spip Balises, filtres, critères
divers Divers

Autoriser une lame et interdire le reste de la catégorie

Ici, une catégorie est interdite, sauf une lame précise appartenant à cette catégorie. Notez l’utilisation dans ce cas des informations contenues dans $opt et concernant l’outil sollicité :

  1. // Catégorie 'admin' entièrement interdite, sauf la lame 'dossier_squelettes'
  2. function autoriser_categorie_admin_configurer($faire, $type, $id, $qui, $opt) {
  3. return $opt['id']=='dossier_squelettes';
  4. }

Télécharger

Autoriser une variable grâce aux autorisations SPIP

Le Couteau Suisse comporte plus de 120 paramètres de configuration (appelés aussi variables)... Par défaut, ces paramètres sont tous autorisés à la modification pour les utilisateurs autorisés du plugins. A vous de voir s’il est utile d’en modifier l’autorisation au cas par cas.

Lorsqu’une variable est sur le point d’être modifiée, le Couteau Suisse va s’assurer de toutes les lignes suivantes avant d’en donner les droits à l’utilisateur :
-  Vérifier l’autorisation générale pour l’utilisateur de manipuler le Couteau Suisse
-  Vérifier l’autorisation de manipuler l’outil par lequel la demande a été lancée
-  Et enfin vérifier l’autorisation de la variable elle-même, telle que vous pouvez la définir ci-dessous.

Lorsqu’une variable est bloquée par les autorisations, alors :
-  la description de l’outil prodit un "input disabled" dans le formulaire : l’utilisateur voit la valeur de la variable, mais il ne peut pas la modifier.
-  Une information apparait au bas de ladite description : Paramètres non modifiables : 1

La fonction dont nous avons besoin ici doit être nommée comme ceci : ’autoriser_variable_’ auquel on ajoute l’id de la variable, suivi de ’_configurer’.

Utilisons par exemple ce système pour interdire la modification d’une variable (changement de type d’URL : ’radio_type_urls3’ sous SPIP 2.0) à tous les utilisateurs du site, sauf les webmestres :

  1. // Réserver le changement de type d'URLs aux seuls webmestres
  2. // $opt est un tableau qui contient quelques infos sur l'outil appelant
  3. function autoriser_variable_radio_type_urls3_configurer($faire, $type, $id, $qui, $opt) {
  4. return autoriser('webmestre', $type, $id, $qui, $opt);
  5. }

Télécharger

Notez qu’une liste des variables disponibles est visible ici : [dev] Le Couteau Suisse à piloter.

Évitons les doublons de fonctions

Afin d’éviter de mettre 2 codes qui disent la même chose (et provoquer une erreur fatale), par exemple dans une mutualisation avec un config/mes_options.php à la racine et le config/mes_options.php d’un site mutualisé, il faut utiliser la fonction PHP function_exists :

  1. // Exemple pour éviter les doubles déclarations
  2. if(!function_exists('autoriser_cs_configurer')) {
  3. function autoriser_cs_configurer($faire, $type, $id, $qui, $opt) {
  4. return $qui['id']===1;
  5. }
  6. }

Télécharger

Autorisations définies à la création de l’outil

Dans cet article, il est expliqué comment créer une lame. Dans la syntaxe (format simpliste) des déclarations pour add_outil(), notez le paramètre : ’autoriser’. Celui-ci permet d’insérer un code PHP à exécuter pour définir les droits natifs de voir/manipuler l’outil en partie privée. Cette autorisation, si elle est positive peut être invalidée par les fonctions décrites ci-dessus, mais l’inverse n’est pas possible : une autorisation refusée nativement reste irrévocable.

Le meilleur exemple est la lame « Liste des webmestres ». Rappel de la description de cet outil : « Un webmestre au sens SPIP est un administrateur ayant accès à l’espace FTP. Par défaut, il est l’administrateur id_auteur=1 du site. Les webmestres ont le privilège de ne plus être obligés de passer par FTP pour valider les opérations sensibles du site, comme la mise à jour de la base de données ou la restauration d’un dump. En tant que webmestre vous-même, vous aurez les droits de modifier cette liste. »

Vu que seuls les webmestres ont le droit de modifier la liste des webmestres, voici le code proposé pour cet outil. Notez la fonction SPIP autoriser(’webmestre’) proposée nativement et qui sera appelée à chaque demande de vue ou de configuration de l’outil :

  1. add_variables( array(
  2. 'nom' => 'webmestres',
  3. 'format' => _format_CHAINE,
  4. 'defaut' => '"1"',
  5. 'code:strlen(%s)' => "define('_ID_WEBMESTRES', %s);",
  6. 'code:!strlen(%s)' => "define('_ID_WEBMESTRES', 1);",
  7. ));
  8. add_outil( array(
  9. 'id' => 'webmestres',
  10. 'code:spip_options' => '%%webmestres%%',
  11. 'categorie' => 'admin',
  12. // non supporte avant la version 1.92
  13. 'version-min' => '1.9200',
  14. 'autoriser' => "autoriser('webmestre')",
  15. ));

Télécharger

Astuces

Quand nous avons $_SERVER[’HTTP_HOST’]===’www.toto.ici’, l’autorisation sur la lame (ou la catégorie) n’est donnée QUE si le site est www.toto.ici

Notes

[1Lame : surnom donné à un outil du Couteau Suisse

Dernière modification de cette page le 19 juillet 2014

Retour en haut de la page

Vos commentaires

Répondre à cet article

Qui êtes-vous ?
  • [Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Les crayons

    23 avril 2008 – 814 commentaires

    Ce plugin permet d’éditer les contenus sur les pages publiques du site, sans passer par l’espace privé de SPIP.

  • LESS pour SPIP : Less-CSS (anciennement LESSpip)

    5 novembre 2010 – 43 commentaires

    Less-CSS (Anciennement LESSpip) est un plugin intégrant facilement le logiciel LESS dans SPIP. LESS est une extension de CSS ajoutant les variables, les classes, les opérations, les imbrications au langage. Facilitant ainsi l’écriture de (...)

  • Recommander

    3 avril 2011 – 16 commentaires

    Ce plugin propose une manière simple de suggérer de recommander par email un article à un ami. Fonction « recommander un article à un ami ». On l’ajoute dans n’importe quel squelette sous la forme : #RECOMMANDERtitre de la page,url de la page,intro (...)

  • Critère {mots}

    6 août 2009 – 315 commentaires

    Permettre de sélectionner facilement des objets SPIP ayant un ou des mots clefs en communs.

  • SPMC : Squelette par mot clé V2.0

    21 septembre 2009 – 45 commentaires

    Ce plugin prend la suite de squelette par mot clef V1.92 qui ne fonctionnait plus sous SPIP 2.0.x. Avec l’accord de Mortimer qui n’a plus le temps de le maintenir, je prend donc la suite. Présentation du plugin « Squelette par mot clé V2.0 » Le (...)

Ça spipe par là