mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	Enhance Ghost comment mitigation Settings (#14392)
* refactor models.DeleteComment and delete related reactions too * use deleteComment for UserDeleteWithCommentsMaxDays in DeleteUser * nits * Use time.Duration as other time settings have * docs * Resolve Fixme & fix potential deadlock * Disabled by Default * Update Config Value Description * switch args * Update models/issue_comment.go Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
		@@ -38,7 +38,6 @@ import (
 | 
			
		||||
	"golang.org/x/crypto/scrypt"
 | 
			
		||||
	"golang.org/x/crypto/ssh"
 | 
			
		||||
	"xorm.io/builder"
 | 
			
		||||
	"xorm.io/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// UserType defines the user type
 | 
			
		||||
@@ -1071,8 +1070,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.
 | 
			
		||||
 | 
			
		||||
@@ -1151,12 +1149,30 @@ func deleteUser(e *xorm.Session, u *User) error {
 | 
			
		||||
		return fmt.Errorf("deleteBeans: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if setting.Service.UserDeleteWithCommentsMaxDays != 0 &&
 | 
			
		||||
		u.CreatedUnix.AsTime().Add(time.Duration(setting.Service.UserDeleteWithCommentsMaxDays)*24*time.Hour).After(time.Now()) {
 | 
			
		||||
		if err = deleteBeans(e,
 | 
			
		||||
			&Comment{PosterID: u.ID},
 | 
			
		||||
		); err != nil {
 | 
			
		||||
			return fmt.Errorf("deleteBeans: %v", err)
 | 
			
		||||
	if setting.Service.UserDeleteWithCommentsMaxTime != 0 &&
 | 
			
		||||
		u.CreatedUnix.AsTime().Add(setting.Service.UserDeleteWithCommentsMaxTime).After(time.Now()) {
 | 
			
		||||
 | 
			
		||||
		// Delete Comments
 | 
			
		||||
		const batchSize = 50
 | 
			
		||||
		for start := 0; ; start += batchSize {
 | 
			
		||||
			comments := make([]*Comment, 0, batchSize)
 | 
			
		||||
			if err = e.Where("type=? AND poster_id=?", CommentTypeComment, u.ID).Limit(batchSize, start).Find(&comments); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			if len(comments) == 0 {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for _, comment := range comments {
 | 
			
		||||
				if err = deleteComment(e, comment); err != nil {
 | 
			
		||||
					return err
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Delete Reactions
 | 
			
		||||
		if err = deleteReaction(e, &ReactionOptions{Doer: u}); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -1195,18 +1211,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