declarative_authorization-dta 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/CHANGELOG +148 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +504 -0
  4. data/Rakefile +35 -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 +10 -0
  18. data/garlic_example.rb +20 -0
  19. data/init.rb +5 -0
  20. data/lib/declarative_authorization.rb +17 -0
  21. data/lib/declarative_authorization/authorization.rb +687 -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.new.rb +298 -0
  29. data/lib/declarative_authorization/in_model.rb +463 -0
  30. data/lib/declarative_authorization/maintenance.rb +212 -0
  31. data/lib/declarative_authorization/obligation_scope.rb +354 -0
  32. data/lib/declarative_authorization/rails_legacy.rb +22 -0
  33. data/lib/declarative_authorization/railsengine.rb +6 -0
  34. data/lib/declarative_authorization/reader.rb +521 -0
  35. data/lib/tasks/authorization_tasks.rake +82 -0
  36. data/test/authorization_test.rb +1065 -0
  37. data/test/controller_filter_resource_access_test.rb +511 -0
  38. data/test/controller_test.rb +465 -0
  39. data/test/dsl_reader_test.rb +178 -0
  40. data/test/helper_test.rb +172 -0
  41. data/test/maintenance_test.rb +46 -0
  42. data/test/model_test.rb +2216 -0
  43. data/test/schema.sql +62 -0
  44. data/test/test_helper.rb +152 -0
  45. metadata +108 -0
