Skip to content

Commit

Permalink
Session cookie header should always be set if :expire_after option is…
Browse files Browse the repository at this point in the history
… specified
  • Loading branch information
lifo committed Jan 28, 2009
1 parent 9714a9b commit 2ae8d30
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 8 deletions.
6 changes: 4 additions & 2 deletions actionpack/lib/action_controller/session/abstract_store.rb
Expand Up @@ -102,8 +102,10 @@ def call(env)
response = @app.call(env)

session_data = env[ENV_SESSION_KEY]
if !session_data.is_a?(AbstractStore::SessionHash) || session_data.send(:loaded?)
options = env[ENV_SESSION_OPTIONS_KEY]
options = env[ENV_SESSION_OPTIONS_KEY]

if !session_data.is_a?(AbstractStore::SessionHash) || session_data.send(:loaded?) || options[:expire_after]
session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.send(:loaded?)

if session_data.is_a?(AbstractStore::SessionHash)
sid = session_data.id
Expand Down
6 changes: 4 additions & 2 deletions actionpack/lib/action_controller/session/cookie_store.rb
Expand Up @@ -93,12 +93,14 @@ def call(env)
status, headers, body = @app.call(env)

session_data = env[ENV_SESSION_KEY]
if !session_data.is_a?(AbstractStore::SessionHash) || session_data.send(:loaded?)
options = env[ENV_SESSION_OPTIONS_KEY]

if !session_data.is_a?(AbstractStore::SessionHash) || session_data.send(:loaded?) || options[:expire_after]
session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.send(:loaded?)
session_data = marshal(session_data.to_hash)

raise CookieOverflow if session_data.size > MAX

options = env[ENV_SESSION_OPTIONS_KEY]
cookie = Hash.new
cookie[:value] = session_data
unless options[:expire_after].nil?
Expand Down
36 changes: 32 additions & 4 deletions actionpack/test/controller/session/cookie_store_test.rb
Expand Up @@ -6,13 +6,11 @@ class CookieStoreTest < ActionController::IntegrationTest
SessionSecret = 'b3c631c314c0bbca50c1b2843150fe33'

DispatcherApp = ActionController::Dispatcher.new
CookieStoreApp = ActionController::Session::CookieStore.new(DispatcherApp,
:key => SessionKey, :secret => SessionSecret)
CookieStoreApp = ActionController::Session::CookieStore.new(DispatcherApp, :key => SessionKey, :secret => SessionSecret)

Verifier = ActiveSupport::MessageVerifier.new(SessionSecret, 'SHA1')

SignedBar = "BAh7BjoIZm9vIghiYXI%3D--" +
"fef868465920f415f2c0652d6910d3af288a0367"
SignedBar = "BAh7BjoIZm9vIghiYXI%3D--fef868465920f415f2c0652d6910d3af288a0367"

class TestController < ActionController::Base
def no_session_access
Expand Down Expand Up @@ -177,6 +175,36 @@ def test_persistent_session_id
end
end

def test_session_store_with_expire_after
app = ActionController::Session::CookieStore.new(DispatcherApp, :key => SessionKey, :secret => SessionSecret, :expire_after => 5.hours)
@integration_session = open_session(app)

with_test_route_set do
# First request accesses the session
time = Time.local(2008, 4, 24)
Time.stubs(:now).returns(time)
expected_expiry = (time + 5.hours).gmtime.strftime("%a, %d-%b-%Y %H:%M:%S GMT")

cookies[SessionKey] = SignedBar

get '/set_session_value'
assert_response :success

cookie_body = response.body
assert_equal ["_myapp_session=#{cookie_body}; path=/; expires=#{expected_expiry}; httponly"], headers['Set-Cookie']

# Second request does not access the session
time = Time.local(2008, 4, 25)
Time.stubs(:now).returns(time)
expected_expiry = (time + 5.hours).gmtime.strftime("%a, %d-%b-%Y %H:%M:%S GMT")

get '/no_session_access'
assert_response :success

assert_equal ["_myapp_session=#{cookie_body}; path=/; expires=#{expected_expiry}; httponly"], headers['Set-Cookie']
end
end

private
def with_test_route_set
with_routing do |set|
Expand Down

0 comments on commit 2ae8d30

Please sign in to comment.