diff --git a/ban.go b/ban.go index 8cef27a..878acfd 100644 --- a/ban.go +++ b/ban.go @@ -11,6 +11,7 @@ import ( ) var ErrAlreadyBanned = errors.New("ip address is already banned") +var ErrInvalidAddress = errors.New("invalid ip address format") // addBanItem inserts a ban DB entry func addBanItem(db *sql.DB, addr, name string) error { @@ -63,7 +64,7 @@ func readBanItem(db *sql.DB, addr string) (string, error) { // deleteBanItem deletes a ban DB entry func deleteBanItem(db *sql.DB, name string) error { - sql_deleteBanItem := `DELETE FROM ban WHERE name = ?;` + sql_deleteBanItem := `DELETE FROM ban WHERE name = ? OR addr = ?;` stmt, err := db.Prepare(sql_deleteBanItem) if err != nil { @@ -71,7 +72,7 @@ func deleteBanItem(db *sql.DB, name string) error { } defer stmt.Close() - _, err = stmt.Exec(name) + _, err = stmt.Exec(name, name) if err != nil { return err } @@ -146,6 +147,27 @@ func (p *Peer) Ban() error { return nil } +func Ban(addr string) error { + db, err := initAuthDB() + if err != nil { + return err + } + defer db.Close() + + name := "not known" + + if net.ParseIP(addr) == nil { + return ErrInvalidAddress + } + + err = addBanItem(db, addr, name) + if err != nil { + return err + } + + return nil +} + func Unban(name string) error { db, err := initAuthDB() if err != nil { diff --git a/igutils.go b/igutils.go index 837ea03..892d5d4 100644 --- a/igutils.go +++ b/igutils.go @@ -310,30 +310,33 @@ func init() { }) RegisterChatCommand("ban", privs("ban"), - func (p *Peer, param string) { + func(p *Peer, param string) { if param == "" { - p.SendChatMsg("Usage: #ban ") + p.SendChatMsg("Usage: #ban ") return } - p2 := GetListener().GetPeerByUsername(param) - if p2 == nil { - p.SendChatMsg(param + " is not online.") - return - } + err := Ban(param) + if err != nil { + p2 := GetListener().GetPeerByUsername(param) + if p2 == nil { + p.SendChatMsg(param + " is not online.") + return + } - if err := p2.Ban(); err != nil { - p.SendChatMsg("An internal error occured while attempting to ban the player.") - return + if err := p2.Ban(); err != nil { + p.SendChatMsg("An internal error occured while attempting to ban the player.") + return + } } p.SendChatMsg("Banned " + param) }) RegisterChatCommand("unban", privs("ban"), - func (p *Peer, param string) { + func(p *Peer, param string) { if param == "" { - p.SendChatMsg("Usage: #unban ") + p.SendChatMsg("Usage: #unban ") return }