protector 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6b6f32b7d79bf2d7f9780574d4dbb40c561713ea
4
- data.tar.gz: 9bbcc88df9a26dddaed4703eba2b07ae314cff05
3
+ metadata.gz: 8046a17b4ab071f2e5af6511c48a213eb46a8c8a
4
+ data.tar.gz: 789efaa941d0b0fa7590b2d91e6a7cbfac879975
5
5
  SHA512:
6
- metadata.gz: 4bc5bcb7599dfaa7befa6340290d9aa329e98cb967cfbcfa6e122c6c7ca24ed944d3ca4fc42293d67ccb135be0210f0707f39c84463b2e37f4b54ccf5042d396
7
- data.tar.gz: 3229c4cb23b9eaf637247d83297b1f6bddd515dd15ea2f30e3db9e747dac6e35d629eb40e69a188d9667d2f150710db8656d453ec16de36bfb4e0d4be928de13
6
+ metadata.gz: bc9c1a541de4183af641b8b1d5f498d27eb3804e284d0682f83bba43653ba86475165468f9099dd48a1ccbff266d33724dae82a1737a9c57df5cdc839b3a923b
7
+ data.tar.gz: c863b7e9044aa4e0b46776280be869df766a2e631746efb048c5ed62ecbd71ccdad82987f0abadeafeb3a5cdd700f45c8a479cde2c73e5d31b1990cfb2e95b01
data/.gitignore CHANGED
@@ -4,7 +4,7 @@
4
4
  .config
5
5
  .yardoc
6
6
  Gemfile.lock
