Je suis obligé de remettre ça sur le tapis : NON le système d'exceptions d'autorisations n'est PAS une solution globale et complète quand on veut faire un script neutre qui fait plein de traitements et qui modifie plein d'objets.
autoriser_exception() n'est d'après moi qu'une petite aide pour de petit script par ci par là.
Si on fait un script de migration par exemple, qui va modifier plein plein d'objets, leurs statuts, leur arbo, etc, et bien je suis déjà tombé plusieurs fois sur des cas où il n'est absolument pas possible de savoir *en avance* quels objets vont être modifié. Conséquence : il est absolument impossible d'utiliser autoriser_exception() ! Puisque cette dernière demande à donner un $id_objet pour garder en mémoire l'exception uniquement pour celui-ci.
Il manque vraiment à SPIP un système de contournement *complet* pour le "visiteur en cours" (disons plus précisément "l'exécuteur du hit PHP") qui passerait TOUTES les autorisations.
Maintenant voilà mon idée de solution pour l'instant :
1) Avoir un define('_AUTORISER_TOUT', true) qui activerait la désactivation complète des autorisations pour les appels sans utilisateur particulier.
Cette variable pourrait donc être placée au début d'un script (action/ ou spip-cli/ essentiellement) avant de lancer des choses.
2) Cela renverrait alors toujours "true" pour tous les appels SANS utilisateur : autoriser(faire, quoi, id) SANS le "qui".
Lorsque _AUTORISER_TOUT est actif, dans autoriser() on aurait :
- si $qui == null ou '' : return TRUE
- si $qui == int ou tableau : renvoyer la vraie autorisation