graylog2-declarative_authorization 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+