tarsolya-declarative_authorization 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/CHANGELOG +139 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +503 -0
  4. data/Rakefile +43 -0
  5. data/app/controllers/authorization_rules_controller.rb +259 -0
  6. data/app/controllers/authorization_usages_controller.rb +23 -0
  7. data/app/helpers/authorization_rules_helper.rb +218 -0
  8. data/app/views/authorization_rules/_change.erb +58 -0
  9. data/app/views/authorization_rules/_show_graph.erb +37 -0
  10. data/app/views/authorization_rules/_suggestions.erb +48 -0
  11. data/app/views/authorization_rules/change.html.erb +169 -0
  12. data/app/views/authorization_rules/graph.dot.erb +68 -0
  13. data/app/views/authorization_rules/graph.html.erb +40 -0
  14. data/app/views/authorization_rules/index.html.erb +17 -0
  15. data/app/views/authorization_usages/index.html.erb +36 -0
  16. data/authorization_rules.dist.rb +20 -0
  17. data/config/routes.rb +7 -0
  18. data/garlic_example.rb +20 -0
  19. data/init.rb +5 -0
  20. data/lib/declarative_authorization.rb +15 -0
  21. data/lib/declarative_authorization/authorization.rb +681 -0
  22. data/lib/declarative_authorization/development_support/analyzer.rb +252 -0
  23. data/lib/declarative_authorization/development_support/change_analyzer.rb +253 -0
  24. data/lib/declarative_authorization/development_support/change_supporter.rb +620 -0
  25. data/lib/declarative_authorization/development_support/development_support.rb +243 -0
  26. data/lib/declarative_authorization/helper.rb +60 -0
  27. data/lib/declarative_authorization/in_controller.rb +623 -0
  28. data/lib/declarative_authorization/in_model.rb +162 -0
  29. data/lib/declarative_authorization/maintenance.rb +198 -0
  30. data/lib/declarative_authorization/obligation_scope.rb +345 -0
  31. data/lib/declarative_authorization/rails_legacy.rb +14 -0
  32. data/lib/declarative_authorization/reader.rb +496 -0
  33. data/test/authorization_test.rb +971 -0
  34. data/test/controller_filter_resource_access_test.rb +511 -0
  35. data/test/controller_test.rb +465 -0
  36. data/test/dsl_reader_test.rb +173 -0
  37. data/test/helper_test.rb +171 -0
  38. data/test/maintenance_test.rb +46 -0
  39. data/test/model_test.rb +1694 -0
  40. data/test/schema.sql +54 -0
  41. data/test/test_helper.rb +137 -0
  42. metadata +118 -0
