Commit 71feb7578267fd306601fb7dacf2b875b64799c4

Authored by Dmitriy Zaporozhets
2 parents c83004a0 0771109b

Merge branch 'fix-permissions' into 'master'

Fix permissions

Fixes #1358
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  
... ...