rubycs-declarative_authorization 0.3.0

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 (37) hide show
  1. data/CHANGELOG +70 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +9 -0
  4. data/Rakefile +43 -0
  5. data/app/controllers/authorization_rules_controller.rb +114 -0
  6. data/app/controllers/authorization_usages_controller.rb +23 -0
  7. data/app/helpers/authorization_rules_helper.rb +100 -0
  8. data/app/views/authorization_rules/graph.dot.erb +49 -0
  9. data/app/views/authorization_rules/graph.html.erb +39 -0
  10. data/app/views/authorization_rules/index.html.erb +16 -0
  11. data/app/views/authorization_usages/index.html.erb +45 -0
  12. data/authorization_rules.dist.rb +20 -0
  13. data/config/locales/en.declarative_authorization.yml +35 -0
  14. data/config/locales/ro.declarative_authorization.yml +35 -0
  15. data/config/routes.rb +6 -0
  16. data/garlic_example.rb +20 -0
  17. data/init.rb +5 -0
  18. data/lib/declarative_authorization.rb +15 -0
  19. data/lib/declarative_authorization/authorization.rb +578 -0
  20. data/lib/declarative_authorization/authorization_rules_analyzer.rb +138 -0
  21. data/lib/declarative_authorization/helper.rb +56 -0
  22. data/lib/declarative_authorization/in_controller.rb +343 -0
  23. data/lib/declarative_authorization/in_model.rb +125 -0
  24. data/lib/declarative_authorization/maintenance.rb +174 -0
  25. data/lib/declarative_authorization/obligation_scope.rb +292 -0
  26. data/lib/declarative_authorization/rails_legacy.rb +14 -0
  27. data/lib/declarative_authorization/reader.rb +430 -0
  28. data/test/authorization_rules_analyzer_test.rb +123 -0
  29. data/test/authorization_test.rb +779 -0
  30. data/test/controller_test.rb +361 -0
  31. data/test/dsl_reader_test.rb +157 -0
  32. data/test/helper_test.rb +133 -0
  33. data/test/maintenance_test.rb +15 -0
  34. data/test/model_test.rb +1143 -0
  35. data/test/schema.sql +53 -0
  36. data/test/test_helper.rb +99 -0
  37. metadata +97 -0
