[spip-dev] API autoriser

Salut groupe…

Je me demandais s’il y avait un groupe de travail ou un endroit ou il y a des réflexions de faite concernant l’évolution de l’API « autoriser » …

J’utilises beaucoup SPIP pour gérer des intranets entre autre, et l’API actuel est fonctionnel, mais quand on ajoutes plusieurs type d’objet, je trouves qu’il devient lourd a gérer…

J’ai des réflexions et des idées, mais avant de me mettre a écrire du code pour moi tout seul, je me demandais s’il y avait déjà des gens qui travaillais sur l’évolution de cet API et si je pourrais m’y joindre ! :slight_smile:

Bonjour,

il n’y a pas de tel groupe à ma connaissance.
Tu es sur la bonne liste de diffusion si tu veux communiquer par mail.
Sinon, tu peux aussi échanger sur irc.spip.net avec marcimat, Cerdic, etc…
Quelles sont tes idées ?

.Gilles

Bonjour,

En plus de ce que dit Gilles, je rajoute ce lien http://contrib.spip.net/Autorisations-Dans-Spip qui a eu le mérite de recenser le fonctionnement de l’API autoriser dans SPIP.

Amicalement,

Ybbet.

Ok… Je me lance avec mes réflexion actuel sur l’API autoriser. D’abord avec mes constats au sujet de l’API puis mes réflexions…

Comme j’arrive dans le sujet, il est possible qu’il y a des éléments la-dedans qui auront déjà été discuté par ceux qui discute sur cette liste depuis longtemps, soyez indulgent de ce côté ! :wink:

Il est également possible que mes constats soient faux, n’hésitez pas a me faire par de fonctionnalités que j’aurais manqué au travers de mes différentes lectures sur le sujet…

Et finalement, si jamais les besoins que moi je ressens pour faire évoluer l’API autoriser de spip sort des besoin de spip lui-même et sont des besoins qui sont vraiment plus spécifique à mes besoins, n’hésitez pas à me le dire, et je me ferais un plugin pour surcharger cela et utilisera bien celui qui veut a partir de là ! :wink:

Mes constats sur l’API Autoriser actuellement…

Dans le contexte ou on gère 3 statut de base (0minirezo, 1comite, 6forum) et que tout nouveau statut d’auteur est de base considéré comme un statut visiteur, l’API actuel fonctionne relativement bien… Mais, comme je l’ai dis précédemment, dans un contexte ou je me sers de SPIP pour gérer des intranet, ces 3 statuts sont nettement insuffisant et ne permet pas d’avoir beaucoup de souplesse à moins de se mettre a écrire pleins de fonction et/ou de surcharger des fonctions actuel…. Il est d’ailleurs très difficile avec son concept actuel de créer une interface dans l’espace privé pour pouvoir créer de nouveau statut et d'assigner a ce statut des droits spécifique, les droits n’existant pas autrement que par création de fonctions…

Si je prends exemple au niveau de mes intranet, si dans mon intranet, j’ai des objet factures, clients, commandes, formulaires, etc, etc, et que je souhaite déléguer a une personne la gestion des utilisateurs pour qu’il puisse gérer les droits d’accès pour créer un droit « comptabilité » et assigner des droits sur les objet factures sans que cette personne ai accès au reste, c’est impossible de créer ce droit « comptabilité » sans passer par de la programmation…

Donc pour pouvoir arriver a créer des statut d’auteur « personnalisé » il faut commencer par être en mesure d’avoir une liste des droits disponible pour chaque objet. La première idée qui me vient donc en tête, c’est d’ajouter cela lors de la déclaration des objets par le pipeline declarer_tables_objets_sql …

Si dans cette table on ajout a notre objet quelque chose de ce genre :
$tables[‘spip_mon_objet_quelconque’]
  … blabla définition de la table …
  … blabla les statut pour l’objet …
  … blabla autres …
  
  ‘dtoits_autorisations’ => array(
              ‘creer’ => array(
                    ‘texte_de_langue’ => ‘fichier de langue:string’,
                    ‘restreindre_rubrique’ => ‘oui ou non’ /* Pour décider si pour ce droit, on peut choisir un secteur ou si c’est le droit point final */
                    ‘autres_options_qui_pourait_etre_interessante’ => ‘…'
                    ),
              ‘modifier’ => array(
                  …..
                    ),
              etc….
            );

