safe_cookies 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MTlmZjRlYWYyZDJmZjZmOTZhNDcyNGFhZDMyODE0Nzk3YTRmN2I3ZA==
4
+ MjI5NWM4ZWE1M2UzNWFjNjFkNzc2M2EzN2U4NzJhZTgzNjQ0NmQ1NQ==
5
5
  data.tar.gz: !binary |-
6
- MGY4OGY1Mjk1OGNiNDViZDA3Yjk2NTdkM2UzMGI0ZWUyMTZkYzQ4MA==
6
+ OGNlMjkzMmI2MTFhZTFlNzA3MDZmMmYxOWQ3YmQ1ZGE4Njg0OWZlOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- M2FmYjk3YjYxYTA1MWQ0MmIzYzMzMDcwNzE5NGMzYTc2MGM0ZmZiNTBjMmI5
10
- MzU5MzEwNjE0OTY4M2Q2ZWEzYjQxZGRiYmVlMTE2YmY5YjZjYTYwM2EyMTcz
11
- ZDBhNTRiMTE4N2ExYWIzNjhhMDIyOWQzMmZhOWRjYjkyNjQ5MjQ=
9
+ MjU5MGUyMzQyNTI2MzE5OTkzYjBkOTI4NjQ1ZjQxOTk4NGQzOTkxMDEyNDk3
10
+ YmQ3YjJjZDBhYTU3ZjBhNzgzMGYwNzdmNzcyZTFmYWY1NzQ0N2RhZDUyYzA1
11
+ NjJlZDc4NjdiMWU2M2NhOWY5YzBmNWFkNWNmY2Y1OTgxNjI1YjQ=
12
12
  data.tar.gz: !binary |-
13
- MGVkY2ZhM2UzNmYyMDhlYjBiZGE4Y2Q3MjM3MzU3MTFmZTJmMzg2YTJkYTY4
14
- MjBkYWZjYzk1MjRkYzljYWMwNGRkYWE4OTIzMjRhYjc3ZWYxZDY4MjJmZmVm
15
- NWQyYTk4ZTZhNjA1YWY0YjFiMmI3NWMxZjI2MTEyYmI3YzM3MjI=
13
+ Yjg4YTA3OGYyY2RhYmJkZTAyYmNiNjE2ZGRjNTc4MTA0NDJjMTc1ZjA3Mjcy
14
+ MjFhYjlhOGY1ZjQyYTE3OTEzODE3ZmU3YmE5YzIxOTNhOWE4NTg5M2M3ZTk4
15
+ ZWMzMzVmODk4MWE3MDdjN2RkZjI1N2UwN2EyOTVlNmM0MmMwMjk=
@@ -36,10 +36,11 @@ module SafeCookies
36
36
  # :path => '/foo/path'
37
37
  #
38
38
  def register_cookie(name, options)
39
+ name.is_a?(String) or raise "Cookie name must be a String"
39
40
  options.has_key?(:expire_after) or raise MissingOptionError.new("Cookie #{name.inspect} was registered without an expiry")
40
41
  raise NotImplementedError if options.has_key?(:domain)
41
42
 
42
- registered_cookies[name.to_s] = (options || {}).freeze
43
+ registered_cookies[name] = (options || {}).freeze
43
44
  insecure_cookies << name if options[:secure] == false
44
45
  scriptable_cookies << name if options[:http_only] == false
45
46
  end
@@ -1,6 +1,6 @@
1
1
  module SafeCookies
2
2
  module CookiePathFix
3
-
3
+
4
4
  # Previously, the SafeCookies gem would not set a path when rewriting
5
5
  # cookies. Browsers then would assume and store the current "directory",
6
6
  # leading to multiple cookies per domain.
@@ -10,25 +10,25 @@ module SafeCookies
10
10
  # SECURED_COOKIE_NAME helper cookie.
11
11
  # The middleware still sees the request cookies and will rewrite them as
12
12
  # if it hadn't seen them before.
13
-
13
+
14
14
  def fix_cookie_paths
15
15
  registered_cookies_in_request.keys.each do |registered_cookie|
16
16
  delete_cookie_for_current_directory(registered_cookie)
17
17
  end
18
18
  delete_cookie_for_current_directory(SafeCookies::SECURED_COOKIE_NAME)
