Fix the redirect to custom home page URL and move it to RootController
Signed-off-by: Rémy Coutable <remy@rymai.me>
This commit is contained in:
parent
c72c8e9a0e
commit
b50b5a4461
4 changed files with 62 additions and 36 deletions
|
@ -72,14 +72,6 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def authenticate_user!(*args)
|
|
||||||
if redirect_to_home_page_url?
|
|
||||||
return redirect_to current_application_settings.home_page_url
|
|
||||||
end
|
|
||||||
|
|
||||||
super(*args)
|
|
||||||
end
|
|
||||||
|
|
||||||
def log_exception(exception)
|
def log_exception(exception)
|
||||||
application_trace = ActionDispatch::ExceptionWrapper.new(env, exception).application_trace
|
application_trace = ActionDispatch::ExceptionWrapper.new(env, exception).application_trace
|
||||||
application_trace.map!{ |t| " #{t}\n" }
|
application_trace.map!{ |t| " #{t}\n" }
|
||||||
|
@ -287,19 +279,6 @@ class ApplicationController < ActionController::Base
|
||||||
session[:skip_tfa] && session[:skip_tfa] > Time.current
|
session[:skip_tfa] && session[:skip_tfa] > Time.current
|
||||||
end
|
end
|
||||||
|
|
||||||
def redirect_to_home_page_url?
|
|
||||||
# If user is not signed-in and tries to access root_path - redirect him to landing page
|
|
||||||
# Don't redirect to the default URL to prevent endless redirections
|
|
||||||
return false unless current_application_settings.home_page_url.present?
|
|
||||||
|
|
||||||
home_page_url = current_application_settings.home_page_url.chomp('/')
|
|
||||||
root_urls = [Gitlab.config.gitlab['url'].chomp('/'), root_url.chomp('/')]
|
|
||||||
|
|
||||||
return false if root_urls.include?(home_page_url)
|
|
||||||
|
|
||||||
current_user.nil? && root_path == request.path
|
|
||||||
end
|
|
||||||
|
|
||||||
# U2F (universal 2nd factor) devices need a unique identifier for the application
|
# U2F (universal 2nd factor) devices need a unique identifier for the application
|
||||||
# to perform authentication.
|
# to perform authentication.
|
||||||
# https://developers.yubico.com/U2F/App_ID.html
|
# https://developers.yubico.com/U2F/App_ID.html
|
||||||
|
|
|
@ -8,7 +8,9 @@
|
||||||
# `DashboardController#show`, which is the default.
|
# `DashboardController#show`, which is the default.
|
||||||
class RootController < Dashboard::ProjectsController
|
class RootController < Dashboard::ProjectsController
|
||||||
skip_before_action :authenticate_user!, only: [:index]
|
skip_before_action :authenticate_user!, only: [:index]
|
||||||
before_action :redirect_to_custom_dashboard, only: [:index]
|
|
||||||
|
before_action :redirect_unlogged_user, if: -> { current_user.nil? }
|
||||||
|
before_action :redirect_logged_user, if: -> { current_user.present? }
|
||||||
|
|
||||||
def index
|
def index
|
||||||
super
|
super
|
||||||
|
@ -16,23 +18,38 @@ class RootController < Dashboard::ProjectsController
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def redirect_to_custom_dashboard
|
def redirect_unlogged_user
|
||||||
return redirect_to new_user_session_path unless current_user
|
if redirect_to_home_page_url?
|
||||||
|
redirect_to(current_application_settings.home_page_url)
|
||||||
|
else
|
||||||
|
redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def redirect_logged_user
|
||||||
case current_user.dashboard
|
case current_user.dashboard
|
||||||
when 'stars'
|
when 'stars'
|
||||||
flash.keep
|
flash.keep
|
||||||
redirect_to starred_dashboard_projects_path
|
redirect_to(starred_dashboard_projects_path)
|
||||||
when 'project_activity'
|
when 'project_activity'
|
||||||
redirect_to activity_dashboard_path
|
redirect_to(activity_dashboard_path)
|
||||||
when 'starred_project_activity'
|
when 'starred_project_activity'
|
||||||
redirect_to activity_dashboard_path(filter: 'starred')
|
redirect_to(activity_dashboard_path(filter: 'starred'))
|
||||||
when 'groups'
|
when 'groups'
|
||||||
redirect_to dashboard_groups_path
|
redirect_to(dashboard_groups_path)
|
||||||
when 'todos'
|
when 'todos'
|
||||||
redirect_to dashboard_todos_path
|
redirect_to(dashboard_todos_path)
|
||||||
else
|
|
||||||
return
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def redirect_to_home_page_url?
|
||||||
|
# If user is not signed-in and tries to access root_path - redirect him to landing page
|
||||||
|
# Don't redirect to the default URL to prevent endless redirections
|
||||||
|
return false unless current_application_settings.home_page_url.present?
|
||||||
|
|
||||||
|
home_page_url = current_application_settings.home_page_url.chomp('/')
|
||||||
|
root_urls = [Gitlab.config.gitlab['url'].chomp('/'), root_url.chomp('/')]
|
||||||
|
|
||||||
|
root_urls.exclude?(home_page_url)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Fix the redirect to custom home page URL
|
||||||
|
merge_request: 9518
|
||||||
|
author:
|
|
@ -2,6 +2,26 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe RootController do
|
describe RootController do
|
||||||
describe 'GET index' do
|
describe 'GET index' do
|
||||||
|
context 'when user is not logged in' do
|
||||||
|
it 'redirects to the sign-in page' do
|
||||||
|
get :index
|
||||||
|
|
||||||
|
expect(response).to redirect_to(new_user_session_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when a custom home page URL is defined' do
|
||||||
|
before do
|
||||||
|
stub_application_setting(home_page_url: 'https://gitlab.com')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects the user to the custom home page URL' do
|
||||||
|
get :index
|
||||||
|
|
||||||
|
expect(response).to redirect_to('https://gitlab.com')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'with a user' do
|
context 'with a user' do
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
|
@ -12,55 +32,60 @@ describe RootController do
|
||||||
|
|
||||||
context 'who has customized their dashboard setting for starred projects' do
|
context 'who has customized their dashboard setting for starred projects' do
|
||||||
before do
|
before do
|
||||||
user.update_attribute(:dashboard, 'stars')
|
user.dashboard = 'stars'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'redirects to their specified dashboard' do
|
it 'redirects to their specified dashboard' do
|
||||||
get :index
|
get :index
|
||||||
|
|
||||||
expect(response).to redirect_to starred_dashboard_projects_path
|
expect(response).to redirect_to starred_dashboard_projects_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'who has customized their dashboard setting for project activities' do
|
context 'who has customized their dashboard setting for project activities' do
|
||||||
before do
|
before do
|
||||||
user.update_attribute(:dashboard, 'project_activity')
|
user.dashboard = 'project_activity'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'redirects to the activity list' do
|
it 'redirects to the activity list' do
|
||||||
get :index
|
get :index
|
||||||
|
|
||||||
expect(response).to redirect_to activity_dashboard_path
|
expect(response).to redirect_to activity_dashboard_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'who has customized their dashboard setting for starred project activities' do
|
context 'who has customized their dashboard setting for starred project activities' do
|
||||||
before do
|
before do
|
||||||
user.update_attribute(:dashboard, 'starred_project_activity')
|
user.dashboard = 'starred_project_activity'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'redirects to the activity list' do
|
it 'redirects to the activity list' do
|
||||||
get :index
|
get :index
|
||||||
|
|
||||||
expect(response).to redirect_to activity_dashboard_path(filter: 'starred')
|
expect(response).to redirect_to activity_dashboard_path(filter: 'starred')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'who has customized their dashboard setting for groups' do
|
context 'who has customized their dashboard setting for groups' do
|
||||||
before do
|
before do
|
||||||
user.update_attribute(:dashboard, 'groups')
|
user.dashboard = 'groups'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'redirects to their group list' do
|
it 'redirects to their group list' do
|
||||||
get :index
|
get :index
|
||||||
|
|
||||||
expect(response).to redirect_to dashboard_groups_path
|
expect(response).to redirect_to dashboard_groups_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'who has customized their dashboard setting for todos' do
|
context 'who has customized their dashboard setting for todos' do
|
||||||
before do
|
before do
|
||||||
user.update_attribute(:dashboard, 'todos')
|
user.dashboard = 'todos'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'redirects to their todo list' do
|
it 'redirects to their todo list' do
|
||||||
get :index
|
get :index
|
||||||
|
|
||||||
expect(response).to redirect_to dashboard_todos_path
|
expect(response).to redirect_to dashboard_todos_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -68,6 +93,7 @@ describe RootController do
|
||||||
context 'who uses the default dashboard setting' do
|
context 'who uses the default dashboard setting' do
|
||||||
it 'renders the default dashboard' do
|
it 'renders the default dashboard' do
|
||||||
get :index
|
get :index
|
||||||
|
|
||||||
expect(response).to render_template 'dashboard/projects/index'
|
expect(response).to render_template 'dashboard/projects/index'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue