[dev] Les autorisations du Couteau Suisse

... 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 :

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

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 :

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

-  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 :

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

-  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 :

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

-  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) :

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

-  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.

// 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é
function autoriser_cs_configurer($faire, $type, $id, $qui, $opt) {
	return $_SERVER['HTTP_HOST']==='www.toto.ici'
		?autoriser_cs_configurer_dist($faire, $type, $id, $qui, $opt)
		:autoriser('webmestre', $type, $id, $qui, $opt);
}

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 :

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

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 :

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

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 :

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

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

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

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 :

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

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

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

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é :

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

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 :

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

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 :

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

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 :

add_variables( array(
	'nom' => 'webmestres',
	'format' => _format_CHAINE,
	'defaut' => '"1"',
	'code:strlen(%s)' => "define('_ID_WEBMESTRES', %s);",
	'code:!strlen(%s)' => "define('_ID_WEBMESTRES', 1);",
));
add_outil( array(
	'id' => 'webmestres',
	'code:spip_options' => '%%webmestres%%',
	'categorie' => 'admin',
	// non supporte avant la version 1.92
	'version-min' => '1.9200',
	'autoriser' => "autoriser('webmestre')",
));

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

Discussion

3 discussions

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

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

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom