Vérifications avant et après de l'API Guardian

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 :

https://github.com/discourse/discourse-activity-pub/blob/main/extensions/discourse_activity_pub_guardian_extension.rb

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.

7 « J'aime »

Je remonte juste ce sujet pour la personne concernée. cc @pmusaraj

1 « J'aime »

Merci, Angus !

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 ?

Oui, je comprends ce que vous voulez dire.

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.

1 « J'aime »

Oui, bien sûr, commençons par les vérifications before. Merci !