uhees-declarative_authorization 0.3.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 (42) hide show
  1. data/CHANGELOG +77 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +490 -0
  4. data/Rakefile +43 -0
  5. data/app/controllers/authorization_rules_controller.rb +235 -0
  6. data/app/controllers/authorization_usages_controller.rb +23 -0
  7. data/app/helpers/authorization_rules_helper.rb +183 -0
  8. data/app/views/authorization_rules/_change.erb +49 -0
  9. data/app/views/authorization_rules/_show_graph.erb +37 -0
  10. data/app/views/authorization_rules/_suggestion.erb +9 -0
  11. data/app/views/authorization_rules/_suggestions.erb +24 -0
  12. data/app/views/authorization_rules/change.html.erb +124 -0
  13. data/app/views/authorization_rules/graph.dot.erb +68 -0
  14. data/app/views/authorization_rules/graph.html.erb +40 -0
  15. data/app/views/authorization_rules/index.html.erb +17 -0
  16. data/app/views/authorization_usages/index.html.erb +36 -0
  17. data/authorization_rules.dist.rb +20 -0
  18. data/config/routes.rb +7 -0
  19. data/garlic_example.rb +20 -0
  20. data/init.rb +5 -0
  21. data/lib/declarative_authorization.rb +15 -0
  22. data/lib/declarative_authorization/authorization.rb +630 -0
  23. data/lib/declarative_authorization/development_support/analyzer.rb +252 -0
  24. data/lib/declarative_authorization/development_support/change_analyzer.rb +253 -0
  25. data/lib/declarative_authorization/development_support/change_supporter.rb +578 -0
  26. data/lib/declarative_authorization/development_support/development_support.rb +243 -0
  27. data/lib/declarative_authorization/helper.rb +60 -0
  28. data/lib/declarative_authorization/in_controller.rb +367 -0
  29. data/lib/declarative_authorization/in_model.rb +150 -0
  30. data/lib/declarative_authorization/maintenance.rb +188 -0
  31. data/lib/declarative_authorization/obligation_scope.rb +297 -0
  32. data/lib/declarative_authorization/rails_legacy.rb +14 -0
  33. data/lib/declarative_authorization/reader.rb +438 -0
  34. data/test/authorization_test.rb +823 -0
  35. data/test/controller_test.rb +418 -0
  36. data/test/dsl_reader_test.rb +157 -0
  37. data/test/helper_test.rb +154 -0
  38. data/test/maintenance_test.rb +41 -0
  39. data/test/model_test.rb +1171 -0
  40. data/test/schema.sql +53 -0
  41. data/test/test_helper.rb +103 -0
  42. metadata +104 -0
