Commit b48440d8 authored by GitLab Release Tools Bot's avatar GitLab Release Tools Bot

Merge branch 'security-372-fix-approvers-override' into 'master'

Don't override approval rules if not allowed

See merge request gitlab/gitlab-ee!1055
parents e95b5c87 683274e4
...@@ -21,6 +21,8 @@ module ApprovalRules ...@@ -21,6 +21,8 @@ module ApprovalRules
end end
def execute def execute
params.delete(:approval_rules_attributes) unless current_user.can?(:update_approvers, target)
return params unless params.key?(:approval_rules_attributes) return params unless params.key?(:approval_rules_attributes)
params[:approval_rules_attributes].each do |rule_attributes| params[:approval_rules_attributes].each do |rule_attributes|
......
---
title: Don't override approval rules if not allowed
merge_request:
author:
type: security
...@@ -11,6 +11,8 @@ describe Projects::MergeRequests::CreationsController do ...@@ -11,6 +11,8 @@ describe Projects::MergeRequests::CreationsController do
end end
describe 'POST #create' do describe 'POST #create' do
let(:created_merge_request) { assigns(:merge_request) }
def create_merge_request(overrides = {}) def create_merge_request(overrides = {})
params = { params = {
namespace_id: project.namespace.to_param, namespace_id: project.namespace.to_param,
...@@ -27,8 +29,6 @@ describe Projects::MergeRequests::CreationsController do ...@@ -27,8 +29,6 @@ describe Projects::MergeRequests::CreationsController do
end end
context 'the approvals_before_merge param' do context 'the approvals_before_merge param' do
let(:created_merge_request) { assigns(:merge_request) }
before do before do
project.update(approvals_before_merge: 2) project.update(approvals_before_merge: 2)
end end
...@@ -97,5 +97,45 @@ describe Projects::MergeRequests::CreationsController do ...@@ -97,5 +97,45 @@ describe Projects::MergeRequests::CreationsController do
end end
end end
end end
context 'overriding approvers per MR' do
let(:new_approver) { create(:user) }
before do
project.add_developer(new_approver)
project.update(disable_overriding_approvers_per_merge_request: disable_overriding_approvers_per_merge_request)
create_merge_request(
approval_rules_attributes: [
{
name: 'Test',
user_ids: [new_approver.id],
approvals_required: 1
}
]
)
end
context 'enabled' do
let(:disable_overriding_approvers_per_merge_request) { false }
it 'does create approval rules' do
approval_rules = created_merge_request.reload.approval_rules
expect(approval_rules.count).to eq(1)
expect(approval_rules.first.name).to eq('Test')
expect(approval_rules.first.user_ids).to eq([new_approver.id])
expect(approval_rules.first.approvals_required).to eq(1)
end
end
context 'disabled' do
let(:disable_overriding_approvers_per_merge_request) { true }
it 'does not create approval rules' do
expect(created_merge_request.reload.approval_rules).to be_empty
end
end
end
end end
end end
...@@ -190,6 +190,20 @@ describe Projects::MergeRequestsController do ...@@ -190,6 +190,20 @@ describe Projects::MergeRequestsController do
expect(merge_request.reload.approver_group_ids).to be_empty expect(merge_request.reload.approver_group_ids).to be_empty
end end
it 'does not create approval rules' do
update_merge_request(
approval_rules_attributes: [
{
name: 'Test',
user_ids: [new_approver.id],
approvals_required: 1
}
]
)
expect(merge_request.reload.approval_rules).to be_empty
end
end end
end end
......
...@@ -18,20 +18,39 @@ describe ApprovalRules::ParamsFilteringService do ...@@ -18,20 +18,39 @@ describe ApprovalRules::ParamsFilteringService do
project.add_reporter(project_member) project.add_reporter(project_member)
accessible_group.add_developer(user) accessible_group.add_developer(user)
allow(Ability).to receive(:allowed?).and_call_original
allow(Ability)
.to receive(:allowed?)
.with(user, :update_approvers, merge_request)
.and_return(can_update_approvers?)
end end
it 'only assigns eligible users and groups' do context 'user can update approvers' do
params = service.execute let(:can_update_approvers?) { true }
it 'only assigns eligible users and groups' do
params = service.execute
rule1 = params[:approval_rules_attributes].first
rule1 = params[:approval_rules_attributes].first expect(rule1[:user_ids]).to contain_exactly(project_member.id)
expect(rule1[:user_ids]).to contain_exactly(project_member.id) rule2 = params[:approval_rules_attributes].last
expected_group_ids = expected_groups.map(&:id)
rule2 = params[:approval_rules_attributes].last expect(rule2[:user_ids]).to be_empty
expected_group_ids = expected_groups.map(&:id) expect(rule2[:group_ids]).to contain_exactly(*expected_group_ids)
end
end
expect(rule2[:user_ids]).to be_empty context 'user cannot update approvers' do
expect(rule2[:group_ids]).to contain_exactly(*expected_group_ids) let(:can_update_approvers?) { false }
it 'deletes the approval_rules_attributes from params' do
expect(service.execute).not_to have_key(:approval_rules_attributes)
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