dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

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:
Mpkg/database/utils/utils.go | 14+++++++-------
Mpkg/web/handlers/interceptors/spamInterceptor.go | 20+++++++++++---------
Mpkg/web/public/views/pages/admin/spam-filters.gohtml | 3+++
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">