safe_cookies 0.1.5 → 0.1.6

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
- MjI5NWM4ZWE1M2UzNWFjNjFkNzc2M2EzN2U4NzJhZTgzNjQ0NmQ1NQ==
4
+ M2M1NGJkNGIyYmRhNmQ5OWZmYjU2MTVmMTEwZTc3NzRjNzRlNzE5Zg==
5
5
  data.tar.gz: !binary |-
6
- OGNlMjkzMmI2MTFhZTFlNzA3MDZmMmYxOWQ3YmQ1ZGE4Njg0OWZlOA==
6
+ MTNiNGMwMjcyMzBkMmQzYzhmODVkNWIzYzg0N2FiNGZmNWE0ZTFkNQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MjU5MGUyMzQyNTI2MzE5OTkzYjBkOTI4NjQ1ZjQxOTk4NGQzOTkxMDEyNDk3
10
- YmQ3YjJjZDBhYTU3ZjBhNzgzMGYwNzdmNzcyZTFmYWY1NzQ0N2RhZDUyYzA1
11
- NjJlZDc4NjdiMWU2M2NhOWY5YzBmNWFkNWNmY2Y1OTgxNjI1YjQ=
9
+ YjAyZWNhNTExNWFmZjk3MzAzYmVmYmY1NDAwZDQ4YzA1YWJkOTk0NTAzMDc0
10
+ OWE3YTM5YmZiMTYzMDg0ZmRiZjFhZGNiMTE5OWU3MWNjZTQ4MGRkNTNlYWNk
11
+ ZDhlYmM1Y2RjNWE1ZmRlYTY5OGJlYmIxZjJmMTUzODc5NzE1OTI=
12
12
  data.tar.gz: !binary |-
13
- Yjg4YTA3OGYyY2RhYmJkZTAyYmNiNjE2ZGRjNTc4MTA0NDJjMTc1ZjA3Mjcy
14
- MjFhYjlhOGY1ZjQyYTE3OTEzODE3ZmU3YmE5YzIxOTNhOWE4NTg5M2M3ZTk4
15
- ZWMzMzVmODk4MWE3MDdjN2RkZjI1N2UwN2EyOTVlNmM0MmMwMjk=
13
+ NThmZjk3M2M5ZGY5YmZiMmI5ZjRkMzA3MWUyOTRlZWMzMmEwY2VjZTRkMWFj
14
+ OWZjZDk5OGJlMDM0MGE2MDQ0NmM4NTgyMDA4Y2VjYzY5NzEyNjJjZjMzOTE3
15
+ YWEzYjlmNzkwZjQyZmRhZWI5YzhmNzcyZjlmMmE3NTIxZTRjODE=
data/README.md CHANGED
@@ -8,22 +8,18 @@ This Gem brings a middleware that will make all cookies secure. In detail, it wi
8
8
 
9
9
  ## Installation
10
10
 
11
+ ### Step 1
11
12
  Add this line to your application's Gemfile:
12
13
 
13
14
  gem 'safe_cookies'
14
15
 
15
- Then run:
16
-
17
- $ bundle
18
-
19
- Or install it yourself as:
16
+ Then run `bundle`.
20
17
 
21
- $ gem install safe_cookies
18
+ Though this gem is aimed at Rails applications, you may even use it without Rails. Install it then with
19
+ `gem install safe_cookies`.
22
20
 
23
21
 
24
- ## Usage
25
-
26
- ### Step 1
22
+ ### Step 2
27
23
  **Rails 3**: add the following line in config/application.rb:
28
24
 
29
25
  class Application < Rails::Application
@@ -39,9 +35,9 @@ Or install it yourself as:
39
35
  config.middleware.insert_before ActionController::Session::CookieStore, SafeCookies::Middleware
40
36
  end
41
37
 
42
- ### Step 2
38
+ ### Step 3
43
39
  Register cookies, either just after the lines you added in step 1 or in in an initializer
