Fall back to project repository type by default

This makes sure that we always have a repository type when trying to
parse a repository from a path.

This is needed because sometimes we want to perform access checks as
if the project already existed, for example when creating a project on
push.

Before this we were only doing that when accessing git over http, this
makes sure it also works correctly when accessing git over SSH
This commit is contained in:
Bob Van Landuyt 2019-04-05 10:51:42 +00:00 committed by Douwe Maan
parent 934dabaf6d
commit 2fdda74458
5 changed files with 30 additions and 7 deletions

View File

@ -98,10 +98,8 @@ class Projects::GitHttpClientController < Projects::ApplicationController
def repo_type
parse_repo_path unless defined?(@repo_type)
# When there a project did not exist, the parsed repo_type would be empty.
# In that case, we want to continue with a regular project repository. As we
# could create the project if the user pushing is allowed to do so.
@repo_type || Gitlab::GlRepository::PROJECT
@repo_type
end
def handle_basic_authentication(login, password)

View File

@ -35,5 +35,9 @@ module Gitlab
[project, type]
end
def self.default_type
PROJECT
end
end
end

View File

@ -24,7 +24,10 @@ module Gitlab
return [project, type, redirected_path] if project
end
nil
# When a project did not exist, the parsed repo_type would be empty.
# In that case, we want to continue with a regular project repository. As we
# could create the project if the user pushing is allowed to do so.
[nil, Gitlab::GlRepository.default_type, nil]
end
def self.find_project(project_path)

View File

@ -44,8 +44,10 @@ describe ::Gitlab::RepoPath do
end
end
it "returns nil for non existent paths" do
expect(described_class.parse("path/non-existent.git")).to eq(nil)
it "returns the default type for non existent paths" do
_project, type, _redirected = described_class.parse("path/non-existent.git")
expect(type).to eq(Gitlab::GlRepository.default_type)
end
end

View File

@ -644,6 +644,22 @@ describe API::Internal do
expect(response).to have_gitlab_http_status(404)
expect(json_response["status"]).to be_falsey
end
it 'returns a 200 response when using a project path that does not exist' do
post(
api("/internal/allowed"),
params: {
key_id: key.id,
project: 'project/does-not-exist.git',
action: 'git-upload-pack',
secret_token: secret_token,
protocol: 'ssh'
}
)
expect(response).to have_gitlab_http_status(404)
expect(json_response["status"]).to be_falsey
end
end
context 'user does not exist' do