lib/proxes/policies/request_policy.rb in proxes-0.9.13 vs lib/proxes/policies/request_policy.rb in proxes-0.10.1

- old
+ new

@@ -2,63 +2,62 @@ require 'active_support' require 'active_support/core_ext/object/blank' require 'ditty/services/logger' require 'proxes/models/permission' -require 'proxes/helpers/indices' module ProxES class RequestPolicy - include Helpers::Indices - attr_reader :user, :record alias request record def initialize(user, record) - @user = user + @user = user || Ditty::User.anonymous_user @record = record end def method_missing(method_sym, *arguments, &block) - return super if method_sym.to_s[-1] != '?' + return super unless respond_to_missing? method_sym - return true if user && user.super_admin? - return false if request.indices? && !index_allowed? - action_allowed? method_sym[0..-2].upcase + return false if permissions.empty? + + return permissions.count.positive? unless request.indices? + + # Only allow if all the indices match the given permissions + request.indices.find do |idx| + idx = idx[1..-1] if idx[0] == '-' + permissions.find { |perm| perm.index_regex.match idx }.nil? + end.nil? end def respond_to_missing?(name, _include_private = false) name[-1] == '?' end - def index_allowed? - patterns = patterns_for('INDEX').map do |permission| - return nil if permission.pattern.blank? - permission.pattern.gsub(/\{user.(.*)\}/) { |_match| user.send(Regexp.last_match[1].to_sym) } - end.compact - filter(request.index, patterns).count > 0 + def permissions + @permissions ||= Permission.for_user(user).for_request(request) end - def action_allowed?(action) - # Give me all the user's permissions that match the verb - !!patterns_for(action).find { |permission| (request.path =~ /#{permission.pattern}/) } - end - class Scope - include Helpers::Indices - attr_reader :user, :scope alias request scope def initialize(user, scope) - @user = user + @user = user || Ditty::User.anonymous_user @scope = scope end def resolve - current_user = user || Ditty::User.anonymous_user - return [] if current_user.nil? - filter request.index, patterns + return permissions.map(&:index) if request.indices == ['*'] || request.indices == ['_all'] || request.indices.blank? + + request.indices.select do |idx| + idx = idx[1..-1] if idx[0] == '-' + permissions.find { |perm| perm.index_regex.match idx } + end + end + + def permissions + @permissions ||= Permission.for_user(user).for_request(request) end end end end