summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2021-01-23 03:03:29 +0100
committerGitHub <noreply@github.com>2021-01-23 10:03:29 +0800
commit4d2a6c40f8b8931d14504d73e69db58632d82c3f (patch)
treee7971b2b62e8ac14e2f6ad791bc3892be4256662 /models
parentfb274ec54b56d0126bdde024d5316309c83fcc0b (diff)
downloadgitea-4d2a6c40f8b8931d14504d73e69db58632d82c3f.tar.gz
gitea-4d2a6c40f8b8931d14504d73e69db58632d82c3f.zip
[Backport] Fix Deadlock & Delete affected reactions on comment deletion (#14392) (#14425)
* Enhance Ghost comment mitigation Settings (#14392) * refactor models.DeleteComment and delete related reactions too * use deleteComment for UserDeleteWithCommentsMaxDays in DeleteUser * Resolve Fixme & fix potential deadlock * rm refactor * make diff eaven less
Diffstat (limited to 'models')
-rw-r--r--models/admin.go2
-rw-r--r--models/issue_assignees.go2
-rw-r--r--models/issue_comment.go4
-rw-r--r--models/issue_reaction.go12
-rw-r--r--models/user.go17
5 files changed, 23 insertions, 14 deletions
diff --git a/models/admin.go b/models/admin.go
index 903e35b0c9..b14f0e93fd 100644
--- a/models/admin.go
+++ b/models/admin.go
@@ -77,7 +77,7 @@ func removeStorageWithNotice(e Engine, bucket storage.ObjectStorage, title, path
if err := bucket.Delete(path); err != nil {
desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
log.Warn(title+" [%s]: %v", path, err)
- if err = createNotice(x, NoticeRepository, desc); err != nil {
+ if err = createNotice(e, NoticeRepository, desc); err != nil {
log.Error("CreateRepositoryNotice: %v", err)
}
}
diff --git a/models/issue_assignees.go b/models/issue_assignees.go
index 05e1797c19..6716f2fc70 100644
--- a/models/issue_assignees.go
+++ b/models/issue_assignees.go
@@ -82,7 +82,7 @@ func isUserAssignedToIssue(e Engine, issue *Issue, user *User) (isAssigned bool,
}
// ClearAssigneeByUserID deletes all assignments of an user
-func clearAssigneeByUserID(sess *xorm.Session, userID int64) (err error) {
+func clearAssigneeByUserID(sess Engine, userID int64) (err error) {
_, err = sess.Delete(&IssueAssignees{AssigneeID: userID})
return
}
diff --git a/models/issue_comment.go b/models/issue_comment.go
index 73cbb0566f..b2a21e0f5b 100644
--- a/models/issue_comment.go
+++ b/models/issue_comment.go
@@ -1077,6 +1077,10 @@ func DeleteComment(comment *Comment, doer *User) error {
return err
}
+ if err := deleteReaction(sess, &ReactionOptions{Comment: comment}); err != nil {
+ return err
+ }
+
return sess.Commit()
}
diff --git a/models/issue_reaction.go b/models/issue_reaction.go
index 50b9d6848a..1f1a483996 100644
--- a/models/issue_reaction.go
+++ b/models/issue_reaction.go
@@ -178,11 +178,15 @@ func CreateCommentReaction(doer *User, issue *Issue, comment *Comment, content s
})
}
-func deleteReaction(e *xorm.Session, opts *ReactionOptions) error {
+func deleteReaction(e Engine, opts *ReactionOptions) error {
reaction := &Reaction{
- Type: opts.Type,
- UserID: opts.Doer.ID,
- IssueID: opts.Issue.ID,
+ Type: opts.Type,
+ }
+ if opts.Doer != nil {
+ reaction.UserID = opts.Doer.ID
+ }
+ if opts.Issue != nil {
+ reaction.IssueID = opts.Issue.ID
}
if opts.Comment != nil {
reaction.CommentID = opts.Comment.ID
diff --git a/models/user.go b/models/user.go
index dc3b4142bf..f35d2e5c6b 100644
--- a/models/user.go
+++ b/models/user.go
@@ -40,7 +40,6 @@ import (
"golang.org/x/crypto/scrypt"
"golang.org/x/crypto/ssh"
"xorm.io/builder"
- "xorm.io/xorm"
)
// UserType defines the user type
@@ -1020,8 +1019,7 @@ func deleteBeans(e Engine, beans ...interface{}) (err error) {
return nil
}
-// FIXME: need some kind of mechanism to record failure. HINT: system notice
-func deleteUser(e *xorm.Session, u *User) error {
+func deleteUser(e Engine, u *User) error {
// Note: A user owns any repository or belongs to any organization
// cannot perform delete operation.
@@ -1135,18 +1133,21 @@ func deleteUser(e *xorm.Session, u *User) error {
return fmt.Errorf("Delete: %v", err)
}
- // FIXME: system notice
// Note: There are something just cannot be roll back,
// so just keep error logs of those operations.
path := UserPath(u.Name)
- if err := util.RemoveAll(path); err != nil {
- return fmt.Errorf("Failed to RemoveAll %s: %v", path, err)
+ if err = util.RemoveAll(path); err != nil {
+ err = fmt.Errorf("Failed to RemoveAll %s: %v", path, err)
+ _ = createNotice(e, NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err))
+ return err
}
if len(u.Avatar) > 0 {
avatarPath := u.CustomAvatarRelativePath()
- if err := storage.Avatars.Delete(avatarPath); err != nil {
- return fmt.Errorf("Failed to remove %s: %v", avatarPath, err)
+ if err = storage.Avatars.Delete(avatarPath); err != nil {
+ err = fmt.Errorf("Failed to remove %s: %v", avatarPath, err)
+ _ = createNotice(e, NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err))
+ return err
}
}