cookie_requirement 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+