Guardian antes y después de verificaciones API

Algo que he encontrado varias veces al crear plugins es la necesidad de modificar el resultado de las comprobaciones can_* de Guardian. Lo he vuelto a encontrar en el plugin ActivityPub:

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

Acabo de presentar una PR preliminar que añade un nuevo método de API de plugin del lado del servidor que te permite registrar comprobaciones antes y después de los métodos can_* de guardian, ofreciendo la capacidad de cambiar el resultado del método. Por ejemplo:

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

Tengo curiosidad por recibir comentarios sobre el enfoque y la ejecución antes de publicarlo para su revisión.

7 Me gusta

Solo subo este tema de nuevo para quien corresponda. cc @pmusaraj

1 me gusta

¡Gracias, Angus!

No veo ningún problema con el registro before_*. El registro after_* es un poco más complicado. En cuanto a seguridad, el registro after_* significa que los plugins pueden anular el núcleo de maneras que pueden ser inseguras. Obviamente, los plugins pueden hacer esto de muchas maneras, pero la API de plugins no debería facilitarlo aún más.

Además, ¿qué sucede si varios plugins consumen el hook after_*? ¿Cuál gana?

Sí, entiendo lo que quieres decir.

Las comprobaciones aceptan un argumento de prioridad. Vea esta especificación

it "respeta la prioridad de la comprobación" 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

¿Qué tal si limito esta PR solo a las comprobaciones before? Eso serviría a las necesidades inmediatas y reduciría un poco las variables en juego aquí.

1 me gusta

Sí, claro, empecemos solo con las comprobaciones before. ¡Gracias!