1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-09-05 11:06:23 -07:00

Update ban page and ban submission to accomodate ranges

This commit is contained in:
Eggbertx 2023-12-31 18:02:42 -08:00
parent 57693ba549
commit 204ae9506f
7 changed files with 38 additions and 17 deletions

View file

@ -12,7 +12,7 @@ import (
const (
ipBanQueryBase = `SELECT
id, staff_id, board_id, banned_for_post_id, copy_post_text, is_thread_ban,
is_active, INET_START, INET_END, issued_at, appeal_at, expires_at,
is_active, RANGE_START_NTOA, RANGE_END_NTOA, issued_at, appeal_at, expires_at,
permanent, staff_note, message, can_appeal
FROM DBPREFIXip_ban`
)
@ -29,9 +29,9 @@ type Ban interface {
func NewIPBan(ban *IPBan) error {
const query = `INSERT INTO DBPREFIXip_ban
(staff_id, board_id, banned_for_post_id, copy_post_text, is_thread_ban,
is_active, INET_RANGE_START, INET_RANGE_END, appeal_at, expires_at,
is_active, range_start, range_end, appeal_at, expires_at,
permanent, staff_note, message, can_appeal)
VALUES(?, ?, ?, ?, ?, ?, INET_PARAM, INET_PARAM, ?, ?, ?, ?, ?, ?)`
VALUES(?, ?, ?, ?, ?, ?, INET_PARAM_ATON, INET_PARAM_ATON, ?, ?, ?, ?, ?, ?)`
if ban.ID > 0 {
return ErrBanAlreadyInserted
}
@ -66,21 +66,23 @@ func NewIPBan(ban *IPBan) error {
func CheckIPBan(ip string, boardID int) (*IPBan, error) {
query := ipBanQueryBase + " WHERE "
if config.GetSystemCriticalConfig().DBtype == "sqlite3" {
query += "INET_RANGE_START = ? OR INET_RANGE_END = ?"
query += "range_start = ? OR range_end = ?"
} else {
query += "INET_RANGE_START <= INET_PARAM AND INET_PARAM <= INET_RANGE_END"
query += "range_start <= INET_PARAM_ATON AND INET_PARAM_ATON <= range_end"
}
query += ` AND (board_id IS NULL OR board_id = ?) AND is_active AND
(expires_at > CURRENT_TIMESTAMP OR permanent)
ORDER BY id DESC LIMIT 1`
var ban IPBan
err := QueryRowSQL(query, interfaceSlice(ip, boardID), interfaceSlice(
err := QueryRowSQL(query, interfaceSlice(ip, ip, boardID), interfaceSlice(
&ban.ID, &ban.StaffID, &ban.BoardID, &ban.BannedForPostID, &ban.CopyPostText,
&ban.IsThreadBan, &ban.IsActive, &ban.RangeStart, &ban.RangeEnd, &ban.IssuedAt,
&ban.AppealAt, &ban.ExpiresAt, &ban.Permanent, &ban.StaffNote, &ban.Message,
&ban.CanAppeal))
if err == sql.ErrNoRows {
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
} else if err != nil {
return nil, err
}
return &ban, nil
}

View file

@ -200,17 +200,23 @@ func Open(host, dbDriver, dbName, username, password, prefix string) (db *GCDB,
db.replacer = strings.NewReplacer(
"DBNAME", dbName,
"DBPREFIX", prefix,
"INET_RANGE_START", "INET6_ATON(range_start)",
"INET_RANGE_END", "INET6_ATON(range_end)",
"INET_PARAM", "INET6_ATON(?)",
"RANGE_START_ATON", "INET6_ATON(range_start)",
"RANGE_START_NTOA", "INET6_NTOA(range_start)",
"RANGE_END_ATON", "INET6_ATON(range_end)",
"RANGE_END_NTOA", "INET6_NTOA(range_end)",
"INET_PARAM_ATON", "INET6_ATON(?)",
"INET_PARAM_NTOA", "INET6_NTOA(?)",
"\n", " ")
} else {
db.replacer = strings.NewReplacer(
"DBNAME", dbName,
"DBPREFIX", prefix,
"INET_RANGE_START", "range_start",
"INET_RANGE_END", "range_end",
"INET_PARAM", "?",
"RANGE_START_ATON", "range_start",
"RANGE_START_NTOA", "range_start",
"RANGE_END_ATON", "range_end",
"RANGE_END_NTOA", "range_end",
"INET_PARAM_ATON", "?",
"INET_PARAM_NTOA", "?",
"\n", " ")
}

View file

@ -153,6 +153,16 @@ var funcMap = template.FuncMap{
"isBanned": func(ban *gcsql.IPBan, board string) bool {
return ban.IsActive && ban.BoardID != nil
},
"banMask": func(ban gcsql.IPBan) string {
if ban.ID < 1 {
return ""
}
ipn, err := gcutil.GetIPRangeSubnet(ban.RangeStart, ban.RangeEnd)
if err != nil {
return "?"
}
return ipn.String()
},
"getBoardDirFromID": func(id int) string {
dir, _ := gcsql.GetBoardDir(id)
return dir

View file

@ -63,6 +63,8 @@ func registerModeratorPages() {
gcutil.LogBool("appealable", ban.CanAppeal, infoEv, errEv)
err := ipBanFromRequest(&ban, request, infoEv, errEv)
if err != nil {
errEv.Err(err).Caller().
Msg("unable to submit ban")
return "", err
}
infoEv.Msg("Added IP ban")

View file

@ -22,6 +22,7 @@ func showBanpage(ban *gcsql.IPBan, post *gcsql.Post, postBoard *gcsql.Board, wri
"systemCritical": config.GetSystemCriticalConfig(),
"siteConfig": config.GetSiteConfig(),
"boardConfig": config.GetBoardConfig(postBoard.Dir),
"ip": post.IP,
"ban": ban,
"board": postBoard,
"permanent": ban.Permanent,
@ -139,7 +140,7 @@ func handleAppeal(writer http.ResponseWriter, request *http.Request, infoEv *zer
if !isCorrectIP {
errEv.Caller().
Msg("User tried to appeal a ban from a different IP")
server.ServeErrorPage(writer, fmt.Sprintf("Invalid ban id", banID))
server.ServeErrorPage(writer, fmt.Sprintf("Invalid ban id: %d", banID))
return
}
if !ban.IsActive {

View file

@ -26,7 +26,7 @@
<br /><br />{{$expiresTimestamp := formatTimestamp .ban.ExpiresAt}}{{$appealTimestamp := formatTimestamp .ban.AppealAt}}
Your ban was placed on {{formatTimestamp .ban.IssuedAt}} and will
{{if .ban.Permanent}}<b>not expire</b>{{else}}expire on <b>{{$expiresTimestamp}}</b>{{end}}.<br />
Your IP address is <b>{{.ban.IP}}</b>.<br /><br />
Your IP address is <b>{{.ip}}</b>.<br /><br />
{{if .ban.CanAppeal}}You may appeal this ban:<br />
<form id="appeal-form" action="{{webPath "/post"}}" method="POST">
<input type="hidden" name="board" value="{{.board.Dir}}">

View file

@ -2,7 +2,7 @@
<input type="hidden" name="do" value="add" />
<h2>Add IP ban</h2>
<table>
<tr><th>IP address</th><td><input type="text" name="ip" value="{{.ban.IP}}" style="width: 100%;"/></td></tr>
<tr><th>Mask</th><td><input type="text" name="ip" value="{{banMask .ban}}" style="width: 100%;"/></td></tr>
<tr><th>Duration</th><td><input type="text" name="duration" style="width: 100%;" {{if gt .ban.ID 0}}value="{{until .ban.ExpiresAt}}"{{end}}/></td></tr>
<tr><th></th><td>e.g. '1y2mo3w4d5h6m7s',<br />'1 year 2 months 3 weeks 4 days 5 hours 6 minutes 7 seconds'<br/>Optional if "Permanent" is checked, required otherwise</td></tr>
<tr><th>Permanent</th><td><input type="checkbox" name="permanent" id="permanent" {{if .ban.Permanent}}checked{{end}}> (overrides the duration)</td></tr>
@ -37,7 +37,7 @@ Filter board: <select name="filterboardid" id="filterboardid" onchange="window.l
{{range $_, $ban := $.banlist -}}
<tr>
<td> <a href="{{webPath "manage/bans?edit="}}{{$ban.ID}}">Edit</a> | <a href="{{webPath "manage/bans?delete="}}{{$ban.ID}}">Delete</a> </td>
<td>{{$ban.IP}}</td>
<td>{{banMask $ban}}</td>
<td>{{if not $ban.BoardID}}<i>all</i>{{else}}/{{getBoardDirFromID $ban.BoardID}}/{{end}}</td>
<td>{{$ban.Message}}</td>
<td>{{getStaffNameFromID $ban.StaffID}}</td>