rack-policy 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,4 +1,9 @@
1
1
  ---
2
+ branches:
3
+ only: master
4
+ matrix:
5
+ allow_failures:
6
+ - rvm: ruby-head
2
7
  rvm:
3
8
  - 1.8.7
4
9
  - 1.9.2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ 0.4.0 (July 8, 2012)
2
+
3
+ * Add helpers module to hold common rack apps extensions together with tests.
4
+ * Add extensions loader.
5
+ * Add view extensions for Rails 2, 3 & Sinatra.
6
+ * Add specs for finish method to verify headers removal.
7
+ * Add specs to test for consent token and environment variable setup.
8
+
1
9
  0.3.0 (June 30, 2012)
2
10
 
3
11
  * Add thread safety.
data/README.md CHANGED
@@ -32,6 +32,8 @@ Rack::Policy::CookieLimiter, consent_token: 'allow_me'
32
32
 
33
33
  The very same `consent_token` is used to toggle the limiter behaviour.
34
34
 
35
+ The `cookies_accpeted?` view helper method is automatically loaded for Rails, Sinatra & Padrino apps.
36
+
35
37
  ## Examples
36
38
 
37
39
  Adding `Rack::Policy::CookieLimiter` to Rack applications
@@ -43,7 +45,7 @@ Adding `Rack::Policy::CookieLimiter` to Rack applications
43
45
  require 'rack/policy'
44
46
 
45
47
  class Application < Rails::Application
46
- config.middleware.use Rack::Policy::CookieLimiter, consent_token: 'rack.policy'
48
+ config.middleware.insert_before ActionDispatch::Cookies, Rack::Policy::CookieLimiter, consent_token: 'rack.policy'
47
49
  end
48
50
  ```
49
51
 
@@ -68,6 +70,22 @@ class CookiePolicyController < ApplicationController
68
70
  end
69
71
  ```
70
72
 
73
+ Finally, in your view you can use helper method `cookies_accepted?` to display/toggle cookie information
74
+
75
+ ```ruby
76
+ <% cookies_accepted? do %>
77
+ Accepted Cookies!
78
+ <% end %>
79
+
80
+ or
81
+
82
+ <% if cookies_accepted? %>
83
+ Accepted Cookies!
84
+ <% else %>
85
+ Cookies Not Accepted!
86
+ <% end %>
87
+ ```
88
+
71
89
  ### Rails 2.x
72
90
 
73
91
  ```ruby
@@ -79,7 +97,7 @@ Rails::Initializer.run do |config|
79
97
  end
80
98
  ```
81
99
 
82
- Set and unset cookie consent in similar way to Rails 3.x example.
100
+ Set and unset cookie consent in your controller and modify views logic in similar way to Rails 3.x example.
83
101
 
84
102
  ### Sinatra
85
103
 
@@ -101,6 +119,8 @@ get('/allow') { response.set_cookie 'rack.policy' }
101
119
  get('/deny') { response.delete_cookie 'rack.policy' }
102
120
  ```
103
121
 
122
+ Similiar to Rails 3.x example you can use `cookies_accpeted?` helper to manage view logic related to cookie policy information.
123
+
104
124
  ### Padrino
105
125
 
106
126
  ```ruby
@@ -109,7 +129,7 @@ require 'padrino'
109
129
  require 'rack/policy'
110
130
 
111
131
  class MyApp < Padrino::Application
112
- use Rack::Policy::CookieLimiter consent_token: 'rack.policy'
132
+ use Rack::Policy::CookieLimiter, consent_token: 'rack.policy'
113
133
  end
114
134
  ```
115
135
 
@@ -119,7 +139,7 @@ end
119
139
  #!/usr/bin/env rackup
120
140
  require 'rack/policy'
121
141
 
122
- use Rack::Policy::CookieLimiter consent_token: 'rack.policy'
142
+ use Rack::Policy::CookieLimiter, consent_token: 'rack.policy'
123
143
 
124
144
  run lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, world!\n"] }
125
145
  ```
data/lib/rack/policy.rb CHANGED
@@ -7,6 +7,10 @@ module Rack
7
7
 
