class Robotnik::Authorization::Status

Public Class Methods

matches?(rule_condition, resource, options) click to toggle source
# File lib/stasi/authorization/status.rb, line 39
def self.matches? rule_condition, resource, options
  return true if options.has_key?(:as) && options[:as] == rule_condition
  rule_condition = rule_condition.to_proc if rule_condition.respond_to?(:to_proc)
  begin
    rule_condition === resource
  rescue ArgumentError
    rule_condition.call(resource, options[:agent])
  end
end

Public Instance Methods

can(action, resource, conditions=nil, &block) click to toggle source
# File lib/stasi/authorization/status.rb, line 7
def can action, resource, conditions=nil, &block
  init_rule_for resource
  rules[resource][action] = conditions || block || true
end
can?(action, resource, options={}) click to toggle source
# File lib/stasi/authorization/status.rb, line 17
def can? action, resource, options={}
  verdict = false
  rules.each do |rule_condition, actions|
    if Robotnik::Authorization::Status.matches? rule_condition, resource, options
      action_condition = actions[action]
      verdict = case action_condition
        when true, false then action_condition
        else
          if action_condition.respond_to?(:call)
            action_condition.call(resource)
          else
            deliberation = true
            deliberation = deliberation && action_condition[:if].to_proc.call(resource) if action_condition.has_key?(:if)
            deliberation = deliberation && (! action_condition[:unless].to_proc.call(resource)) if deliberation && action_condition.has_key?(:unless)
            deliberation
          end
      end
    end
  end
  verdict
end
cannot(action, resource) click to toggle source
# File lib/stasi/authorization/status.rb, line 12
def cannot action, resource
  init_rule_for resource
  rules[resource][action] = false
end

Private Instance Methods

init_rule_for(resource) click to toggle source
# File lib/stasi/authorization/status.rb, line 55
def init_rule_for resource
  rules[resource] ||= {}
end
rules() click to toggle source
# File lib/stasi/authorization/status.rb, line 51
def rules
  @rules ||= {}
end