From 0bec0a81a11f46bd82f919e657ca4795bab66dfc Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Sun, 22 Jun 2025 05:20:30 -0400 Subject: [PATCH] normalize metadata keys in sub/unsub --- irc/getters.go | 4 ++-- irc/handlers.go | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/irc/getters.go b/irc/getters.go index 8c95b11b..75896811 100644 --- a/irc/getters.go +++ b/irc/getters.go @@ -839,6 +839,8 @@ func (session *Session) isSubscribedTo(key string) bool { } func (session *Session) SubscribeTo(keys ...string) ([]string, error) { + maxSubs := session.client.server.Config().Metadata.MaxSubs + session.client.stateMutex.Lock() defer session.client.stateMutex.Unlock() @@ -848,8 +850,6 @@ func (session *Session) SubscribeTo(keys ...string) ([]string, error) { var added []string - maxSubs := session.client.server.Config().Metadata.MaxSubs - for _, k := range keys { if !session.metadataSubscriptions.Has(k) { if len(session.metadataSubscriptions) > maxSubs { diff --git a/irc/handlers.go b/irc/handlers.go index 92a533ae..2b37bffc 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -3316,10 +3316,18 @@ func metadataUnregisteredHandler(client *Client, config *Config, subcommand stri // metadataSubsHandler handles subscription-related commands; // these are handled the same whether the client is registered or not func metadataSubsHandler(client *Client, subcommand string, params []string, rb *ResponseBuffer) (exiting bool) { + allToLower := func(in []string) (out []string) { + out = make([]string, len(in)) + for i, s := range in { + out[i] = strings.ToLower(s) + } + return out + } + server := client.server switch subcommand { case "sub": - keys := params[2:] + keys := allToLower(params[2:]) for _, key := range keys { if metadataKeyIsEvil(key) { rb.Add(nil, server.name, "FAIL", "METADATA", "KEY_INVALID", utils.SafeErrorParam(key), client.t("Invalid key name")) @@ -3341,7 +3349,7 @@ func metadataSubsHandler(client *Client, subcommand string, params []string, rb } case "unsub": - keys := params[2:] + keys := allToLower(params[2:]) removed := rb.session.UnsubscribeFrom(keys...) lineLength := MaxLineLen - len(server.name) - len(RPL_METADATAUNSUBOK) - len(client.Nick()) - 10