Skip to content

Commit 42f60be

Browse files
Handle user repositories as well, and only add access if minimum mode
1 parent 2bb003c commit 42f60be

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

models/access.go

+27-18
Original file line numberDiff line numberDiff line change
@@ -249,37 +249,46 @@ func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err
249249
// recalculateUserAccess recalculates new access for a single user
250250
// Usable if we know access only affected one user
251251
func (repo *Repository) recalculateUserAccess(e Engine, uid int64) (err error) {
252-
access := AccessModeNone
252+
minMode := AccessModeRead
253+
if !repo.IsPrivate {
254+
minMode = AccessModeWrite
255+
}
256+
257+
accessMode := AccessModeNone
253258
collaborator, err := repo.getCollaboration(e, uid)
254259
if err != nil {
255260
return err
256261
} else if collaborator != nil {
257-
access = collaborator.Mode
258-
}
259-
260-
var teams []Team
261-
if err := e.Join("INNER", "team_repo", "team_repo.team_id = team.id").
262-
Join("INNER", "team_user", "team_user.team_id = team.id").
263-
Where("team.org_id = ?", repo.OwnerID).
264-
And("team_repo.repo_id=?", repo.ID).
265-
And("team_user.uid=?", uid).
266-
Find(&teams); err != nil {
267-
return err
262+
accessMode = collaborator.Mode
268263
}
269264

270-
for _, t := range teams {
271-
if t.IsOwnerTeam() {
272-
t.Authorize = AccessModeOwner
265+
if repo.Owner.IsOrganization() {
266+
var teams []Team
267+
if err := e.Join("INNER", "team_repo", "team_repo.team_id = team.id").
268+
Join("INNER", "team_user", "team_user.team_id = team.id").
269+
Where("team.org_id = ?", repo.OwnerID).
270+
And("team_repo.repo_id=?", repo.ID).
271+
And("team_user.uid=?", uid).
272+
Find(&teams); err != nil {
273+
return err
273274
}
274275

275-
access = maxAccessMode(access, t.Authorize)
276+
for _, t := range teams {
277+
if t.IsOwnerTeam() {
278+
t.Authorize = AccessModeOwner
279+
}
280+
281+
accessMode = maxAccessMode(accessMode, t.Authorize)
282+
}
276283
}
277284

278285
// Delete old user accesses and insert new one for repository.
279286
if _, err = e.Delete(&Access{RepoID: repo.ID, UserID: uid}); err != nil {
280287
return fmt.Errorf("delete old user accesses: %v", err)
281-
} else if _, err = e.Insert(&Access{RepoID: repo.ID, UserID: uid, Mode: access}); err != nil {
282-
return fmt.Errorf("insert new user accesses: %v", err)
288+
} else if accessMode >= minMode {
289+
if _, err = e.Insert(&Access{RepoID: repo.ID, UserID: uid, Mode: accessMode}); err != nil {
290+
return fmt.Errorf("insert new user accesses: %v", err)
291+
}
283292
}
284293
return nil
285294
}

models/repo_collaboration.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,7 @@ func (repo *Repository) AddCollaborator(u *User) error {
4141
return err
4242
}
4343

44-
if repo.Owner.IsOrganization() {
45-
err = repo.recalculateUserAccess(sess, u.ID)
46-
} else {
47-
err = repo.recalculateAccesses(sess)
48-
}
49-
if err != nil {
44+
if err = repo.recalculateUserAccess(sess, u.ID); err != nil {
5045
return fmt.Errorf("recalculateAccesses 'team=%v': %v", repo.Owner.IsOrganization(), err)
5146
}
5247

0 commit comments

Comments
 (0)