DEV: Add context in `AdminConstraint` (#15838)

This allows plugins to override the permissions required to access
specific things like the Logster and Sidekiq web UI without the changes
leaking to the rest of Discourse routes.
This commit is contained in:
Osama Sayegh 2022-02-07 16:25:31 +03:00 committed by GitHub
parent 64be371749
commit 492226a973
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 4 deletions

View File

@ -32,8 +32,8 @@ Discourse::Application.routes.draw do
mount Logster::Web => "/logs"
else
# only allow sidekiq in master site
mount Sidekiq::Web => "/sidekiq", constraints: AdminConstraint.new(require_master: true)
mount Logster::Web => "/logs", constraints: AdminConstraint.new
mount Sidekiq::Web => "/sidekiq", constraints: AdminConstraint.new(require_master: true, context: "sidekiq")
mount Logster::Web => "/logs", constraints: AdminConstraint.new(context: "logster")
end
end

View File

@ -4,12 +4,16 @@ class AdminConstraint
def initialize(options = {})
@require_master = options[:require_master]
# @context isn't used here, but it exists to give plugins extra context
# about the destination of the request.
# possible values are: sidekiq, logster and app (default).
@context = options[:context] || "app"
end
def matches?(request)
return false if @require_master && RailsMultisite::ConnectionManagement.current_db != "default"
current_user = CurrentUser.lookup_from_env(request.env)
current_user&.admin? && custom_admin_check(request)
@current_user = CurrentUser.lookup_from_env(request.env)
@current_user&.admin? && custom_admin_check(request)
rescue Discourse::InvalidAccess, Discourse::ReadOnly
false
end