rack_csrf 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'spec_helper.rb')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Rack::Csrf do
4
4
  describe 'key' do
@@ -7,8 +7,7 @@ describe Rack::Csrf do
7
7
  end
8
8
 
9
9
  it "should be the value of the :key option" do
10
- fakeapp = lambda {|env| [200, {}, []]}
11
- Rack::Csrf.new fakeapp, :key => 'whatever'
10
+ Rack::Csrf.new nil, :key => 'whatever'
12
11
  Rack::Csrf.key.should == 'whatever'
13
12
  end
14
13
  end
@@ -25,8 +24,7 @@ describe Rack::Csrf do
25
24
  end
26
25
 
27
26
  it "should be the value of :field option" do
28
- fakeapp = lambda {|env| [200, {}, []]}
29
- Rack::Csrf.new fakeapp, :field => 'whatever'
27
+ Rack::Csrf.new nil, :field => 'whatever'
30
28
  Rack::Csrf.field.should == 'whatever'
31
29
  end
32
30
  end
@@ -37,6 +35,22 @@ describe Rack::Csrf do
37
35
  end
38
36
  end
39
37
 
38
+ describe 'header' do
39
+ subject { Rack::Csrf.header }
40
+ it { should == 'X_CSRF_TOKEN' }
41
+
42
+ context "when set to something" do
43
+ before { Rack::Csrf.new nil, :header => 'something' }
44
+ subject { Rack::Csrf.header }
45
+ it { should == 'something' }
46
+ end
47
+ end
48
+
49
+ describe 'csrf_header' do
50
+ subject { Rack::Csrf.method(:csrf_header) }
51
+ it { should == Rack::Csrf.method(:header) }
52
+ end
53
+
40
54
  describe 'token(env)' do
41
55
  let(:env) { {'rack.session' => {}} }
42
56
 
@@ -44,8 +58,7 @@ describe Rack::Csrf do
44
58
 
45
59
  context 'when accessing/manipulating the session' do
46
60
  before do
47
- fakeapp = lambda {|env| [200, {}, []]}
48
- Rack::Csrf.new fakeapp, :key => 'whatever'
61
+ Rack::Csrf.new nil, :key => 'whatever'
49
62
  end
50
63
 
51
64
  it 'should use the key provided by method key' do
@@ -84,8 +97,7 @@ describe Rack::Csrf do
84
97
  let(:env) { {'rack.session' => {}} }
85
98
 
86
99
  let :tag do
87
- fakeapp = lambda {|env| [200, {}, []]}
88
- Rack::Csrf.new fakeapp, :field => 'whatever'
100
+ Rack::Csrf.new nil, :field => 'whatever'
89
101
  Rack::Csrf.tag env
90
102
  end
91
103
 
@@ -113,78 +125,112 @@ describe Rack::Csrf do
113
125
  end
114
126
  end
115
127
 
116
- describe 'skip_checking' do
117
- class MockReq
118
- attr_accessor :path_info, :request_method
119
- end
120
-
121
- before :each do
122
- @request = MockReq.new
123
- @request.path_info = '/hello'
124
- @request.request_method = 'POST'
125
- end
128
+ describe 'metatag(env)' do
129
+ let(:env) { {'rack.session' => {}} }
126
130
 
127
- context 'with empty :skip and :check_only lists' do
128
- let(:csrf) { Rack::Csrf.new nil }
131
+ context 'by default' do
132
+ let :metatag do
133
+ Rack::Csrf.new nil, :header => 'whatever'
134
+ Rack::Csrf.metatag env
135
+ end
129
136
 
130
- it 'should run the check, irrespective of the request' do
131
- csrf.send(:skip_checking, @request).should be_false
137
+ subject { metatag }
138
+ it { should =~ /^<meta/ }
139
+ it { should =~ /name="_csrf"/ }
140
+ it "should have the content provided by method token(env)" do
141
+ quoted_value = Regexp.quote %Q(content="#{Rack::Csrf.token(env)}")
142
+ metatag.should =~ /#{quoted_value}/
132
143
  end
133
144
  end
134
145
 
135
- context 'with routes in the :skip list and nothing in the :check_only list' do
136
- let(:csrf) { Rack::Csrf.new nil, :skip => ['POST:/hello'] }
137
-
138
- it 'should skip the check when the request is included in the :skip list' do
139
- csrf.send(:skip_checking, @request).should be_true
146
+ context 'with custom name' do
147
+ let :metatag do
148
+ Rack::Csrf.new nil, :header => 'whatever'
149
+ Rack::Csrf.metatag env, :name => 'custom_name'
140
150
  end
141
151
 
