Guardian Vorher- und Nachher-Checks API

Als ich Plugins erstellt habe, bin ich ein paar Mal auf die Notwendigkeit gestoßen, das Ergebnis von Guardian can_* Prüfungen zu ändern. Ich bin wieder auf dieses Problem im ActivityPub Plugin gestoßen:

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

Ich habe gerade einen Entwurf eines PR eingereicht, der eine neue serverseitige Plugin-API-Methode hinzufügt, mit der Sie Vor- und Nachprüfungen für Guardian can_* Methoden registrieren können, wodurch die Möglichkeit besteht, das Ergebnis der Methode zu ändern. Zum Beispiel:

add_guardian_check(:before, :edit_post) do |guardian, result, post|
  !post.activity_pub_remote?
end

Ich bin gespannt auf Feedback sowohl zum Ansatz als auch zur Ausführung, bevor ich es zur Überprüfung veröffentliche.

7 „Gefällt mir“

Ich schiebe das hier nochmal hoch für die zuständigen Personen. cc @pmusaraj

1 „Gefällt mir“

Danke, Angus!

Ich sehe keine Probleme mit der before_*-Registrierung. Die after_*-Registrierung ist etwas kniffliger. Aus Sicherheitssicht bedeutet die after_*-Registrierung, dass Plugins den Kern auf unsichere Weise überschreiben können. Offensichtlich können Plugins dies auf vielfältige Weise tun, aber die Plugin-API sollte dies nicht noch weiter erleichtern.

Außerdem, was passiert, wenn mehrere Plugins den after_*-Hook verbrauchen? Welches gewinnt?

Ja, ich verstehe, was Sie meinen.

Die Prüfungen akzeptieren ein Prioritätsargument. Sehen Sie sich diese Spezifikation an

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

Wie wäre es, wenn ich diesen PR auf before-Prüfungen beschränke? Das würde den unmittelbaren Bedarf decken und die Variablen hier etwas reduzieren.

1 „Gefällt mir“

Ja, sicher, fangen wir mit den before-Prüfungen an. Danke!