7
- gemfiles/
7
+ gemfiles/*.lock
8
8
  InstalledFiles
9
9
  _yardoc
10
10
  coverage
@@ -2,3 +2,13 @@ rvm:
2
2
  - 1.9.3
3
3
  - jruby-19mode
4
4
  - 2.0.0
5
+
6
+ gemfile:
7
+ - gemfiles/AR_3.2.gemfile
8
+ - gemfiles/AR_4.gemfile
9
+ - gemfiles/AR_edge.gemfile
10
+ - gemfiles/Rails_3.2.gemfile
11
+ - gemfiles/Rails_4.gemfile
12
+ - gemfiles/Sequel.gemfile
13
+
14
+ script: bundle exec rspec
data/Appraisals CHANGED
@@ -4,7 +4,15 @@ appraise "AR_3.2" do
4
4
  end
5
5
 
6
6
  appraise "AR_4" do
7
- gem "activerecord", "4.0.0", require: "active_record"
7
+ gem "activerecord", "4.0", require: "active_record"
8
+ gem "activerecord-jdbcsqlite3-adapter", platform: :jruby, github: "jruby/activerecord-jdbc-adapter"
9
+ end
10
+
11
+ appraise "AR_edge" do
12
+ gem "activerecord", require: "active_record", github: "rails/rails"
13
+ gem "activemodel", github: "rails/rails"
14
+ gem "activesupport", github: "rails/rails"
15
+ gem "arel", github: "rails/arel"
8
16
  gem "activerecord-jdbcsqlite3-adapter", platform: :jruby, github: "jruby/activerecord-jdbc-adapter"
9
17
  end
10
18
 
data/Gemfile CHANGED
@@ -8,9 +8,9 @@ gem 'rspec'
8
8
  gem 'simplecov', require: false
9
9
  gem 'simplecov-summary'
10
10
 
11
- gem 'appraisal'
11
+ gem 'appraisal', github: 'thoughtbot/appraisal'
12
12
 
13
13
  gem 'sqlite3', platform: :ruby
14
14
  gem 'jdbc-sqlite3', platform: :jruby, require: 'jdbc/sqlite3'
15
15
 
16
- gem 'ruby-prof', platform: :ruby
16
+ gem 'ruby-prof', platform: :ruby
data/Rakefile CHANGED
@@ -8,8 +8,8 @@ RSpec::Core::RakeTask.new(:spec)
8
8
  task :default => :all
9
9
 
10
10
  desc 'Test the plugin under all supported Rails versions.'
11
- task :all => ["appraisal:install"] do |t|
12
- exec('rake appraisal spec')
11
+ task :all do |t|
12
+ exec('bundle exec appraisal install; bundle exec appraisal rspec')
13
13
  end
14
14
 
15
15
  task :perf do
@@ -23,4 +23,4 @@ task :perf do
23
23
  Perf.load a.underscore
24
24
  end
25
25
  end
26
- end
26
+ end
@@ -0,0 +1,18 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "simplecov", :require=>false
10
+ gem "simplecov-summary"
11
+ gem "appraisal", :github=>"thoughtbot/appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "ruby-prof", :platform=>:ruby
15
+ gem "activerecord", "3.2.9", :require=>"active_record"
16
+ gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby, :github=>"jruby/activerecord-jdbc-adapter"
17
+
18
+ gemspec :path=>".././"
@@ -0,0 +1,18 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "simplecov", :require=>false
10
+ gem "simplecov-summary"
11
+ gem "appraisal", :github=>"thoughtbot/appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "ruby-prof", :platform=>:ruby
15
+ gem "activerecord", "4.0", :require=>"active_record"
16
+ gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby, :github=>"jruby/activerecord-jdbc-adapter"
17
+
18
+ gemspec :path=>".././"
@@ -0,0 +1,21 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "simplecov", :require=>false
10
+ gem "simplecov-summary"
11
+ gem "appraisal", :github=>"thoughtbot/appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "ruby-prof", :platform=>:ruby
15
+ gem "activerecord", :require=>"active_record", :github=>"rails/rails"
16
+ gem "activemodel", :github=>"rails/rails"
17
+ gem "activesupport", :github=>"rails/rails"
18
+ gem "arel", :github=>"rails/arel"
19
+ gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby, :github=>"jruby/activerecord-jdbc-adapter"
20
+
21
+ gemspec :path=>".././"
@@ -0,0 +1,20 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "simplecov", :require=>false
10
+ gem "simplecov-summary"
11
+ gem "appraisal", :github=>"thoughtbot/appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "ruby-prof", :platform=>:ruby
15
+ gem "combustion", :github=>"pat/combustion", :ref=>"50a946b5a7ab3d9249f0e5fcebbb73488a91b1e5"
16
+ gem "rails", "3.2.13"
17
+ gem "strong_parameters"
18
+ gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby, :github=>"jruby/activerecord-jdbc-adapter"
19
+
20
+ gemspec :path=>".././"
@@ -0,0 +1,19 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "simplecov", :require=>false
10
+ gem "simplecov-summary"
11
+ gem "appraisal", :github=>"thoughtbot/appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "ruby-prof", :platform=>:ruby
15
+ gem "combustion", :github=>"pat/combustion", :ref=>"50a946b5a7ab3d9249f0e5fcebbb73488a91b1e5"
16
+ gem "rails", "4.0.0"
17
+ gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby, :github=>"jruby/activerecord-jdbc-adapter"
18
+
19
+ gemspec :path=>".././"
@@ -0,0 +1,17 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "simplecov", :require=>false
10
+ gem "simplecov-summary"
11
+ gem "appraisal", :github=>"thoughtbot/appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "ruby-prof", :platform=>:ruby
15
+ gem "sequel", "3.30.0"
16
+
17
+ gemspec :path=>".././"
@@ -13,6 +13,8 @@ module Protector
13
13
  alias_method 'scope_without_protector', 'scoped'
14
14
  alias_method 'scoped', 'scope_with_protector'
15
15
  end
16
+
17
+ alias_method_chain :build, :protector
16
18
  end
17
19
 
18
20
  # Wraps every association with current subject
@@ -21,6 +23,12 @@ module Protector
21
23
  scope = scope.restrict!(owner.protector_subject) if owner.protector_subject?
22
24
  scope
23
25
  end
26
+
27
+ # Forwards protection subject to the new instance
28
+ def build_with_protector(*args, &block)
29
+ return build_without_protector(*args, &block) unless owner.protector_subject?
30
+ build_without_protector(*args, &block).restrict!(owner.protector_subject)
31
+ end
24
32
  end
25
33
  end
26
34
  end
@@ -17,12 +17,12 @@ module Protector
17
17
  end
18
18
 
19
19
  validate do
20
- return unless protector_subject?
20
+ if protector_subject?
21
+ method = new_record? ? :first_uncreatable_field : :first_unupdatable_field
22
+ field = protector_meta.send(method, protector_changed)
21
23
 
22
- method = new_record? ? :first_uncreatable_field : :first_unupdatable_field
23
- field = protector_meta.send(method, protector_changed)
24
-
25
- errors[:base] << I18n.t('protector.invalid', field: field) if field
24
+ errors[:base] << I18n.t('protector.invalid', field: field) if field
25
+ end
26
26
  end
27
27
 
28
28
  before_destroy do
@@ -42,7 +42,9 @@ module Protector
42
42
  end
43
43
 
44
44
  def protector_relation
45
- protector_meta.relation ? merge(protector_meta.relation) : clone
45
+ result = self.clone
46
+ result = protector_meta.eval_scope_procs(result) if protector_meta.relation
47
+ result
46
48
  end
47
49
 
48
50
  # @note Unscoped relation drops properties and therefore should be re-restricted
@@ -92,7 +94,13 @@ module Protector
92
94
  Protector::ActiveRecord::StrongParameters.sanitize! args, true, protector_meta
93
95
  end
94
96
 
95
- new_without_protector(*args, &block).restrict!(protector_subject)
97
+ unless block_given?
98
+ new_without_protector(*args).restrict!(protector_subject)
99
+ else
100
+ new_without_protector(*args) do |instance|
101
+ block.call instance.restrict!(protector_subject)
102
+ end
103
+ end
96
104
  end
97
105
 
98
106
  def create_with_protector(*args, &block)
@@ -136,7 +144,11 @@ module Protector
136
144
 
137
145
  # Now we have @records restricted properly so let's preload associations!
138
146
  associations.each do |association|
139
- ::ActiveRecord::Associations::Preloader.new(@records, association).run
147
+ if ::ActiveRecord::Associations::Preloader.method_defined? :preload
148
+ ::ActiveRecord::Associations::Preloader.new.preload(@records, association)
149
+ else
150
+ ::ActiveRecord::Associations::Preloader.new(@records, association).run
151
+ end
140
152
  end
141
153
 
142
154
  @loaded = true
@@ -2,6 +2,7 @@ module Protector
2
2
  module ActiveRecord
3
3
  module StrongParameters
4
4
  def self.sanitize!(args, is_new, meta)
5
+ return if args[0].permitted?
5
6
  if is_new
6
7
  args[0] = args[0].permit(*meta.access[:create].keys) if meta.access.include? :create
7
8
  else
@@ -215,7 +215,7 @@ module Protector
215
215
  when Range
216
216
  return k unless x.include?(v)
217
217
  when Proc
218
- return k unless x.call(v)
218
+ return k unless Protector.insecurely{ x.call(v) }
219
219
  else
220
220
  return k if !x.nil? && x != v
221
221
  end
@@ -1,4 +1,4 @@
1
1
  module Protector
2
2
  # Gem version
3
- VERSION = '0.7.0'
3
+ VERSION = '0.7.1'
4
4
  end
@@ -57,6 +57,7 @@ if defined?(ActiveRecord)
57
57
  describe Protector::Adapters::ActiveRecord::Base do
58
58
  let(:dummy) do
59
59
  Class.new(ActiveRecord::Base) do
60
+ def self.name; 'Dummy'; end
60
61
  def self.model_name; ActiveModel::Name.new(self, nil, "dummy"); end
61
62
  self.table_name = "dummies"
62
63
  scope :none, where('1 = 0') unless respond_to?(:none)
@@ -92,6 +93,29 @@ if defined?(ActiveRecord)
92
93
 
93
94
  expect { dummy.restrict!('!').create!(string: 'test').delete }.to raise_error
94
95
  end
96
+
97
+ it "validates on new{}" do
98
+ dummy.instance_eval do
99
+ protect do; end
100
+ end
101
+
102
+ result = dummy.restrict!('!').new do |instance|
103
+ instance.protector_subject.should == '!'
104
+ end
105
+
106
+ result.protector_subject.should == '!'
107
+ end
108
+
109
+ it "finds with scope on id column" do
110
+ dummy.instance_eval do
111
+ protect do
112
+ scope { where(id: 1) }
113
+ end
114
+ end
115
+
116
+ expect { dummy.restrict!('!').find(1) }.to_not raise_error
117
+ expect { dummy.restrict!('!').find(2) }.to raise_error
118
+ end
95
119
  end
96
120
 
97
121
  #
@@ -112,6 +136,7 @@ if defined?(ActiveRecord)
112
136
  Dummy.restrict!('!').where(number: 999).first.protector_subject.should == '!'
113
137
  Dummy.restrict!('!').where(number: 999).to_a.first.protector_subject.should == '!'
114
138
  Dummy.restrict!('!').new.protector_subject.should == '!'
139
+ Dummy.restrict!('!').first.fluffies.new.protector_subject.should == '!'
115
140
  end
116
141
 
117
142
  it "checks creatability" do
@@ -80,7 +80,7 @@ describe Protector::DSL do
80
80
 
81
81
  describe Protector::DSL::Meta do
82
82
  context "basic methods" do
83
- l = lambda {|x| x > 4 }
83
+ l = lambda {|x| x > 4}
84
84
 
85
85
  before :each do
86
86
  @meta = Protector::DSL::Meta.new(nil, nil){%w(field1 field2 field3 field4 field5)}
@@ -129,55 +129,59 @@ describe Protector::DSL do
129
129
  end
130
130
  end
131
131
 
132
- it "sets relation" do
133
- data = @meta.evaluate('user', 'entry')
134
- data.relation.should == 'relation'
135
- end
132
+ context "evaluated" do
133
+ let(:data) { @meta.evaluate('user', 'entry') }
134
+
135
+ it "sets relation" do
136
+ data.relation.should == 'relation'
137
+ end
136
138
 
137
- it "sets access" do
138
- data = @meta.evaluate('user', 'entry')
139
- data.access.should == {
140
- update: {
141
- "field1" => nil,
142
- "field2" => nil,
143
- "field3" => 1,
144
- "field4" => 0..5,
145
- "field5" => l
146
- },
147
- read: {
148
- "field1" => nil,
149
- "field2" => nil,
150
- "field3" => nil
139
+ it "sets access" do
140
+ data.access.should == {
141
+ update: {
142
+ "field1" => nil,
143
+ "field2" => nil,
144
+ "field3" => 1,
145
+ "field4" => 0..5,
146
+ "field5" => l
147
+ },
148
+ read: {
149
+ "field1" => nil,
150
+ "field2" => nil,
151
+ "field3" => nil
152
+ }
151
153
  }
152
- }
153
- end
154
+ end
154
155
 
155
- it "marks destroyable" do
156
- data = @meta.evaluate('user', 'entry')
157
- data.destroyable?.should == true
158
- data.can?(:destroy).should == true
159
- end
156
+ it "marks destroyable" do
157
+ data.destroyable?.should == true
158
+ data.can?(:destroy).should == true
159
+ end
160
160
 
161
- it "marks updatable" do
162
- data = @meta.evaluate('user', 'entry')
163
- data.updatable?.should == true
164
- data.can?(:update).should == true
165
- end
161
+ context "marks updatable" do
162
+ it "with defaults" do
163
+ data.updatable?.should == true
164
+ data.can?(:update).should == true
165
+ end
166
166
 
167
- it "gets first unupdatable field" do
168
- data = @meta.evaluate('user', 'entry')
169
- data.first_unupdatable_field('field1' => 1, 'field6' => 2, 'field7' => 3).should == 'field6'
170
- end
167
+ it "respecting lambda", dev: true do
168
+ data.updatable?('field5' => 5).should == true
169
+ data.updatable?('field5' => 3).should == false
170
+ end
171
+ end
171
172
 
172
- it "marks creatable" do
173
- data = @meta.evaluate('user', 'entry')
174
- data.creatable?.should == false
175
- data.can?(:create).should == false
176
- end
173
+ it "gets first unupdatable field" do
174
+ data.first_unupdatable_field('field1' => 1, 'field6' => 2, 'field7' => 3).should == 'field6'
175
+ end
176
+
177
+ it "marks creatable" do
178
+ data.creatable?.should == false
179
+ data.can?(:create).should == false
180
+ end
177
181
 
178
- it "gets first uncreatable field" do
179
- data = @meta.evaluate('user', 'entry')
180
- data.first_uncreatable_field('field1' => 1, 'field6' => 2).should == 'field1'
182
+ it "gets first uncreatable field" do
183
+ data.first_uncreatable_field('field1' => 1, 'field6' => 2).should == 'field1'
184
+ end
181
185
  end
182
186
  end
183
187
 
@@ -222,5 +226,17 @@ describe Protector::DSL do
222
226
  box.can?(:eat).should == true
223
227
  end
224
228
  end
229
+
230
+ it "avoids lambdas recursion" do
231
+ base = Class.new{ include Protector::DSL::Base }
232
+ meta = Protector::DSL::Meta.new(nil, nil){%w(field1)}
233
+
234
+ meta << lambda {
235
+ can :create, field1: lambda {|x| x.protector_subject?.should == false}
236
+ }
237
+
238
+ box = meta.evaluate('context', 'instance')
239
+ box.creatable?('field1' => base.new.restrict!(nil))
240
+ end
225
241
  end
226
242
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boris Staal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-20 00:00:00.000000000 Z
11
+ date: 2013-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -56,6 +56,12 @@ files:
56
56
  - LICENSE.txt
57
57
  - README.md
58
58
  - Rakefile
59
+ - gemfiles/AR_3.2.gemfile
60
+ - gemfiles/AR_4.gemfile
61
+ - gemfiles/AR_edge.gemfile
62
+ - gemfiles/Rails_3.2.gemfile
63
+ - gemfiles/Rails_4.gemfile
64
+ - gemfiles/Sequel.gemfile
59
65
  - lib/protector.rb
60
66
  - lib/protector/adapters/active_record.rb
61
67
  - lib/protector/adapters/active_record/association.rb