Skip to content

Commit f1cf655

Browse files
committed
Merge branch 'sh-fix-issue-53783-ce' into 'master'
Fix enabling project deploy key for admins See merge request gitlab-org/gitlab-ce!23043
2 parents 82e7fc8 + 7be7f57 commit f1cf655

File tree

5 files changed

+175
-17
lines changed

5 files changed

+175
-17
lines changed

app/controllers/projects/deploy_keys_controller.rb

+5-6
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,26 @@ def update
4646
end
4747

4848
def enable
49-
Projects::EnableDeployKeyService.new(@project, current_user, params).execute
49+
key = Projects::EnableDeployKeyService.new(@project, current_user, params).execute
50+
51+
return render_404 unless key
5052

5153
respond_to do |format|
5254
format.html { redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings') }
5355
format.json { head :ok }
5456
end
5557
end
5658

57-
# rubocop: disable CodeReuse/ActiveRecord
5859
def disable
59-
deploy_key_project = @project.deploy_keys_projects.find_by(deploy_key_id: params[:id])
60-
return render_404 unless deploy_key_project
60+
deploy_key_project = Projects::DisableDeployKeyService.new(@project, current_user, params).execute
6161

62-
deploy_key_project.destroy!
62+
return render_404 unless deploy_key_project
6363

6464
respond_to do |format|
6565
format.html { redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings') }
6666
format.json { head :ok }
6767
end
6868
end
69-
# rubocop: enable CodeReuse/ActiveRecord
7069

7170
protected
7271

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# frozen_string_literal: true
2+
3+
module Projects
4+
class DisableDeployKeyService < BaseService
5+
def execute
6+
# rubocop: disable CodeReuse/ActiveRecord
7+
deploy_key_project = project.deploy_keys_projects.find_by(deploy_key_id: params[:id])
8+
# rubocop: enable CodeReuse/ActiveRecord
9+
10+
deploy_key_project&.destroy!
11+
end
12+
end
13+
end

app/services/projects/enable_deploy_key_service.rb

+9-5
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
module Projects
44
class EnableDeployKeyService < BaseService
5-
# rubocop: disable CodeReuse/ActiveRecord
65
def execute
7-
key = accessible_keys.find_by(id: params[:key_id] || params[:id])
6+
key_id = params[:key_id] || params[:id]
7+
key = find_accessible_key(key_id)
8+
89
return unless key
910

1011
unless project.deploy_keys.include?(key)
@@ -13,12 +14,15 @@ def execute
1314

1415
key
1516
end
16-
# rubocop: enable CodeReuse/ActiveRecord
1717

1818
private
1919

20-
def accessible_keys
21-
current_user.accessible_deploy_keys
20+
def find_accessible_key(key_id)
21+
if current_user.admin?
22+
DeployKey.find_by_id(key_id)
23+
else
24+
current_user.accessible_deploy_keys.find_by_id(key_id)
25+
end
2226
end
2327
end
2428
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: Fix enabling project deploy key for admins
3+
merge_request: 23043
4+
author:
5+
type: fixed

spec/controllers/projects/deploy_keys_controller_spec.rb

+143-6
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,8 @@
2727
let(:project2) { create(:project, :internal)}
2828
let(:project_private) { create(:project, :private)}
2929

30-
let(:deploy_key_internal) do
31-
create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCdMHEHyhRjbhEZVddFn6lTWdgEy5Q6Bz4nwGB76xWZI5YT/1WJOMEW+sL5zYd31kk7sd3FJ5L9ft8zWMWrr/iWXQikC2cqZK24H1xy+ZUmrRuJD4qGAaIVoyyzBL+avL+lF8J5lg6YSw8gwJY/lX64/vnJHUlWw2n5BF8IFOWhiw== [email protected]')
32-
end
33-
let(:deploy_key_actual) do
34-
create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNd/UJWhPrpb+b/G5oL109y57yKuCxE+WUGJGYaj7WQKsYRJmLYh1mgjrl+KVyfsWpq4ylOxIfFSnN9xBBFN8mlb0Fma5DC7YsSsibJr3MZ19ZNBprwNcdogET7aW9I0In7Wu5f2KqI6e5W/spJHCy4JVxzVMUvk6Myab0LnJ2iQ== [email protected]')
35-
end
30+
let(:deploy_key_internal) { create(:deploy_key) }
31+
let(:deploy_key_actual) { create(:deploy_key) }
3632
let!(:deploy_key_public) { create(:deploy_key, public: true) }
3733

3834
let!(:deploy_keys_project_internal) do
@@ -63,4 +59,145 @@
6359
end
6460
end
6561
end
62+
63+
describe '/enable/:id' do
64+
let(:deploy_key) { create(:deploy_key) }
65+
let(:project2) { create(:project) }
66+
let!(:deploy_keys_project_internal) do
67+
create(:deploy_keys_project, project: project2, deploy_key: deploy_key)
68+
end
69+
70+
context 'with anonymous user' do
71+
before do
72+
sign_out(:user)
73+
end
74+
75+
it 'redirects to login' do
76+
expect do
77+
put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
78+
end.not_to change { DeployKeysProject.count }
79+
80+
expect(response).to have_http_status(302)
81+
expect(response).to redirect_to(new_user_session_path)
82+
end
83+
end
84+
85+
context 'with user with no permission' do
86+
before do
87+
sign_in(create(:user))
88+
end
89+
90+
it 'returns 404' do
91+
expect do
92+
put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
93+
end.not_to change { DeployKeysProject.count }
94+
95+
expect(response).to have_http_status(404)
96+
end
97+
end
98+
99+
context 'with user with permission' do
100+
before do
101+
project2.add_maintainer(user)
102+
end
103+
104+
it 'returns 302' do
105+
expect do
106+
put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
107+
end.to change { DeployKeysProject.count }.by(1)
108+
109+
expect(DeployKeysProject.where(project_id: project.id, deploy_key_id: deploy_key.id).count).to eq(1)
110+
expect(response).to have_http_status(302)
111+
expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
112+
end
113+
114+
it 'returns 404' do
115+
put :enable, id: 0, namespace_id: project.namespace, project_id: project
116+
117+
expect(response).to have_http_status(404)
118+
end
119+
end
120+
121+
context 'with admin' do
122+
before do
123+
sign_in(create(:admin))
124+
end
125+
126+
it 'returns 302' do
127+
expect do
128+
put :enable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
129+
end.to change { DeployKeysProject.count }.by(1)
130+
131+
expect(DeployKeysProject.where(project_id: project.id, deploy_key_id: deploy_key.id).count).to eq(1)
132+
expect(response).to have_http_status(302)
133+
expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
134+
end
135+
end
136+
end
137+
138+
describe '/disable/:id' do
139+
let(:deploy_key) { create(:deploy_key) }
140+
let!(:deploy_key_project) { create(:deploy_keys_project, project: project, deploy_key: deploy_key) }
141+
142+
context 'with anonymous user' do
143+
before do
144+
sign_out(:user)
145+
end
146+
147+
it 'redirects to login' do
148+
put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
149+
150+
expect(response).to have_http_status(302)
151+
expect(response).to redirect_to(new_user_session_path)
152+
expect(DeployKey.find(deploy_key.id)).to eq(deploy_key)
153+
end
154+
end
155+
156+
context 'with user with no permission' do
157+
before do
158+
sign_in(create(:user))
159+
end
160+
161+
it 'returns 404' do
162+
put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
163+
164+
expect(response).to have_http_status(404)
165+
expect(DeployKey.find(deploy_key.id)).to eq(deploy_key)
166+
end
167+
end
168+
169+
context 'with user with permission' do
170+
it 'returns 302' do
171+
put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
172+
173+
expect(response).to have_http_status(302)
174+
expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
175+
176+
expect { DeployKey.find(deploy_key.id) }.to raise_error(ActiveRecord::RecordNotFound)
177+
end
178+
179+
it 'returns 404' do
180+
put :disable, id: 0, namespace_id: project.namespace, project_id: project
181+
182+
expect(response).to have_http_status(404)
183+
end
184+
end
185+
186+
context 'with admin' do
187+
before do
188+
sign_in(create(:admin))
189+
end
190+
191+
it 'returns 302' do
192+
expect do
193+
put :disable, id: deploy_key.id, namespace_id: project.namespace, project_id: project
194+
end.to change { DeployKey.count }.by(-1)
195+
196+
expect(response).to have_http_status(302)
197+
expect(response).to redirect_to(namespace_project_settings_repository_path(anchor: 'js-deploy-keys-settings'))
198+
199+
expect { DeployKey.find(deploy_key.id) }.to raise_error(ActiveRecord::RecordNotFound)
200+
end
201+
end
202+
end
66203
end

0 commit comments

Comments
 (0)