Module: ObjectBouncer::Doorman::ClassMethods

Defined in:
lib/objectbouncer/class_methods.rb

Instance Method Summary collapse

Instance Method Details

#apply_policiesObject



78
79
80
81
82
# File 'lib/objectbouncer/class_methods.rb', line 78

def apply_policies
  policies.keys.each do |method|
    protect_method!(method)
  end
end

#as(accessee) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/objectbouncer/class_methods.rb', line 46

def as(accessee)
  new_klass = self.clone
  new_klass.table_name = self.table_name if respond_to?(:table_name)
  if respond_to?(:connection_handler)
    new_klass.establish_connection self.connection_handler.connection_pools[name].spec.config
  end
  new_klass.instance_eval do
    include ObjectBouncer::Doorman
  end
  new_klass.policies = self.policies
  new_klass.current_user = accessee
  new_klass.apply_policies
  new_klass
end

#blank_policy_templateObject



30
31
32
# File 'lib/objectbouncer/class_methods.rb', line 30

def blank_policy_template
  { :if => [], :unless => [] }
end

#current_userObject



42
43
44
# File 'lib/objectbouncer/class_methods.rb', line 42

def current_user
  @current_user
end

#current_user=(user) ⇒ Object



38
39
40
# File 'lib/objectbouncer/class_methods.rb', line 38

def current_user=(user)
  @current_user = user
end

#deny(method, options = {}) ⇒ Object



67
68
69
70
71
72
73
74
75
76
# File 'lib/objectbouncer/class_methods.rb', line 67

def deny(method, options = {})
  policies[method] ||= blank_policy_template
  if options.has_key?(:if)
    policies[method][:if] << options[:if]
  elsif options.has_key?(:unless)
    policies[method][:unless] << options[:unless]
  else
    policies[method][:if].unshift(Proc.new{ true == true })
  end
end

#door_policy(&block) ⇒ Object



61
62
63
64
65
# File 'lib/objectbouncer/class_methods.rb', line 61

def door_policy(&block)
  @policies = {}
  yield
  apply_policies
end

#enforced?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/objectbouncer/class_methods.rb', line 34

def enforced?
  ObjectBouncer.enforced?
end

#overwrite_initializeObject



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/objectbouncer/class_methods.rb', line 4

def overwrite_initialize
  class_eval do
    unless method_defined?(:objectbouncer_initialize)
      define_method(:objectbouncer_initialize) do |*args, &block|
        original_initialize(*args, &block)
        @policies = self.class.policies
        apply_policies
        self
      end
    end

    if instance_method(:initialize) != instance_method(:objectbouncer_initialize)
      alias_method :original_initialize, :initialize
      alias_method :initialize, :objectbouncer_initialize
    end
  end
end

#policiesObject



26
27
28
# File 'lib/objectbouncer/class_methods.rb', line 26

def policies
  @policies
end

#policies=(hash) ⇒ Object



22
23
24
# File 'lib/objectbouncer/class_methods.rb', line 22

def policies=(hash)
  @policies = hash
end

#protect_method!(method) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/objectbouncer/class_methods.rb', line 84

def protect_method!(method)
  renamed_method = "#{method}_without_objectbouncer".to_sym
  if method_defined?(method)
    return if method_defined?(renamed_method)
    alias_method renamed_method, method
    define_method method do |*args, &block|
      if call_denied?(method, *args)
        raise ObjectBouncer::PermissionDenied.new
      else
        send(renamed_method, *args, &block)
      end
    end
  end

end