zeiv-declarative_authorization 1.0.0.pre

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