En faisant cela, il devient possible d’écrire une fonction du genre :

liste_droit_objet($objet)

et ainsi récupérer une liste de droits disponible pour un objet en particulier…

Cela laisse même la possibilité pour un autre plugin qui aurait besoin d’ajouter un droit sur un objet existant pour xyz raison, d’aller l’ajouter en passant par le pipeline déclarer_tables_objets_sql …

Dans la fonction liste_droit_objet, on pourrait introduire certains droits de base ou exceptionnel comme webmestre ou des éléments de ce genre…

Ensuite pour compléter cette gestion de droits, j’ajouterait une table, par exemple spip_statut_auteur … qui se définirait a peu près comme ceci :

id_statut
Titre
libelle (le nom du droit, mais qui sera associé au statut de l’auteur… A moins qu’a partir de là, les droits des auteurs passent par une table de liens… Ça permettrait même qu’un utilisateur ai plus d’un droit… Mais au niveau de la structure de spip, l’utilisation du champ statut ne doit pas être si simple a remplacer… )
liste_des_droits qui serait un peu comme les meta de SPIP, un serialize (c’est comme ça qu’on dit ?? :stuck_out_tongue_winking_eye: ) des droits par objet que ce nouveau statut d’auteur peut faire …

En gros, la base de mon idée est là… plutôt que d’avoir un paquet de fonction éparpillé un peu partout pour gérer les droits sur les objets spip, on pourrait avoir une seule fonction qui vérifie si la personne a un droit en fonction de son (ou ses) statut, et l’ensemble des droits possible pourrait être assigné a des nouveau statuts… On peut inclure les statuts de base (0minirezo, 1comite, 6forum)de spip actuel déjà dans la table par défaut, et après, on peut créer autant de statut que l’on veut en décidant des droits assigné a chaque statut…

Si cette idée allume quelque choses et est d’intérêt pour le coeur de SPIP, je suis partant pour écrire le code qui va avec, mais j’aimerais bien avoir de l’aide pour choisir les bons termes, les bon nom de fonction, etc, afin que celui puisse être éventuellement intégré au coeur de SPIP…

Si cette approche n’est pas intéressante pour le Core, alors je le ferais comme plugin, mais s’il y en as qui ont des suggestions pour la nomenclature, je suis preneur ! :slight_smile:

Exemple de base : function autoriser() { return true; } : tout le monde a le droit de tout faire.

Bonjour, ça me semble compliqué ce que tu proposes.
Il me semble que l’ajout de statuts personnalisés peut se faire dans SPIP en surchargeant le fichier ecrire/base/objets.php
(comme n’importe quel plugin) :slight_smile:

Est-ce que j’ai tord ?

Exemple de base : function autoriser() { return true; } : tout le monde a le droit de tout faire.

D’accord sur le principe, de la fonction, d’ailleurs, si le core n,est pas intéressé pas l’idée, je vais me servir de cela pour créer mon plugin et utiliser grosso-modo cet que j’ai décris…

Cependant, ce que j’essai d’amener, c’est la possibilité de gérer de nouveaux statut et d’assigner des droits sans passer par de la prog… Donc de pouvoir avoir un utilisateur d’un site non-programmeur qui pourra gérer des droits d’accès via l’interface…

Donc de pouvoir avoir un utilisateur d’un site non-programmeur qui pourra
gérer des droits d’accès via l’interface…

C'est déjà le cas du plugin "autorité". Celui-ci permet de modifier des
droits en cliquant ici ou là ; mais il faut avouer que ce plugin n'a pas
bougé depuis des lustres, peut-être parce qu'il couvre de manière simple
les besoins les plus courants (?) ; ou peut-être parce qu'il est trop
difficile à étendre (??).

En fait il semble y avoir une différence de philosophie : pour Autorité, le
but est est de chercher des cas d'usage génériques et une simplicité de
l'interface.

