Skip to content

Commit 2bb003c

Browse files
Recalculate repository access only for specific user
Signed-off-by: David Svantesson <[email protected]>
1 parent 6551a9d commit 2bb003c

File tree

3 files changed

+53
-3
lines changed

3 files changed

+53
-3
lines changed

models/access.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,44 @@ func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err
246246
return repo.refreshAccesses(e, accessMap)
247247
}
248248

249+
// recalculateUserAccess recalculates new access for a single user
250+
// Usable if we know access only affected one user
251+
func (repo *Repository) recalculateUserAccess(e Engine, uid int64) (err error) {
252+
access := AccessModeNone
253+
collaborator, err := repo.getCollaboration(e, uid)
254+
if err != nil {
255+
return err
256+
} 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
268+
}
269+
270+
for _, t := range teams {
271+
if t.IsOwnerTeam() {
272+
t.Authorize = AccessModeOwner
273+
}
274+
275+
access = maxAccessMode(access, t.Authorize)
276+
}
277+
278+
// Delete old user accesses and insert new one for repository.
279+
if _, err = e.Delete(&Access{RepoID: repo.ID, UserID: uid}); err != nil {
280+
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)
283+
}
284+
return nil
285+
}
286+
249287
func (repo *Repository) recalculateAccesses(e Engine) error {
250288
if repo.Owner.IsOrganization() {
251289
return repo.recalculateTeamAccesses(e, 0)

models/org_team.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ func AddTeamMember(team *Team, userID int64) error {
723723

724724
// Give access to team repositories.
725725
for _, repo := range team.Repos {
726-
if err := repo.recalculateTeamAccesses(sess, 0); err != nil {
726+
if err := repo.recalculateUserAccess(sess, userID); err != nil {
727727
return err
728728
}
729729
if setting.Service.AutoWatchNewRepos {
@@ -768,7 +768,7 @@ func removeTeamMember(e *xorm.Session, team *Team, userID int64) error {
768768

769769
// Delete access to team repositories.
770770
for _, repo := range team.Repos {
771-
if err := repo.recalculateTeamAccesses(e, 0); err != nil {
771+
if err := repo.recalculateUserAccess(e, userID); err != nil {
772772
return err
773773
}
774774

models/repo_collaboration.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func (repo *Repository) AddCollaborator(u *User) error {
4242
}
4343

4444
if repo.Owner.IsOrganization() {
45-
err = repo.recalculateTeamAccesses(sess, 0)
45+
err = repo.recalculateUserAccess(sess, u.ID)
4646
} else {
4747
err = repo.recalculateAccesses(sess)
4848
}
@@ -89,6 +89,18 @@ func (repo *Repository) GetCollaborators() ([]*Collaborator, error) {
8989
return repo.getCollaborators(x)
9090
}
9191

92+
func (repo *Repository) getCollaboration(e Engine, uid int64) (*Collaboration, error) {
93+
collaboration := &Collaboration{
94+
RepoID: repo.ID,
95+
UserID: uid,
96+
}
97+
has, err := e.Get(collaboration)
98+
if !has {
99+
collaboration = nil
100+
}
101+
return collaboration, err
102+
}
103+
92104
func (repo *Repository) isCollaborator(e Engine, userID int64) (bool, error) {
93105
return e.Get(&Collaboration{RepoID: repo.ID, UserID: userID})
94106
}

0 commit comments

Comments
 (0)