Commit ad47f209 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'prevent-project-transfer' into 'master'

Prevent project transfer if a new group is not selected

Closes #25455

See merge request !11214
parents 3cfcbcf3 ad802385
...@@ -40,6 +40,7 @@ import Group from './group'; ...@@ -40,6 +40,7 @@ import Group from './group';
import GroupName from './group_name'; import GroupName from './group_name';
import GroupsList from './groups_list'; import GroupsList from './groups_list';
import ProjectsList from './projects_list'; import ProjectsList from './projects_list';
import setupProjectEdit from './project_edit';
import MiniPipelineGraph from './mini_pipeline_graph_dropdown'; import MiniPipelineGraph from './mini_pipeline_graph_dropdown';
import BlobLinePermalinkUpdater from './blob/blob_line_permalink_updater'; import BlobLinePermalinkUpdater from './blob/blob_line_permalink_updater';
import Landing from './landing'; import Landing from './landing';
...@@ -264,6 +265,9 @@ import ShortcutsBlob from './shortcuts_blob'; ...@@ -264,6 +265,9 @@ import ShortcutsBlob from './shortcuts_blob';
new BlobViewer(); new BlobViewer();
} }
break; break;
case 'projects:edit':
setupProjectEdit();
break;
case 'projects:pipelines:builds': case 'projects:pipelines:builds':
case 'projects:pipelines:failures': case 'projects:pipelines:failures':
case 'projects:pipelines:show': case 'projects:pipelines:show':
......
export default function setupProjectEdit() {
const $transferForm = $('.js-project-transfer-form');
const $selectNamespace = $transferForm.find('.select2');
$selectNamespace.on('change', () => {
$transferForm.find(':submit').prop('disabled', !$selectNamespace.val());
});
$selectNamespace.trigger('change');
}
...@@ -12,12 +12,13 @@ module Projects ...@@ -12,12 +12,13 @@ module Projects
TransferError = Class.new(StandardError) TransferError = Class.new(StandardError)
def execute(new_namespace) def execute(new_namespace)
if allowed_transfer?(current_user, project, new_namespace) if new_namespace.blank?
transfer(project, new_namespace) raise TransferError, 'Please select a new namespace for your project.'
else
project.errors.add(:new_namespace, 'is invalid')
false
end end
unless allowed_transfer?(current_user, project, new_namespace)
raise TransferError, 'Transfer failed, please contact an admin.'
end
transfer(project, new_namespace)
rescue Projects::TransferService::TransferError => ex rescue Projects::TransferService::TransferError => ex
project.reload project.reload
project.errors.add(:new_namespace, ex.message) project.errors.add(:new_namespace, ex.message)
......
...@@ -246,14 +246,16 @@ ...@@ -246,14 +246,16 @@
.row.prepend-top-default .row.prepend-top-default
.col-lg-3 .col-lg-3
%h4.prepend-top-0.danger-title %h4.prepend-top-0.danger-title
Transfer project Transfer project to new group
%p.append-bottom-0
Please select the group you want to transfer this project to in the dropdown to the right.
.col-lg-9 .col-lg-9
= form_for([@project.namespace.becomes(Namespace), @project], url: transfer_namespace_project_path(@project.namespace, @project), method: :put, remote: true) do |f| = form_for([@project.namespace.becomes(Namespace), @project], url: transfer_namespace_project_path(@project.namespace, @project), method: :put, remote: true, html: { class: 'js-project-transfer-form' } ) do |f|
.form-group .form-group
= label_tag :new_namespace_id, nil, class: 'label-light' do = label_tag :new_namespace_id, nil, class: 'label-light' do
%span Namespace %span Select a new namespace
.form-group .form-group
= select_tag :new_namespace_id, namespaces_options(@project.namespace_id), { prompt: 'Choose a project namespace', class: 'select2' } = select_tag :new_namespace_id, namespaces_options(nil), include_blank: true, class: 'select2'
%ul %ul
%li Be careful. Changing the project's namespace can have unintended side effects. %li Be careful. Changing the project's namespace can have unintended side effects.
%li You can only transfer the project to namespaces you manage. %li You can only transfer the project to namespaces you manage.
......
---
title: Prevent project transfers if a new group is not selected
merge_request:
author:
...@@ -226,6 +226,50 @@ describe ProjectsController do ...@@ -226,6 +226,50 @@ describe ProjectsController do
end end
end end
describe '#transfer' do
render_views
let(:project) { create(:project) }
let(:admin) { create(:admin) }
let(:new_namespace) { create(:namespace) }
it 'updates namespace' do
sign_in(admin)
put :transfer,
namespace_id: project.namespace.path,
new_namespace_id: new_namespace.id,
id: project.path,
format: :js
project.reload
expect(project.namespace).to eq(new_namespace)
expect(response).to have_http_status(200)
end
context 'when new namespace is empty' do
it 'project namespace is not changed' do
controller.instance_variable_set(:@project, project)
sign_in(admin)
old_namespace = project.namespace
put :transfer,
namespace_id: old_namespace.path,
new_namespace_id: nil,
id: project.path,
format: :js
project.reload
expect(project.namespace).to eq(old_namespace)
expect(response).to have_http_status(200)
expect(flash[:alert]).to eq 'Please select a new namespace for your project.'
end
end
end
describe "#destroy" do describe "#destroy" do
let(:admin) { create(:admin) } let(:admin) { create(:admin) }
......
...@@ -26,6 +26,7 @@ describe Projects::TransferService, services: true do ...@@ -26,6 +26,7 @@ describe Projects::TransferService, services: true do
it { expect(@result).to eq false } it { expect(@result).to eq false }
it { expect(project.namespace).to eq(user.namespace) } it { expect(project.namespace).to eq(user.namespace) }
it { expect(project.errors.messages[:new_namespace].first).to eq 'Please select a new namespace for your project.' }
end end
context 'disallow transfering of project with tags' do context 'disallow transfering of project with tags' do
......
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