angus
(Angus McLeod)
8 مايو 2024، 11:53ص
1
لقد صادفت شيئًا ما عدة مرات عند بناء الإضافات وهو الحاجة إلى تعديل نتيجة فحوصات Guardian can_*. لقد صادفتها مرة أخرى في إضافة ActivityPub:
https://github.com/discourse/discourse-activity-pub/blob/main/extensions/discourse_activity_pub_guardian_extension.rb
لقد قمت للتو برفع مسودة طلب سحب (PR) يضيف طريقة جديدة لواجهة برمجة تطبيقات الإضافات من جانب الخادم تسمح لك بالتسجيل قبل وبعد فحوصات طرق can_* الخاصة بـ guardian، مما يتيح القدرة على تغيير نتيجة الطريقة. على سبيل المثال:
add_guardian_check(:before, :edit_post) do |guardian, result, post|
!post.activity_pub_remote?
end
main ← angusmcleod:add_plugin_api_to_guardian
opened 11:46AM - 08 May 24 UTC
Adds a system to allow plugins to more easily modify guardian `can_` method outc… omes.
### Example
Currently the only way to modify guardian `can_` method outcomes is via module pre-pension, for example:
```
module DiscourseActivityPubGuardianExtension
def can_edit_post?(post)
return false if post.activity_pub_remote?
super
end
def can_change_post_owner?
return false if activity_pub_enabled_topic?
super
end
def activity_pub_enabled_topic?
return false unless DiscourseActivityPub.enabled && request&.params&.[]("topic_id")
topic = Topic.find_by(id: request.params["topic_id"].to_i)
topic&.activity_pub_enabled
end
end
...
Guardian.prepend DiscourseActivityPubGuardianExtension
```
[See further](https://github.com/discourse/discourse-activity-pub/blob/main/extensions/discourse_activity_pub_guardian_extension.rb)
This change would mean the above could be done via the plugin api like so:
```
add_guardian_check(:before, :edit_post) do |guardian, result, post|
!post.activity_pub_remote?
end
add_guardian_check(:before, :change_post_owner) do |guardian|
return true unless DiscourseActivityPub.enabled && guardian.request&.params&.[]("topic_id")
topic = Topic.find_by(id: guardian.request.params["topic_id"].to_i)
!topic&.activity_pub_enabled
end
```
فضولي لمعرفة التعليقات على كل من النهج والتنفيذ قبل نشره للمراجعة.
7 إعجابات
angus
(Angus McLeod)
8 يوليو 2024، 6:36ص
2
إعادة رفع هذا الموضوع لمن يهمه الأمر. إشعار @pmusaraj
إعجاب واحد (1)
pmusaraj
(Penar Musaraj)
26 يوليو 2024، 5:27م
3
شكرًا لك يا أنجوس!
لا أرى أي مشاكل مع التسجيل before_*. التسجيل after_* أكثر صعوبة قليلاً. من ناحية الأمان، يعني التسجيل after_* أنه يمكن للمكونات الإضافية تجاوز النواة بطرق قد تكون غير آمنة. من الواضح أن المكونات الإضافية يمكنها فعل ذلك بجميع أنواع الطرق، ولكن واجهة برمجة تطبيقات المكونات الإضافية لا ينبغي أن تسهل ذلك أكثر.
أيضًا، ماذا يحدث إذا استهلكت مكونات إضافية متعددة خطاف after_*؟ أي منها يفوز؟
angus
(Angus McLeod)
29 يوليو 2024، 8:02ص
4
نعم، أفهم ما تقصده.
تقبل عمليات التحقق وسيط أولوية. انظر هذا التحديد
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
ما رأيك أن أقتصر هذا السحب على عمليات التحقق before فقط؟ سيخدم ذلك الاحتياجات الفورية ويقلل المتغيرات قيد اللعب قليلاً هنا.
إعجاب واحد (1)
pmusaraj
(Penar Musaraj)
29 يوليو 2024، 2:20م
5
نعم، بالتأكيد، لنبدأ بفحوصات before فقط. شكرًا لك!