@@ -0,0 +1,511 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+
3
+ class BasicResource < MockDataObject
4
+ def self.name
5
+ "BasicResource"
6
+ end
7
+ end
8
+ class BasicResourcesController < MocksController
9
+ filter_resource_access
10
+ define_resource_actions
11
+ end
12
+ class BasicResourcesControllerTest < ActionController::TestCase
13
+ def test_basic_filter_index
14
+ reader = Authorization::Reader::DSLReader.new
15
+ reader.parse %{
16
+ authorization do
17
+ role :allowed_role do
18
+ has_permission_on :basic_resources, :to => :index do
19
+ if_attribute :id => is {"1"}
20
+ end
21
+ end
22
+ end
23
+ }
24
+
25
+ allowed_user = MockUser.new(:allowed_role)
26
+ request!(MockUser.new(:another_role), :index, reader)
27
+ assert !@controller.authorized?
28
+ request!(allowed_user, :index, reader)
29
+ assert @controller.authorized?
30
+ end
31
+
32
+ def test_basic_filter_show_with_id
33
+ reader = Authorization::Reader::DSLReader.new
34
+ reader.parse %{
35
+ authorization do
36
+ role :allowed_role do
37
+ has_permission_on :basic_resources, :to => :show do
38
+ if_attribute :id => is {"1"}
39
+ end
40
+ end
41
+ end
42
+ }
43
+
44
+ allowed_user = MockUser.new(:allowed_role)
45
+ request!(allowed_user, :show, reader, :id => "2")
46
+ assert !@controller.authorized?
47
+ request!(allowed_user, :show, reader, :id => "1", :clear => [:@basic_resource])
48
+ assert @controller.authorized?
49
+ end
50
+
51
+ def test_basic_filter_new_with_params
52
+ reader = Authorization::Reader::DSLReader.new
53
+ reader.parse %{
54
+ authorization do
55
+ role :allowed_role do
56
+ has_permission_on :basic_resources, :to => :new do
57
+ if_attribute :id => is {"1"}
58
+ end
59
+ end
60
+ end
61
+ }
62
+
63
+ allowed_user = MockUser.new(:allowed_role)
64
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "2"})
65
+ assert !@controller.authorized?
66
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "1"},
67
+ :clear => [:@basic_resource])
68
+ assert @controller.authorized?
69
+ end
70
+ end
71
+
72
+
73
+ class NestedResource < MockDataObject
74
+ def initialize (attributes = {})
75
+ if attributes[:id]
76
+ attributes[:parent_mock] ||= ParentMock.new(:id => attributes[:id])
77
+ end
78
+ super(attributes)
79
+ end
80
+ def self.name
81
+ "NestedResource"
82
+ end
83
+ end
84
+
85
+ class ShallowNestedResource < MockDataObject
86
+ def initialize (attributes = {})
87
+ if attributes[:id]
88
+ attributes[:parent_mock] ||= ParentMock.new(:id => attributes[:id])
89
+ end
90
+ super(attributes)
91
+ end
92
+ def self.name
93
+ "ShallowNestedResource"
94
+ end
95
+ end
96
+
97
+ class ParentMock < MockDataObject
98
+ def nested_resources
99
+ Class.new do
100
+ def initialize (parent_mock)
101
+ @parent_mock = parent_mock
102
+ end
103
+ def new (attributes = {})
104
+ NestedResource.new(attributes.merge(:parent_mock => @parent_mock))
105
+ end
106
+ end.new(self)
107
+ end
108
+
109
+ alias :shallow_nested_resources :nested_resources
110
+
111
+ def == (other)
112
+ id == other.id
113
+ end
114
+ def self.name
115
+ "ParentMock"
116
+ end
117
+ end
118
+
119
+ class NestedResourcesController < MocksController
120
+ filter_resource_access :nested_in => :parent_mocks
121
+ define_resource_actions
122
+ end
123
+ class NestedResourcesControllerTest < ActionController::TestCase
124
+ def test_nested_filter_index
125
+ reader = Authorization::Reader::DSLReader.new
126
+ reader.parse %{
127
+ authorization do
128
+ role :allowed_role do
129
+ has_permission_on :nested_resources, :to => :index do
130
+ if_attribute :parent_mock => is {ParentMock.find("1")}
131
+ end
132
+ end
133
+ end
134
+ }
135
+
136
+ allowed_user = MockUser.new(:allowed_role)
137
+ request!(MockUser.new(:another_role), :index, reader, :parent_mock_id => "2")
138
+ assert !@controller.authorized?
139
+ request!(allowed_user, :index, reader, :parent_mock_id => "2",
140
+ :clear => [:@nested_resource, :@parent_mock])
141
+ assert !@controller.authorized?
142
+ request!(allowed_user, :index, reader, :parent_mock_id => "1",
143
+ :clear => [:@nested_resource, :@parent_mock])
144
+ assert @controller.authorized?
145
+ end
146
+
147
+ def test_nested_filter_show_with_id
148
+ reader = Authorization::Reader::DSLReader.new
149
+ reader.parse %{
150
+ authorization do
151
+ role :allowed_role do
152
+ has_permission_on :nested_resources, :to => :show do
153
+ if_attribute :parent_mock => is {ParentMock.find("1")}
154
+ end
155
+ end
156
+ end
157
+ }
158
+
159
+ allowed_user = MockUser.new(:allowed_role)
160
+ request!(allowed_user, :show, reader, :id => "2", :parent_mock_id => "2")
161
+ assert !@controller.authorized?
162
+ request!(allowed_user, :show, reader, :id => "1", :parent_mock_id => "1",
163
+ :clear => [:@nested_resource, :@parent_mock])
164
+ assert @controller.authorized?
165
+ end
166
+
167
+ def test_nested_filter_new_with_params
168
+ reader = Authorization::Reader::DSLReader.new
169
+ reader.parse %{
170
+ authorization do
171
+ role :allowed_role do
172
+ has_permission_on :nested_resources, :to => :new do
173
+ if_attribute :parent_mock => is {ParentMock.find("1")}
174
+ end
175
+ end
176
+ end
177
+ }
178
+
179
+ allowed_user = MockUser.new(:allowed_role)
180
+ request!(allowed_user, :new, reader, :parent_mock_id => "2",
181
+ :nested_resource => {:id => "2"})
182
+ assert !@controller.authorized?
183
+ request!(allowed_user, :new, reader, :parent_mock_id => "1",
184
+ :nested_resource => {:id => "1"},
185
+ :clear => [:@nested_resource, :@parent_mock])
186
+ assert @controller.authorized?
187
+ end
188
+ end
189
+
190
+ class ShallowNestedResourcesController < MocksController
191
+ filter_resource_access :nested_in => :parent_mocks,
192
+ :shallow => true,
193
+ :additional_member => :additional_member_action
194
+ define_resource_actions
195
+ define_action_methods :additional_member_action
196
+ end
197
+ class ShallowNestedResourcesControllerTest < ActionController::TestCase
198
+ def test_nested_filter_index
199
+ reader = Authorization::Reader::DSLReader.new
200
+ reader.parse %{
201
+ authorization do
202
+ role :allowed_role do
203
+ has_permission_on :shallow_nested_resources, :to => :index do
204
+ if_attribute :parent_mock => is {ParentMock.find("1")}
205
+ end
206
+ end
207
+ end
208
+ }
209
+
210
+ allowed_user = MockUser.new(:allowed_role)
211
+ request!(MockUser.new(:another_role), :index, reader, :parent_mock_id => "2")
212
+ assert !@controller.authorized?
213
+ request!(allowed_user, :index, reader, :parent_mock_id => "2",
214
+ :clear => [:@shallow_nested_resource, :@parent_mock])
215
+ assert !@controller.authorized?
216
+ request!(allowed_user, :index, reader, :parent_mock_id => "1",
217
+ :clear => [:@shallow_nested_resource, :@parent_mock])
218
+ assert assigns(:parent_mock)
219
+ assert @controller.authorized?
220
+ end
221
+
222
+ def test_nested_filter_show_with_id
223
+ reader = Authorization::Reader::DSLReader.new
224
+ reader.parse %{
225
+ authorization do
226
+ role :allowed_role do
227
+ has_permission_on :shallow_nested_resources, :to => :show do
228
+ if_attribute :parent_mock => is {ParentMock.find("1")}
229
+ end
230
+ end
231
+ end
232
+ }
233
+
234
+ allowed_user = MockUser.new(:allowed_role)
235
+ request!(allowed_user, :show, reader, :id => "2", :parent_mock_id => "2")
236
+ assert !@controller.authorized?
237
+ request!(allowed_user, :show, reader, :id => "1",
238
+ :clear => [:@shallow_nested_resource, :@parent_mock])
239
+ assert !assigns(:parent_mock)
240
+ assert assigns(:shallow_nested_resource)
241
+ assert @controller.authorized?
242
+ end
243
+
244
+ def test_nested_filter_new_with_params
245
+ reader = Authorization::Reader::DSLReader.new
246
+ reader.parse %{
247
+ authorization do
248
+ role :allowed_role do
249
+ has_permission_on :shallow_nested_resources, :to => :new do
250
+ if_attribute :parent_mock => is {ParentMock.find("1")}
251
+ end
252
+ end
253
+ end
254
+ }
255
+
256
+ allowed_user = MockUser.new(:allowed_role)
257
+ request!(allowed_user, :new, reader, :parent_mock_id => "2",
258
+ :shallow_nested_resource => {:id => "2"})
259
+ assert !@controller.authorized?
260
+ request!(allowed_user, :new, reader, :parent_mock_id => "1",
261
+ :shallow_nested_resource => {:id => "1"},
262
+ :clear => [:@shallow_nested_resource, :@parent_mock])
263
+ assert assigns(:parent_mock)
264
+ assert assigns(:shallow_nested_resource)
265
+ assert @controller.authorized?
266
+ end
267
+
268
+ def test_nested_filter_additional_member_action_with_id
269
+ reader = Authorization::Reader::DSLReader.new
270
+ reader.parse %{
271
+ authorization do
272
+ role :allowed_role do
273
+ has_permission_on :shallow_nested_resources, :to => :additional_member_action do
274
+ if_attribute :parent_mock => is {ParentMock.find("1")}
275
+ end
276
+ end
277
+ end
278
+ }
279
+
280
+ allowed_user = MockUser.new(:allowed_role)
281
+ request!(allowed_user, :additional_member_action, reader, :id => "2", :parent_mock_id => "2")
282
+ assert !@controller.authorized?
283
+ request!(allowed_user, :additional_member_action, reader, :id => "1",
284
+ :clear => [:@shallow_nested_resource, :@parent_mock])
285
+ assert !assigns(:parent_mock)
286
+ assert assigns(:shallow_nested_resource)
287
+ assert @controller.authorized?
288
+ end
289
+ end
290
+
291
+
292
+ class CustomMembersCollectionsResourceController < MocksController
293
+ def self.controller_name
294
+ "basic_resources"
295
+ end
296
+ filter_resource_access :member => [[:other_show, :read]],
297
+ :collection => {:search => :read}, :new => [:other_new]
298
+ define_action_methods :other_new, :search, :other_show
299
+ end
300
+ class CustomMembersCollectionsResourceControllerTest < ActionController::TestCase
301
+ def test_custom_members_filter_search
302
+ reader = Authorization::Reader::DSLReader.new
303
+ reader.parse %{
304
+ authorization do
305
+ role :allowed_role do
306
+ has_permission_on :basic_resources, :to => :read do
307
+ if_attribute :id => is {"1"}
308
+ end
309
+ end
310
+ end
311
+ }
312
+
313
+ request!(MockUser.new(:another_role), :search, reader)
314
+ assert !@controller.authorized?
315
+ request!(MockUser.new(:allowed_role), :search, reader)
316
+ assert @controller.authorized?
317
+ end
318
+
319
+ def test_custom_members_filter_other_show
320
+ reader = Authorization::Reader::DSLReader.new
321
+ reader.parse %{
322
+ authorization do
323
+ role :allowed_role do
324
+ has_permission_on :basic_resources, :to => :read do
325
+ if_attribute :id => is {"1"}
326
+ end
327
+ end
328
+ end
329
+ }
330
+
331
+ allowed_user = MockUser.new(:allowed_role)
332
+ request!(allowed_user, :other_show, reader, :id => "2")
333
+ assert !@controller.authorized?
334
+ request!(allowed_user, :other_show, reader, :id => "1", :clear => [:@basic_resource])
335
+ assert @controller.authorized?
336
+ end
337
+
338
+ def test_custom_members_filter_other_new
339
+ reader = Authorization::Reader::DSLReader.new
340
+ reader.parse %{
341
+ authorization do
342
+ role :allowed_role do
343
+ has_permission_on :basic_resources, :to => :other_new do
344
+ if_attribute :id => is {"1"}
345
+ end
346
+ end
347
+ end
348
+ }
349
+
350
+ allowed_user = MockUser.new(:allowed_role)
351
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "2"})
352
+ assert !@controller.authorized?
353
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "1"},
354
+ :clear => [:@basic_resource])
355
+ assert @controller.authorized?
356
+ end
357
+ end
358
+
359
+
360
+ class AdditionalMembersCollectionsResourceController < MocksController
361
+ def self.controller_name
362
+ "basic_resources"
363
+ end
364
+ filter_resource_access :additional_member => :other_show,
365
+ :additional_collection => [:search], :additional_new => {:other_new => :new}
366
+ define_resource_actions
367
+ define_action_methods :other_new, :search, :other_show
368
+ end
369
+ class AdditionalMembersCollectionsResourceControllerTest < ActionController::TestCase
370
+ def test_additional_members_filter_search_index
371
+ reader = Authorization::Reader::DSLReader.new
372
+ reader.parse %{
373
+ authorization do
374
+ role :allowed_role do
375
+ has_permission_on :basic_resources, :to => [:search, :index] do
376
+ if_attribute :id => is {"1"}
377
+ end
378
+ end
379
+ end
380
+ }
381
+
382
+ request!(MockUser.new(:another_role), :search, reader)
383
+ assert !@controller.authorized?
384
+ request!(MockUser.new(:another_role), :index, reader)
385
+ assert !@controller.authorized?
386
+ request!(MockUser.new(:allowed_role), :search, reader)
387
+ assert @controller.authorized?
388
+ request!(MockUser.new(:allowed_role), :index, reader)
389
+ assert @controller.authorized?
390
+ end
391
+
392
+ def test_additional_members_filter_other_show
393
+ reader = Authorization::Reader::DSLReader.new
394
+ reader.parse %{
395
+ authorization do
396
+ role :allowed_role do
397
+ has_permission_on :basic_resources, :to => [:show, :other_show] do
398
+ if_attribute :id => is {"1"}
399
+ end
400
+ end
401
+ end
402
+ }
403
+
404
+ allowed_user = MockUser.new(:allowed_role)
405
+ request!(allowed_user, :other_show, reader, :id => "2")
406
+ assert !@controller.authorized?
407
+ request!(allowed_user, :show, reader, :id => "2", :clear => [:@basic_resource])
408
+ assert !@controller.authorized?
409
+ request!(allowed_user, :other_show, reader, :id => "1", :clear => [:@basic_resource])
410
+ assert @controller.authorized?
411
+ request!(allowed_user, :show, reader, :id => "1", :clear => [:@basic_resource])
412
+ assert @controller.authorized?
413
+ end
414
+
415
+ def test_additional_members_filter_other_new
416
+ reader = Authorization::Reader::DSLReader.new
417
+ reader.parse %{
418
+ authorization do
419
+ role :allowed_role do
420
+ has_permission_on :basic_resources, :to => :new do
421
+ if_attribute :id => is {"1"}
422
+ end
423
+ end
424
+ end
425
+ }
426
+
427
+ allowed_user = MockUser.new(:allowed_role)
428
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "2"})
429
+ assert !@controller.authorized?
430
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "2"},
431
+ :clear => [:@basic_resource])
432
+ assert !@controller.authorized?
433
+
434
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "1"},
435
+ :clear => [:@basic_resource])
436
+ assert @controller.authorized?
437
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "1"},
438
+ :clear => [:@basic_resource])
439
+ assert @controller.authorized?
440
+ end
441
+ end
442
+
443
+
444
+ class CustomMethodsResourceController < MocksController
445
+ # not implemented yet
446
+ end
447
+
448
+
449
+ class ExplicitContextResourceController < MocksController
450
+ filter_resource_access :context => :basic_resources
451
+ define_resource_actions
452
+ end
453
+ class ExplicitContextResourceControllerTest < ActionController::TestCase
454
+ def test_explicit_context_filter_index
455
+ reader = Authorization::Reader::DSLReader.new
456
+ reader.parse %{
457
+ authorization do
458
+ role :allowed_role do
459
+ has_permission_on :basic_resources, :to => :index do
460
+ if_attribute :id => is {"1"}
461
+ end
462
+ end
463
+ end
464
+ }
465
+
466
+ allowed_user = MockUser.new(:allowed_role)
467
+ request!(MockUser.new(:another_role), :index, reader)
468
+ assert !@controller.authorized?
469
+ request!(allowed_user, :index, reader)
470
+ assert @controller.authorized?
471
+ end
472
+
473
+ def test_explicit_context_filter_show_with_id
474
+ reader = Authorization::Reader::DSLReader.new
475
+ reader.parse %{
476
+ authorization do
477
+ role :allowed_role do
478
+ has_permission_on :basic_resources, :to => :show do
479
+ if_attribute :id => is {"1"}
480
+ end
481
+ end
482
+ end
483
+ }
484
+
485
+ allowed_user = MockUser.new(:allowed_role)
486
+ request!(allowed_user, :show, reader, :id => "2")
487
+ assert !@controller.authorized?
488
+ request!(allowed_user, :show, reader, :id => "1", :clear => [:@basic_resource])
489
+ assert @controller.authorized?
490
+ end
491
+
492
+ def test_explicit_context_filter_new_with_params
493
+ reader = Authorization::Reader::DSLReader.new
494
+ reader.parse %{
495
+ authorization do
496
+ role :allowed_role do
497
+ has_permission_on :basic_resources, :to => :new do
498
+ if_attribute :id => is {"1"}
499
+ end
500
+ end
501
+ end
502
+ }
503
+
504
+ allowed_user = MockUser.new(:allowed_role)
505
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "2"})
506
+ assert !@controller.authorized?
507
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "1"},
508
+ :clear => [:@basic_resource])
509
+ assert @controller.authorized?
510
+ end
511
+ end