rack-cleancookies 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/rack.rb +1 -0
  2. data/lib/rack/cleancookies.rb +58 -0
  3. metadata +94 -0
@@ -0,0 +1 @@
1
+ require 'rack/cleancookies'
@@ -0,0 +1,58 @@
1
+ # Rack middleware that drops non properly encoded cookies that would hurt the ActionDispatch::Cookies middleware.
2
+ #
3
+ # This is actually a hotfix for issues
4
+ # * https://github.com/rack/rack/issues/225
5
+ # * https://github.com/rails/rails/issues/2622
6
+ module Rack
7
+ module CleanCookies
8
+ # Tests whether a string may be decoded as a form component
9
+ def decodable?(string)
10
+ URI.decode_www_form_component(string)
11
+ true
12
+ rescue ArgumentError => e
13
+ /^invalid %-encoding \(.*\)$/.match(e.message) ? false : raise
14
+ end
15
+
16
+ module_function :decodable?
17
+
18
+ # Tests whether a cookie is clean, that is its key and value may be decoded as a form components
19
+ def clean?(cookie)
20
+ key, value = cookie.split('=', 2)
21
+ decodable?(key) && decodable?(value)
22
+ end
23
+
24
+ module_function :clean?
25
+
26
+ class Middleware
27
+ def initialize(app)
28
+ @app = app
29
+ end
30
+
31
+ def call(env)
32
+ if env['HTTP_COOKIE']
33
+ clean_cookies, dirty_cookies = [], []
34
+
35
+ # Split cookies into clean and dirty
36
+ env['HTTP_COOKIE'].split(/[;,] */n).each do |cookie|
37
+ if CleanCookies::clean?(cookie)
38
+ clean_cookies << cookie
39
+ else
40
+ dirty_cookies << cookie
41
+ end
42
+ end
43
+
44
+ # Keep only clean cookies
45
+ env['HTTP_COOKIE'] = clean_cookies.join('; ')
46
+
47
+ # Inform about dropped dirty cookies
48
+ unless dirty_cookies.empty?
49
+ env['rack.errors'].puts "Ignoring dirty cookies: #{dirty_cookies.inspect}"
50
+ end
51
+ end
52
+
53
+ # Carry on
54
+ @app.call(env)
55
+ end
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-cleancookies
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Moreno Carullo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rack
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: test-unit
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description:
63
+ email:
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - lib/rack.rb
69
+ - lib/rack/cleancookies.rb
70
+ homepage: https://github.com/morenocarullo/rack-cleancookies
71
+ licenses: []
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 1.8.24
91
+ signing_key:
92
+ specification_version: 3
93
+ summary: Clean dirty cookies from Rack environment
94
+ test_files: []