@@ -0,0 +1,173 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+
3
+ class DSLReaderTest < Test::Unit::TestCase
4
+ def test_privileges
5
+ reader = Authorization::Reader::DSLReader.new
6
+ reader.parse %{
7
+ privileges do
8
+ privilege :test_priv do
9
+ includes :lower_priv
10
+ end
11
+ end
12
+ }
13
+ assert_equal 2, reader.privileges_reader.privileges.length
14
+ assert_equal [[:lower_priv, nil]],
15
+ reader.privileges_reader.privilege_hierarchy[:test_priv]
16
+ end
17
+
18
+ def test_privileges_with_context
19
+ reader = Authorization::Reader::DSLReader.new
20
+ reader.parse %{
21
+ privileges do
22
+ privilege :test_priv, :test_context do
23
+ includes :lower_priv
24
+ end
25
+ end
26
+ }
27
+ assert_equal [[:lower_priv, :test_context]],
28
+ reader.privileges_reader.privilege_hierarchy[:test_priv]
29
+ end
30
+
31
+ def test_privileges_one_line
32
+ reader = Authorization::Reader::DSLReader.new
33
+ reader.parse %{
34
+ privileges do
35
+ privilege :test_priv, :test_context, :includes => :lower_priv
36
+ privilege :test_priv_2, :test_context, :includes => [:lower_priv]
37
+ privilege :test_priv_3, :includes => [:lower_priv]
38
+ end
39
+ }
40
+ assert_equal [[:lower_priv, :test_context]],
41
+ reader.privileges_reader.privilege_hierarchy[:test_priv]
42
+ assert_equal [[:lower_priv, :test_context]],
43
+ reader.privileges_reader.privilege_hierarchy[:test_priv_2]
44
+ assert_equal [[:lower_priv, nil]],
45
+ reader.privileges_reader.privilege_hierarchy[:test_priv_3]
46
+ end
47
+
48
+ def test_auth_role
49
+ reader = Authorization::Reader::DSLReader.new
50
+ reader.parse %{
51
+ authorization do
52
+ role :test_role do
53
+ includes :lesser_role
54
+ has_permission_on :items, :to => :read
55
+ end
56
+ end
57
+ }
58
+ assert_equal 1, reader.auth_rules_reader.roles.length
59
+ assert_equal [:lesser_role], reader.auth_rules_reader.role_hierarchy[:test_role]
60
+ assert_equal 1, reader.auth_rules_reader.auth_rules.length
61
+ end
62
+
63
+ def test_auth_role_permit_on
64
+ reader = Authorization::Reader::DSLReader.new
65
+ reader.parse %|
66
+ authorization do
67
+ role :test_role do
68
+ has_permission_on :test_context do
69
+ to :test_perm, :manage
70
+ if_attribute :test_attr => is { user.test_attr }
71
+ end
72
+ end
73
+ end
74
+ |
75
+ assert_equal 1, reader.auth_rules_reader.roles.length
76
+ assert_equal 1, reader.auth_rules_reader.auth_rules.length
77
+ assert reader.auth_rules_reader.auth_rules[0].matches?(:test_role, [:test_perm], :test_context)
78
+ assert reader.auth_rules_reader.auth_rules[0].matches?(:test_role, [:manage], :test_context)
79
+ end
80
+
81
+ def test_permit_block
82
+ reader = Authorization::Reader::DSLReader.new
83
+ reader.parse %|
84
+ authorization do
85
+ role :test_role do
86
+ has_permission_on :perms, :to => :test do
87
+ if_attribute :test_attr => is { user.test_attr }
88
+ if_attribute :test_attr_2 => is_not { user.test_attr }
89
+ if_attribute :test_attr_3 => contains { user.test_attr }
90
+ if_attribute :test_attr_4 => does_not_contain { user.test_attr }
91
+ if_attribute :test_attr_5 => is_in { user.test_attr }
92
+ if_attribute :test_attr_5 => is_not_in { user.test_attr }
93
+ end
94
+ end
95
+ end
96
+ |
97
+ assert_equal 1, reader.auth_rules_reader.roles.length
98
+ assert_equal 1, reader.auth_rules_reader.auth_rules.length
99
+ assert reader.auth_rules_reader.auth_rules[0].matches?(:test_role, [:test], :perms)
100
+ end
101
+
102
+ def test_has_permission_to_with_context
103
+ reader = Authorization::Reader::DSLReader.new
104
+ reader.parse %|
105
+ authorization do
106
+ role :test_role do
107
+ has_permission_on :perms, :to => :test
108
+ end
109
+ end
110
+ |
111
+ assert_equal 1, reader.auth_rules_reader.roles.length
112
+ assert_equal 1, reader.auth_rules_reader.auth_rules.length
113
+ assert reader.auth_rules_reader.auth_rules[0].matches?(:test_role, [:test], :perms)
114
+ end
115
+
116
+ def test_context
117
+ reader = Authorization::Reader::DSLReader.new
118
+ reader.parse %{
119
+ contexts do
120
+ context :high_level_context do
121
+ includes :low_level_context_1, :low_level_context_2
122
+ end
123
+ end
124
+ }
125
+ end
126
+
127
+ def test_dsl_error
128
+ reader = Authorization::Reader::DSLReader.new
129
+ assert_raise(Authorization::Reader::DSLError) do
130
+ reader.parse %{
131
+ authorization do
132
+ includes :lesser_role
133
+ end
134
+ }
135
+ end
136
+ end
137
+
138
+ def test_syntax_error
139
+ reader = Authorization::Reader::DSLReader.new
140
+ assert_raise(Authorization::Reader::DSLSyntaxError) do
141
+ reader.parse %{
142
+ authorizations do
143
+ end
144
+ }
145
+ end
146
+ end
147
+
148
+ def test_syntax_error_2
149
+ reader = Authorization::Reader::DSLReader.new
150
+ assert_raise(Authorization::Reader::DSLSyntaxError) do
151
+ reader.parse %{
152
+ authorizations
153
+ end
154
+ }
155
+ end
156
+ end
157
+
158
+ def test_factory_returns_self
159
+ reader = Authorization::Reader::DSLReader.new
160
+ assert_equal(Authorization::Reader::DSLReader.factory(reader).object_id, reader.object_id)
161
+ end
162
+
163
+ def test_factory_loads_file
164
+ reader = Authorization::Reader::DSLReader.factory((DA_ROOT + "authorization_rules.dist.rb").to_s)
165
+ assert_equal(Authorization::Reader::DSLReader, reader.class)
166
+ end
167
+
168
+ def test_load_file_not_found
169
+ assert_raise(Authorization::Reader::DSLFileNotFoundError) do
170
+ Authorization::Reader::DSLReader.load("nonexistent_file.rb")
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,171 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization helper})
3
+
4
+
5
+ class HelperMocksController < MocksController
6
+ filter_access_to :action, :require => :show, :context => :mocks
7
+ define_action_methods :action
8
+ end
9
+ class HelperTest < ActionController::TestCase
10
+ tests HelperMocksController
11
+ include Authorization::AuthorizationHelper
12
+ attr_reader :controller
13
+
14
+ def test_permit
15
+ reader = Authorization::Reader::DSLReader.new
16
+ reader.parse %{
17
+ authorization do
18
+ role :test_role do
19
+ has_permission_on :mocks, :to => :show
20
+ end
21
+ role :test_role_2 do
22
+ has_permission_on :mocks, :to => :update
23
+ end
24
+ end
25
+ }
26
+ user = MockUser.new(:test_role)
27
+ request!(user, :action, reader)
28
+
29
+ assert permitted_to?(:show, :mocks)
30
+ assert !permitted_to?(:update, :mocks)
31
+
32
+ block_evaled = false
33
+ permitted_to?(:show, :mocks) do
34
+ block_evaled = true
35
+ end
36
+ assert block_evaled
37
+
38
+ block_evaled = false
39
+ permitted_to?(:update, :mocks) do
40
+ block_evaled = true
41
+ end
42
+ assert !block_evaled
43
+ end
44
+
45
+ def test_permit_with_object
46
+ reader = Authorization::Reader::DSLReader.new
47
+ reader.parse %{
48
+ authorization do
49
+ role :test_role do
50
+ has_permission_on :mocks do
51
+ to :show
52
+ if_attribute :test_attr => is {user.test_attr}
53
+ end
54
+ end
55
+ end
56
+ }
57
+ user = MockUser.new(:test_role, :test_attr => 1)
58
+ mock = MockDataObject.new(:test_attr => 1)
59
+ mock_2 = MockDataObject.new(:test_attr => 2)
60
+ request!(user, :action, reader)
61
+
62
+ assert permitted_to?(:show, mock)
63
+ assert permitted_to?(:show, :mocks)
64
+ assert !permitted_to?(:show, mock_2)
65
+ end
66
+
67
+ def test_permit_with_object_and_context
68
+ reader = Authorization::Reader::DSLReader.new
69
+ reader.parse %{
70
+ authorization do
71
+ role :test_role do
72
+ has_permission_on :other_mocks do
73
+ to :show
74
+ if_attribute :test_attr => is {user.test_attr}
75
+ end
76
+ end
77
+ end
78
+ }
79
+ user = MockUser.new(:test_role, :test_attr => 1)
80
+ mock = MockDataObject.new(:test_attr => 1)
81
+ mock_2 = MockDataObject.new(:test_attr => 2)
82
+ request!(user, :action, reader)
83
+
84
+ assert permitted_to?(:show, mock, :context => :other_mocks)
85
+ assert !permitted_to?(:show, mock_2, :context => :other_mocks)
86
+ end
87
+
88
+ def test_has_role
89
+ reader = Authorization::Reader::DSLReader.new
90
+ reader.parse %{
91
+ authorization do
92
+ role :test_role do
93
+ has_permission_on :mocks, :to => :show
94
+ end
95
+ end
96
+ }
97
+ user = MockUser.new(:test_role)
98
+ request!(user, :action, reader)
99
+
100
+ assert has_role?(:test_role)
101
+ assert !has_role?(:test_role2)
102
+
103
+ block_evaled = false
104
+ has_role?(:test_role) do
105
+ block_evaled = true
106
+ end
107
+ assert block_evaled
108
+
109
+ block_evaled = false
110
+ has_role?(:test_role2) do
111
+ block_evaled = true
112
+ end
113
+ assert !block_evaled
114
+ end
115
+
116
+ def test_has_role_with_guest_user
117
+ reader = Authorization::Reader::DSLReader.new
118
+ reader.parse %{
119
+ authorization do
120
+ end
121
+ }
122
+ request!(nil, :action, reader)
123
+
124
+ assert !has_role?(:test_role)
125
+
126
+ block_evaled = false
127
+ has_role?(:test_role) do
128
+ block_evaled = true
129
+ end
130
+ assert !block_evaled
131
+ end
132
+
133
+ def test_has_role_with_hierarchy
134
+ reader = Authorization::Reader::DSLReader.new
135
+ reader.parse %{
136
+ authorization do
137
+ role :test_role do
138
+ has_permission_on :mocks, :to => :show
139
+ end
140
+ role :other_role do
141
+ has_permission_on :another_mocks, :to => :show
142
+ end
143
+
144
+ role :root do
145
+ includes :test_role
146
+ end
147
+ end
148
+ }
149
+
150
+ user = MockUser.new(:root)
151
+ request!(user, :action, reader)
152
+
153
+ assert has_role_with_hierarchy?(:test_role)
154
+ assert !has_role_with_hierarchy?(:other_role)
155
+
156
+ block_evaled = false
157
+ has_role_with_hierarchy?(:test_role) do
158
+ block_evaled = true
159
+ end
160
+ assert block_evaled
161
+
162
+ block_evaled = false
163
+ has_role_with_hierarchy?(:test_role2) do
164
+ block_evaled = true
165
+ end
166
+ assert !block_evaled
167
+
168
+ end
169
+
170
+
171
+ end
@@ -0,0 +1,46 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization maintenance})
3
+
4
+ class MaintenanceTest < Test::Unit::TestCase
5
+ include Authorization::TestHelper
6
+
7
+ def test_usages_by_controllers
8
+ usage_test_controller = Class.new(ActionController::Base)
9
+ usage_test_controller.send(:define_method, :an_action) {}
10
+ usage_test_controller.filter_access_to :an_action
11
+
12
+ assert Authorization::Maintenance::Usage::usages_by_controller.
13
+ include?(usage_test_controller)
14
+ end
15
+
16
+ def test_without_access_control
17
+ reader = Authorization::Reader::DSLReader.new
18
+ reader.parse %{
19
+ authorization do
20
+ role :test_role do
21
+ has_permission_on :permissions, :to => :test
22
+ end
23
+ end
24
+ }
25
+ engine = Authorization::Engine.new(reader)
26
+ assert !engine.permit?(:test_2, :context => :permissions,
27
+ :user => MockUser.new(:test_role))
28
+ Authorization::Maintenance::without_access_control do
29
+ assert engine.permit!(:test_2, :context => :permissions,
30
+ :user => MockUser.new(:test_role))
31
+ end
32
+ without_access_control do
33
+ assert engine.permit?(:test_2, :context => :permissions,
34
+ :user => MockUser.new(:test_role))
35
+ end
36
+ Authorization::Maintenance::without_access_control do
37
+ Authorization::Maintenance::without_access_control do
38
+ assert engine.permit?(:test_2, :context => :permissions,
39
+ :user => MockUser.new(:test_role))
40
+ end
41
+ assert engine.permit?(:test_2, :context => :permissions,
42
+ :user => MockUser.new(:test_role))
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,1694 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization in_model})
3
+
4
+ ActiveRecord::Base.send :include, Authorization::AuthorizationInModel
5
+ #ActiveRecord::Base.logger = Logger.new(STDOUT)
6
+
7
+ options = {:adapter => 'sqlite3', :timeout => 500, :database => ':memory:'}
8
+ ActiveRecord::Base.establish_connection(options)
9
+ ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options }
10
+ ActiveRecord::Base.connection
11
+
12
+ File.read(File.dirname(__FILE__) + "/schema.sql").split(';').each do |sql|
13
+ ActiveRecord::Base.connection.execute(sql) unless sql.blank?
14
+ end
15
+
16
+ class TestModel < ActiveRecord::Base
17
+ has_many :test_attrs
18
+ has_many :test_another_attrs, :class_name => "TestAttr", :foreign_key => :test_another_model_id
19
+ has_many :test_attr_throughs, :through => :test_attrs
20
+ has_many :test_attrs_with_attr, :class_name => "TestAttr", :conditions => {:attr => 1}
21
+ has_many :test_attr_throughs_with_attr, :through => :test_attrs,
22
+ :class_name => "TestAttrThrough", :source => :test_attr_throughs,
23
+ :conditions => "test_attrs.attr = 1"
24
+ has_one :test_attr_has_one, :class_name => "TestAttr"
25
+ has_one :test_attr_throughs_with_attr_and_has_one, :through => :test_attrs,
26
+ :class_name => "TestAttrThrough", :source => :test_attr_throughs,
27
+ :conditions => "test_attrs.attr = 1"
28
+
29
+ # TODO currently not working in Rails 3
30
+ if Rails.version < "3"
31
+ has_and_belongs_to_many :test_attr_throughs_habtm, :join_table => :test_attrs,
32
+ :class_name => "TestAttrThrough"
33
+ end
34
+
35
+ if Rails.version < "3"
36
+ named_scope :with_content, :conditions => "test_models.content IS NOT NULL"
37
+ else
38
+ scope :with_content, :conditions => "test_models.content IS NOT NULL"
39
+ end
40
+
41
+ # Primary key test
42
+ # :primary_key only available from Rails 2.2
43
+ unless Rails.version < "2.2"
44
+ has_many :test_attrs_with_primary_id, :class_name => "TestAttr",
45
+ :primary_key => :test_attr_through_id, :foreign_key => :test_attr_through_id
46
+ has_many :test_attr_throughs_with_primary_id,
47
+ :through => :test_attrs_with_primary_id, :class_name => "TestAttrThrough",
48
+ :source => :n_way_join_item
49
+ end
50
+
51
+ # for checking for unnecessary queries
52
+ mattr_accessor :query_count
53
+ def self.find(*args)
54
+ self.query_count ||= 0
55
+ self.query_count += 1
56
+ super(*args)
57
+ end
58
+ end
59
+
60
+ class NWayJoinItem < ActiveRecord::Base
61
+ has_many :test_attrs
62
+ has_many :others, :through => :test_attrs, :source => :n_way_join_item
63
+ end
64
+
65
+ class TestAttr < ActiveRecord::Base
66
+ belongs_to :test_model
67
+ belongs_to :test_another_model, :class_name => "TestModel", :foreign_key => :test_another_model_id
68
+ belongs_to :test_a_third_model, :class_name => "TestModel", :foreign_key => :test_a_third_model_id
69
+ belongs_to :n_way_join_item
70
+ belongs_to :test_attr
71
+ belongs_to :branch
72
+ belongs_to :company
73
+ has_many :test_attr_throughs
74
+ attr_reader :role_symbols
75
+ def initialize (*args)
76
+ @role_symbols = []
77
+ super(*args)
78
+ end
79
+ end
80
+
81
+ class TestAttrThrough < ActiveRecord::Base
82
+ belongs_to :test_attr
83
+ end
84
+
85
+ class TestModelSecurityModel < ActiveRecord::Base
86
+ has_many :test_attrs
87
+ using_access_control
88
+ end
89
+ class TestModelSecurityModelWithFind < ActiveRecord::Base
90
+ set_table_name "test_model_security_models"
91
+ has_many :test_attrs
92
+ using_access_control :include_read => true,
93
+ :context => :test_model_security_models
94
+ end
95
+
96
+ class Branch < ActiveRecord::Base
97
+ has_many :test_attrs
98
+ belongs_to :company
99
+ end
100
+ class Company < ActiveRecord::Base
101
+ has_many :test_attrs
102
+ has_many :branches
103
+ belongs_to :country
104
+ end
105
+ class SmallCompany < Company
106
+ def self.decl_auth_context
107
+ :companies
108
+ end
109
+ end
110
+ class Country < ActiveRecord::Base
111
+ has_many :test_models
112
+ has_many :companies
113
+ end
114
+
115
+ class NamedScopeModelTest < Test::Unit::TestCase
116
+ def test_multiple_deep_ored_belongs_to
117
+ reader = Authorization::Reader::DSLReader.new
118
+ reader.parse %{
119
+ authorization do
120
+ role :test_role do
121
+ has_permission_on :test_attrs, :to => :read do
122
+ if_attribute :test_model => {:test_attrs => contains {user}}
123
+ if_attribute :test_another_model => {:test_attrs => contains {user}}
124
+ end
125
+ end
126
+ end
127
+ }
128
+ Authorization::Engine.instance(reader)
129
+
130
+ test_model_1 = TestModel.create!
131
+ test_model_2 = TestModel.create!
132
+ test_attr_1 = TestAttr.create! :test_model_id => test_model_1.id,
133
+ :test_another_model_id => test_model_2.id
134
+
135
+ user = MockUser.new(:test_role, :id => test_attr_1)
136
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
137
+ TestAttr.delete_all
138
+ TestModel.delete_all
139
+ end
140
+
141
+ def test_with_belongs_to_and_has_many_with_contains
142
+ reader = Authorization::Reader::DSLReader.new
143
+ reader.parse %{
144
+ authorization do
145
+ role :test_role do
146
+ has_permission_on :test_attrs, :to => :read do
147
+ if_attribute :test_model => { :test_attrs => contains { user.test_attr_value } }
148
+ end
149
+ end
150
+ end
151
+ }
152
+ Authorization::Engine.instance(reader)
153
+
154
+ test_attr_1 = TestAttr.create!
155
+ test_model_1 = TestModel.create!
156
+ test_model_1.test_attrs.create!
157
+
158
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.test_attrs.first.id )
159
+ assert_equal 1, TestAttr.with_permissions_to( :read, :context => :test_attrs, :user => user ).length
160
+ assert_equal 1, TestAttr.with_permissions_to( :read, :user => user ).length
161
+ assert_raise Authorization::NotAuthorized do
162
+ TestAttr.with_permissions_to( :update_test_attrs, :user => user )
163
+ end
164
+ TestAttr.delete_all
165
+ TestModel.delete_all
166
+ end
167
+
168
+ def test_with_nested_has_many
169
+ reader = Authorization::Reader::DSLReader.new
170
+ reader.parse %{
171
+ authorization do
172
+ role :test_role do
173
+ has_permission_on :companies, :to => :read do
174
+ if_attribute :branches => { :test_attrs => { :attr => is { user.test_attr_value } } }
175
+ end
176
+ end
177
+ end
178
+ }
179
+ Authorization::Engine.instance(reader)
180
+
181
+ allowed_company = Company.create!
182
+ allowed_company.branches.create!.test_attrs.create!(:attr => 1)
183
+ allowed_company.branches.create!.test_attrs.create!(:attr => 2)
184
+
185
+ prohibited_company = Company.create!
186
+ prohibited_company.branches.create!.test_attrs.create!(:attr => 3)
187
+
188
+ user = MockUser.new(:test_role, :test_attr_value => 1)
189
+ prohibited_user = MockUser.new(:test_role, :test_attr_value => 4)
190
+ assert_equal 1, Company.with_permissions_to(:read, :user => user).length
191
+ assert_equal 0, Company.with_permissions_to(:read, :user => prohibited_user).length
192
+
193
+ Company.delete_all
194
+ Branch.delete_all
195
+ TestAttr.delete_all
196
+ end
197
+
198
+ def test_with_nested_has_many_through
199
+ reader = Authorization::Reader::DSLReader.new
200
+ reader.parse %{
201
+ authorization do
202
+ role :test_role do
203
+ has_permission_on :test_models, :to => :read do
204
+ if_attribute :test_attr_throughs => { :test_attr => { :attr => is { user.test_attr_value } } }
205
+ end
206
+ end
207
+ end
208
+ }
209
+ Authorization::Engine.instance(reader)
210
+
211
+ allowed_model = TestModel.create!
212
+ allowed_model.test_attrs.create!(:attr => 1).test_attr_throughs.create!
213
+ allowed_model.test_attrs.create!(:attr => 2).test_attr_throughs.create!
214
+
215
+ prohibited_model = TestModel.create!
216
+ prohibited_model.test_attrs.create!(:attr => 3).test_attr_throughs.create!
217
+
218
+ user = MockUser.new(:test_role, :test_attr_value => 1)
219
+ prohibited_user = MockUser.new(:test_role, :test_attr_value => 4)
220
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
221
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => prohibited_user).length
222
+
223
+ TestModel.delete_all
224
+ TestAttrThrough.delete_all
225
+ TestAttr.delete_all
226
+ end
227
+
228
+ def test_with_is
229
+ reader = Authorization::Reader::DSLReader.new
230
+ reader.parse %{
231
+ authorization do
232
+ role :test_role do
233
+ has_permission_on :test_models, :to => :read do
234
+ if_attribute :id => is { user.test_attr_value }
235
+ end
236
+ end
237
+ end
238
+ }
239
+ Authorization::Engine.instance(reader)
240
+
241
+ test_model_1 = TestModel.create!
242
+ TestModel.create!
243
+
244
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
245
+ assert_equal 1, TestModel.with_permissions_to(:read,
246
+ :context => :test_models, :user => user).length
247
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
248
+ assert_raise Authorization::NotAuthorized do
249
+ TestModel.with_permissions_to(:update_test_models, :user => user)
250
+ end
251
+ TestModel.delete_all
252
+ end
253
+
254
+ def test_named_scope_on_proxy
255
+ reader = Authorization::Reader::DSLReader.new
256
+ reader.parse %{
257
+ authorization do
258
+ role :test_role do
259
+ has_permission_on :test_attrs, :to => :read do
260
+ if_attribute :id => is { user.test_attr_value }
261
+ end
262
+ end
263
+ end
264
+ }
265
+ Authorization::Engine.instance(reader)
266
+
267
+ test_model_1 = TestModel.create!
268
+ test_attr_1 = test_model_1.test_attrs.create!
269
+ test_model_1.test_attrs.create!
270
+ TestAttr.create!
271
+
272
+ user = MockUser.new(:test_role, :test_attr_value => test_attr_1.id)
273
+ assert_equal 1, test_model_1.test_attrs.with_permissions_to(:read, :user => user).length
274
+ TestModel.delete_all
275
+ TestAttr.delete_all
276
+ end
277
+
278
+ def test_named_scope_on_named_scope
279
+ reader = Authorization::Reader::DSLReader.new
280
+ reader.parse %{
281
+ authorization do
282
+ role :test_role do
283
+ has_permission_on :test_models, :to => :read do
284
+ if_attribute :country_id => 1
285
+ end
286
+ end
287
+ end
288
+ }
289
+ Authorization::Engine.instance(reader)
290
+
291
+ TestModel.create!(:country_id => 1, :content => "Content")
292
+ TestModel.create!(:country_id => 1)
293
+ TestModel.create!(:country_id => 2, :content => "Content")
294
+
295
+ user = MockUser.new(:test_role)
296
+
297
+ # TODO implement query_count for Rails 3
298
+ TestModel.query_count = 0
299
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
300
+ assert_equal 1, TestModel.query_count if Rails.version < "3"
301
+
302
+ TestModel.query_count = 0
303
+ assert_equal 1, TestModel.with_content.with_permissions_to(:read, :user => user).length
304
+ assert_equal 1, TestModel.query_count if Rails.version < "3"
305
+
306
+ TestModel.query_count = 0
307
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).with_content.length
308
+ assert_equal 1, TestModel.query_count if Rails.version < "3"
309
+
310
+ TestModel.delete_all
311
+ end
312
+
313
+ def test_with_modified_context
314
+ reader = Authorization::Reader::DSLReader.new
315
+ reader.parse %{
316
+ authorization do
317
+ role :test_role do
318
+ has_permission_on :companies, :to => :read do
319
+ if_attribute :id => is { user.test_company_id }
320
+ end
321
+ end
322
+ end
323
+ }
324
+ Authorization::Engine.instance(reader)
325
+
326
+ test_company = SmallCompany.create!
327
+
328
+ user = MockUser.new(:test_role, :test_company_id => test_company.id)
329
+ assert_equal 1, SmallCompany.with_permissions_to(:read,
330
+ :user => user).length
331
+ SmallCompany.delete_all
332
+ end
333
+
334
+ def test_with_is_nil
335
+ reader = Authorization::Reader::DSLReader.new
336
+ reader.parse %{
337
+ authorization do
338
+ role :test_role do
339
+ has_permission_on :test_models, :to => :read do
340
+ if_attribute :content => nil
341
+ end
342
+ end
343
+ role :test_role_not_nil do
344
+ has_permission_on :test_models, :to => :read do
345
+ if_attribute :content => is_not { nil }
346
+ end
347
+ end
348
+ end
349
+ }
350
+ Authorization::Engine.instance(reader)
351
+
352
+ test_model_1 = TestModel.create!
353
+ test_model_2 = TestModel.create! :content => "Content"
354
+
355
+ assert_equal test_model_1, TestModel.with_permissions_to(:read,
356
+ :context => :test_models, :user => MockUser.new(:test_role)).first
357
+ assert_equal test_model_2, TestModel.with_permissions_to(:read,
358
+ :context => :test_models, :user => MockUser.new(:test_role_not_nil)).first
359
+ TestModel.delete_all
360
+ end
361
+
362
+ def test_with_not_is
363
+ reader = Authorization::Reader::DSLReader.new
364
+ reader.parse %{
365
+ authorization do
366
+ role :test_role do
367
+ has_permission_on :test_models, :to => :read do
368
+ if_attribute :id => is_not { user.test_attr_value }
369
+ end
370
+ end
371
+ end
372
+ }
373
+ Authorization::Engine.instance(reader)
374
+
375
+ test_model_1 = TestModel.create!
376
+ TestModel.create!
377
+
378
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
379
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
380
+ TestModel.delete_all
381
+ end
382
+
383
+ def test_with_empty_obligations
384
+ reader = Authorization::Reader::DSLReader.new
385
+ reader.parse %{
386
+ authorization do
387
+ role :test_role do
388
+ has_permission_on :test_models, :to => :read
389
+ end
390
+ end
391
+ }
392
+ Authorization::Engine.instance(reader)
393
+
394
+ TestModel.create!
395
+
396
+ user = MockUser.new(:test_role)
397
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
398
+ assert_raise Authorization::NotAuthorized do
399
+ TestModel.with_permissions_to(:update, :user => user)
400
+ end
401
+ TestModel.delete_all
402
+ end
403
+
404
+ def test_multiple_obligations
405
+ reader = Authorization::Reader::DSLReader.new
406
+ reader.parse %{
407
+ authorization do
408
+ role :test_role do
409
+ has_permission_on :test_models, :to => :read do
410
+ if_attribute :id => is { user.test_attr_value }
411
+ end
412
+ has_permission_on :test_models, :to => :read do
413
+ if_attribute :id => is { user.test_attr_value_2 }
414
+ end
415
+ end
416
+ end
417
+ }
418
+ Authorization::Engine.instance(reader)
419
+
420
+ test_model_1 = TestModel.create!
421
+ test_model_2 = TestModel.create!
422
+
423
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id,
424
+ :test_attr_value_2 => test_model_2.id)
425
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
426
+ TestModel.delete_all
427
+ end
428
+
429
+ def test_multiple_roles
430
+ reader = Authorization::Reader::DSLReader.new
431
+ reader.parse %{
432
+ authorization do
433
+ role :test_role do
434
+ has_permission_on :test_attrs, :to => :read do
435
+ if_attribute :attr => [1,2]
436
+ end
437
+ end
438
+
439
+ role :test_role_2 do
440
+ has_permission_on :test_attrs, :to => :read do
441
+ if_attribute :attr => [2,3]
442
+ end
443
+ end
444
+ end
445
+ }
446
+ Authorization::Engine.instance(reader)
447
+
448
+ TestAttr.create! :attr => 1
449
+ TestAttr.create! :attr => 2
450
+ TestAttr.create! :attr => 3
451
+
452
+ user = MockUser.new(:test_role)
453
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
454
+ TestAttr.delete_all
455
+ end
456
+
457
+ def test_multiple_and_empty_obligations
458
+ reader = Authorization::Reader::DSLReader.new
459
+ reader.parse %{
460
+ authorization do
461
+ role :test_role do
462
+ has_permission_on :test_models, :to => :read do
463
+ if_attribute :id => is { user.test_attr_value }
464
+ end
465
+ has_permission_on :test_models, :to => :read
466
+ end
467
+ end
468
+ }
469
+ Authorization::Engine.instance(reader)
470
+
471
+ test_model_1 = TestModel.create!
472
+ TestModel.create!
473
+
474
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
475
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
476
+ TestModel.delete_all
477
+ end
478
+
479
+ def test_multiple_attributes
480
+ reader = Authorization::Reader::DSLReader.new
481
+ reader.parse %{
482
+ authorization do
483
+ role :test_role do
484
+ has_permission_on :test_models, :to => :read do
485
+ if_attribute :id => is { user.test_attr_value }, :content => "bla"
486
+ end
487
+ end
488
+ end
489
+ }
490
+ Authorization::Engine.instance(reader)
491
+
492
+ test_model_1 = TestModel.create! :content => 'bla'
493
+ TestModel.create! :content => 'bla'
494
+ TestModel.create!
495
+
496
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
497
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
498
+ TestModel.delete_all
499
+ end
500
+
501
+ def test_multiple_belongs_to
502
+ reader = Authorization::Reader::DSLReader.new
503
+ reader.parse %{
504
+ authorization do
505
+ role :test_role do
506
+ has_permission_on :test_attrs, :to => :read do
507
+ if_attribute :test_model => is {user}
508
+ if_attribute :test_another_model => is {user}
509
+ end
510
+ end
511
+ end
512
+ }
513
+ Authorization::Engine.instance(reader)
514
+
515
+ test_attr_1 = TestAttr.create! :test_model_id => 1, :test_another_model_id => 2
516
+
517
+ user = MockUser.new(:test_role, :id => 1)
518
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
519
+ TestAttr.delete_all
520
+ end
521
+
522
+ def test_with_is_and_priv_hierarchy
523
+ reader = Authorization::Reader::DSLReader.new
524
+ reader.parse %{
525
+ privileges do
526
+ privilege :read do
527
+ includes :list, :show
528
+ end
529
+ end
530
+ authorization do
531
+ role :test_role do
532
+ has_permission_on :test_models, :to => :read do
533
+ if_attribute :id => is { user.test_attr_value }
534
+ end
535
+ end
536
+ end
537
+ }
538
+ Authorization::Engine.instance(reader)
539
+
540
+ test_model_1 = TestModel.create!
541
+ TestModel.create!
542
+
543
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
544
+ assert_equal 1, TestModel.with_permissions_to(:list,
545
+ :context => :test_models, :user => user).length
546
+ assert_equal 1, TestModel.with_permissions_to(:list, :user => user).length
547
+
548
+ TestModel.delete_all
549
+ end
550
+
551
+ def test_with_is_and_belongs_to
552
+ reader = Authorization::Reader::DSLReader.new
553
+ reader.parse %{
554
+ authorization do
555
+ role :test_role do
556
+ has_permission_on :test_attrs, :to => :read do
557
+ if_attribute :test_model => is { user.test_model }
558
+ end
559
+ end
560
+ end
561
+ }
562
+ Authorization::Engine.instance(reader)
563
+
564
+ test_model_1 = TestModel.create!
565
+ test_model_1.test_attrs.create!
566
+ TestModel.create!.test_attrs.create!
567
+
568
+ user = MockUser.new(:test_role, :test_model => test_model_1)
569
+ assert_equal 1, TestAttr.with_permissions_to(:read,
570
+ :context => :test_attrs, :user => user).length
571
+
572
+ TestModel.delete_all
573
+ TestAttr.delete_all
574
+ end
575
+
576
+ def test_with_deep_attribute
577
+ reader = Authorization::Reader::DSLReader.new
578
+ reader.parse %{
579
+ authorization do
580
+ role :test_role do
581
+ has_permission_on :test_attrs, :to => :read do
582
+ if_attribute :test_model => {:id => is { user.test_model_id } }
583
+ end
584
+ end
585
+ end
586
+ }
587
+ Authorization::Engine.instance(reader)
588
+
589
+ test_model_1 = TestModel.create!
590
+ test_model_1.test_attrs.create!
591
+ TestModel.create!.test_attrs.create!
592
+
593
+ user = MockUser.new(:test_role, :test_model_id => test_model_1.id)
594
+ assert_equal 1, TestAttr.with_permissions_to(:read,
595
+ :context => :test_attrs, :user => user).length
596
+
597
+ TestModel.delete_all
598
+ TestAttr.delete_all
599
+ end
600
+
601
+ def test_with_anded_rules
602
+ reader = Authorization::Reader::DSLReader.new
603
+ reader.parse %{
604
+ authorization do
605
+ role :test_role do
606
+ has_permission_on :test_attrs, :to => :read, :join_by => :and do
607
+ if_attribute :test_model => is { user.test_model }
608
+ if_attribute :attr => 1
609
+ end
610
+ end
611
+ end
612
+ }
613
+ Authorization::Engine.instance(reader)
614
+
615
+ test_model_1 = TestModel.create!
616
+ test_model_1.test_attrs.create!(:attr => 1)
617
+ TestModel.create!.test_attrs.create!(:attr => 1)
618
+ TestModel.create!.test_attrs.create!
619
+
620
+ user = MockUser.new(:test_role, :test_model => test_model_1)
621
+ assert_equal 1, TestAttr.with_permissions_to(:read,
622
+ :context => :test_attrs, :user => user).length
623
+
624
+ TestModel.delete_all
625
+ TestAttr.delete_all
626
+ end
627
+
628
+ def test_with_contains
629
+ reader = Authorization::Reader::DSLReader.new
630
+ reader.parse %{
631
+ authorization do
632
+ role :test_role do
633
+ has_permission_on :test_models, :to => :read do
634
+ if_attribute :test_attrs => contains { user }
635
+ end
636
+ end
637
+ end
638
+ }
639
+ Authorization::Engine.instance(reader)
640
+
641
+ test_model_1 = TestModel.create!
642
+ test_model_2 = TestModel.create!
643
+ test_model_1.test_attrs.create!
644
+ test_model_1.test_attrs.create!
645
+ test_model_2.test_attrs.create!
646
+
647
+ user = MockUser.new(:test_role,
648
+ :id => test_model_1.test_attrs.first.id)
649
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
650
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).find(:all, :conditions => {:id => test_model_1.id}).length
651
+
652
+ TestModel.delete_all
653
+ TestAttr.delete_all
654
+ end
655
+
656
+ def test_with_does_not_contain
657
+ reader = Authorization::Reader::DSLReader.new
658
+ reader.parse %{
659
+ authorization do
660
+ role :test_role do
661
+ has_permission_on :test_models, :to => :read do
662
+ if_attribute :test_attrs => does_not_contain { user }
663
+ end
664
+ end
665
+ end
666
+ }
667
+ Authorization::Engine.instance(reader)
668
+
669
+ test_model_1 = TestModel.create!
670
+ test_model_2 = TestModel.create!
671
+ test_model_1.test_attrs.create!
672
+ test_model_2.test_attrs.create!
673
+
674
+ user = MockUser.new(:test_role,
675
+ :id => test_model_1.test_attrs.first.id)
676
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
677
+
678
+ TestModel.delete_all
679
+ TestAttr.delete_all
680
+ end
681
+
682
+ def test_with_contains_conditions
683
+ reader = Authorization::Reader::DSLReader.new
684
+ reader.parse %{
685
+ authorization do
686
+ role :test_role do
687
+ has_permission_on :test_models, :to => :read do
688
+ if_attribute :test_attrs_with_attr => contains { user }
689
+ end
690
+ end
691
+ end
692
+ }
693
+ Authorization::Engine.instance(reader)
694
+
695
+ test_model_1 = TestModel.create!
696
+ test_model_2 = TestModel.create!
697
+ test_model_1.test_attrs_with_attr.create!
698
+ test_model_1.test_attrs.create!(:attr => 2)
699
+ test_model_2.test_attrs_with_attr.create!
700
+ test_model_2.test_attrs.create!(:attr => 2)
701
+
702
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
703
+ user = MockUser.new(:test_role,
704
+ :id => test_model_1.test_attrs.first.id)
705
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
706
+ user = MockUser.new(:test_role,
707
+ :id => test_model_1.test_attrs.last.id)
708
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
709
+
710
+ TestModel.delete_all
711
+ TestAttr.delete_all
712
+ end
713
+
714
+ # TODO fails in Rails 3 because TestModel.scoped.joins(:test_attr_throughs_with_attr)
715
+ # does not work
716
+ if Rails.version < "3"
717
+ def test_with_contains_through_conditions
718
+ reader = Authorization::Reader::DSLReader.new
719
+ reader.parse %{
720
+ authorization do
721
+ role :test_role do
722
+ has_permission_on :test_models, :to => :read do
723
+ if_attribute :test_attr_throughs_with_attr => contains { user }
724
+ end
725
+ end
726
+ end
727
+ }
728
+ Authorization::Engine.instance(reader)
729
+
730
+ test_model_1 = TestModel.create!
731
+ test_model_2 = TestModel.create!
732
+ test_model_1.test_attrs.create!(:attr => 1).test_attr_throughs.create!
733
+ test_model_1.test_attrs.create!(:attr => 2).test_attr_throughs.create!
734
+ test_model_2.test_attrs.create!(:attr => 1).test_attr_throughs.create!
735
+ test_model_2.test_attrs.create!(:attr => 2).test_attr_throughs.create!
736
+
737
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
738
+ user = MockUser.new(:test_role,
739
+ :id => test_model_1.test_attr_throughs.first.id)
740
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
741
+ user = MockUser.new(:test_role,
742
+ :id => test_model_1.test_attr_throughs.last.id)
743
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
744
+
745
+ TestModel.delete_all
746
+ TestAttrThrough.delete_all
747
+ TestAttr.delete_all
748
+ end
749
+ end
750
+
751
+ if Rails.version < "3"
752
+ def test_with_contains_habtm
753
+ reader = Authorization::Reader::DSLReader.new
754
+ reader.parse %{
755
+ authorization do
756
+ role :test_role do
757
+ has_permission_on :test_models, :to => :read do
758
+ if_attribute :test_attr_throughs_habtm => contains { user.test_attr_through_id }
759
+ end
760
+ end
761
+ end
762
+ }
763
+ Authorization::Engine.instance(reader)
764
+
765
+ # TODO habtm currently not working in Rails 3
766
+ test_model_1 = TestModel.create!
767
+ test_model_2 = TestModel.create!
768
+ test_attr_through_1 = TestAttrThrough.create!
769
+ test_attr_through_2 = TestAttrThrough.create!
770
+ TestAttr.create! :test_model_id => test_model_1.id, :test_attr_through_id => test_attr_through_1.id
771
+ TestAttr.create! :test_model_id => test_model_2.id, :test_attr_through_id => test_attr_through_2.id
772
+
773
+ user = MockUser.new(:test_role,
774
+ :test_attr_through_id => test_model_1.test_attr_throughs_habtm.first.id)
775
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
776
+ assert_equal test_model_1, TestModel.with_permissions_to(:read, :user => user)[0]
777
+
778
+ TestModel.delete_all
779
+ TestAttrThrough.delete_all
780
+ TestAttr.delete_all
781
+ end
782
+ end
783
+
784
+ # :primary_key not available in Rails prior to 2.2
785
+ if Rails.version > "2.2"
786
+ def test_with_contains_through_primary_key
787
+ reader = Authorization::Reader::DSLReader.new
788
+ reader.parse %{
789
+ authorization do
790
+ role :test_role do
791
+ has_permission_on :test_models, :to => :read do
792
+ if_attribute :test_attr_throughs_with_primary_id => contains { user }
793
+ end
794
+ end
795
+ end
796
+ }
797
+ Authorization::Engine.instance(reader)
798
+
799
+ test_attr_through_1 = TestAttrThrough.create!
800
+ test_item = NWayJoinItem.create!
801
+ test_model_1 = TestModel.create!(:test_attr_through_id => test_attr_through_1.id)
802
+ test_attr_1 = TestAttr.create!(:test_attr_through_id => test_attr_through_1.id,
803
+ :n_way_join_item_id => test_item.id)
804
+
805
+ user = MockUser.new(:test_role,
806
+ :id => test_attr_through_1.id)
807
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
808
+
809
+ TestModel.delete_all
810
+ TestAttrThrough.delete_all
811
+ TestAttr.delete_all
812
+ end
813
+ end
814
+
815
+ def test_with_intersects_with
816
+ reader = Authorization::Reader::DSLReader.new
817
+ reader.parse %{
818
+ authorization do
819
+ role :test_role do
820
+ has_permission_on :test_models, :to => :read do
821
+ if_attribute :test_attrs => intersects_with { user.test_attrs }
822
+ end
823
+ end
824
+ end
825
+ }
826
+ Authorization::Engine.instance(reader)
827
+
828
+ test_model_1 = TestModel.create!
829
+ test_model_2 = TestModel.create!
830
+ test_model_1.test_attrs.create!
831
+ test_model_1.test_attrs.create!
832
+ test_model_1.test_attrs.create!
833
+ test_model_2.test_attrs.create!
834
+
835
+ user = MockUser.new(:test_role,
836
+ :test_attrs => [test_model_1.test_attrs.first, TestAttr.create!])
837
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
838
+
839
+ user = MockUser.new(:test_role,
840
+ :test_attrs => [TestAttr.create!])
841
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
842
+
843
+ TestModel.delete_all
844
+ TestAttr.delete_all
845
+ end
846
+
847
+ def test_with_is_and_has_one
848
+ reader = Authorization::Reader::DSLReader.new
849
+ reader.parse %{
850
+ authorization do :test_attr_has_one
851
+ role :test_role do
852
+ has_permission_on :test_models, :to => :read do
853
+ if_attribute :test_attr_has_one => is { user.test_attr }
854
+ end
855
+ end
856
+ end
857
+ }
858
+ Authorization::Engine.instance(reader)
859
+
860
+ test_model_1 = TestModel.create!
861
+ test_attr_1 = test_model_1.test_attrs.create!
862
+ TestModel.create!.test_attrs.create!
863
+
864
+ user = MockUser.new(:test_role, :test_attr => test_attr_1)
865
+ assert_equal 1, TestModel.with_permissions_to(:read,
866
+ :context => :test_models, :user => user).length
867
+
868
+ TestModel.delete_all
869
+ TestAttr.delete_all
870
+ end
871
+
872
+ # TODO fails in Rails 3 because TestModel.scoped.joins(:test_attr_throughs_with_attr)
873
+ # does not work
874
+ if Rails.version < "3"
875
+ def test_with_is_and_has_one_through_conditions
876
+ reader = Authorization::Reader::DSLReader.new
877
+ reader.parse %{
878
+ authorization do
879
+ role :test_role do
880
+ has_permission_on :test_models, :to => :read do
881
+ if_attribute :test_attr_throughs_with_attr_and_has_one => is { user }
882
+ end
883
+ end
884
+ end
885
+ }
886
+ Authorization::Engine.instance(reader)
887
+
888
+ test_model_1 = TestModel.create!
889
+ test_model_2 = TestModel.create!
890
+ test_model_1.test_attrs.create!(:attr => 1).test_attr_throughs.create!
891
+ test_model_1.test_attrs.create!(:attr => 2).test_attr_throughs.create!
892
+ test_model_2.test_attrs.create!(:attr => 1).test_attr_throughs.create!
893
+ test_model_2.test_attrs.create!(:attr => 2).test_attr_throughs.create!
894
+
895
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
896
+ user = MockUser.new(:test_role,
897
+ :id => test_model_1.test_attr_throughs.first.id)
898
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
899
+ user = MockUser.new(:test_role,
900
+ :id => test_model_1.test_attr_throughs.last.id)
901
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
902
+
903
+ TestModel.delete_all
904
+ TestAttr.delete_all
905
+ TestAttrThrough.delete_all
906
+ end
907
+ end
908
+
909
+ def test_with_is_in
910
+ reader = Authorization::Reader::DSLReader.new
911
+ reader.parse %{
912
+ authorization do
913
+ role :test_role do
914
+ has_permission_on :test_attrs, :to => :read do
915
+ if_attribute :test_model => is_in { [user.test_model, user.test_model_2] }
916
+ end
917
+ end
918
+ end
919
+ }
920
+ Authorization::Engine.instance(reader)
921
+
922
+ test_model_1 = TestModel.create!
923
+ test_model_2 = TestModel.create!
924
+ test_model_1.test_attrs.create!
925
+ TestModel.create!.test_attrs.create!
926
+
927
+ user = MockUser.new(:test_role, :test_model => test_model_1,
928
+ :test_model_2 => test_model_2)
929
+ assert_equal 1, TestAttr.with_permissions_to(:read,
930
+ :context => :test_attrs, :user => user).length
931
+
932
+ TestModel.delete_all
933
+ TestAttr.delete_all
934
+ end
935
+
936
+ def test_with_not_is_in
937
+ reader = Authorization::Reader::DSLReader.new
938
+ reader.parse %{
939
+ authorization do
940
+ role :test_role do
941
+ has_permission_on :test_attrs, :to => :read do
942
+ if_attribute :test_model => is_not_in { [user.test_model, user.test_model_2] }
943
+ end
944
+ end
945
+ end
946
+ }
947
+ Authorization::Engine.instance(reader)
948
+
949
+ test_model_1 = TestModel.create!
950
+ test_model_2 = TestModel.create!
951
+ test_model_1.test_attrs.create!
952
+ TestModel.create!.test_attrs.create!
953
+
954
+ user = MockUser.new(:test_role, :test_model => test_model_1,
955
+ :test_model_2 => test_model_2)
956
+ assert_equal 1, TestAttr.with_permissions_to(:read,
957
+ :context => :test_attrs, :user => user).length
958
+
959
+ TestModel.delete_all
960
+ TestAttr.delete_all
961
+ end
962
+
963
+ def test_with_if_permitted_to
964
+ reader = Authorization::Reader::DSLReader.new
965
+ reader.parse %{
966
+ authorization do
967
+ role :test_role do
968
+ has_permission_on :test_models, :to => :read do
969
+ if_attribute :test_attrs => contains { user }
970
+ end
971
+ has_permission_on :test_attrs, :to => :read do
972
+ if_permitted_to :read, :test_model
973
+ end
974
+ end
975
+ end
976
+ }
977
+ Authorization::Engine.instance(reader)
978
+
979
+ test_model_1 = TestModel.create!
980
+ test_attr_1 = test_model_1.test_attrs.create!
981
+
982
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
983
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
984
+ TestModel.delete_all
985
+ TestAttr.delete_all
986
+ end
987
+
988
+ def test_with_if_permitted_to_with_no_child_permissions
989
+ reader = Authorization::Reader::DSLReader.new
990
+ reader.parse %{
991
+ authorization do
992
+ role :another_role do
993
+ has_permission_on :test_models, :to => :read do
994
+ if_attribute :test_attrs => contains { user }
995
+ end
996
+ end
997
+ role :additional_if_attribute do
998
+ has_permission_on :test_attrs, :to => :read do
999
+ if_permitted_to :read, :test_model
1000
+ if_attribute :test_model => {:test_attrs => contains { user }}
1001
+ end
1002
+ end
1003
+ role :only_permitted_to do
1004
+ has_permission_on :test_attrs, :to => :read do
1005
+ if_permitted_to :read, :test_model
1006
+ end
1007
+ end
1008
+ end
1009
+ }
1010
+ Authorization::Engine.instance(reader)
1011
+
1012
+ test_model_1 = TestModel.create!
1013
+ test_attr_1 = test_model_1.test_attrs.create!
1014
+
1015
+ user = MockUser.new(:only_permitted_to, :another_role, :id => test_attr_1.id)
1016
+ also_allowed_user = MockUser.new(:additional_if_attribute, :id => test_attr_1.id)
1017
+ non_allowed_user = MockUser.new(:only_permitted_to, :id => test_attr_1.id)
1018
+
1019
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1020
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => also_allowed_user).length
1021
+ assert_raise Authorization::NotAuthorized do
1022
+ TestAttr.with_permissions_to(:read, :user => non_allowed_user).find(:all)
1023
+ end
1024
+
1025
+ TestModel.delete_all
1026
+ TestAttr.delete_all
1027
+ end
1028
+
1029
+ def test_with_if_permitted_to_with_context_from_model
1030
+ reader = Authorization::Reader::DSLReader.new
1031
+ reader.parse %{
1032
+ authorization do
1033
+ role :test_role do
1034
+ has_permission_on :test_models, :to => :read do
1035
+ if_attribute :test_another_attrs => contains { user }
1036
+ end
1037
+ has_permission_on :test_attrs, :to => :read do
1038
+ if_permitted_to :read, :test_another_model
1039
+ end
1040
+ end
1041
+ end
1042
+ }
1043
+ Authorization::Engine.instance(reader)
1044
+
1045
+ test_model_1 = TestModel.create!
1046
+ test_attr_1 = test_model_1.test_another_attrs.create!
1047
+
1048
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
1049
+ non_allowed_user = MockUser.new(:test_role, :id => 111)
1050
+
1051
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1052
+ assert_equal 0, TestAttr.with_permissions_to(:read, :user => non_allowed_user).length
1053
+ TestModel.delete_all
1054
+ TestAttr.delete_all
1055
+ end
1056
+
1057
+ def test_with_has_many_if_permitted_to
1058
+ reader = Authorization::Reader::DSLReader.new
1059
+ reader.parse %{
1060
+ authorization do
1061
+ role :test_role do
1062
+ has_permission_on :test_models, :to => :read do
1063
+ if_permitted_to :read, :test_attrs
1064
+ end
1065
+ has_permission_on :test_attrs, :to => :read do
1066
+ if_attribute :attr => is { user.id }
1067
+ end
1068
+ end
1069
+ end
1070
+ }
1071
+ Authorization::Engine.instance(reader)
1072
+
1073
+ test_model_1 = TestModel.create!
1074
+ test_attr_1 = test_model_1.test_attrs.create!(:attr => 111)
1075
+
1076
+ user = MockUser.new(:test_role, :id => test_attr_1.attr)
1077
+ non_allowed_user = MockUser.new(:test_role, :id => 333)
1078
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
1079
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => non_allowed_user).length
1080
+ TestModel.delete_all
1081
+ TestAttr.delete_all
1082
+ end
1083
+
1084
+ def test_with_deep_has_many_if_permitted_to
1085
+ reader = Authorization::Reader::DSLReader.new
1086
+ reader.parse %{
1087
+ authorization do
1088
+ role :test_role do
1089
+ has_permission_on :branches, :to => :read do
1090
+ if_attribute :name => "A Branch"
1091
+ end
1092
+ has_permission_on :companies, :to => :read do
1093
+ if_permitted_to :read, :test_attrs => :branch
1094
+ end
1095
+ end
1096
+ end
1097
+ }
1098
+ Authorization::Engine.instance(reader)
1099
+
1100
+ readable_company = Company.create!
1101
+ readable_company.test_attrs.create!(:branch => Branch.create!(:name => "A Branch"))
1102
+
1103
+ forbidden_company = Company.create!
1104
+ forbidden_company.test_attrs.create!(:branch => Branch.create!(:name => "Different Branch"))
1105
+
1106
+ user = MockUser.new(:test_role)
1107
+ assert_equal 1, Company.with_permissions_to(:read, :user => user).length
1108
+ Company.delete_all
1109
+ Branch.delete_all
1110
+ TestAttr.delete_all
1111
+ end
1112
+
1113
+ def test_with_if_permitted_to_and_empty_obligations
1114
+ reader = Authorization::Reader::DSLReader.new
1115
+ reader.parse %{
1116
+ authorization do
1117
+ role :test_role do
1118
+ has_permission_on :test_models, :to => :read
1119
+ has_permission_on :test_attrs, :to => :read do
1120
+ if_permitted_to :read, :test_model
1121
+ end
1122
+ end
1123
+ end
1124
+ }
1125
+ Authorization::Engine.instance(reader)
1126
+
1127
+ test_model_1 = TestModel.create!
1128
+ test_attr_1 = test_model_1.test_attrs.create!
1129
+
1130
+ user = MockUser.new(:test_role)
1131
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1132
+ TestModel.delete_all
1133
+ TestAttr.delete_all
1134
+ end
1135
+
1136
+ def test_with_if_permitted_to_nil
1137
+ reader = Authorization::Reader::DSLReader.new
1138
+ reader.parse %{
1139
+ authorization do
1140
+ role :test_role do
1141
+ has_permission_on :test_models, :to => :read do
1142
+ if_attribute :test_attrs => contains { user }
1143
+ end
1144
+ has_permission_on :test_attrs, :to => :read do
1145
+ if_permitted_to :read, :test_model
1146
+ end
1147
+ end
1148
+ end
1149
+ }
1150
+ Authorization::Engine.instance(reader)
1151
+
1152
+ test_attr_1 = TestAttr.create!
1153
+
1154
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
1155
+ assert_equal 0, TestAttr.with_permissions_to(:read, :user => user).length
1156
+ TestAttr.delete_all
1157
+ end
1158
+
1159
+ def test_with_if_permitted_to_self
1160
+ reader = Authorization::Reader::DSLReader.new
1161
+ reader.parse %{
1162
+ authorization do
1163
+ role :test_role do
1164
+ has_permission_on :test_models, :to => :read do
1165
+ if_attribute :test_attrs => contains { user }
1166
+ end
1167
+ has_permission_on :test_models, :to => :update do
1168
+ if_permitted_to :read
1169
+ end
1170
+ end
1171
+ end
1172
+ }
1173
+ Authorization::Engine.instance(reader)
1174
+
1175
+ test_model_1 = TestModel.create!
1176
+ test_attr_1 = test_model_1.test_attrs.create!
1177
+ test_attr_2 = TestAttr.create!
1178
+
1179
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
1180
+ assert_equal 1, TestModel.with_permissions_to(:update, :user => user).length
1181
+ TestAttr.delete_all
1182
+ TestModel.delete_all
1183
+ end
1184
+
1185
+ def test_with_has_many_and_reoccuring_tables
1186
+ reader = Authorization::Reader::DSLReader.new
1187
+ reader.parse %{
1188
+ authorization do
1189
+ role :test_role do
1190
+ has_permission_on :test_attrs, :to => :read do
1191
+ if_attribute :test_another_model => { :content => 'test_1_2' },
1192
+ :test_model => { :content => 'test_1_1' }
1193
+ end
1194
+ end
1195
+ end
1196
+ }
1197
+ Authorization::Engine.instance(reader)
1198
+
1199
+ test_attr_1 = TestAttr.create!(
1200
+ :test_model => TestModel.create!(:content => 'test_1_1'),
1201
+ :test_another_model => TestModel.create!(:content => 'test_1_2')
1202
+ )
1203
+ test_attr_2 = TestAttr.create!(
1204
+ :test_model => TestModel.create!(:content => 'test_2_1'),
1205
+ :test_another_model => TestModel.create!(:content => 'test_2_2')
1206
+ )
1207
+
1208
+ user = MockUser.new(:test_role)
1209
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1210
+ TestModel.delete_all
1211
+ TestAttr.delete_all
1212
+ end
1213
+
1214
+ def test_with_ored_rules_and_reoccuring_tables
1215
+ reader = Authorization::Reader::DSLReader.new
1216
+ reader.parse %{
1217
+ authorization do
1218
+ role :test_role do
1219
+ has_permission_on :test_attrs, :to => :read do
1220
+ if_attribute :test_another_model => { :content => 'test_1_2' },
1221
+ :test_model => { :content => 'test_1_1' }
1222
+ end
1223
+ has_permission_on :test_attrs, :to => :read do
1224
+ if_attribute :test_another_model => { :content => 'test_2_2' },
1225
+ :test_model => { :test_attrs => contains {user.test_attr} }
1226
+ end
1227
+ end
1228
+ end
1229
+ }
1230
+ Authorization::Engine.instance(reader)
1231
+
1232
+ test_attr_1 = TestAttr.create!(
1233
+ :test_model => TestModel.create!(:content => 'test_1_1'),
1234
+ :test_another_model => TestModel.create!(:content => 'test_1_2')
1235
+ )
1236
+ test_attr_2 = TestAttr.create!(
1237
+ :test_model => TestModel.create!(:content => 'test_2_1'),
1238
+ :test_another_model => TestModel.create!(:content => 'test_2_2')
1239
+ )
1240
+ test_attr_2.test_model.test_attrs.create!
1241
+
1242
+ user = MockUser.new(:test_role, :test_attr => test_attr_2.test_model.test_attrs.last)
1243
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
1244
+ TestModel.delete_all
1245
+ TestAttr.delete_all
1246
+ end
1247
+
1248
+ def test_with_many_ored_rules_and_reoccuring_tables
1249
+ reader = Authorization::Reader::DSLReader.new
1250
+ reader.parse %{
1251
+ authorization do
1252
+ role :test_role do
1253
+ has_permission_on :test_attrs, :to => :read do
1254
+ if_attribute :branch => { :company => { :country => {
1255
+ :test_models => contains { user.test_model }
1256
+ }} }
1257
+ if_attribute :company => { :country => {
1258
+ :test_models => contains { user.test_model }
1259
+ }}
1260
+ end
1261
+ end
1262
+ end
1263
+ }
1264
+ Authorization::Engine.instance(reader)
1265
+
1266
+ country = Country.create!(:name => 'country_1')
1267
+ country.test_models.create!
1268
+ test_attr_1 = TestAttr.create!(
1269
+ :branch => Branch.create!(:name => 'branch_1',
1270
+ :company => Company.create!(:name => 'company_1',
1271
+ :country => country))
1272
+ )
1273
+ test_attr_2 = TestAttr.create!(
1274
+ :company => Company.create!(:name => 'company_2',
1275
+ :country => country)
1276
+ )
1277
+
1278
+ user = MockUser.new(:test_role, :test_model => country.test_models.first)
1279
+
1280
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
1281
+ TestModel.delete_all
1282
+ TestAttr.delete_all
1283
+ end
1284
+ end
1285
+
1286
+ class ModelTest < Test::Unit::TestCase
1287
+ def test_permit_with_has_one_raises_no_name_error
1288
+ reader = Authorization::Reader::DSLReader.new
1289
+ reader.parse %{
1290
+ authorization do :test_attr_has_one
1291
+ role :test_role do
1292
+ has_permission_on :test_attrs, :to => :update do
1293
+ if_attribute :id => is { user.test_attr.id }
1294
+ end
1295
+ end
1296
+ end
1297
+ }
1298
+ instance = Authorization::Engine.instance(reader)
1299
+
1300
+ test_model = TestModel.create!
1301
+ test_attr = test_model.create_test_attr_has_one
1302
+ assert !test_attr.new_record?
1303
+
1304
+ user = MockUser.new(:test_role, :test_attr => test_attr)
1305
+
1306
+ assert_nothing_raised do
1307
+ assert instance.permit?(:update, :user => user, :object => test_model.test_attr_has_one)
1308
+ end
1309
+
1310
+ TestModel.delete_all
1311
+ TestAttr.delete_all
1312
+ end
1313
+
1314
+ def test_model_security_write_allowed
1315
+ reader = Authorization::Reader::DSLReader.new
1316
+ reader.parse %{
1317
+ authorization do
1318
+ role :test_role do
1319
+ has_permission_on :test_model_security_models do
1320
+ to :read, :create, :update, :delete
1321
+ if_attribute :attr => is { 1 }
1322
+ end
1323
+ end
1324
+ end
1325
+ }
1326
+ Authorization::Engine.instance(reader)
1327
+
1328
+ Authorization.current_user = MockUser.new(:test_role)
1329
+ assert(object = TestModelSecurityModel.create)
1330
+
1331
+ assert_nothing_raised { object.update_attributes(:attr_2 => 2) }
1332
+ object.reload
1333
+ assert_equal 2, object.attr_2
1334
+ object.destroy
1335
+ assert_raise ActiveRecord::RecordNotFound do
1336
+ TestModelSecurityModel.find(object.id)
1337
+ end
1338
+ end
1339
+
1340
+ def test_model_security_write_not_allowed_no_privilege
1341
+ reader = Authorization::Reader::DSLReader.new
1342
+ reader.parse %{
1343
+ authorization do
1344
+ role :test_role do
1345
+ has_permission_on :test_model_security_models do
1346
+ to :read, :create, :update, :delete
1347
+ if_attribute :attr => is { 1 }
1348
+ end
1349
+ end
1350
+ role :test_role_restricted do
1351
+ end
1352
+ end
1353
+ }
1354
+ Authorization::Engine.instance(reader)
1355
+
1356
+ Authorization.current_user = MockUser.new(:test_role)
1357
+ assert(object = TestModelSecurityModel.create)
1358
+
1359
+ Authorization.current_user = MockUser.new(:test_role_restricted)
1360
+ assert_raise Authorization::NotAuthorized do
1361
+ object.update_attributes(:attr_2 => 2)
1362
+ end
1363
+ end
1364
+
1365
+ def test_model_security_write_not_allowed_wrong_attribute_value
1366
+ reader = Authorization::Reader::DSLReader.new
1367
+ reader.parse %{
1368
+ authorization do
1369
+ role :test_role_unrestricted do
1370
+ has_permission_on :test_model_security_models do
1371
+ to :read, :create, :update, :delete
1372
+ end
1373
+ end
1374
+ role :test_role do
1375
+ has_permission_on :test_model_security_models do
1376
+ to :read, :create, :update, :delete
1377
+ if_attribute :attr => is { 1 }
1378
+ end
1379
+ end
1380
+ end
1381
+ }
1382
+ Authorization::Engine.instance(reader)
1383
+
1384
+ Authorization.current_user = MockUser.new(:test_role)
1385
+ assert(object = TestModelSecurityModel.create)
1386
+ assert_raise Authorization::AttributeAuthorizationError do
1387
+ TestModelSecurityModel.create :attr => 2
1388
+ end
1389
+ object = TestModelSecurityModel.create
1390
+ assert_raise Authorization::AttributeAuthorizationError do
1391
+ object.update_attributes(:attr => 2)
1392
+ end
1393
+ object.reload
1394
+
1395
+ assert_nothing_raised do
1396
+ object.update_attributes(:attr_2 => 1)
1397
+ end
1398
+ assert_raise Authorization::AttributeAuthorizationError do
1399
+ object.update_attributes(:attr => 2)
1400
+ end
1401
+ end
1402
+
1403
+ def test_model_security_with_and_without_find_restrictions
1404
+ reader = Authorization::Reader::DSLReader.new
1405
+ reader.parse %{
1406
+ authorization do
1407
+ role :test_role_unrestricted do
1408
+ has_permission_on :test_model_security_models do
1409
+ to :read, :create, :update, :delete
1410
+ end
1411
+ end
1412
+ role :test_role do
1413
+ has_permission_on :test_model_security_models do
1414
+ to :read, :create, :update, :delete
1415
+ if_attribute :attr => is { 1 }
1416
+ end
1417
+ end
1418
+ end
1419
+ }
1420
+ Authorization::Engine.instance(reader)
1421
+
1422
+ Authorization.current_user = MockUser.new(:test_role_unrestricted)
1423
+ object = TestModelSecurityModel.create :attr => 2
1424
+ object_with_find = TestModelSecurityModelWithFind.create :attr => 2
1425
+ Authorization.current_user = MockUser.new(:test_role)
1426
+ assert_nothing_raised do
1427
+ object.class.find(object.id)
1428
+ end
1429
+ assert_raise Authorization::AttributeAuthorizationError do
1430
+ object_with_find.class.find(object_with_find.id)
1431
+ end
1432
+ end
1433
+
1434
+ def test_model_security_delete_unallowed
1435
+ reader = Authorization::Reader::DSLReader.new
1436
+ reader.parse %{
1437
+ authorization do
1438
+ role :test_role_unrestricted do
1439
+ has_permission_on :test_model_security_models do
1440
+ to :read, :create, :update, :delete
1441
+ end
1442
+ end
1443
+ role :test_role do
1444
+ has_permission_on :test_model_security_models do
1445
+ to :read, :create, :update, :delete
1446
+ if_attribute :attr => is { 1 }
1447
+ end
1448
+ end
1449
+ end
1450
+ }
1451
+ Authorization::Engine.instance(reader)
1452
+
1453
+ Authorization.current_user = MockUser.new(:test_role_unrestricted)
1454
+ object = TestModelSecurityModel.create :attr => 2
1455
+ Authorization.current_user = MockUser.new(:test_role)
1456
+
1457
+ assert_raise Authorization::AttributeAuthorizationError do
1458
+ object.destroy
1459
+ end
1460
+ end
1461
+
1462
+ def test_model_security_changing_critical_attribute_unallowed
1463
+ reader = Authorization::Reader::DSLReader.new
1464
+ reader.parse %{
1465
+ authorization do
1466
+ role :test_role_unrestricted do
1467
+ has_permission_on :test_model_security_models do
1468
+ to :read, :create, :update, :delete
1469
+ end
1470
+ end
1471
+ role :test_role do
1472
+ has_permission_on :test_model_security_models do
1473
+ to :read, :create, :update, :delete
1474
+ if_attribute :attr => is { 1 }
1475
+ end
1476
+ end
1477
+ end
1478
+ }
1479
+ Authorization::Engine.instance(reader)
1480
+
1481
+ Authorization.current_user = MockUser.new(:test_role_unrestricted)
1482
+ object = TestModelSecurityModel.create :attr => 2
1483
+ Authorization.current_user = MockUser.new(:test_role)
1484
+
1485
+ # TODO before not checked yet
1486
+ #assert_raise Authorization::AuthorizationError do
1487
+ # object.update_attributes(:attr => 1)
1488
+ #end
1489
+ end
1490
+
1491
+ def test_model_security_no_role_unallowed
1492
+ reader = Authorization::Reader::DSLReader.new
1493
+ reader.parse %{
1494
+ authorization do
1495
+ end
1496
+ }
1497
+ Authorization::Engine.instance(reader)
1498
+
1499
+ Authorization.current_user = MockUser.new(:test_role_2)
1500
+ assert_raise Authorization::NotAuthorized do
1501
+ TestModelSecurityModel.create
1502
+ end
1503
+ end
1504
+
1505
+ def test_model_security_with_assoc
1506
+ reader = Authorization::Reader::DSLReader.new
1507
+ reader.parse %{
1508
+ authorization do
1509
+ role :test_role do
1510
+ has_permission_on :test_model_security_models do
1511
+ to :create, :update, :delete
1512
+ if_attribute :test_attrs => contains { user }
1513
+ end
1514
+ end
1515
+ end
1516
+ }
1517
+ Authorization::Engine.instance(reader)
1518
+
1519
+ test_attr = TestAttr.create
1520
+ test_attr.role_symbols << :test_role
1521
+ Authorization.current_user = test_attr
1522
+ assert(object = TestModelSecurityModel.create(:test_attrs => [test_attr]))
1523
+ assert_nothing_raised do
1524
+ object.update_attributes(:attr_2 => 2)
1525
+ end
1526
+ without_access_control do
1527
+ object.reload
1528
+ end
1529
+ assert_equal 2, object.attr_2
1530
+ object.destroy
1531
+ assert_raise ActiveRecord::RecordNotFound do
1532
+ TestModelSecurityModel.find(object.id)
1533
+ end
1534
+ end
1535
+
1536
+ def test_model_security_with_update_attrbributes
1537
+ reader = Authorization::Reader::DSLReader.new
1538
+ reader.parse %{
1539
+ authorization do
1540
+ role :test_role do
1541
+ has_permission_on :test_model_security_models, :to => :update do
1542
+ if_attribute :test_attrs => { :branch => is { user.branch }}
1543
+ end
1544
+ end
1545
+ end
1546
+ }
1547
+ Authorization::Engine.instance(reader)
1548
+
1549
+ params = {
1550
+ :model_data => { :attr => 11 }
1551
+ }
1552
+
1553
+ test_attr = TestAttr.create!(:branch => Branch.create!)
1554
+ test_model = without_access_control do
1555
+ TestModelSecurityModel.create!(:test_attrs => [test_attr])
1556
+ end
1557
+
1558
+ with_user MockUser.new(:test_role, :branch => test_attr.branch) do
1559
+ assert_nothing_raised do
1560
+ test_model.update_attributes(params[:model_data])
1561
+ end
1562
+ end
1563
+ without_access_control do
1564
+ assert_equal params[:model_data][:attr], test_model.reload.attr
1565
+ end
1566
+
1567
+ TestAttr.delete_all
1568
+ TestModelSecurityModel.delete_all
1569
+ Branch.delete_all
1570
+ end
1571
+
1572
+ def test_using_access_control
1573
+ assert !TestModel.using_access_control?
1574
+ assert TestModelSecurityModel.using_access_control?
1575
+ end
1576
+
1577
+ def test_authorization_permit_association_proxy
1578
+ reader = Authorization::Reader::DSLReader.new
1579
+ reader.parse %{
1580
+ authorization do
1581
+ role :test_role do
1582
+ has_permission_on :test_attrs, :to => :read do
1583
+ if_attribute :test_model => {:content => "content" }
1584
+ end
1585
+ end
1586
+ end
1587
+ }
1588
+ engine = Authorization::Engine.instance(reader)
1589
+
1590
+ test_model = TestModel.create(:content => "content")
1591
+ assert engine.permit?(:read, :object => test_model.test_attrs,
1592
+ :user => MockUser.new(:test_role))
1593
+ assert !engine.permit?(:read, :object => TestAttr.new,
1594
+ :user => MockUser.new(:test_role))
1595
+ TestModel.delete_all
1596
+ end
1597
+
1598
+ def test_multiple_roles_with_has_many_through
1599
+ reader = Authorization::Reader::DSLReader.new
1600
+ reader.parse %{
1601
+ authorization do
1602
+ role :test_role_1 do
1603
+ has_permission_on :test_models, :to => :read do
1604
+ if_attribute :test_attr_throughs => contains {user.test_attr_through_id},
1605
+ :content => 'test_1'
1606
+ end
1607
+ end
1608
+
1609
+ role :test_role_2 do
1610
+ has_permission_on :test_models, :to => :read do
1611
+ if_attribute :test_attr_throughs_2 => contains {user.test_attr_through_2_id},
1612
+ :content => 'test_2'
1613
+ end
1614
+ end
1615
+ end
1616
+ }
1617
+ Authorization::Engine.instance(reader)
1618
+
1619
+ test_model_1 = TestModel.create! :content => 'test_1'
1620
+ test_model_2 = TestModel.create! :content => 'test_2'
1621
+ test_model_1.test_attrs.create!.test_attr_throughs.create!
1622
+ test_model_2.test_attrs.create!.test_attr_throughs.create!
1623
+
1624
+ user = MockUser.new(:test_role_1, :test_role_2,
1625
+ :test_attr_through_id => test_model_1.test_attr_throughs.first.id,
1626
+ :test_attr_through_2_id => test_model_2.test_attr_throughs.first.id)
1627
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
1628
+ TestModel.delete_all
1629
+ TestAttr.delete_all
1630
+ TestAttrThrough.delete_all
1631
+ end
1632
+
1633
+ def test_model_permitted_to
1634
+ reader = Authorization::Reader::DSLReader.new
1635
+ reader.parse %{
1636
+ authorization do
1637
+ role :test_role do
1638
+ has_permission_on :companies, :to => :read do
1639
+ if_attribute :name => "company_1"
1640
+ end
1641
+ end
1642
+ end
1643
+ }
1644
+ Authorization::Engine.instance(reader)
1645
+
1646
+ user = MockUser.new(:test_role)
1647
+ allowed_read_company = Company.new(:name => 'company_1')
1648
+ prohibited_company = Company.new(:name => 'company_2')
1649
+
1650
+ assert allowed_read_company.permitted_to?(:read, :user => user)
1651
+ assert !allowed_read_company.permitted_to?(:update, :user => user)
1652
+ assert !prohibited_company.permitted_to?(:read, :user => user)
1653
+
1654
+ executed_block = false
1655
+ allowed_read_company.permitted_to?(:read, :user => user) do
1656
+ executed_block = true
1657
+ end
1658
+ assert executed_block
1659
+
1660
+ executed_block = false
1661
+ prohibited_company.permitted_to?(:read, :user => user) do
1662
+ executed_block = true
1663
+ end
1664
+ assert !executed_block
1665
+
1666
+ assert_nothing_raised do
1667
+ allowed_read_company.permitted_to!(:read, :user => user)
1668
+ end
1669
+ assert_raise Authorization::NotAuthorized do
1670
+ prohibited_company.permitted_to!(:update, :user => user)
1671
+ end
1672
+ assert_raise Authorization::AttributeAuthorizationError do
1673
+ prohibited_company.permitted_to!(:read, :user => user)
1674
+ end
1675
+ end
1676
+
1677
+ def test_model_permitted_to_with_modified_context
1678
+ reader = Authorization::Reader::DSLReader.new
1679
+ reader.parse %{
1680
+ authorization do
1681
+ role :test_role do
1682
+ has_permission_on :companies, :to => :read
1683
+ end
1684
+ end
1685
+ }
1686
+ Authorization::Engine.instance(reader)
1687
+
1688
+ user = MockUser.new(:test_role)
1689
+ allowed_read_company = SmallCompany.new(:name => 'small_company_1')
1690
+
1691
+ assert allowed_read_company.permitted_to?(:read, :user => user)
1692
+ assert !allowed_read_company.permitted_to?(:update, :user => user)
1693
+ end
1694
+ end