Quelque chose que j’ai rencontré à quelques reprises lors de la création de plugins est la nécessité de modifier le résultat des vérifications can_* de Guardian. Je l’ai encore rencontré dans le plugin ActivityPub :
Je viens de soulever une ébauche de PR qui ajoute une nouvelle méthode d’API de plugin côté serveur qui vous permet de vous enregistrer avant et après les vérifications des méthodes can_* de guardian, vous donnant la possibilité de changer le résultat de la méthode. Par exemple :
add_guardian_check(:before, :edit_post) do |guardian, result, post|
!post.activity_pub_remote?
end
Je suis curieux d’avoir des retours sur l’approche et l’exécution avant de la publier pour révision.
Je ne vois aucun problème avec le registre before_*. Le registre after_* est un peu plus délicat. En matière de sécurité, le registre after_* signifie que les plugins peuvent remplacer le cœur de manière potentiellement dangereuse. Bien sûr, les plugins peuvent le faire de toutes sortes de manières, mais l’API des plugins ne devrait pas faciliter cela davantage.
De plus, que se passe-t-il si plusieurs plugins consomment le hook after_* ? Lequel gagne ?
Les vérifications acceptent un argument de priorité. Voir cette spécification
it "respects check priority" do
plugin.add_guardian_check(:after, :edit_post, 2) { false }
plugin.add_guardian_check(:after, :edit_post, 0) { true }
plugin.add_guardian_check(:after, :edit_post, 1) { false }
expect(Guardian.new(user).can_edit_post?(post)).to be_truthy
end
Que diriez-vous si je limitais cette PR aux vérifications before uniquement ? Cela répondrait aux besoins immédiats et réduirait un peu les variables en jeu ici.