diff --git a/src/Client.cpp b/src/Client.cpp index 5b67b113..a15fc2a0 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -1065,13 +1065,20 @@ bool CClient::OnJoinMessage(CJoinMessage& Message) { CString sChannel = Message.GetTarget(); CString sKey = Message.GetKey(); - CChan* pChan = m_pNetwork ? m_pNetwork->FindChan(sChannel) : nullptr; - if (pChan) { - if (pChan->IsDetached()) - pChan->AttachUser(this); - else - pChan->JoinUser(sKey); - continue; + if (m_pNetwork) { + CChan* pChan = m_pNetwork->FindChan(sChannel); + if (pChan) { + if (pChan->IsDetached()) + pChan->AttachUser(this); + else + pChan->JoinUser(sKey); + continue; + } else if (!sChannel.empty()) { + pChan = new CChan(sChannel, m_pNetwork, false); + if (m_pNetwork->AddChan(pChan)) { + pChan->SetKey(sKey); + } + } } if (!sChannel.empty()) { diff --git a/test/integration/tests/core.cpp b/test/integration/tests/core.cpp index 38e9127f..08e73066 100644 --- a/test/integration/tests/core.cpp +++ b/test/integration/tests/core.cpp @@ -262,5 +262,25 @@ TEST_F(ZNCTest, AwayNotify) { client.ReadUntil("DEL :away-notify"); } +TEST_F(ZNCTest, JoinKey) { + QFile conf(m_dir.path() + "/configs/znc.conf"); + ASSERT_TRUE(conf.open(QIODevice::Append | QIODevice::Text)); + QTextStream(&conf) << "ServerThrottle = 1\n"; + auto znc = Run(); + + auto ircd = ConnectIRCd(); + auto client = LoginClient(); + ircd.Write(":server 001 nick :Hello"); + client.Write("JOIN #znc secret"); + ircd.ReadUntil("JOIN #znc secret"); + ircd.Write(":nick JOIN :#znc"); + client.ReadUntil("JOIN :#znc"); + ircd.Close(); + + ircd = ConnectIRCd(); + ircd.Write(":server 001 nick :Hello"); + ircd.ReadUntil("JOIN #znc secret"); +} + } // namespace } // namespace znc_inttest