19
-
19
+
20
20
  # Delete this cookie here, so the middleware will secure all cookies anew.
21
- @request.cookies.delete(SafeCookies::SECURED_COOKIE_NAME)
21
+ request_cookies.delete(SafeCookies::SECURED_COOKIE_NAME)
22
22
  end
23
-
23
+
24
24
  private
25
-
25
+
26
26
  def fix_cookie_paths?
27
27
  @configuration.fix_cookie_paths or return false
28
-
28
+
29
29
  cookies_need_path_fix = (secured_old_cookies_timestamp < @configuration.correct_cookie_paths_timestamp)
30
30
 
31
- cookies_have_been_rewritten_before and cookies_need_path_fix
31
+ cookies_have_been_rewritten_before? and cookies_need_path_fix
32
32
  end
33
33
 
34
34
  # Delete cookies by giving them an expiry in the past,
@@ -44,21 +44,24 @@ module SafeCookies
44
44
  # However, Firefox includes the right-most slash when guessing the cookie path,
45
45
  # so we must resort to letting browsers estimate the deletion cookie path again.
46
46
  def delete_cookie_for_current_directory(cookie_name)
47
- current_directory_is_not_root = @request.path[%r(^/[^/]+/[^\?]+), 0]
48
-
49
- if current_directory_is_not_root
47
+ unless current_directory_is_root?
50
48
  one_week = (7 * 24 * 60 * 60)
51
49
  set_cookie!(cookie_name, "", :path => nil, :expire_after => -one_week)
52
50
  end
53
51
  end
54
-
52
+
53
+ def current_directory_is_root?
54
+ !@request.path[%r(^/[^/]+/[^\?]+), 0] # roughly: "there are not three slashes"
55
+ end
56
+
55
57
  def secured_old_cookies_timestamp
56
- Time.rfc2822(@request.cookies[SafeCookies::SECURED_COOKIE_NAME])
58
+ Time.rfc2822(request_cookies[SafeCookies::SECURED_COOKIE_NAME])
57
59
  rescue ArgumentError
58
60
  # If we cannot parse the secured_old_cookies time,
59
61
  # assume it was before we noticed the bug to ensure
60
62
  # broken cookie paths will be fixed.
61
63
  Time.parse "2013-08-25 0:00"
62
64
  end
65
+
63
66
  end
64
- end
67
+ end
@@ -0,0 +1,96 @@
1
+ module SafeCookies
2
+ module Helpers
3
+
4
+ KNOWN_COOKIES_DIVIDER = '|'
5
+
6
+ def cache_application_cookies_string
7
+ cookies = @headers['Set-Cookie']
8
+ # Rack 1.1 returns an Array
9
+ cookies = cookies.join("\n") if cookies.is_a?(Array)
10
+
11
+ if cookies and cookies.length > 0
12
+ @application_cookies = cookies
13
+ end
14
+ end
15
+
16
+ def secure(cookie)
17
+ # Regexp from https://github.com/tobmatth/rack-ssl-enforcer/
18
+ if should_be_secure?(cookie) and cookie !~ /(^|;\s)secure($|;)/
19
+ "#{cookie}; secure"
20
+ else
21
+ cookie
22
+ end
23
+ end
24
+
25
+ def http_only(cookie)
26
+ if should_be_http_only?(cookie) and cookie !~ /(^|;\s)HttpOnly($|;)/
27
+ "#{cookie}; HttpOnly"
28
+ else
29
+ cookie
30
+ end
31
+ end
32
+
33
+ def set_cookie!(name, value, options)
34
+ options = options.dup
35
+ expire_after = options.delete(:expire_after)
36
+
37
+ options[:expires] = Time.now + expire_after if expire_after
38
+ options[:path] = '/' unless options.has_key?(:path) # allow setting path = nil
39
+ options[:value] = value
40
+ options[:secure] = should_be_secure?(name)
41
+ options[:httponly] = should_be_http_only?(name)
42
+
43
+ Rack::Utils.set_cookie_header!(@headers, name, options)
44
+ end
45
+
46
+
47
+ # getters
48
+
49
+ def stored_application_cookie_names
50
+ store_cookie = request_cookies[STORE_COOKIE_NAME] || ""
51
+ store_cookie.split(KNOWN_COOKIES_DIVIDER)
52
+ end
53
+
54
+ # returns those of the registered cookies that appear in the request
55
+ def registered_cookies_in_request
56
+ Util.slice(@configuration.registered_cookies, *request_cookies.keys)
57
+ end
58
+
59
+ def known_cookie_names
60
+ known = [STORE_COOKIE_NAME, SECURED_COOKIE_NAME]
61
+ known += stored_application_cookie_names
62
+ known += @configuration.registered_cookies.keys
63
+ end
64
+
65
+ def request_cookies
66
+ @request.cookies
67
+ end
68
+
69
+
70
+ # boolean
71
+
72
+ def cookies_have_been_rewritten_before?
73
+ request_cookies.has_key? SECURED_COOKIE_NAME
74
+ end
75
+
76
+ def should_be_secure?(cookie)
77
+ cookie_name = cookie.split('=').first.strip
78
+ ssl? and not @configuration.insecure_cookie?(cookie_name)
79
+ end
80
+
81
+ def ssl?
82
+ if @request.respond_to?(:ssl?)
83
+ @request.ssl?
84
+ else
85
+ # older Rack versions
86
+ @request.scheme == 'https'
87
+ end
88
+ end
89
+
90
+ def should_be_http_only?(cookie)
91
+ cookie_name = cookie.split('=').first.strip
92
+ not @configuration.scriptable_cookie?(cookie_name)
93
+ end
94
+
95
+ end
96
+ end
@@ -1,3 +1,3 @@
1
1
  module SafeCookies
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
data/lib/safe_cookies.rb CHANGED
@@ -1,23 +1,31 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require "safe_cookies/configuration"
3
3
  require "safe_cookies/cookie_path_fix"
