cookie_requirement 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|