Ton approche viserait plutôt si j'ai bien compris à donner accès à
l'ensemble des possibles. Ce serait donc un plugin différent, à moins qu'on
arrive à mélanger les avantages des deux approches. En tout cas n'hésite
pas à utiliser le code d'Autorité comme bon te semble.

-- Fil

Bonjour, ça me semble compliqué ce que tu proposes.
Il me semble que l’ajout de statuts personnalisés peut se faire dans SPIP en surchargeant le fichier ecrire/base/objets.php
(comme n’importe quel plugin) :slight_smile:

Est-ce que j’ai tord ?

Je ne suis pas sur de comprendre ce que tu expliques…

Si tu parles par exemple, d’ajouter simplement un statut d’auteur en utilisant par exemple :

$GLOBALS[‹ liste_des_statuts ›][‹ info_utilisateur_intranet ›] = 'intranet’;

oui, on peut ajouter ce statut de façon très simple… Mais quand vient le temps de dire ce que ce statut a le droit de faire, c’est là qu’il faut écrire des fonctions pour chaque objet et ça que j’essaie d’éliminer…

Dans le cadre d’un spip qui ne gère que 3 statut, ok, le fonctionnement actuel, ça fait le travail… Mais, dans mon cas, avec des intranet, il n’est pas rare que j’ai 10 statuts… Alors pour chaque statut, je dois faire le tour des objets de cet intranet et écrire des fonctions pour le nouveau statut…

Avec ce que je décris ci-bas, les droits sur les objets sont a même la table des objets et mes utilisateurs qui administrent ces intranets peuvent se créer autant de statut qu’ils veulent et assigne les droits qu’ils veulent a chaque statut, sans avoir a écrire aucune nouvelle fonction…

J’ai besoin d’ajouter un nouveau droit pour un objet, je l’ajoute a déclarer_tables_objets_sql et après, mes administrateur d’intranet (non-programmeur) peuvent aller faire le tour de leur propres statut qu’ils ont créé pour décider qui aura ce droit et qui ne l’aura pas…

Effectivement, la gestion des autorisation ne se fait pas pour l'instant
via une interface d'admin.
Ce serait compliqué car il faudrait prendre en compte des autorisations
définies et redéfinies un peu partout.
La méthode que je vois pour faire cela, serait qu'à un endroit soit branché
la déclaration des autorisations (un peu comme pour le
charger_pipelines.php qui est compilé dans tmp/cache) - puis tu pourrais
ajouter / modifier ces autorisation avec une interface donnée.
Il faudrait ensuite que ton code génère des fonctions de type
autoriser_quoi_qui() comme le fait la Fabrique
Et ainsi tu pourrais tout changer.

Est-ce bien ce que tu veux faire ?
C'est loin d'être hors sujet comme idée, car la Fabrique propose déjà un
traitement partiel de ce type, mais ne va peut-être pas assez loin pour ce
que tu proposes.

Qu'en dis-tu ?

David Fredette a écrit le 24/11/2015 19:31 :

D’accord sur le principe, de la fonction, d’ailleurs, si le core n,est
pas intéressé pas l’idée, je vais me servir de cela pour créer mon
plugin et utiliser grosso-modo cet que j’ai décris…

D'expérience, "le core" fait des réponses qui peuvent avoir l'air abruptes.
Mais ce n'est que par soucis d'efficacité.
Si ti tu crois à ton idée, si tu es capable de l'argumenter, si tu montres que c'est possible, tu as largement la place du débat.
Les membres du core peuvent paraître assez froid vis-à-vis d'une idée nouvelle. Mais ils sont réchauffables :wink: Ce qu'ils attendent, c'est un niveau de réponse et de réflexion qui les fasse avancer (avec bonheur).

Si tu regarde l'historique de SPIP, le compilo actuel de SPIP a fait l'objet de 6 mois de versions intermédiaires avant d'être intégré à SPIP.
Textwhell, Jobqueue, medias, bando, plan ont d'abord été des plugins avant d'être intégrés dans le core.
Pareil sur l'API des rôles pour SPIP 3.1

Et puis le core se donne une contrainte de taille : tout code nouveau intégré dans le core doit être lu et compris (donc maintenable) par 2 personnes au moins du core.
Donc, intégrer un nouveau truc n'est pas une décision à prendre à la légère.

