Autorisations PHP pour les Auteurs

Pour protéger l’accès aux contenus, plusieurs pages du Web rappellent le fonctionnement des Autorisations dans SPIP.

Mais ...... c’est du code PHP : pas évident de s’autoriser à écrire des fonctions pour l’autoriser !

Alors, si Les autorisations basiques ne suffit pas, il suffit par exemple de retrouver ce bout de code écrit par un spipeur.

Article publié le 8 novembre 2018, et actualisé en février 2020

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Attention, cette page est encore en  

Cet article est initialement dédié à une question posée sur IRC (exposée ci-dessous), mais pourrait s’étendre à d’autres aspects, en compléments de Les autorisations basiques.
Voir aussi les plugins Diogène, Autorité et Autorisation dans SPIP.

 Le problème d’origine

Lorsqu’on autorise l’accès du back-office à des auteurs déclarés comme simples rédacteurs, ceux-ci peuvent alors accéder à toutes les informations des autres auteurs du site (en particulier déjà à leur e-mail, ce qui constitue une première indiscrétion).
De plus, si le site utilise aussi le plugin Coordonnées, l’interface privée donne possibilité de consulter toutes les données personnelles enregistrées : adresse, téléphone, etc ......

 Principe de solution

A ce jour d’avant 11 Novembre 2018, la solution mise en commun est construite sur le principe montré ci-dessous (tout en restant incomplète et imparfaite [1]), voir ci-dessous.

On rajoutera un code source définissant des autorisations, inspiré du code ci-dessous proposé par MisterGraphX dans l’inclure du fichier mes_fonctions pour masquer certains éléments de menu back-office.

Dans un premier temps, seul le code originel -qui ne répond pas au même besoin : à adapter- reste publié ici pour mémoire, en espérant que les commentaires du source vous suffiront !

  1. // A placer dans mes_options
  2. //  Masquer des entrée du menu de l'espace privé à des Admins NON webmestre
  3. //  https://contrib.spip.net/Autorisations-Dans-Spip#nh2
  4. //  API autoriser : https://www.spip.net/fr_article5528.html
  5. //  Autorisation des items de premier niveau du bandeau
  6. // https://code.spip.net/autodoc/tree/ecrire/inc/autoriser.php.html#function_autoriser_menugrandeentree_dist
  7. function autoriser_menugrandeentree($faire, $type, $id, $qui, $opt) {
  8.                 // var_dump('faire: ' .$faire . ' - type: ' .$type.' - QUI ? '.print_r($qui,1));
  9.                 if (isset($type)) {
  10.                         if($type == 'menupublication'
  11.                                 || $type == 'menuactivite'
  12.                                 || $type == 'menuconfiguration'
  13.                                 ){
  14.                                         return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  15.                         }
  16.  
  17.                 }
  18.                 return $qui['statut'] == '0minirezo';
  19. }
  20.  
  21. function autoriser_auteurs_menu($faire, $type, $id, $qui, $opt) {
  22.     return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  23. }
  24.  
  25. function autoriser_compositions_menu($faire, $type, $id, $qui, $opt) {
  26.     return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  27. }
  28.  
  29. function autoriser_mediabox_menu($faire, $type, $id, $qui, $opt) {
  30.     return $qui['statut'] == '0minirezo' AND $qui['webmestre'] == 'oui';
  31. }

Télécharger

L’exemple ci-dessus est enregistré pour mémoire, car il est issu d’un dialogue sur le canal IRC et sur la liste....
En résultats recherchés, on masque certains choix de menus dans l’interface privée [2]...

 Solution intermédiaire

Par exemple, dans l’implantation voulue [3] le rédacteur ne peut plus accéder aux autres fiches auteur par ./ecrire/?exec=auteur&id_auteur=xx

Ainsi, voici la surcharge de fonction d’autorisation à opérer pour masquer les fiches des autres rédacteurs :

  1. // Pour voir une fiche auteur : être admin complet (non restreint), ou bien il s'agit de sa propre fiche
  2. function autoriser_auteur_voir($faire, $type, $id, $qui, $opt) {
  3.          if (
  4.                  (($qui['statut'] == '0minirezo') &&  !$qui['restreint'])                      
  5.                  or       ($qui['id_auteur'] == $id)
  6.          ) {
  7.                  return true;
  8.          }
  9.          else return false;
  10. }

Télécharger

Du coup, il est possible de faire une fonction de camouflage de l’email (ci-dessous), que vous pourriez utiliser comme filtre complémentaire dans vos squelettes [4] :

  1. // masquer un email si on est pas autorisé
  2. function camoufler_email($email,$id) {
  3.          include_spip('inc/autoriser');
  4.          // on camoufle sauf autorisation
  5.          if (!autoriser('voir','auteur', $id)) {
  6.                  $email = spip_substr($email,0,3) . "*****";
  7.          }
  8.      return $email;
  9. }

