From 69cb5fba59a86af0e3311c3ff3e00d0c391797f0 Mon Sep 17 00:00:00 2001 From: Francesco Levorato Date: Thu, 17 Sep 2015 15:44:59 +0200 Subject: Make Project#find_with_namespace case-insensitive --- app/models/project.rb | 4 ++-- spec/models/project_spec.rb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 6e2f9645661..3b233f2b890 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -235,10 +235,10 @@ class Project < ActiveRecord::Base return nil unless id.include?('/') id = id.split('/') - namespace = Namespace.find_by(path: id.first) + namespace = Namespace.by_path(id.first) return nil unless namespace - where(namespace_id: namespace.id).find_by(path: id.second) + where(namespace_id: namespace.id).where("LOWER(projects.path) = :path", path: id.second.downcase).first end def visibility_levels diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 2fcbd5ae108..5aaa3af4d20 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -220,6 +220,7 @@ describe Project do end it { expect(Project.find_with_namespace('gitlab/gitlabhq')).to eq(@project) } + it { expect(Project.find_with_namespace('GitLab/GitlabHQ')).to eq(@project) } it { expect(Project.find_with_namespace('gitlab-ci')).to be_nil } end end -- cgit v1.2.1 From 6bff207dfdb37618f0f4291abf40d25127836dfe Mon Sep 17 00:00:00 2001 From: Francesco Levorato Date: Thu, 17 Sep 2015 16:06:55 +0200 Subject: Refactor spec to go through ApplicationController#project --- spec/controllers/projects/issues_controller_spec.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index 871b9219ca9..dd45e84f74b 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -8,12 +8,11 @@ describe Projects::IssuesController do before do sign_in(user) project.team << [user, :developer] - controller.instance_variable_set(:@project, project) end describe "GET #index" do it "returns index" do - get :index, namespace_id: project.namespace.id, project_id: project.id + get :index, namespace_id: project.namespace.path, project_id: project.path expect(response.status).to eq(200) end @@ -22,14 +21,15 @@ describe Projects::IssuesController do project.issues_enabled = false project.save - get :index, namespace_id: project.namespace.id, project_id: project.id + get :index, namespace_id: project.namespace.path, project_id: project.path expect(response.status).to eq(404) end it "returns 404 when external issue tracker is enabled" do + controller.instance_variable_set(:@project, project) allow(project).to receive(:default_issues_tracker?).and_return(false) - get :index, namespace_id: project.namespace.id, project_id: project.id + get :index, namespace_id: project.namespace.path, project_id: project.path expect(response.status).to eq(404) end -- cgit v1.2.1 From 1bbcc29687e9d5cef52e630f1e85d4c9f81fca07 Mon Sep 17 00:00:00 2001 From: Francesco Levorato Date: Thu, 17 Sep 2015 15:56:16 +0200 Subject: Redirect case sensitive project path to the normalized one --- app/controllers/application_controller.rb | 7 ++++++- spec/controllers/projects/issues_controller_spec.rb | 6 ++++++ spec/controllers/projects_controller_spec.rb | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9b6472a7b13..527c9da0faa 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -117,9 +117,14 @@ class ApplicationController < ActionController::Base redirect_to request.original_url.gsub(/\.git\Z/, '') and return end - @project = Project.find_with_namespace("#{namespace}/#{id}") + project_path = "#{namespace}/#{id}" + @project = Project.find_with_namespace(project_path) + if @project and can?(current_user, :read_project, @project) + if @project.path_with_namespace != project_path + redirect_to request.original_url.gsub(project_path, @project.path_with_namespace) and return + end @project elsif current_user.nil? @project = nil diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index dd45e84f74b..76d56bc989d 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -17,6 +17,12 @@ describe Projects::IssuesController do expect(response.status).to eq(200) end + it "return 301 if request path doesn't match project path" do + get :index, namespace_id: project.namespace.path, project_id: project.path.upcase + + expect(response).to redirect_to(namespace_project_issues_path(project.namespace, project)) + end + it "returns 404 when issues are disabled" do project.issues_enabled = false project.save diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 29233e9fae6..33eedc4dc81 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -21,6 +21,20 @@ describe ProjectsController do expect(response.body).to include("content='#{content}'") end end + + context "when requested with case sensitive namespace and project path" do + it "redirects to the normalized path for case mismatch" do + get :show, namespace_id: public_project.namespace.path, id: public_project.path.upcase + + expect(response).to redirect_to("/#{public_project.path_with_namespace}") + end + + it "loads the page if normalized path matches request path" do + get :show, namespace_id: public_project.namespace.path, id: public_project.path + + expect(response.status).to eq(200) + end + end end describe "POST #toggle_star" do -- cgit v1.2.1 From f1ae825015220685ce020fbc1a3f00155f809111 Mon Sep 17 00:00:00 2001 From: Francesco Levorato Date: Thu, 17 Sep 2015 16:15:51 +0200 Subject: Update Changelog --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 7a54700af04..ac46633f401 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -55,6 +55,7 @@ v 8.0.0 (unreleased) - Webhook for issue now contains repository field (Jungkook Park) - Add ability to add custom text to the help page (Jeroen van Baarsen) - Add pg_schema to backup config + - Redirect from incorrectly cased group or project path to correct one (Francesco Levorato) v 7.14.3 - No changes -- cgit v1.2.1 From 333463ddf280180d1878186160eb5a5e9c5c6e3e Mon Sep 17 00:00:00 2001 From: Francesco Levorato Date: Fri, 18 Sep 2015 00:04:38 +0200 Subject: Fix indentation --- spec/controllers/projects_controller_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 33eedc4dc81..21beaf37fce 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -24,9 +24,9 @@ describe ProjectsController do context "when requested with case sensitive namespace and project path" do it "redirects to the normalized path for case mismatch" do - get :show, namespace_id: public_project.namespace.path, id: public_project.path.upcase + get :show, namespace_id: public_project.namespace.path, id: public_project.path.upcase - expect(response).to redirect_to("/#{public_project.path_with_namespace}") + expect(response).to redirect_to("/#{public_project.path_with_namespace}") end it "loads the page if normalized path matches request path" do -- cgit v1.2.1