From be0d7ab72ab276f63eacc5c6600ea13e9dc0666c Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Thu, 26 Nov 2015 04:07:50 +0000 Subject: Fix CAP REQ to be atomic like the standard dictates. Reported by @dequis on IRC. --- src/modules/m_cap.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/modules/m_cap.cpp') diff --git a/src/modules/m_cap.cpp b/src/modules/m_cap.cpp index e9f4dae90..37478243f 100644 --- a/src/modules/m_cap.cpp +++ b/src/modules/m_cap.cpp @@ -72,17 +72,17 @@ class CommandCAP : public Command reghold.set(user, 1); Data.Send(); - if (Data.ack.size() > 0) + if (Data.wanted.empty()) { - std::string AckResult = irc::stringjoiner(" ", Data.ack, 0, Data.ack.size() - 1).GetJoined(); - user->WriteServ("CAP %s ACK :%s", user->nick.c_str(), AckResult.c_str()); + user->WriteServ("CAP %s ACK :%s", user->nick.c_str(), parameters[1].c_str()); + return CMD_SUCCESS; } - if (Data.wanted.size() > 0) - { - std::string NakResult = irc::stringjoiner(" ", Data.wanted, 0, Data.wanted.size() - 1).GetJoined(); - user->WriteServ("CAP %s NAK :%s", user->nick.c_str(), NakResult.c_str()); - } + // HACK: reset all of the caps which were enabled on this user because a cap request is atomic. + for (std::vector >::iterator iter = Data.changed.begin(); iter != Data.changed.end(); ++iter) + iter->first->ext.set(user, iter->second); + + user->WriteServ("CAP %s NAK :%s", user->nick.c_str(), parameters[1].c_str()); } else if (subcommand == "END") { -- cgit v1.2.3 From e114a7ec08836cdd8c005f320a7f372435b33786 Mon Sep 17 00:00:00 2001 From: Peter Powell Date: Mon, 7 Dec 2015 09:48:33 +0000 Subject: Work around irc::spacesepstream not stripping extraneous spaces. --- src/modules/m_cap.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/modules/m_cap.cpp') diff --git a/src/modules/m_cap.cpp b/src/modules/m_cap.cpp index 37478243f..6b4387fdd 100644 --- a/src/modules/m_cap.cpp +++ b/src/modules/m_cap.cpp @@ -66,7 +66,12 @@ class CommandCAP : public Command while (cap_stream.GetToken(cap_)) { - Data.wanted.push_back(cap_); + // Whilst the handling of extraneous spaces is not currently defined in the CAP specification + // every single other implementation ignores extraneous spaces. Lets copy them for + // compatibility purposes. + trim(cap_); + if (!cap_.empty()) + Data.wanted.push_back(cap_); } reghold.set(user, 1); -- cgit v1.2.3