timcharper-declarative_authorization 0.4.1.2

Sign up to get free protection for your applications and to get access to all the features.
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