declarative_authorization-dta 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/CHANGELOG +148 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +504 -0
  4. data/Rakefile +35 -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 +10 -0
  18. data/garlic_example.rb +20 -0
  19. data/init.rb +5 -0
  20. data/lib/declarative_authorization.rb +17 -0
  21. data/lib/declarative_authorization/authorization.rb +687 -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.new.rb +298 -0
  29. data/lib/declarative_authorization/in_model.rb +463 -0
  30. data/lib/declarative_authorization/maintenance.rb +212 -0
  31. data/lib/declarative_authorization/obligation_scope.rb +354 -0
  32. data/lib/declarative_authorization/rails_legacy.rb +22 -0
  33. data/lib/declarative_authorization/railsengine.rb +6 -0
  34. data/lib/declarative_authorization/reader.rb +521 -0
  35. data/lib/tasks/authorization_tasks.rake +82 -0
  36. data/test/authorization_test.rb +1065 -0
  37. data/test/controller_filter_resource_access_test.rb +511 -0
  38. data/test/controller_test.rb +465 -0
  39. data/test/dsl_reader_test.rb +178 -0
  40. data/test/helper_test.rb +172 -0
  41. data/test/maintenance_test.rb +46 -0
  42. data/test/model_test.rb +2216 -0
  43. data/test/schema.sql +62 -0
  44. data/test/test_helper.rb +152 -0
  45. metadata +108 -0
