1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-17 10:56:24 -07:00

Add ban deactivateion, with auditing, related to issue #28 and issue #31

This commit is contained in:
Eggbertx 2022-11-18 15:42:58 -08:00
parent bfac3ef93c
commit 9d9a978e68
3 changed files with 65 additions and 14 deletions

View file

@ -21,6 +21,7 @@ var (
type Ban interface {
IsGlobalBan() bool
Deactivate(int) error
}
func NewIPBan(ban *IPBan) error {
@ -72,12 +73,6 @@ func GetIPBanByID(id int) (*IPBan, error) {
return &ban, err
}
func DeleteIPBanByID(id int) error {
const query = `UPDATE DBPREFIXip_ban SET is_active = FALSE WHERE id = ?`
_, err := ExecSQL(query, id)
return err
}
func GetIPBans(boardID int, limit int, onlyActive bool) ([]IPBan, error) {
query := ipBanQueryBase
if boardID > 0 {
@ -118,6 +113,39 @@ func (ipb IPBan) IsGlobalBan() bool {
return ipb.BoardID == nil
}
func (ipb *IPBan) Deactivate(staffID int) error {
const deactivateQuery = `UPDATE DBPREFIXip_ban SET is_active = FALSE WHERE id = ?`
const auditInsertQuery = `INSERT INTO DBPREFIXip_ban_audit
(ip_ban_id, staff_id, is_active, is_thread_ban, expires_at, appeal_at, permanent, staff_note, message, can_appeal)
SELECT
id, staff_id, is_active, is_thread_ban, expires_at, appeal_at, permanent, staff_note, message, can_appeal
FROM DBPREFIXip_ban WHERE id = ?`
tx, err := BeginTx()
if err != nil {
return err
}
defer tx.Rollback()
stmt1, err := PrepareSQL(deactivateQuery, tx)
if err != nil {
return err
}
defer stmt1.Close()
if _, err = stmt1.Exec(ipb.ID); err != nil {
return err
}
stmt2, err := PrepareSQL(auditInsertQuery, tx)
if err != nil {
return err
}
defer stmt2.Close()
if _, err = stmt2.Exec(ipb.ID); err != nil {
return err
}
return tx.Commit()
}
func checkUsernameOrFilename(usernameFilename string, check string, boardID int) (*filenameOrUsernameBanBase, error) {
query := `SELECT
id, board_id, staff_id, staff_note, issued_at, ` + usernameFilename + `, is_regex
@ -168,6 +196,18 @@ func (ub filenameOrUsernameBanBase) IsGlobalBan() bool {
return ub.BoardID == nil
}
func (fnb *FilenameBan) Deactivate(staffID int) error {
const deleteQuery = `DELETE FROM DBPREFIXfilename_ban WHERE id = ?`
_, err := ExecSQL(deleteQuery, fnb.ID)
return err
}
func (fnb *UsernameBan) Deactivate(staffID int) error {
const deleteQuery = `DELETE FROM DBPREFIXusername_ban WHERE id = ?`
_, err := ExecSQL(deleteQuery, fnb.ID)
return err
}
func CheckFilenameBan(filename string, boardID int) (*FilenameBan, error) {
banBase, err := checkUsernameOrFilename("filename", filename, boardID)
if err != nil {
@ -238,6 +278,12 @@ func (fb *FileBan) IsGlobalBan() bool {
return fb.BoardID == nil
}
func (fb *FileBan) Deactivate(staffID int) error {
const deleteQuery = `DELETE FROM DBPREFIXfile_ban WHERE id = ?`
_, err := ExecSQL(deleteQuery, fb.ID)
return err
}
// DeleteFileBanByID deletes the ban, given the id column value
func DeleteFileBanByID(id int) error {
_, err := ExecSQL("DELETE FROM DBPREFIXfile_ban WHERE id = ?", id)

View file

@ -131,7 +131,7 @@ func BeginTx() (*sql.Tx, error) {
if gcdb == nil {
return nil, ErrNotConnected
}
var ctx context.Context
ctx := context.Background()
return gcdb.BeginTx(ctx, &sql.TxOptions{
Isolation: 0,
ReadOnly: false,

View file

@ -234,10 +234,17 @@ var actions = []Action{
ban.ID, err = strconv.Atoi(deleteIDStr)
if err != nil {
errEv.Err(err).
Str("delete", deleteIDStr).
Str("deleteBan", deleteIDStr).
Caller().Send()
return "", err
}
if err = ban.Deactivate(staff.ID); err != nil {
errEv.Err(err).
Int("deleteBan", ban.ID).
Caller().Send()
return "", err
}
} else if request.FormValue("do") == "add" {
err := ipBanFromRequest(&ban, request, errEv)
if err != nil {
@ -278,12 +285,10 @@ var actions = []Action{
manageBansBuffer := bytes.NewBufferString("")
if err = serverutil.MinifyTemplate(gctemplates.ManageBans, map[string]interface{}{
"systemCritical": config.GetSystemCriticalConfig(),
"banlist": banlist,
"allBoards": gcsql.AllBoards,
"ban": ban,
"filterboardid": filterBoardID,
"webroot": config.GetSystemCriticalConfig().WebRoot,
"banlist": banlist,
"allBoards": gcsql.AllBoards,
"ban": ban,
"filterboardid": filterBoardID,
}, manageBansBuffer, "text/html"); err != nil {
errEv.Err(err).Str("template", "manage_bans.html").Caller().Send()
return "", errors.New("Error executing ban management page template: " + err.Error())