Skip to content

Commit 9b1b88f

Browse files
committed
Fixed reset_session for ActiveRecord session store [#2108 state:resolved]
1 parent 4d4d2c3 commit 9b1b88f

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

actionpack/test/activerecord/active_record_store_test.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ def get_session_value
2121
render :text => "foo: #{session[:foo].inspect}"
2222
end
2323

24+
def call_reset_session
25+
reset_session
26+
head :ok
27+
end
28+
2429
def rescue_action(e) raise end
2530
end
2631

@@ -61,6 +66,22 @@ def test_getting_nil_session_value
6166
end
6267
end
6368

69+
def test_setting_session_value_after_session_reset
70+
with_test_route_set do
71+
get '/set_session_value'
72+
assert_response :success
73+
assert cookies['_session_id']
74+
75+
get '/call_reset_session'
76+
assert_response :success
77+
assert_not_equal [], headers['Set-Cookie']
78+
79+
get '/get_session_value'
80+
assert_response :success
81+
assert_equal 'foo: nil', response.body
82+
end
83+
end
84+
6485
def test_prevents_session_fixation
6586
with_test_route_set do
6687
get '/set_session_value'

activerecord/lib/active_record/session_store.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,16 +287,15 @@ def destroy
287287
def get_session(env, sid)
288288
Base.silence do
289289
sid ||= generate_sid
290-
session = @@session_class.find_by_session_id(sid)
291-
session ||= @@session_class.new(:session_id => sid, :data => {})
290+
session = find_session(sid)
292291
env[SESSION_RECORD_KEY] = session
293292
[sid, session.data]
294293
end
295294
end
296295

297296
def set_session(env, sid, session_data)
298297
Base.silence do
299-
record = env[SESSION_RECORD_KEY]
298+
record = env[SESSION_RECORD_KEY] ||= find_session(sid)
300299
record.data = session_data
301300
return false unless record.save
302301

@@ -310,5 +309,10 @@ def set_session(env, sid, session_data)
310309

311310
return true
312311
end
312+
313+
def find_session(id)
314+
@@session_class.find_by_session_id(id) ||
315+
@@session_class.new(:session_id => id, :data => {})
316+
end
313317
end
314318
end

0 commit comments

Comments
 (0)