dkforest

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

commit 8c1cdb63c5b2b350f54fb351af36b71de6058888
parent e9c7b7398d45b533abc0477780ab61edd0162564
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon, 12 Aug 2024 17:06:26 -0700

add msgs count limit to spam filters

Diffstat:
Acmd/dkf/migrations/163.sql | 4++++
Mpkg/database/tableSpamFilters.go | 4+++-
Mpkg/web/handlers/admin.go | 3++-
Mpkg/web/handlers/data.go | 1+
Mpkg/web/handlers/interceptors/spamInterceptor.go | 12+++++++++---
Mpkg/web/public/views/pages/admin/spam-filters.gohtml | 3+++
6 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/cmd/dkf/migrations/163.sql b/cmd/dkf/migrations/163.sql @@ -0,0 +1,4 @@ +-- +migrate Up +ALTER TABLE spam_filters ADD COLUMN nb_msg INTEGER NOT NULL DEFAULT 0; + +-- +migrate Down diff --git a/pkg/database/tableSpamFilters.go b/pkg/database/tableSpamFilters.go @@ -7,6 +7,7 @@ type SpamFilter struct { Action int64 Filter string IsRegex bool + NbMsg int64 CreatedAt time.Time } @@ -15,11 +16,12 @@ func (d *DkfDB) GetSpamFilters() (out []SpamFilter, err error) { return } -func (d *DkfDB) CreateOrEditSpamFilter(id int64, filter string, isRegex bool, action int64) (out SpamFilter, err error) { +func (d *DkfDB) CreateOrEditSpamFilter(id int64, filter string, isRegex bool, action, nbMsg int64) (out SpamFilter, err error) { out.ID = id out.Filter = filter out.IsRegex = isRegex out.Action = action + out.NbMsg = nbMsg err = d.db.Save(&out).Error return } diff --git a/pkg/web/handlers/admin.go b/pkg/web/handlers/admin.go @@ -38,12 +38,13 @@ func AdminSpamFiltersHandler(c echo.Context) error { data.Filter = c.Request().PostFormValue("filter") data.IsRegex = utils.DoParseBool(c.Request().PostFormValue("is_regex")) data.Action = utils.Clamp(utils.DoParseInt64(c.Request().PostFormValue("action")), 0, 2) + data.NbMsg = utils.Clamp(utils.DoParseInt64(c.Request().PostFormValue("nb_msg")), 0, 100) if !utils.ValidateRuneLength(data.Filter, 1, 255) { data.Error = "filter must be within 1-255 characters" return c.Render(http.StatusOK, "admin.spam-filter", data) } if data.ID == 0 || btnSubmit == "edit" { - if _, err := db.CreateOrEditSpamFilter(data.ID, data.Filter, data.IsRegex, data.Action); err != nil { + if _, err := db.CreateOrEditSpamFilter(data.ID, data.Filter, data.IsRegex, data.Action, data.NbMsg); err != nil { logrus.Error(err) } interceptors.LoadFilters(db) diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go @@ -926,6 +926,7 @@ type adminSpamFiltersData struct { Filter string IsRegex bool Action int64 + NbMsg int64 Error string } diff --git a/pkg/web/handlers/interceptors/spamInterceptor.go b/pkg/web/handlers/interceptors/spamInterceptor.go @@ -22,6 +22,7 @@ type Filter struct { Rgx *regexp.Regexp Kick bool Hb bool + NbMsg int64 } var filters []Filter @@ -44,6 +45,7 @@ func LoadFilters(db *database.DkfDB) { } else { f.Term = dbFilter.Filter } + f.NbMsg = dbFilter.NbMsg filters = append(filters, f) } } @@ -57,11 +59,15 @@ func checkDynamicFilters(c *command.Command, lowerCaseMessage string, silentSelf (!f.IsRegex && strings.Contains(lowerCaseMessage, f.Term)) if isMatch { if f.Hb { - dutils.SelfHellBan(c.DB, c.AuthUser) - return ErrSilent + if f.NbMsg == 0 || c.AuthUser.GeneralMessagesCount <= f.NbMsg { + dutils.SelfHellBan(c.DB, c.AuthUser) + return ErrSilent + } } if f.Kick { - _ = dutils.SelfKick(c.DB, *c.AuthUser, silentSelfKick) + if f.NbMsg == 0 || c.AuthUser.GeneralMessagesCount <= f.NbMsg { + _ = dutils.SelfKick(c.DB, *c.AuthUser, silentSelfKick) + } } return ErrSpamFilterTriggered } diff --git a/pkg/web/public/views/pages/admin/spam-filters.gohtml b/pkg/web/public/views/pages/admin/spam-filters.gohtml @@ -17,6 +17,7 @@ <tr> <th>Filter</th> <th>Is regex</th> + <th>Nb msg</th> <th>Action</th> <th>Actions</th> </tr> @@ -37,6 +38,7 @@ <label class="form-check-label" for="is_regex_{{ .ID }}">regex</label> </div> </td> + <td><input type="number" name="nb_msg" min="0" max="100" value="{{ .NbMsg }}" /></td> <td> <select name="action" class="form-control form-control-sm"> <option value="1"{{ if eq .Action 1 }} selected{{ end }}>Kick</option> @@ -64,6 +66,7 @@ <label class="form-check-label" for="is_regex">regex</label> </div> </td> + <td><input type="number" name="nb_msg" min="0" max="100" value="0" /></td> <td> <select name="action" class="form-control form-control-sm"> <option value="1" selected>Kick</option>