Commit 0107868d322629f22ff7dc57f9d8ccce222cf555

Authored by Victor Costa
1 parent 4b06d2fb

rails3: fix ActiveRecord extension at access_control

vendor/plugins/access_control/lib/acts_as_accessible.rb
1 -class ActiveRecord::Base 1 +module ActsAsAccessible
2 # This is the global hash of permissions and each item is of the form 2 # This is the global hash of permissions and each item is of the form
3 # 'class_name' => permission_hash for each target have its own set of permissions 3 # 'class_name' => permission_hash for each target have its own set of permissions
4 # but its not a namespace so each permission name should be unique 4 # but its not a namespace so each permission name should be unique
5 PERMISSIONS = {} 5 PERMISSIONS = {}
6 -  
7 - # Acts as accessible makes a model acts as a resource that can be targeted by a permission  
8 - def self.acts_as_accessible  
9 - has_many :role_assignments, :as => :resource, :dependent => :destroy  
10 -  
11 - # A superior instance is an object that has higher level an thus can be targeted by a permission  
12 - # to represent an permission over a group of related resources rather than a single one  
13 - def superior_instance  
14 - nil  
15 - end  
16 6
17 - def affiliate(accessor, roles)  
18 - roles = [roles] unless roles.kind_of?(Array)  
19 - roles.map {|role| accessor.add_role(role, self)}.any?  
20 - end 7 + extend ActiveSupport::Concern
21 8
22 - def disaffiliate(accessor, roles)  
23 - roles = [roles] unless roles.kind_of?(Array)  
24 - role_assignments.map{|ra|ra.destroy if roles.include?(ra.role) && ra.accessor == accessor} 9 + module ClassMethods
  10 + # Acts as accessible makes a model acts as a resource that can be targeted by a permission
  11 + def acts_as_accessible
  12 + has_many :role_assignments, :as => :resource, :dependent => :destroy
25 end 13 end
  14 + end
  15 +
  16 + # A superior instance is an object that has higher level an thus can be targeted by a permission
  17 + # to represent an permission over a group of related resources rather than a single one
  18 + def superior_instance
  19 + nil
  20 + end
26 21
27 - def roles  
28 - Role.find_all_by_environment_id(environment.id).select do |r|  
29 - r.permissions.any?{ |p| PERMISSIONS[self.class.base_class.name].include?(p) }  
30 - end 22 + def affiliate(accessor, roles)
  23 + roles = [roles] unless roles.kind_of?(Array)
  24 + roles.map {|role| accessor.add_role(role, self)}.any?
  25 + end
  26 +
  27 + def disaffiliate(accessor, roles)
  28 + roles = [roles] unless roles.kind_of?(Array)
  29 + role_assignments.map{|ra|ra.destroy if roles.include?(ra.role) && ra.accessor == accessor}
  30 + end
  31 +
  32 + def roles
  33 + Role.find_all_by_environment_id(environment.id).select do |r|
  34 + r.permissions.any?{ |p| PERMISSIONS[self.class.base_class.name].include?(p) }
31 end 35 end
32 end 36 end
33 end 37 end
  38 +
  39 +ActiveRecord::Base.send(:include, ActsAsAccessible)
vendor/plugins/access_control/lib/acts_as_accessor.rb
1 -class ActiveRecord::Base  
2 - def self.acts_as_accessor  
3 - has_many :role_assignments, :as => :accessor, :dependent => :destroy 1 +module ActsAsAccessor
4 2
5 - def has_permission?(permission, resource = nil)  
6 - return true if resource == self  
7 - role_assignments.includes([:resource,:role]).any? {|ra| ra.has_permission?(permission, resource)}  
8 - end 3 + extend ActiveSupport::Concern
9 4
10 - def define_roles(roles, resource)  
11 - roles = [roles] unless roles.kind_of?(Array)  
12 - actual_roles = RoleAssignment.find( :all, :conditions => role_attributes(nil, resource) ).map(&:role)  
13 -  
14 - (roles - actual_roles).each {|r| add_role(r, resource) }  
15 - (actual_roles - roles).each {|r| remove_role(r, resource)} 5 + module ClassMethods
  6 + def acts_as_accessor
  7 + has_many :role_assignments, :as => :accessor, :dependent => :destroy