4
+ require "safe_cookies/helpers"
4
5
  require "safe_cookies/util"
5
6
  require "safe_cookies/version"
6
7
  require "rack"
7
8
 
9
+ # Naming:
10
+ # - application_cookies: cookies received from the application. The 'Set-Cookie' header is a string
11
+ # - request_cookies: cookies received from the client. Rack::Request#cookies returns a Hash of { 'name' => 'value' }
12
+ # - response_cookies: cookies to be sent to the client
13
+ # (= application_cookies + any cookies set in the middleware)
14
+
8
15
  module SafeCookies
9
16
 
10
17
  UnknownCookieError = Class.new(StandardError)
11
18
 
12
- CACHE_COOKIE_NAME = '_safe_cookies__known_cookies'
19
+ STORE_COOKIE_NAME = '_safe_cookies__known_cookies'
13
20
  SECURED_COOKIE_NAME = 'secured_old_cookies'
14
21
  HELPER_COOKIES_LIFETIME = 10 * 365 * 24 * 60 * 60 # 10 years
15
22
 
16
23
  class Middleware
17
24
 
18
25
  include CookiePathFix
26
+ include Helpers
19
27
 
20
- KNOWN_COOKIES_DIVIDER = '|'
28
+ COOKIE_NAME_REGEX = /(?=^|\n)[^\n;,=]+/i
21
29
 
22
30
 
23
31
  def initialize(app)
@@ -29,14 +37,16 @@ module SafeCookies
29
37
  reset_instance_variables
30
38
 
31
39
  @request = Rack::Request.new(env)
32
- ensure_no_unknown_cookies!
40
+ ensure_no_unknown_cookies_in_request!
33
41
 
34
42
  status, @headers, body = @app.call(env)
35
-
36
- fix_cookie_paths if fix_cookie_paths?
37
- rewrite_request_cookies unless cookies_have_been_rewritten_before
38
- cache_application_cookies
43
+ cache_application_cookies_string
44
+
45
+ remove_application_cookies_from_request_cookies
39
46
  rewrite_application_cookies
47
+ store_application_cookie_names
48
+ fix_cookie_paths if fix_cookie_paths?
49
+ rewrite_request_cookies unless cookies_have_been_rewritten_before?
40
50
 
41
51
  [ status, @headers, body ]
42
52
  end
@@ -44,63 +54,31 @@ module SafeCookies
44
54
  private
45
55
 
46
56
  def reset_instance_variables
47
- @request, @headers = nil
57
+ @request, @headers, @application_cookies = nil
48
58
  end
49
59
 
