graylog2-declarative_authorization 0.5.2

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