Télécharger

Mais ! Tout rédacteur a toujours la vision des adresses mails via la page ./ecrire/?exec=auteurs

Une solution simple (que vous trouveriez en relançant avec le paramètre ./ecrire/?exec=auteurs&var_mode=inclure) : surcharger la noisette correspondante des squelettes du privé (organisés sous Z) !

Il vous suffira donc de rajouter un test de statut sur la ligne correspondante en

  1. ../squelettes/prive/objets/liste/auteurs.html[50]
  2. _ <td class='email'>[(#SESSION{statut}|=={0minirezo}|oui)[<a href='mailto:(#EMAIL)'>[(#EMAIL|couper{30})]</a>]]</td>

Télécharger

 Modifications autorisées aux auteurs

Enfin, un exemple complétant les autorisations à leurs auteurs pour la modification des articles (ou autres objets) déjà publiés [5]

  1. // tous les auteurs associés à un objet article sont autorisé à le modifier (même si l'objet est publié)
  2. function autoriser_article_modifier($faire, $type, $id, $qui, $opt) {
  3.     if (!isset($qui['statut']) OR !in_array($qui['statut'], array('0minirezo', '1comite')))
  4.         return false;
  5.     if ($qui['statut'] == '0minirezo')
  6.         return true;
  7.        
  8.     $T_auteurs = sql_allfetsel('id_auteur','spip_auteurs_liens', array('id_objet='.$id, 'objet="article"'));
  9.     $T_auteurs = array_column($T_auteurs,'id_auteur');
  10.     return in_array($qui['id_auteur'], $T_auteurs);
  11. }

Télécharger

 L’inverse = forcer une relecture obligatoire

Le work-flow de SPIP oblige un rédacteur à demander la publication de son article finalisé par un administrateur, qui peut être lui-même si l’auteur est déjà administrateur ou webmestre, ce qui est fréquent !
Or on peut légitimement vouloir dans Edition-gestion d’Auteurs, pour des questions d’éthique [6] par exemple, qu’une relecture soit obligatoire même pour la rédaction par un administrateur, ce qui revient à interdire à un administrateur auteur d’articles, de basculer ses articles au statut publié.

Pour cela il faut surcharger une fonction d’autorisation... en se souvenant que le changement de statut d’un objet est une autorisation particulière depuis SPIP 2/3, exemple autoriser('instituer', $objet, $id_objet, '', array('statut' => $statut)) ; il faut donc surcharger la fonction d’autorisation, plutôt uniquement pour les articles, donc définir autoriser_article_instituer() dans mes_options.
Une telle autorisation pourrait donc s’écrire comme ci-dessous (sauf qu’il s’agira plutôt de controler l’autorisation de publierdans ! [7]) :

  1. if (!function_exists('autoriser_article_instituer'))  // au cas où
  2. function autoriser_article_instituer($faire, $type, $id, $qui, $opt='')  {
  3.    // si statut (nouveau) = 'publie' il faut 0minirezo ET (pas auteur) OU webmestre)
  4.   if ((isset($opt) && ($opt['statut'] == 'publie')) {
  5.         $liste_auteurs = sql_select('id_objet','auteurs_liens','objet'="article" && 'id_objet' = "$id");
  6.         return      ($qui['statut']=='0minirezo') && (!in_array($id,liste_auteurs));
  7.    // sinon     --- à tester --
  8.        return autoriser('instituer',$type,$id,$opt);
  9. }

Télécharger

En réalité, cela ne suffira pas dans SPIP, car un rédacteur peut aussi gérer les auteurs déclarés pour un article : il lui suffira donc de se retirer de la liste, de publier, puis de se rajouter...
Ce dernier exemple illustre bien la difficulté de verrouiller complètement un système !


Merci de nous signaler les coquilles, imprécisions ou erreurs qui figureraient dans cette page.

[1Les Liens d’accès sont masqués dans l’interface, mais ce n’est pas parce qu’un lien n’est pas directement visible, qu’il est
inaccessible à qui saurait retrouver et transposer l’URL SPIP adaptée.

[2Le code ci-dessus masque d’autres choix, attention !

[3Qui sera fournie ultérieurement /merci SpipFactory

[4Il serait peut-etre plus "politiquement correct dans l’esprit SPIP" de transformer la fonction en surcharge de la balise #EMAIL d’origine, ou au moins comme balise logique (c’est-a-dire fonctionnant comme un #REM conditionnel)

[5Pour Crayons, ou donne une alternative au plugin Nouvelle Version !

[6On s’autorise, mais on ne s’institue pas soit meme cf. Kant ;-)

[7A revoir donc...


Liens A2A visibles seulement pour les inscrits.
Liens visibles seulement pour les inscrits.

Article publié le 8 novembre 2018, et actualisé en février 2020 Provisoire (à compléter...) .

Répondre à cet article