Skip to content

Commit

Permalink
Prevent CSRF bypass with login form
Browse files Browse the repository at this point in the history
  • Loading branch information
tomhughes committed Feb 10, 2021
1 parent a17bd24 commit 1f136a8
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 5 deletions.
2 changes: 1 addition & 1 deletion app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ def login

session[:referer] = safe_referer(params[:referer]) if params[:referer]

if params[:username].present? && params[:password].present?
if request.post?
session[:remember_me] ||= params[:remember_me]
password_authentication(params[:username], params[:password])
end
Expand Down
19 changes: 19 additions & 0 deletions test/controllers/users_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,25 @@ def test_save_referer_params
ActionMailer::Base.deliveries.clear
end

def test_login
user = create(:user)

get login_path
assert_response :redirect
assert_redirected_to login_path(:cookie_test => true)
follow_redirect!
assert_response :success
assert_template "login"

get login_path, :params => { :username => user.display_name, :password => "test" }
assert_response :success
assert_template "login"

post login_path, :params => { :username => user.display_name, :password => "test" }
assert_response :redirect
assert_redirected_to root_path
end

def test_logout_without_referer
post logout_path
assert_response :redirect
Expand Down
12 changes: 8 additions & 4 deletions test/integration/oauth_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
def test_oauth10_web_app
client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)

post "/login", :params => { :username => client.user.email, :password => "test" }
get "/login"
follow_redirect!
post "/login", :params => { :username => client.user.email, :password => "test" }
follow_redirect!
assert_response :success

Expand All @@ -19,8 +20,9 @@ def test_oauth10_web_app
def test_oauth10_desktop_app
client = create(:client_application, :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)

post "/login", :params => { :username => client.user.email, :password => "test" }
get "/login"
follow_redirect!
post "/login", :params => { :username => client.user.email, :password => "test" }
follow_redirect!
assert_response :success

Expand All @@ -31,8 +33,9 @@ def test_oauth10_desktop_app
def test_oauth10a_web_app
client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)

post "/login", :params => { :username => client.user.email, :password => "test" }
get "/login"
follow_redirect!
post "/login", :params => { :username => client.user.email, :password => "test" }
follow_redirect!
assert_response :success

Expand All @@ -44,8 +47,9 @@ def test_oauth10a_web_app
def test_oauth10a_desktop_app
client = create(:client_application, :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)

post "/login", :params => { :username => client.user.email, :password => "test" }
get "/login"
follow_redirect!
post "/login", :params => { :username => client.user.email, :password => "test" }
follow_redirect!
assert_response :success

Expand Down
4 changes: 4 additions & 0 deletions test/integration/page_locale_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ def teardown
def test_defaulting
user = create(:user, :languages => [])

get "/login"
follow_redirect!
post "/login", :params => { :username => user.email, :password => "test" }
follow_redirect!

Expand All @@ -33,6 +35,8 @@ def test_override
get "/diary", :params => { :locale => "es" }
assert_select "html[lang=?]", "es"

get "/login"
follow_redirect!
post "/login", :params => { :username => user.email, :password => "test" }
follow_redirect!

Expand Down
1 change: 1 addition & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ def sign_in_as(user)
end

def session_for(user)
get login_path
post login_path, :params => { :username => user.display_name, :password => "test" }
follow_redirect!
end
Expand Down

0 comments on commit 1f136a8

Please sign in to comment.