@@ -0,0 +1,82 @@
1
+ namespace :auth do
2
+ desc "Lists all privileges used in controllers, views, models"
3
+ task :used_privileges do
4
+ # TODO note where privileges are used
5
+ require File.join(RAILS_ROOT, 'config', 'boot.rb')
6
+ require File.join(RAILS_ROOT, 'config', 'environment.rb')
7
+ controllers = [ApplicationController]
8
+ Dir.new("#{RAILS_ROOT}/app/controllers").entries.each do |controller_file|
9
+ if controller_file =~ /_controller/
10
+ controllers << controller_file.gsub(".rb","").camelize.constantize
11
+ end
12
+ end
13
+ perms = controllers.select {|c| c.send(:class_variable_defined?, :@@permissions)}.
14
+ inject([]) do |all, c|
15
+ contr_context = c.name.sub("Controller", "").tableize.to_sym
16
+ contr_perms = c.send(:class_variable_get, :@@permissions).collect do |cp|
17
+ [cp.privilege, cp.context || contr_context, cp]
18
+ end
19
+ if contr_perms.any? {|cp| cp[0].nil?}
20
+ contr_perms += c.send(:action_methods).collect {|am| am.to_sym}.
21
+ reject {|am| contr_perms.any? {|cp| cp[2].actions.include?(am)}}.
22
+ collect {|am| [am, contr_context]}
23
+ end
24
+ all += contr_perms.reject {|cp| cp[0].nil?}.collect {|cp| cp[0..1]}
25
+ end
26
+
27
+ model_files = `grep -l "^[[:space:]]*using_access_control" #{RAILS_ROOT}/app/models/*.rb`.split("\n")
28
+ models_with_ac = model_files.collect {|mf| mf.sub(/^.*\//, "").sub(".rb", "").tableize.to_sym}
29
+ model_security_privs = [:create, :read, :update, :delete]
30
+ models_with_ac.each {|m| perms += model_security_privs.collect{|msp| [msp, m]}}
31
+
32
+ grep_file_pattern = "#{RAILS_ROOT}/app/models/*.rb #{RAILS_ROOT}/app/views/**/* #{RAILS_ROOT}/app/controllers/*.rb"
33
+ `grep "permitted_to?" #{grep_file_pattern}`.split("\n").each do |ptu|
34
+ file, grep_match = ptu.split(':', 2)
35
+ context = privilege = nil
36
+ if (match = grep_match.match(/permitted_to\?\(?\s*:(\w+),\s*(:?@?\w+)/))
37
+ privilege = match[1].to_sym
38
+ if match[2][0..0] == ':'
39
+ context = match[2][1..-1].to_sym
40
+ else
41
+ c = (match[2][0..0] == '@' ? match[2][1..-1] : match[2]).pluralize.to_sym
42
+ context = c if perms.any? {|p| p[1] == c}
43
+ end
44
+ end
45
+ if privilege.nil? or context.nil?
46
+ puts "Could not handle: #{ptu}"
47
+ else
48
+ perms << [privilege, context]
49
+ end
50
+ end
51
+
52
+ `grep ".with_permissions_to" #{grep_file_pattern}`.split("\n").each do |wpt|
53
+ file, grep_match = wpt.split(':', 2)
54
+ context = privilege = nil
55
+ if match = grep_match.match(/(\w+\.)?with_permissions_to(\(:\w+)?/)
56
+ c = match[1][0..-2].tableize.to_sym if match[1]
57
+ c ||= File.basename(file, '.rb').tableize.to_sym
58
+ context = c if perms.any? {|p| p[1] == c}
59
+ privilege = match[2] && match[2][(match[2][0..0]=='(' ? 2 : 1)..-1].to_sym
60
+ privilege ||= :read
61
+ end
62
+ if privilege.nil? or context.nil?
63
+ puts "Could not handle: #{ptu}"
64
+ else
65
+ perms << [privilege, context]
66
+ end
67
+ end
68
+
69
+ perms.uniq!
70
+ perm_hash = {}
71
+ perms.each do |cp|
72
+ perm_hash[cp[1]] ||= []
73
+ perm_hash[cp[1]] << cp[0]
74
+ end
75
+
76
+ puts "Privileges currently in use:"
77
+ perm_hash.each do |context, privileges|
78
+ puts " #{context.inspect}:\t#{privileges.collect {|p| p.inspect}.sort * ', '}"
79
+ #privileges.collect {|p| p.inspect}.sort.each {|p| puts " #{p}"}
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,1065 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+
3
+ class AuthorizationTest < Test::Unit::TestCase
4
+
5
+ def test_permit
6
+ reader = Authorization::Reader::DSLReader.new
7
+ reader.parse %{
8
+ authorization do
9
+ role :test_role do
10
+ has_permission_on :permissions, :to => :test
11
+ end
12
+ end
13
+ }
14
+ engine = Authorization::Engine.new(reader)
15
+ assert engine.permit?(:test, :context => :permissions,
16
+ :user => MockUser.new(:test_role, :test_role_2))
17
+ assert !engine.permit?(:test_2, :context => :permissions_2,
18
+ :user => MockUser.new(:test_role))
19
+ assert !engine.permit?(:test, :context => :permissions,
20
+ :user => MockUser.new(:test_role_2))
21
+ end
22
+
23
+ def test_permit_context_people
24
+ reader = Authorization::Reader::DSLReader.new
25
+ reader.parse %{
26
+ authorization do
27
+ role :test_role do
28
+ has_permission_on :people, :to => :test
29
+ end
30
+ end
31
+ }
32
+ engine = Authorization::Engine.new(reader)
33
+ assert engine.permit?(:test, :context => :people,
34
+ :user => MockUser.new(:test_role))
35
+ end
36
+
37
+ def test_permit_elevated_people
38
+ reader = Authorization::Reader::DSLReader.new
39
+ reader.parse %{
40
+ authorization do
41
+ role :admin do
42
+ has_omnipotence
43
+ end
44
+ end
45
+ }
46
+ engine = Authorization::Engine.new(reader)
47
+ assert engine.permit?(:test, :context => :people,
48
+ :user => MockUser.new(:admin))
49
+ end
50
+
51
+ def test_permit_multiple_contexts
52
+ reader = Authorization::Reader::DSLReader.new
53
+ reader.parse %{
54
+ authorization do
55
+ role :test_role do
56
+ has_permission_on [:permissions, :permissions_2], :to => :test
57
+ has_permission_on :permissions_4, :permissions_5, :to => :test
58
+ end
59
+ end
60
+ }
61
+ engine = Authorization::Engine.new(reader)
62
+ assert engine.permit?(:test, :context => :permissions,
63
+ :user => MockUser.new(:test_role))
64
+ assert engine.permit?(:test, :context => :permissions_2,
65
+ :user => MockUser.new(:test_role))
66
+ assert !engine.permit?(:test, :context => :permissions_3,
67
+ :user => MockUser.new(:test_role))
68
+
69
+ assert engine.permit?(:test, :context => :permissions_4, :user => MockUser.new(:test_role))
70
+ assert engine.permit?(:test, :context => :permissions_5, :user => MockUser.new(:test_role))
71
+ end
72
+
73
+ def test_obligations_without_conditions
74
+ reader = Authorization::Reader::DSLReader.new
75
+ reader.parse %{
76
+ authorization do
77
+ role :test_role do
78
+ has_permission_on :permissions, :to => :test
79
+ end
80
+ end
81
+ }
82
+ engine = Authorization::Engine.new(reader)
83
+ assert_equal [{}], engine.obligations(:test, :context => :permissions,
84
+ :user => MockUser.new(:test_role))
85
+ end
86
+
87
+ def test_obligations_with_conditions
88
+ reader = Authorization::Reader::DSLReader.new
89
+ reader.parse %{
90
+ authorization do
91
+ role :test_role do
92
+ has_permission_on :permissions, :to => :test do
93
+ if_attribute :attr => is { user.attr }
94
+ end
95
+ end
96
+ end
97
+ }
98
+ engine = Authorization::Engine.new(reader)
99
+ assert_equal [{:attr => [:is, 1]}],
100
+ engine.obligations(:test, :context => :permissions,
101
+ :user => MockUser.new(:test_role, :attr => 1))
102
+ end
103
+
104
+ def test_obligations_with_anded_conditions
105
+ reader = Authorization::Reader::DSLReader.new
106
+ reader.parse %{
107
+ authorization do
108
+ role :test_role do
109
+ has_permission_on :permissions, :to => :test, :join_by => :and do
110
+ if_attribute :attr => is { user.attr }
111
+ if_attribute :attr_2 => is { user.attr_2 }
112
+ end
113
+ end
114
+ end
115
+ }
116
+ engine = Authorization::Engine.new(reader)
117
+ assert_equal [{:attr => [:is, 1], :attr_2 => [:is, 2]}],
118
+ engine.obligations(:test, :context => :permissions,
119
+ :user => MockUser.new(:test_role, :attr => 1, :attr_2 => 2))
120
+ end
121
+
122
+ def test_obligations_with_deep_anded_conditions
123
+ reader = Authorization::Reader::DSLReader.new
124
+ reader.parse %{
125
+ authorization do
126
+ role :test_role do
127
+ has_permission_on :permissions, :to => :test, :join_by => :and do
128
+ if_attribute :attr => { :deeper_attr => is { user.deeper_attr }}
129
+ if_attribute :attr => { :deeper_attr_2 => is { user.deeper_attr_2 }}
130
+ end
131
+ end
132
+ end
133
+ }
134
+ engine = Authorization::Engine.new(reader)
135
+ assert_equal [{:attr => { :deeper_attr => [:is, 1], :deeper_attr_2 => [:is, 2] } }],
136
+ engine.obligations(:test, :context => :permissions,
137
+ :user => MockUser.new(:test_role, :deeper_attr => 1, :deeper_attr_2 => 2))
138
+ end
139
+
140
+ def test_obligations_with_has_many
141
+ reader = Authorization::Reader::DSLReader.new
142
+ reader.parse %{
143
+ authorization do
144
+ role :test_role do
145
+ has_permission_on :permissions, :to => :test do
146
+ if_attribute :attrs => { :deeper_attr => is { user.deeper_attr } }
147
+ end
148
+ end
149
+ end
150
+ }
151
+ engine = Authorization::Engine.new(reader)
152
+ assert_equal [{:attrs => {:deeper_attr => [:is, 1]}}],
153
+ engine.obligations(:test, :context => :permissions,
154
+ :user => MockUser.new(:test_role, :deeper_attr => 1))
155
+ end
156
+
157
+ def test_obligations_with_conditions_and_empty
158
+ reader = Authorization::Reader::DSLReader.new
159
+ reader.parse %{
160
+ authorization do
161
+ role :test_role do
162
+ has_permission_on :permissions, :to => :test
163
+ has_permission_on :permissions, :to => :test do
164
+ if_attribute :attr => is { user.attr }
165
+ end
166
+ end
167
+ end
168
+ }
169
+ engine = Authorization::Engine.new(reader)
170
+ assert_equal [{}, {:attr => [:is, 1]}],
171
+ engine.obligations(:test, :context => :permissions,
172
+ :user => MockUser.new(:test_role, :attr => 1))
173
+ end
174
+
175
+ def test_obligations_with_permissions
176
+ reader = Authorization::Reader::DSLReader.new
177
+ reader.parse %{
178
+ authorization do
179
+ role :test_role do
180
+ has_permission_on :permissions, :to => :test do
181
+ if_attribute :attr => is { user.attr }
182
+ end
183
+ has_permission_on :permission_children, :to => :test do
184
+ if_permitted_to :test, :permission, :context => :permissions
185
+ end
186
+ has_permission_on :permission_children_2, :to => :test do
187
+ if_permitted_to :test, :permission
188
+ end
189
+ has_permission_on :permission_children_children, :to => :test do
190
+ if_permitted_to :test, :permission_child => :permission,
191
+ :context => :permissions
192
+ end
193
+ end
194
+ end
195
+ }
196
+ engine = Authorization::Engine.new(reader)
197
+ assert_equal [{:permission => {:attr => [:is, 1]}}],
198
+ engine.obligations(:test, :context => :permission_children,
199
+ :user => MockUser.new(:test_role, :attr => 1))
200
+ assert_equal [{:permission => {:attr => [:is, 1]}}],
201
+ engine.obligations(:test, :context => :permission_children_2,
202
+ :user => MockUser.new(:test_role, :attr => 1))
203
+ assert_equal [{:permission_child => {:permission => {:attr => [:is, 1]}}}],
204
+ engine.obligations(:test, :context => :permission_children_children,
205
+ :user => MockUser.new(:test_role, :attr => 1))
206
+ end
207
+
208
+ def test_obligations_with_has_many_permissions
209
+ reader = Authorization::Reader::DSLReader.new
210
+ reader.parse %{
211
+ authorization do
212
+ role :test_role do
213
+ has_permission_on :permissions, :to => :test do
214
+ if_attribute :attr => is { user.attr }
215
+ end
216
+ has_permission_on :permission_children, :to => :test do
217
+ if_permitted_to :test, :permissions, :context => :permissions
218
+ end
219
+ has_permission_on :permission_children_2, :to => :test do
220
+ if_permitted_to :test, :permissions
221
+ end
222
+ has_permission_on :permission_children_children, :to => :test do
223
+ if_permitted_to :test, :permission_child => :permissions,
224
+ :context => :permissions
225
+ end
226
+ end
227
+ end
228
+ }
229
+ engine = Authorization::Engine.new(reader)
230
+ assert_equal [{:permissions => {:attr => [:is, 1]}}],
231
+ engine.obligations(:test, :context => :permission_children,
232
+ :user => MockUser.new(:test_role, :attr => 1))
233
+ assert_equal [{:permissions => {:attr => [:is, 1]}}],
234
+ engine.obligations(:test, :context => :permission_children_2,
235
+ :user => MockUser.new(:test_role, :attr => 1))
236
+ assert_equal [{:permission_child => {:permissions => {:attr => [:is, 1]}}}],
237
+ engine.obligations(:test, :context => :permission_children_children,
238
+ :user => MockUser.new(:test_role, :attr => 1))
239
+ end
240
+
241
+ def test_obligations_with_permissions_multiple
242
+ reader = Authorization::Reader::DSLReader.new
243
+ reader.parse %{
244
+ authorization do
245
+ role :test_role do
246
+ has_permission_on :permissions, :to => :test do
247
+ if_attribute :attr => is { 1 }
248
+ if_attribute :attr => is { 2 }
249
+ end
250
+ has_permission_on :permission_children_children, :to => :test do
251
+ if_permitted_to :test, :permission_child => :permission
252
+ end
253
+ end
254
+ end
255
+ }
256
+ engine = Authorization::Engine.new(reader)
257
+ assert_equal [{:permission_child => {:permission => {:attr => [:is, 1]}}},
258
+ {:permission_child => {:permission => {:attr => [:is, 2]}}}],
259
+ engine.obligations(:test, :context => :permission_children_children,
260
+ :user => MockUser.new(:test_role))
261
+ end
262
+
263
+ def test_obligations_with_permissions_and_anded_conditions
264
+ reader = Authorization::Reader::DSLReader.new
265
+ reader.parse %{
266
+ authorization do
267
+ role :test_role do
268
+ has_permission_on :permission_children, :to => :test, :join_by => :and do
269
+ if_permitted_to :test, :permission
270
+ if_attribute :test_attr => 1
271
+ end
272
+ has_permission_on :permissions, :to => :test do
273
+ if_attribute :test_attr => 1
274
+ end
275
+ end
276
+ end
277
+ }
278
+ engine = Authorization::Engine.new(reader)
279
+
280
+ assert_equal [{:test_attr => [:is, 1], :permission => {:test_attr => [:is, 1]}}],
281
+ engine.obligations(:test, :context => :permission_children,
282
+ :user => MockUser.new(:test_role))
283
+ end
284
+
285
+ def test_guest_user
286
+ reader = Authorization::Reader::DSLReader.new
287
+ reader.parse %{
288
+ authorization do
289
+ role :guest do
290
+ has_permission_on :permissions, :to => :test
291
+ end
292
+ end
293
+ }
294
+ engine = Authorization::Engine.new(reader)
295
+ assert engine.permit?(:test, :context => :permissions)
296
+ assert !engine.permit?(:test, :context => :permissions_2)
297
+ end
298
+
299
+ def test_invalid_user_model
300
+ reader = Authorization::Reader::DSLReader.new
301
+ reader.parse %{
302
+ authorization do
303
+ role :guest do
304
+ has_permission_on :permissions, :to => :test
305
+ end
306
+ end
307
+ }
308
+ engine = Authorization::Engine.new(reader)
309
+ assert_raise(Authorization::AuthorizationUsageError) do
310
+ engine.permit?(:test, :context => :permissions, :user => MockUser.new(1, 2))
311
+ end
312
+ assert_raise(Authorization::AuthorizationUsageError) do
313
+ engine.permit?(:test, :context => :permissions, :user => MockDataObject.new)
314
+ end
315
+ end
316
+
317
+ def test_role_hierarchy
318
+ reader = Authorization::Reader::DSLReader.new
319
+ reader.parse %{
320
+ authorization do
321
+ role :test_role do
322
+ includes :lower_role
323
+ has_permission_on :permissions, :to => :test
324
+ end
325
+ role :lower_role do
326
+ has_permission_on :permissions, :to => :lower
327
+ end
328
+ end
329
+ }
330
+ engine = Authorization::Engine.new(reader)
331
+ assert engine.permit?(:lower, :context => :permissions,
332
+ :user => MockUser.new(:test_role))
333
+ end
334
+
335
+ def test_role_hierarchy_infinity
336
+ reader = Authorization::Reader::DSLReader.new
337
+ reader.parse %{
338
+ authorization do
339
+ role :test_role do
340
+ includes :lower_role
341
+ has_permission_on :permissions, :to => :test
342
+ end
343
+ role :lower_role do
344
+ includes :higher_role
345
+ has_permission_on :permissions, :to => :lower
346
+ end
347
+ end
348
+ }
349
+ engine = Authorization::Engine.new(reader)
350
+ assert engine.permit?(:lower, :context => :permissions,
351
+ :user => MockUser.new(:test_role))
352
+ end
353
+
354
+ def test_privilege_hierarchy
355
+ reader = Authorization::Reader::DSLReader.new
356
+ reader.parse %{
357
+ privileges do
358
+ privilege :test, :permissions do
359
+ includes :lower
360
+ end
361
+ end
362
+ authorization do
363
+ role :test_role do
364
+ has_permission_on :permissions, :to => :test
365
+ end
366
+ end
367
+ }
368
+ engine = Authorization::Engine.new(reader)
369
+ assert engine.permit?(:lower, :context => :permissions,
370
+ :user => MockUser.new(:test_role))
371
+ end
372
+
373
+ def test_privilege_hierarchy_without_context
374
+ reader = Authorization::Reader::DSLReader.new
375
+ reader.parse %{
376
+ privileges do
377
+ privilege :read do
378
+ includes :list, :show
379
+ end
380
+ end
381
+ authorization do
382
+ role :test_role do
383
+ has_permission_on :permissions, :to => :read
384
+ end
385
+ end
386
+ }
387
+ engine = Authorization::Engine.new(reader)
388
+ assert engine.permit?(:list, :context => :permissions,
389
+ :user => MockUser.new(:test_role))
390
+ end
391
+
392
+ def test_attribute_is
393
+ reader = Authorization::Reader::DSLReader.new
394
+ reader.parse %|
395
+ authorization do
396
+ role :test_role do
397
+ has_permission_on :permissions, :to => :test do
398
+ if_attribute :test_attr => is { user.test_attr }
399
+ if_attribute :test_attr => 3
400
+ end
401
+ end
402
+ end
403
+ |
404
+ engine = Authorization::Engine.new(reader)
405
+ assert engine.permit?(:test, :context => :permissions,
406
+ :user => MockUser.new(:test_role, :test_attr => 1),
407
+ :object => MockDataObject.new(:test_attr => 1))
408
+ assert engine.permit?(:test, :context => :permissions,
409
+ :user => MockUser.new(:test_role, :test_attr => 2),
410
+ :object => MockDataObject.new(:test_attr => 3))
411
+ assert((not(engine.permit?(:test, :context => :permissions,
412
+ :user => MockUser.new(:test_role, :test_attr => 2),
413
+ :object => MockDataObject.new(:test_attr => 1)))))
414
+ end
415
+
416
+ def test_attribute_is_not
417
+ reader = Authorization::Reader::DSLReader.new
418
+ reader.parse %|
419
+ authorization do
420
+ role :test_role do
421
+ has_permission_on :permissions, :to => :test do
422
+ if_attribute :test_attr => is_not { user.test_attr }
423
+ end
424
+ end
425
+ end
426
+ |
427
+ engine = Authorization::Engine.new(reader)
428
+ assert !engine.permit?(:test, :context => :permissions,
429
+ :user => MockUser.new(:test_role, :test_attr => 1),
430
+ :object => MockDataObject.new(:test_attr => 1))
431
+ assert engine.permit?(:test, :context => :permissions,
432
+ :user => MockUser.new(:test_role, :test_attr => 2),
433
+ :object => MockDataObject.new(:test_attr => 1))
434
+ end
435
+
436
+ def test_attribute_contains
437
+ reader = Authorization::Reader::DSLReader.new
438
+ reader.parse %|
439
+ authorization do
440
+ role :test_role do
441
+ has_permission_on :permissions, :to => :test do
442
+ if_attribute :test_attr => contains { user.test_attr }
443
+ end
444
+ end
445
+ end
446
+ |
447
+ engine = Authorization::Engine.new(reader)
448
+ assert engine.permit?(:test, :context => :permissions,
449
+ :user => MockUser.new(:test_role, :test_attr => 1),
450
+ :object => MockDataObject.new(:test_attr => [1,2]))
451
+ assert !engine.permit?(:test, :context => :permissions,
452
+ :user => MockUser.new(:test_role, :test_attr => 3),
453
+ :object => MockDataObject.new(:test_attr => [1,2]))
454
+ end
455
+
456
+ def test_attribute_does_not_contain
457
+ reader = Authorization::Reader::DSLReader.new
458
+ reader.parse %|
459
+ authorization do
460
+ role :test_role do
461
+ has_permission_on :permissions, :to => :test do
462
+ if_attribute :test_attr => does_not_contain { user.test_attr }
463
+ end
464
+ end
465
+ end
466
+ |
467
+ engine = Authorization::Engine.new(reader)
468
+ assert !engine.permit?(:test, :context => :permissions,
469
+ :user => MockUser.new(:test_role, :test_attr => 1),
470
+ :object => MockDataObject.new(:test_attr => [1,2]))
471
+ assert engine.permit?(:test, :context => :permissions,
472
+ :user => MockUser.new(:test_role, :test_attr => 3),
473
+ :object => MockDataObject.new(:test_attr => [1,2]))
474
+ end
475
+
476
+ def test_attribute_in_array
477
+ reader = Authorization::Reader::DSLReader.new
478
+ reader.parse %|
479
+ authorization do
480
+ role :test_role do
481
+ has_permission_on :permissions, :to => :test do
482
+ if_attribute :test_attr => is_in { [1,2] }
483
+ if_attribute :test_attr => [2,3]
484
+ end
485
+ end
486
+ end
487
+ |
488
+ engine = Authorization::Engine.new(reader)
489
+ assert engine.permit?(:test, :context => :permissions,
490
+ :user => MockUser.new(:test_role),
491
+ :object => MockDataObject.new(:test_attr => 1))
492
+ assert engine.permit?(:test, :context => :permissions,
493
+ :user => MockUser.new(:test_role),
494
+ :object => MockDataObject.new(:test_attr => 3))
495
+ assert !engine.permit?(:test, :context => :permissions,
496
+ :user => MockUser.new(:test_role),
497
+ :object => MockDataObject.new(:test_attr => 4))
498
+ end
499
+
500
+ def test_attribute_not_in_array
501
+ reader = Authorization::Reader::DSLReader.new
502
+ reader.parse %|
503
+ authorization do
504
+ role :test_role do
505
+ has_permission_on :permissions, :to => :test do
506
+ if_attribute :test_attr => is_not_in { [1,2] }
507
+ end
508
+ end
509
+ end
510
+ |
511
+ engine = Authorization::Engine.new(reader)
512
+ assert !engine.permit?(:test, :context => :permissions,
513
+ :user => MockUser.new(:test_role),
514
+ :object => MockDataObject.new(:test_attr => 1))
515
+ assert engine.permit?(:test, :context => :permissions,
516
+ :user => MockUser.new(:test_role),
517
+ :object => MockDataObject.new(:test_attr => 4))
518
+ end
519
+
520
+ def test_attribute_intersects_with
521
+ reader = Authorization::Reader::DSLReader.new
522
+ reader.parse %{
523
+ authorization do
524
+ role :test_role do
525
+ has_permission_on :permissions, :to => :test do
526
+ if_attribute :test_attrs => intersects_with { [1,2] }
527
+ end
528
+ end
529
+ role :test_role_2 do
530
+ has_permission_on :permissions, :to => :test do
531
+ if_attribute :test_attrs => intersects_with { 1 }
532
+ end
533
+ end
534
+ end
535
+ }
536
+
537
+ engine = Authorization::Engine.new(reader)
538
+ assert_raise Authorization::AuthorizationUsageError do
539
+ engine.permit?(:test, :context => :permissions,
540
+ :user => MockUser.new(:test_role),
541
+ :object => MockDataObject.new(:test_attrs => 1 ))
542
+ end
543
+ assert_raise Authorization::AuthorizationUsageError do
544
+ engine.permit?(:test, :context => :permissions,
545
+ :user => MockUser.new(:test_role_2),
546
+ :object => MockDataObject.new(:test_attrs => [1, 2] ))
547
+ end
548
+ assert engine.permit?(:test, :context => :permissions,
549
+ :user => MockUser.new(:test_role),
550
+ :object => MockDataObject.new(:test_attrs => [1,3] ))
551
+ assert !engine.permit?(:test, :context => :permissions,
552
+ :user => MockUser.new(:test_role),
553
+ :object => MockDataObject.new(:test_attrs => [3,4] ))
554
+ end
555
+
556
+ def test_attribute_lte
557
+ reader = Authorization::Reader::DSLReader.new
558
+ reader.parse %|
559
+ authorization do
560
+ role :test_role do
561
+ has_permission_on :permissions, :to => :test do
562
+ if_attribute :test_attr => lte { user.test_attr }
563
+ if_attribute :test_attr => 3
564
+ end
565
+ end
566
+ end
567
+ |
568
+ engine = Authorization::Engine.new(reader)
569
+ # object < user -> pass
570
+ assert engine.permit?(:test, :context => :permissions,
571
+ :user => MockUser.new(:test_role, :test_attr => 2),
572
+ :object => MockDataObject.new(:test_attr => 1))
573
+ # object > user && object = control -> pass
574
+ assert engine.permit?(:test, :context => :permissions,
575
+ :user => MockUser.new(:test_role, :test_attr => 2),
576
+ :object => MockDataObject.new(:test_attr => 3))
577
+ # object = user -> pass
578
+ assert engine.permit?(:test, :context => :permissions,
579
+ :user => MockUser.new(:test_role, :test_attr => 1),
580
+ :object => MockDataObject.new(:test_attr => 1))
581
+ # object > user -> fail
582
+ assert((not(engine.permit?(:test, :context => :permissions,
583
+ :user => MockUser.new(:test_role, :test_attr => 1),
584
+ :object => MockDataObject.new(:test_attr => 2)))))
585
+ end
586
+
587
+ def test_attribute_gt
588
+ reader = Authorization::Reader::DSLReader.new
589
+ reader.parse %|
590
+ authorization do
591
+ role :test_role do
592
+ has_permission_on :permissions, :to => :test do
593
+ if_attribute :test_attr => gt { user.test_attr }
594
+ if_attribute :test_attr => 3
595
+ end
596
+ end
597
+ end
598
+ |
599
+ engine = Authorization::Engine.new(reader)
600
+ # object > user -> pass
601
+ assert engine.permit?(:test, :context => :permissions,
602
+ :user => MockUser.new(:test_role, :test_attr => 1),
603
+ :object => MockDataObject.new(:test_attr => 2))
604
+ # object < user && object = control -> pass
605
+ assert engine.permit?(:test, :context => :permissions,
606
+ :user => MockUser.new(:test_role, :test_attr => 4),
607
+ :object => MockDataObject.new(:test_attr => 3))
608
+ # object = user -> fail
609
+ assert((not(engine.permit?(:test, :context => :permissions,
610
+ :user => MockUser.new(:test_role, :test_attr => 1),
611
+ :object => MockDataObject.new(:test_attr => 1)))))
612
+ # object < user -> fail
613
+ assert((not(engine.permit?(:test, :context => :permissions,
614
+ :user => MockUser.new(:test_role, :test_attr => 2),
615
+ :object => MockDataObject.new(:test_attr => 1)))))
616
+ end
617
+
618
+ def test_attribute_gte
619
+ reader = Authorization::Reader::DSLReader.new
620
+ reader.parse %|
621
+ authorization do
622
+ role :test_role do
623
+ has_permission_on :permissions, :to => :test do
624
+ if_attribute :test_attr => gte { user.test_attr }
625
+ if_attribute :test_attr => 3
626
+ end
627
+ end
628
+ end
629
+ |
630
+ engine = Authorization::Engine.new(reader)
631
+ # object > user -> pass
632
+ assert engine.permit?(:test, :context => :permissions,
633
+ :user => MockUser.new(:test_role, :test_attr => 1),
634
+ :object => MockDataObject.new(:test_attr => 2))
635
+ # object < user && object = control -> pass
636
+ assert engine.permit?(:test, :context => :permissions,
637
+ :user => MockUser.new(:test_role, :test_attr => 4),
638
+ :object => MockDataObject.new(:test_attr => 3))
639
+ # object = user -> pass
640
+ assert engine.permit?(:test, :context => :permissions,
641
+ :user => MockUser.new(:test_role, :test_attr => 1),
642
+ :object => MockDataObject.new(:test_attr => 1))
643
+ # object < user -> fail
644
+ assert((not(engine.permit?(:test, :context => :permissions,
645
+ :user => MockUser.new(:test_role, :test_attr => 2),
646
+ :object => MockDataObject.new(:test_attr => 1)))))
647
+ end
648
+
649
+ def test_attribute_deep
650
+ reader = Authorization::Reader::DSLReader.new
651
+ reader.parse %|
652
+ authorization do
653
+ role :test_role do
654
+ has_permission_on :permissions, :to => :test do
655
+ if_attribute :test_attr_1 => {:test_attr_2 => contains { 1 }}
656
+ end
657
+ end
658
+ end
659
+ |
660
+ engine = Authorization::Engine.new(reader)
661
+ assert engine.permit?(:test, :context => :permissions,
662
+ :user => MockUser.new(:test_role),
663
+ :object => MockDataObject.new(:test_attr_1 =>
664
+ MockDataObject.new(:test_attr_2 => [1,2])))
665
+ assert !engine.permit?(:test, :context => :permissions,
666
+ :user => MockUser.new(:test_role),
667
+ :object => MockDataObject.new(:test_attr_1 =>
668
+ MockDataObject.new(:test_attr_2 => [3,4])))
669
+ assert_equal [{:test_attr_1 => {:test_attr_2 => [:contains, 1]}}],
670
+ engine.obligations(:test, :context => :permissions,
671
+ :user => MockUser.new(:test_role))
672
+ end
673
+
674
+ def test_attribute_has_many
675
+ reader = Authorization::Reader::DSLReader.new
676
+ reader.parse %|
677
+ authorization do
678
+ role :test_role do
679
+ has_permission_on :companies, :to => :read do
680
+ if_attribute :branches => {:city => is { user.city } }
681
+ end
682
+ end
683
+ end
684
+ |
685
+ engine = Authorization::Engine.new(reader)
686
+
687
+ company = MockDataObject.new(:branches => [
688
+ MockDataObject.new(:city => 'Barcelona'),
689
+ MockDataObject.new(:city => 'Paris')
690
+ ])
691
+ assert engine.permit!(:read, :context => :companies,
692
+ :user => MockUser.new(:test_role, :city => 'Paris'),
693
+ :object => company)
694
+ assert !engine.permit?(:read, :context => :companies,
695
+ :user => MockUser.new(:test_role, :city => 'London'),
696
+ :object => company)
697
+ end
698
+
699
+ def test_attribute_non_block
700
+ reader = Authorization::Reader::DSLReader.new
701
+ reader.parse %|
702
+ authorization do
703
+ role :test_role do
704
+ has_permission_on :permissions, :to => :test do
705
+ if_attribute :test_attr => 1
706
+ end
707
+ end
708
+ end
709
+ |
710
+ engine = Authorization::Engine.new(reader)
711
+ assert engine.permit?(:test, :context => :permissions,
712
+ :user => MockUser.new(:test_role),
713
+ :object => MockDataObject.new(:test_attr => 1))
714
+ assert !engine.permit?(:test, :context => :permissions,
715
+ :user => MockUser.new(:test_role),
716
+ :object => MockDataObject.new(:test_attr => 2))
717
+ end
718
+
719
+ def test_attribute_multiple
720
+ reader = Authorization::Reader::DSLReader.new
721
+ reader.parse %{
722
+ authorization do
723
+ role :test_role do
724
+ has_permission_on :permissions, :to => :test do
725
+ if_attribute :test_attr => 1
726
+ if_attribute :test_attr => 2 # or
727
+ end
728
+ end
729
+ end
730
+ }
731
+ engine = Authorization::Engine.new(reader)
732
+ assert engine.permit?(:test, :context => :permissions,
733
+ :user => MockUser.new(:test_role),
734
+ :object => MockDataObject.new(:test_attr => 1))
735
+ assert engine.permit?(:test, :context => :permissions,
736
+ :user => MockUser.new(:test_role),
737
+ :object => MockDataObject.new(:test_attr => 2))
738
+ end
739
+
740
+ class PermissionMock < MockDataObject
741
+ def self.name
742
+ "Permission"
743
+ end
744
+ end
745
+ def test_attribute_with_permissions
746
+ reader = Authorization::Reader::DSLReader.new
747
+ reader.parse %{
748
+ authorization do
749
+ role :test_role do
750
+ has_permission_on :permissions, :to => :test do
751
+ if_attribute :test_attr => 1
752
+ end
753
+ has_permission_on :permission_children, :to => :test do
754
+ if_permitted_to :test, :permission
755
+ end
756
+ end
757
+ end
758
+ }
759
+ engine = Authorization::Engine.new(reader)
760
+
761
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
762
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
763
+ assert engine.permit?(:test, :context => :permission_children,
764
+ :user => MockUser.new(:test_role),
765
+ :object => MockDataObject.new(:permission => perm_data_attr_1))
766
+ assert !engine.permit?(:test, :context => :permission_children,
767
+ :user => MockUser.new(:test_role),
768
+ :object => MockDataObject.new(:permission => perm_data_attr_2))
769
+ end
770
+
771
+ def test_attribute_with_has_many_permissions
772
+ reader = Authorization::Reader::DSLReader.new
773
+ reader.parse %{
774
+ authorization do
775
+ role :test_role do
776
+ has_permission_on :permissions, :to => :test do
777
+ if_attribute :test_attr => 1
778
+ end
779
+ has_permission_on :permission_children, :to => :test do
780
+ if_permitted_to :test, :permissions
781
+ end
782
+ end
783
+ end
784
+ }
785
+ engine = Authorization::Engine.new(reader)
786
+
787
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
788
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
789
+ assert engine.permit?(:test, :context => :permission_children,
790
+ :user => MockUser.new(:test_role),
791
+ :object => MockDataObject.new(:permissions => [perm_data_attr_1]))
792
+ assert !engine.permit?(:test, :context => :permission_children,
793
+ :user => MockUser.new(:test_role),
794
+ :object => MockDataObject.new(:permissions => [perm_data_attr_2]))
795
+ end
796
+
797
+ def test_attribute_with_deep_permissions
798
+ reader = Authorization::Reader::DSLReader.new
799
+ reader.parse %{
800
+ authorization do
801
+ role :test_role do
802
+ has_permission_on :permissions, :to => :test do
803
+ if_attribute :test_attr => 1
804
+ end
805
+ has_permission_on :permission_children, :to => :test do
806
+ if_permitted_to :test, :shallow_permission => :permission
807
+ end
808
+ end
809
+ end
810
+ }
811
+ engine = Authorization::Engine.new(reader)
812
+
813
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
814
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
815
+ assert engine.permit?(:test, :context => :permission_children,
816
+ :user => MockUser.new(:test_role),
817
+ :object => MockDataObject.new(:shallow_permission =>
818
+ MockDataObject.new(:permission => perm_data_attr_1)))
819
+ assert !engine.permit?(:test, :context => :permission_children,
820
+ :user => MockUser.new(:test_role),
821
+ :object => MockDataObject.new(:shallow_permission =>
822
+ MockDataObject.new(:permission => perm_data_attr_2)))
823
+ end
824
+
825
+ def test_attribute_with_deep_has_many_permissions
826
+ reader = Authorization::Reader::DSLReader.new
827
+ reader.parse %{
828
+ authorization do
829
+ role :test_role do
830
+ has_permission_on :permissions, :to => :test do
831
+ if_attribute :test_attr => 1
832
+ end
833
+ has_permission_on :permission_children, :to => :test do
834
+ if_permitted_to :test, :shallow_permissions => :permission
835
+ end
836
+ end
837
+ end
838
+ }
839
+ engine = Authorization::Engine.new(reader)
840
+
841
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
842
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
843
+ assert engine.permit?(:test, :context => :permission_children,
844
+ :user => MockUser.new(:test_role),
845
+ :object => MockDataObject.new(:shallow_permissions =>
846
+ [MockDataObject.new(:permission => perm_data_attr_1)]))
847
+ assert !engine.permit?(:test, :context => :permission_children,
848
+ :user => MockUser.new(:test_role),
849
+ :object => MockDataObject.new(:shallow_permissions =>
850
+ [MockDataObject.new(:permission => perm_data_attr_2)]))
851
+ end
852
+
853
+ def test_attribute_with_permissions_nil
854
+ reader = Authorization::Reader::DSLReader.new
855
+ reader.parse %{
856
+ authorization do
857
+ role :test_role do
858
+ has_permission_on :permissions, :to => :test do
859
+ if_attribute :test_attr => 1
860
+ end
861
+ has_permission_on :permission_children, :to => :test do
862
+ if_permitted_to :test, :permission
863
+ end
864
+ end
865
+ end
866
+ }
867
+ engine = Authorization::Engine.new(reader)
868
+
869
+ assert_nothing_raised do
870
+ engine.permit?(:test, :context => :permission_children,
871
+ :user => MockUser.new(:test_role),
872
+ :object => MockDataObject.new(:permission => nil))
873
+ end
874
+
875
+ assert !engine.permit?(:test, :context => :permission_children,
876
+ :user => MockUser.new(:test_role),
877
+ :object => MockDataObject.new(:permission => nil))
878
+ end
879
+
880
+ def test_attribute_with_permissions_on_self
881
+ reader = Authorization::Reader::DSLReader.new
882
+ reader.parse %{
883
+ authorization do
884
+ role :test_role do
885
+ has_permission_on :permissions, :to => :test do
886
+ if_attribute :test_attr => 1
887
+ end
888
+ has_permission_on :permissions, :to => :another_test do
889
+ if_permitted_to :test
890
+ end
891
+ end
892
+ end
893
+ }
894
+ engine = Authorization::Engine.new(reader)
895
+
896
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
897
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
898
+ assert engine.permit?(:another_test, :context => :permissions,
899
+ :user => MockUser.new(:test_role),
900
+ :object => perm_data_attr_1)
901
+ assert !engine.permit?(:another_test, :context => :permissions,
902
+ :user => MockUser.new(:test_role),
903
+ :object => perm_data_attr_2)
904
+ end
905
+
906
+ def test_attribute_with_permissions_on_self_with_context
907
+ reader = Authorization::Reader::DSLReader.new
908
+ reader.parse %{
909
+ authorization do
910
+ role :test_role do
911
+ has_permission_on :permissions, :to => :test do
912
+ if_attribute :test_attr => 1
913
+ end
914
+ has_permission_on :permissions, :to => :another_test do
915
+ if_permitted_to :test, :context => :permissions
916
+ end
917
+ end
918
+ end
919
+ }
920
+ engine = Authorization::Engine.new(reader)
921
+
922
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
923
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
924
+ assert engine.permit?(:another_test, :context => :permissions,
925
+ :user => MockUser.new(:test_role),
926
+ :object => perm_data_attr_1)
927
+ assert !engine.permit?(:another_test, :context => :permissions,
928
+ :user => MockUser.new(:test_role),
929
+ :object => perm_data_attr_2)
930
+ end
931
+
932
+ def test_attribute_with_permissions_and_anded_rules
933
+ reader = Authorization::Reader::DSLReader.new
934
+ reader.parse %{
935
+ authorization do
936
+ role :test_role do
937
+ has_permission_on :permissions, :to => :test do
938
+ if_attribute :test_attr => 1
939
+ end
940
+ has_permission_on :permission_children, :to => :test, :join_by => :and do
941
+ if_permitted_to :test, :permission
942
+ if_attribute :test_attr => 1
943
+ end
944
+ end
945
+ end
946
+ }
947
+ engine = Authorization::Engine.new(reader)
948
+
949
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
950
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
951
+ assert engine.permit?(:test, :context => :permission_children,
952
+ :user => MockUser.new(:test_role),
953
+ :object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 1))
954
+ assert !engine.permit?(:test, :context => :permission_children,
955
+ :user => MockUser.new(:test_role),
956
+ :object => MockDataObject.new(:permission => perm_data_attr_2, :test_attr => 1))
957
+ assert !engine.permit?(:test, :context => :permission_children,
958
+ :user => MockUser.new(:test_role),
959
+ :object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 2))
960
+ end
961
+
962
+ def test_attribute_with_anded_rules
963
+ reader = Authorization::Reader::DSLReader.new
964
+ reader.parse %{
965
+ authorization do
966
+ role :test_role do
967
+ has_permission_on :permissions, :to => :test, :join_by => :and do
968
+ if_attribute :test_attr => 1
969
+ if_attribute :test_attr_2 => 2
970
+ end
971
+ end
972
+ end
973
+ }
974
+ engine = Authorization::Engine.new(reader)
975
+
976
+ assert engine.permit?(:test, :context => :permissions,
977
+ :user => MockUser.new(:test_role),
978
+ :object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 2))
979
+ assert !engine.permit?(:test, :context => :permissions,
980
+ :user => MockUser.new(:test_role),
981
+ :object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 3))
982
+ end
983
+
984
+ def test_raise_on_if_attribute_hash_on_collection
985
+ reader = Authorization::Reader::DSLReader.new
986
+ reader.parse %{
987
+ authorization do
988
+ role :test_role do
989
+ has_permission_on :permissions, :to => :test do
990
+ if_attribute :test_attrs => {:attr => is {1}}
991
+ end
992
+ end
993
+ end
994
+ }
995
+ engine = Authorization::Engine.new(reader)
996
+ assert_raise Authorization::AuthorizationUsageError do
997
+ engine.permit?(:test, :context => :permissions,
998
+ :user => MockUser.new(:test_role),
999
+ :object => MockDataObject.new(:test_attrs => [1, 2, 3]))
1000
+ end
1001
+ end
1002
+
1003
+ def test_role_title_description
1004
+ reader = Authorization::Reader::DSLReader.new
1005
+ reader.parse %{
1006
+ authorization do
1007
+ role :test_role, :title => 'Test Role' do
1008
+ description "Test Role Description"
1009
+ end
1010
+ end
1011
+ }
1012
+ engine = Authorization::Engine.new(reader)
1013
+ assert engine.roles.include?(:test_role)
1014
+ assert_equal "Test Role", engine.role_titles[:test_role]
1015
+ assert_equal "Test Role", engine.title_for(:test_role)
1016
+ assert_nil engine.title_for(:test_role_2)
1017
+ assert_equal "Test Role Description", engine.role_descriptions[:test_role]
1018
+ assert_equal "Test Role Description", engine.description_for(:test_role)
1019
+ assert_nil engine.description_for(:test_role_2)
1020
+ end
1021
+
1022
+ def test_multithread
1023
+ reader = Authorization::Reader::DSLReader.new
1024
+ reader.parse %{
1025
+ authorization do
1026
+ role :test_role do
1027
+ has_permission_on :permissions, :to => :test
1028
+ end
1029
+ end
1030
+ }
1031
+
1032
+ engine = Authorization::Engine.new(reader)
1033
+ Authorization.current_user = MockUser.new(:test_role)
1034
+ assert engine.permit?(:test, :context => :permissions)
1035
+ Thread.new do
1036
+ Authorization.current_user = MockUser.new(:test_role2)
1037
+ assert !engine.permit?(:test, :context => :permissions)
1038
+ end
1039
+ assert engine.permit?(:test, :context => :permissions)
1040
+ Authorization.current_user = nil
1041
+ end
1042
+
1043
+ def test_clone
1044
+ reader = Authorization::Reader::DSLReader.new
1045
+ reader.parse %{
1046
+ authorization do
1047
+ role :test_role do
1048
+ has_permission_on :permissions, :to => :test do
1049
+ if_attribute :attr => { :sub_attr => is { user } }
1050
+ if_permitted_to :read, :attr_2 => :attr_3
1051
+ if_permitted_to :read, :attr_2
1052
+ end
1053
+ end
1054
+ end
1055
+ }
1056
+
1057
+ engine = Authorization::Engine.new(reader)
1058
+ cloned_engine = engine.clone
1059
+ assert_not_equal engine.auth_rules[0].contexts.object_id,
1060
+ cloned_engine.auth_rules[0].contexts.object_id
1061
+ assert_not_equal engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id,
1062
+ cloned_engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id
1063
+ end
1064
+ end
1065
+