142
- it 'should run the check when the request is not in the :skip list' do
143
- @request.path_info = '/byebye'
144
- csrf.send(:skip_checking, @request).should be_false
152
+ subject { metatag }
153
+ it { should =~ /^<meta/ }
154
+ it { should =~ /name="custom_name"/ }
155
+ it "should have the content provided by method token(env)" do
156
+ quoted_value = Regexp.quote %Q(content="#{Rack::Csrf.token(env)}")
157
+ metatag.should =~ /#{quoted_value}/
145
158
  end
146
159
  end
160
+ end
161
+
162
+ describe 'csrf_metatag(env)' do
163
+ it 'should be the same as method metatag(env)' do
164
+ Rack::Csrf.method(:csrf_metatag).should == Rack::Csrf.method(:metatag)
165
+ end
166
+ end
147
167
 
148
- context 'with routes in the :check_only list and nothing in the :skip list' do
149
- let(:csrf) { Rack::Csrf.new nil, :check_only => ['POST:/hello'] }
168
+ # Protected/private API
150
169
 
151
- it 'should run the check when the request is included in the :check_only list' do
152
- csrf.send(:skip_checking, @request).should be_false
153
- end
170
+ describe 'rackified_header' do
171
+ before { Rack::Csrf.new nil, :header => 'my-header' }
172
+ subject { Rack::Csrf.rackified_header }
173
+ it { should == 'HTTP_MY_HEADER'}
174
+ end
154
175
 
155
- it 'should skip the check when the request is not in the :check_only list' do
156
- @request.path_info = '/byebye'
157
- csrf.send(:skip_checking, @request).should be_true
158
- end
176
+ describe 'skip_checking' do
177
+ let :request do
178
+ double 'Request',
179
+ :path_info => '/hello',
180
+ :request_method => 'POST',
181
+ :env => {'HTTP_X_VERY_SPECIAL_HEADER' => 'so true'}
159
182
  end
160
183
 
161
- context 'with different routes in the :skip and :check_only lists' do
162
- let :csrf do
163
- Rack::Csrf.new nil,
164
- :skip => ['POST:/hello'],
165
- :check_only => ['POST:/byebye']
166
- end
184
+ context 'when the lists are empty and there is no custom check' do
185
+ let(:csrf) { Rack::Csrf.new nil }
167
186
 
168
- it 'should skip the check when the request is included in the :skip list' do
169
- csrf.send(:skip_checking, @request).should be_true
187
+ it 'should run the check' do
188
+ csrf.send(:skip_checking, request).should be_false
170
189
  end
190
+ end
191
+
192
+ context 'when the request is included in the :skip list' do
193
+ let(:csrf) { Rack::Csrf.new nil, :skip => ['POST:/hello'] }
171
194
 
172
- it 'should run the check when the request is included in the :check_only list' do
173
- @request.path_info = '/byebye'
174
- csrf.send(:skip_checking, @request).should be_false
195
+ it 'should not run the check' do
196
+ csrf.send(:skip_checking, request).should be_true
175
197
  end
176
198
  end
177
199
 
178
- context 'with the same routes in the :check_only and :skip lists' do
179
- let :csrf do
180
- Rack::Csrf.new nil,
181
- :skip => ['POST:/hello'],
182
- :check_only => ['POST:/hello']
200
+ context 'when the request is not included in the :skip list' do
201
+ context 'but the request satisfies the custom check' do
202
+ let(:csrf) { Rack::Csrf.new nil, :skip_if => lambda { |req| req.env.key?('HTTP_X_VERY_SPECIAL_HEADER') } }
203
+
204
+ it 'should not run the check' do
205
+ csrf.send(:skip_checking, request).should be_true
206
+ end
183
207
  end
184
208
 
185
- context 'when the request is included in one of the list' do
186
- it 'should ignore the :check_only list and skip the check' do
187
- csrf.send(:skip_checking, @request).should be_true
209
+ context 'and the request does not satisfies the custom check' do
210
+ context 'and the :check_only list is empty' do
211
+ let(:csrf) { Rack::Csrf.new nil, :check_only => [] }
212
+
213
+ it 'should run the check' do
214
+ csrf.send(:skip_checking, request).should be_false
215
+ end
216
+ end
217
+
218
+ context 'and the :check_only list is not empty' do
219
+ context 'and the request is included in the :check_only list' do
220
+ let(:csrf) { Rack::Csrf.new nil, :check_only => ['POST:/hello'] }
221
+
222
+ it 'should run the check' do
223
+ csrf.send(:skip_checking, request).should be_false
224
+ end
225
+ end
226
+
227
+ context 'but the request is not included in the :check_only list' do
228
+ let(:csrf) { Rack::Csrf.new nil, :check_only => ['POST:/ciao'] }
229
+
230
+ it 'should not run the check' do
231
+ csrf.send(:skip_checking, request).should be_true
232
+ end
233
+ end
188
234
  end
189
235
  end
190
236
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack_csrf
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 2
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 2.3.0
10
+ version: 2.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Emanuele Vicentini
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-23 00:00:00 Z
18
+ date: 2012-02-28 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: rack
22
21
  prerelease: false
