ghart-declarative_authorization 0.3.2.4
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.
- data/CHANGELOG +83 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +510 -0
- data/Rakefile +43 -0
- data/app/controllers/authorization_rules_controller.rb +259 -0
- data/app/controllers/authorization_usages_controller.rb +23 -0
- data/app/helpers/authorization_rules_helper.rb +187 -0
- data/app/views/authorization_rules/_change.erb +58 -0
- data/app/views/authorization_rules/_show_graph.erb +37 -0
- data/app/views/authorization_rules/_suggestions.erb +48 -0
- data/app/views/authorization_rules/change.html.erb +152 -0
- data/app/views/authorization_rules/graph.dot.erb +68 -0
- data/app/views/authorization_rules/graph.html.erb +40 -0
- data/app/views/authorization_rules/index.html.erb +17 -0
- data/app/views/authorization_usages/index.html.erb +36 -0
- data/authorization_rules.dist.rb +20 -0
- data/config/routes.rb +7 -0
- data/garlic_example.rb +20 -0
- data/init.rb +5 -0
- data/lib/declarative_authorization.rb +15 -0
- data/lib/declarative_authorization/authorization.rb +634 -0
- data/lib/declarative_authorization/development_support/analyzer.rb +252 -0
- data/lib/declarative_authorization/development_support/change_analyzer.rb +253 -0
- data/lib/declarative_authorization/development_support/change_supporter.rb +620 -0
- data/lib/declarative_authorization/development_support/development_support.rb +243 -0
- data/lib/declarative_authorization/helper.rb +60 -0
- data/lib/declarative_authorization/in_controller.rb +597 -0
- data/lib/declarative_authorization/in_model.rb +159 -0
- data/lib/declarative_authorization/maintenance.rb +182 -0
- data/lib/declarative_authorization/obligation_scope.rb +308 -0
- data/lib/declarative_authorization/rails_legacy.rb +14 -0
- data/lib/declarative_authorization/reader.rb +441 -0
- data/test/authorization_test.rb +827 -0
- data/test/controller_filter_resource_access_test.rb +394 -0
- data/test/controller_test.rb +386 -0
- data/test/dsl_reader_test.rb +157 -0
- data/test/helper_test.rb +171 -0
- data/test/maintenance_test.rb +46 -0
- data/test/model_test.rb +1308 -0
- data/test/schema.sql +54 -0
- data/test/test_helper.rb +118 -0
- metadata +106 -0
@@ -0,0 +1,827 @@
|
|
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
|
+
has_permission_on :permissions_4, :permissions_5, :to => :test
|
44
|
+
end
|
45
|
+
end
|
46
|
+
}
|
47
|
+
engine = Authorization::Engine.new(reader)
|
48
|
+
assert engine.permit?(:test, :context => :permissions,
|
49
|
+
:user => MockUser.new(:test_role))
|
50
|
+
assert engine.permit?(:test, :context => :permissions_2,
|
51
|
+
:user => MockUser.new(:test_role))
|
52
|
+
assert !engine.permit?(:test, :context => :permissions_3,
|
53
|
+
:user => MockUser.new(:test_role))
|
54
|
+
|
55
|
+
assert engine.permit?(:test, :context => :permissions_4, :user => MockUser.new(:test_role))
|
56
|
+
assert engine.permit?(:test, :context => :permissions_5, :user => MockUser.new(:test_role))
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_obligations_without_conditions
|
60
|
+
reader = Authorization::Reader::DSLReader.new
|
61
|
+
reader.parse %{
|
62
|
+
authorization do
|
63
|
+
role :test_role do
|
64
|
+
has_permission_on :permissions, :to => :test
|
65
|
+
end
|
66
|
+
end
|
67
|
+
}
|
68
|
+
engine = Authorization::Engine.new(reader)
|
69
|
+
assert_equal [{}], engine.obligations(:test, :context => :permissions,
|
70
|
+
:user => MockUser.new(:test_role))
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_obligations_with_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 do
|
79
|
+
if_attribute :attr => is { user.attr }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
}
|
84
|
+
engine = Authorization::Engine.new(reader)
|
85
|
+
assert_equal [{:attr => [:is, 1]}],
|
86
|
+
engine.obligations(:test, :context => :permissions,
|
87
|
+
:user => MockUser.new(:test_role, :attr => 1))
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_obligations_with_anded_conditions
|
91
|
+
reader = Authorization::Reader::DSLReader.new
|
92
|
+
reader.parse %{
|
93
|
+
authorization do
|
94
|
+
role :test_role do
|
95
|
+
has_permission_on :permissions, :to => :test, :join_by => :and do
|
96
|
+
if_attribute :attr => is { user.attr }
|
97
|
+
if_attribute :attr_2 => is { user.attr_2 }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
}
|
102
|
+
engine = Authorization::Engine.new(reader)
|
103
|
+
assert_equal [{:attr => [:is, 1], :attr_2 => [:is, 2]}],
|
104
|
+
engine.obligations(:test, :context => :permissions,
|
105
|
+
:user => MockUser.new(:test_role, :attr => 1, :attr_2 => 2))
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_obligations_with_deep_anded_conditions
|
109
|
+
reader = Authorization::Reader::DSLReader.new
|
110
|
+
reader.parse %{
|
111
|
+
authorization do
|
112
|
+
role :test_role do
|
113
|
+
has_permission_on :permissions, :to => :test, :join_by => :and do
|
114
|
+
if_attribute :attr => { :deeper_attr => is { user.deeper_attr }}
|
115
|
+
if_attribute :attr => { :deeper_attr_2 => is { user.deeper_attr_2 }}
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
}
|
120
|
+
engine = Authorization::Engine.new(reader)
|
121
|
+
assert_equal [{:attr => { :deeper_attr => [:is, 1], :deeper_attr_2 => [:is, 2] } }],
|
122
|
+
engine.obligations(:test, :context => :permissions,
|
123
|
+
:user => MockUser.new(:test_role, :deeper_attr => 1, :deeper_attr_2 => 2))
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_obligations_with_conditions_and_empty
|
127
|
+
reader = Authorization::Reader::DSLReader.new
|
128
|
+
reader.parse %{
|
129
|
+
authorization do
|
130
|
+
role :test_role do
|
131
|
+
has_permission_on :permissions, :to => :test
|
132
|
+
has_permission_on :permissions, :to => :test do
|
133
|
+
if_attribute :attr => is { user.attr }
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
}
|
138
|
+
engine = Authorization::Engine.new(reader)
|
139
|
+
assert_equal [{}, {:attr => [:is, 1]}],
|
140
|
+
engine.obligations(:test, :context => :permissions,
|
141
|
+
:user => MockUser.new(:test_role, :attr => 1))
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_obligations_with_permissions
|
145
|
+
reader = Authorization::Reader::DSLReader.new
|
146
|
+
reader.parse %{
|
147
|
+
authorization do
|
148
|
+
role :test_role do
|
149
|
+
has_permission_on :permissions, :to => :test do
|
150
|
+
if_attribute :attr => is { user.attr }
|
151
|
+
end
|
152
|
+
has_permission_on :permission_children, :to => :test do
|
153
|
+
if_permitted_to :test, :permission, :context => :permissions
|
154
|
+
end
|
155
|
+
has_permission_on :permission_children_2, :to => :test do
|
156
|
+
if_permitted_to :test, :permission
|
157
|
+
end
|
158
|
+
has_permission_on :permission_children_children, :to => :test do
|
159
|
+
if_permitted_to :test, :permission_child => :permission,
|
160
|
+
:context => :permissions
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
}
|
165
|
+
engine = Authorization::Engine.new(reader)
|
166
|
+
assert_equal [{:permission => {:attr => [:is, 1]}}],
|
167
|
+
engine.obligations(:test, :context => :permission_children,
|
168
|
+
:user => MockUser.new(:test_role, :attr => 1))
|
169
|
+
assert_equal [{:permission => {:attr => [:is, 1]}}],
|
170
|
+
engine.obligations(:test, :context => :permission_children_2,
|
171
|
+
:user => MockUser.new(:test_role, :attr => 1))
|
172
|
+
assert_equal [{:permission_child => {:permission => {:attr => [:is, 1]}}}],
|
173
|
+
engine.obligations(:test, :context => :permission_children_children,
|
174
|
+
:user => MockUser.new(:test_role, :attr => 1))
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_obligations_with_permissions_multiple
|
178
|
+
reader = Authorization::Reader::DSLReader.new
|
179
|
+
reader.parse %{
|
180
|
+
authorization do
|
181
|
+
role :test_role do
|
182
|
+
has_permission_on :permissions, :to => :test do
|
183
|
+
if_attribute :attr => is { 1 }
|
184
|
+
if_attribute :attr => is { 2 }
|
185
|
+
end
|
186
|
+
has_permission_on :permission_children_children, :to => :test do
|
187
|
+
if_permitted_to :test, :permission_child => :permission
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
}
|
192
|
+
engine = Authorization::Engine.new(reader)
|
193
|
+
assert_equal [{:permission_child => {:permission => {:attr => [:is, 1]}}},
|
194
|
+
{:permission_child => {:permission => {:attr => [:is, 2]}}}],
|
195
|
+
engine.obligations(:test, :context => :permission_children_children,
|
196
|
+
:user => MockUser.new(:test_role))
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_obligations_with_permissions_and_anded_conditions
|
200
|
+
reader = Authorization::Reader::DSLReader.new
|
201
|
+
reader.parse %{
|
202
|
+
authorization do
|
203
|
+
role :test_role do
|
204
|
+
has_permission_on :permission_children, :to => :test, :join_by => :and do
|
205
|
+
if_permitted_to :test, :permission
|
206
|
+
if_attribute :test_attr => 1
|
207
|
+
end
|
208
|
+
has_permission_on :permissions, :to => :test do
|
209
|
+
if_attribute :test_attr => 1
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
}
|
214
|
+
engine = Authorization::Engine.new(reader)
|
215
|
+
|
216
|
+
assert_equal [{:test_attr => [:is, 1], :permission => {:test_attr => [:is, 1]}}],
|
217
|
+
engine.obligations(:test, :context => :permission_children,
|
218
|
+
:user => MockUser.new(:test_role))
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_guest_user
|
222
|
+
reader = Authorization::Reader::DSLReader.new
|
223
|
+
reader.parse %{
|
224
|
+
authorization do
|
225
|
+
role :guest do
|
226
|
+
has_permission_on :permissions, :to => :test
|
227
|
+
end
|
228
|
+
end
|
229
|
+
}
|
230
|
+
engine = Authorization::Engine.new(reader)
|
231
|
+
assert engine.permit?(:test, :context => :permissions)
|
232
|
+
assert !engine.permit?(:test, :context => :permissions_2)
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_invalid_user_model
|
236
|
+
reader = Authorization::Reader::DSLReader.new
|
237
|
+
reader.parse %{
|
238
|
+
authorization do
|
239
|
+
role :guest do
|
240
|
+
has_permission_on :permissions, :to => :test
|
241
|
+
end
|
242
|
+
end
|
243
|
+
}
|
244
|
+
engine = Authorization::Engine.new(reader)
|
245
|
+
assert_raise(Authorization::AuthorizationUsageError) do
|
246
|
+
engine.permit?(:test, :context => :permissions, :user => MockUser.new(1, 2))
|
247
|
+
end
|
248
|
+
assert_raise(Authorization::AuthorizationUsageError) do
|
249
|
+
engine.permit?(:test, :context => :permissions, :user => MockDataObject.new)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_role_hierarchy
|
254
|
+
reader = Authorization::Reader::DSLReader.new
|
255
|
+
reader.parse %{
|
256
|
+
authorization do
|
257
|
+
role :test_role do
|
258
|
+
includes :lower_role
|
259
|
+
has_permission_on :permissions, :to => :test
|
260
|
+
end
|
261
|
+
role :lower_role do
|
262
|
+
has_permission_on :permissions, :to => :lower
|
263
|
+
end
|
264
|
+
end
|
265
|
+
}
|
266
|
+
engine = Authorization::Engine.new(reader)
|
267
|
+
assert engine.permit?(:lower, :context => :permissions,
|
268
|
+
:user => MockUser.new(:test_role))
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_role_hierarchy_infinity
|
272
|
+
reader = Authorization::Reader::DSLReader.new
|
273
|
+
reader.parse %{
|
274
|
+
authorization do
|
275
|
+
role :test_role do
|
276
|
+
includes :lower_role
|
277
|
+
has_permission_on :permissions, :to => :test
|
278
|
+
end
|
279
|
+
role :lower_role do
|
280
|
+
includes :higher_role
|
281
|
+
has_permission_on :permissions, :to => :lower
|
282
|
+
end
|
283
|
+
end
|
284
|
+
}
|
285
|
+
engine = Authorization::Engine.new(reader)
|
286
|
+
assert engine.permit?(:lower, :context => :permissions,
|
287
|
+
:user => MockUser.new(:test_role))
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_privilege_hierarchy
|
291
|
+
reader = Authorization::Reader::DSLReader.new
|
292
|
+
reader.parse %{
|
293
|
+
privileges do
|
294
|
+
privilege :test, :permissions do
|
295
|
+
includes :lower
|
296
|
+
end
|
297
|
+
end
|
298
|
+
authorization do
|
299
|
+
role :test_role do
|
300
|
+
has_permission_on :permissions, :to => :test
|
301
|
+
end
|
302
|
+
end
|
303
|
+
}
|
304
|
+
engine = Authorization::Engine.new(reader)
|
305
|
+
assert engine.permit?(:lower, :context => :permissions,
|
306
|
+
:user => MockUser.new(:test_role))
|
307
|
+
end
|
308
|
+
|
309
|
+
def test_privilege_hierarchy_without_context
|
310
|
+
reader = Authorization::Reader::DSLReader.new
|
311
|
+
reader.parse %{
|
312
|
+
privileges do
|
313
|
+
privilege :read do
|
314
|
+
includes :list, :show
|
315
|
+
end
|
316
|
+
end
|
317
|
+
authorization do
|
318
|
+
role :test_role do
|
319
|
+
has_permission_on :permissions, :to => :read
|
320
|
+
end
|
321
|
+
end
|
322
|
+
}
|
323
|
+
engine = Authorization::Engine.new(reader)
|
324
|
+
assert engine.permit?(:list, :context => :permissions,
|
325
|
+
:user => MockUser.new(:test_role))
|
326
|
+
end
|
327
|
+
|
328
|
+
def test_attribute_is
|
329
|
+
reader = Authorization::Reader::DSLReader.new
|
330
|
+
reader.parse %|
|
331
|
+
authorization do
|
332
|
+
role :test_role do
|
333
|
+
has_permission_on :permissions, :to => :test do
|
334
|
+
if_attribute :test_attr => is { user.test_attr }
|
335
|
+
if_attribute :test_attr => 3
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
|
340
|
+
engine = Authorization::Engine.new(reader)
|
341
|
+
assert engine.permit?(:test, :context => :permissions,
|
342
|
+
:user => MockUser.new(:test_role, :test_attr => 1),
|
343
|
+
:object => MockDataObject.new(:test_attr => 1))
|
344
|
+
assert engine.permit?(:test, :context => :permissions,
|
345
|
+
:user => MockUser.new(:test_role, :test_attr => 2),
|
346
|
+
:object => MockDataObject.new(:test_attr => 3))
|
347
|
+
assert((not(engine.permit?(:test, :context => :permissions,
|
348
|
+
:user => MockUser.new(:test_role, :test_attr => 2),
|
349
|
+
:object => MockDataObject.new(:test_attr => 1)))))
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_attribute_is_not
|
353
|
+
reader = Authorization::Reader::DSLReader.new
|
354
|
+
reader.parse %|
|
355
|
+
authorization do
|
356
|
+
role :test_role do
|
357
|
+
has_permission_on :permissions, :to => :test do
|
358
|
+
if_attribute :test_attr => is_not { user.test_attr }
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
|
363
|
+
engine = Authorization::Engine.new(reader)
|
364
|
+
assert !engine.permit?(:test, :context => :permissions,
|
365
|
+
:user => MockUser.new(:test_role, :test_attr => 1),
|
366
|
+
:object => MockDataObject.new(:test_attr => 1))
|
367
|
+
assert engine.permit?(:test, :context => :permissions,
|
368
|
+
:user => MockUser.new(:test_role, :test_attr => 2),
|
369
|
+
:object => MockDataObject.new(:test_attr => 1))
|
370
|
+
end
|
371
|
+
|
372
|
+
def test_attribute_contains
|
373
|
+
reader = Authorization::Reader::DSLReader.new
|
374
|
+
reader.parse %|
|
375
|
+
authorization do
|
376
|
+
role :test_role do
|
377
|
+
has_permission_on :permissions, :to => :test do
|
378
|
+
if_attribute :test_attr => contains { user.test_attr }
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
|
383
|
+
engine = Authorization::Engine.new(reader)
|
384
|
+
assert engine.permit?(:test, :context => :permissions,
|
385
|
+
:user => MockUser.new(:test_role, :test_attr => 1),
|
386
|
+
:object => MockDataObject.new(:test_attr => [1,2]))
|
387
|
+
assert !engine.permit?(:test, :context => :permissions,
|
388
|
+
:user => MockUser.new(:test_role, :test_attr => 3),
|
389
|
+
:object => MockDataObject.new(:test_attr => [1,2]))
|
390
|
+
end
|
391
|
+
|
392
|
+
def test_attribute_does_not_contain
|
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 => does_not_contain { user.test_attr }
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
|
403
|
+
engine = Authorization::Engine.new(reader)
|
404
|
+
assert !engine.permit?(:test, :context => :permissions,
|
405
|
+
:user => MockUser.new(:test_role, :test_attr => 1),
|
406
|
+
:object => MockDataObject.new(:test_attr => [1,2]))
|
407
|
+
assert engine.permit?(:test, :context => :permissions,
|
408
|
+
:user => MockUser.new(:test_role, :test_attr => 3),
|
409
|
+
:object => MockDataObject.new(:test_attr => [1,2]))
|
410
|
+
end
|
411
|
+
|
412
|
+
def test_attribute_in_array
|
413
|
+
reader = Authorization::Reader::DSLReader.new
|
414
|
+
reader.parse %|
|
415
|
+
authorization do
|
416
|
+
role :test_role do
|
417
|
+
has_permission_on :permissions, :to => :test do
|
418
|
+
if_attribute :test_attr => is_in { [1,2] }
|
419
|
+
if_attribute :test_attr => [2,3]
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
|
424
|
+
engine = Authorization::Engine.new(reader)
|
425
|
+
assert engine.permit?(:test, :context => :permissions,
|
426
|
+
:user => MockUser.new(:test_role),
|
427
|
+
:object => MockDataObject.new(:test_attr => 1))
|
428
|
+
assert engine.permit?(:test, :context => :permissions,
|
429
|
+
:user => MockUser.new(:test_role),
|
430
|
+
:object => MockDataObject.new(:test_attr => 3))
|
431
|
+
assert !engine.permit?(:test, :context => :permissions,
|
432
|
+
:user => MockUser.new(:test_role),
|
433
|
+
:object => MockDataObject.new(:test_attr => 4))
|
434
|
+
end
|
435
|
+
|
436
|
+
def test_attribute_not_in_array
|
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 => is_not_in { [1,2] }
|
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),
|
450
|
+
:object => MockDataObject.new(:test_attr => 1))
|
451
|
+
assert engine.permit?(:test, :context => :permissions,
|
452
|
+
:user => MockUser.new(:test_role),
|
453
|
+
:object => MockDataObject.new(:test_attr => 4))
|
454
|
+
end
|
455
|
+
|
456
|
+
def test_attribute_intersects_with
|
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_attrs => intersects_with { [1,2] }
|
463
|
+
end
|
464
|
+
end
|
465
|
+
role :test_role_2 do
|
466
|
+
has_permission_on :permissions, :to => :test do
|
467
|
+
if_attribute :test_attrs => intersects_with { 1 }
|
468
|
+
end
|
469
|
+
end
|
470
|
+
end
|
471
|
+
}
|
472
|
+
|
473
|
+
engine = Authorization::Engine.new(reader)
|
474
|
+
assert_raise Authorization::AuthorizationUsageError do
|
475
|
+
engine.permit?(:test, :context => :permissions,
|
476
|
+
:user => MockUser.new(:test_role),
|
477
|
+
:object => MockDataObject.new(:test_attrs => 1 ))
|
478
|
+
end
|
479
|
+
assert_raise Authorization::AuthorizationUsageError do
|
480
|
+
engine.permit?(:test, :context => :permissions,
|
481
|
+
:user => MockUser.new(:test_role_2),
|
482
|
+
:object => MockDataObject.new(:test_attrs => [1, 2] ))
|
483
|
+
end
|
484
|
+
assert engine.permit?(:test, :context => :permissions,
|
485
|
+
:user => MockUser.new(:test_role),
|
486
|
+
:object => MockDataObject.new(:test_attrs => [1,3] ))
|
487
|
+
assert !engine.permit?(:test, :context => :permissions,
|
488
|
+
:user => MockUser.new(:test_role),
|
489
|
+
:object => MockDataObject.new(:test_attrs => [3,4] ))
|
490
|
+
end
|
491
|
+
|
492
|
+
def test_attribute_deep
|
493
|
+
reader = Authorization::Reader::DSLReader.new
|
494
|
+
reader.parse %|
|
495
|
+
authorization do
|
496
|
+
role :test_role do
|
497
|
+
has_permission_on :permissions, :to => :test do
|
498
|
+
if_attribute :test_attr_1 => {:test_attr_2 => contains { 1 }}
|
499
|
+
end
|
500
|
+
end
|
501
|
+
end
|
502
|
+
|
|
503
|
+
engine = Authorization::Engine.new(reader)
|
504
|
+
attr_1_struct = Struct.new(:test_attr_2)
|
505
|
+
assert engine.permit?(:test, :context => :permissions,
|
506
|
+
:user => MockUser.new(:test_role),
|
507
|
+
:object => MockDataObject.new(:test_attr_1 => attr_1_struct.new([1,2])))
|
508
|
+
assert !engine.permit?(:test, :context => :permissions,
|
509
|
+
:user => MockUser.new(:test_role),
|
510
|
+
:object => MockDataObject.new(:test_attr_1 => attr_1_struct.new([3,4])))
|
511
|
+
assert_equal [{:test_attr_1 => {:test_attr_2 => [:contains, 1]}}],
|
512
|
+
engine.obligations(:test, :context => :permissions,
|
513
|
+
:user => MockUser.new(:test_role))
|
514
|
+
end
|
515
|
+
|
516
|
+
def test_attribute_non_block
|
517
|
+
reader = Authorization::Reader::DSLReader.new
|
518
|
+
reader.parse %|
|
519
|
+
authorization do
|
520
|
+
role :test_role do
|
521
|
+
has_permission_on :permissions, :to => :test do
|
522
|
+
if_attribute :test_attr => 1
|
523
|
+
end
|
524
|
+
end
|
525
|
+
end
|
526
|
+
|
|
527
|
+
engine = Authorization::Engine.new(reader)
|
528
|
+
assert engine.permit?(:test, :context => :permissions,
|
529
|
+
:user => MockUser.new(:test_role),
|
530
|
+
:object => MockDataObject.new(:test_attr => 1))
|
531
|
+
assert !engine.permit?(:test, :context => :permissions,
|
532
|
+
:user => MockUser.new(:test_role),
|
533
|
+
:object => MockDataObject.new(:test_attr => 2))
|
534
|
+
end
|
535
|
+
|
536
|
+
def test_attribute_multiple
|
537
|
+
reader = Authorization::Reader::DSLReader.new
|
538
|
+
reader.parse %{
|
539
|
+
authorization do
|
540
|
+
role :test_role do
|
541
|
+
has_permission_on :permissions, :to => :test do
|
542
|
+
if_attribute :test_attr => 1
|
543
|
+
if_attribute :test_attr => 2 # or
|
544
|
+
end
|
545
|
+
end
|
546
|
+
end
|
547
|
+
}
|
548
|
+
engine = Authorization::Engine.new(reader)
|
549
|
+
assert engine.permit?(:test, :context => :permissions,
|
550
|
+
:user => MockUser.new(:test_role),
|
551
|
+
:object => MockDataObject.new(:test_attr => 1))
|
552
|
+
assert engine.permit?(:test, :context => :permissions,
|
553
|
+
:user => MockUser.new(:test_role),
|
554
|
+
:object => MockDataObject.new(:test_attr => 2))
|
555
|
+
end
|
556
|
+
|
557
|
+
class PermissionMock < MockDataObject
|
558
|
+
def self.name
|
559
|
+
"Permission"
|
560
|
+
end
|
561
|
+
end
|
562
|
+
def test_attribute_with_permissions
|
563
|
+
reader = Authorization::Reader::DSLReader.new
|
564
|
+
reader.parse %{
|
565
|
+
authorization do
|
566
|
+
role :test_role do
|
567
|
+
has_permission_on :permissions, :to => :test do
|
568
|
+
if_attribute :test_attr => 1
|
569
|
+
end
|
570
|
+
has_permission_on :permission_children, :to => :test do
|
571
|
+
if_permitted_to :test, :permission
|
572
|
+
end
|
573
|
+
end
|
574
|
+
end
|
575
|
+
}
|
576
|
+
engine = Authorization::Engine.new(reader)
|
577
|
+
|
578
|
+
perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
|
579
|
+
perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
|
580
|
+
assert engine.permit?(:test, :context => :permission_children,
|
581
|
+
:user => MockUser.new(:test_role),
|
582
|
+
:object => MockDataObject.new(:permission => perm_data_attr_1))
|
583
|
+
assert !engine.permit?(:test, :context => :permission_children,
|
584
|
+
:user => MockUser.new(:test_role),
|
585
|
+
:object => MockDataObject.new(:permission => perm_data_attr_2))
|
586
|
+
end
|
587
|
+
|
588
|
+
def test_attribute_with_deep_permissions
|
589
|
+
reader = Authorization::Reader::DSLReader.new
|
590
|
+
reader.parse %{
|
591
|
+
authorization do
|
592
|
+
role :test_role do
|
593
|
+
has_permission_on :permissions, :to => :test do
|
594
|
+
if_attribute :test_attr => 1
|
595
|
+
end
|
596
|
+
has_permission_on :permission_children, :to => :test do
|
597
|
+
if_permitted_to :test, :shallow_permission => :permission
|
598
|
+
end
|
599
|
+
end
|
600
|
+
end
|
601
|
+
}
|
602
|
+
engine = Authorization::Engine.new(reader)
|
603
|
+
|
604
|
+
perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
|
605
|
+
perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
|
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_1)))
|
610
|
+
assert !engine.permit?(:test, :context => :permission_children,
|
611
|
+
:user => MockUser.new(:test_role),
|
612
|
+
:object => MockDataObject.new(:shallow_permission =>
|
613
|
+
MockDataObject.new(:permission => perm_data_attr_2)))
|
614
|
+
end
|
615
|
+
|
616
|
+
def test_attribute_with_permissions_nil
|
617
|
+
reader = Authorization::Reader::DSLReader.new
|
618
|
+
reader.parse %{
|
619
|
+
authorization do
|
620
|
+
role :test_role do
|
621
|
+
has_permission_on :permissions, :to => :test do
|
622
|
+
if_attribute :test_attr => 1
|
623
|
+
end
|
624
|
+
has_permission_on :permission_children, :to => :test do
|
625
|
+
if_permitted_to :test, :permission
|
626
|
+
end
|
627
|
+
end
|
628
|
+
end
|
629
|
+
}
|
630
|
+
engine = Authorization::Engine.new(reader)
|
631
|
+
|
632
|
+
assert_nothing_raised do
|
633
|
+
engine.permit?(:test, :context => :permission_children,
|
634
|
+
:user => MockUser.new(:test_role),
|
635
|
+
:object => MockDataObject.new(:permission => nil))
|
636
|
+
end
|
637
|
+
|
638
|
+
assert !engine.permit?(:test, :context => :permission_children,
|
639
|
+
:user => MockUser.new(:test_role),
|
640
|
+
:object => MockDataObject.new(:permission => nil))
|
641
|
+
end
|
642
|
+
|
643
|
+
def test_attribute_with_permissions_on_self
|
644
|
+
reader = Authorization::Reader::DSLReader.new
|
645
|
+
reader.parse %{
|
646
|
+
authorization do
|
647
|
+
role :test_role do
|
648
|
+
has_permission_on :permissions, :to => :test do
|
649
|
+
if_attribute :test_attr => 1
|
650
|
+
end
|
651
|
+
has_permission_on :permissions, :to => :another_test do
|
652
|
+
if_permitted_to :test
|
653
|
+
end
|
654
|
+
end
|
655
|
+
end
|
656
|
+
}
|
657
|
+
engine = Authorization::Engine.new(reader)
|
658
|
+
|
659
|
+
perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
|
660
|
+
perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
|
661
|
+
assert engine.permit?(:another_test, :context => :permissions,
|
662
|
+
:user => MockUser.new(:test_role),
|
663
|
+
:object => perm_data_attr_1)
|
664
|
+
assert !engine.permit?(:another_test, :context => :permissions,
|
665
|
+
:user => MockUser.new(:test_role),
|
666
|
+
:object => perm_data_attr_2)
|
667
|
+
end
|
668
|
+
|
669
|
+
def test_attribute_with_permissions_on_self_with_context
|
670
|
+
reader = Authorization::Reader::DSLReader.new
|
671
|
+
reader.parse %{
|
672
|
+
authorization do
|
673
|
+
role :test_role do
|
674
|
+
has_permission_on :permissions, :to => :test do
|
675
|
+
if_attribute :test_attr => 1
|
676
|
+
end
|
677
|
+
has_permission_on :permissions, :to => :another_test do
|
678
|
+
if_permitted_to :test, :context => :permissions
|
679
|
+
end
|
680
|
+
end
|
681
|
+
end
|
682
|
+
}
|
683
|
+
engine = Authorization::Engine.new(reader)
|
684
|
+
|
685
|
+
perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
|
686
|
+
perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
|
687
|
+
assert engine.permit?(:another_test, :context => :permissions,
|
688
|
+
:user => MockUser.new(:test_role),
|
689
|
+
:object => perm_data_attr_1)
|
690
|
+
assert !engine.permit?(:another_test, :context => :permissions,
|
691
|
+
:user => MockUser.new(:test_role),
|
692
|
+
:object => perm_data_attr_2)
|
693
|
+
end
|
694
|
+
|
695
|
+
def test_attribute_with_permissions_and_anded_rules
|
696
|
+
reader = Authorization::Reader::DSLReader.new
|
697
|
+
reader.parse %{
|
698
|
+
authorization do
|
699
|
+
role :test_role do
|
700
|
+
has_permission_on :permissions, :to => :test do
|
701
|
+
if_attribute :test_attr => 1
|
702
|
+
end
|
703
|
+
has_permission_on :permission_children, :to => :test, :join_by => :and do
|
704
|
+
if_permitted_to :test, :permission
|
705
|
+
if_attribute :test_attr => 1
|
706
|
+
end
|
707
|
+
end
|
708
|
+
end
|
709
|
+
}
|
710
|
+
engine = Authorization::Engine.new(reader)
|
711
|
+
|
712
|
+
perm_data_attr_1 = PermissionMock.new({:test_attr => 1})
|
713
|
+
perm_data_attr_2 = PermissionMock.new({:test_attr => 2})
|
714
|
+
assert engine.permit?(:test, :context => :permission_children,
|
715
|
+
:user => MockUser.new(:test_role),
|
716
|
+
:object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 1))
|
717
|
+
assert !engine.permit?(:test, :context => :permission_children,
|
718
|
+
:user => MockUser.new(:test_role),
|
719
|
+
:object => MockDataObject.new(:permission => perm_data_attr_2, :test_attr => 1))
|
720
|
+
assert !engine.permit?(:test, :context => :permission_children,
|
721
|
+
:user => MockUser.new(:test_role),
|
722
|
+
:object => MockDataObject.new(:permission => perm_data_attr_1, :test_attr => 2))
|
723
|
+
end
|
724
|
+
|
725
|
+
def test_attribute_with_anded_rules
|
726
|
+
reader = Authorization::Reader::DSLReader.new
|
727
|
+
reader.parse %{
|
728
|
+
authorization do
|
729
|
+
role :test_role do
|
730
|
+
has_permission_on :permissions, :to => :test, :join_by => :and do
|
731
|
+
if_attribute :test_attr => 1
|
732
|
+
if_attribute :test_attr_2 => 2
|
733
|
+
end
|
734
|
+
end
|
735
|
+
end
|
736
|
+
}
|
737
|
+
engine = Authorization::Engine.new(reader)
|
738
|
+
|
739
|
+
assert engine.permit?(:test, :context => :permissions,
|
740
|
+
:user => MockUser.new(:test_role),
|
741
|
+
:object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 2))
|
742
|
+
assert !engine.permit?(:test, :context => :permissions,
|
743
|
+
:user => MockUser.new(:test_role),
|
744
|
+
:object => MockDataObject.new(:test_attr => 1, :test_attr_2 => 3))
|
745
|
+
end
|
746
|
+
|
747
|
+
def test_raise_on_if_attribute_hash_on_collection
|
748
|
+
reader = Authorization::Reader::DSLReader.new
|
749
|
+
reader.parse %{
|
750
|
+
authorization do
|
751
|
+
role :test_role do
|
752
|
+
has_permission_on :permissions, :to => :test do
|
753
|
+
if_attribute :test_attrs => {:attr => is {1}}
|
754
|
+
end
|
755
|
+
end
|
756
|
+
end
|
757
|
+
}
|
758
|
+
engine = Authorization::Engine.new(reader)
|
759
|
+
assert_raise Authorization::AuthorizationUsageError do
|
760
|
+
engine.permit?(:test, :context => :permissions,
|
761
|
+
:user => MockUser.new(:test_role),
|
762
|
+
:object => MockDataObject.new(:test_attrs => [1, 2, 3]))
|
763
|
+
end
|
764
|
+
end
|
765
|
+
|
766
|
+
def test_role_title_description
|
767
|
+
reader = Authorization::Reader::DSLReader.new
|
768
|
+
reader.parse %{
|
769
|
+
authorization do
|
770
|
+
role :test_role, :title => 'Test Role' do
|
771
|
+
description "Test Role Description"
|
772
|
+
end
|
773
|
+
end
|
774
|
+
}
|
775
|
+
engine = Authorization::Engine.new(reader)
|
776
|
+
assert engine.roles.include?(:test_role)
|
777
|
+
assert_equal "Test Role", engine.role_titles[:test_role]
|
778
|
+
assert_equal "Test Role", engine.title_for(:test_role)
|
779
|
+
assert_nil engine.title_for(:test_role_2)
|
780
|
+
assert_equal "Test Role Description", engine.role_descriptions[:test_role]
|
781
|
+
assert_equal "Test Role Description", engine.description_for(:test_role)
|
782
|
+
assert_nil engine.description_for(:test_role_2)
|
783
|
+
end
|
784
|
+
|
785
|
+
def test_multithread
|
786
|
+
reader = Authorization::Reader::DSLReader.new
|
787
|
+
reader.parse %{
|
788
|
+
authorization do
|
789
|
+
role :test_role do
|
790
|
+
has_permission_on :permissions, :to => :test
|
791
|
+
end
|
792
|
+
end
|
793
|
+
}
|
794
|
+
|
795
|
+
engine = Authorization::Engine.new(reader)
|
796
|
+
Authorization.current_user = MockUser.new(:test_role)
|
797
|
+
assert engine.permit?(:test, :context => :permissions)
|
798
|
+
Thread.new do
|
799
|
+
Authorization.current_user = MockUser.new(:test_role2)
|
800
|
+
assert !engine.permit?(:test, :context => :permissions)
|
801
|
+
end
|
802
|
+
assert engine.permit?(:test, :context => :permissions)
|
803
|
+
Authorization.current_user = nil
|
804
|
+
end
|
805
|
+
|
806
|
+
def test_clone
|
807
|
+
reader = Authorization::Reader::DSLReader.new
|
808
|
+
reader.parse %{
|
809
|
+
authorization do
|
810
|
+
role :test_role do
|
811
|
+
has_permission_on :permissions, :to => :test do
|
812
|
+
if_attribute :attr => { :sub_attr => is { user } }
|
813
|
+
if_permitted_to :read, :attr_2 => :attr_3
|
814
|
+
if_permitted_to :read, :attr_2
|
815
|
+
end
|
816
|
+
end
|
817
|
+
end
|
818
|
+
}
|
819
|
+
|
820
|
+
engine = Authorization::Engine.new(reader)
|
821
|
+
cloned_engine = engine.clone
|
822
|
+
assert_not_equal engine.auth_rules[0].contexts.object_id,
|
823
|
+
cloned_engine.auth_rules[0].contexts.object_id
|
824
|
+
assert_not_equal engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id,
|
825
|
+
cloned_engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id
|
826
|
+
end
|
827
|
+
end
|