mirror of
https://github.com/Eggbertx/gochan.git
synced 2025-08-03 11:46:22 -07:00
88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
package manage
|
|
|
|
import (
|
|
"errors"
|
|
"html"
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/gochan-org/gochan/pkg/gcsql"
|
|
"github.com/gochan-org/gochan/pkg/gcutil"
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
func ipBanFromRequest(ban *gcsql.IPBan, request *http.Request, errEv *zerolog.Event) error {
|
|
now := time.Now()
|
|
banIDStr := request.FormValue("edit")
|
|
if banIDStr != "" && request.FormValue("do") == "edit" {
|
|
banID, err := strconv.Atoi(banIDStr)
|
|
if err != nil {
|
|
errEv.Err(err).
|
|
Str("editBanID", banIDStr).
|
|
Caller().Send()
|
|
return errors.New("invalid 'edit' field value (must be int)")
|
|
}
|
|
editing, err := gcsql.GetIPBanByID(banID)
|
|
if err != nil {
|
|
errEv.Err(err).
|
|
Int("editBanID", banID).
|
|
Caller().Send()
|
|
return errors.New("Unable to get ban with id " + banIDStr + " (SQL error)")
|
|
}
|
|
*ban = *editing
|
|
return nil
|
|
}
|
|
ban.IP = request.FormValue("ip")
|
|
ban.Permanent = request.FormValue("permanent") == "on"
|
|
if ban.Permanent {
|
|
ban.ExpiresAt = now
|
|
} else {
|
|
durationStr := request.FormValue("duration")
|
|
duration, err := gcutil.ParseDurationString(durationStr)
|
|
if err != nil {
|
|
errEv.Err(err).
|
|
Str("duration", durationStr).
|
|
Caller().Msg("Invalid duration")
|
|
return err
|
|
}
|
|
ban.ExpiresAt = now.Add(duration)
|
|
}
|
|
|
|
ban.CanAppeal = request.FormValue("noappeals") != "on"
|
|
if ban.CanAppeal {
|
|
appealWaitStr := request.FormValue("appealwait")
|
|
if appealWaitStr != "" {
|
|
appealDuration, err := gcutil.ParseDurationString(appealWaitStr)
|
|
if err != nil {
|
|
errEv.Err(err).
|
|
Str("appealwait", appealWaitStr).
|
|
Caller().Msg("Invalid appeal delay duration string")
|
|
return err
|
|
}
|
|
ban.AppealAt = now.Add(appealDuration)
|
|
} else {
|
|
ban.AppealAt = now
|
|
}
|
|
} else {
|
|
ban.AppealAt = now
|
|
}
|
|
|
|
ban.IsThreadBan = request.FormValue("threadban") == "on"
|
|
boardIDstr := request.FormValue("boardid")
|
|
if boardIDstr != "" && boardIDstr != "0" {
|
|
boardID, err := strconv.Atoi(boardIDstr)
|
|
if err != nil {
|
|
errEv.Err(err).
|
|
Str("boardid", boardIDstr).
|
|
Caller().Send()
|
|
return err
|
|
}
|
|
ban.BoardID = new(int)
|
|
*ban.BoardID = boardID
|
|
}
|
|
ban.Message = html.EscapeString(request.FormValue("reason"))
|
|
ban.StaffNote = html.EscapeString(request.FormValue("staffnote"))
|
|
ban.IsActive = true
|
|
return gcsql.NewIPBan(ban)
|
|
}
|