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.
Files changed (2) hide show
  1. data/lib/cookie_requirement.rb +143 -0
  2. 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
+