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,19 +118,30 @@ class ProjectTeam
118 end 118 end
119 119
120 def guest?(user) 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 end 122 end
123 123
124 def reporter?(user) 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 end 126 end
127 127
128 def developer?(user) 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 end 130 end
131 131
132 def master?(user) 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 end 145 end
135 146
136 private 147 private
spec/models/project_team_spec.rb
1 require "spec_helper" 1 require "spec_helper"
2 2
3 describe ProjectTeam do 3 describe ProjectTeam do
4 - let(:group) { create(:group) }  
5 - let(:project) { create(:empty_project, group: group) }  
6 -  
7 let(:master) { create(:user) } 4 let(:master) { create(:user) }
8 let(:reporter) { create(:user) } 5 let(:reporter) { create(:user) }
9 let(:guest) { create(:user) } 6 let(:guest) { create(:user) }
10 let(:nonmember) { create(:user) } 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 end 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 end 64 end
35 end 65 end
36 66