cookie_requirement 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/cookie_requirement.rb +143 -0
- metadata +103 -0
@@ -0,0 +1,143 @@
|
|
1
|
+
require "uri"
|
2
|
+
|
3
|
+
# CookieRequirement is a Rails plugin that lets you ensure that cookies are
|
4
|
+
# enabled. Include the module in a controller, and declare the actions that
|
5
|
+
# require cookies with the +cookies_required+ class method.
|
6
|
+
#
|
7
|
+
# ==Example
|
8
|
+
#
|
9
|
+
# class UserController
|
10
|
+
#
|
11
|
+
# include CookieRequirement
|
12
|
+
#
|
13
|
+
# cookies_required :login
|
14
|
+
#
|
15
|
+
# # if login is accessed without cookies, handle_cookies_disabled is
|
16
|
+
# # called
|
17
|
+
# def login
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# def cookie_instructions
|
21
|
+
# # show some instructions
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# protected
|
25
|
+
#
|
26
|
+
# # override the default behavior to display instructions
|
27
|
+
# def handle_cookies_diabled
|
28
|
+
# redirect_to :action => "cookie_instructions"
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# ==How It Works
|
34
|
+
#
|
35
|
+
# CookieRequirement adds a before_filter to the controller in which it is
|
36
|
+
# included. This filter checks if the invoked action requires cookies. If so,
|
37
|
+
# it sets a test cookie and redirects to the same action, adding a query
|
38
|
+
# parameter to indicate that a test cookie should exist. If the cookie does
|
39
|
+
# not exist after the redirection, CookieRequirement concludes that cookies
|
40
|
+
# are disabled and calls +handle_cookies_disabled+, which, by default, raises
|
41
|
+
# +CookiesDisabled+.
|
42
|
+
#
|
43
|
+
# Note: CookieRequirement adds the before_filter when it is included. If you
|
44
|
+
# want other before_filters to run before CookieRequirement, declare them
|
45
|
+
# before including CookieRequirement.
|
46
|
+
#
|
47
|
+
# ==Acknowledgments
|
48
|
+
#
|
49
|
+
# CookieRequirement is based on
|
50
|
+
# * Blog post by James Halberg:
|
51
|
+
# http://jameshalberg.wordpress.com/2006/05/12/requiring-and-testing-cookies/
|
52
|
+
# * SSL Requirement David Heinemeier Hansson:
|
53
|
+
# http://dev.rubyonrails.org/svn/rails/plugins/ssl_requirement/
|
54
|
+
|
55
|
+
module CookieRequirement
|
56
|
+
|
57
|
+
class CookiesDisabled < StandardError
|
58
|
+
end
|
59
|
+
|
60
|
+
DEFAULT_TEST_COOKIE_NAME = "test_cookie"
|
61
|
+
DEFAULT_TEST_COOKIE_WRITTEN_PARAMETER_NAME = "tcw"
|
62
|
+
|
63
|
+
def self.included(controller)
|
64
|
+
controller.extend(ClassMethods)
|
65
|
+
controller.before_filter(:ensure_cookies)
|
66
|
+
end
|
67
|
+
|
68
|
+
module ClassMethods
|
69
|
+
|
70
|
+
def cookies_required( *actions )
|
71
|
+
write_inheritable_array( :cookies_required_actions, actions )
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
# Returns whether the invoked action has been declared to require cookies
|
78
|
+
# with +cookies_required+. Override to take into account other factors.
|
79
|
+
def cookies_required?
|
80
|
+
( self.class.read_inheritable_attribute( :cookies_required_actions ) || [] ).include?( action_name.to_sym )
|
81
|
+
end
|
82
|
+
|
83
|
+
# Override to handle disabled cookies in another way.
|
84
|
+
def handle_cookies_disabled
|
85
|
+
raise CookiesDisabled, "Action #{self.params[ :action ]} in controller #{self.params[ :controller ]} requires cookies"
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns the name of the test cookie, "test_cookie" by default. Override
|
89
|
+
# if this name conflicts.
|
90
|
+
def get_test_cookie_name
|
91
|
+
self.class::DEFAULT_TEST_COOKIE_NAME
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the name of the parameter added upon redirection to indicate that
|
95
|
+
# a test cookie has been written, "tcw" by default (short for test cookie
|
96
|
+
# written). Override if this name conflicts.
|
97
|
+
def get_test_cookie_written_parameter_name
|
98
|
+
self.class::DEFAULT_TEST_COOKIE_WRITTEN_PARAMETER_NAME
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def ensure_cookies
|
104
|
+
if cookies_required? && !test_cookie_exists?
|
105
|
+
if test_cookie_written?
|
106
|
+
handle_cookies_disabled
|
107
|
+
else
|
108
|
+
write_test_cookie
|
109
|
+
redirect_to( append_parameter_to_uri( get_full_request_uri, get_test_cookie_written_parameter_name, "1" ) )
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_cookie_exists?
|
115
|
+
!cookies[ get_test_cookie_name ].nil?
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_cookie_written?
|
119
|
+
!params[ get_test_cookie_written_parameter_name ].nil?
|
120
|
+
end
|
121
|
+
|
122
|
+
def write_test_cookie
|
123
|
+
cookies[ get_test_cookie_name ] = "test"
|
124
|
+
end
|
125
|
+
|
126
|
+
def get_full_request_uri
|
127
|
+
request.protocol + request.host_with_port + request.request_uri
|
128
|
+
end
|
129
|
+
|
130
|
+
def append_parameter_to_uri( uri, name, value )
|
131
|
+
new_uri = URI.parse( uri )
|
132
|
+
|
133
|
+
if new_uri.query.nil?
|
134
|
+
new_uri.query = ""
|
135
|
+
else
|
136
|
+
new_uri.query << "&"
|
137
|
+
end
|
138
|
+
|
139
|
+
new_uri.query << URI.escape( name ) << "=" << URI.escape( value )
|
140
|
+
new_uri.to_s
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cookie_requirement
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jonah Burke
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-01 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: actionpack
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 3
|
33
|
+
- 0
|
34
|
+
version: 2.3.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: activesupport
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 3
|
49
|
+
- 0
|
50
|
+
version: 2.3.0
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Ensure cookies are enabled in a Rails app.
|
54
|
+
email:
|
55
|
+
- jonah@jonahb.com
|
56
|
+
executables: []
|
57
|
+
|
58
|
+
extensions: []
|
59
|
+
|
60
|
+
extra_rdoc_files: []
|
61
|
+
|
62
|
+
files:
|
63
|
+
- lib/cookie_requirement.rb
|
64
|
+
has_rdoc: true
|
65
|
+
homepage: http://github.com/jonahb/cookie_requirement
|
66
|
+
licenses: []
|
67
|
+
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ~>
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 57
|
79
|
+
segments:
|
80
|
+
- 1
|
81
|
+
- 8
|
82
|
+
- 7
|
83
|
+
version: 1.8.7
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 17
|
90
|
+
segments:
|
91
|
+
- 1
|
92
|
+
- 3
|
93
|
+
- 5
|
94
|
+
version: 1.3.5
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 1.3.7
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: Ensure cookies are enabled in a Rails app.
|
102
|
+
test_files: []
|
103
|
+
|