aboutsummaryrefslogtreecommitdiffstats
path: root/models/repo_transfer.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2021-09-27 19:07:19 +0100
committerGitHub <noreply@github.com>2021-09-27 19:07:19 +0100
commite8574f2f7d4648b5b3fda48f3e31599a6b9dd40b (patch)
treef7ea29c89e569ef8a17da14780512866c8916610 /models/repo_transfer.go
parentb5856c443729c6825618595a0e746202553aa95c (diff)
downloadgitea-e8574f2f7d4648b5b3fda48f3e31599a6b9dd40b.tar.gz
gitea-e8574f2f7d4648b5b3fda48f3e31599a6b9dd40b.zip
Nicely handle missing user in collaborations (#17049)
* Nicely handle missing user in collaborations It is possible to have a collaboration in a repository which refers to a no-longer existing user. This causes the repository transfer to fail with an unusual error. This PR makes `repo.getCollaborators()` nicely handle the missing user by ghosting the collaboration but also adds consistency check. It also adds an Access consistency check. Fix #17044 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
Diffstat (limited to 'models/repo_transfer.go')
-rw-r--r--models/repo_transfer.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/models/repo_transfer.go b/models/repo_transfer.go
index fe50c1cc04..082c3d19dc 100644
--- a/models/repo_transfer.go
+++ b/models/repo_transfer.go
@@ -274,6 +274,14 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) (err e
// Dummy object.
collaboration := &Collaboration{RepoID: repo.ID}
for _, c := range collaborators {
+ if c.IsGhost() {
+ collaboration.ID = c.Collaboration.ID
+ if _, err := sess.Delete(collaboration); err != nil {
+ return fmt.Errorf("remove collaborator '%d': %v", c.ID, err)
+ }
+ collaboration.ID = 0
+ }
+
if c.ID != newOwner.ID {
isMember, err := isOrganizationMember(sess, newOwner.ID, c.ID)
if err != nil {
@@ -286,6 +294,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) (err e
if _, err := sess.Delete(collaboration); err != nil {
return fmt.Errorf("remove collaborator '%d': %v", c.ID, err)
}
+ collaboration.UserID = 0
}
// Remove old team-repository relations.