From 0658519fdbe73c4ad51660c0ba20a636ec163b74 Mon Sep 17 00:00:00 2001 From: Kenneth Chu Date: Wed, 25 Sep 2024 15:09:19 +1000 Subject: [PATCH 1/3] Redirect `/-/g/:id` to groups page --- app/controllers/groups/redirect_controller.rb | 25 +++++++++++ config/routes.rb | 2 + .../groups/redirect_controller_spec.rb | 42 +++++++++++++++++++ spec/routing/group_routing_spec.rb | 6 +++ 4 files changed, 75 insertions(+) create mode 100644 app/controllers/groups/redirect_controller.rb create mode 100644 spec/requests/groups/redirect_controller_spec.rb diff --git a/app/controllers/groups/redirect_controller.rb b/app/controllers/groups/redirect_controller.rb new file mode 100644 index 00000000000000..d17ee9844c9cce --- /dev/null +++ b/app/controllers/groups/redirect_controller.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Groups + class RedirectController < ::ApplicationController + skip_before_action :authenticate_user! + + feature_category :groups_and_projects + + def redirect_from_id + group = Group.find(group_params[:id]) + + if can?(current_user, :read_group, group) + redirect_to group + else + render_404 + end + end + + private + + def group_params + params.permit(:id) + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 3fede72eebb3b5..0520961784bac2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -270,6 +270,8 @@ resources :groups, only: [:index, :new, :create] + get '/-/g/:id' => 'groups/redirect#redirect_from_id' + draw :group resources :projects, only: [:index, :new, :create] diff --git a/spec/requests/groups/redirect_controller_spec.rb b/spec/requests/groups/redirect_controller_spec.rb new file mode 100644 index 00000000000000..bd8ea696602a64 --- /dev/null +++ b/spec/requests/groups/redirect_controller_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe "Groups::RedirectController requests", feature_category: :groups_and_projects do + using RSpec::Parameterized::TableSyntax + + let_it_be(:private_group) { create(:group, :private) } + let_it_be(:private_group2) { create(:group, :private) } + let_it_be(:public_group) { create(:group, :public) } + let_it_be(:user) { create(:user, developer_of: private_group) } + + describe 'GET redirect_from_id' do + where(:authenticated, :group, :is_found) do + true | ref(:private_group) | true + false | ref(:private_group) | false + true | ref(:private_group2) | false + true | ref(:public_group) | true + false | ref(:public_group) | true + true | build(:group, id: 0) | false + end + + with_them do + before do + sign_in(user) if authenticated + + get "/-/g/#{group.id}" + end + + if params[:is_found] + it 'redirects to the group page' do + expect(response).to have_gitlab_http_status(:found) + expect(response).to redirect_to(group_path(group)) + end + else + it 'gives 404' do + expect(response).to have_gitlab_http_status(:not_found) + end + end + end + end +end diff --git a/spec/routing/group_routing_spec.rb b/spec/routing/group_routing_spec.rb index 5282c30787e7ee..0ca6e2fe0912e6 100644 --- a/spec/routing/group_routing_spec.rb +++ b/spec/routing/group_routing_spec.rb @@ -153,4 +153,10 @@ end end end + + describe Groups::RedirectController, 'routing' do + it 'to #redirect_from_id' do + expect(get('/-/g/1')).to route_to('groups/redirect#redirect_from_id', id: '1') + end + end end -- GitLab From dc413b24fbbd6e9ef75d6a83c8670c17942dbbec Mon Sep 17 00:00:00 2001 From: Kenneth Chu Date: Wed, 25 Sep 2024 15:09:29 +1000 Subject: [PATCH 2/3] Redirect `/-/p/:id` to project page for consistency --- config/routes.rb | 1 + spec/requests/projects/redirect_controller_spec.rb | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 0520961784bac2..27577cc7e378df 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -277,6 +277,7 @@ resources :projects, only: [:index, :new, :create] get '/projects/:id' => 'projects/redirect#redirect_from_id' + get '/-/p/:id' => 'projects/redirect#redirect_from_id' draw :git_http draw :api diff --git a/spec/requests/projects/redirect_controller_spec.rb b/spec/requests/projects/redirect_controller_spec.rb index 46b233b353c9f5..bc11f36cec5599 100644 --- a/spec/requests/projects/redirect_controller_spec.rb +++ b/spec/requests/projects/redirect_controller_spec.rb @@ -6,13 +6,15 @@ using RSpec::Parameterized::TableSyntax let_it_be(:private_project) { create(:project, :private) } + let_it_be(:private_project2) { create(:project, :private) } let_it_be(:public_project) { create(:project, :public) } let_it_be(:user) { create(:user, developer_of: private_project) } - describe 'GET redirect_from_id' do + shared_examples 'project redirect' do |endpoint_format| where(:authenticated, :project, :is_found) do true | ref(:private_project) | true false | ref(:private_project) | false + true | ref(:private_project2) | false true | ref(:public_project) | true false | ref(:public_project) | true true | build(:project, id: 0) | false @@ -22,7 +24,7 @@ before do sign_in(user) if authenticated - get "/projects/#{project.id}" + get format(endpoint_format, id: project.id) end if params[:is_found] @@ -38,6 +40,11 @@ end end + describe 'GET redirect_from_id' do + it_behaves_like 'project redirect', '/projects/%{id}' + it_behaves_like 'project redirect', '/-/p/%{id}' + end + # This is a regression test for https://gitlab.com/gitlab-org/gitlab/-/issues/351058 context 'with sourcegraph enabled' do let_it_be(:sourcegraph_url) { 'https://sourcegraph.test' } -- GitLab From ee62d9aa6c7b630f82f48745f1021ace5606c0f9 Mon Sep 17 00:00:00 2001 From: Kenneth Chu Date: Fri, 27 Sep 2024 11:44:03 +1000 Subject: [PATCH 3/3] Add new project redirect route to spec Co-authored-by: Andy Schoenen --- spec/routing/project_routing_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb index e00366af15b428..073edc367aa331 100644 --- a/spec/routing/project_routing_spec.rb +++ b/spec/routing/project_routing_spec.rb @@ -75,6 +75,7 @@ describe Projects::RedirectController, 'routing' do it 'to #redirect_from_id' do expect(get('/projects/1')).to route_to('projects/redirect#redirect_from_id', id: '1') + expect(get('/-/p/1')).to route_to('projects/redirect#redirect_from_id', id: '1') end end -- GitLab