50
- def secure(cookie)
51
- # Regexp from https://github.com/tobmatth/rack-ssl-enforcer/
52
- if should_be_secure?(cookie) and cookie !~ /(^|;\s)secure($|;)/
53
- "#{cookie}; secure"
54
- else
55
- cookie
60
+ def ensure_no_unknown_cookies_in_request!
61
+ request_cookie_names = request_cookies.keys.map(&:to_s)
62
+ unknown_cookie_names = request_cookie_names - known_cookie_names
63
+
64
+ if unknown_cookie_names.any?
65
+ handle_unknown_cookies(unknown_cookie_names)
56
66
  end
57
67
  end
58
68
 
59
- def http_only(cookie)
60
- if should_be_http_only?(cookie) and cookie !~ /(^|;\s)HttpOnly($|;)/
61
- "#{cookie}; HttpOnly"
62
- else
63
- cookie
64
- end
65
- end
66
-
67
- # This method takes all cookies sent with the request and rewrites them,
68
- # making them both secure and http-only (unless specified otherwise in
69
- # the configuration).
70
- # With the SECURED_COOKIE_NAME cookie we remember the exact time that we
71
- # rewrote the cookies.
72
- def rewrite_request_cookies
73
- if @request.cookies.any?
74
- registered_cookies_in_request.each do |registered_cookie, options|
75
- value = @request.cookies[registered_cookie]
76
-
77
- set_cookie!(registered_cookie, value, options)
69
+ def remove_application_cookies_from_request_cookies
70
+ if @application_cookies
71
+ application_cookie_names = @application_cookies.scan(COOKIE_NAME_REGEX)
72
+ application_cookie_names.each do |cookie|
73
+ request_cookies.delete(cookie)
78
74
  end
79
-
80
- formatted_now = Rack::Utils.rfc2822(Time.now.gmtime)
81
- set_cookie!(SECURED_COOKIE_NAME, formatted_now, :expire_after => HELPER_COOKIES_LIFETIME)
82
75
  end
83
76
  end
84
77
 
85
- def set_cookie!(name, value, options)
86
- options = options.dup
87
- expire_after = options.delete(:expire_after)
88
-
89
- options[:expires] = Time.now + expire_after if expire_after
90
- options[:path] = '/' unless options.has_key?(:path) # allow setting path = nil
91
- options[:value] = value
92
- options[:secure] = should_be_secure?(name)
93
- options[:httponly] = should_be_http_only?(name)
94
-
95
- Rack::Utils.set_cookie_header!(@headers, name, options)
96
- end
97
-
98
78
  def rewrite_application_cookies
99
- cookies = @headers['Set-Cookie']
100
- if cookies
101
- # Rails 2.3 / Rack 1.1 offers an array which is actually nice.
102
- cookies = cookies.split("\n") unless cookies.is_a?(Array)
103
-
79
+ if @application_cookies
80
+ cookies = @application_cookies.split("\n")
81
+
104
82
  # On Rack 1.1, cookie values sometimes contain trailing newlines.
105
83
  # Example => ["foo=1; path=/\n", "bar=2; path=/"]
106
84
  # Note that they also mess up browsers, when this array is merged
@@ -118,69 +96,36 @@ module SafeCookies
118
96
  @headers['Set-Cookie'] = cookies.join("\n")
119
97
  end
120
98
  end
121
-
122
- def should_be_secure?(cookie)
123
- cookie_name = cookie.split('=').first.strip
124
- ssl? and not @configuration.insecure_cookie?(cookie_name)
125
- end
126
-
127
- def ssl?
128
- if @request.respond_to?(:ssl?)
129
- @request.ssl?
130
- else
131
- # older Rack versions
132
- @request.scheme == 'https'
133
- end
134
- end
135
-
136
- def should_be_http_only?(cookie)
137
- cookie_name = cookie.split('=').first.strip
138
- not @configuration.scriptable_cookie?(cookie_name)
139
- end
140
-
141
- def ensure_no_unknown_cookies!
142
- request_cookies = @request.cookies.keys.map(&:to_s)
143
- unknown_cookies = request_cookies - known_cookies
144
-
145
- if unknown_cookies.any?
146
- handle_unknown_cookies(unknown_cookies)
99
+
100
+ def store_application_cookie_names
101
+ if @application_cookies
102
+ application_cookie_names = stored_application_cookie_names + @application_cookies.scan(COOKIE_NAME_REGEX)
103
+ application_cookies_string = application_cookie_names.uniq.join(KNOWN_COOKIES_DIVIDER)
104
+
105
+ set_cookie!(STORE_COOKIE_NAME, application_cookies_string, :expire_after => HELPER_COOKIES_LIFETIME)
147
106
  end
