timcharper-declarative_authorization 0.4.1.2

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