8
8
  autoload :CookieLimiter, 'rack/policy/cookie_limiter'
9
9
  autoload :Version, 'rack/policy/version'
10
+ autoload :Helpers, 'rack/policy/helpers'
11
+
12
+ # Initialize Rack::Policy extensions within an application
13
+ require 'rack/policy/extensions'
10
14
 
11
15
  end # Policy
12
16
  end # Rack
@@ -12,7 +12,12 @@ module Rack
12
12
  CONSENT_TOKEN = "cookie_limiter".freeze
13
13
 
14
14
  attr_reader :app, :options
15
- attr_accessor :status, :headers, :body
15
+
16
+ # The environment of the request
17
+ attr_reader :env
18
+
19
+ # HTTP message
20
+ attr_reader :status, :headers, :body
16
21
 
17
22
  # @option options [String] :consent_token
18
23
  #
@@ -33,11 +38,24 @@ module Rack
33
38
  end
34
39
 
35
40
  def call!(env)
36
- self.status, self.headers, self.body = @app.call(env)
41
+ @env = env
37
42
  request = Rack::Request.new(env)
43
+ accepts?(request)
44
+ @status, @headers, @body = @app.call(env)
38
45
  response = Rack::Response.new body, status, headers
39
46
  clear_cookies!(request, response) unless allowed?(request)
40
- finish(env)
47
+ finish
48
+ end
49
+
50
+ # Identifies the approval of cookie policy inside rack app.
51
+ #
52
+ def accepts?(request)
53
+ if ( request.cookies.has_key?(consent_token.to_s) )
54
+ @env['rack-policy.consent'] = 'true'
55
+ else
56
+ @env.delete(HTTP_COOKIE) if @env[HTTP_COOKIE]
57
+ @env['rack-policy.consent'] = nil
58
+ end
41
59
  end
42
60
 
43
61
  # Returns `false` if the cookie policy disallows cookie storage
@@ -53,7 +71,7 @@ module Rack
53
71
  end
54
72
 
55
73
  # Finish http response with proper headers
56
- def finish(env)
74
+ def finish
57
75
  if [204, 304].include?(status.to_i) || (status.to_i / 100 == 1)
58
76
  headers.delete "Content-Length"
59
77
  headers.delete "Content-Type"
@@ -86,7 +104,6 @@ module Rack
86
104
  def clear_cookies!(request, response)
87
105
  cookies = parse_cookies
88
106
  headers.delete(SET_COOKIE)
89
- request.env.delete(HTTP_COOKIE)
90
107
  revalidate_cache!
91
108
 
92
109
  cookies.merge(request.cookies).each do |key, value|
@@ -0,0 +1,18 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ # Autoload Rails extensions
4
+ if defined?(Rails) && Rails.respond_to?(:application)
5
+ # Rails 3
6
+ require 'rack/policy/railtie'
7
+
8
+ elsif defined?(Rails::Initializer)
9
+ # Rails 2.3
10
+ require 'action/view/base'
11
+
12
+ ActionView::Base.send :include, Rack::Policy::Helpers
13
+ elsif defined?(Sinatra)
14
+ require 'rack/policy/sinatra'
15
+
16
+ elsif defined?(Padrino)
17
+ require 'padrino-core'
18
+ end
@@ -0,0 +1,16 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Rack
4
+ module Policy
5
+ module Helpers
6
+
7
+ def cookies_accepted?
8
+ return false unless request.env.has_key? 'rack-policy.consent'
9
+ accepted = !request.env['rack-policy.consent'].nil?
10
+ yield if block_given? && accepted
11
+ accepted
12
+ end
13
+
14
+ end # Helpers
15
+ end # Policy
16
+ end # Rack
@@ -0,0 +1,11 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Rack
4
+ module Policy
5
+ class Railtie < ::Rails::Railtie
6
+ initializer "rack-policy.view_helpers" do |app|
7
+ ActionView::Base.send :include, Helpers
8
+ end
9
+ end # Railtie
10
+ end # Policy
11
+ end # Rack
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Rack
4
+ module Policy
5
+ module Sinatra
6
+ def self.registered(app)
7
+ app.helpers Rack::Policy::Helpers
8
+ end
9
+ end # Sinatra
10
+ end # Policy
11
+ end # Rack
12
+
13
+ Sinatra.register Rack::Policy::Sinatra
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Rack
4
4
  module Policy
