uhees-declarative_authorization 0.3.1

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 +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