148
107
  end
149
108
 
150
- def handle_unknown_cookies(cookies)
151
- raise SafeCookies::UnknownCookieError.new("Request for '#{@request.url}' had unknown cookies: #{cookies.join(', ')}")
152
- end
153
-
154
- def cache_application_cookies
155
- new_application_cookies = @headers['Set-Cookie']
109
+ # This method takes all cookies sent with the request and rewrites them,
110
+ # making them both secure and http-only (unless specified otherwise in
111
+ # the configuration).
112
+ # With the SECURED_COOKIE_NAME cookie we remember the exact time that we
113
+ # rewrote the cookies.
114
+ def rewrite_request_cookies
115
+ if request_cookies.any?
116
+ registered_cookies_in_request.each do |cookie_name, options|
117
+ value = request_cookies[cookie_name]
118
+
119
+ set_cookie!(cookie_name, value, options)
120
+ end
156
121
 
157
- if new_application_cookies
158
- new_application_cookies = new_application_cookies.join("\n") if new_application_cookies.is_a?(Array)
159
- application_cookies = cached_application_cookies + new_application_cookies.scan(/(?=^|\n)[^\n;,=]+/i)
160
- application_cookies_string = application_cookies.uniq.join(KNOWN_COOKIES_DIVIDER)
161
-
162
- set_cookie!(CACHE_COOKIE_NAME, application_cookies_string, :expire_after => HELPER_COOKIES_LIFETIME)
122
+ formatted_now = Rack::Utils.rfc2822(Time.now.gmtime)
123
+ set_cookie!(SECURED_COOKIE_NAME, formatted_now, :expire_after => HELPER_COOKIES_LIFETIME)
163
124
  end
164
125
  end
165
126
 
166
- def cached_application_cookies
167
- cache_cookie = @request.cookies[CACHE_COOKIE_NAME] || ""
168
- cache_cookie.split(KNOWN_COOKIES_DIVIDER)
169
- end
170
-
171
- def known_cookies
172
- known = [CACHE_COOKIE_NAME, SECURED_COOKIE_NAME]
173
- known += cached_application_cookies
174
- known += @configuration.registered_cookies.keys
175
- end
176
-
177
- def cookies_have_been_rewritten_before
178
- @request.cookies.has_key? SECURED_COOKIE_NAME
179
- end
180
-
181
- # returns those of the registered cookies that appear in the request
182
- def registered_cookies_in_request
183
- Util.slice(@configuration.registered_cookies, *@request.cookies.keys)
127
+ def handle_unknown_cookies(cookie_names)
128
+ raise SafeCookies::UnknownCookieError.new("Request for '#{@request.url}' had unknown cookies: #{cookie_names.join(', ')}")
184
129
  end
185
130
 
186
131
  end
data/safe_cookies.gemspec CHANGED
@@ -18,4 +18,5 @@ Gem::Specification.new do |gem|
18
18
  gem.add_dependency('rack')
19
19
  gem.add_development_dependency('rspec')
20
20
  gem.add_development_dependency('timecop')
21
+ gem.add_development_dependency('debugger')
21
22
  end
@@ -26,53 +26,30 @@ describe SafeCookies::Middleware do
26
26
 
27
27
  describe 'register_cookie' do
28
28
 
29
- context 'cookie name formatting' do
30
-
31
- let(:set_cookie) do
32
- # These tests for the Configuration module require an integration with
33
- # the middleware itself. Therefore, we need to actually use it.
34
-
35
- app = stub('app')
36
- env = { 'HTTPS' => 'on' }
37
- stub_app_call(app, :application_cookies => 'cookie_name=value')
38
-
39
- middleware = described_class.new(app)
40
- code, headers, response = middleware.call(env)
41
- headers['Set-Cookie']
42
- end
43
-
44
- it 'understands cookies registered as symbol' do
45
- SafeCookies.configure do |config|
46
- config.register_cookie(:cookie_name, :expire_after => nil)
47
- end
48
-
49
- set_cookie.should =~ /cookie_name=value;.* secure; HttpOnly/
50
- end
51
-
52
- it 'understands cookies registered as string' do
29
+ it 'raises an error if a cookie is registered without passing its expiry' do
30
+ registration_without_expiry = lambda do
53
31
  SafeCookies.configure do |config|
