Skip to content

Commit

Permalink
Refactor SessionFixationTest and WebServiceTest with IntegrationTest …
Browse files Browse the repository at this point in the history
…so they are compatible with the Rack interface.
  • Loading branch information
josh committed Dec 4, 2008
1 parent 57f0b97 commit 40e9ba1
Show file tree
Hide file tree
Showing 3 changed files with 235 additions and 198 deletions.
18 changes: 13 additions & 5 deletions actionpack/lib/action_controller/dispatcher.rb
Expand Up @@ -182,13 +182,21 @@ def handle_request
end

def failsafe_rescue(exception)
self.class.failsafe_response(@output, '500 Internal Server Error', exception) do
if @controller ||= (::ApplicationController rescue Base)
@controller.process_with_exception(@request, @response, exception).out(@output)
else
raise exception
if @test_request
process_with_exception(exception)
else
self.class.failsafe_response(@output, '500 Internal Server Error', exception) do
process_with_exception(exception)
end
end
end

def process_with_exception(exception)
if @controller ||= (::ApplicationController rescue Base)
@controller.process_with_exception(@request, @response, exception).out(@output)
else
raise exception
end
end
end
end
93 changes: 44 additions & 49 deletions actionpack/test/controller/session_fixation_test.rb
@@ -1,20 +1,13 @@
require 'abstract_unit'


class SessionFixationTest < Test::Unit::TestCase
class MockCGI < CGI #:nodoc:
attr_accessor :stdoutput, :env_table

def initialize(env, data = '')
self.env_table = env
self.stdoutput = StringIO.new
super(nil, StringIO.new(data))
end
end

class SessionFixationTest < ActionController::IntegrationTest
class TestController < ActionController::Base
session :session_key => '_myapp_session_id', :secret => CGI::Session.generate_unique_id, :except => :default_session_key
session :cookie_only => false, :only => :allow_session_fixation
session :session_key => '_myapp_session_id',
:secret => CGI::Session.generate_unique_id,
:except => :default_session_key

session :cookie_only => false,
:only => :allow_session_fixation

def default_session_key
render :text => "default_session_key"
Expand All @@ -36,54 +29,56 @@ def setup
end

def test_should_be_able_to_make_a_successful_request
cgi = mock_cgi_for_request_to(:custom_session_key, :id => 1)

assert_nothing_raised do
@controller.send(:process, ActionController::CgiRequest.new(cgi, {}), ActionController::CgiResponse.new(cgi))
with_test_route_set do
assert_nothing_raised do
get '/custom_session_key', :id => "1"
end
assert_equal 'custom_session_key: 1', @controller.response.body
assert_not_nil @controller.session
end
assert_equal 'custom_session_key: 1', @controller.response.body
assert_not_nil @controller.session
end

def test_should_catch_session_fixation_attempt
cgi = mock_cgi_for_request_to(:custom_session_key, :_myapp_session_id => 42)

assert_raises ActionController::CgiRequest::SessionFixationAttempt do
@controller.send(:process, ActionController::CgiRequest.new(cgi, {}), ActionController::CgiResponse.new(cgi))
with_test_route_set do
assert_raises(ActionController::RackRequest::SessionFixationAttempt) do
get '/custom_session_key', :_myapp_session_id => "42"
end
assert_nil @controller.session
end
assert_nil @controller.session
end

def test_should_not_catch_session_fixation_attempt_when_cookie_only_setting_is_disabled
cgi = mock_cgi_for_request_to(:allow_session_fixation, :_myapp_session_id => 42)

assert_nothing_raised do
@controller.send(:process, ActionController::CgiRequest.new(cgi, {}), ActionController::CgiResponse.new(cgi))
with_test_route_set do
assert_nothing_raised do
get '/allow_session_fixation', :_myapp_session_id => "42"
end
assert !@controller.response.body.blank?
assert_not_nil @controller.session
end
assert ! @controller.response.body.blank?
assert_not_nil @controller.session
end

def test_should_catch_session_fixation_attempt_with_default_session_key
ActionController::Base.session_store = :p_store # using the default session_key is not possible with cookie store
cgi = mock_cgi_for_request_to(:default_session_key, :_session_id => 42)

assert_raises ActionController::CgiRequest::SessionFixationAttempt do
@controller.send(:process, ActionController::CgiRequest.new(cgi, {}), ActionController::CgiResponse.new(cgi))
# using the default session_key is not possible with cookie store
ActionController::Base.session_store = :p_store

with_test_route_set do
assert_raises ActionController::RackRequest::SessionFixationAttempt do
get '/default_session_key', :_session_id => "42"
end
assert_nil @controller.response
assert_nil @controller.session
end
assert @controller.response.body.blank?
assert_nil @controller.session
end

private

def mock_cgi_for_request_to(action, params = {})
MockCGI.new({
"REQUEST_METHOD" => "GET",
"QUERY_STRING" => "action=#{action}&#{params.to_query}",
"REQUEST_URI" => "/",
"SERVER_PORT" => "80",
"HTTP_HOST" => "testdomain.com" }, '')
end

private
def with_test_route_set
with_routing do |set|
set.draw do |map|
map.with_options :controller => "session_fixation_test/test" do |c|
c.connect "/:action"
end
end
yield
end
end
end

0 comments on commit 40e9ba1

Please sign in to comment.