graylog2-declarative_authorization 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/CHANGELOG +153 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +529 -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 +44 -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 +47 -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 +20 -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 +705 -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 +68 -0
  27. data/lib/declarative_authorization/in_controller.rb +645 -0
  28. data/lib/declarative_authorization/in_model.rb +162 -0
  29. data/lib/declarative_authorization/maintenance.rb +212 -0
  30. data/lib/declarative_authorization/obligation_scope.rb +354 -0
  31. data/lib/declarative_authorization/rails_legacy.rb +22 -0
  32. data/lib/declarative_authorization/railsengine.rb +6 -0
  33. data/lib/declarative_authorization/reader.rb +521 -0
  34. data/lib/tasks/authorization_tasks.rake +82 -0
  35. data/test/authorization_test.rb +1104 -0
  36. data/test/controller_filter_resource_access_test.rb +511 -0
  37. data/test/controller_test.rb +480 -0
  38. data/test/dsl_reader_test.rb +178 -0
  39. data/test/helper_test.rb +247 -0
  40. data/test/maintenance_test.rb +46 -0
  41. data/test/model_test.rb +1883 -0
  42. data/test/schema.sql +55 -0
  43. data/test/test_helper.rb +152 -0
  44. metadata +112 -0
@@ -0,0 +1,1883 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization in_model})
3
+
4
+ ActiveRecord::Base.send :include, Authorization::AuthorizationInModel
5
+ #ActiveRecord::Base.logger = Logger.new(STDOUT)
6
+
7
+ options = {:adapter => 'sqlite3', :timeout => 500, :database => ':memory:'}
8
+ ActiveRecord::Base.establish_connection(options)
9
+ ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options }
10
+ ActiveRecord::Base.connection
11
+
12
+ File.read(File.dirname(__FILE__) + "/schema.sql").split(';').each do |sql|
13
+ ActiveRecord::Base.connection.execute(sql) unless sql.blank?
14
+ end
15
+
16
+ class TestModel < ActiveRecord::Base
17
+ has_many :test_attrs
18
+ has_many :test_another_attrs, :class_name => "TestAttr", :foreign_key => :test_another_model_id
19
+ has_many :test_attr_throughs, :through => :test_attrs
20
+ has_many :test_attrs_with_attr, :class_name => "TestAttr", :conditions => {:attr => 1}
21
+ has_many :test_attr_throughs_with_attr, :through => :test_attrs,
22
+ :class_name => "TestAttrThrough", :source => :test_attr_throughs,
23
+ :conditions => "test_attrs.attr = 1"
24
+ has_one :test_attr_has_one, :class_name => "TestAttr"
25
+ has_one :test_attr_throughs_with_attr_and_has_one, :through => :test_attrs,
26
+ :class_name => "TestAttrThrough", :source => :test_attr_throughs,
27
+ :conditions => "test_attrs.attr = 1"
28
+
29
+ # TODO currently not working in Rails 3
30
+ if Rails.version < "3"
31
+ has_and_belongs_to_many :test_attr_throughs_habtm, :join_table => :test_attrs,
32
+ :class_name => "TestAttrThrough"
33
+ end
34
+
35
+ if Rails.version < "3"
36
+ named_scope :with_content, :conditions => "test_models.content IS NOT NULL"
37
+ else
38
+ scope :with_content, :conditions => "test_models.content IS NOT NULL"
39
+ end
40
+
41
+ # Primary key test
42
+ # :primary_key only available from Rails 2.2
43
+ unless Rails.version < "2.2"
44
+ has_many :test_attrs_with_primary_id, :class_name => "TestAttr",
45
+ :primary_key => :test_attr_through_id, :foreign_key => :test_attr_through_id
46
+ has_many :test_attr_throughs_with_primary_id,
47
+ :through => :test_attrs_with_primary_id, :class_name => "TestAttrThrough",
48
+ :source => :n_way_join_item
49
+ end
50
+
51
+ # for checking for unnecessary queries
52
+ mattr_accessor :query_count
53
+ def self.find(*args)
54
+ self.query_count ||= 0
55
+ self.query_count += 1
56
+ super(*args)
57
+ end
58
+ end
59
+
60
+ class NWayJoinItem < ActiveRecord::Base
61
+ has_many :test_attrs
62
+ has_many :others, :through => :test_attrs, :source => :n_way_join_item
63
+ end
64
+
65
+ class TestAttr < ActiveRecord::Base
66
+ belongs_to :test_model
67
+ belongs_to :test_another_model, :class_name => "TestModel", :foreign_key => :test_another_model_id
68
+ belongs_to :test_a_third_model, :class_name => "TestModel", :foreign_key => :test_a_third_model_id
69
+ belongs_to :n_way_join_item
70
+ belongs_to :test_attr
71
+ belongs_to :branch
72
+ belongs_to :company
73
+ has_many :test_attr_throughs
74
+ has_many :test_model_security_model_with_finds
75
+ attr_reader :role_symbols
76
+ def initialize (*args)
77
+ @role_symbols = []
78
+ super(*args)
79
+ end
80
+ end
81
+
82
+ class TestAttrThrough < ActiveRecord::Base
83
+ belongs_to :test_attr
84
+ end
85
+
86
+ class TestModelSecurityModel < ActiveRecord::Base
87
+ has_many :test_attrs
88
+ using_access_control
89
+ end
90
+ class TestModelSecurityModelWithFind < ActiveRecord::Base
91
+ set_table_name "test_model_security_models"
92
+ has_many :test_attrs
93
+ belongs_to :test_attr
94
+ using_access_control :include_read => true,
95
+ :context => :test_model_security_models
96
+ end
97
+
98
+ class Branch < ActiveRecord::Base
99
+ has_many :test_attrs
100
+ belongs_to :company
101
+ end
102
+ class Company < ActiveRecord::Base
103
+ has_many :test_attrs
104
+ has_many :branches
105
+ belongs_to :country
106
+ end
107
+ class SmallCompany < Company
108
+ def self.decl_auth_context
109
+ :companies
110
+ end
111
+ end
112
+ class Country < ActiveRecord::Base
113
+ has_many :test_models
114
+ has_many :companies
115
+ end
116
+
117
+ class NamedScopeModelTest < Test::Unit::TestCase
118
+ def test_multiple_deep_ored_belongs_to
119
+ reader = Authorization::Reader::DSLReader.new
120
+ reader.parse %{
121
+ authorization do
122
+ role :test_role do
123
+ has_permission_on :test_attrs, :to => :read do
124
+ if_attribute :test_model => {:test_attrs => contains {user}}
125
+ if_attribute :test_another_model => {:test_attrs => contains {user}}
126
+ end
127
+ end
128
+ end
129
+ }
130
+ Authorization::Engine.instance(reader)
131
+
132
+ test_model_1 = TestModel.create!
133
+ test_model_2 = TestModel.create!
134
+ test_attr_1 = TestAttr.create! :test_model_id => test_model_1.id,
135
+ :test_another_model_id => test_model_2.id
136
+
137
+ user = MockUser.new(:test_role, :id => test_attr_1)
138
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
139
+ TestAttr.delete_all
140
+ TestModel.delete_all
141
+ end
142
+
143
+ def test_with_belongs_to_and_has_many_with_contains
144
+ reader = Authorization::Reader::DSLReader.new
145
+ reader.parse %{
146
+ authorization do
147
+ role :test_role do
148
+ has_permission_on :test_attrs, :to => :read do
149
+ if_attribute :test_model => { :test_attrs => contains { user.test_attr_value } }
150
+ end
151
+ end
152
+ end
153
+ }
154
+ Authorization::Engine.instance(reader)
155
+
156
+ test_attr_1 = TestAttr.create!
157
+ test_model_1 = TestModel.create!
158
+ test_model_1.test_attrs.create!
159
+
160
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.test_attrs.first.id )
161
+ assert_equal 1, TestAttr.with_permissions_to( :read, :context => :test_attrs, :user => user ).length
162
+ assert_equal 1, TestAttr.with_permissions_to( :read, :user => user ).length
163
+ assert_raise Authorization::NotAuthorized do
164
+ TestAttr.with_permissions_to( :update_test_attrs, :user => user )
165
+ end
166
+ TestAttr.delete_all
167
+ TestModel.delete_all
168
+ end
169
+
170
+ def test_with_nested_has_many
171
+ reader = Authorization::Reader::DSLReader.new
172
+ reader.parse %{
173
+ authorization do
174
+ role :test_role do
175
+ has_permission_on :companies, :to => :read do
176
+ if_attribute :branches => { :test_attrs => { :attr => is { user.test_attr_value } } }
177
+ end
178
+ end
179
+ end
180
+ }
181
+ Authorization::Engine.instance(reader)
182
+
183
+ allowed_company = Company.create!
184
+ allowed_company.branches.create!.test_attrs.create!(:attr => 1)
185
+ allowed_company.branches.create!.test_attrs.create!(:attr => 2)
186
+
187
+ prohibited_company = Company.create!
188
+ prohibited_company.branches.create!.test_attrs.create!(:attr => 3)
189
+
190
+ user = MockUser.new(:test_role, :test_attr_value => 1)
191
+ prohibited_user = MockUser.new(:test_role, :test_attr_value => 4)
192
+ assert_equal 1, Company.with_permissions_to(:read, :user => user).length
193
+ assert_equal 0, Company.with_permissions_to(:read, :user => prohibited_user).length
194
+
195
+ Company.delete_all
196
+ Branch.delete_all
197
+ TestAttr.delete_all
198
+ end
199
+
200
+ def test_with_nested_has_many_through
201
+ reader = Authorization::Reader::DSLReader.new
202
+ reader.parse %{
203
+ authorization do
204
+ role :test_role do
205
+ has_permission_on :test_models, :to => :read do
206
+ if_attribute :test_attr_throughs => { :test_attr => { :attr => is { user.test_attr_value } } }
207
+ end
208
+ end
209
+ end
210
+ }
211
+ Authorization::Engine.instance(reader)
212
+
213
+ allowed_model = TestModel.create!
214
+ allowed_model.test_attrs.create!(:attr => 1).test_attr_throughs.create!
215
+ allowed_model.test_attrs.create!(:attr => 2).test_attr_throughs.create!
216
+
217
+ prohibited_model = TestModel.create!
218
+ prohibited_model.test_attrs.create!(:attr => 3).test_attr_throughs.create!
219
+
220
+ user = MockUser.new(:test_role, :test_attr_value => 1)
221
+ prohibited_user = MockUser.new(:test_role, :test_attr_value => 4)
222
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
223
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => prohibited_user).length
224
+
225
+ TestModel.delete_all
226
+ TestAttrThrough.delete_all
227
+ TestAttr.delete_all
228
+ end
229
+
230
+ def test_with_is
231
+ reader = Authorization::Reader::DSLReader.new
232
+ reader.parse %{
233
+ authorization do
234
+ role :test_role do
235
+ has_permission_on :test_models, :to => :read do
236
+ if_attribute :id => is { user.test_attr_value }
237
+ end
238
+ end
239
+ end
240
+ }
241
+ Authorization::Engine.instance(reader)
242
+
243
+ test_model_1 = TestModel.create!
244
+ TestModel.create!
245
+
246
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
247
+ assert_equal 1, TestModel.with_permissions_to(:read,
248
+ :context => :test_models, :user => user).length
249
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
250
+ assert_raise Authorization::NotAuthorized do
251
+ TestModel.with_permissions_to(:update_test_models, :user => user)
252
+ end
253
+ TestModel.delete_all
254
+ end
255
+
256
+ def test_named_scope_on_proxy
257
+ reader = Authorization::Reader::DSLReader.new
258
+ reader.parse %{
259
+ authorization do
260
+ role :test_role do
261
+ has_permission_on :test_attrs, :to => :read do
262
+ if_attribute :id => is { user.test_attr_value }
263
+ end
264
+ end
265
+ end
266
+ }
267
+ Authorization::Engine.instance(reader)
268
+
269
+ test_model_1 = TestModel.create!
270
+ test_attr_1 = test_model_1.test_attrs.create!
271
+ test_model_1.test_attrs.create!
272
+ TestAttr.create!
273
+
274
+ user = MockUser.new(:test_role, :test_attr_value => test_attr_1.id)
275
+ assert_equal 1, test_model_1.test_attrs.with_permissions_to(:read, :user => user).length
276
+ TestModel.delete_all
277
+ TestAttr.delete_all
278
+ end
279
+
280
+ def test_named_scope_on_named_scope
281
+ reader = Authorization::Reader::DSLReader.new
282
+ reader.parse %{
283
+ authorization do
284
+ role :test_role do
285
+ has_permission_on :test_models, :to => :read do
286
+ if_attribute :test_attr_through_id => 1
287
+ end
288
+ has_permission_on :test_attrs, :to => :read do
289
+ if_permitted_to :read, :test_model
290
+ end
291
+ end
292
+ end
293
+ }
294
+ Authorization::Engine.instance(reader)
295
+
296
+ country = Country.create!
297
+ model_1 = TestModel.create!(:test_attr_through_id => 1, :content => "Content")
298
+ country.test_models << model_1
299
+ TestModel.create!(:test_attr_through_id => 1)
300
+ TestModel.create!(:test_attr_through_id => 2, :content => "Content")
301
+
302
+ user = MockUser.new(:test_role)
303
+
304
+ # TODO implement query_count for Rails 3
305
+ TestModel.query_count = 0
306
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
307
+ assert_equal 1, TestModel.query_count if Rails.version < "3"
308
+
309
+ TestModel.query_count = 0
310
+ assert_equal 1, TestModel.with_content.with_permissions_to(:read, :user => user).length
311
+ assert_equal 1, TestModel.query_count if Rails.version < "3"
312
+
313
+ TestModel.query_count = 0
314
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).with_content.length
315
+ assert_equal 1, TestModel.query_count if Rails.version < "3"
316
+
317
+ TestModel.query_count = 0
318
+ assert_equal 1, country.test_models.with_permissions_to(:read, :user => user).length
319
+ assert_equal 1, TestModel.query_count if Rails.version < "3"
320
+
321
+ TestModel.delete_all
322
+ Country.delete_all
323
+ end
324
+
325
+ def test_with_modified_context
326
+ reader = Authorization::Reader::DSLReader.new
327
+ reader.parse %{
328
+ authorization do
329
+ role :test_role do
330
+ has_permission_on :companies, :to => :read do
331
+ if_attribute :id => is { user.test_company_id }
332
+ end
333
+ end
334
+ end
335
+ }
336
+ Authorization::Engine.instance(reader)
337
+
338
+ test_company = SmallCompany.create!
339
+
340
+ user = MockUser.new(:test_role, :test_company_id => test_company.id)
341
+ assert_equal 1, SmallCompany.with_permissions_to(:read,
342
+ :user => user).length
343
+ SmallCompany.delete_all
344
+ end
345
+
346
+ def test_with_is_nil
347
+ reader = Authorization::Reader::DSLReader.new
348
+ reader.parse %{
349
+ authorization do
350
+ role :test_role do
351
+ has_permission_on :test_models, :to => :read do
352
+ if_attribute :content => nil
353
+ end
354
+ end
355
+ role :test_role_not_nil do
356
+ has_permission_on :test_models, :to => :read do
357
+ if_attribute :content => is_not { nil }
358
+ end
359
+ end
360
+ end
361
+ }
362
+ Authorization::Engine.instance(reader)
363
+
364
+ test_model_1 = TestModel.create!
365
+ test_model_2 = TestModel.create! :content => "Content"
366
+
367
+ assert_equal test_model_1, TestModel.with_permissions_to(:read,
368
+ :context => :test_models, :user => MockUser.new(:test_role)).first
369
+ assert_equal test_model_2, TestModel.with_permissions_to(:read,
370
+ :context => :test_models, :user => MockUser.new(:test_role_not_nil)).first
371
+ TestModel.delete_all
372
+ end
373
+
374
+ def test_with_not_is
375
+ reader = Authorization::Reader::DSLReader.new
376
+ reader.parse %{
377
+ authorization do
378
+ role :test_role do
379
+ has_permission_on :test_models, :to => :read do
380
+ if_attribute :id => is_not { user.test_attr_value }
381
+ end
382
+ end
383
+ end
384
+ }
385
+ Authorization::Engine.instance(reader)
386
+
387
+ test_model_1 = TestModel.create!
388
+ TestModel.create!
389
+
390
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
391
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
392
+ TestModel.delete_all
393
+ end
394
+
395
+ def test_with_lt
396
+ reader = Authorization::Reader::DSLReader.new
397
+ reader.parse %{
398
+ authorization do
399
+ role :test_role do
400
+ has_permission_on :test_models, :to => :read do
401
+ if_attribute :id => lt { user.test_attr_value }
402
+ end
403
+ end
404
+ end
405
+ }
406
+ Authorization::Engine.instance(reader)
407
+
408
+ test_model_1 = TestModel.create!
409
+ TestModel.create!
410
+
411
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id + 1)
412
+ assert_equal 1, TestModel.with_permissions_to(:read,
413
+ :context => :test_models, :user => user).length
414
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
415
+ assert_raise Authorization::NotAuthorized do
416
+ TestModel.with_permissions_to(:update_test_models, :user => user)
417
+ end
418
+ TestModel.delete_all
419
+ end
420
+
421
+ def test_with_lte
422
+ reader = Authorization::Reader::DSLReader.new
423
+ reader.parse %{
424
+ authorization do
425
+ role :test_role do
426
+ has_permission_on :test_models, :to => :read do
427
+ if_attribute :id => lte { user.test_attr_value }
428
+ end
429
+ end
430
+ end
431
+ }
432
+ Authorization::Engine.instance(reader)
433
+
434
+ test_model_1 = TestModel.create!
435
+ 2.times { TestModel.create! }
436
+
437
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id + 1)
438
+ assert_equal 2, TestModel.with_permissions_to(:read,
439
+ :context => :test_models, :user => user).length
440
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
441
+ assert_raise Authorization::NotAuthorized do
442
+ TestModel.with_permissions_to(:update_test_models, :user => user)
443
+ end
444
+ TestModel.delete_all
445
+ end
446
+
447
+ def test_with_gt
448
+ reader = Authorization::Reader::DSLReader.new
449
+ reader.parse %{
450
+ authorization do
451
+ role :test_role do
452
+ has_permission_on :test_models, :to => :read do
453
+ if_attribute :id => gt { user.test_attr_value }
454
+ end
455
+ end
456
+ end
457
+ }
458
+ Authorization::Engine.instance(reader)
459
+
460
+ TestModel.create!
461
+ test_model_1 = TestModel.create!
462
+
463
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id - 1)
464
+ assert_equal 1, TestModel.with_permissions_to(:read,
465
+ :context => :test_models, :user => user).length
466
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
467
+ assert_raise Authorization::NotAuthorized do
468
+ TestModel.with_permissions_to(:update_test_models, :user => user)
469
+ end
470
+ TestModel.delete_all
471
+ end
472
+
473
+ def test_with_gte
474
+ reader = Authorization::Reader::DSLReader.new
475
+ reader.parse %{
476
+ authorization do
477
+ role :test_role do
478
+ has_permission_on :test_models, :to => :read do
479
+ if_attribute :id => gte { user.test_attr_value }
480
+ end
481
+ end
482
+ end
483
+ }
484
+ Authorization::Engine.instance(reader)
485
+
486
+ 2.times { TestModel.create! }
487
+ test_model_1 = TestModel.create!
488
+
489
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id - 1)
490
+ assert_equal 2, TestModel.with_permissions_to(:read,
491
+ :context => :test_models, :user => user).length
492
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
493
+ assert_raise Authorization::NotAuthorized do
494
+ TestModel.with_permissions_to(:update_test_models, :user => user)
495
+ end
496
+ TestModel.delete_all
497
+ end
498
+
499
+ def test_with_empty_obligations
500
+ reader = Authorization::Reader::DSLReader.new
501
+ reader.parse %{
502
+ authorization do
503
+ role :test_role do
504
+ has_permission_on :test_models, :to => :read
505
+ end
506
+ end
507
+ }
508
+ Authorization::Engine.instance(reader)
509
+
510
+ TestModel.create!
511
+
512
+ user = MockUser.new(:test_role)
513
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
514
+ assert_raise Authorization::NotAuthorized do
515
+ TestModel.with_permissions_to(:update, :user => user)
516
+ end
517
+ TestModel.delete_all
518
+ end
519
+
520
+ def test_multiple_obligations
521
+ reader = Authorization::Reader::DSLReader.new
522
+ reader.parse %{
523
+ authorization do
524
+ role :test_role do
525
+ has_permission_on :test_models, :to => :read do
526
+ if_attribute :id => is { user.test_attr_value }
527
+ end
528
+ has_permission_on :test_models, :to => :read do
529
+ if_attribute :id => is { user.test_attr_value_2 }
530
+ end
531
+ end
532
+ end
533
+ }
534
+ Authorization::Engine.instance(reader)
535
+
536
+ test_model_1 = TestModel.create!
537
+ test_model_2 = TestModel.create!
538
+
539
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id,
540
+ :test_attr_value_2 => test_model_2.id)
541
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
542
+ TestModel.delete_all
543
+ end
544
+
545
+ def test_multiple_roles
546
+ reader = Authorization::Reader::DSLReader.new
547
+ reader.parse %{
548
+ authorization do
549
+ role :test_role do
550
+ has_permission_on :test_attrs, :to => :read do
551
+ if_attribute :attr => [1,2]
552
+ end
553
+ end
554
+
555
+ role :test_role_2 do
556
+ has_permission_on :test_attrs, :to => :read do
557
+ if_attribute :attr => [2,3]
558
+ end
559
+ end
560
+ end
561
+ }
562
+ Authorization::Engine.instance(reader)
563
+
564
+ TestAttr.create! :attr => 1
565
+ TestAttr.create! :attr => 2
566
+ TestAttr.create! :attr => 3
567
+
568
+ user = MockUser.new(:test_role)
569
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
570
+ TestAttr.delete_all
571
+ end
572
+
573
+ def test_multiple_and_empty_obligations
574
+ reader = Authorization::Reader::DSLReader.new
575
+ reader.parse %{
576
+ authorization do
577
+ role :test_role do
578
+ has_permission_on :test_models, :to => :read do
579
+ if_attribute :id => is { user.test_attr_value }
580
+ end
581
+ has_permission_on :test_models, :to => :read
582
+ end
583
+ end
584
+ }
585
+ Authorization::Engine.instance(reader)
586
+
587
+ test_model_1 = TestModel.create!
588
+ TestModel.create!
589
+
590
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
591
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
592
+ TestModel.delete_all
593
+ end
594
+
595
+ def test_multiple_attributes
596
+ reader = Authorization::Reader::DSLReader.new
597
+ reader.parse %{
598
+ authorization do
599
+ role :test_role do
600
+ has_permission_on :test_models, :to => :read do
601
+ if_attribute :id => is { user.test_attr_value }, :content => "bla"
602
+ end
603
+ end
604
+ end
605
+ }
606
+ Authorization::Engine.instance(reader)
607
+
608
+ test_model_1 = TestModel.create! :content => 'bla'
609
+ TestModel.create! :content => 'bla'
610
+ TestModel.create!
611
+
612
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
613
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
614
+ TestModel.delete_all
615
+ end
616
+
617
+ def test_multiple_belongs_to
618
+ reader = Authorization::Reader::DSLReader.new
619
+ reader.parse %{
620
+ authorization do
621
+ role :test_role do
622
+ has_permission_on :test_attrs, :to => :read do
623
+ if_attribute :test_model => is {user}
624
+ if_attribute :test_another_model => is {user}
625
+ end
626
+ end
627
+ end
628
+ }
629
+ Authorization::Engine.instance(reader)
630
+
631
+ test_attr_1 = TestAttr.create! :test_model_id => 1, :test_another_model_id => 2
632
+
633
+ user = MockUser.new(:test_role, :id => 1)
634
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
635
+ TestAttr.delete_all
636
+ end
637
+
638
+ def test_with_is_and_priv_hierarchy
639
+ reader = Authorization::Reader::DSLReader.new
640
+ reader.parse %{
641
+ privileges do
642
+ privilege :read do
643
+ includes :list, :show
644
+ end
645
+ end
646
+ authorization do
647
+ role :test_role do
648
+ has_permission_on :test_models, :to => :read do
649
+ if_attribute :id => is { user.test_attr_value }
650
+ end
651
+ end
652
+ end
653
+ }
654
+ Authorization::Engine.instance(reader)
655
+
656
+ test_model_1 = TestModel.create!
657
+ TestModel.create!
658
+
659
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
660
+ assert_equal 1, TestModel.with_permissions_to(:list,
661
+ :context => :test_models, :user => user).length
662
+ assert_equal 1, TestModel.with_permissions_to(:list, :user => user).length
663
+
664
+ TestModel.delete_all
665
+ end
666
+
667
+ def test_with_is_and_belongs_to
668
+ reader = Authorization::Reader::DSLReader.new
669
+ reader.parse %{
670
+ authorization do
671
+ role :test_role do
672
+ has_permission_on :test_attrs, :to => :read do
673
+ if_attribute :test_model => is { user.test_model }
674
+ end
675
+ end
676
+ end
677
+ }
678
+ Authorization::Engine.instance(reader)
679
+
680
+ test_model_1 = TestModel.create!
681
+ test_model_1.test_attrs.create!
682
+ TestModel.create!.test_attrs.create!
683
+
684
+ user = MockUser.new(:test_role, :test_model => test_model_1)
685
+ assert_equal 1, TestAttr.with_permissions_to(:read,
686
+ :context => :test_attrs, :user => user).length
687
+
688
+ TestModel.delete_all
689
+ TestAttr.delete_all
690
+ end
691
+
692
+ def test_with_deep_attribute
693
+ reader = Authorization::Reader::DSLReader.new
694
+ reader.parse %{
695
+ authorization do
696
+ role :test_role do
697
+ has_permission_on :test_attrs, :to => :read do
698
+ if_attribute :test_model => {:id => is { user.test_model_id } }
699
+ end
700
+ end
701
+ end
702
+ }
703
+ Authorization::Engine.instance(reader)
704
+
705
+ test_model_1 = TestModel.create!
706
+ test_model_1.test_attrs.create!
707
+ TestModel.create!.test_attrs.create!
708
+
709
+ user = MockUser.new(:test_role, :test_model_id => test_model_1.id)
710
+ assert_equal 1, TestAttr.with_permissions_to(:read,
711
+ :context => :test_attrs, :user => user).length
712
+
713
+ TestModel.delete_all
714
+ TestAttr.delete_all
715
+ end
716
+
717
+ def test_with_anded_rules
718
+ reader = Authorization::Reader::DSLReader.new
719
+ reader.parse %{
720
+ authorization do
721
+ role :test_role do
722
+ has_permission_on :test_attrs, :to => :read, :join_by => :and do
723
+ if_attribute :test_model => is { user.test_model }
724
+ if_attribute :attr => 1
725
+ end
726
+ end
727
+ end
728
+ }
729
+ Authorization::Engine.instance(reader)
730
+
731
+ test_model_1 = TestModel.create!
732
+ test_model_1.test_attrs.create!(:attr => 1)
733
+ TestModel.create!.test_attrs.create!(:attr => 1)
734
+ TestModel.create!.test_attrs.create!
735
+
736
+ user = MockUser.new(:test_role, :test_model => test_model_1)
737
+ assert_equal 1, TestAttr.with_permissions_to(:read,
738
+ :context => :test_attrs, :user => user).length
739
+
740
+ TestModel.delete_all
741
+ TestAttr.delete_all
742
+ end
743
+
744
+ def test_with_contains
745
+ reader = Authorization::Reader::DSLReader.new
746
+ reader.parse %{
747
+ authorization do
748
+ role :test_role do
749
+ has_permission_on :test_models, :to => :read do
750
+ if_attribute :test_attrs => contains { user }
751
+ end
752
+ end
753
+ end
754
+ }
755
+ Authorization::Engine.instance(reader)
756
+
757
+ test_model_1 = TestModel.create!
758
+ test_model_2 = TestModel.create!
759
+ test_model_1.test_attrs.create!
760
+ test_model_1.test_attrs.create!
761
+ test_model_2.test_attrs.create!
762
+
763
+ user = MockUser.new(:test_role,
764
+ :id => test_model_1.test_attrs.first.id)
765
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
766
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).find(:all, :conditions => {:id => test_model_1.id}).length
767
+
768
+ TestModel.delete_all
769
+ TestAttr.delete_all
770
+ end
771
+
772
+ def test_with_does_not_contain
773
+ reader = Authorization::Reader::DSLReader.new
774
+ reader.parse %{
775
+ authorization do
776
+ role :test_role do
777
+ has_permission_on :test_models, :to => :read do
778
+ if_attribute :test_attrs => does_not_contain { user }
779
+ end
780
+ end
781
+ end
782
+ }
783
+ Authorization::Engine.instance(reader)
784
+
785
+ test_model_1 = TestModel.create!
786
+ test_model_2 = TestModel.create!
787
+ test_model_1.test_attrs.create!
788
+ test_model_2.test_attrs.create!
789
+
790
+ user = MockUser.new(:test_role,
791
+ :id => test_model_1.test_attrs.first.id)
792
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
793
+
794
+ TestModel.delete_all
795
+ TestAttr.delete_all
796
+ end
797
+
798
+ def test_with_contains_conditions
799
+ reader = Authorization::Reader::DSLReader.new
800
+ reader.parse %{
801
+ authorization do
802
+ role :test_role do
803
+ has_permission_on :test_models, :to => :read do
804
+ if_attribute :test_attrs_with_attr => contains { user }
805
+ end
806
+ end
807
+ end
808
+ }
809
+ Authorization::Engine.instance(reader)
810
+
811
+ test_model_1 = TestModel.create!
812
+ test_model_2 = TestModel.create!
813
+ test_model_1.test_attrs_with_attr.create!
814
+ test_model_1.test_attrs.create!(:attr => 2)
815
+ test_model_2.test_attrs_with_attr.create!
816
+ test_model_2.test_attrs.create!(:attr => 2)
817
+
818
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
819
+ user = MockUser.new(:test_role,
820
+ :id => test_model_1.test_attrs.first.id)
821
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
822
+ user = MockUser.new(:test_role,
823
+ :id => test_model_1.test_attrs.last.id)
824
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
825
+
826
+ TestModel.delete_all
827
+ TestAttr.delete_all
828
+ end
829
+
830
+ # TODO fails in Rails 3 because TestModel.scoped.joins(:test_attr_throughs_with_attr)
831
+ # does not work
832
+ if Rails.version < "3"
833
+ def test_with_contains_through_conditions
834
+ reader = Authorization::Reader::DSLReader.new
835
+ reader.parse %{
836
+ authorization do
837
+ role :test_role do
838
+ has_permission_on :test_models, :to => :read do
839
+ if_attribute :test_attr_throughs_with_attr => contains { user }
840
+ end
841
+ end
842
+ end
843
+ }
844
+ Authorization::Engine.instance(reader)
845
+
846
+ test_model_1 = TestModel.create!
847
+ test_model_2 = TestModel.create!
848
+ test_model_1.test_attrs.create!(:attr => 1).test_attr_throughs.create!
849
+ test_model_1.test_attrs.create!(:attr => 2).test_attr_throughs.create!
850
+ test_model_2.test_attrs.create!(:attr => 1).test_attr_throughs.create!
851
+ test_model_2.test_attrs.create!(:attr => 2).test_attr_throughs.create!
852
+
853
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
854
+ user = MockUser.new(:test_role,
855
+ :id => test_model_1.test_attr_throughs.first.id)
856
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
857
+ user = MockUser.new(:test_role,
858
+ :id => test_model_1.test_attr_throughs.last.id)
859
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
860
+
861
+ TestModel.delete_all
862
+ TestAttrThrough.delete_all
863
+ TestAttr.delete_all
864
+ end
865
+ end
866
+
867
+ if Rails.version < "3"
868
+ def test_with_contains_habtm
869
+ reader = Authorization::Reader::DSLReader.new
870
+ reader.parse %{
871
+ authorization do
872
+ role :test_role do
873
+ has_permission_on :test_models, :to => :read do
874
+ if_attribute :test_attr_throughs_habtm => contains { user.test_attr_through_id }
875
+ end
876
+ end
877
+ end
878
+ }
879
+ Authorization::Engine.instance(reader)
880
+
881
+ # TODO habtm currently not working in Rails 3
882
+ test_model_1 = TestModel.create!
883
+ test_model_2 = TestModel.create!
884
+ test_attr_through_1 = TestAttrThrough.create!
885
+ test_attr_through_2 = TestAttrThrough.create!
886
+ TestAttr.create! :test_model_id => test_model_1.id, :test_attr_through_id => test_attr_through_1.id
887
+ TestAttr.create! :test_model_id => test_model_2.id, :test_attr_through_id => test_attr_through_2.id
888
+
889
+ user = MockUser.new(:test_role,
890
+ :test_attr_through_id => test_model_1.test_attr_throughs_habtm.first.id)
891
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
892
+ assert_equal test_model_1, TestModel.with_permissions_to(:read, :user => user)[0]
893
+
894
+ TestModel.delete_all
895
+ TestAttrThrough.delete_all
896
+ TestAttr.delete_all
897
+ end
898
+ end
899
+
900
+ # :primary_key not available in Rails prior to 2.2
901
+ if Rails.version > "2.2"
902
+ def test_with_contains_through_primary_key
903
+ reader = Authorization::Reader::DSLReader.new
904
+ reader.parse %{
905
+ authorization do
906
+ role :test_role do
907
+ has_permission_on :test_models, :to => :read do
908
+ if_attribute :test_attr_throughs_with_primary_id => contains { user }
909
+ end
910
+ end
911
+ end
912
+ }
913
+ Authorization::Engine.instance(reader)
914
+
915
+ test_attr_through_1 = TestAttrThrough.create!
916
+ test_item = NWayJoinItem.create!
917
+ test_model_1 = TestModel.create!(:test_attr_through_id => test_attr_through_1.id)
918
+ test_attr_1 = TestAttr.create!(:test_attr_through_id => test_attr_through_1.id,
919
+ :n_way_join_item_id => test_item.id)
920
+
921
+ user = MockUser.new(:test_role,
922
+ :id => test_attr_through_1.id)
923
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
924
+
925
+ TestModel.delete_all
926
+ TestAttrThrough.delete_all
927
+ TestAttr.delete_all
928
+ end
929
+ end
930
+
931
+ def test_with_intersects_with
932
+ reader = Authorization::Reader::DSLReader.new
933
+ reader.parse %{
934
+ authorization do
935
+ role :test_role do
936
+ has_permission_on :test_models, :to => :read do
937
+ if_attribute :test_attrs => intersects_with { user.test_attrs }
938
+ end
939
+ end
940
+ end
941
+ }
942
+ Authorization::Engine.instance(reader)
943
+
944
+ test_model_1 = TestModel.create!
945
+ test_model_2 = TestModel.create!
946
+ test_model_1.test_attrs.create!
947
+ test_model_1.test_attrs.create!
948
+ test_model_1.test_attrs.create!
949
+ test_model_2.test_attrs.create!
950
+
951
+ user = MockUser.new(:test_role,
952
+ :test_attrs => [test_model_1.test_attrs.first, TestAttr.create!])
953
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
954
+
955
+ user = MockUser.new(:test_role,
956
+ :test_attrs => [TestAttr.create!])
957
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
958
+
959
+ TestModel.delete_all
960
+ TestAttr.delete_all
961
+ end
962
+
963
+ def test_with_is_and_has_one
964
+ reader = Authorization::Reader::DSLReader.new
965
+ reader.parse %{
966
+ authorization do :test_attr_has_one
967
+ role :test_role do
968
+ has_permission_on :test_models, :to => :read do
969
+ if_attribute :test_attr_has_one => is { user.test_attr }
970
+ end
971
+ end
972
+ end
973
+ }
974
+ Authorization::Engine.instance(reader)
975
+
976
+ test_model_1 = TestModel.create!
977
+ test_attr_1 = test_model_1.test_attrs.create!
978
+ TestModel.create!.test_attrs.create!
979
+
980
+ user = MockUser.new(:test_role, :test_attr => test_attr_1)
981
+ assert_equal 1, TestModel.with_permissions_to(:read,
982
+ :context => :test_models, :user => user).length
983
+
984
+ TestModel.delete_all
985
+ TestAttr.delete_all
986
+ end
987
+
988
+ # TODO fails in Rails 3 because TestModel.scoped.joins(:test_attr_throughs_with_attr)
989
+ # does not work
990
+ if Rails.version < "3"
991
+ def test_with_is_and_has_one_through_conditions
992
+ reader = Authorization::Reader::DSLReader.new
993
+ reader.parse %{
994
+ authorization do
995
+ role :test_role do
996
+ has_permission_on :test_models, :to => :read do
997
+ if_attribute :test_attr_throughs_with_attr_and_has_one => is { user }
998
+ end
999
+ end
1000
+ end
1001
+ }
1002
+ Authorization::Engine.instance(reader)
1003
+
1004
+ test_model_1 = TestModel.create!
1005
+ test_model_2 = TestModel.create!
1006
+ test_model_1.test_attrs.create!(:attr => 1).test_attr_throughs.create!
1007
+ test_model_1.test_attrs.create!(:attr => 2).test_attr_throughs.create!
1008
+ test_model_2.test_attrs.create!(:attr => 1).test_attr_throughs.create!
1009
+ test_model_2.test_attrs.create!(:attr => 2).test_attr_throughs.create!
1010
+
1011
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
1012
+ user = MockUser.new(:test_role,
1013
+ :id => test_model_1.test_attr_throughs.first.id)
1014
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
1015
+ user = MockUser.new(:test_role,
1016
+ :id => test_model_1.test_attr_throughs.last.id)
1017
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
1018
+
1019
+ TestModel.delete_all
1020
+ TestAttr.delete_all
1021
+ TestAttrThrough.delete_all
1022
+ end
1023
+ end
1024
+
1025
+ def test_with_is_in
1026
+ reader = Authorization::Reader::DSLReader.new
1027
+ reader.parse %{
1028
+ authorization do
1029
+ role :test_role do
1030
+ has_permission_on :test_attrs, :to => :read do
1031
+ if_attribute :test_model => is_in { [user.test_model, user.test_model_2] }
1032
+ end
1033
+ end
1034
+ end
1035
+ }
1036
+ Authorization::Engine.instance(reader)
1037
+
1038
+ test_model_1 = TestModel.create!
1039
+ test_model_2 = TestModel.create!
1040
+ test_model_1.test_attrs.create!
1041
+ TestModel.create!.test_attrs.create!
1042
+
1043
+ user = MockUser.new(:test_role, :test_model => test_model_1,
1044
+ :test_model_2 => test_model_2)
1045
+ assert_equal 1, TestAttr.with_permissions_to(:read,
1046
+ :context => :test_attrs, :user => user).length
1047
+
1048
+ TestModel.delete_all
1049
+ TestAttr.delete_all
1050
+ end
1051
+
1052
+ def test_with_not_is_in
1053
+ reader = Authorization::Reader::DSLReader.new
1054
+ reader.parse %{
1055
+ authorization do
1056
+ role :test_role do
1057
+ has_permission_on :test_attrs, :to => :read do
1058
+ if_attribute :test_model => is_not_in { [user.test_model, user.test_model_2] }
1059
+ end
1060
+ end
1061
+ end
1062
+ }
1063
+ Authorization::Engine.instance(reader)
1064
+
1065
+ test_model_1 = TestModel.create!
1066
+ test_model_2 = TestModel.create!
1067
+ test_model_1.test_attrs.create!
1068
+ TestModel.create!.test_attrs.create!
1069
+
1070
+ user = MockUser.new(:test_role, :test_model => test_model_1,
1071
+ :test_model_2 => test_model_2)
1072
+ assert_equal 1, TestAttr.with_permissions_to(:read,
1073
+ :context => :test_attrs, :user => user).length
1074
+
1075
+ TestModel.delete_all
1076
+ TestAttr.delete_all
1077
+ end
1078
+
1079
+ def test_with_if_permitted_to
1080
+ reader = Authorization::Reader::DSLReader.new
1081
+ reader.parse %{
1082
+ authorization do
1083
+ role :test_role do
1084
+ has_permission_on :test_models, :to => :read do
1085
+ if_attribute :test_attrs => contains { user }
1086
+ end
1087
+ has_permission_on :test_attrs, :to => :read do
1088
+ if_permitted_to :read, :test_model
1089
+ end
1090
+ end
1091
+ end
1092
+ }
1093
+ Authorization::Engine.instance(reader)
1094
+
1095
+ test_model_1 = TestModel.create!
1096
+ test_attr_1 = test_model_1.test_attrs.create!
1097
+
1098
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
1099
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1100
+ TestModel.delete_all
1101
+ TestAttr.delete_all
1102
+ end
1103
+
1104
+ def test_with_anded_if_permitted_to
1105
+ reader = Authorization::Reader::DSLReader.new
1106
+ reader.parse %{
1107
+ authorization do
1108
+ role :base_role do
1109
+ has_permission_on :test_attrs, :to => :read, :join_by => :and do
1110
+ if_permitted_to :read, :test_model
1111
+ if_attribute :attr => 1
1112
+ end
1113
+ end
1114
+ role :first_role do
1115
+ includes :base_role
1116
+ has_permission_on :test_models, :to => :read do
1117
+ if_attribute :content => "first test"
1118
+ end
1119
+ end
1120
+ role :second_role do
1121
+ includes :base_role
1122
+ has_permission_on :test_models, :to => :read do
1123
+ if_attribute :country_id => 2
1124
+ end
1125
+ end
1126
+ end
1127
+ }
1128
+ Authorization::Engine.instance(reader)
1129
+
1130
+ test_model_1 = TestModel.create!(:content => "first test")
1131
+ test_model_1.test_attrs.create!(:attr => 1)
1132
+ test_model_for_second_role = TestModel.create!(:country_id => 2)
1133
+ test_model_for_second_role.test_attrs.create!(:attr => 1)
1134
+ test_model_for_second_role.test_attrs.create!(:attr => 2)
1135
+
1136
+ user = MockUser.new(:first_role)
1137
+ assert Authorization::Engine.instance.permit?(:read, :object => test_model_1.test_attrs.first, :user => user)
1138
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1139
+
1140
+ user_with_both_roles = MockUser.new(:first_role, :second_role)
1141
+ assert Authorization::Engine.instance.permit?(:read, :object => test_model_1.test_attrs.first, :user => user_with_both_roles)
1142
+ assert Authorization::Engine.instance.permit?(:read, :object => test_model_for_second_role.test_attrs.first, :user => user_with_both_roles)
1143
+ #p Authorization::Engine.instance.obligations(:read, :user => user_with_both_roles, :context => :test_attrs)
1144
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user_with_both_roles).length
1145
+
1146
+ TestModel.delete_all
1147
+ TestAttr.delete_all
1148
+ end
1149
+
1150
+ def test_with_if_permitted_to_with_no_child_permissions
1151
+ reader = Authorization::Reader::DSLReader.new
1152
+ reader.parse %{
1153
+ authorization do
1154
+ role :another_role do
1155
+ has_permission_on :test_models, :to => :read do
1156
+ if_attribute :test_attrs => contains { user }
1157
+ end
1158
+ end
1159
+ role :additional_if_attribute do
1160
+ has_permission_on :test_attrs, :to => :read do
1161
+ if_permitted_to :read, :test_model
1162
+ if_attribute :test_model => {:test_attrs => contains { user }}
1163
+ end
1164
+ end
1165
+ role :only_permitted_to do
1166
+ has_permission_on :test_attrs, :to => :read do
1167
+ if_permitted_to :read, :test_model
1168
+ end
1169
+ end
1170
+ end
1171
+ }
1172
+ Authorization::Engine.instance(reader)
1173
+
1174
+ test_model_1 = TestModel.create!
1175
+ test_attr_1 = test_model_1.test_attrs.create!
1176
+
1177
+ user = MockUser.new(:only_permitted_to, :another_role, :id => test_attr_1.id)
1178
+ also_allowed_user = MockUser.new(:additional_if_attribute, :id => test_attr_1.id)
1179
+ non_allowed_user = MockUser.new(:only_permitted_to, :id => test_attr_1.id)
1180
+
1181
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1182
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => also_allowed_user).length
1183
+ assert_raise Authorization::NotAuthorized do
1184
+ TestAttr.with_permissions_to(:read, :user => non_allowed_user).find(:all)
1185
+ end
1186
+
1187
+ TestModel.delete_all
1188
+ TestAttr.delete_all
1189
+ end
1190
+
1191
+ def test_with_if_permitted_to_with_context_from_model
1192
+ reader = Authorization::Reader::DSLReader.new
1193
+ reader.parse %{
1194
+ authorization do
1195
+ role :test_role do
1196
+ has_permission_on :test_models, :to => :read do
1197
+ if_attribute :test_another_attrs => contains { user }
1198
+ end
1199
+ has_permission_on :test_attrs, :to => :read do
1200
+ if_permitted_to :read, :test_another_model
1201
+ end
1202
+ end
1203
+ end
1204
+ }
1205
+ Authorization::Engine.instance(reader)
1206
+
1207
+ test_model_1 = TestModel.create!
1208
+ test_attr_1 = test_model_1.test_another_attrs.create!
1209
+
1210
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
1211
+ non_allowed_user = MockUser.new(:test_role, :id => 111)
1212
+
1213
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1214
+ assert_equal 0, TestAttr.with_permissions_to(:read, :user => non_allowed_user).length
1215
+ TestModel.delete_all
1216
+ TestAttr.delete_all
1217
+ end
1218
+
1219
+ def test_with_has_many_if_permitted_to
1220
+ reader = Authorization::Reader::DSLReader.new
1221
+ reader.parse %{
1222
+ authorization do
1223
+ role :test_role do
1224
+ has_permission_on :test_models, :to => :read do
1225
+ if_permitted_to :read, :test_attrs
1226
+ end
1227
+ has_permission_on :test_attrs, :to => :read do
1228
+ if_attribute :attr => is { user.id }
1229
+ end
1230
+ end
1231
+ end
1232
+ }
1233
+ Authorization::Engine.instance(reader)
1234
+
1235
+ test_model_1 = TestModel.create!
1236
+ test_attr_1 = test_model_1.test_attrs.create!(:attr => 111)
1237
+
1238
+ user = MockUser.new(:test_role, :id => test_attr_1.attr)
1239
+ non_allowed_user = MockUser.new(:test_role, :id => 333)
1240
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
1241
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => non_allowed_user).length
1242
+ TestModel.delete_all
1243
+ TestAttr.delete_all
1244
+ end
1245
+
1246
+ def test_with_deep_has_many_if_permitted_to
1247
+ reader = Authorization::Reader::DSLReader.new
1248
+ reader.parse %{
1249
+ authorization do
1250
+ role :test_role do
1251
+ has_permission_on :branches, :to => :read do
1252
+ if_attribute :name => "A Branch"
1253
+ end
1254
+ has_permission_on :companies, :to => :read do
1255
+ if_permitted_to :read, :test_attrs => :branch
1256
+ end
1257
+ end
1258
+ end
1259
+ }
1260
+ Authorization::Engine.instance(reader)
1261
+
1262
+ readable_company = Company.create!
1263
+ readable_company.test_attrs.create!(:branch => Branch.create!(:name => "A Branch"))
1264
+
1265
+ forbidden_company = Company.create!
1266
+ forbidden_company.test_attrs.create!(:branch => Branch.create!(:name => "Different Branch"))
1267
+
1268
+ user = MockUser.new(:test_role)
1269
+ assert_equal 1, Company.with_permissions_to(:read, :user => user).length
1270
+ Company.delete_all
1271
+ Branch.delete_all
1272
+ TestAttr.delete_all
1273
+ end
1274
+
1275
+ def test_with_if_permitted_to_and_empty_obligations
1276
+ reader = Authorization::Reader::DSLReader.new
1277
+ reader.parse %{
1278
+ authorization do
1279
+ role :test_role do
1280
+ has_permission_on :test_models, :to => :read
1281
+ has_permission_on :test_attrs, :to => :read do
1282
+ if_permitted_to :read, :test_model
1283
+ end
1284
+ end
1285
+ end
1286
+ }
1287
+ Authorization::Engine.instance(reader)
1288
+
1289
+ test_model_1 = TestModel.create!
1290
+ test_attr_1 = test_model_1.test_attrs.create!
1291
+
1292
+ user = MockUser.new(:test_role)
1293
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1294
+ TestModel.delete_all
1295
+ TestAttr.delete_all
1296
+ end
1297
+
1298
+ def test_with_if_permitted_to_nil
1299
+ reader = Authorization::Reader::DSLReader.new
1300
+ reader.parse %{
1301
+ authorization do
1302
+ role :test_role do
1303
+ has_permission_on :test_models, :to => :read do
1304
+ if_attribute :test_attrs => contains { user }
1305
+ end
1306
+ has_permission_on :test_attrs, :to => :read do
1307
+ if_permitted_to :read, :test_model
1308
+ end
1309
+ end
1310
+ end
1311
+ }
1312
+ Authorization::Engine.instance(reader)
1313
+
1314
+ test_attr_1 = TestAttr.create!
1315
+
1316
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
1317
+ assert_equal 0, TestAttr.with_permissions_to(:read, :user => user).length
1318
+ TestAttr.delete_all
1319
+ end
1320
+
1321
+ def test_with_if_permitted_to_self
1322
+ reader = Authorization::Reader::DSLReader.new
1323
+ reader.parse %{
1324
+ authorization do
1325
+ role :test_role do
1326
+ has_permission_on :test_models, :to => :read do
1327
+ if_attribute :test_attrs => contains { user }
1328
+ end
1329
+ has_permission_on :test_models, :to => :update do
1330
+ if_permitted_to :read
1331
+ end
1332
+ end
1333
+ end
1334
+ }
1335
+ Authorization::Engine.instance(reader)
1336
+
1337
+ test_model_1 = TestModel.create!
1338
+ test_attr_1 = test_model_1.test_attrs.create!
1339
+ test_attr_2 = TestAttr.create!
1340
+
1341
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
1342
+ assert_equal 1, TestModel.with_permissions_to(:update, :user => user).length
1343
+ TestAttr.delete_all
1344
+ TestModel.delete_all
1345
+ end
1346
+
1347
+ def test_with_has_many_and_reoccuring_tables
1348
+ reader = Authorization::Reader::DSLReader.new
1349
+ reader.parse %{
1350
+ authorization do
1351
+ role :test_role do
1352
+ has_permission_on :test_attrs, :to => :read do
1353
+ if_attribute :test_another_model => { :content => 'test_1_2' },
1354
+ :test_model => { :content => 'test_1_1' }
1355
+ end
1356
+ end
1357
+ end
1358
+ }
1359
+ Authorization::Engine.instance(reader)
1360
+
1361
+ test_attr_1 = TestAttr.create!(
1362
+ :test_model => TestModel.create!(:content => 'test_1_1'),
1363
+ :test_another_model => TestModel.create!(:content => 'test_1_2')
1364
+ )
1365
+ test_attr_2 = TestAttr.create!(
1366
+ :test_model => TestModel.create!(:content => 'test_2_1'),
1367
+ :test_another_model => TestModel.create!(:content => 'test_2_2')
1368
+ )
1369
+
1370
+ user = MockUser.new(:test_role)
1371
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1372
+ TestModel.delete_all
1373
+ TestAttr.delete_all
1374
+ end
1375
+
1376
+ def test_with_ored_rules_and_reoccuring_tables
1377
+ reader = Authorization::Reader::DSLReader.new
1378
+ reader.parse %{
1379
+ authorization do
1380
+ role :test_role do
1381
+ has_permission_on :test_attrs, :to => :read do
1382
+ if_attribute :test_another_model => { :content => 'test_1_2' },
1383
+ :test_model => { :content => 'test_1_1' }
1384
+ end
1385
+ has_permission_on :test_attrs, :to => :read do
1386
+ if_attribute :test_another_model => { :content => 'test_2_2' },
1387
+ :test_model => { :test_attrs => contains {user.test_attr} }
1388
+ end
1389
+ end
1390
+ end
1391
+ }
1392
+ Authorization::Engine.instance(reader)
1393
+
1394
+ test_attr_1 = TestAttr.create!(
1395
+ :test_model => TestModel.create!(:content => 'test_1_1'),
1396
+ :test_another_model => TestModel.create!(:content => 'test_1_2')
1397
+ )
1398
+ test_attr_2 = TestAttr.create!(
1399
+ :test_model => TestModel.create!(:content => 'test_2_1'),
1400
+ :test_another_model => TestModel.create!(:content => 'test_2_2')
1401
+ )
1402
+ test_attr_2.test_model.test_attrs.create!
1403
+
1404
+ user = MockUser.new(:test_role, :test_attr => test_attr_2.test_model.test_attrs.last)
1405
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
1406
+ TestModel.delete_all
1407
+ TestAttr.delete_all
1408
+ end
1409
+
1410
+ def test_with_many_ored_rules_and_reoccuring_tables
1411
+ reader = Authorization::Reader::DSLReader.new
1412
+ reader.parse %{
1413
+ authorization do
1414
+ role :test_role do
1415
+ has_permission_on :test_attrs, :to => :read do
1416
+ if_attribute :branch => { :company => { :country => {
1417
+ :test_models => contains { user.test_model }
1418
+ }} }
1419
+ if_attribute :company => { :country => {
1420
+ :test_models => contains { user.test_model }
1421
+ }}
1422
+ end
1423
+ end
1424
+ end
1425
+ }
1426
+ Authorization::Engine.instance(reader)
1427
+
1428
+ country = Country.create!(:name => 'country_1')
1429
+ country.test_models.create!
1430
+ test_attr_1 = TestAttr.create!(
1431
+ :branch => Branch.create!(:name => 'branch_1',
1432
+ :company => Company.create!(:name => 'company_1',
1433
+ :country => country))
1434
+ )
1435
+ test_attr_2 = TestAttr.create!(
1436
+ :company => Company.create!(:name => 'company_2',
1437
+ :country => country)
1438
+ )
1439
+
1440
+ user = MockUser.new(:test_role, :test_model => country.test_models.first)
1441
+
1442
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
1443
+ TestModel.delete_all
1444
+ TestAttr.delete_all
1445
+ end
1446
+ end
1447
+
1448
+ class ModelTest < Test::Unit::TestCase
1449
+ def test_permit_with_has_one_raises_no_name_error
1450
+ reader = Authorization::Reader::DSLReader.new
1451
+ reader.parse %{
1452
+ authorization do :test_attr_has_one
1453
+ role :test_role do
1454
+ has_permission_on :test_attrs, :to => :update do
1455
+ if_attribute :id => is { user.test_attr.id }
1456
+ end
1457
+ end
1458
+ end
1459
+ }
1460
+ instance = Authorization::Engine.instance(reader)
1461
+
1462
+ test_model = TestModel.create!
1463
+ test_attr = test_model.create_test_attr_has_one
1464
+ assert !test_attr.new_record?
1465
+
1466
+ user = MockUser.new(:test_role, :test_attr => test_attr)
1467
+
1468
+ assert_nothing_raised do
1469
+ assert instance.permit?(:update, :user => user, :object => test_model.test_attr_has_one)
1470
+ end
1471
+
1472
+ TestModel.delete_all
1473
+ TestAttr.delete_all
1474
+ end
1475
+
1476
+ def test_model_security_write_allowed
1477
+ reader = Authorization::Reader::DSLReader.new
1478
+ reader.parse %{
1479
+ authorization do
1480
+ role :test_role do
1481
+ has_permission_on :test_model_security_models do
1482
+ to :read, :create, :update, :delete
1483
+ if_attribute :attr => is { 1 }
1484
+ end
1485
+ end
1486
+ end
1487
+ }
1488
+ Authorization::Engine.instance(reader)
1489
+
1490
+ Authorization.current_user = MockUser.new(:test_role)
1491
+ assert(object = TestModelSecurityModel.create)
1492
+
1493
+ assert_nothing_raised { object.update_attributes(:attr_2 => 2) }
1494
+ object.reload
1495
+ assert_equal 2, object.attr_2
1496
+ object.destroy
1497
+ assert_raise ActiveRecord::RecordNotFound do
1498
+ TestModelSecurityModel.find(object.id)
1499
+ end
1500
+ end
1501
+
1502
+ def test_model_security_write_not_allowed_no_privilege
1503
+ reader = Authorization::Reader::DSLReader.new
1504
+ reader.parse %{
1505
+ authorization do
1506
+ role :test_role do
1507
+ has_permission_on :test_model_security_models do
1508
+ to :read, :create, :update, :delete
1509
+ if_attribute :attr => is { 1 }
1510
+ end
1511
+ end
1512
+ role :test_role_restricted do
1513
+ end
1514
+ end
1515
+ }
1516
+ Authorization::Engine.instance(reader)
1517
+
1518
+ Authorization.current_user = MockUser.new(:test_role)
1519
+ assert(object = TestModelSecurityModel.create)
1520
+
1521
+ Authorization.current_user = MockUser.new(:test_role_restricted)
1522
+ assert_raise Authorization::NotAuthorized do
1523
+ object.update_attributes(:attr_2 => 2)
1524
+ end
1525
+ end
1526
+
1527
+ def test_model_security_write_not_allowed_wrong_attribute_value
1528
+ reader = Authorization::Reader::DSLReader.new
1529
+ reader.parse %{
1530
+ authorization do
1531
+ role :test_role_unrestricted do
1532
+ has_permission_on :test_model_security_models do
1533
+ to :read, :create, :update, :delete
1534
+ end
1535
+ end
1536
+ role :test_role do
1537
+ has_permission_on :test_model_security_models do
1538
+ to :read, :create, :update, :delete
1539
+ if_attribute :attr => is { 1 }
1540
+ end
1541
+ end
1542
+ end
1543
+ }
1544
+ Authorization::Engine.instance(reader)
1545
+
1546
+ Authorization.current_user = MockUser.new(:test_role)
1547
+ assert(object = TestModelSecurityModel.create)
1548
+ assert_raise Authorization::AttributeAuthorizationError do
1549
+ TestModelSecurityModel.create :attr => 2
1550
+ end
1551
+ object = TestModelSecurityModel.create
1552
+ assert_raise Authorization::AttributeAuthorizationError do
1553
+ object.update_attributes(:attr => 2)
1554
+ end
1555
+ object.reload
1556
+
1557
+ assert_nothing_raised do
1558
+ object.update_attributes(:attr_2 => 1)
1559
+ end
1560
+ assert_raise Authorization::AttributeAuthorizationError do
1561
+ object.update_attributes(:attr => 2)
1562
+ end
1563
+ end
1564
+
1565
+ def test_model_security_with_and_without_find_restrictions
1566
+ reader = Authorization::Reader::DSLReader.new
1567
+ reader.parse %{
1568
+ authorization do
1569
+ role :test_role_unrestricted do
1570
+ has_permission_on :test_model_security_models do
1571
+ to :read, :create, :update, :delete
1572
+ end
1573
+ end
1574
+ role :test_role do
1575
+ has_permission_on :test_model_security_models do
1576
+ to :read, :create, :update, :delete
1577
+ if_attribute :attr => is { 1 }
1578
+ end
1579
+ end
1580
+ end
1581
+ }
1582
+ Authorization::Engine.instance(reader)
1583
+
1584
+ Authorization.current_user = MockUser.new(:test_role_unrestricted)
1585
+ object = TestModelSecurityModel.create :attr => 2
1586
+ object_with_find = TestModelSecurityModelWithFind.create :attr => 2
1587
+ Authorization.current_user = MockUser.new(:test_role)
1588
+ assert_nothing_raised do
1589
+ object.class.find(object.id)
1590
+ end
1591
+ assert_raise Authorization::AttributeAuthorizationError do
1592
+ object_with_find.class.find(object_with_find.id)
1593
+ end
1594
+ end
1595
+
1596
+ def test_model_security_with_read_restrictions_and_exists
1597
+ reader = Authorization::Reader::DSLReader.new
1598
+ reader.parse %{
1599
+ authorization do
1600
+ role :test_role do
1601
+ has_permission_on :test_model_security_models do
1602
+ to :read, :create, :update, :delete
1603
+ if_attribute :test_attr => is { user.test_attr }
1604
+ end
1605
+ end
1606
+ end
1607
+ }
1608
+ Authorization::Engine.instance(reader)
1609
+
1610
+ test_attr = TestAttr.create
1611
+ Authorization.current_user = MockUser.new(:test_role, :test_attr => test_attr)
1612
+ object_with_find = TestModelSecurityModelWithFind.create :test_attr => test_attr
1613
+ assert_nothing_raised do
1614
+ object_with_find.class.find(object_with_find.id)
1615
+ end
1616
+ assert_equal 1, test_attr.test_model_security_model_with_finds.length
1617
+
1618
+ # Raises error since AR does not populate the object
1619
+ #assert test_attr.test_model_security_model_with_finds.exists?(object_with_find)
1620
+ end
1621
+
1622
+ def test_model_security_delete_unallowed
1623
+ reader = Authorization::Reader::DSLReader.new
1624
+ reader.parse %{
1625
+ authorization do
1626
+ role :test_role_unrestricted do
1627
+ has_permission_on :test_model_security_models do
1628
+ to :read, :create, :update, :delete
1629
+ end
1630
+ end
1631
+ role :test_role do
1632
+ has_permission_on :test_model_security_models do
1633
+ to :read, :create, :update, :delete
1634
+ if_attribute :attr => is { 1 }
1635
+ end
1636
+ end
1637
+ end
1638
+ }
1639
+ Authorization::Engine.instance(reader)
1640
+
1641
+ Authorization.current_user = MockUser.new(:test_role_unrestricted)
1642
+ object = TestModelSecurityModel.create :attr => 2
1643
+ Authorization.current_user = MockUser.new(:test_role)
1644
+
1645
+ assert_raise Authorization::AttributeAuthorizationError do
1646
+ object.destroy
1647
+ end
1648
+ end
1649
+
1650
+ def test_model_security_changing_critical_attribute_unallowed
1651
+ reader = Authorization::Reader::DSLReader.new
1652
+ reader.parse %{
1653
+ authorization do
1654
+ role :test_role_unrestricted do
1655
+ has_permission_on :test_model_security_models do
1656
+ to :read, :create, :update, :delete
1657
+ end
1658
+ end
1659
+ role :test_role do
1660
+ has_permission_on :test_model_security_models do
1661
+ to :read, :create, :update, :delete
1662
+ if_attribute :attr => is { 1 }
1663
+ end
1664
+ end
1665
+ end
1666
+ }
1667
+ Authorization::Engine.instance(reader)
1668
+
1669
+ Authorization.current_user = MockUser.new(:test_role_unrestricted)
1670
+ object = TestModelSecurityModel.create :attr => 2
1671
+ Authorization.current_user = MockUser.new(:test_role)
1672
+
1673
+ # TODO before not checked yet
1674
+ #assert_raise Authorization::AuthorizationError do
1675
+ # object.update_attributes(:attr => 1)
1676
+ #end
1677
+ end
1678
+
1679
+ def test_model_security_no_role_unallowed
1680
+ reader = Authorization::Reader::DSLReader.new
1681
+ reader.parse %{
1682
+ authorization do
1683
+ end
1684
+ }
1685
+ Authorization::Engine.instance(reader)
1686
+
1687
+ Authorization.current_user = MockUser.new(:test_role_2)
1688
+ assert_raise Authorization::NotAuthorized do
1689
+ TestModelSecurityModel.create
1690
+ end
1691
+ end
1692
+
1693
+ def test_model_security_with_assoc
1694
+ reader = Authorization::Reader::DSLReader.new
1695
+ reader.parse %{
1696
+ authorization do
1697
+ role :test_role do
1698
+ has_permission_on :test_model_security_models do
1699
+ to :create, :update, :delete
1700
+ if_attribute :test_attrs => contains { user }
1701
+ end
1702
+ end
1703
+ end
1704
+ }
1705
+ Authorization::Engine.instance(reader)
1706
+
1707
+ test_attr = TestAttr.create
1708
+ test_attr.role_symbols << :test_role
1709
+ Authorization.current_user = test_attr
1710
+ assert(object = TestModelSecurityModel.create(:test_attrs => [test_attr]))
1711
+ assert_nothing_raised do
1712
+ object.update_attributes(:attr_2 => 2)
1713
+ end
1714
+ without_access_control do
1715
+ object.reload
1716
+ end
1717
+ assert_equal 2, object.attr_2
1718
+ object.destroy
1719
+ assert_raise ActiveRecord::RecordNotFound do
1720
+ TestModelSecurityModel.find(object.id)
1721
+ end
1722
+ end
1723
+
1724
+ def test_model_security_with_update_attrbributes
1725
+ reader = Authorization::Reader::DSLReader.new
1726
+ reader.parse %{
1727
+ authorization do
1728
+ role :test_role do
1729
+ has_permission_on :test_model_security_models, :to => :update do
1730
+ if_attribute :test_attrs => { :branch => is { user.branch }}
1731
+ end
1732
+ end
1733
+ end
1734
+ }
1735
+ Authorization::Engine.instance(reader)
1736
+
1737
+ params = {
1738
+ :model_data => { :attr => 11 }
1739
+ }
1740
+
1741
+ test_attr = TestAttr.create!(:branch => Branch.create!)
1742
+ test_model = without_access_control do
1743
+ TestModelSecurityModel.create!(:test_attrs => [test_attr])
1744
+ end
1745
+
1746
+ with_user MockUser.new(:test_role, :branch => test_attr.branch) do
1747
+ assert_nothing_raised do
1748
+ test_model.update_attributes(params[:model_data])
1749
+ end
1750
+ end
1751
+ without_access_control do
1752
+ assert_equal params[:model_data][:attr], test_model.reload.attr
1753
+ end
1754
+
1755
+ TestAttr.delete_all
1756
+ TestModelSecurityModel.delete_all
1757
+ Branch.delete_all
1758
+ end
1759
+
1760
+ def test_using_access_control
1761
+ assert !TestModel.using_access_control?
1762
+ assert TestModelSecurityModel.using_access_control?
1763
+ end
1764
+
1765
+ def test_authorization_permit_association_proxy
1766
+ reader = Authorization::Reader::DSLReader.new
1767
+ reader.parse %{
1768
+ authorization do
1769
+ role :test_role do
1770
+ has_permission_on :test_attrs, :to => :read do
1771
+ if_attribute :test_model => {:content => "content" }
1772
+ end
1773
+ end
1774
+ end
1775
+ }
1776
+ engine = Authorization::Engine.instance(reader)
1777
+
1778
+ test_model = TestModel.create(:content => "content")
1779
+ assert engine.permit?(:read, :object => test_model.test_attrs,
1780
+ :user => MockUser.new(:test_role))
1781
+ assert !engine.permit?(:read, :object => TestAttr.new,
1782
+ :user => MockUser.new(:test_role))
1783
+ TestModel.delete_all
1784
+ end
1785
+
1786
+ def test_multiple_roles_with_has_many_through
1787
+ reader = Authorization::Reader::DSLReader.new
1788
+ reader.parse %{
1789
+ authorization do
1790
+ role :test_role_1 do
1791
+ has_permission_on :test_models, :to => :read do
1792
+ if_attribute :test_attr_throughs => contains {user.test_attr_through_id},
1793
+ :content => 'test_1'
1794
+ end
1795
+ end
1796
+
1797
+ role :test_role_2 do
1798
+ has_permission_on :test_models, :to => :read do
1799
+ if_attribute :test_attr_throughs_2 => contains {user.test_attr_through_2_id},
1800
+ :content => 'test_2'
1801
+ end
1802
+ end
1803
+ end
1804
+ }
1805
+ Authorization::Engine.instance(reader)
1806
+
1807
+ test_model_1 = TestModel.create! :content => 'test_1'
1808
+ test_model_2 = TestModel.create! :content => 'test_2'
1809
+ test_model_1.test_attrs.create!.test_attr_throughs.create!
1810
+ test_model_2.test_attrs.create!.test_attr_throughs.create!
1811
+
1812
+ user = MockUser.new(:test_role_1, :test_role_2,
1813
+ :test_attr_through_id => test_model_1.test_attr_throughs.first.id,
1814
+ :test_attr_through_2_id => test_model_2.test_attr_throughs.first.id)
1815
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
1816
+ TestModel.delete_all
1817
+ TestAttr.delete_all
1818
+ TestAttrThrough.delete_all
1819
+ end
1820
+
1821
+ def test_model_permitted_to
1822
+ reader = Authorization::Reader::DSLReader.new
1823
+ reader.parse %{
1824
+ authorization do
1825
+ role :test_role do
1826
+ has_permission_on :companies, :to => :read do
1827
+ if_attribute :name => "company_1"
1828
+ end
1829
+ end
1830
+ end
1831
+ }
1832
+ Authorization::Engine.instance(reader)
1833
+
1834
+ user = MockUser.new(:test_role)
1835
+ allowed_read_company = Company.new(:name => 'company_1')
1836
+ prohibited_company = Company.new(:name => 'company_2')
1837
+
1838
+ assert allowed_read_company.permitted_to?(:read, :user => user)
1839
+ assert !allowed_read_company.permitted_to?(:update, :user => user)
1840
+ assert !prohibited_company.permitted_to?(:read, :user => user)
1841
+
1842
+ executed_block = false
1843
+ allowed_read_company.permitted_to?(:read, :user => user) do
1844
+ executed_block = true
1845
+ end
1846
+ assert executed_block
1847
+
1848
+ executed_block = false
1849
+ prohibited_company.permitted_to?(:read, :user => user) do
1850
+ executed_block = true
1851
+ end
1852
+ assert !executed_block
1853
+
1854
+ assert_nothing_raised do
1855
+ allowed_read_company.permitted_to!(:read, :user => user)
1856
+ end
1857
+ assert_raise Authorization::NotAuthorized do
1858
+ prohibited_company.permitted_to!(:update, :user => user)
1859
+ end
1860
+ assert_raise Authorization::AttributeAuthorizationError do
1861
+ prohibited_company.permitted_to!(:read, :user => user)
1862
+ end
1863
+ end
1864
+
1865
+ def test_model_permitted_to_with_modified_context
1866
+ reader = Authorization::Reader::DSLReader.new
1867
+ reader.parse %{
1868
+ authorization do
1869
+ role :test_role do
1870
+ has_permission_on :companies, :to => :read
1871
+ end
1872
+ end
1873
+ }
1874
+ Authorization::Engine.instance(reader)
1875
+
1876
+ user = MockUser.new(:test_role)
1877
+ allowed_read_company = SmallCompany.new(:name => 'small_company_1')
1878
+
1879
+ assert allowed_read_company.permitted_to?(:read, :user => user)
1880
+ assert !allowed_read_company.permitted_to?(:update, :user => user)
1881
+ end
1882
+ end
1883
+