Apply upstream patch 68bd2d87e0

Signed-off-by: kayos@tcp.direct <kayos@tcp.direct>
This commit is contained in:
kayos@tcp.direct 2022-08-26 02:36:32 -07:00
parent 4c2de6ea49
commit 4aed6be9ed
Signed by: kayos
GPG Key ID: 4B841471B4BEE979
2 changed files with 19 additions and 5 deletions

View File

@ -3134,12 +3134,21 @@ func whoHandler(server *Server, client *Client, msg ircmsg.Message, rb *Response
return false
}
// https://modern.ircdocs.horse/#who-message
// "1. A channel name, in which case the channel members are listed."
// "2. An exact nickname, in which case a single user is returned."
// "3. A mask pattern, in which case all visible users whose nickname matches are listed."
var isChannel bool
var isBareNick bool
mask := origMask
var err error
if mask[0] == '#' {
mask, err = CasefoldChannel(msg.Params[0])
if origMask[0] == '#' {
mask, err = CasefoldChannel(origMask)
isChannel = true
} else if !strings.ContainsAny(origMask, protocolBreakingNameCharacters) {
isBareNick = true
} else {
mask, err = CanonicalizeMaskWildcard(mask)
mask, err = CanonicalizeMaskWildcard(origMask)
}
if err != nil {
@ -3190,7 +3199,7 @@ func whoHandler(server *Server, client *Client, msg ircmsg.Message, rb *Response
oper := client.Oper()
hasPrivs := oper.HasRoleCapab("sajoin")
canSeeIPs := oper.HasRoleCapab("ban")
if mask[0] == '#' {
if isChannel {
channel := server.channels.Get(mask)
if channel != nil {
isJoined := channel.hasClient(client)
@ -3208,6 +3217,11 @@ func whoHandler(server *Server, client *Client, msg ircmsg.Message, rb *Response
}
}
}
} else if isBareNick {
mclient := server.clients.Get(mask)
if mclient != nil {
client.rplWhoReply(nil, mclient, rb, canSeeIPs, oper != nil, includeRFlag, isWhox, fields, whoType)
}
} else {
// Construct set of channels the client is in.
userChannels := make(ChannelSet)

View File

@ -7,7 +7,7 @@ import "fmt"
const (
// SemVer is the semantic version of ircd.
SemVer = "0.4.6"
SemVer = "0.4.7"
)
var (