BigW Consortium Gitlab

Commit aefa8bdb by Yorick Peterse Committed by James Edwards-Jones

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

Fix deletion of deploy keys linked to other projects Closes #35630 See merge request !13162
parent 1d1f9a7c
...@@ -1263,7 +1263,18 @@ class Project < ActiveRecord::Base ...@@ -1263,7 +1263,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:
...@@ -2201,19 +2201,43 @@ describe Project, models: true do ...@@ -2201,19 +2201,43 @@ describe Project, models: true 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