multiserver/ban.go

124 lines
2.2 KiB
Go
Raw Normal View History

2021-02-28 04:12:28 -08:00
package main
import (
2021-04-22 03:33:50 -07:00
"database/sql"
2021-02-28 04:12:28 -08:00
"errors"
"fmt"
2021-02-28 04:12:28 -08:00
"net"
_ "github.com/mattn/go-sqlite3"
)
2021-02-28 04:33:30 -08:00
var ErrInvalidAddress = errors.New("invalid ip address format")
2021-02-28 04:12:28 -08:00
2021-03-06 06:57:39 -08:00
// BanList returns the list of banned players and IP addresses
func BanList() (map[string]string, error) {
2021-04-22 03:04:43 -07:00
db, err := authDB()
2021-03-06 06:57:39 -08:00
if err != nil {
return nil, err
}
defer db.Close()
2021-04-01 01:28:28 -07:00
rows, err := db.Query(`SELECT addr, name FROM ban;`)
2021-03-06 06:57:39 -08:00
if err != nil {
return nil, err
}
r := make(map[string]string)
for rows.Next() {
var addr, name string
if err = rows.Scan(&addr, &name); err != nil {
return nil, err
}
2021-03-06 06:57:39 -08:00
r[addr] = name
}
return r, nil
}
2021-04-22 03:04:43 -07:00
// IsBanned reports whether an IP address is banned
func IsBanned(addr string) (bool, string, error) {
db, err := authDB()
2021-02-28 04:12:28 -08:00
if err != nil {
return true, "", err
}
defer db.Close()
2021-04-22 03:04:43 -07:00
var name string
2021-04-22 04:40:56 -07:00
err = db.QueryRow(`SELECT name FROM ban WHERE addr = $1;`, addr).Scan(&name)
2021-04-22 03:33:50 -07:00
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return true, "", err
}
return name != "", name, nil
2021-04-22 03:04:43 -07:00
}
// IsBanned reports whether a Conn is banned
func (c *Conn) IsBanned() (bool, string, error) {
2021-03-29 09:57:30 -07:00
addr := c.Addr().(*net.UDPAddr).IP.String()
2021-02-28 04:12:28 -08:00
2021-04-22 03:04:43 -07:00
banned, name, err := IsBanned(addr)
2021-02-28 04:12:28 -08:00
if err != nil {
return true, "", err
}
2021-04-22 03:04:43 -07:00
return banned, name, nil
2021-02-28 04:12:28 -08:00
}
2021-04-22 03:04:43 -07:00
// Ban adds an IP address to the ban list
func Ban(addr, name string) error {
db, err := authDB()
2021-02-28 04:12:28 -08:00
if err != nil {
return err
}
defer db.Close()
2021-04-22 03:04:43 -07:00
if net.ParseIP(addr) == nil {
return ErrInvalidAddress
2021-02-28 04:12:28 -08:00
}
2021-04-22 03:04:43 -07:00
_, err = db.Exec(`INSERT INTO ban (
addr,
name
) VALUES (
2021-04-22 04:40:56 -07:00
$1,
$2
2021-04-22 03:04:43 -07:00
);`, addr, name)
return err
2021-02-28 04:12:28 -08:00
}
2021-04-22 03:04:43 -07:00
// Ban adds a Conn to the ban list
func (c *Conn) Ban() error {
banned, _, err := c.IsBanned()
2021-02-28 04:33:30 -08:00
if err != nil {
return err
}
2021-04-22 03:04:43 -07:00
if banned {
return fmt.Errorf("ip address %s is already banned", c.Addr().String())
2021-02-28 04:33:30 -08:00
}
2021-04-22 03:04:43 -07:00
name := c.Username()
addr := c.Addr().(*net.UDPAddr).IP.String()
Ban(addr, name)
2021-02-28 04:33:30 -08:00
2021-04-22 03:04:43 -07:00
c.CloseWith(AccessDeniedCustomString, "Banned.", false)
2021-02-28 04:33:30 -08:00
return nil
}
2021-04-22 03:04:43 -07:00
// Unban removes a player from the ban list
func Unban(id string) error {
db, err := authDB()
2021-02-28 04:12:28 -08:00
if err != nil {
return err
}
defer db.Close()
2021-04-22 04:40:56 -07:00
_, err = db.Exec(`DELETE FROM ban WHERE name = $1 OR addr = $2;`, id, id)
2021-04-22 03:04:43 -07:00
return err
2021-02-28 04:12:28 -08:00
}