Commit db8e7eab authored by Yorick Peterse's avatar Yorick Peterse

Merge branch 'mk-fix-deploy-key-deletion' into 'master'

Fix deletion of deploy keys linked to other projects

Closes #35630

See merge request !13162
parents c8a8d13d f5fc912b
...@@ -1265,7 +1265,18 @@ class Project < ActiveRecord::Base ...@@ -1265,7 +1265,18 @@ class Project < ActiveRecord::Base
end end
def remove_private_deploy_keys def remove_private_deploy_keys
deploy_keys.where(public: false).delete_all exclude_keys_linked_to_other_projects = <<-SQL
NOT EXISTS (
SELECT 1
FROM deploy_keys_projects dkp2
WHERE dkp2.deploy_key_id = deploy_keys_projects.deploy_key_id
AND dkp2.project_id != deploy_keys_projects.project_id
)
SQL
deploy_keys.where(public: false)
.where(exclude_keys_linked_to_other_projects)
.delete_all
end end
def remove_pages def remove_pages
......
---
title: Fix deletion of deploy keys linked to other projects
merge_request: 13162
author:
...@@ -2238,19 +2238,43 @@ describe Project do ...@@ -2238,19 +2238,43 @@ describe Project do
end end
describe '#remove_private_deploy_keys' do describe '#remove_private_deploy_keys' do
it 'removes the private deploy keys of a project' do let!(:project) { create(:empty_project) }
project = create(:empty_project)
context 'for a private deploy key' do
let!(:key) { create(:deploy_key, public: false) }
let!(:deploy_keys_project) { create(:deploy_keys_project, deploy_key: key, project: project) }
context 'when the key is not linked to another project' do
it 'removes the key' do
project.remove_private_deploy_keys
expect(project.deploy_keys).not_to include(key)
end
end
context 'when the key is linked to another project' do
before do
another_project = create(:empty_project)
create(:deploy_keys_project, deploy_key: key, project: another_project)
end
private_key = create(:deploy_key, public: false) it 'does not remove the key' do
public_key = create(:deploy_key, public: true) project.remove_private_deploy_keys
create(:deploy_keys_project, deploy_key: private_key, project: project) expect(project.deploy_keys).to include(key)
create(:deploy_keys_project, deploy_key: public_key, project: project) end
end
end
context 'for a public deploy key' do
let!(:key) { create(:deploy_key, public: true) }
let!(:deploy_keys_project) { create(:deploy_keys_project, deploy_key: key, project: project) }
project.remove_private_deploy_keys it 'does not remove the key' do
project.remove_private_deploy_keys
expect(project.deploy_keys.where(public: false).any?).to eq(false) expect(project.deploy_keys).to include(key)
expect(project.deploy_keys.where(public: true).any?).to eq(true) end
end end
end end
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