mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	* 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
This commit is contained in:
		@@ -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)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user