@@ -0,0 +1,779 @@
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_multiple_contexts
38
+ reader = Authorization::Reader::DSLReader.new
39
+ reader.parse %{
40
+ authorization do
41
+ role :test_role do
42
+ has_permission_on [:permissions, :permissions_2], :to => :test
43
+ end
44
+ end
45
+ }
46
+ engine = Authorization::Engine.new(reader)
47
+ assert engine.permit?(:test, :context => :permissions,
48
+ :user => MockUser.new(:test_role))
49
+ assert engine.permit?(:test, :context => :permissions_2,
50
+ :user => MockUser.new(:test_role))
51
+ assert !engine.permit?(:test, :context => :permissions_3,
52
+ :user => MockUser.new(:test_role))
53
+ end
54
+
55
+ def test_obligations_without_conditions
56
+ reader = Authorization::Reader::DSLReader.new
57
+ reader.parse %{
58
+ authorization do
59
+ role :test_role do
60
+ has_permission_on :permissions, :to => :test
61
+ end
62
+ end
63
+ }
64
+ engine = Authorization::Engine.new(reader)
65
+ assert_equal [{}], engine.obligations(:test, :context => :permissions,
66
+ :user => MockUser.new(:test_role))
67
+ end
68
+
69
+ def test_obligations_with_conditions
70
+ reader = Authorization::Reader::DSLReader.new
71
+ reader.parse %{
72
+ authorization do
73
+ role :test_role do
74
+ has_permission_on :permissions, :to => :test do
75
+ if_attribute :attr => is { user.attr }
76
+ end
77
+ end
78
+ end
79
+ }
80
+ engine = Authorization::Engine.new(reader)
81
+ assert_equal [{:attr => [:is, 1]}],
82
+ engine.obligations(:test, :context => :permissions,
83
+ :user => MockUser.new(:test_role, :attr => 1))
84
+ end
85
+
86
+ def test_obligations_with_anded_conditions
87
+ reader = Authorization::Reader::DSLReader.new
88
+ reader.parse %{
89
+ authorization do
90
+ role :test_role do
91
+ has_permission_on :permissions, :to => :test, :join_by => :and do
92
+ if_attribute :attr => is { user.attr }
93
+ if_attribute :attr_2 => is { user.attr_2 }
94
+ end
95
+ end
96
+ end
97
+ }
98
+ engine = Authorization::Engine.new(reader)
99
+ assert_equal [{:attr => [:is, 1], :attr_2 => [:is, 2]}],
100
+ engine.obligations(:test, :context => :permissions,
101
+ :user => MockUser.new(:test_role, :attr => 1, :attr_2 => 2))
102
+ end
103
+
104
+ def test_obligations_with_deep_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 => { :deeper_attr => is { user.deeper_attr }}
111
+ if_attribute :attr => { :deeper_attr_2 => is { user.deeper_attr_2 }}
112
+ end
113
+ end
114
+ end
115
+ }
116
+ engine = Authorization::Engine.new(reader)
117
+ assert_equal [{:attr => { :deeper_attr => [:is, 1], :deeper_attr_2 => [:is, 2] } }],
118
+ engine.obligations(:test, :context => :permissions,
119
+ :user => MockUser.new(:test_role, :deeper_attr => 1, :deeper_attr_2 => 2))
120
+ end
121
+
122
+ def test_obligations_with_conditions_and_empty
123
+ reader = Authorization::Reader::DSLReader.new
124
+ reader.parse %{
125
+ authorization do
126
+ role :test_role do
127
+ has_permission_on :permissions, :to => :test
128
+ has_permission_on :permissions, :to => :test do
129
+ if_attribute :attr => is { user.attr }
130
+ end
131
+ end
132
+ end
133
+ }
134
+ engine = Authorization::Engine.new(reader)
135
+ assert_equal [{}, {:attr => [:is, 1]}],
136
+ engine.obligations(:test, :context => :permissions,
137
+ :user => MockUser.new(:test_role, :attr => 1))
138
+ end
139
+
140
+ def test_obligations_with_permissions
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 :attr => is { user.attr }
147
+ end
148
+ has_permission_on :permission_children, :to => :test do
149
+ if_permitted_to :test, :permission, :context => :permissions
150
+ end
151
+ has_permission_on :permission_children_2, :to => :test do
152
+ if_permitted_to :test, :permission
153
+ end
154
+ has_permission_on :permission_children_children, :to => :test do
155
+ if_permitted_to :test, :permission_child => :permission,
156
+ :context => :permissions
157
+ end
158
+ end
159
+ end
160
+ }
161
+ engine = Authorization::Engine.new(reader)
162
+ assert_equal [{:permission => {:attr => [:is, 1]}}],
163
+ engine.obligations(:test, :context => :permission_children,
164
+ :user => MockUser.new(:test_role, :attr => 1))
165
+ assert_equal [{:permission => {:attr => [:is, 1]}}],
166
+ engine.obligations(:test, :context => :permission_children_2,
167
+ :user => MockUser.new(:test_role, :attr => 1))
168
+ assert_equal [{:permission_child => {:permission => {:attr => [:is, 1]}}}],
169
+ engine.obligations(:test, :context => :permission_children_children,
170
+ :user => MockUser.new(:test_role, :attr => 1))
171
+ end
172
+
173
+ def test_obligations_with_permissions_multiple
174
+ reader = Authorization::Reader::DSLReader.new
175
+ reader.parse %{
176
+ authorization do
177
+ role :test_role do
178
+ has_permission_on :permissions, :to => :test do
179
+ if_attribute :attr => is { 1 }
180
+ if_attribute :attr => is { 2 }
181
+ end
182
+ has_permission_on :permission_children_children, :to => :test do
183
+ if_permitted_to :test, :permission_child => :permission
184
+ end
185
+ end
186
+ end
187
+ }
188
+ engine = Authorization::Engine.new(reader)
189
+ assert_equal [{:permission_child => {:permission => {:attr => [:is, 1]}}},
190
+ {:permission_child => {:permission => {:attr => [:is, 2]}}}],
191
+ engine.obligations(:test, :context => :permission_children_children,
192
+ :user => MockUser.new(:test_role))
193
+ end
194
+
195
+ def test_guest_user
196
+ reader = Authorization::Reader::DSLReader.new
197
+ reader.parse %{
198
+ authorization do
199
+ role :guest do
200
+ has_permission_on :permissions, :to => :test
201
+ end
202
+ end
203
+ }
204
+ engine = Authorization::Engine.new(reader)
205
+ assert engine.permit?(:test, :context => :permissions)
206
+ assert !engine.permit?(:test, :context => :permissions_2)
207
+ end
208
+
209
+ def test_invalid_user_model
210
+ reader = Authorization::Reader::DSLReader.new
211
+ reader.parse %{
212
+ authorization do
213
+ role :guest do
214
+ has_permission_on :permissions, :to => :test
215
+ end
216
+ end
217
+ }
218
+ engine = Authorization::Engine.new(reader)
219
+ assert_raise(Authorization::AuthorizationUsageError) do
220
+ engine.permit?(:test, :context => :permissions, :user => MockUser.new(1, 2))
221
+ end
222
+ assert_raise(Authorization::AuthorizationUsageError) do
223
+ engine.permit?(:test, :context => :permissions, :user => MockDataObject.new)
224
+ end
225
+ end
226
+
227
+ def test_role_hierarchy
228
+ reader = Authorization::Reader::DSLReader.new
229
+ reader.parse %{
230
+ authorization do
231
+ role :test_role do
232
+ includes :lower_role
233
+ has_permission_on :permissions, :to => :test
234
+ end
235
+ role :lower_role do
236
+ has_permission_on :permissions, :to => :lower
237
+ end
238
+ end
239
+ }
240
+ engine = Authorization::Engine.new(reader)
241
+ assert engine.permit?(:lower, :context => :permissions,
242
+ :user => MockUser.new(:test_role))
243
+ end
244
+
245
+ def test_role_hierarchy_infinity
246
+ reader = Authorization::Reader::DSLReader.new
247
+ reader.parse %{
248
+ authorization do
249
+ role :test_role do
250
+ includes :lower_role
251
+ has_permission_on :permissions, :to => :test
252
+ end
253
+ role :lower_role do
254
+ includes :higher_role
255
+ has_permission_on :permissions, :to => :lower
256
+ end
257
+ end
258
+ }
259
+ engine = Authorization::Engine.new(reader)
260
+ assert engine.permit?(:lower, :context => :permissions,
261
+ :user => MockUser.new(:test_role))
262
+ end
263
+
264
+ def test_privilege_hierarchy
265
+ reader = Authorization::Reader::DSLReader.new
266
+ reader.parse %{
267
+ privileges do
268
+ privilege :test, :permissions do
269
+ includes :lower
270
+ end
271
+ end
272
+ authorization do
273
+ role :test_role do
274
+ has_permission_on :permissions, :to => :test
275
+ end
276
+ end
277
+ }
278
+ engine = Authorization::Engine.new(reader)
279
+ assert engine.permit?(:lower, :context => :permissions,
280
+ :user => MockUser.new(:test_role))
281
+ end
282
+
283
+ def test_privilege_hierarchy_without_context
284
+ reader = Authorization::Reader::DSLReader.new
285
+ reader.parse %{
286
+ privileges do
287
+ privilege :read do
288
+ includes :list, :show
289
+ end
290
+ end
291
+ authorization do
292
+ role :test_role do
293
+ has_permission_on :permissions, :to => :read
294
+ end
295
+ end
296
+ }
297
+ engine = Authorization::Engine.new(reader)
298
+ assert engine.permit?(:list, :context => :permissions,
299
+ :user => MockUser.new(:test_role))
300
+ end
301
+
302
+ def test_attribute_is
303
+ reader = Authorization::Reader::DSLReader.new
304
+ reader.parse %|
305
+ authorization do
306
+ role :test_role do
307
+ has_permission_on :permissions, :to => :test do
308
+ if_attribute :test_attr => is { user.test_attr }
309
+ if_attribute :test_attr => 3
310
+ end
311
+ end
312
+ end
313
+ |
314
+ engine = Authorization::Engine.new(reader)
315
+ assert engine.permit?(:test, :context => :permissions,
316
+ :user => MockUser.new(:test_role, :test_attr => 1),
317
+ :object => MockDataObject.new(:test_attr => 1))
318
+ assert engine.permit?(:test, :context => :permissions,
319
+ :user => MockUser.new(:test_role, :test_attr => 2),
320
+ :object => MockDataObject.new(:test_attr => 3))
321
+ assert((not(engine.permit?(:test, :context => :permissions,
322
+ :user => MockUser.new(:test_role, :test_attr => 2),
323
+ :object => MockDataObject.new(:test_attr => 1)))))
324
+ end
325
+
326
+ def test_attribute_is_not
327
+ reader = Authorization::Reader::DSLReader.new
328
+ reader.parse %|
329
+ authorization do
330
+ role :test_role do
331
+ has_permission_on :permissions, :to => :test do
332
+ if_attribute :test_attr => is_not { user.test_attr }
333
+ end
334
+ end
335
+ end
336
+ |
337
+ engine = Authorization::Engine.new(reader)
338
+ assert !engine.permit?(:test, :context => :permissions,
339
+ :user => MockUser.new(:test_role, :test_attr => 1),
340
+ :object => MockDataObject.new(:test_attr => 1))
341
+ assert engine.permit?(:test, :context => :permissions,
342
+ :user => MockUser.new(:test_role, :test_attr => 2),
343
+ :object => MockDataObject.new(:test_attr => 1))
344
+ end
345
+
346
+ def test_attribute_contains
347
+ reader = Authorization::Reader::DSLReader.new
348
+ reader.parse %|
349
+ authorization do
350
+ role :test_role do
351
+ has_permission_on :permissions, :to => :test do
352
+ if_attribute :test_attr => contains { user.test_attr }
353
+ end
354
+ end
355
+ end
356
+ |
357
+ engine = Authorization::Engine.new(reader)
358
+ assert engine.permit?(:test, :context => :permissions,
359
+ :user => MockUser.new(:test_role, :test_attr => 1),
360
+ :object => MockDataObject.new(:test_attr => [1,2]))
361
+ assert !engine.permit?(:test, :context => :permissions,
362
+ :user => MockUser.new(:test_role, :test_attr => 3),
363
+ :object => MockDataObject.new(:test_attr => [1,2]))
364
+ end
365
+
366
+ def test_attribute_does_not_contain
367
+ reader = Authorization::Reader::DSLReader.new
368
+ reader.parse %|
369
+ authorization do
370
+ role :test_role do
371
+ has_permission_on :permissions, :to => :test do
372
+ if_attribute :test_attr => does_not_contain { user.test_attr }
373
+ end
374
+ end
375
+ end
376
+ |
377
+ engine = Authorization::Engine.new(reader)
378
+ assert !engine.permit?(:test, :context => :permissions,
379
+ :user => MockUser.new(:test_role, :test_attr => 1),
380
+ :object => MockDataObject.new(:test_attr => [1,2]))
381
+ assert engine.permit?(:test, :context => :permissions,
382
+ :user => MockUser.new(:test_role, :test_attr => 3),
383
+ :object => MockDataObject.new(:test_attr => [1,2]))
384
+ end
385
+
386
+ def test_attribute_in_array
387
+ reader = Authorization::Reader::DSLReader.new
388
+ reader.parse %|
389
+ authorization do
390
+ role :test_role do
391
+ has_permission_on :permissions, :to => :test do
392
+ if_attribute :test_attr => is_in { [1,2] }
393
+ if_attribute :test_attr => [2,3]
394
+ end
395
+ end
396
+ end
397
+ |
398
+ engine = Authorization::Engine.new(reader)
399
+ assert engine.permit?(:test, :context => :permissions,
400
+ :user => MockUser.new(:test_role),
401
+ :object => MockDataObject.new(:test_attr => 1))
402
+ assert engine.permit?(:test, :context => :permissions,
403
+ :user => MockUser.new(:test_role),
404
+ :object => MockDataObject.new(:test_attr => 3))
405
+ assert !engine.permit?(:test, :context => :permissions,
406
+ :user => MockUser.new(:test_role),
407
+ :object => MockDataObject.new(:test_attr => 4))
408
+ end
409
+
410
+ def test_attribute_not_in_array
411
+ reader = Authorization::Reader::DSLReader.new
412
+ reader.parse %|
413
+ authorization do
414
+ role :test_role do
415
+ has_permission_on :permissions, :to => :test do
416
+ if_attribute :test_attr => is_not_in { [1,2] }
417
+ end
418
+ end
419
+ end
420
+ |
421
+ engine = Authorization::Engine.new(reader)
422
+ assert !engine.permit?(:test, :context => :permissions,
423
+ :user => MockUser.new(:test_role),
424
+ :object => MockDataObject.new(:test_attr => 1))
425
+ assert engine.permit?(:test, :context => :permissions,
426
+ :user => MockUser.new(:test_role),
427
+ :object => MockDataObject.new(:test_attr => 4))
428
+ end
429
+
430
+ def test_attribute_intersects_with
431
+ reader = Authorization::Reader::DSLReader.new
432
+ reader.parse %{
433
+ authorization do
434
+ role :test_role do
435
+ has_permission_on :permissions, :to => :test do
436
+ if_attribute :test_attrs => intersects_with { [1,2] }
437
+ end
438
+ end
439
+ role :test_role_2 do
440
+ has_permission_on :permissions, :to => :test do
441
+ if_attribute :test_attrs => intersects_with { 1 }
442
+ end
443
+ end
444
+ end
445
+ }
446
+
447
+ engine = Authorization::Engine.new(reader)
448
+ assert_raise Authorization::AuthorizationUsageError do
449
+ engine.permit?(:test, :context => :permissions,
450
+ :user => MockUser.new(:test_role),
451
+ :object => MockDataObject.new(:test_attrs => 1 ))
452
+ end
453
+ assert_raise Authorization::AuthorizationUsageError do
454
+ engine.permit?(:test, :context => :permissions,
455
+ :user => MockUser.new(:test_role_2),
456
+ :object => MockDataObject.new(:test_attrs => [1, 2] ))
457
+ end
458
+ assert engine.permit?(:test, :context => :permissions,
459
+ :user => MockUser.new(:test_role),
460
+ :object => MockDataObject.new(:test_attrs => [1,3] ))
461
+ assert !engine.permit?(:test, :context => :permissions,
462
+ :user => MockUser.new(:test_role),
463
+ :object => MockDataObject.new(:test_attrs => [3,4] ))
464
+ end
465
+
466
+ def test_attribute_deep
467
+ reader = Authorization::Reader::DSLReader.new
468
+ reader.parse %|
469
+ authorization do
470
+ role :test_role do
471
+ has_permission_on :permissions, :to => :test do
472
+ if_attribute :test_attr_1 => {:test_attr_2 => contains { 1 }}
473
+ end
474
+ end
475
+ end
476
+ |
477
+ engine = Authorization::Engine.new(reader)
478
+ attr_1_struct = Struct.new(:test_attr_2)
479
+ assert engine.permit?(:test, :context => :permissions,
480
+ :user => MockUser.new(:test_role),
481
+ :object => MockDataObject.new(:test_attr_1 => attr_1_struct.new([1,2])))
482
+ assert !engine.permit?(:test, :context => :permissions,
483
+ :user => MockUser.new(:test_role),
484
+ :object => MockDataObject.new(:test_attr_1 => attr_1_struct.new([3,4])))
485
+ assert_equal [{:test_attr_1 => {:test_attr_2 => [:contains, 1]}}],
486
+ engine.obligations(:test, :context => :permissions,
487
+ :user => MockUser.new(:test_role))
488
+ end
489
+
490
+ def test_attribute_non_block
491
+ reader = Authorization::Reader::DSLReader.new
492
+ reader.parse %|
493
+ authorization do
494
+ role :test_role do
495
+ has_permission_on :permissions, :to => :test do
496
+ if_attribute :test_attr => 1
497
+ end
498
+ end
499
+ end
500
+ |
501
+ engine = Authorization::Engine.new(reader)
502
+ assert engine.permit?(:test, :context => :permissions,
503
+ :user => MockUser.new(:test_role),
504
+ :object => MockDataObject.new(:test_attr => 1))
505
+ assert !engine.permit?(:test, :context => :permissions,
506
+ :user => MockUser.new(:test_role),
507
+ :object => MockDataObject.new(:test_attr => 2))
508
+ end
509
+
510
+ def test_attribute_multiple
511
+ reader = Authorization::Reader::DSLReader.new
512
+ reader.parse %{
513
+ authorization do
514
+ role :test_role do
515
+ has_permission_on :permissions, :to => :test do
516
+ if_attribute :test_attr => 1
517
+ if_attribute :test_attr => 2 # or
518
+ end
519
+ end
520
+ end
521
+ }
522
+ engine = Authorization::Engine.new(reader)
523
+ assert engine.permit?(:test, :context => :permissions,
524
+ :user => MockUser.new(:test_role),
525
+ :object => MockDataObject.new(:test_attr => 1))
526
+ assert engine.permit?(:test, :context => :permissions,
527
+ :user => MockUser.new(:test_role),
528
+ :object => MockDataObject.new(:test_attr => 2))
529
+ end
530
+
531
+ class PermissionMock < MockDataObject
532
+ def self.table_name
533
+ "permissions"
534
+ end
535
+ end
536
+ def test_attribute_with_permissions
537
+ reader = Authorization::Reader::DSLReader.new
538
+ reader.parse %{
539
+ authorization do
540
+ role :test_role do
541
+ has_permission_on :permissions, :to => :test do
542
+ if_attribute :test_attr => 1
543
+ end
544
+ has_permission_on :permission_children, :to => :test do
545
+ if_permitted_to :test, :permission
546
+ end
547
+ end
548
+ end
549
+ }
550
+ engine = Authorization::Engine.new(reader)
551
+
552
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
553
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
554
+ assert engine.permit?(:test, :context => :permission_children,
555
+ :user => MockUser.new(:test_role),
556
+ :object => MockDataObject.new(:permission => perm_data_attr_1))
557
+ assert !engine.permit?(:test, :context => :permission_children,
558
+ :user => MockUser.new(:test_role),
559
+ :object => MockDataObject.new(:permission => perm_data_attr_2))
560
+ end
561
+
562
+ def test_attribute_with_deep_permissions
563
+ reader = Authorization::Reader::DSLReader.new
564
+ reader.parse %{
565
+ authorization do
566
+ role :test_role do
567
+ has_permission_on :permissions, :to => :test do
568
+ if_attribute :test_attr => 1
569
+ end
570
+ has_permission_on :permission_children, :to => :test do
571
+ if_permitted_to :test, :shallow_permission => :permission
572
+ end
573
+ end
574
+ end
575
+ }
576
+ engine = Authorization::Engine.new(reader)
577
+
578
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
579
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
580
+ assert engine.permit?(:test, :context => :permission_children,
581
+ :user => MockUser.new(:test_role),
582
+ :object => MockDataObject.new(:shallow_permission =>
583
+ MockDataObject.new(:permission => perm_data_attr_1)))
584
+ assert !engine.permit?(:test, :context => :permission_children,
585
+ :user => MockUser.new(:test_role),
586
+ :object => MockDataObject.new(:shallow_permission =>
587
+ MockDataObject.new(:permission => perm_data_attr_2)))
588
+ end
589
+
590
+ def test_attribute_with_permissions_nil
591
+ reader = Authorization::Reader::DSLReader.new
592
+ reader.parse %{
593
+ authorization do
594
+ role :test_role do
595
+ has_permission_on :permissions, :to => :test do
596
+ if_attribute :test_attr => 1
597
+ end
598
+ has_permission_on :permission_children, :to => :test do
599
+ if_permitted_to :test, :permission
600
+ end
601
+ end
602
+ end
603
+ }
604
+ engine = Authorization::Engine.new(reader)
605
+
606
+ assert_nothing_raised do
607
+ engine.permit?(:test, :context => :permission_children,
608
+ :user => MockUser.new(:test_role),
609
+ :object => MockDataObject.new(:permission => nil))
610
+ end
611
+
612
+ assert !engine.permit?(:test, :context => :permission_children,
613
+ :user => MockUser.new(:test_role),
614
+ :object => MockDataObject.new(:permission => nil))
615
+ end
616
+
617
+ def test_attribute_with_permissions_on_self
618
+ reader = Authorization::Reader::DSLReader.new
619
+ reader.parse %{
620
+ authorization do
621
+ role :test_role do
622
+ has_permission_on :permissions, :to => :test do
623
+ if_attribute :test_attr => 1
624
+ end
625
+ has_permission_on :permissions, :to => :another_test do
626
+ if_permitted_to :test
627
+ end
628
+ end
629
+ end
630
+ }
631
+ engine = Authorization::Engine.new(reader)
632
+
633
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
634
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
635
+ assert engine.permit?(:another_test, :context => :permissions,
636
+ :user => MockUser.new(:test_role),
637
+ :object => perm_data_attr_1)
638
+ assert !engine.permit?(:another_test, :context => :permissions,
639
+ :user => MockUser.new(:test_role),
640
+ :object => perm_data_attr_2)
641
+ end
642
+
643
+ def test_attribute_with_permissions_on_self_with_context
644
+ reader = Authorization::Reader::DSLReader.new
645
+ reader.parse %{
646
+ authorization do
647
+ role :test_role do
648
+ has_permission_on :permissions, :to => :test do
649
+ if_attribute :test_attr => 1
650
+ end
651
+ has_permission_on :permissions, :to => :another_test do
652
+ if_permitted_to :test, :context => :permissions
653
+ end
654
+ end
655
+ end
656
+ }
657
+ engine = Authorization::Engine.new(reader)
658
+
659
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
660
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
661
+ assert engine.permit?(:another_test, :context => :permissions,
662
+ :user => MockUser.new(:test_role),
663
+ :object => perm_data_attr_1)
664
+ assert !engine.permit?(:another_test, :context => :permissions,
665
+ :user => MockUser.new(:test_role),
666
+ :object => perm_data_attr_2)
667
+ end
668
+
669
+ def test_attribute_with_permissions_and_anded_rules
670
+ reader = Authorization::Reader::DSLReader.new
671
+ reader.parse %{
672
+ authorization do
673
+ role :test_role do
674
+ has_permission_on :permissions, :to => :test do
675
+ if_attribute :test_attr => 1
676
+ end
677
+ has_permission_on :permission_children, :to => :test, :join_by => :and do
678
+ if_permitted_to :test, :permission
679
+ if_attribute :test_attr => 1
680
+ end
681
+ end
682
+ end
683
+ }
684
+ engine = Authorization::Engine.new(reader)
685
+
686
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
687
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
688
+ assert engine.permit?(:test, :context => :permission_children,
689
+ :user => MockUser.new(:test_role),
690
+ :object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 1))
691
+ assert !engine.permit?(:test, :context => :permission_children,
692
+ :user => MockUser.new(:test_role),
693
+ :object => MockDataObject.new(:permission => perm_data_attr_2, :test_attr => 1))
694
+ assert !engine.permit?(:test, :context => :permission_children,
695
+ :user => MockUser.new(:test_role),
696
+ :object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 2))
697
+ end
698
+
699
+ def test_attribute_with_anded_rules
700
+ reader = Authorization::Reader::DSLReader.new
701
+ reader.parse %{
702
+ authorization do
703
+ role :test_role do
704
+ has_permission_on :permissions, :to => :test, :join_by => :and do
705
+ if_attribute :test_attr => 1
706
+ if_attribute :test_attr_2 => 2
707
+ end
708
+ end
709
+ end
710
+ }
711
+ engine = Authorization::Engine.new(reader)
712
+
713
+ assert engine.permit?(:test, :context => :permissions,
714
+ :user => MockUser.new(:test_role),
715
+ :object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 2))
716
+ assert !engine.permit?(:test, :context => :permissions,
717
+ :user => MockUser.new(:test_role),
718
+ :object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 3))
719
+ end
720
+
721
+ def test_raise_on_if_attribute_hash_on_collection
722
+ reader = Authorization::Reader::DSLReader.new
723
+ reader.parse %{
724
+ authorization do
725
+ role :test_role do
726
+ has_permission_on :permissions, :to => :test do
727
+ if_attribute :test_attrs => {:attr => is {1}}
728
+ end
729
+ end
730
+ end
731
+ }
732
+ engine = Authorization::Engine.new(reader)
733
+ assert_raise Authorization::AuthorizationUsageError do
734
+ engine.permit?(:test, :context => :permissions,
735
+ :user => MockUser.new(:test_role),
736
+ :object => MockDataObject.new(:test_attrs => [1, 2, 3]))
737
+ end
738
+ end
739
+
740
+ def test_role_title_description
741
+ reader = Authorization::Reader::DSLReader.new
742
+ reader.parse %{
743
+ authorization do
744
+ role :test_role, :title => 'Test Role' do
745
+ description "Test Role Description"
746
+ end
747
+ end
748
+ }
749
+ engine = Authorization::Engine.new(reader)
750
+ assert engine.roles.include?(:test_role)
751
+ assert_equal "Test Role", engine.role_titles[:test_role]
752
+ assert_equal "Test Role", engine.title_for(:test_role)
753
+ assert_nil engine.title_for(:test_role_2)
754
+ assert_equal "Test Role Description", engine.role_descriptions[:test_role]
755
+ assert_equal "Test Role Description", engine.description_for(:test_role)
756
+ assert_nil engine.description_for(:test_role_2)
757
+ end
758
+
759
+ def test_multithread
760
+ reader = Authorization::Reader::DSLReader.new
761
+ reader.parse %{
762
+ authorization do
763
+ role :test_role do
764
+ has_permission_on :permissions, :to => :test
765
+ end
766
+ end
767
+ }
768
+
769
+ engine = Authorization::Engine.new(reader)
770
+ Authorization.current_user = MockUser.new(:test_role)
771
+ assert engine.permit?(:test, :context => :permissions)
772
+ Thread.new do
773
+ Authorization.current_user = MockUser.new(:test_role2)
774
+ assert !engine.permit?(:test, :context => :permissions)
775
+ end
776
+ assert engine.permit?(:test, :context => :permissions)
777
+ Authorization.current_user = nil
778
+ end
779
+ end