22
+ type: :runtime
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
24
  none: false
25
25
  requirements:
@@ -30,28 +30,44 @@ dependencies:
30
30
  - 0
31
31
  - 9
32
32
  version: "0.9"
33
- type: :runtime
34
33
  version_requirements: *id001
34
+ name: rack
35
35
  - !ruby/object:Gem::Dependency
36
- name: cucumber
37
36
  prerelease: false
37
+ type: :development
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ">="
42
42
  - !ruby/object:Gem::Version
43
- hash: 1
43
+ hash: 23
44
44
  segments:
45
- - 0
46
45
  - 1
47
- - 13
48
- version: 0.1.13
49
- type: :development
46
+ - 0
47
+ - 0
48
+ version: 1.0.0
50
49
  version_requirements: *id002
50
+ name: bundler
51
51
  - !ruby/object:Gem::Dependency
52
- name: rack-test
53
52
  prerelease: false
53
+ type: :development
54
54
  requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 17
60
+ segments:
61
+ - 1
62
+ - 1
63
+ - 1
64
+ version: 1.1.1
65
+ version_requirements: *id003
66
+ name: cucumber
67
+ - !ruby/object:Gem::Dependency
68
+ prerelease: false
69
+ type: :development
70
+ requirement: &id004 !ruby/object:Gem::Requirement
55
71
  none: false
56
72
  requirements:
57
73
  - - ">="
@@ -60,12 +76,12 @@ dependencies:
60
76
  segments:
61
77
  - 0
62
78
  version: "0"
63
- type: :development
64
- version_requirements: *id003
79
+ version_requirements: *id004
80
+ name: rack-test
65
81
  - !ruby/object:Gem::Dependency
66
- name: rspec
67
82
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
83
+ type: :development
84
+ requirement: &id005 !ruby/object:Gem::Requirement
69
85
  none: false
70
86
  requirements:
71
87
  - - ">="
@@ -76,12 +92,12 @@ dependencies:
76
92
  - 0
77
93
  - 0
78
94
  version: 2.0.0
79
- type: :development
80
- version_requirements: *id004
95
+ version_requirements: *id005
96
+ name: rspec
81
97
  - !ruby/object:Gem::Dependency
82
- name: rdoc
83
98
  prerelease: false
84
- requirement: &id005 !ruby/object:Gem::Requirement
99
+ type: :development
100
+ requirement: &id006 !ruby/object:Gem::Requirement
85
101
  none: false
86
102
  requirements:
87
103
  - - ">="
@@ -92,8 +108,22 @@ dependencies:
92
108
  - 4
93
109
  - 2
94
110
  version: 2.4.2
111
+ version_requirements: *id006
112
+ name: rdoc
113
+ - !ruby/object:Gem::Dependency
114
+ prerelease: false
95
115
  type: :development
96
- version_requirements: *id005
116
+ requirement: &id007 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ hash: 3
122
+ segments:
123
+ - 0
124
+ version: "0"
125
+ version_requirements: *id007
126
+ name: jeweler
97
127
  description: Anti-CSRF Rack middleware
98
128
  email: emanuele.vicentini@gmail.com
99
129
  executables: []
@@ -106,6 +136,7 @@ extra_rdoc_files:
106
136
  files:
107
137
  - .rspec
108
138
  - Changelog.md
139
+ - Gemfile
109
140
  - LICENSE.rdoc
110
141
  - README.rdoc
111
142
  - Rakefile
@@ -150,6 +181,7 @@ files:
150
181
  - features/inspecting_also_get_requests.feature
151
182
  - features/raising_exception.feature
152
183
  - features/setup.feature
184
+ - features/skip_if_block_passes.feature
153
185
  - features/skip_some_routes.feature
154
186
  - features/step_definitions/request_steps.rb
155
187
  - features/step_definitions/response_steps.rb
@@ -157,6 +189,7 @@ files:
157
189
  - features/support/env.rb
158
190
  - features/support/fake_session.rb
159
191
  - features/variation_on_field_name.feature
192
+ - features/variation_on_header_name.feature
160
193
  - features/variation_on_key_name.feature
161
194
  - lib/rack/csrf.rb
162
195
  - lib/rack/vendor/securerandom.rb
@@ -171,7 +204,7 @@ rdoc_options:
171
204
  - --line-numbers
172
205
  - --inline-source
173
206
  - --title
174
- - Rack::Csrf 2.3.0
207
+ - Rack::Csrf 2.4.0
175
208
  - --main
176
209
  - README.rdoc
177
210
  require_paths:
@@ -197,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
230
  requirements: []
198
231
 
199
232
  rubyforge_project: rackcsrf
200
- rubygems_version: 1.8.11
233
+ rubygems_version: 1.8.17
201
234
  signing_key:
202
235
  specification_version: 3
203
236
  summary: Anti-CSRF Rack middleware