2009-12-22 18:11:21 -05:00
|
|
|
require 'active_support/core_ext/hash/keys'
|
2010-09-20 04:18:44 -04:00
|
|
|
require 'action_dispatch/middleware/session/abstract_store'
|
|
|
|
require 'rack/session/cookie'
|
2009-08-27 02:07:55 -04:00
|
|
|
|
2009-01-27 19:54:01 -05:00
|
|
|
module ActionDispatch
|
2008-12-15 17:33:31 -05:00
|
|
|
module Session
|
|
|
|
# This cookie-based session store is the Rails default. Sessions typically
|
|
|
|
# contain at most a user_id and flash message; both fit within the 4K cookie
|
|
|
|
# size limit. Cookie-based sessions are dramatically faster than the
|
|
|
|
# alternatives.
|
|
|
|
#
|
|
|
|
# If you have more than 4K of session data or don't want your data to be
|
|
|
|
# visible to the user, pick another session store.
|
|
|
|
#
|
|
|
|
# CookieOverflow is raised if you attempt to store more than 4K of data.
|
|
|
|
#
|
|
|
|
# A message digest is included with the cookie to ensure data integrity:
|
|
|
|
# a user cannot alter his +user_id+ without knowing the secret key
|
|
|
|
# included in the hash. New apps are generated with a pregenerated secret
|
|
|
|
# in config/environment.rb. Set your own for old apps you're upgrading.
|
|
|
|
#
|
|
|
|
# Session options:
|
|
|
|
#
|
|
|
|
# * <tt>:secret</tt>: An application-wide key string or block returning a
|
|
|
|
# string called per generated digest. The block is called with the
|
|
|
|
# CGI::Session instance as an argument. It's important that the secret
|
|
|
|
# is not vulnerable to a dictionary attack. Therefore, you should choose
|
|
|
|
# a secret consisting of random numbers and letters and more than 30
|
2012-05-15 02:51:54 -04:00
|
|
|
# characters.
|
2008-12-15 17:33:31 -05:00
|
|
|
#
|
|
|
|
# :secret => '449fe2e7daee471bffae2fd8dc02313d'
|
|
|
|
# :secret => Proc.new { User.current_user.secret_key }
|
|
|
|
#
|
|
|
|
# * <tt>:digest</tt>: The message digest algorithm used to verify session
|
|
|
|
# integrity defaults to 'SHA1' but may be any digest provided by OpenSSL,
|
|
|
|
# such as 'MD5', 'RIPEMD160', 'SHA256', etc.
|
|
|
|
#
|
|
|
|
# To generate a secret key for an existing application, run
|
2010-07-09 09:58:58 -04:00
|
|
|
# "rake secret" and set the key in config/initializers/secret_token.rb.
|
2008-12-15 17:33:31 -05:00
|
|
|
#
|
|
|
|
# Note that changing digest or secret invalidates all existing sessions!
|
2010-09-20 04:18:44 -04:00
|
|
|
class CookieStore < Rack::Session::Cookie
|
|
|
|
include Compatibility
|
|
|
|
include StaleSessionCheck
|
2012-05-04 14:26:03 -04:00
|
|
|
include SessionObject
|
2007-03-13 16:44:16 -04:00
|
|
|
|
2012-09-01 07:21:49 -04:00
|
|
|
# Override rack's method
|
|
|
|
def destroy_session(env, session_id, options)
|
|
|
|
new_sid = super
|
|
|
|
# Reset hash and Assign the new session id
|
|
|
|
env["action_dispatch.request.unsigned_session_cookie"] = new_sid ? { "session_id" => new_sid } : {}
|
|
|
|
new_sid
|
|
|
|
end
|
|
|
|
|
2010-05-17 21:18:23 -04:00
|
|
|
private
|
2007-02-21 04:17:38 -05:00
|
|
|
|
2010-09-20 04:18:44 -04:00
|
|
|
def unpacked_cookie_data(env)
|
|
|
|
env["action_dispatch.request.unsigned_session_cookie"] ||= begin
|
|
|
|
stale_session_check! do
|
|
|
|
request = ActionDispatch::Request.new(env)
|
|
|
|
if data = request.cookie_jar.signed[@key]
|
|
|
|
data.stringify_keys!
|
2010-06-25 06:14:59 -04:00
|
|
|
end
|
2010-09-20 04:18:44 -04:00
|
|
|
data || {}
|
2010-06-22 09:55:50 -04:00
|
|
|
end
|
|
|
|
end
|
2010-09-20 04:18:44 -04:00
|
|
|
end
|
2010-06-22 09:55:50 -04:00
|
|
|
|
2010-09-20 04:18:44 -04:00
|
|
|
def set_session(env, sid, session_data, options)
|
2012-03-24 10:20:43 -04:00
|
|
|
session_data["session_id"] = sid
|
|
|
|
session_data
|
2010-09-20 04:18:44 -04:00
|
|
|
end
|
2010-06-22 09:55:50 -04:00
|
|
|
|
2010-09-20 04:18:44 -04:00
|
|
|
def set_cookie(env, session_id, cookie)
|
|
|
|
request = ActionDispatch::Request.new(env)
|
|
|
|
request.cookie_jar.signed[@key] = cookie
|
|
|
|
end
|
2008-11-23 10:42:15 -05:00
|
|
|
end
|
2008-12-15 17:33:31 -05:00
|
|
|
end
|
2007-02-21 04:17:38 -05:00
|
|
|
end
|