PS : je ne suis pas du core, mais je fréquente les lieux depuis assez longtemps pour avoir compris certaines choses (dont une qui est que pour survivre dans SPIP, il faut ravaler sa chique bien souvent et continuer à avancer malgré les coups).

En fait j’ai vraiment l’impression que tu veux étendre ce que fait la Fabrique (qui est largement basée du plugin Autorité que mentionne Fil)

Pas tout-a-fait… En fait, je veux éviter d’avoir a écrire des fonction du type autoriser_quoi_qui() …

Si on créé un statut disons « intranet » et que ce statut a le droit « modifier » de l’objet « factures » …

Donc, un appel a la fonction :

autoriser(‹ modifier ›, ‘facture’, $id_facture)

N’irait plus a la recherche d’une fonction autoriser_modifier_intranet , mais plutôt, vérifier si facture_modifier fait parti de la liste des droits associé au statut intranet…

Oui, ça demande au départ pour chaque objet existant a l’heure actuel d’ajouter un array dans déclarer_tables_objets_sql, mais après, c’est, selon moi, beaucoup plus souple… De mon points de vue a tout le moins ! :slight_smile:

avec un exemple c'est tout de suite plus parlant :wink:

Justement le code de base de inc/autoriser est prévu pour être extensible
de n'importe quelle manière qu'on le souhaite, pas seulement en allant
chercher autoriser_modifier_intranet()

Cette dernière convention (autoriser faire quoi qui…) n'est qu'une des
manières d'utiliser autoriser ; si tu regardes le code, il me semble qu'il
est assez bien documenté dans les possibiltés d'extension qu'il laisse
ouvertes.

