Commit 0771109bb8f7d8a1b8132439806675110b1c9fd3

Authored by Dmitriy Zaporozhets
1 parent 995d193d

Fix permission issue with highest access level for group

If user was a member of both group and project and group access level
was higher it was not respected and user got lowest project access
level. Now it is fixed and user get highest access level

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/models/project_team.rb
... ... @@ -118,19 +118,30 @@ class ProjectTeam
118 118 end
119 119  
120 120 def guest?(user)
121   - find_tm(user.id).try(:access_field) == Gitlab::Access::GUEST
  121 + max_tm_access(user.id) == Gitlab::Access::GUEST
122 122 end
123 123  
124 124 def reporter?(user)
125   - find_tm(user.id).try(:access_field) == Gitlab::Access::REPORTER
  125 + max_tm_access(user.id) == Gitlab::Access::REPORTER
126 126 end
127 127  
128 128 def developer?(user)
129   - find_tm(user.id).try(:access_field) == Gitlab::Access::DEVELOPER
  129 + max_tm_access(user.id) == Gitlab::Access::DEVELOPER
130 130 end
131 131  
132 132 def master?(user)
133   - find_tm(user.id).try(:access_field) == Gitlab::Access::MASTER
  133 + max_tm_access(user.id) == Gitlab::Access::MASTER
  134 + end
  135 +
  136 + def max_tm_access(user_id)
  137 + access = []
  138 + access << project.users_projects.find_by(user_id: user_id).try(:access_field)
  139 +
  140 + if group
  141 + access << group.users_groups.find_by(user_id: user_id).try(:access_field)
  142 + end
  143 +
  144 + access.compact.max
134 145 end
135 146  
136 147 private
... ...
spec/models/project_team_spec.rb
1 1 require "spec_helper"
2 2  
3 3 describe ProjectTeam do
4   - let(:group) { create(:group) }
5   - let(:project) { create(:empty_project, group: group) }
6   -
7 4 let(:master) { create(:user) }
8 5 let(:reporter) { create(:user) }
9 6 let(:guest) { create(:user) }
10 7 let(:nonmember) { create(:user) }
11 8  
12   - before do
13   - group.add_user(master, Gitlab::Access::MASTER)
14   - group.add_user(reporter, Gitlab::Access::REPORTER)
15   - group.add_user(guest, Gitlab::Access::GUEST)
  9 + context 'personal project' do
  10 + let(:project) { create(:empty_project) }
16 11  
17   - # Add group guest as master to this project
18   - # to test project access priority over group members
19   - project.team << [guest, :master]
20   - end
  12 + before do
  13 + project.team << [master, :master]
  14 + project.team << [reporter, :reporter]
  15 + project.team << [guest, :guest]
  16 + end
21 17  
22   - describe 'members collection' do
23   - it { project.team.masters.should include(master) }
24   - it { project.team.masters.should include(guest) }
25   - it { project.team.masters.should_not include(reporter) }
26   - it { project.team.masters.should_not include(nonmember) }
  18 + describe 'members collection' do
  19 + it { project.team.masters.should include(master) }
  20 + it { project.team.masters.should_not include(guest) }
  21 + it { project.team.masters.should_not include(reporter) }
  22 + it { project.team.masters.should_not include(nonmember) }
  23 + end
  24 +
  25 + describe 'access methods' do
  26 + it { project.team.master?(master).should be_true }
  27 + it { project.team.master?(guest).should be_false }
  28 + it { project.team.master?(reporter).should be_false }
  29 + it { project.team.master?(nonmember).should be_false }
  30 + end
27 31 end
28 32  
29   - describe 'access methods' do
30   - it { project.team.master?(master).should be_true }
31   - it { project.team.master?(guest).should be_true }
32   - it { project.team.master?(reporter).should be_false }
33   - it { project.team.master?(nonmember).should be_false }
  33 + context 'group project' do
  34 + let(:group) { create(:group) }
  35 + let(:project) { create(:empty_project, group: group) }
  36 +
  37 + before do
  38 + group.add_user(master, Gitlab::Access::MASTER)
  39 + group.add_user(reporter, Gitlab::Access::REPORTER)
  40 + group.add_user(guest, Gitlab::Access::GUEST)
  41 +
  42 + # If user is a group and a project member - GitLab uses highest permission
  43 + # So we add group guest as master and add group master as guest
  44 + # to this project to test highest access
  45 + project.team << [guest, :master]
  46 + project.team << [master, :guest]
  47 + end
  48 +
  49 + describe 'members collection' do
  50 + it { project.team.reporters.should include(reporter) }
  51 + it { project.team.masters.should include(master) }
  52 + it { project.team.masters.should include(guest) }
  53 + it { project.team.masters.should_not include(reporter) }
  54 + it { project.team.masters.should_not include(nonmember) }
  55 + end
  56 +
  57 + describe 'access methods' do
  58 + it { project.team.reporter?(reporter).should be_true }
  59 + it { project.team.master?(master).should be_true }
  60 + it { project.team.master?(guest).should be_true }
  61 + it { project.team.master?(reporter).should be_false }
  62 + it { project.team.master?(nonmember).should be_false }
  63 + end
34 64 end
35 65 end
36 66  
... ...