From 6d470db2415035f54919cdce96807707e5d5cf20 Mon Sep 17 00:00:00 2001 From: Alexey Sokolov Date: Sun, 19 Jul 2026 20:35:31 +0100 Subject: [PATCH] Revert "Fix JOIN command not joining detached channels on other clients." This reverts commit ba32b092e94846ed1c9eec8284e28d1ab5bc9012. It broke /hop (/part+/join) due to race with server --- src/Chan.cpp | 25 +++++++--------------- test/integration/tests/core.cpp | 38 --------------------------------- 2 files changed, 8 insertions(+), 55 deletions(-) diff --git a/src/Chan.cpp b/src/Chan.cpp index 23f949a8..b1cd707f 100644 --- a/src/Chan.cpp +++ b/src/Chan.cpp @@ -149,30 +149,21 @@ void CChan::JoinUser(const CString& sKey) { } void CChan::AttachUser(CClient* pClient) { - - // Sending '/znc attach #channel' applies for all clients connected. - // Sending '/join #channel' only applies for the client that sent - // the command. This causes a de-sync with IRC events like QUIT - // displaying in the other clients server/status window. - - // Make '/join #channel' work the same as '/znc attach #channel' - CClient* pTarget = IsDetached() ? nullptr : pClient; - m_pNetwork->PutUser( ":" + m_pNetwork->GetIRCNick().GetNickMask() + " JOIN :" + GetName(), - pTarget); + pClient); if (!GetTopic().empty()) { m_pNetwork->PutUser(":" + m_pNetwork->GetIRCServer() + " 332 " + m_pNetwork->GetIRCNick().GetNick() + " " + GetName() + " :" + GetTopic(), - pTarget); + pClient); if (!GetTopicOwner().empty()) { m_pNetwork->PutUser(":" + m_pNetwork->GetIRCServer() + " 333 " + m_pNetwork->GetIRCNick().GetNick() + " " + GetName() + " " + GetTopicOwner() + " " + CString(GetTopicDate()), - pTarget); + pClient); } } @@ -185,10 +176,10 @@ void CChan::AttachUser(CClient* pClient) { const vector& vpClients = m_pNetwork->GetClients(); for (CClient* pEachClient : vpClients) { CClient* pThisClient; - if (!pTarget) + if (!pClient) pThisClient = pEachClient; else - pThisClient = pTarget; + pThisClient = pClient; for (map::iterator a = m_msNicks.begin(); a != m_msNicks.end(); ++a) { @@ -219,18 +210,18 @@ void CChan::AttachUser(CClient* pClient) { } } - if (pTarget) + if (pClient) // We only want to do this for one client break; } m_pNetwork->PutUser(":" + m_pNetwork->GetIRCServer() + " 366 " + m_pNetwork->GetIRCNick().GetNick() + " " + GetName() + " :End of /NAMES list.", - pTarget); + pClient); m_bDetached = false; // Send Buffer - SendBuffer(pTarget); + SendBuffer(pClient); } void CChan::DetachUser() { diff --git a/test/integration/tests/core.cpp b/test/integration/tests/core.cpp index 6038126a..d020ca3c 100644 --- a/test/integration/tests/core.cpp +++ b/test/integration/tests/core.cpp @@ -1278,43 +1278,5 @@ TEST_F(ZNCTest, CAPDetached) { << "Client saw chghost even though all channels are detached"; } -// Test for CChan::AttachUser() -TEST_F(ZNCTest, JoinDetachedChannelMultiClient) { - auto znc = Run(); - auto ircd = ConnectIRCd(); - - auto client1 = LoginClient(); - ircd.Write(":server 001 nick :Hello"); - client1.Write("JOIN #test"); - ircd.ReadUntil("JOIN #test"); - ircd.Write(":nick JOIN :#test"); - ircd.Write(":server 353 nick #test :nick"); - ircd.Write(":server 366 nick #test :End of /NAMES list"); - client1.ReadUntil("End of /NAMES"); - - client1.Write("DETACH #test"); - client1.ReadUntil("Detached 1 channel"); - - auto client2 = LoginClient(); - client2.ReadUntil("001"); - - // Both client1 and client2 should be in #test - client2.Write("JOIN #test"); - - client1.ReadUntil(":nick JOIN :#test"); - client2.ReadUntil(":nick JOIN :#test"); - - client1.ReadUntil("353"); - client2.ReadUntil("353"); - - ircd.Write(":other!user@host JOIN :#test"); - client1.ReadUntil(":other!user@host JOIN :#test"); - client2.ReadUntil(":other!user@host JOIN :#test"); - - ircd.Write(":other!user@host QUIT :quit message"); - client1.ReadUntil(":other!user@host QUIT :quit message"); - client2.ReadUntil(":other!user@host QUIT :quit message"); -} - } // namespace } // namespace znc_inttest