Fix processing of multi-token CAP ACK

I broke it in 5943bc9ed9 while fixing #1950
This commit is contained in:
Alexey Sokolov
2025-05-11 18:35:05 +01:00
parent cc1333fd5e
commit aaeab22ea3
3 changed files with 14 additions and 11 deletions

View File

@@ -450,17 +450,19 @@ bool CIRCSock::OnCapabilityMessage(CMessage& Message) {
}
}
} else if (sSubCmd == "ACK") {
sArgs.Trim();
IRCSOCKMODULECALL(OnServerCapResult(sArgs, true), NOTHING);
auto it = mSupportedCaps.find(sArgs);
if (it != mSupportedCaps.end()) {
it->second(true);
VCString vsCaps;
sArgs.Split(" ", vsCaps, false);
for (CString& sCap : vsCaps) {
IRCSOCKMODULECALL(OnServerCapResult(sCap, true), NOTHING);
auto it = mSupportedCaps.find(sCap);
if (it != mSupportedCaps.end()) {
it->second(true);
}
m_ssAcceptedCaps.insert(std::move(sCap));
}
m_ssAcceptedCaps.insert(sArgs);
} else if (sSubCmd == "NAK") {
// This should work because there's no [known]
// capability with length of name more than 100 characters.
sArgs.Trim();
VCString vsCaps;
sArgs.Split(" ", vsCaps, false);
if (vsCaps.size() == 1) {

View File

@@ -21,6 +21,7 @@
#include "znctestconfig.h"
using testing::HasSubstr;
using testing::Contains;
using testing::ContainsRegex;
using testing::SizeIs;
using testing::Lt;
@@ -1169,7 +1170,7 @@ TEST_F(ZNCTest, ManyCapsInReq) {
ircd.ReadUntilAndGet("CAP REQ :", caps3);
caps3.remove(0, prefix);
EXPECT_THAT(caps3.toStdString(), Not(HasSubstr(" ")));
EXPECT_TRUE(caps.split(' ').contains(caps3));
EXPECT_THAT(caps.split(' '), Contains(caps3));
}
TEST_F(ZNCTest, JoinWhileRegistration) {

View File

@@ -305,9 +305,9 @@ TEST_P(SaslModuleTest, Test) {
client.Write("znc jump");
ircd = ConnectIRCd();
ircd.ReadUntil("CAP LS");
ircd.Write("CAP * LS :sasl");
ircd.ReadUntil("CAP REQ :sasl");
ircd.Write("CAP * ACK :sasl");
ircd.Write("CAP * LS :away-notify sasl");
ircd.ReadUntil("CAP REQ :away-notify sasl");
ircd.Write("CAP * ACK :away-notify sasl");
ircd.ReadUntil("AUTHENTICATE EXTERNAL");
ircd.Write(":server 904 *");
ircd.ReadUntil("AUTHENTICATE PLAIN");