diff --git a/irc/client.go b/irc/client.go index d8f566d7..3f406060 100644 --- a/irc/client.go +++ b/irc/client.go @@ -269,6 +269,7 @@ type WhoWas struct { username string hostname string realname string + ip net.IP // technically not required for WHOWAS: account string accountName string @@ -598,6 +599,10 @@ func (client *Client) IP() net.IP { client.stateMutex.RLock() defer client.stateMutex.RUnlock() + return client.getIPNoMutex() +} + +func (client *Client) getIPNoMutex() net.IP { if client.proxiedIP != nil { return client.proxiedIP } diff --git a/irc/getters.go b/irc/getters.go index 3000c1e4..c2fd54d2 100644 --- a/irc/getters.go +++ b/irc/getters.go @@ -436,6 +436,7 @@ func (client *Client) detailsNoMutex() (result ClientDetails) { result.username = client.username result.hostname = client.hostname result.realname = client.realname + result.ip = client.getIPNoMutex() result.nickMask = client.nickMaskString result.nickMaskCasefolded = client.nickMaskCasefolded result.account = client.account diff --git a/irc/handlers.go b/irc/handlers.go index 64bb7574..19ee445c 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -3416,11 +3416,8 @@ func whowasHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo count = 0 } } - //var target string - //if len(msg.Params) > 2 { - // target = msg.Params[2] - //} cnick := client.Nick() + canSeeIP := client.Oper().HasRoleCapab("ban") for _, nickname := range nicknames { results := server.whoWas.Find(nickname, count) if len(results) == 0 { @@ -3428,6 +3425,9 @@ func whowasHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo } else { for _, whoWas := range results { rb.Add(nil, server.name, RPL_WHOWASUSER, cnick, whoWas.nick, whoWas.username, whoWas.hostname, "*", whoWas.realname) + if canSeeIP { + rb.Add(nil, server.name, RPL_WHOWASIP, cnick, whoWas.nick, fmt.Sprintf(client.t("was connecting from %s"), utils.IPStringToHostname(whoWas.ip.String()))) + } } } rb.Add(nil, server.name, RPL_ENDOFWHOWAS, cnick, utils.SafeErrorParam(nickname), client.t("End of WHOWAS")) diff --git a/irc/numerics.go b/irc/numerics.go index 6e4cffd3..79afff9f 100644 --- a/irc/numerics.go +++ b/irc/numerics.go @@ -168,6 +168,7 @@ const ( ERR_USERSDONTMATCH = "502" ERR_HELPNOTFOUND = "524" ERR_CANNOTSENDRP = "573" + RPL_WHOWASIP = "652" RPL_WHOISSECURE = "671" RPL_YOURLANGUAGESARE = "687" ERR_INVALIDMODEPARAM = "696"