5
- VERSION = "0.3.0"
5
+ VERSION = "0.4.0"
6
6
  end
7
7
  end
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require File.expand_path('../spec_helper.rb', __FILE__)
2
4
 
3
5
  describe Rack::Policy::CookieLimiter do
@@ -29,6 +31,16 @@ describe Rack::Policy::CookieLimiter do
29
31
  last_response.headers['Set-Cookie'].should be_nil
30
32
  end
31
33
 
34
+ it 'clears all the cookies' do
35
+ mock_app {
36
+ use Rack::Policy::CookieLimiter, :consent_token => 'consent'
37
+ run DummyApp
38
+ }
39
+ set_cookie ["foo=1", "bar=2"]
40
+ request '/'
41
+ last_request.cookies.should == {}
42
+ end
43
+
32
44
  it 'revalidates caches' do
33
45
  mock_app {
34
46
  use Rack::Policy::CookieLimiter
@@ -59,6 +71,39 @@ describe Rack::Policy::CookieLimiter do
59
71
  get '/'
60
72
  last_response.headers['Set-Cookie'].should =~ /github.com=bot/
61
73
  end
74
+
75
+ context 'token' do
76
+ it 'preserves all the cookies if custom consent token present' do
77
+ mock_app {
78
+ use Rack::Policy::CookieLimiter, :consent_token => 'consent'
79
+ run DummyApp
80
+ }
81
+ set_cookie ["foo=1", "bar=2", "consent=true"]
82
+ request '/'
83
+ last_request.cookies.should == {'foo'=>'1', 'bar'=>'2', 'consent'=>'true'}
84
+ end
85
+ end
86
+ end
87
+
88
+ context 'accepts?' do
89
+ it "sets environment consent variable" do
90
+ mock_app {
91
+ use Rack::Policy::CookieLimiter
92
+ run DummyApp
93
+ }
94
+ request '/'
95
+ last_request.env.should have_key('rack-policy.consent')
96
+ end
97
+
98
+ it "assigns value for the consent variable" do
99
+ mock_app {
100
+ use Rack::Policy::CookieLimiter, :consent_token => 'consent'
101
+ run DummyApp
102
+ }
103
+ set_cookie ["consent=true"]
104
+ request '/'
105
+ last_request.env['rack-policy.consent'].should == 'true'
106
+ end
62
107
  end
63
108
 
64
109
  context 'finish response' do
@@ -70,6 +115,21 @@ describe Rack::Policy::CookieLimiter do
70
115
  head '/'
71
116
  last_response.should be_ok
72
117
  end
118
+
119
+ it "strips content headers for no content" do
120
+ mock_app with_status(204)
121
+ get '/'
122
+ last_response.headers['Content-Type'].should be_nil
123
+ last_response.headers['Content-Length'].should be_nil
124
+ last_response.body.should be_empty
125
+ end
126
+
127
+ it "strips headers for information request" do
128
+ mock_app with_status(102)
129
+ get '/'
130
+ last_response.headers['Content-Length'].should be_nil
131
+ last_response.body.should be_empty
132
+ end
73
133
  end
74
134
 
75
135
  end # Rack::Policy::CookieLimiter
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path('../spec_helper.rb', __FILE__)
4
+
5
+ class HelperTest
6
+ attr_accessor :request
7
+ include Rack::Policy::Helpers
8
+
9
+ def initialize
10
+ @request = HelperTest::Request.new
11
+ end
12
+
13
+ class Request
14
+ attr_reader :env
15
+ def initialize; @env = {}; end
16
+ end
17
+ end
18
+
19
+ describe Rack::Policy::Helpers do
20
+
21
+ let(:helper_test) { HelperTest.new }
22
+
23
+ before do
24
+ helper_test.request.env.stub(:has_key?).and_return true
25
+ end
26
+
27
+ it "guards against missing key" do
28
+ helper_test.request.env.stub(:has_key?).and_return false
29
+ helper_test.cookies_accepted?.should be_false
30
+ end
31
+
32
+ it "doesn't accept cookies" do
33
+ helper_test.request.env.stub(:[]).with('rack-policy.consent') { nil }
34
+ helper_test.cookies_accepted?.should be_false
35
+ end
36
+
37
+ it "accepts cookies" do
38
+ helper_test.request.env.stub(:[]).with('rack-policy.consent') { 'true' }
39
+ helper_test.cookies_accepted?.should be_true
40
+ end
41
+
42
+ it "yields to the block" do
43
+ helper_test.request.env.stub(:[]).with('rack-policy.consent') { 'true' }
44
+ block = Proc.new { 'Accepted'}
45
+ helper_test.should_receive(:cookies_accepted?).and_yield(&block)
46
+ helper_test.cookies_accepted?(&block)
47
+ end
48
+
49
+ end # Rack::Policy::Helpers
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'rubygems'
2
4
 
3
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
@@ -19,12 +21,11 @@ module TestHelpers
19
21
  @app || mock_app(DummyApp)
20
22
  end
21
23
 
22
- def mock_app(app=nil, &block)
24
+ def mock_app(app=nil, opts={}, &block)
23
25
  app = block if app.nil? and block.arity == 1
24
26
  if app
25
- klass = described_class
26
27
  mock_app do
27
- use klass
28
+ use Rack::Policy::CookieLimiter, opts
28
29
  run app
29
30
  end
30
31
  else
@@ -35,6 +36,10 @@ module TestHelpers
35
36
  def with_headers(headers)
36
37
  proc { [200, {'Content-Type' => 'text/plain' }.merge(headers), ['ok']] }
37
38
  end
39
+
40
+ def with_status(status=nil)
41
+ proc { [status || 200, {'Content-Type' => 'text/plain' }, ['ok']] }
42
+ end
38
43
  end
39
44
 
40
45
  RSpec.configure do |config|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-policy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-30 00:00:00.000000000 Z
12
+ date: 2012-07-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &2152543580 !ruby/object:Gem::Requirement
16
+ requirement: &2152743460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '1.1'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152543580
24
+ version_requirements: *2152743460
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rack-test
27
- requirement: &2152543140 !ruby/object:Gem::Requirement
27
+ requirement: &2152743000 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2152543140
35
+ version_requirements: *2152743000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &2152542560 !ruby/object:Gem::Requirement
38
+ requirement: &2152742320 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2152542560
46
+ version_requirements: *2152742320
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
- requirement: &2152541880 !ruby/object:Gem::Requirement
49
+ requirement: &2152741600 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2152541880
57
+ version_requirements: *2152741600
58
58
  description: This is Rack middleware that makes your app compliant with the 'EU ePrivacy
59
59
  Directive'
60
60
  email:
@@ -78,9 +78,14 @@ files:
78
78
  - lib/rack-policy.rb
79
79
  - lib/rack/policy.rb
80
80
  - lib/rack/policy/cookie_limiter.rb
81
+ - lib/rack/policy/extensions.rb
82
+ - lib/rack/policy/helpers.rb
83
+ - lib/rack/policy/railtie.rb
84
+ - lib/rack/policy/sinatra.rb
81
85
  - lib/rack/policy/version.rb
82
86
  - rack-policy.gemspec
83
87
  - spec/cookie_limiter_spec.rb
88
+ - spec/helpers_spec.rb
84
89
  - spec/spec_helper.rb
85
90
  homepage: https://github.com/peter-murach/rack-policy
86
91
  licenses: []
@@ -110,4 +115,5 @@ summary: This is Rack middleware that makes your app compliant with the 'EU ePri
110
115
  stored on his machine.
111
116
  test_files:
112
117
  - spec/cookie_limiter_spec.rb
118
+ - spec/helpers_spec.rb
113
119
  - spec/spec_helper.rb