(note bien que ma réponse n'est pas du tout la même que celle de Gilles
:wink: Ce qui prouve qu'il y a 100 façons différentes de faire…)

-- Fil

David Fredette a écrit le 24/11/2015 19:31 :

D’accord sur le principe, de la fonction, d’ailleurs, si le core n,est
pas intéressé pas l’idée, je vais me servir de cela pour créer mon
plugin et utiliser grosso-modo cet que j’ai décris…

D’expérience, « le core » fait des réponses qui peuvent avoir l’air abruptes.
Mais ce n’est que par soucis d’efficacité.
Si ti tu crois à ton idée, si tu es capable de l’argumenter, si tu montres que c’est possible, tu as largement la place du débat.
Les membres du core peuvent paraître assez froid vis-à-vis d’une idée nouvelle. Mais ils sont réchauffables :wink: Ce qu’ils attendent, c’est un niveau de réponse et de réflexion qui les fasse avancer (avec bonheur).

En quelque part, c’est correct… J’arrives avec mes idées, et bien que je fasses des sites en SPIP depuis plus de 10 ans, je n’ai pas beaucoup participé aux liste de discussion entourant SPIP… Mais plus j’en fais, plus je vais fouiner loin dans les entrailles de Spip, plus j’en découvres et plus j’a le goût d’en faire ! :wink:

Reste que je suis conscient que de nouvelles idées d’une nouvelle personne, ça peut aussi être des éléments qui ont déjà été discuté et qui ont eu des conclusions par le passé et je suis entièrement ouvert a cela… Tant qu’une critique reste une critique constructive, je vit très bien avec la critique ! :wink:

Si tu regarde l’historique de SPIP, le compilo actuel de SPIP a fait l’objet de 6 mois de versions intermédiaires avant d’être intégré à SPIP.
Textwhell, Jobqueue, medias, bando, plan ont d’abord été des plugins avant d’être intégrés dans le core.
Pareil sur l’API des rôles pour SPIP 3.1

Et puis le core se donne une contrainte de taille : tout code nouveau intégré dans le core doit être lu et compris (donc maintenable) par 2 personnes au moins du core.
Donc, intégrer un nouveau truc n’est pas une décision à prendre à la légère.

Pour la pérennité a long terme, je penses que c’est quelque chose de tout-a-fait normal…

PS : je ne suis pas du core, mais je fréquente les lieux depuis assez longtemps pour avoir compris certaines choses (dont une qui est que pour survivre dans SPIP, il faut ravaler sa chique bien souvent et continuer à avancer malgré les coups).

dépendamment du point de vue, certains appelles cela de la rigueur… Et pour qu’un projet soit stable a long terme, ça en prends et les discussions qui vont autour sont importante ! :slight_smile:

En fait j’ai vraiment l’impression que tu veux étendre ce que fait la Fabrique (qui est largement basée du plugin Autorité que mentionne Fil)

Alors il me manque une référence sur ce que fait le plugin autorité … Parce que de ce que j’ai lu sur ce plugin moi ça ne me semble pas avoir la même souplesse…

De ce que je comprends d’autorité (mais je peux me tromper, corrigez-moi si je me trompes) , il permet d’ajouter des droits et tout autant de fonction a écrire en fonction de ce qu’on veut surcharger tout en utilisant le modèle de base de spip actuel…

Moi, c’est un peu ce modèle de base que je veux revoir ! :stuck_out_tongue:

Au niveau du code actuel les fonction en place permettent en effet d’aller chercher toutes sortes de fonction…

La seule chose qui est une épine a l’heure actuelle, c’est qu’il n’y a pas de possibilité de récupérer un array avec la liste des droits disponible pour un objet …

La seule façon actuellement de savoir quels sont toute les possibilité « $faire » pour un article par exemple, c’est soit de les savoir par coeur, ou soit de parcourir tout les fichier autorisations.php pour trouver les fonctions autoriser_article

Je crois qu’on pourrait éviter l’écriture et le chargement de beaucoup de fichier php et de fonctions avec un approche différentes pour lister les droits par objet …

Reste que comme mentionné dans le premier courriel, si le core y voit une idée potentiel, mais ne veut pas se dire on va tout changer tout de suite, avec juste un peu d’aider pour être sur qu’au départ mes nomenclature sont bonne (tant au niveau des noms dans les array, que certains nom de fonction pour être sur que ce soit dans l’esprit de SPIP), je peux écrire cela en tant que plugins et a l’usage (essai, exemple plus concret, etc, etc…) peut-être que ça se clafiera….

Je veux juste être sur de partir tout cela et que si jamais ça devient intéressant pour le core, le travail d’intégration soit le plus simple possible…

En effet il n'y a pas de liste fermée, car c'est ouvert à toutes les
utilisations.

Si tu veux recenser ce qui existe dans le core et sur la zone il va falloir
fouiller. Mais avec grep et un peu de patience tu devrais pouvoir couvrir
99% des cas d'usage.

Je pense que ça serait utile

-- Fil

Mais en même temps, le fait de de déclarer les droits pour un objet dans déclarer_tables_objets_sql laisse la souplesse de créer tout ceux qu’on veut tout de même…

Ok, je vais commencer mon plugin et aller chercher ce que je trouves… Il y a un endroit ou je peux mettre ça question de pouvoir recevoir des commentaires/feedback/etc ???

J’ai un serveur SVN interne mais rien de public… S’il y a un SVN « spip » ou je peux mettre cela, ça pourrait simplifier les contributions… :wink:

Ok, je vais commencer mon plugin et aller chercher ce que je trouves… Il y
a un endroit ou je peux mettre ça question de pouvoir recevoir des
commentaires/feedback/etc ???

J’ai un serveur SVN interne mais rien de public… S’il y a un SVN « spip »
ou je peux mettre cela, ça pourrait simplifier les contributions… :wink:

Oui, il y a le serveur svn de la zone qui héberge une bonne partie des
plugins actuels (d'autres sont sur git)
L'outil de suivi est ici : Connexion · GitLab
le dépôt svn est svn://zone.spip.org/spip-zone

Je vais t'envoyer tout de suite des codes d'accès pour que tu puisses y
mettre ton code, ou un simple début de fichier a_faire.txt, quand tu
voudras.

Il y a quelques éléments à accepter bien sûr concernant la charte de la
zone (pour que ça ne devienne pas trop .. la zone ;)), je t'enverrai des
détails avec tes identifiants.

En tout cas c'est cool d'avoir fait le pas pour devenir acteur !

Bienvenue !

.Gilles