Prevent CSRF bypass with login form

This commit is contained in:
Tom Hughes 2021-02-10 19:37:51 +00:00
parent a17bd24f82
commit 1f136a84a6
5 changed files with 33 additions and 5 deletions

View file

@ -276,7 +276,7 @@ class UsersController < ApplicationController
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

View file

@ -406,6 +406,25 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
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

View file

@ -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
@ -19,8 +20,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
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
@ -31,8 +33,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
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
@ -44,8 +47,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
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

View file

@ -12,6 +12,8 @@ class PageLocaleTest < ActionDispatch::IntegrationTest
def test_defaulting
user = create(:user, :languages => [])
get "/login"
follow_redirect!
post "/login", :params => { :username => user.email, :password => "test" }
follow_redirect!
@ -33,6 +35,8 @@ class PageLocaleTest < ActionDispatch::IntegrationTest
get "/diary", :params => { :locale => "es" }
assert_select "html[lang=?]", "es"
get "/login"
follow_redirect!
post "/login", :params => { :username => user.email, :password => "test" }
follow_redirect!

View file

@ -243,6 +243,7 @@ module ActiveSupport
end
def session_for(user)
get login_path
post login_path, :params => { :username => user.display_name, :password => "test" }
follow_redirect!
end