44
- (e.g. config/initializers/safe_cookies.rb):
40
+ (e.g. in `config/initializers/safe_cookies.rb):
45
41
 
46
42
  SafeCookies.configure do |config|
47
43
  config.register_cookie :remember_token, :expire_after => 1.year
@@ -55,25 +51,29 @@ not made http-only. It will rewrite the `remember_token` with an expiry of one y
55
51
  `last_action` cookie with an expiry of 30 days, making both of them secure and http-only.
56
52
  Available options are: `:expire_after (required), :path, :secure, :http_only`.
57
53
 
58
- ### Step 3
59
- Override `SafeCookies::Middleware#handle_unknown_cookies(cookies)` (see "Dealing with unregistered cookies" below).
54
+ ### Step 4 (only for Rails 2)
55
+ Override `SafeCookies::Middleware#handle_unknown_cookies(cookies)` (see "Dealing with unregistered
56
+ cookies" below).
60
57
 
61
58
 
62
59
  ## Dealing with unregistered cookies
63
60
 
64
- The middleware is not able to secure cookies without knowing their properties (most important: their
65
- expiry). Unfortunately, the [client won't ever tell us](http://tools.ietf.org/html/rfc6265#section-4.2.2)
66
- if the cookie was originally sent with flags such as "secure" or which expiry date it currently has.
61
+ The middleware is not able to secure cookies without knowing their attributes (most important: their
62
+ expiry). Unfortunately, [the client won't ever tell us](http://tools.ietf.org/html/rfc6265#section-4.2.2)
63
+ if it stores the cookie with flags such as "secure" or which expiry date it currently has.
67
64
  Therefore, it is important to register all cookies that users may come with, specifying their properties.
68
65
  Unregistered cookies cannot be secured.
69
66
 
70
- If a request brings a cookie that is not registered, the middleware will raise
67
+ If a request brings a cookie that is not registered, the middleware will raise a
71
68
  `SafeCookies::UnknownCookieError`. Rails 3+ should handle the exception as any other in your application,
72
69
  but by default, **you will not be notified from Rails 2 applications** and the user will see a standard
73
70
  500 Server Error. Override `SafeCookies::Middleware#handle_unknown_cookies(cookies)` in the config
74
71
  initializer for customized exception handling (like, notifying you per email).
75
72
 
76
- You should not ignore an unregistered cookie, but instead register it.
73
+ You should register any cookie that your application has to do with. However, there are cookies that you
74
+ do not control, like Google's `__utma` & co. You can tell the middleware to ignore those with the
75
+ `config.ignore_cookie` directive, which takes either a String or a Regex parameter. Be careful when using
76
+ regular expressions!
77
77
 
78
78
 
79
79
  ## Fix cookie paths
@@ -13,12 +13,13 @@ module SafeCookies
13
13
  end
14
14
 
15
15
  class Configuration
16
- attr_reader :registered_cookies, :fix_cookie_paths, :correct_cookie_paths_timestamp
16
+ attr_reader :registered_cookies, :fix_cookie_paths, :correct_cookie_paths_timestamp, :ignored_cookies
17
17
 
18
18
  def initialize
19
19
  self.registered_cookies = {}
20
20
  self.insecure_cookies = []
21
21
  self.scriptable_cookies = []
22
+ self.ignored_cookies = []
22
23
  end
23
24
 
24
25
  # Register cookies you expect to receive. The middleware will rewrite all
@@ -45,6 +46,14 @@ module SafeCookies
45
46
  scriptable_cookies << name if options[:http_only] == false
46
47
  end
47
48
 
49
+ # Ignore cookies that you don't control like this:
50
+ #
51
+ # ignore_cookie 'ignored_cookie'
52
+ # ignore_cookie /^__utm/
53
+ def ignore_cookie(name_or_regex)
54
+ self.ignored_cookies << name_or_regex
55
+ end
56
+
48
57
  def fix_paths(options = {})
49
58
  options.has_key?(:for_cookies_secured_before) or raise MissingOptionError.new("Was told to fix paths without the :for_cookies_secured_before timestamp.")
50
59
 
@@ -63,7 +72,7 @@ module SafeCookies
63
72
  private
64
73
 
65
74
  attr_accessor :insecure_cookies, :scriptable_cookies
66
- attr_writer :registered_cookies, :fix_cookie_paths, :correct_cookie_paths_timestamp
75
+ attr_writer :registered_cookies, :fix_cookie_paths, :correct_cookie_paths_timestamp, :ignored_cookies
67
76
 
68
77
  end
69
78
 
@@ -2,23 +2,24 @@ module SafeCookies
2
2
  module CookiePathFix
3
3
 
4
4
  # Previously, the SafeCookies gem would not set a path when rewriting
5
- # cookies. Browsers then would assume and store the current "directory",
6
- # leading to multiple cookies per domain.
5
+ # cookies. Browsers then would assume and store the current "directory"
6
+ # (see below), leading to multiple cookies per domain.
7
7
  #
8
- # If cookies had been secured before the configured datetime, the method
9
- # `fix_cookie_paths` deletes all cookies coming with the request, and the
8
+ # If the cookies were secured before the configured datetime, this method
9
+ # instructs the client to delete all cookies it sent with the request + the
10
10
  # SECURED_COOKIE_NAME helper cookie.
11
11
  # The middleware still sees the request cookies and will rewrite them as
12
- # if it hadn't seen them before.
13
-
14
- def fix_cookie_paths
12
+ # if it hadn't seen them before, setting them on the correct path (root,
13
+ # per default).
14
+ def delete_cookies_on_bad_path
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
- # Delete this cookie here, so the middleware will secure all cookies anew.
21
- request_cookies.delete(SafeCookies::SECURED_COOKIE_NAME)
20
+ # Delete this cookie here, so the middleware believes it hasn't secured
21
+ # the cookies yet.
22
+ @request.cookies.delete(SafeCookies::SECURED_COOKIE_NAME)
22
23
  end
23
24
 
24
25
  private
@@ -51,7 +52,8 @@ module SafeCookies
51
52
  end
52
53
 
53
54
  def current_directory_is_root?
54
- !@request.path[%r(^/[^/]+/[^\?]+), 0] # roughly: "there are not three slashes"
55
+ # in words: "there are not three slashes before any query params"
56
+ !@request.path[%r(^/[^/]+/[^\?]+), 0]
55
57
  end
56
58
 
57
59
  def secured_old_cookies_timestamp
@@ -9,8 +9,9 @@ module SafeCookies
9
9
  cookies = cookies.join("\n") if cookies.is_a?(Array)
10
10
 
11
11
  if cookies and cookies.length > 0
12
- @application_cookies = cookies
12
+ @application_cookies_string = cookies
13
13
  end
14
+ # else, @application_cookies_string will be `nil`
14
15
  end
15
16
 
16
17
  def secure(cookie)
@@ -47,7 +48,7 @@ module SafeCookies
47
48
  # getters
48
49
 
49
50
  def stored_application_cookie_names
50
- store_cookie = request_cookies[STORE_COOKIE_NAME] || ""
51
+ store_cookie = @request.cookies[STORE_COOKIE_NAME] || ""
51
52
  store_cookie.split(KNOWN_COOKIES_DIVIDER)
52
53
  end
53
54
 
@@ -61,16 +62,17 @@ module SafeCookies
61
62
  known += stored_application_cookie_names
62
63
  known += @configuration.registered_cookies.keys
63
64
  end
64
-
65
+
66
+ # returns the request cookies minus ignored cookies
65
67
  def request_cookies
66
- @request.cookies
68
+ Util.except!(@request.cookies.dup, *@configuration.ignored_cookies)
67
69
  end
68
70
 
69
71
 
70
72
  # boolean
71
73
 
72
74
  def cookies_have_been_rewritten_before?
73
- request_cookies.has_key? SECURED_COOKIE_NAME
75
+ @request.cookies.has_key? SECURED_COOKIE_NAME
74
76
  end
75
77
 
76
78
  def should_be_secure?(cookie)
@@ -1,17 +1,22 @@
1
- module SafeCookies
2
- class Util
3
- class << self
4
-
5
- def slice(hash, *allowed_keys)
6
- sliced_hash = hash.select { |key, value|
7
- allowed_keys.include? key
8
- }
1
+ class SafeCookies::Util
2
+ class << self
3
+
4
+ def slice(hash, *allowed_keys)
5
+ sliced_hash = hash.select { |key, _value|
6
+ allowed_keys.include? key
7
+ }
9
8
 
10
- # Normalize the result of Hash#select
11
- # (Ruby 1.8 returns an Array, Ruby 1.9 returns a Hash)
12
- Hash[sliced_hash]
9
+ # Normalize the result of Hash#select
10
+ # (Ruby 1.8 returns an Array, Ruby 1.9 returns a Hash)
11
+ Hash[sliced_hash]
12
+ end
13
+
14
+ # rejected_keys may be of type String or Regex
15
+ def except!(hash, *rejected_keys)
16
+ hash.delete_if do |key, _value|
17
+ rejected_keys.any? { |rejected| rejected === key }
13
18
  end
14
-
15
19
  end
20
+
16
21
  end
17
- end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module SafeCookies
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.6'
3
3
  end
data/lib/safe_cookies.rb CHANGED
@@ -9,8 +9,6 @@ require "rack"
9
9
  # Naming:
10
10
  # - application_cookies: cookies received from the application. The 'Set-Cookie' header is a string
11
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
12
 
15
13
  module SafeCookies
16
14
 
@@ -39,13 +37,14 @@ module SafeCookies
39
37
  @request = Rack::Request.new(env)
40
38
  ensure_no_unknown_cookies_in_request!
41
39
 
40
+ # calling the next middleware
42
41
  status, @headers, body = @app.call(env)
43
42
  cache_application_cookies_string
44
43
 
45
- remove_application_cookies_from_request_cookies
46
- rewrite_application_cookies
44
+ enhance_application_cookies!
47
45
  store_application_cookie_names
48
- fix_cookie_paths if fix_cookie_paths?
46
+
47
+ delete_cookies_on_bad_path if fix_cookie_paths?
49
48
  rewrite_request_cookies unless cookies_have_been_rewritten_before?
50
49
 
51
50
  [ status, @headers, body ]
@@ -54,9 +53,11 @@ module SafeCookies
54
53
  private
55
54
 
56
55
  def reset_instance_variables
57
- @request, @headers, @application_cookies = nil
56
+ @request, @headers, @application_cookies_string = nil
58
57
  end
59
-
58
+
59
+ # Make sure we get notified if a client comes with an unregistered cookie,
60
+ # because we do not want any cookie not to be secured.
60
61
  def ensure_no_unknown_cookies_in_request!
61
62
  request_cookie_names = request_cookies.keys.map(&:to_s)
62
63
  unknown_cookie_names = request_cookie_names - known_cookie_names
@@ -65,19 +66,11 @@ module SafeCookies
65
66
  handle_unknown_cookies(unknown_cookie_names)
66
67
  end
67
68
  end
68
-
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)
74
- end
75
- end
76
- end
77
-
78
- def rewrite_application_cookies
79
- if @application_cookies
80
- cookies = @application_cookies.split("\n")
69
+
70
+ # Overwrites @header['Set-Cookie']
71
+ def enhance_application_cookies!
72
+ if @application_cookies_string
73
+ cookies = @application_cookies_string.split("\n")
81
74
 
82
75
  # On Rack 1.1, cookie values sometimes contain trailing newlines.
83
76
  # Example => ["foo=1; path=/\n", "bar=2; path=/"]
@@ -96,23 +89,33 @@ module SafeCookies
96
89
  @headers['Set-Cookie'] = cookies.join("\n")
97
90
  end
98
91
  end
99
-
92
+
93
+ # Store the names of cookies that are set by the application. We are already
94
+ # securing those and therefore do not need to rewrite them.
100
95
  def store_application_cookie_names
101
- if @application_cookies
102
- application_cookie_names = stored_application_cookie_names + @application_cookies.scan(COOKIE_NAME_REGEX)
96
+ if @application_cookies_string
97
+ application_cookie_names = stored_application_cookie_names + @application_cookies_string.scan(COOKIE_NAME_REGEX)
103
98
  application_cookies_string = application_cookie_names.uniq.join(KNOWN_COOKIES_DIVIDER)
104
99
 
105
100
  set_cookie!(STORE_COOKIE_NAME, application_cookies_string, :expire_after => HELPER_COOKIES_LIFETIME)
106
101
  end
107
102
  end
108
103
 
109
- # This method takes all cookies sent with the request and rewrites them,
104
+ # This method takes the cookies sent with the request and rewrites them,
110
105
  # making them both secure and http-only (unless specified otherwise in
111
106
  # the configuration).
112
107
  # With the SECURED_COOKIE_NAME cookie we remember the exact time that we
113
108
  # rewrote the cookies.
114
109
  def rewrite_request_cookies
115
- if request_cookies.any?
110
+ cookies_to_rewrite = request_cookies || []
111
+
112
+ # don't rewrite request cookies that the application is setting in the response
113
+ if @application_cookies_string
114
+ application_cookie_names = @application_cookies_string.scan(COOKIE_NAME_REGEX)
115
+ Util.except!(cookies_to_rewrite, *application_cookie_names)
116
+ end
117
+
118
+ if cookies_to_rewrite.any?
116
119
  registered_cookies_in_request.each do |cookie_name, options|
117
120
  value = request_cookies[cookie_name]
118
121
 
@@ -124,6 +127,7 @@ module SafeCookies
124
127
  end
125
128
  end
126
129
 
130
+ # API method
127
131
  def handle_unknown_cookies(cookie_names)
128
132
  raise SafeCookies::UnknownCookieError.new("Request for '#{@request.url}' had unknown cookies: #{cookie_names.join(', ')}")
129
133
  end
@@ -7,7 +7,7 @@ describe SafeCookies::Middleware do
7
7
  let(:app) { stub 'application' }
8
8
  let(:env) { { 'HTTPS' => 'on' } }
9
9
 
10
- it 'should rewrite registered request cookies as secure and http-only, but only once' do
10
+ it 'rewrites registered request cookies as secure and http-only, but only once' do
11
11
  SafeCookies.configure do |config|
12
12
  config.register_cookie('foo', :expire_after => 3600)
13
13
  end
@@ -35,7 +35,7 @@ describe SafeCookies::Middleware do
35
35
  headers['Set-Cookie'].to_s.should == ''
36
36
  end
37
37
 
38
- it 'should not make cookies secure if the request was not secure' do
38
+ it 'doesn’t make cookies secure if the request was not secure' do
39
39
  stub_app_call(app, :application_cookies => 'filter-settings=sort_by_date')
40
40
  env['HTTPS'] = 'off'
41
41
 
@@ -43,7 +43,7 @@ describe SafeCookies::Middleware do
43
43
  headers['Set-Cookie'].should include("filter-settings=sort_by_date")
44
44
  headers['Set-Cookie'].should_not match(/\bsecure\b/i)
45
45
  end
46
-
46
+
47
47
  it 'expires the secured_old_cookies helper cookie in ten years' do
48
48
  Timecop.freeze(Time.parse('2013-09-17 17:53'))
49
49
 
@@ -59,43 +59,47 @@ describe SafeCookies::Middleware do
59
59
  headers['Set-Cookie'].should =~ /secured_old_cookies.*expires=Fri, 15 Sep 2023 \d\d:\d\d:\d\d/
60
60
  end
61
61
 
62
- it 'sets cookies on the root path' do
63
- SafeCookies.configure do |config|
64
- config.register_cookie('my_old_cookie', :expire_after => 3600)
65
- end
62
+ context 'cookie attributes' do
63
+
64
+ it 'sets cookies on the root path' do
65
+ SafeCookies.configure do |config|
66
+ config.register_cookie('my_old_cookie', :expire_after => 3600)
67
+ end
66
68
 
67
- set_request_cookies(env, 'my_old_cookie=foobar')
68
- stub_app_call(app)
69
+ set_request_cookies(env, 'my_old_cookie=foobar')
70
+ stub_app_call(app)
69
71
 
70
- code, headers, response = subject.call(env)
72
+ code, headers, response = subject.call(env)
71
73
 
72
- cookies = headers['Set-Cookie'].split("\n")
73
- cookies.each do |cookie|
74
- cookie.should include('; path=/;')
74
+ cookies = headers['Set-Cookie'].split("\n")
75
+ cookies.each do |cookie|
76
+ cookie.should include('; path=/;')
77
+ end
75
78
  end
76
- end
77
79
 
78
- it 'should not alter cookie options coming from the application' do
79
- stub_app_call(app, :application_cookies => 'cookie=data; path=/; expires=next_week')
80
+ it 'should not alter cookie attributes coming from the application' do
81
+ stub_app_call(app, :application_cookies => 'cookie=data; path=/; expires=next_week')
80
82
 
81
- code, headers, response = subject.call(env)
82
- headers['Set-Cookie'].should =~ %r(cookie=data; path=/; expires=next_week; secure; HttpOnly)
83
- end
83
+ code, headers, response = subject.call(env)
84
+ headers['Set-Cookie'].should =~ %r(cookie=data; path=/; expires=next_week; secure; HttpOnly)
85
+ end
84
86
 
85
- it 'should respect cookie options set in the configuration' do
86
- Timecop.freeze
87
+ it 'should respect cookie attributes set in the configuration' do
88
+ Timecop.freeze
87
89
 
88
- SafeCookies.configure do |config|
89
- config.register_cookie('foo', :expire_after => 3600, :path => '/special/path')
90
- end
90
+ SafeCookies.configure do |config|
91
+ config.register_cookie('foo', :expire_after => 3600, :path => '/special/path')
92
+ end
91
93
 
92
- stub_app_call(app)
93
- set_request_cookies(env, 'foo=bar')
94
- env['PATH_INFO'] = '/special/path/subfolder'
94
+ stub_app_call(app)
95
+ set_request_cookies(env, 'foo=bar')
96
+ env['PATH_INFO'] = '/special/path/subfolder'
95
97
 
96
- code, headers, response = subject.call(env)
97
- expected_expiry = Rack::Utils.rfc2822((Time.now + 3600).gmtime) # a special date format needed here
98
- headers['Set-Cookie'].should =~ %r(foo=bar; path=/special/path; expires=#{expected_expiry}; secure; HttpOnly)
98
+ code, headers, response = subject.call(env)
99
+ expected_expiry = Rack::Utils.rfc2822((Time.now + 3600).gmtime) # a special date format needed here
100
+ headers['Set-Cookie'].should =~ %r(foo=bar; path=/special/path; expires=#{expected_expiry}; secure; HttpOnly)
101
+ end
102
+
99
103
  end
100
104
 
101
105
  context 'cookies set by the application' do
@@ -173,18 +177,46 @@ describe SafeCookies::Middleware do
173
177
  headers['Set-Cookie'].should =~ /js-data=json;.* secure/
174
178
  headers['Set-Cookie'].should_not =~ /js-data=json;.* HttpOnly/
175
179
  end
176
-
180
+
181
+ end
182
+
183
+ context 'ignored cookies' do
184
+
185
+ before do
186
+ stub_app_call(app)
187
+ set_request_cookies(env, '__utma=123', '__utmz=456')
188
+ end
189
+
190
+ it 'does not rewrite ignored cookies given as string' do
191
+ SafeCookies.configure do |config|
192
+ config.ignore_cookie '__utma'
193
+ config.ignore_cookie '__utmz'
194
+ end
195
+
196
+ code, headers, response = subject.call(env)
197
+ headers['Set-Cookie'].should_not =~ /__utm/
198
+ end
199
+
200
+ it 'does not rewrite ignored cookies given as regex' do
201
+ SafeCookies.configure do |config|
202
+ config.ignore_cookie /^__utm/
203
+ end
204
+
205
+ code, headers, response = subject.call(env)
206
+ headers['Set-Cookie'].should_not =~ /__utm/
207
+ end
208
+
177
209
  end
178
210
 
179
211
  context 'unknown request cookies' do
180
212
 
181
- it 'should raise an error if there is an unknown cookie' do
213
+ it 'raises an error if there is an unknown cookie' do
182
214
  set_request_cookies(env, 'foo=bar')
183
215
 
184
216
  expect{ subject.call(env) }.to raise_error(SafeCookies::UnknownCookieError)
185
217
  end
186
218
 
187
- it 'should not raise an error if the (unregistered) cookie was initially set by the application' do
219
+ it 'does not raise an error if the (unregistered) cookie was initially set by the application' do
188
220
  # application sets cookie
189
221
  stub_app_call(app, :application_cookies => 'foo=bar; path=/some/path; secure')
190
222
 
@@ -204,7 +236,7 @@ describe SafeCookies::Middleware do
204
236
  other_subject.call(env)
205
237
  end
206
238
 
207
- it 'should not raise an error if the cookie is listed in the cookie configuration' do
239
+ it 'does not raise an error if the cookie is listed in the cookie configuration' do
208
240
  SafeCookies.configure do |config|
209
241
  config.register_cookie('foo', :expire_after => 3600)
210
242
  end
@@ -214,7 +246,18 @@ describe SafeCookies::Middleware do
214
246
 
215
247
  subject.call(env)
216
248
  end
217
-
249
+
250
+ it 'does not raise an error if the cookie is ignored' do
251
+ SafeCookies.configure do |config|
252
+ config.ignore_cookie '__utma'
253
+ end
254
+
255
+ stub_app_call(app)
256
+ set_request_cookies(env, '__utma=tracking')
257
+
258
+ subject.call(env)
259
+ end
260
+
218
261
  it 'allows overwriting the error mechanism' do
219
262
  stub_app_call(app)
220
263
  set_request_cookies(env, 'foo=bar')
data/spec/util_spec.rb ADDED
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe SafeCookies::Util do
4
+
5
+ describe '.except!' do
6
+
7
+ before do
8
+ @hash = { 'a' => 1, 'ab' => 2, 'b' => 3 }
9
+ end
10
+
11
+ it 'deletes the given keys from the original hash' do
12
+ SafeCookies::Util.except!(@hash, 'a')
13
+ @hash.should == { 'ab' => 2, 'b' => 3 }
14
+ end
15
+
16
+ it 'deletes all keys that match the regex' do
17
+ SafeCookies::Util.except!(@hash, /b/)
18
+ @hash.should == { 'a' => 1 }
19
+ end
20
+
21
+ it 'returns the original hash' do
22
+ SafeCookies::Util.except!(@hash, /(?!)/).should == @hash
23
+ end
24
+
25
+ end
26
+
27
+ 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.5
4
+ version: 0.1.6
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-10-18 00:00:00.000000000 Z
11
+ date: 2013-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -89,6 +89,7 @@ files:
89
89
  - spec/cookie_path_fix_spec.rb
90
90
  - spec/safe_cookies_spec.rb
91
91
  - spec/spec_helper.rb
92
+ - spec/util_spec.rb
92
93
  homepage: http://www.makandra.de
93
94
  licenses: []
94
95
  metadata: {}
@@ -117,3 +118,4 @@ test_files:
117
118
  - spec/cookie_path_fix_spec.rb
118
119
  - spec/safe_cookies_spec.rb
119
120
  - spec/spec_helper.rb
121
+ - spec/util_spec.rb