zeiv-declarative_authorization 1.0.0.pre

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 (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
+