commit a2aea25a76c7fc0c0f514aedc738e235aab0403f
parent b6ab4c5857a6ccc11553e04f9609ab26616c683a
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Wed, 8 Jan 2025 14:15:27 -0800
keep track of which spam filter ID triggered the self kick/hb
Diffstat:
3 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/pkg/database/utils/utils.go b/pkg/database/utils/utils.go
@@ -127,8 +127,8 @@ func DoParseRoomID(v string) (out database.RoomID) {
return DoParse[database.RoomID](v)
}
-func SelfHellBan(db *database.DkfDB, user *database.User) {
- db.NewAudit(*user, fmt.Sprintf("hellban %s #%d", user.Username, user.ID))
+func SelfHellBan(db *database.DkfDB, user *database.User, msg string) {
+ db.NewAudit(*user, fmt.Sprintf("hellban %s #%d %s", user.Username, user.ID, msg))
user.HellBan(db)
managers.ActiveUsers.UpdateUserHBInRooms(managers.NewUserInfo(user))
}
@@ -137,18 +137,18 @@ func Kick(db *database.DkfDB, kicked, kickedBy database.User, purge, silent bool
if kicked.IsHellbanned {
silent = true
}
- return kick(db, kicked, kickedBy, silent, purge)
+ return kick(db, kicked, kickedBy, silent, purge, "")
}
func SilentKick(db *database.DkfDB, kicked, kickedBy database.User) error {
- return kick(db, kicked, kickedBy, true, true)
+ return kick(db, kicked, kickedBy, true, true, "")
}
-func SelfKick(db *database.DkfDB, kicked database.User, silent bool) error {
- return kick(db, kicked, kicked, silent, true)
+func SelfKick(db *database.DkfDB, kicked database.User, silent bool, msg string) error {
+ return kick(db, kicked, kicked, silent, true, msg)
}
-func kick(db *database.DkfDB, kicked, kickedBy database.User, silent, purge bool) error {
+func kick(db *database.DkfDB, kicked, kickedBy database.User, silent, purge bool, msg string) error {
if !kicked.Verified {
return errors.New("user already kicked")
}
diff --git a/pkg/web/handlers/interceptors/spamInterceptor.go b/pkg/web/handlers/interceptors/spamInterceptor.go
@@ -7,6 +7,7 @@ import (
"dkforest/pkg/utils"
"dkforest/pkg/web/handlers/interceptors/command"
"errors"
+ "fmt"
"github.com/sirupsen/logrus"
"regexp"
"strings"
@@ -17,6 +18,7 @@ import (
type SpamInterceptor struct{}
type Filter struct {
+ ID int64
IsRegex bool
Term string
Rgx *regexp.Regexp
@@ -34,7 +36,7 @@ func LoadFilters(db *database.DkfDB) {
filters = make([]Filter, 0)
dbFilters, _ := db.GetSpamFilters()
for _, dbFilter := range dbFilters {
- f := Filter{IsRegex: dbFilter.IsRegex}
+ f := Filter{IsRegex: dbFilter.IsRegex, ID: dbFilter.ID}
if dbFilter.Action == 1 {
f.Kick = true
} else if dbFilter.Action == 2 {
@@ -60,10 +62,10 @@ func checkDynamicFilters(c *command.Command, lowerCaseMessage string, silentSelf
if isMatch {
nbMsgCond := f.NbMsg == 0 || c.AuthUser.GeneralMessagesCount <= f.NbMsg
if f.Hb && nbMsgCond {
- dutils.SelfHellBan(c.DB, c.AuthUser)
+ dutils.SelfHellBan(c.DB, c.AuthUser, fmt.Sprintf("dyn filter: #%d", f.ID))
return ErrSilent
} else if f.Kick && nbMsgCond {
- _ = dutils.SelfKick(c.DB, *c.AuthUser, silentSelfKick)
+ _ = dutils.SelfKick(c.DB, *c.AuthUser, silentSelfKick, fmt.Sprintf("dyn filter: #%d", f.ID))
return ErrSpamFilterTriggered
} else if nbMsgCond {
return ErrSpamFilterTriggered
@@ -113,13 +115,13 @@ func checkSpam(db *database.DkfDB, origMessage, lowerCaseMessage string, authUse
count, total := utils.CountUppercase(origMessage)
pct := float64(count) / float64(total)
if total > 5 && pct > 0.8 {
- _ = dutils.SelfKick(db, *authUser, silentSelfKick)
+ _ = dutils.SelfKick(db, *authUser, silentSelfKick, "uppercase typing retard")
return ErrSpamFilterTriggered
}
}
if autoKickSpammers(authUser, lowerCaseMessage) {
- _ = dutils.SelfKick(db, *authUser, silentSelfKick)
+ _ = dutils.SelfKick(db, *authUser, silentSelfKick, "auto kick spammers")
return ErrSpamFilterTriggered
}
@@ -147,7 +149,7 @@ func checkSpam(db *database.DkfDB, origMessage, lowerCaseMessage string, authUse
if authUser.GeneralMessagesCount < 10 {
if autoKickProfanity(tot, wordsMap) {
- _ = dutils.SelfKick(db, *authUser, silentSelfKick)
+ _ = dutils.SelfKick(db, *authUser, silentSelfKick, "autoKickProfanity")
return ErrSpamFilterTriggered
}
}
@@ -160,7 +162,7 @@ func checkSpam(db *database.DkfDB, origMessage, lowerCaseMessage string, authUse
wordsMap["porn"] > 0 ||
wordsMap["pedo"] > 0 ||
wordsMap["murder"] > 0 {
- _ = dutils.SelfKick(db, *authUser, silentSelfKick)
+ _ = dutils.SelfKick(db, *authUser, silentSelfKick, "wordsMap #1")
return ErrSpamFilterTriggered
}
}
@@ -171,14 +173,14 @@ func checkSpam(db *database.DkfDB, origMessage, lowerCaseMessage string, authUse
(wordsMap["creepy"] > 0 && (wordsMap["site"] > 0 || wordsMap["sites"] > 0)) ||
(wordsMap["porn"] > 0 && (wordsMap["link"] > 0 || wordsMap["links"] > 0)) ||
(wordsMap["topic"] > 0 && wordsMap["link"] > 0) {
- _ = dutils.SelfKick(db, *authUser, silentSelfKick)
+ _ = dutils.SelfKick(db, *authUser, silentSelfKick, "wordsMap #2")
return ErrSpamFilterTriggered
}
}
if authUser.GeneralMessagesCount < 20 || time.Since(authUser.CreatedAt) < 5*time.Hour {
if wordsMap["cp"] > 0 && (wordsMap["link"] > 0 || wordsMap["links"] > 0) {
- _ = dutils.SelfKick(db, *authUser, silentSelfKick)
+ _ = dutils.SelfKick(db, *authUser, silentSelfKick, "wordsMap #3")
return ErrSpamFilterTriggered
}
}
diff --git a/pkg/web/public/views/pages/admin/spam-filters.gohtml b/pkg/web/public/views/pages/admin/spam-filters.gohtml
@@ -15,6 +15,7 @@
<table class="table table-striped table-sm table-novpadding table-dark">
<thead>
<tr>
+ <th>#</th>
<th>Filter</th>
<th>Is regex</th>
<th>Nb msg</th>
@@ -28,6 +29,7 @@
<input type="hidden" name="id" value="{{ .ID }}" />
<input type="hidden" name="csrf" value="{{ $.CSRF }}" />
<tr>
+ <td>#{{ .ID }}</td>
<td><input type="text" name="filter" value="{{ .Filter }}" class="form-control form-control-sm" /></td>
<td class="align-middle">
<div class="form-check form-check-1">
@@ -56,6 +58,7 @@
<form method="post">
<input type="hidden" name="csrf" value="{{ .CSRF }}" />
<tr>
+ <td></td>
<td><input name="filter" type="text" class="form-control form-control-sm" /></td>
<td class="align-middle">
<div class="form-check form-check-1">