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:
parent
57693ba549
commit
204ae9506f
7 changed files with 38 additions and 17 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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", " ")
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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}}">
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue