Commit 95e220de authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'sh-issue-53419-fix' into 'master'

Fix Bitbucket Server import not allowing personal projects

Closes #53419

See merge request gitlab-org/gitlab-ce!23601
parents 08c80098 eafccaad
...@@ -13,7 +13,10 @@ class Import::BitbucketServerController < Import::BaseController ...@@ -13,7 +13,10 @@ class Import::BitbucketServerController < Import::BaseController
# Repository names are limited to 128 characters. They must start with a # Repository names are limited to 128 characters. They must start with a
# letter or number and may contain spaces, hyphens, underscores, and periods. # letter or number and may contain spaces, hyphens, underscores, and periods.
# (https://community.atlassian.com/t5/Answers-Developer-Questions/stash-repository-names/qaq-p/499054) # (https://community.atlassian.com/t5/Answers-Developer-Questions/stash-repository-names/qaq-p/499054)
VALID_BITBUCKET_CHARS = /\A[\w\-_\.\s]+\z/ #
# Bitbucket Server starts personal project names with a tilde.
VALID_BITBUCKET_PROJECT_CHARS = /\A~?[\w\-\.\s]+\z/
VALID_BITBUCKET_CHARS = /\A[\w\-\.\s]+\z/
def new def new
end end
...@@ -91,7 +94,7 @@ class Import::BitbucketServerController < Import::BaseController ...@@ -91,7 +94,7 @@ class Import::BitbucketServerController < Import::BaseController
return render_validation_error('Missing project key') unless @project_key.present? && @repo_slug.present? return render_validation_error('Missing project key') unless @project_key.present? && @repo_slug.present?
return render_validation_error('Missing repository slug') unless @repo_slug.present? return render_validation_error('Missing repository slug') unless @repo_slug.present?
return render_validation_error('Invalid project key') unless @project_key =~ VALID_BITBUCKET_CHARS return render_validation_error('Invalid project key') unless @project_key =~ VALID_BITBUCKET_PROJECT_CHARS
return render_validation_error('Invalid repository slug') unless @repo_slug =~ VALID_BITBUCKET_CHARS return render_validation_error('Invalid repository slug') unless @repo_slug =~ VALID_BITBUCKET_CHARS
end end
......
...@@ -8,7 +8,9 @@ module ImportHelper ...@@ -8,7 +8,9 @@ module ImportHelper
end end
def sanitize_project_name(name) def sanitize_project_name(name)
name.gsub(/[^\w\-]/, '-') # For personal projects in Bitbucket in the form ~username, we can
# just drop that leading tilde.
name.gsub(/\A~+/, '').gsub(/[^\w\-]/, '-')
end end
def import_project_target(owner, name) def import_project_target(owner, name)
......
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
.project-path.input-group-prepend .project-path.input-group-prepend
- if current_user.can_select_namespace? - if current_user.can_select_namespace?
- selected = params[:namespace_id] || :extra_group - selected = params[:namespace_id] || :extra_group
- opts = current_user.can_create_group? ? { extra_group: Group.new(name: repo.project_key, path: repo.project_key) } : {} - opts = current_user.can_create_group? ? { extra_group: Group.new(name: sanitize_project_name(repo.project_key), path: sanitize_project_name(repo.project_key)) } : {}
= select_tag :namespace_id, namespaces_options(selected, opts.merge({ display_path: true })), { class: 'input-group-text select2 js-select-namespace', tabindex: 1 } = select_tag :namespace_id, namespaces_options(selected, opts.merge({ display_path: true })), { class: 'input-group-text select2 js-select-namespace', tabindex: 1 }
- else - else
= text_field_tag :path, current_user.namespace_path, class: "input-group-text input-large form-control", tabindex: 1, disabled: true = text_field_tag :path, current_user.namespace_path, class: "input-group-text input-large form-control", tabindex: 1, disabled: true
......
---
title: Fix Bitbucket Server import not allowing personal projects
merge_request: 23601
author:
type: fixed
...@@ -28,9 +28,11 @@ describe Import::BitbucketServerController do ...@@ -28,9 +28,11 @@ describe Import::BitbucketServerController do
end end
describe 'POST create' do describe 'POST create' do
let(:project_name) { "my-project_123" }
before do before do
allow(controller).to receive(:bitbucket_client).and_return(client) allow(controller).to receive(:bitbucket_client).and_return(client)
repo = double(name: 'my-project') repo = double(name: project_name)
allow(client).to receive(:repo).with(project_key, repo_slug).and_return(repo) allow(client).to receive(:repo).with(project_key, repo_slug).and_return(repo)
assign_session_tokens assign_session_tokens
end end
...@@ -39,7 +41,7 @@ describe Import::BitbucketServerController do ...@@ -39,7 +41,7 @@ describe Import::BitbucketServerController do
it 'returns the new project' do it 'returns the new project' do
allow(Gitlab::BitbucketServerImport::ProjectCreator) allow(Gitlab::BitbucketServerImport::ProjectCreator)
.to receive(:new).with(project_key, repo_slug, anything, 'my-project', user.namespace, user, anything) .to receive(:new).with(project_key, repo_slug, anything, project_name, user.namespace, user, anything)
.and_return(double(execute: project)) .and_return(double(execute: project))
post :create, params: { project: project_key, repository: repo_slug }, format: :json post :create, params: { project: project_key, repository: repo_slug }, format: :json
...@@ -47,6 +49,20 @@ describe Import::BitbucketServerController do ...@@ -47,6 +49,20 @@ describe Import::BitbucketServerController do
expect(response).to have_gitlab_http_status(200) expect(response).to have_gitlab_http_status(200)
end end
context 'with project key with tildes' do
let(:project_key) { '~someuser_123' }
it 'successfully creates a project' do
allow(Gitlab::BitbucketServerImport::ProjectCreator)
.to receive(:new).with(project_key, repo_slug, anything, project_name, user.namespace, user, anything)
.and_return(double(execute: project))
post :create, params: { project: project_key, repository: repo_slug, format: :json }
expect(response).to have_gitlab_http_status(200)
end
end
it 'returns an error when an invalid project key is used' do it 'returns an error when an invalid project key is used' do
post :create, params: { project: 'some&project' } post :create, params: { project: 'some&project' }
...@@ -69,7 +85,7 @@ describe Import::BitbucketServerController do ...@@ -69,7 +85,7 @@ describe Import::BitbucketServerController do
it 'returns an error when the project cannot be saved' do it 'returns an error when the project cannot be saved' do
allow(Gitlab::BitbucketServerImport::ProjectCreator) allow(Gitlab::BitbucketServerImport::ProjectCreator)
.to receive(:new).with(project_key, repo_slug, anything, 'my-project', user.namespace, user, anything) .to receive(:new).with(project_key, repo_slug, anything, project_name, user.namespace, user, anything)
.and_return(double(execute: build(:project))) .and_return(double(execute: build(:project)))
post :create, params: { project: project_key, repository: repo_slug }, format: :json post :create, params: { project: project_key, repository: repo_slug }, format: :json
......
...@@ -2,6 +2,10 @@ require 'rails_helper' ...@@ -2,6 +2,10 @@ require 'rails_helper'
describe ImportHelper do describe ImportHelper do
describe '#sanitize_project_name' do describe '#sanitize_project_name' do
it 'removes leading tildes' do
expect(helper.sanitize_project_name('~~root')).to eq('root')
end
it 'removes whitespace' do it 'removes whitespace' do
expect(helper.sanitize_project_name('my test repo')).to eq('my-test-repo') expect(helper.sanitize_project_name('my test repo')).to eq('my-test-repo')
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment