rack_csrf 2.4.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5063e661614ec782c33a22dc458d7f6a6d89be5a59c6c08297bc1cdc2f9675aa
4
+ data.tar.gz: 4b2b7c1208e605a314ddcb581268b32eb214bb791be52d7875bc37e2b1258abf
5
+ SHA512:
6
+ metadata.gz: 21e09bf5ee433e1c9feea3ed29de30e7ff05c3a3c9d6bca35b2feeea8c0686e203c4c4f01fdff11eee8029b4094f32f26a9965b6918e03e5137b5db0eaafd61d
7
+ data.tar.gz: fa1aaa6fa9002de2519566b07aeb542fc91a1f0824030db83f384f182971a36c9b78fbf463a09230f17f116d6d7cd2e1347f97a65102c801cd557dfd404e59f0
@@ -0,0 +1,30 @@
1
+ version: 2.1
2
+
3
+ jobs:
4
+ run_tests:
5
+ parameters:
6
+ ruby_version:
7
+ description: "Version of Ruby to run tests in"
8
+ type: string
9
+ rack_version:
10
+ description: "More or less the Rack version we want to test against"
11
+ type: string
12
+ environment:
13
+ TEST_WITH_RACK: << parameters.rack_version >>
14
+ docker:
15
+ - image: ruby:<< parameters.ruby_version >>
16
+ steps:
17
+ - checkout
18
+ - run: bundle install
19
+ - run: bundle exec rake spec
20
+ - run: bundle exec rake features
21
+
22
+ workflows:
23
+ version: 2
24
+ test:
25
+ jobs:
26
+ - run_tests:
27
+ matrix:
28
+ parameters:
29
+ ruby_version: ["2.7", "3.0", "3.1"]
30
+ rack_version: ["1.6.0", "2.1.0", "2.2.0", "3.0.0"]
@@ -0,0 +1,11 @@
1
+ version: 2
2
+
3
+ updates:
4
+ - package-ecosystem: "bundler"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ - package-ecosystem: "github-actions"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on:
4
+ - pull_request
5
+ - push
6
+ - workflow_dispatch
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ tests:
13
+ strategy:
14
+ matrix:
15
+ ruby_version:
16
+ - "2.7"
17
+ - "3.0"
18
+ - "3.1"
19
+ rack_version:
20
+ - "1.6.0"
21
+ - "2.1.0"
22
+ - "2.2.0"
23
+ - "3.0.0"
24
+ name: Ruby ~> ${{ matrix.ruby_version }}; Rack ~> ${{ matrix.rack_version }}
25
+ runs-on: ubuntu-latest
26
+ env:
27
+ TEST_WITH_RACK: ${{ matrix.rack_version }}
28
+ steps:
29
+ - uses: actions/checkout@v3
30
+ - uses: ruby/setup-ruby@v1
31
+ with:
32
+ ruby-version: ${{ matrix.ruby_version }}
33
+ bundler-cache: true
34
+ - run: bundle exec rake spec
35
+ - run: bundle exec rake features
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .bundle
2
+ .rvmrc
3
+ Gemfile.lock
4
+ doc
5
+ pkg
data/Changelog.md CHANGED
@@ -1,3 +1,31 @@
1
+ # v2.7.0 (2022-09-10)
2
+
3
+ Many little, negligible, changes, plus support for Rake 3 (courtesy of
4
+ [jeremyevans](https://github.com/jeremyevans) :trophy:)
5
+
6
+ # v2.6.0 (2016-12-31)
7
+
8
+ Many little, internal, changes; the important ones are:
9
+
10
+ * switched to use SecureRandom.urlsafe_base64 to make the token URL-friendly
11
+ (courtesy of [steved](https://github.com/steved));
12
+ * code is tested against Rack 1.4, 1.5, 1.6 and 2.0;
13
+ * code is tested only on Ruby 2.0.0 and later.
14
+
15
+
16
+
17
+ # v2.5.0 (2014-06-15)
18
+
19
+ * Fixed/improved the examples.
20
+ * Added basic Travis setup.
21
+ * Dropped support for Rack versions older than 1.1.0.
22
+ * Lazy generation of the CSRF token.
23
+ * Left Jeweler; totally embraced Bundler.
24
+ * Dropped support for Ruby 1.8.6.
25
+ * Fixed Cucumber's step for Ruby 1.8.*.
26
+
27
+
28
+
1
29
  # v2.4.0 (2012-02-28)
2
30
 
3
31
  * Updated examples' Gemfiles.
data/Gemfile CHANGED
@@ -1,12 +1,2 @@
1
- source 'http://rubygems.org'
2
-
3
- gem 'rack', '>= 0.9'
4
-
5
- group :development do
6
- gem 'bundler', '>= 1.0.0'
7
- gem 'cucumber', '>= 1.1.1'
8
- gem 'rack-test'
9
- gem 'rspec', '>= 2.0.0'
10
- gem 'rdoc', '>= 2.4.2'
11
- gem 'jeweler'
12
- end
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE.rdoc CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  (The MIT License)
4
4
 
5
- Copyright (c) 2009, 2010, 2011, 2012 Emanuele Vicentini
5
+ Copyright (c) 2009, 2010, 2011, 2012, 2014, 2016, 2022 Emanuele Vicentini
6
6
 
7
7
  Permission is hereby granted, free of charge, to any person obtaining a copy
8
8
  of this software and associated documentation files (the 'Software'), to deal
data/README.rdoc CHANGED
@@ -1,4 +1,4 @@
1
- = Rack::Csrf
1
+ = Rack::Csrf {<img src="https://circleci.com/gh/baldowl/rack_csrf.svg?style=svg" alt="CircleCI" />}[https://circleci.com/gh/baldowl/rack_csrf] {<img src="https://github.com/baldowl/rack_csrf/actions/workflows/ci.yml/badge.svg?branch=master" alt="Actions Status: CI" />}[https://github.com/baldowl/rack_csrf/actions?query=workflow%3ACI+branch%3Amaster] {<img src="https://badge.fury.io/rb/rack_csrf.svg" alt="Gem Version" />}[http://badge.fury.io/rb/rack_csrf]
2
2
 
3
3
  This is just a small Rack middleware whose only goal is to lessen the hazards
4
4
  posed by CSRF attacks by trying to ensure that all requests of particular
@@ -20,9 +20,6 @@ immediately replies with an empty response.
20
20
 
21
21
  The anti-forging token can be passed as a request parameter or a header.
22
22
 
23
- I have not tested Rack::Csrf with Rack 0.4.0 or earlier versions, but it could
24
- possibly work.
25
-
26
23
  == Options
27
24
 
28
25
  The following options allow you to tweak Rack::Csrf.
@@ -79,6 +76,9 @@ The following options allow you to tweak Rack::Csrf.
79
76
  This option is useful if a guarded resource can be accessed by clients who
80
77
  support CSRF token (e.g. browsers) and by ones who don't (e.g. API clients).
81
78
 
79
+ Don't try to check the CSRF token: it could exist or not at this stage and
80
+ you should always let it alone.
81
+
82
82
  Default value: empty.
83
83
 
84
84
  [<tt>:field</tt>]
@@ -154,6 +154,10 @@ token.
154
154
  Returns the name of the key used to store/retrieve the token from the Rack
155
155
  session.
156
156
 
157
+ Despite this class method, you should never try to retrieve the token with
158
+ code like <tt>env['rack.session'][Rack::Csrf.key]</tt>. See the `token`
159
+ method below.
160
+
157
161
  [<tt>Rack::Csrf.field</tt> (also <tt>Rack::Csrf.csrf_field</tt>)]
158
162
  Returns the name of the field that must be present in the request.
159
163
 
@@ -186,6 +190,14 @@ In the +examples+ directory there are some small, working web applications
186
190
  written with different Rack-based frameworks. They are named after the used
187
191
  framework; see the various README files for other details.
188
192
 
193
+ == Supported Rubies and Racks
194
+
195
+ The gemspec shows the minimum Ruby and Rack versions, but Rack::Csrf is
196
+ tested only with the Rubies and Racks you can see in
197
+ <tt>.circleci/config.yml</tt> and/or <tt>.github/workflows/ci.yml</tt>. It
198
+ could work also with older versions, but I decided not to test it against
199
+ unsupported Rubies and Racks.
200
+
189
201
  == Contributing
190
202
 
191
203
  If you want to help:
@@ -208,5 +220,5 @@ forgo responsibilities for keeping your application as safe as possible.
208
220
 
209
221
  == Copyright
210
222
 
211
- Copyright (c) 2009, 2010, 2011, 2012 Emanuele Vicentini. See LICENSE.rdoc for
212
- details.
223
+ Copyright (c) 2009, 2010, 2011, 2012, 2014, 2016, 2022 Emanuele Vicentini.
224
+ See LICENSE.rdoc for details.
data/Rakefile CHANGED
@@ -1,62 +1,40 @@
1
1
  require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
2
+ require 'bundler/setup'
10
3
 
11
4
  require 'rake/clean'
12
- require 'cucumber/rake/task'
13
- require 'rspec/core/rake_task'
14
- require 'rdoc/task'
15
- require 'jeweler'
16
5
 
6
+ require 'cucumber/rake/task'
17
7
  Cucumber::Rake::Task.new :features
18
8
  task :default => :features
19
9
 
10
+ require 'rspec/core/rake_task'
20
11
  RSpec::Core::RakeTask.new :spec
21
12
  task :default => :spec
22
13
 
23
- version = File.exists?('VERSION') ? File.read('VERSION').strip : ''
14
+ require 'rack/csrf/version'
24
15
 
16
+ require 'rdoc/task'
25
17
  RDoc::Task.new :doc do |rdoc|
26
18
  rdoc.rdoc_dir = 'doc'
27
- rdoc.title = "Rack::Csrf #{version}"
19
+ rdoc.title = "Rack::Csrf #{Rack::Csrf::VERSION}"
28
20
  rdoc.main = 'README.rdoc'
29
21
  rdoc.rdoc_files.include('README.rdoc', 'LICENSE.rdoc')
30
22
  rdoc.rdoc_files.include('lib/**/*.rb')
31
23
  end
32
24
 
33
- Jeweler::Tasks.new do |gem|
34
- gem.name = 'rack_csrf'
35
- gem.summary = 'Anti-CSRF Rack middleware'
36
- gem.description = 'Anti-CSRF Rack middleware'
37
- gem.license = 'MIT'
38
- gem.authors = 'Emanuele Vicentini'
39
- gem.email = 'emanuele.vicentini@gmail.com'
40
- gem.homepage = 'https://github.com/baldowl/rack_csrf'
41
- gem.rubyforge_project = 'rackcsrf'
42
- # dependencies defined in Gemfile
43
- gem.rdoc_options << '--line-numbers' << '--inline-source' << '--title' <<
44
- "Rack::Csrf #{version}" << '--main' << 'README.rdoc'
45
- gem.test_files.clear
46
- end
47
-
48
- Jeweler::GemcutterTasks.new
25
+ require 'bundler/gem_tasks'
49
26
 
27
+ require 'git'
50
28
  desc <<-EOD
51
29
  Shows the changelog in Git between the given points.
52
30
 
53
31
  start -- defaults to the current version tag
54
32
  end -- defaults to HEAD
55
33
  EOD
56
- task :changes, [:start, :end] do |t, args|
57
- args.with_defaults :start => "v#{Rake.application.jeweler.version}",
34
+ task :changes, [:start, :end] do |_, args|
35
+ args.with_defaults :start => "v#{Rack::Csrf::VERSION}",
58
36
  :end => 'HEAD'
59
- repo = Git.open Rake.application.jeweler.git_base_dir
37
+ repo = Git.open Dir.pwd
60
38
  repo.log(nil).between(args.start, args.end).each do |c|
61
39
  puts c.message.split($/).first
62
40
  end
@@ -1,4 +1,6 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
+ gem 'rack_csrf', :path => File.expand_path('../../..', __FILE__)
4
+ gem 'rack', '~> 1.4.0'
3
5
  gem 'camping', '>= 2.1', '<= 2.1.467'
4
6
  gem 'markaby', '>= 0.7.1', '<= 0.7.2'
@@ -1,14 +1,12 @@
1
1
  require 'camping'
2
2
  require 'camping/session'
3
-
4
- $: << File.join(File.dirname(__FILE__), '../../lib')
5
3
  require 'rack/csrf'
6
4
 
7
5
  Camping.goes :LittleApp
8
6
 
9
7
  module LittleApp
10
8
  use Rack::Csrf # This has to come BEFORE 'include Camping::Session',
11
- # otherwise you get the 'Rack::Csrf depends on session
9
+ # otherwise you get the 'Rack::Csrf depends on session
12
10
  # middleware' exception. Weird...
13
11
  include Camping::Session
14
12
 
@@ -1,3 +1,4 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
+ gem 'rack_csrf', :path => File.expand_path('../../..', __FILE__)
3
4
  gem 'cuba', '>= 2.1.0', '<= 2.2.1'
data/examples/cuba/app.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  Cuba.define do
2
2
  on get do
3
+ res['Content-Type'] = 'text/html'
4
+
3
5
  on '' do
4
6
  res.write render('views/form.erb')
5
7
  end
@@ -1,11 +1,10 @@
1
1
  require 'cuba'
2
- $: << File.join(File.dirname(__FILE__), '../../lib')
3
2
  require 'rack/csrf'
4
3
 
5
4
  Cuba.use Rack::ShowExceptions
6
5
  Cuba.use Rack::Session::Cookie
7
6
  Cuba.use Rack::Csrf, :raise => true
8
7
 
9
- require 'app'
8
+ require './app'
10
9
 
11
10
  run Cuba
@@ -1,10 +1,9 @@
1
1
  require 'cuba'
2
- $: << File.join(File.dirname(__FILE__), '../../lib')
3
2
  require 'rack/csrf'
4
3
 
5
4
  Cuba.use Rack::Session::Cookie
6
5
  Cuba.use Rack::Csrf
7
6
 
8
- require 'app'
7
+ require './app'
9
8
 
10
9
  run Cuba
@@ -1,3 +1,4 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
+ gem 'rack_csrf', :path => File.expand_path('../../..', __FILE__)
3
4
  gem 'innate', '>= 2009.07', '<= 2011.12'
@@ -1,10 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'innate'
3
-
4
- $: << File.join(File.dirname(__FILE__), '../../lib')
5
3
  require 'rack/csrf'
6
4
 
7
- require 'app'
5
+ require './app'
8
6
 
9
7
  Innate.start do |m|
10
8
  m.use Rack::ShowExceptions
@@ -1,10 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'innate'
3
-
4
- $: << File.join(File.dirname(__FILE__), '../../lib')
5
3
  require 'rack/csrf'
6
4
 
7
- require 'app'
5
+ require './app'
8
6
 
9
7
  Innate.start do |m|
10
8
  m.use Rack::Session::Cookie
@@ -1,3 +1,4 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gem 'rack', '>= 1.0.0', '<= 1.4.1'
3
+ gem 'rack_csrf', :path => File.expand_path('../../..', __FILE__)
4
+ gem 'rack', '<= 1.5.2'
data/examples/rack/app.rb CHANGED
@@ -30,16 +30,21 @@ class LittleApp
30
30
 
31
31
  def self.call env
32
32
  req = Rack::Request.new env
33
+ res = Rack::Response.new
34
+
33
35
  if req.get?
34
36
  if req.path_info == '/notworking'
35
- Rack::Response.new(@form_not_working.result(binding)).finish
37
+ res.write @form_not_working.result(binding)
36
38
  else
37
- Rack::Response.new(@form.result(binding)).finish
39
+ res.write @form.result(binding)
38
40
  end
39
41
  elsif req.post?
40
42
  utterance = req['utterance']
41
43
  csrf = req[Rack::Csrf.field]
42
- Rack::Response.new(@response.result(binding)).finish
44
+ res.write @response.result(binding)
43
45
  end
46
+
47
+ res['Content-Type'] = 'text/html'
48
+ res.finish
44
49
  end
45
50
  end
@@ -1,8 +1,7 @@
1
- $: << File.join(File.dirname(__FILE__), '../../lib')
2
1
  require 'rack/csrf'
3
2
 
4
3
  require 'erb'
5
- require 'app'
4
+ require './app'
6
5
 
7
6
  use Rack::ShowExceptions
8
7
  use Rack::Session::Cookie
@@ -1,8 +1,7 @@
1
- $: << File.join(File.dirname(__FILE__), '../../lib')
2
1
  require 'rack/csrf'
3
2
 
4
3
  require 'erb'
5
- require 'app'
4
+ require './app'
6
5
 
7
6
  use Rack::Session::Cookie
8
7
  use Rack::Csrf
@@ -1,3 +1,4 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
- gem 'sinatra', '>= 0.9.4', '<= 1.3.2'
3
+ gem 'rack_csrf', :path => File.expand_path('../../..', __FILE__)
4
+ gem 'sinatra', '>= 0.9.4', '<= 1.4.4'
@@ -7,6 +7,8 @@ get '/notworking' do
7
7
  end
8
8
 
9
9
  post '/response' do
10
- erb :response, :locals => {:utterance => params[:utterance],
11
- :csrf => params[Rack::Csrf.field]}
10
+ erb :response, :locals => {
11
+ :utterance => params[:utterance],
12
+ :csrf => params[Rack::Csrf.field]
13
+ }
12
14
  end
@@ -1,14 +1,11 @@
1
1
  require 'sinatra'
2
- $: << File.join(File.dirname(__FILE__), '../../lib')
3
2
  require 'rack/csrf'
4
3
 
5
4
  require 'erb'
6
- require 'app'
5
+ require './app'
7
6
 
8
7
  use Rack::ShowExceptions
9
8
  use Rack::Session::Cookie
10
9
  use Rack::Csrf, :raise => true
11
10
 
12
- set :app_file, 'app.rb'
13
-
14
11
  run Sinatra::Application
@@ -1,13 +1,10 @@
1
1
  require 'sinatra'
2
- $: << File.join(File.dirname(__FILE__), '../../lib')
3
2
  require 'rack/csrf'
4
3
 
5
4
  require 'erb'
6
- require 'app'
5
+ require './app'
7
6
 
8
7
  use Rack::Session::Cookie
9
8
  use Rack::Csrf
10
9
 
11
- set :app_file, 'app.rb'
12
-
13
10
  run Sinatra::Application
@@ -4,7 +4,7 @@
4
4
  When /^it receives a (.*) request without the CSRF (?:token|header)$/ do |http_method|
5
5
  begin
6
6
  @browser.request '/', :method => http_method
7
- rescue Exception => e
7
+ rescue StandardError => e
8
8
  @exception = e
9
9
  end
10
10
  end
@@ -12,7 +12,7 @@ end
12
12
  When /^it receives a (.*) request for (.+) without the CSRF (?:token|header|token or header)$/ do |http_method, path|
13
13
  begin
14
14
  @browser.request path, :method => http_method
15
- rescue Exception => e
15
+ rescue StandardError => e
16
16
  @exception = e
17
17
  end
18
18
  end
@@ -34,7 +34,7 @@ When /^it receives a (.*) request with the wrong CSRF token$/ do |http_method|
34
34
  @browser.request '/', :method => http_method,
35
35
  'rack.session' => {Rack::Csrf.key => 'right_token'},
36
36
  :params => {Rack::Csrf.field => 'wrong_token'}
37
- rescue Exception => e
37
+ rescue StandardError => e
38
38
  @exception = e
39
39
  end
40
40
  end
@@ -43,7 +43,7 @@ When /^it receives a (.*) request with the wrong CSRF header/ do |http_method|
43
43
  begin
44
44
  @browser.request '/', :method => http_method,
45
45
  Rack::Csrf.rackified_header => 'right_token'
46
- rescue Exception => e
46
+ rescue StandardError => e
47
47
  @exception = e
48
48
  end
49
49
  end
@@ -51,7 +51,7 @@ end
51
51
  When /^it receives a (.*) request with neither PATH_INFO nor CSRF token or header$/ do |http_method|
52
52
  begin
53
53
  @browser.request '/doesntmatter', :method => http_method, 'PATH_INFO' => ''
54
- rescue Exception => e
54
+ rescue StandardError => e
55
55
  @exception = e
56
56
  end
57
57
  end
@@ -59,7 +59,7 @@ end
59
59
  When /^it receives a request with headers (.+) = ([^ ]+) without the CSRF token or header$/ do |name, value|
60
60
  begin
61
61
  @browser.request '/', Hash[:method, 'POST', name, value]
62
- rescue Exception => e
62
+ rescue StandardError => e
63
63
  @exception = e
64
64
  end
65
65
  end
@@ -67,7 +67,7 @@ end
67
67
  When /^it receives a request with headers (.+) = ([^,]+), (.+), and without the CSRF token or header$/ do |name, value, method|
68
68
  begin
69
69
  @browser.request '/', Hash[:method, method, name, value]
70
- rescue Exception => e
70
+ rescue StandardError => e
71
71
  @exception = e
72
72
  end
73
73
  end
@@ -1,14 +1,14 @@
1
1
  Then /^it lets it pass untouched$/ do
2
- @browser.last_response.should be_ok
3
- @browser.last_response.should =~ /Hello world!/
2
+ expect(@browser.last_response).to be_ok
3
+ expect(@browser.last_response).to match(/Hello world!/)
4
4
  end
5
5
 
6
6
  Then /^it responds with (\d\d\d)$/ do |code|
7
- @browser.last_response.status.should == code.to_i
7
+ expect(@browser.last_response.status).to eq(code.to_i)
8
8
  end
9
9
 
10
10
  Then /^the response body is empty$/ do
11
- @browser.last_response.body.should be_empty
11
+ expect(@browser.last_response.body).to be_empty
12
12
  end
13
13
 
14
14
  Then /^there is no response$/ do
@@ -16,5 +16,5 @@ Then /^there is no response$/ do
16
16
  end
17
17
 
18
18
  Then /^an exception is climbing up the stack$/ do
19
- @exception.should be_an_instance_of(Rack::Csrf::InvalidCsrfToken)
19
+ expect(@exception).to be_an_instance_of(Rack::Csrf::InvalidCsrfToken)
20
20
  end
@@ -73,29 +73,35 @@ When /^I insert the anti\-CSRF middleware with the :raise option$/ do
73
73
  end
74
74
 
75
75
  When /^I insert the anti\-CSRF middleware with the :skip option$/ do |table|
76
- skippable = table.hashes.collect {|t| t.values}.flatten
76
+ skippable = table.hashes.collect(&:values).flatten
77
77
  @rack_builder.use Rack::Csrf, :skip => skippable
78
78
  @app = toy_app
79
79
  @browser = Rack::Test::Session.new(Rack::MockSession.new(@app))
80
80
  end
81
81
 
82
82
  When /^I insert the anti\-CSRF middleware with the :skip_if option$/ do |table|
83
- skippable = table.hashes.collect {|t| t.values}
84
- @rack_builder.use Rack:: Csrf, :skip_if => Proc.new { |request|
83
+ skippable = {}
84
+ table.hashes.each {|row| skippable[row['name']] = row['value']}
85
+ skip_logic = Proc.new do |request|
85
86
  skippable.any? { |name, value| request.env[name] == value }
86
- }
87
+ end
88
+ @rack_builder.use Rack:: Csrf, :skip_if => skip_logic
87
89
  @app = toy_app
88
90
  @browser = Rack::Test::Session.new(Rack::MockSession.new(@app))
89
91
  end
90
92
 
91
93
  When /^I insert the anti\-CSRF middleware with the :skip and :skip_if options$/ do |table|
92
- data = table.hashes.collect {|t| t.values}[0]
93
- headers = data[0..1]
94
- skippable = data[2]
95
-
96
- @rack_builder.use Rack:: Csrf, :skip => [skippable], :skip_if => Proc.new { |request|
97
- skippable.any? { |name, value| request.env[name] == value }
98
- }
94
+ skip_option_arguments = []
95
+ skip_if_option_arguments = {}
96
+ table.hashes.each do |row|
97
+ skip_option_arguments << row['path']
98
+ skip_if_option_arguments[row['name']] = row['value']
99
+ end
100
+ skip_if_logic = Proc.new do |request|
101
+ skip_if_option_arguments.any? { |name, value| request.env[name] == value }
102
+ end
103
+ @rack_builder.use Rack::Csrf, :skip => skip_option_arguments,
104
+ :skip_if => skip_if_logic
99
105
  @app = toy_app
100
106
  @browser = Rack::Test::Session.new(Rack::MockSession.new(@app))
101
107
  end
@@ -119,14 +125,14 @@ When /^I insert the anti\-CSRF middleware with the :header option$/ do
119
125
  end
120
126
 
121
127
  When /^I insert the anti\-CSRF middleware with the :check_also option$/ do |table|
122
- check_also = table.hashes.collect {|t| t.values}.flatten
128
+ check_also = table.hashes.collect(&:values).flatten
123
129
  @rack_builder.use Rack::Csrf, :check_also => check_also
124
130
  @app = toy_app
125
131
  @browser = Rack::Test::Session.new(Rack::MockSession.new(@app))
126
132
  end
127
133
 
128
134
  When /^I insert the anti\-CSRF middleware with the :check_only option$/ do |table|
129
- must_be_checked = table.hashes.collect {|t| t.values}.flatten
135
+ must_be_checked = table.hashes.collect(&:values).flatten
130
136
  @rack_builder.use Rack::Csrf, :check_only => must_be_checked
131
137
  @app = toy_app
132
138
  @browser = Rack::Test::Session.new(Rack::MockSession.new(@app))
@@ -143,6 +149,6 @@ Then /^I get an error message$/ do
143
149
  end
144
150
 
145
151
  def toy_app
146
- @rack_builder.run(lambda {|env| Rack::Response.new('Hello world!').finish})
152
+ @rack_builder.run(lambda {|_| Rack::Response.new('Hello world!').finish})
147
153
  @rack_builder.to_app
148
154
  end
@@ -3,3 +3,5 @@ require 'rspec'
3
3
  require 'rack/test'
4
4
 
5
5
  require 'rack/csrf'
6
+ require 'rack/builder'
7
+ require 'rack/lint'