Verificação de antes e depois do API Guardian

Algo que encontrei algumas vezes ao construir plugins é a necessidade de modificar o resultado das verificações can_* do Guardian. Encontrei novamente no Plugin ActivityPub:

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

Acabei de levantar um PR rascunho que adiciona um novo método de API de plugin do lado do servidor que permite registrar verificações antes e depois dos métodos can_* do guardian, oferecendo a capacidade de alterar o resultado do método. Por exemplo

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

Estou curioso para obter feedback sobre a abordagem e a execução antes de publicá-la para revisão.

7 curtidas

Apenas trazendo este de volta para quem for relevante. cc @pmusaraj

1 curtida

Obrigado, Angus!

Não vejo nenhum problema com o registro before_*. O registro after_* é um pouco mais complicado. Em termos de segurança, o registro after_* significa que os plugins podem substituir o núcleo de maneiras que podem ser inseguras. Obviamente, os plugins podem fazer isso de várias maneiras, mas a API de plugins não deve facilitar isso ainda mais.

Além disso, o que acontece se vários plugins consumirem o hook after_*? Qual deles vence?

Sim, entendo o que você quer dizer.

As verificações aceitam um argumento de prioridade. Veja esta especificação

it "respeita a prioridade da verificação" 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 tal eu limitar este PR apenas às verificações before? Isso atenderia às necessidades imediatas e reduziria um pouco as variáveis em jogo aqui.

1 curtida

Sim, claro, vamos começar apenas com as verificações before. Obrigado!