diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index 881fb3e9eca..31c14c66ca7 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -74,7 +74,10 @@ class Users::OmniauthCallbacksController < ApplicationController @auth_result.authenticator_name = authenticator.name complete_response_data cookies['_bypass_cache'] = true - cookies[:authentication_data] = @auth_result.to_client_hash.to_json + cookies[:authentication_data] = { + value: @auth_result.to_client_hash.to_json, + path: Discourse.base_uri + } redirect_to @origin end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 6c1f3b3074a..7fa77c809a9 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -58,8 +58,8 @@ <%= tag.meta id: 'data-discourse-setup', data: client_side_setup_data %> - <%- if !current_user && cookies[:authentication_data] %> - + <%- if (data = cookies.delete(:authentication_data, path: Discourse.base_uri)) && !current_user %> + <%- end %> diff --git a/spec/requests/application_controller_spec.rb b/spec/requests/application_controller_spec.rb index 4aaf547e33c..2c65450ae6f 100644 --- a/spec/requests/application_controller_spec.rb +++ b/spec/requests/application_controller_spec.rb @@ -84,6 +84,14 @@ RSpec.describe ApplicationController do expect(response).to redirect_to("/login") end end + + it 'contains authentication data when cookies exist' do + COOKIE_DATA = "someauthenticationdata" + cookies['authentication_data'] = COOKIE_DATA + get '/login' + expect(response.status).to eq(200) + expect(response.body).to include("data-authentication-data=\"#{COOKIE_DATA }\"") + end end describe '#redirect_to_second_factor_if_required' do diff --git a/spec/requests/omniauth_callbacks_controller_spec.rb b/spec/requests/omniauth_callbacks_controller_spec.rb index 204c3f1572c..e604a89aba4 100644 --- a/spec/requests/omniauth_callbacks_controller_spec.rb +++ b/spec/requests/omniauth_callbacks_controller_spec.rb @@ -269,6 +269,30 @@ RSpec.describe Users::OmniauthCallbacksController do expect(user.email_confirmed?).to eq(true) end + it 'should return the authenticated response with the correct path for subfolders' do + set_subfolder "/forum" + events = DiscourseEvent.track_events do + get "/auth/google_oauth2/callback.json" + end + + expect(response.headers["Set-Cookie"].match(/^authentication_data=.*; path=\/forum/)).not_to eq(nil) + + expect(events.map { |event| event[:event_name] }).to include(:user_logged_in, :user_first_logged_in) + + expect(response.status).to eq(302) + + data = JSON.parse(response.cookies["authentication_data"]) + + expect(data["authenticated"]).to eq(true) + expect(data["awaiting_activation"]).to eq(false) + expect(data["awaiting_approval"]).to eq(false) + expect(data["not_allowed_from_ip_address"]).to eq(false) + expect(data["admin_not_allowed_from_ip_address"]).to eq(false) + + user.reload + expect(user.email_confirmed?).to eq(true) + end + it "should confirm email even when the tokens are expired" do user.email_tokens.update_all(confirmed: false, expired: true)