3
0
mirror of https://github.com/ergochat/ergo.git synced 2025-01-09 11:42:45 +01:00

server: close connection on parse-ip failure

Close the client's connection if we're unable to parse their IP.

This also simplifies the check to reduce indentation by a level.

Finally, this replaces the two-var construction of the pseudo-const
messages with an inline dereference via a slice to allow constructing
them less noisily.
This commit is contained in:
Euan Kemp 2017-07-25 22:19:40 -07:00
parent 9bb0062dbc
commit 2b155f9b1e

View File

@ -31,12 +31,10 @@ import (
)
var (
// cached because this may be used lots
tooManyClientsMsg = ircmsg.MakeMessage(nil, "", "ERROR", "Too many clients from your network")
tooManyClientsBytes, _ = tooManyClientsMsg.Line()
bannedFromServerMsg = ircmsg.MakeMessage(nil, "", "ERROR", "You are banned from this server (%s)")
bannedFromServerBytes, _ = bannedFromServerMsg.Line()
// common error responses
tooManyClientsMsg, _ = (&[]ircmsg.IrcMessage{ircmsg.MakeMessage(nil, "", "ERROR", "Too many clients from your network")}[0]).Line()
couldNotParseIPMsg, _ = (&[]ircmsg.IrcMessage{ircmsg.MakeMessage(nil, "", "ERROR", "Unable to parse your IP address")}[0]).Line()
bannedFromServerMsg, _ = (&[]ircmsg.IrcMessage{ircmsg.MakeMessage(nil, "", "ERROR", "You are banned from this server (%s)")}[0]).Line()
errDbOutOfDate = errors.New("Database schema is old")
)
@ -430,11 +428,15 @@ func (server *Server) Run() {
case conn := <-server.newConns:
// check connection limits
ipaddr := net.ParseIP(IPString(conn.Conn.RemoteAddr()))
if ipaddr != nil {
if ipaddr == nil {
conn.Conn.Write([]byte(couldNotParseIPMsg))
conn.Conn.Close()
continue
}
// check DLINEs
isBanned, info := server.dlines.CheckIP(ipaddr)
if isBanned {
banMessage := fmt.Sprintf(bannedFromServerBytes, info.Reason)
banMessage := fmt.Sprintf(bannedFromServerMsg, info.Reason)
if info.Time != nil {
banMessage += fmt.Sprintf(" [%s]", info.Time.Duration.String())
}
@ -450,7 +452,7 @@ func (server *Server) Run() {
if err != nil {
// too many connections from one client, tell the client and close the connection
// this might not show up properly on some clients, but our objective here is just to close it out before it has a load impact on us
conn.Conn.Write([]byte(tooManyClientsBytes))
conn.Conn.Write([]byte(tooManyClientsMsg))
conn.Conn.Close()
continue
}
@ -483,7 +485,6 @@ func (server *Server) Run() {
continue
}
}
}
}
//