54
- config.register_cookie('cookie_name', :expire_after => nil)
32
+ config.register_cookie('filter', :some => :option)
55
33
  end
56
-
57
- set_cookie.should =~ /cookie_name=value;.* secure; HttpOnly/
58
34
  end
59
35
 
36
+ expect(&registration_without_expiry).to raise_error(SafeCookies::MissingOptionError)
60
37
  end
61
38
 
62
- it 'raises an error if a cookie is registered without passing its expiry' do
63
- registration_without_expiry = lambda do
39
+ it 'raises an error if the cookie name is not a String, because the middleware’s logic depends on strings' do
40
+ registration_as_symbol = lambda do
64
41
  SafeCookies.configure do |config|
65
42
  config.register_cookie(:filter, :some => :option)
66
43
  end
67
44
  end
68
45
 
69
- expect(&registration_without_expiry).to raise_error(SafeCookies::MissingOptionError)
46
+ expect(&registration_as_symbol).to raise_error(RuntimeError, /must be a string/i)
70
47
  end
71
48
 
72
49
  it 'allows nil as expiry (means session cookie)' do
73
50
  registration_with_nil_expiry = lambda do
74
51
  SafeCookies.configure do |config|
75
- config.register_cookie(:filter, :expire_after => nil)
52
+ config.register_cookie('filter', :expire_after => nil)
76
53
  end
77
54
  end
78
55
 
@@ -70,7 +70,6 @@ describe SafeCookies::Middleware do
70
70
  code, headers, response = subject.call(env)
71
71
 
72
72
  cookies = headers['Set-Cookie'].split("\n")
73
- cookies.size.should == 3 # my_old_cookie and secured_old_cookies and _known_cookies
74
73
  cookies.each do |cookie|
75
74
  cookie.should include('; path=/;')
76
75
  end
@@ -124,7 +123,6 @@ describe SafeCookies::Middleware do
124
123
  SafeCookies.configure do |config|
125
124
  config.register_cookie('javascript-cookie', :expire_after => 3600, :http_only => false)
126
125
  end
127
-
128
126
  stub_app_call(app, :application_cookies => 'javascript-cookie=xss')
129
127
 
130
128
  code, headers, response = subject.call(env)
@@ -132,11 +130,16 @@ describe SafeCookies::Middleware do
132
130
  headers['Set-Cookie'].should_not =~ /javascript-cookie=.*HttpOnly/i
133
131
  end
134
132
 
135
- it 'should prefer the application cookie over a client cookie' do
133
+ it 'does not rewrite a client cookie when the application is setting a cookie with the same name' do
134
+ SafeCookies.configure do |config|
135
+ config.register_cookie('cookie', :expire_after => 3600)
136
+ end
137
+
136
138
  stub_app_call(app, :application_cookies => 'cookie=from_application')
137
- set_request_cookies(env, 'cookie=from_client,_safe_cookies__known_cookies=cookie')
139
+ set_request_cookies(env, 'cookie=from_client')
138
140
 
139
141
  code, headers, response = subject.call(env)
142
+
140
143
  headers['Set-Cookie'].should include("cookie=from_application")
141
144
  headers['Set-Cookie'].should_not include("cookie=from_client")
142
145
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safe_cookies
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dominik Schöler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-25 00:00:00.000000000 Z
11
+ date: 2013-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: debugger
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Make all cookies `secure` and `HttpOnly`.
56
70
  email:
57
71
  - dominik.schoeler@makandra.de
@@ -67,6 +81,7 @@ files:
67
81
  - lib/safe_cookies.rb
68
82
  - lib/safe_cookies/configuration.rb
69
83
  - lib/safe_cookies/cookie_path_fix.rb
84
+ - lib/safe_cookies/helpers.rb
70
85
  - lib/safe_cookies/util.rb
71
86
  - lib/safe_cookies/version.rb
72
87
  - safe_cookies.gemspec