Skip to content

Commit 2f3da6d

Browse files
authored
Correctly override user unitmodes (#35501)
Commit 6a97ab0 reworked team permission application. The introduced logic overrode the unitModes for *every* team a user is in, max(...) the current value and the team value together. The logic completely fails in case the team does not have a unit for the specific unit type defined, in which case the logic inserted the minimumVisibility, overriding any previous aggregation of access modes for the unit. This is resolved by simply always merging the unit access mode of the team as it will simply default to None in case the team does not have a permission defined for the unit, which will be swallowed by the max(..) call in favour of the previous aggregated permission.
1 parent 4730bb5 commit 2f3da6d

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

models/perm/access/repo_permission.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -348,10 +348,8 @@ func GetUserRepoPermission(ctx context.Context, repo *repo_model.Repository, use
348348

349349
for _, u := range repo.Units {
350350
for _, team := range teams {
351-
unitAccessMode := minAccessMode
352-
if teamMode, exist := team.UnitAccessModeEx(ctx, u.Type); exist {
353-
unitAccessMode = max(perm.unitsMode[u.Type], unitAccessMode, teamMode)
354-
}
351+
teamMode, _ := team.UnitAccessModeEx(ctx, u.Type)
352+
unitAccessMode := max(perm.unitsMode[u.Type], minAccessMode, teamMode)
355353
perm.unitsMode[u.Type] = unitAccessMode
356354
}
357355
}

models/perm/access/repo_permission_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,37 @@ func TestGetUserRepoPermission(t *testing.T) {
197197
assert.Equal(t, perm_model.AccessModeWrite, perm.unitsMode[unit.TypeCode])
198198
assert.Equal(t, perm_model.AccessModeRead, perm.unitsMode[unit.TypeIssues])
199199
})
200+
201+
repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}) // org private repo, same org as repo 32
202+
require.NoError(t, repo3.LoadOwner(ctx))
203+
require.True(t, repo3.Owner.IsOrganization())
204+
require.NoError(t, db.TruncateBeans(ctx, &organization.TeamUnit{}, &Access{})) // The user has access set of that repo, remove it, it is useless for our test
205+
require.NoError(t, db.Insert(ctx, &organization.TeamRepo{OrgID: org.ID, TeamID: team.ID, RepoID: repo3.ID}))
206+
t.Run("DoerWithNoopTeamOnPrivateRepo", func(t *testing.T) {
207+
perm, err := GetUserRepoPermission(ctx, repo3, user)
208+
require.NoError(t, err)
209+
assert.Equal(t, perm_model.AccessModeNone, perm.AccessMode)
210+
assert.Equal(t, perm_model.AccessModeNone, perm.unitsMode[unit.TypeCode])
211+
assert.Equal(t, perm_model.AccessModeNone, perm.unitsMode[unit.TypeIssues])
212+
})
213+
214+
require.NoError(t, db.Insert(ctx, &organization.TeamUnit{OrgID: org.ID, TeamID: team.ID, Type: unit.TypeCode, AccessMode: perm_model.AccessModeNone}))
215+
require.NoError(t, db.Insert(ctx, &organization.TeamUnit{OrgID: org.ID, TeamID: team.ID, Type: unit.TypeIssues, AccessMode: perm_model.AccessModeRead}))
216+
t.Run("DoerWithReadIssueTeamOnPrivateRepo", func(t *testing.T) {
217+
perm, err := GetUserRepoPermission(ctx, repo3, user)
218+
require.NoError(t, err)
219+
assert.Equal(t, perm_model.AccessModeNone, perm.AccessMode)
220+
assert.Equal(t, perm_model.AccessModeNone, perm.unitsMode[unit.TypeCode])
221+
assert.Equal(t, perm_model.AccessModeRead, perm.unitsMode[unit.TypeIssues])
222+
})
223+
224+
require.NoError(t, db.Insert(ctx, repo_model.Collaboration{RepoID: repo3.ID, UserID: user.ID, Mode: perm_model.AccessModeWrite}))
225+
require.NoError(t, db.Insert(ctx, Access{RepoID: repo3.ID, UserID: user.ID, Mode: perm_model.AccessModeWrite}))
226+
t.Run("DoerWithReadIssueTeamAndWriteCollaboratorOnPrivateRepo", func(t *testing.T) {
227+
perm, err := GetUserRepoPermission(ctx, repo3, user)
228+
require.NoError(t, err)
229+
assert.Equal(t, perm_model.AccessModeWrite, perm.AccessMode)
230+
assert.Equal(t, perm_model.AccessModeWrite, perm.unitsMode[unit.TypeCode])
231+
assert.Equal(t, perm_model.AccessModeWrite, perm.unitsMode[unit.TypeIssues])
232+
})
200233
}

0 commit comments

Comments
 (0)