]> git.openstreetmap.org Git - rails.git/commitdiff
Validate any origin passed the auth failure callback
authorTom Hughes <tom@compton.nu>
Tue, 23 Nov 2021 17:19:55 +0000 (17:19 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 23 Nov 2021 17:33:19 +0000 (17:33 +0000)
Fixes #3375

app/controllers/users_controller.rb
test/controllers/users_controller_test.rb

index b90fbea11c761f4b611368cb75b6ae5a074d8741..23263ebba2267a8815988d43ca06fae1afcf28e4 100644 (file)
@@ -332,7 +332,10 @@ class UsersController < ApplicationController
   # omniauth failure callback
   def auth_failure
     flash[:error] = t(params[:message], :scope => "users.auth_failure", :default => t("users.auth_failure.unknown_error"))
-    redirect_to params[:origin] || login_url
+
+    origin = safe_referer(params[:origin]) if params[:origin]
+
+    redirect_to origin || login_url
   end
 
   private
index 23c67794a4d6465bbffff988203f1bdea78d056e..44b5471ac35ce7128c3dc5bb7e8056690a230c2e 100644 (file)
@@ -896,4 +896,18 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
     assert_equal "deleted", normal_user.reload.status
     assert_equal "deleted", confirmed_user.reload.status
   end
+
+  def test_auth_failure_callback
+    get auth_failure_path
+    assert_response :redirect
+    assert_redirected_to login_path
+
+    get auth_failure_path, :params => { :origin => "/" }
+    assert_response :redirect
+    assert_redirected_to root_path
+
+    get auth_failure_path, :params => { :origin => "http://www.google.com" }
+    assert_response :redirect
+    assert_redirected_to login_path
+  end
 end