16 end 8 end
  9 + end
17 10
18 - def add_role(role, resource)  
19 - attributes = role_attributes(role, resource)  
20 - if RoleAssignment.find(:all, :conditions => attributes).empty?  
21 - ra = RoleAssignment.new(attributes)  
22 - role_assignments << ra  
23 - resource.role_assignments << ra  
24 - ra.save  
25 - else  
26 - false  
27 - end  
28 - end 11 + def has_permission?(permission, resource = nil)
  12 + return true if resource == self
  13 + role_assignments.includes([:resource,:role]).any? {|ra| ra.has_permission?(permission, resource)}
  14 + end
29 15
30 - def remove_role(role, resource)  
31 - return unless role  
32 - roles_destroy = RoleAssignment.find(:all, :conditions => role_attributes(role, resource))  
33 - return if roles_destroy.empty?  
34 - roles_destroy.map(&:destroy).all?  
35 - end 16 + def define_roles(roles, resource)
  17 + roles = [roles] unless roles.kind_of?(Array)
  18 + actual_roles = RoleAssignment.find( :all, :conditions => role_attributes(nil, resource) ).map(&:role)
  19 +
  20 + (roles - actual_roles).each {|r| add_role(r, resource) }
  21 + (actual_roles - roles).each {|r| remove_role(r, resource)}
  22 + end
36 23
37 - def find_roles(res)  
38 - RoleAssignment.find(:all, :conditions => role_attributes(nil, res)) 24 + def add_role(role, resource)
  25 + attributes = role_attributes(role, resource)
  26 + if RoleAssignment.find(:all, :conditions => attributes).empty?
  27 + ra = RoleAssignment.new(attributes)
  28 + role_assignments << ra
  29 + resource.role_assignments << ra
  30 + ra.save
  31 + else
  32 + false
39 end 33 end
  34 + end
40 35
41 - protected  
42 - def role_attributes(role, resource)  
43 - attributes = {:accessor_id => self.id, :accessor_type => self.class.base_class.name}  
44 - if role  
45 - attributes[:role_id] = role.id  
46 - end  
47 - if resource == 'global'  
48 - attributes[:is_global] = true  
49 - resource = nil  
50 - end  
51 - if resource  
52 - attributes[:resource_id] = resource.id  
53 - attributes[:resource_type] = resource.class.base_class.name  
54 - else  
55 - attributes[:resource_id] = nil  
56 - attributes[:resource_type] = nil  
57 - end  
58 - attributes 36 + def remove_role(role, resource)
  37 + return unless role
  38 + roles_destroy = RoleAssignment.find(:all, :conditions => role_attributes(role, resource))
  39 + return if roles_destroy.empty?
  40 + roles_destroy.map(&:destroy).all?
  41 + end
  42 +
  43 + def find_roles(res)
  44 + RoleAssignment.find(:all, :conditions => role_attributes(nil, res))
  45 + end
  46 +
  47 + protected
  48 + def role_attributes(role, resource)
  49 + attributes = {:accessor_id => self.id, :accessor_type => self.class.base_class.name}
  50 + if role
  51 + attributes[:role_id] = role.id
59 end 52 end
  53 + if resource == 'global'
  54 + attributes[:is_global] = true
  55 + resource = nil
  56 + end
  57 + if resource
  58 + attributes[:resource_id] = resource.id
  59 + attributes[:resource_type] = resource.class.base_class.name
  60 + else
  61 + attributes[:resource_id] = nil
  62 + attributes[:resource_type] = nil
  63 + end
  64 + attributes
60 end 65 end
61 end 66 end
  67 +
  68 +ActiveRecord::Base.send(:include, ActsAsAccessor)