Commit acb5376b authored by Jan Provaznik's avatar Jan Provaznik

Merge branch 'fix-epic-link-create-perm' into 'master'

Check user permissions correctly

See merge request gitlab-org/gitlab!24946
parents 2dd90ff5 d533b4f8
...@@ -346,7 +346,7 @@ module EE ...@@ -346,7 +346,7 @@ module EE
elsif parent.has_ancestor?(self) elsif parent.has_ancestor?(self)
errors.add :parent, "This epic can't be added as it is already assigned to this epic's ancestor" errors.add :parent, "This epic can't be added as it is already assigned to this epic's ancestor"
elsif !preloaded_parent_group_and_descendants.include?(group) elsif !preloaded_parent_group_and_descendants.include?(group)
errors.add :parent, "This epic can't be added because parent and child epics must belong to the same group" errors.add :parent, "This epic can't be added because it must belong to the same group as the parent, or subgroup of the parent epic’s group"
elsif level_depth_exceeded?(parent) elsif level_depth_exceeded?(parent)
errors.add :parent, "This epic can't be added as the maximum depth of nested epics would be exceeded" errors.add :parent, "This epic can't be added as the maximum depth of nested epics would be exceeded"
end end
......
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
module EpicLinks module EpicLinks
class CreateService < IssuableLinks::CreateService class CreateService < IssuableLinks::CreateService
def execute def execute
unless can?(current_user, :admin_epic, issuable.group)
return error(issuables_not_found_message, 404)
end
if issuable.max_hierarchy_depth_achieved? if issuable.max_hierarchy_depth_achieved?
return error("This epic can't be added because the parent is already at the maximum depth from its most distant ancestor", 409) return error("This epic can't be added because the parent is already at the maximum depth from its most distant ancestor", 409)
end end
...@@ -54,8 +58,6 @@ module EpicLinks ...@@ -54,8 +58,6 @@ module EpicLinks
def linkable_issuables(epics) def linkable_issuables(epics)
@linkable_issuables ||= begin @linkable_issuables ||= begin
return [] unless can?(current_user, :admin_epic, issuable.group)
epics.select do |epic| epics.select do |epic|
linkable_epic?(epic) linkable_epic?(epic)
end end
......
...@@ -70,9 +70,18 @@ describe EpicLinks::CreateService do ...@@ -70,9 +70,18 @@ describe EpicLinks::CreateService do
context 'when a single epic is given' do context 'when a single epic is given' do
subject { add_epic([valid_reference]) } subject { add_epic([valid_reference]) }
context 'when an epic from a another group is given' do context 'when a user does not have permissions to add an epic' do
include_examples 'returns an error'
end
context 'when a user has permissions to add an epic' do
before do
group.add_developer(user)
end
context 'when an epic from another group is given' do
let(:other_group) { create(:group) } let(:other_group) { create(:group) }
let(:expected_error) { "This epic can't be added because parent and child epics must belong to the same group" } let(:expected_error) { "This epic can't be added because it must belong to the same group as the parent, or subgroup of the parent epic’s group" }
let(:expected_code) { 409 } let(:expected_code) { 409 }
before do before do
...@@ -145,7 +154,7 @@ describe EpicLinks::CreateService do ...@@ -145,7 +154,7 @@ describe EpicLinks::CreateService do
include_examples 'returns an error' include_examples 'returns an error'
end end
context 'when total depth after adding would exceed limit' do context 'when total depth after adding would exceed depth limit' do
let(:expected_error) { "This epic can't be added as the maximum depth of nested epics would be exceeded" } let(:expected_error) { "This epic can't be added as the maximum depth of nested epics would be exceeded" }
let(:expected_code) { 409 } let(:expected_code) { 409 }
...@@ -164,6 +173,7 @@ describe EpicLinks::CreateService do ...@@ -164,6 +173,7 @@ describe EpicLinks::CreateService do
include_examples 'returns an error' include_examples 'returns an error'
end end
end end
end
context 'when multiple epics are given' do context 'when multiple epics are given' do
let(:another_epic) { create(:epic) } let(:another_epic) { create(:epic) }
...@@ -174,6 +184,15 @@ describe EpicLinks::CreateService do ...@@ -174,6 +184,15 @@ describe EpicLinks::CreateService do
) )
end end
context 'when a user dos not have permissions to add an epic' do
include_examples 'returns an error'
end
context 'when a user has permissions to add an epic' do
before do
group.add_developer(user)
end
context 'when adding epics that are already a child of the parent epic' do context 'when adding epics that are already a child of the parent epic' do
let(:expected_error) { 'Epic(s) already assigned' } let(:expected_error) { 'Epic(s) already assigned' }
let(:expected_code) { 409 } let(:expected_code) { 409 }
...@@ -229,19 +248,20 @@ describe EpicLinks::CreateService do ...@@ -229,19 +248,20 @@ describe EpicLinks::CreateService do
include_examples 'returns an error' include_examples 'returns an error'
end end
end end
end
end
context 'when user has permissions to link the epic' do
before do
group.add_developer(user)
end
context 'when the reference list is empty' do context 'when the reference list is empty' do
subject { add_epic([]) } subject { add_epic([]) }
include_examples 'returns an error' include_examples 'returns an error'
end end
end
end
end
context 'when everything is ok' do
before do
group.add_developer(user)
end
context 'when a correct reference is given' do context 'when a correct reference is given' do
subject { add_epic([valid_reference]) } subject { add_epic([valid_reference]) }
......
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