@@ -0,0 +1,823 @@
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_obligations_with_permissions_and_anded_conditions
196
+ reader = Authorization::Reader::DSLReader.new
197
+ reader.parse %{
198
+ authorization do
199
+ role :test_role do
200
+ has_permission_on :permission_children, :to => :test, :join_by => :and do
201
+ if_permitted_to :test, :permission
202
+ if_attribute :test_attr => 1
203
+ end
204
+ has_permission_on :permissions, :to => :test do
205
+ if_attribute :test_attr => 1
206
+ end
207
+ end
208
+ end
209
+ }
210
+ engine = Authorization::Engine.new(reader)
211
+
212
+ assert_equal [{:test_attr => [:is, 1], :permission => {:test_attr => [:is, 1]}}],
213
+ engine.obligations(:test, :context => :permission_children,
214
+ :user => MockUser.new(:test_role))
215
+ end
216
+
217
+ def test_guest_user
218
+ reader = Authorization::Reader::DSLReader.new
219
+ reader.parse %{
220
+ authorization do
221
+ role :guest do
222
+ has_permission_on :permissions, :to => :test
223
+ end
224
+ end
225
+ }
226
+ engine = Authorization::Engine.new(reader)
227
+ assert engine.permit?(:test, :context => :permissions)
228
+ assert !engine.permit?(:test, :context => :permissions_2)
229
+ end
230
+
231
+ def test_invalid_user_model
232
+ reader = Authorization::Reader::DSLReader.new
233
+ reader.parse %{
234
+ authorization do
235
+ role :guest do
236
+ has_permission_on :permissions, :to => :test
237
+ end
238
+ end
239
+ }
240
+ engine = Authorization::Engine.new(reader)
241
+ assert_raise(Authorization::AuthorizationUsageError) do
242
+ engine.permit?(:test, :context => :permissions, :user => MockUser.new(1, 2))
243
+ end
244
+ assert_raise(Authorization::AuthorizationUsageError) do
245
+ engine.permit?(:test, :context => :permissions, :user => MockDataObject.new)
246
+ end
247
+ end
248
+
249
+ def test_role_hierarchy
250
+ reader = Authorization::Reader::DSLReader.new
251
+ reader.parse %{
252
+ authorization do
253
+ role :test_role do
254
+ includes :lower_role
255
+ has_permission_on :permissions, :to => :test
256
+ end
257
+ role :lower_role do
258
+ has_permission_on :permissions, :to => :lower
259
+ end
260
+ end
261
+ }
262
+ engine = Authorization::Engine.new(reader)
263
+ assert engine.permit?(:lower, :context => :permissions,
264
+ :user => MockUser.new(:test_role))
265
+ end
266
+
267
+ def test_role_hierarchy_infinity
268
+ reader = Authorization::Reader::DSLReader.new
269
+ reader.parse %{
270
+ authorization do
271
+ role :test_role do
272
+ includes :lower_role
273
+ has_permission_on :permissions, :to => :test
274
+ end
275
+ role :lower_role do
276
+ includes :higher_role
277
+ has_permission_on :permissions, :to => :lower
278
+ end
279
+ end
280
+ }
281
+ engine = Authorization::Engine.new(reader)
282
+ assert engine.permit?(:lower, :context => :permissions,
283
+ :user => MockUser.new(:test_role))
284
+ end
285
+
286
+ def test_privilege_hierarchy
287
+ reader = Authorization::Reader::DSLReader.new
288
+ reader.parse %{
289
+ privileges do
290
+ privilege :test, :permissions do
291
+ includes :lower
292
+ end
293
+ end
294
+ authorization do
295
+ role :test_role do
296
+ has_permission_on :permissions, :to => :test
297
+ end
298
+ end
299
+ }
300
+ engine = Authorization::Engine.new(reader)
301
+ assert engine.permit?(:lower, :context => :permissions,
302
+ :user => MockUser.new(:test_role))
303
+ end
304
+
305
+ def test_privilege_hierarchy_without_context
306
+ reader = Authorization::Reader::DSLReader.new
307
+ reader.parse %{
308
+ privileges do
309
+ privilege :read do
310
+ includes :list, :show
311
+ end
312
+ end
313
+ authorization do
314
+ role :test_role do
315
+ has_permission_on :permissions, :to => :read
316
+ end
317
+ end
318
+ }
319
+ engine = Authorization::Engine.new(reader)
320
+ assert engine.permit?(:list, :context => :permissions,
321
+ :user => MockUser.new(:test_role))
322
+ end
323
+
324
+ def test_attribute_is
325
+ reader = Authorization::Reader::DSLReader.new
326
+ reader.parse %|
327
+ authorization do
328
+ role :test_role do
329
+ has_permission_on :permissions, :to => :test do
330
+ if_attribute :test_attr => is { user.test_attr }
331
+ if_attribute :test_attr => 3
332
+ end
333
+ end
334
+ end
335
+ |
336
+ engine = Authorization::Engine.new(reader)
337
+ assert engine.permit?(:test, :context => :permissions,
338
+ :user => MockUser.new(:test_role, :test_attr => 1),
339
+ :object => MockDataObject.new(:test_attr => 1))
340
+ assert engine.permit?(:test, :context => :permissions,
341
+ :user => MockUser.new(:test_role, :test_attr => 2),
342
+ :object => MockDataObject.new(:test_attr => 3))
343
+ assert((not(engine.permit?(:test, :context => :permissions,
344
+ :user => MockUser.new(:test_role, :test_attr => 2),
345
+ :object => MockDataObject.new(:test_attr => 1)))))
346
+ end
347
+
348
+ def test_attribute_is_not
349
+ reader = Authorization::Reader::DSLReader.new
350
+ reader.parse %|
351
+ authorization do
352
+ role :test_role do
353
+ has_permission_on :permissions, :to => :test do
354
+ if_attribute :test_attr => is_not { user.test_attr }
355
+ end
356
+ end
357
+ end
358
+ |
359
+ engine = Authorization::Engine.new(reader)
360
+ assert !engine.permit?(:test, :context => :permissions,
361
+ :user => MockUser.new(:test_role, :test_attr => 1),
362
+ :object => MockDataObject.new(:test_attr => 1))
363
+ assert engine.permit?(:test, :context => :permissions,
364
+ :user => MockUser.new(:test_role, :test_attr => 2),
365
+ :object => MockDataObject.new(:test_attr => 1))
366
+ end
367
+
368
+ def test_attribute_contains
369
+ reader = Authorization::Reader::DSLReader.new
370
+ reader.parse %|
371
+ authorization do
372
+ role :test_role do
373
+ has_permission_on :permissions, :to => :test do
374
+ if_attribute :test_attr => contains { user.test_attr }
375
+ end
376
+ end
377
+ end
378
+ |
379
+ engine = Authorization::Engine.new(reader)
380
+ assert engine.permit?(:test, :context => :permissions,
381
+ :user => MockUser.new(:test_role, :test_attr => 1),
382
+ :object => MockDataObject.new(:test_attr => [1,2]))
383
+ assert !engine.permit?(:test, :context => :permissions,
384
+ :user => MockUser.new(:test_role, :test_attr => 3),
385
+ :object => MockDataObject.new(:test_attr => [1,2]))
386
+ end
387
+
388
+ def test_attribute_does_not_contain
389
+ reader = Authorization::Reader::DSLReader.new
390
+ reader.parse %|
391
+ authorization do
392
+ role :test_role do
393
+ has_permission_on :permissions, :to => :test do
394
+ if_attribute :test_attr => does_not_contain { user.test_attr }
395
+ end
396
+ end
397
+ end
398
+ |
399
+ engine = Authorization::Engine.new(reader)
400
+ assert !engine.permit?(:test, :context => :permissions,
401
+ :user => MockUser.new(:test_role, :test_attr => 1),
402
+ :object => MockDataObject.new(:test_attr => [1,2]))
403
+ assert engine.permit?(:test, :context => :permissions,
404
+ :user => MockUser.new(:test_role, :test_attr => 3),
405
+ :object => MockDataObject.new(:test_attr => [1,2]))
406
+ end
407
+
408
+ def test_attribute_in_array
409
+ reader = Authorization::Reader::DSLReader.new
410
+ reader.parse %|
411
+ authorization do
412
+ role :test_role do
413
+ has_permission_on :permissions, :to => :test do
414
+ if_attribute :test_attr => is_in { [1,2] }
415
+ if_attribute :test_attr => [2,3]
416
+ end
417
+ end
418
+ end
419
+ |
420
+ engine = Authorization::Engine.new(reader)
421
+ assert engine.permit?(:test, :context => :permissions,
422
+ :user => MockUser.new(:test_role),
423
+ :object => MockDataObject.new(:test_attr => 1))
424
+ assert engine.permit?(:test, :context => :permissions,
425
+ :user => MockUser.new(:test_role),
426
+ :object => MockDataObject.new(:test_attr => 3))
427
+ assert !engine.permit?(:test, :context => :permissions,
428
+ :user => MockUser.new(:test_role),
429
+ :object => MockDataObject.new(:test_attr => 4))
430
+ end
431
+
432
+ def test_attribute_not_in_array
433
+ reader = Authorization::Reader::DSLReader.new
434
+ reader.parse %|
435
+ authorization do
436
+ role :test_role do
437
+ has_permission_on :permissions, :to => :test do
438
+ if_attribute :test_attr => is_not_in { [1,2] }
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),
446
+ :object => MockDataObject.new(:test_attr => 1))
447
+ assert engine.permit?(:test, :context => :permissions,
448
+ :user => MockUser.new(:test_role),
449
+ :object => MockDataObject.new(:test_attr => 4))
450
+ end
451
+
452
+ def test_attribute_intersects_with
453
+ reader = Authorization::Reader::DSLReader.new
454
+ reader.parse %{
455
+ authorization do
456
+ role :test_role do
457
+ has_permission_on :permissions, :to => :test do
458
+ if_attribute :test_attrs => intersects_with { [1,2] }
459
+ end
460
+ end
461
+ role :test_role_2 do
462
+ has_permission_on :permissions, :to => :test do
463
+ if_attribute :test_attrs => intersects_with { 1 }
464
+ end
465
+ end
466
+ end
467
+ }
468
+
469
+ engine = Authorization::Engine.new(reader)
470
+ assert_raise Authorization::AuthorizationUsageError do
471
+ engine.permit?(:test, :context => :permissions,
472
+ :user => MockUser.new(:test_role),
473
+ :object => MockDataObject.new(:test_attrs => 1 ))
474
+ end
475
+ assert_raise Authorization::AuthorizationUsageError do
476
+ engine.permit?(:test, :context => :permissions,
477
+ :user => MockUser.new(:test_role_2),
478
+ :object => MockDataObject.new(:test_attrs => [1, 2] ))
479
+ end
480
+ assert engine.permit?(:test, :context => :permissions,
481
+ :user => MockUser.new(:test_role),
482
+ :object => MockDataObject.new(:test_attrs => [1,3] ))
483
+ assert !engine.permit?(:test, :context => :permissions,
484
+ :user => MockUser.new(:test_role),
485
+ :object => MockDataObject.new(:test_attrs => [3,4] ))
486
+ end
487
+
488
+ def test_attribute_deep
489
+ reader = Authorization::Reader::DSLReader.new
490
+ reader.parse %|
491
+ authorization do
492
+ role :test_role do
493
+ has_permission_on :permissions, :to => :test do
494
+ if_attribute :test_attr_1 => {:test_attr_2 => contains { 1 }}
495
+ end
496
+ end
497
+ end
498
+ |
499
+ engine = Authorization::Engine.new(reader)
500
+ attr_1_struct = Struct.new(:test_attr_2)
501
+ assert engine.permit?(:test, :context => :permissions,
502
+ :user => MockUser.new(:test_role),
503
+ :object => MockDataObject.new(:test_attr_1 => attr_1_struct.new([1,2])))
504
+ assert !engine.permit?(:test, :context => :permissions,
505
+ :user => MockUser.new(:test_role),
506
+ :object => MockDataObject.new(:test_attr_1 => attr_1_struct.new([3,4])))
507
+ assert_equal [{:test_attr_1 => {:test_attr_2 => [:contains, 1]}}],
508
+ engine.obligations(:test, :context => :permissions,
509
+ :user => MockUser.new(:test_role))
510
+ end
511
+
512
+ def test_attribute_non_block
513
+ reader = Authorization::Reader::DSLReader.new
514
+ reader.parse %|
515
+ authorization do
516
+ role :test_role do
517
+ has_permission_on :permissions, :to => :test do
518
+ if_attribute :test_attr => 1
519
+ end
520
+ end
521
+ end
522
+ |
523
+ engine = Authorization::Engine.new(reader)
524
+ assert engine.permit?(:test, :context => :permissions,
525
+ :user => MockUser.new(:test_role),
526
+ :object => MockDataObject.new(:test_attr => 1))
527
+ assert !engine.permit?(:test, :context => :permissions,
528
+ :user => MockUser.new(:test_role),
529
+ :object => MockDataObject.new(:test_attr => 2))
530
+ end
531
+
532
+ def test_attribute_multiple
533
+ reader = Authorization::Reader::DSLReader.new
534
+ reader.parse %{
535
+ authorization do
536
+ role :test_role do
537
+ has_permission_on :permissions, :to => :test do
538
+ if_attribute :test_attr => 1
539
+ if_attribute :test_attr => 2 # or
540
+ end
541
+ end
542
+ end
543
+ }
544
+ engine = Authorization::Engine.new(reader)
545
+ assert engine.permit?(:test, :context => :permissions,
546
+ :user => MockUser.new(:test_role),
547
+ :object => MockDataObject.new(:test_attr => 1))
548
+ assert engine.permit?(:test, :context => :permissions,
549
+ :user => MockUser.new(:test_role),
550
+ :object => MockDataObject.new(:test_attr => 2))
551
+ end
552
+
553
+ class PermissionMock < MockDataObject
554
+ def self.table_name
555
+ "permissions"
556
+ end
557
+ end
558
+ def test_attribute_with_permissions
559
+ reader = Authorization::Reader::DSLReader.new
560
+ reader.parse %{
561
+ authorization do
562
+ role :test_role do
563
+ has_permission_on :permissions, :to => :test do
564
+ if_attribute :test_attr => 1
565
+ end
566
+ has_permission_on :permission_children, :to => :test do
567
+ if_permitted_to :test, :permission
568
+ end
569
+ end
570
+ end
571
+ }
572
+ engine = Authorization::Engine.new(reader)
573
+
574
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
575
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
576
+ assert engine.permit?(:test, :context => :permission_children,
577
+ :user => MockUser.new(:test_role),
578
+ :object => MockDataObject.new(:permission => perm_data_attr_1))
579
+ assert !engine.permit?(:test, :context => :permission_children,
580
+ :user => MockUser.new(:test_role),
581
+ :object => MockDataObject.new(:permission => perm_data_attr_2))
582
+ end
583
+
584
+ def test_attribute_with_deep_permissions
585
+ reader = Authorization::Reader::DSLReader.new
586
+ reader.parse %{
587
+ authorization do
588
+ role :test_role do
589
+ has_permission_on :permissions, :to => :test do
590
+ if_attribute :test_attr => 1
591
+ end
592
+ has_permission_on :permission_children, :to => :test do
593
+ if_permitted_to :test, :shallow_permission => :permission
594
+ end
595
+ end
596
+ end
597
+ }
598
+ engine = Authorization::Engine.new(reader)
599
+
600
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
601
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
602
+ assert engine.permit?(:test, :context => :permission_children,
603
+ :user => MockUser.new(:test_role),
604
+ :object => MockDataObject.new(:shallow_permission =>
605
+ MockDataObject.new(:permission => perm_data_attr_1)))
606
+ assert !engine.permit?(:test, :context => :permission_children,
607
+ :user => MockUser.new(:test_role),
608
+ :object => MockDataObject.new(:shallow_permission =>
609
+ MockDataObject.new(:permission => perm_data_attr_2)))
610
+ end
611
+
612
+ def test_attribute_with_permissions_nil
613
+ reader = Authorization::Reader::DSLReader.new
614
+ reader.parse %{
615
+ authorization do
616
+ role :test_role do
617
+ has_permission_on :permissions, :to => :test do
618
+ if_attribute :test_attr => 1
619
+ end
620
+ has_permission_on :permission_children, :to => :test do
621
+ if_permitted_to :test, :permission
622
+ end
623
+ end
624
+ end
625
+ }
626
+ engine = Authorization::Engine.new(reader)
627
+
628
+ assert_nothing_raised do
629
+ engine.permit?(:test, :context => :permission_children,
630
+ :user => MockUser.new(:test_role),
631
+ :object => MockDataObject.new(:permission => nil))
632
+ end
633
+
634
+ assert !engine.permit?(:test, :context => :permission_children,
635
+ :user => MockUser.new(:test_role),
636
+ :object => MockDataObject.new(:permission => nil))
637
+ end
638
+
639
+ def test_attribute_with_permissions_on_self
640
+ reader = Authorization::Reader::DSLReader.new
641
+ reader.parse %{
642
+ authorization do
643
+ role :test_role do
644
+ has_permission_on :permissions, :to => :test do
645
+ if_attribute :test_attr => 1
646
+ end
647
+ has_permission_on :permissions, :to => :another_test do
648
+ if_permitted_to :test
649
+ end
650
+ end
651
+ end
652
+ }
653
+ engine = Authorization::Engine.new(reader)
654
+
655
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
656
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
657
+ assert engine.permit?(:another_test, :context => :permissions,
658
+ :user => MockUser.new(:test_role),
659
+ :object => perm_data_attr_1)
660
+ assert !engine.permit?(:another_test, :context => :permissions,
661
+ :user => MockUser.new(:test_role),
662
+ :object => perm_data_attr_2)
663
+ end
664
+
665
+ def test_attribute_with_permissions_on_self_with_context
666
+ reader = Authorization::Reader::DSLReader.new
667
+ reader.parse %{
668
+ authorization do
669
+ role :test_role do
670
+ has_permission_on :permissions, :to => :test do
671
+ if_attribute :test_attr => 1
672
+ end
673
+ has_permission_on :permissions, :to => :another_test do
674
+ if_permitted_to :test, :context => :permissions
675
+ end
676
+ end
677
+ end
678
+ }
679
+ engine = Authorization::Engine.new(reader)
680
+
681
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
682
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
683
+ assert engine.permit?(:another_test, :context => :permissions,
684
+ :user => MockUser.new(:test_role),
685
+ :object => perm_data_attr_1)
686
+ assert !engine.permit?(:another_test, :context => :permissions,
687
+ :user => MockUser.new(:test_role),
688
+ :object => perm_data_attr_2)
689
+ end
690
+
691
+ def test_attribute_with_permissions_and_anded_rules
692
+ reader = Authorization::Reader::DSLReader.new
693
+ reader.parse %{
694
+ authorization do
695
+ role :test_role do
696
+ has_permission_on :permissions, :to => :test do
697
+ if_attribute :test_attr => 1
698
+ end
699
+ has_permission_on :permission_children, :to => :test, :join_by => :and do
700
+ if_permitted_to :test, :permission
701
+ if_attribute :test_attr => 1
702
+ end
703
+ end
704
+ end
705
+ }
706
+ engine = Authorization::Engine.new(reader)
707
+
708
+ perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
709
+ perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
710
+ assert engine.permit?(:test, :context => :permission_children,
711
+ :user => MockUser.new(:test_role),
712
+ :object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 1))
713
+ assert !engine.permit?(:test, :context => :permission_children,
714
+ :user => MockUser.new(:test_role),
715
+ :object => MockDataObject.new(:permission => perm_data_attr_2, :test_attr => 1))
716
+ assert !engine.permit?(:test, :context => :permission_children,
717
+ :user => MockUser.new(:test_role),
718
+ :object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 2))
719
+ end
720
+
721
+ def test_attribute_with_anded_rules
722
+ reader = Authorization::Reader::DSLReader.new
723
+ reader.parse %{
724
+ authorization do
725
+ role :test_role do
726
+ has_permission_on :permissions, :to => :test, :join_by => :and do
727
+ if_attribute :test_attr => 1
728
+ if_attribute :test_attr_2 => 2
729
+ end
730
+ end
731
+ end
732
+ }
733
+ engine = Authorization::Engine.new(reader)
734
+
735
+ assert engine.permit?(:test, :context => :permissions,
736
+ :user => MockUser.new(:test_role),
737
+ :object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 2))
738
+ assert !engine.permit?(:test, :context => :permissions,
739
+ :user => MockUser.new(:test_role),
740
+ :object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 3))
741
+ end
742
+
743
+ def test_raise_on_if_attribute_hash_on_collection
744
+ reader = Authorization::Reader::DSLReader.new
745
+ reader.parse %{
746
+ authorization do
747
+ role :test_role do
748
+ has_permission_on :permissions, :to => :test do
749
+ if_attribute :test_attrs => {:attr => is {1}}
750
+ end
751
+ end
752
+ end
753
+ }
754
+ engine = Authorization::Engine.new(reader)
755
+ assert_raise Authorization::AuthorizationUsageError do
756
+ engine.permit?(:test, :context => :permissions,
757
+ :user => MockUser.new(:test_role),
758
+ :object => MockDataObject.new(:test_attrs => [1, 2, 3]))
759
+ end
760
+ end
761
+
762
+ def test_role_title_description
763
+ reader = Authorization::Reader::DSLReader.new
764
+ reader.parse %{
765
+ authorization do
766
+ role :test_role, :title => 'Test Role' do
767
+ description "Test Role Description"
768
+ end
769
+ end
770
+ }
771
+ engine = Authorization::Engine.new(reader)
772
+ assert engine.roles.include?(:test_role)
773
+ assert_equal "Test Role", engine.role_titles[:test_role]
774
+ assert_equal "Test Role", engine.title_for(:test_role)
775
+ assert_nil engine.title_for(:test_role_2)
776
+ assert_equal "Test Role Description", engine.role_descriptions[:test_role]
777
+ assert_equal "Test Role Description", engine.description_for(:test_role)
778
+ assert_nil engine.description_for(:test_role_2)
779
+ end
780
+
781
+ def test_multithread
782
+ reader = Authorization::Reader::DSLReader.new
783
+ reader.parse %{
784
+ authorization do
785
+ role :test_role do
786
+ has_permission_on :permissions, :to => :test
787
+ end
788
+ end
789
+ }
790
+
791
+ engine = Authorization::Engine.new(reader)
792
+ Authorization.current_user = MockUser.new(:test_role)
793
+ assert engine.permit?(:test, :context => :permissions)
794
+ Thread.new do
795
+ Authorization.current_user = MockUser.new(:test_role2)
796
+ assert !engine.permit?(:test, :context => :permissions)
797
+ end
798
+ assert engine.permit?(:test, :context => :permissions)
799
+ Authorization.current_user = nil
800
+ end
801
+
802
+ def test_clone
803
+ reader = Authorization::Reader::DSLReader.new
804
+ reader.parse %{
805
+ authorization do
806
+ role :test_role do
807
+ has_permission_on :permissions, :to => :test do
808
+ if_attribute :attr => { :sub_attr => is { user } }
809
+ if_permitted_to :read, :attr_2 => :attr_3
810
+ if_permitted_to :read, :attr_2
811
+ end
812
+ end
813
+ end
814
+ }
815
+
816
+ engine = Authorization::Engine.new(reader)
817
+ cloned_engine = engine.clone
818
+ assert_not_equal engine.auth_rules[0].contexts.object_id,
819
+ cloned_engine.auth_rules[0].contexts.object_id
820
+ assert_not_equal engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id,
821
+ cloned_engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id
822
+ end
823
+ end