From: <ps...@us...> - 2008-07-23 13:35:57
|
Revision: 1144 http://znc.svn.sourceforge.net/znc/?rev=1144&view=rev Author: psychon Date: 2008-07-23 13:36:04 +0000 (Wed, 23 Jul 2008) Log Message: ----------- Some weird clients might send a nickmask prefix, handle this correctly *cough* eggdrop is evil *cough* Thanks to dare for debugging this. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-07-22 11:34:38 UTC (rev 1143) +++ trunk/Client.cpp 2008-07-23 13:36:04 UTC (rev 1144) @@ -46,6 +46,12 @@ #endif CString sCommand = sLine.Token(0); + if (sCommand.Left(1) == ":") { + // Evil client! Sending a nickmask prefix on client's command + // is bad, bad, bad, bad, bad, bad, bad, bad, BAD, B A D! + sLine = sLine.Token(1, true); + sCommand = sLine.Token(0); + } if (sCommand.CaseCmp("PASS") == 0) { if (!IsAttached()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-23 15:05:27
|
Revision: 1145 http://znc.svn.sourceforge.net/znc/?rev=1145&view=rev Author: psychon Date: 2008-07-23 15:05:35 +0000 (Wed, 23 Jul 2008) Log Message: ----------- Even more weird and broken clients sending even more and broken stuff PART :#channel... Why do IRCds even parse this correctly? :( Oh and yeah, it's eggdrop. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-07-23 13:36:04 UTC (rev 1144) +++ trunk/Client.cpp 2008-07-23 15:05:35 UTC (rev 1145) @@ -208,6 +208,10 @@ CString sChan = sLine.Token(1); CString sMessage = sLine.Token(2, true); + if (sChan.Left(1) == ":") { + // I hate those broken clients, I hate them so much, I really hate them... + sChan.LeftChomp(); + } if (sMessage.Left(1) == ":") { sMessage.LeftChomp(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-22 12:48:46
|
Revision: 1162 http://znc.svn.sourceforge.net/znc/?rev=1162&view=rev Author: psychon Date: 2008-08-22 12:48:56 +0000 (Fri, 22 Aug 2008) Log Message: ----------- Fix some of the direct module calls in Client.cpp OnModCTCP(), OnModCommand() and OnModNotice() are now called through a preprocessor macro that does all the magic. This fixes a couple of bugs: - the m_pUser member of global modules for OnModNotice() was wrong - OnModCTCP() wasn't called for global modules - Finally handle 'throw UNLOAD' for all of this three module calls Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-08-21 10:47:09 UTC (rev 1161) +++ trunk/Client.cpp 2008-08-22 12:48:56 UTC (rev 1162) @@ -14,6 +14,40 @@ #include "User.h" #include "znc.h" +#define CALLMOD(MOD, CLIENT, USER, FUNC) \ +do { \ + CModule* pModule = CZNC::Get().GetModules().FindModule(MOD); \ + \ + if (pModule) { \ + try { \ + pModule->SetClient(CLIENT); \ + pModule->SetUser(USER); \ + pModule->FUNC; \ + pModule->SetClient(NULL); \ + pModule->SetUser(NULL); \ + } catch (CModule::EModException e) { \ + if (e == CModule::UNLOAD) { \ + CZNC::Get().GetModules().UnloadModule(MOD); \ + } \ + } \ + } else { \ + pModule = USER->GetModules().FindModule(sModule); \ + if (pModule) { \ + try { \ + pModule->SetClient(CLIENT); \ + pModule->FUNC; \ + pModule->SetClient(NULL); \ + } catch (CModule::EModException e) { \ + if (e == CModule::UNLOAD) { \ + USER->GetModules().UnloadModule(MOD); \ + } \ + } \ + } else { \ + PutStatus("No such module [" + sModule + "]"); \ + } \ + } \ +} while (false) + CClient::~CClient() { if (!m_spAuth.IsNull()) { CClientAuth* pAuth = (CClientAuth*) &(*m_spAuth); @@ -283,19 +317,7 @@ CString sModule = sTarget; sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - CModule* pModule = CZNC::Get().GetModules().FindModule(sModule); - - if (pModule) { - pModule->SetClient(this); - pModule->OnModNotice(sMsg); - pModule->SetClient(NULL); - } else if ((pModule = m_pUser->GetModules().FindModule(sModule))) { - pModule->SetClient(this); - pModule->OnModNotice(sMsg); - pModule->SetClient(NULL); - } else { - PutStatus("No such module [" + sModule + "]"); - } + CALLMOD(sModule, this, m_pUser, OnModNotice(sMsg)); } #endif return; @@ -461,14 +483,7 @@ } #ifdef _MODULES - CModule* pModule = m_pUser->GetModules().FindModule(sModule); - if (pModule) { - pModule->SetClient(this); - pModule->OnModCTCP(sCTCP); - pModule->SetClient(NULL); - } else { - PutStatus("No such module [" + sModule + "]"); - } + CALLMOD(sModule, this, m_pUser, OnModCTCP(sCTCP)); #endif return; } @@ -516,24 +531,7 @@ CString sModule = sTarget; sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - CModule* pModule = CZNC::Get().GetModules().FindModule(sModule); - - if (pModule) { - pModule->SetClient(this); - pModule->SetUser(m_pUser); - pModule->OnModCommand(sMsg); - pModule->SetClient(NULL); - pModule->SetUser(NULL); - } else { - pModule = m_pUser->GetModules().FindModule(sModule); - if (pModule) { - pModule->SetClient(this); - pModule->OnModCommand(sMsg); - pModule->SetClient(NULL); - } else { - PutStatus("No such module [" + sModule + "]"); - } - } + CALLMOD(sModule, this, m_pUser, OnModCommand(sMsg)); } #endif return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kr...@us...> - 2008-09-20 16:00:38
|
Revision: 1211 http://znc.svn.sourceforge.net/znc/?rev=1211&view=rev Author: kroimon Date: 2008-09-20 16:00:26 +0000 (Sat, 20 Sep 2008) Log Message: ----------- Ignore messages to ourself when being disconnected from IRC. This suppresses "Your message to [yournick] got lost,..." messages when lagbars try to send notices to their own nick but ZNC is disconnected from IRC. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-09-19 17:24:38 UTC (rev 1210) +++ trunk/Client.cpp 2008-09-20 16:00:26 UTC (rev 1211) @@ -336,8 +336,10 @@ #endif if (!m_pIRCSock) { - PutStatus("Your message to [" + sTarget + "] got lost, " - "you are not connected to IRC!"); + // Some lagmeters do a NOTICE to their own nick, ignore those. + if (sTarget.CaseCmp(m_sNick) != 0) + PutStatus("Your notice to [" + sTarget + "] got lost, " + "you are not connected to IRC!"); return; } @@ -534,8 +536,10 @@ MODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, this, return); if (!m_pIRCSock) { - PutStatus("Your message to [" + sTarget + "] got lost, " - "you are not connected to IRC!"); + // Some lagmeters do a PRIVMSG to their own nick, ignore those. + if (sTarget.CaseCmp(m_sNick) != 0) + PutStatus("Your message to [" + sTarget + "] got lost, " + "you are not connected to IRC!"); return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kr...@us...> - 2008-09-28 01:03:18
|
Revision: 1220 http://znc.svn.sourceforge.net/znc/?rev=1220&view=rev Author: kroimon Date: 2008-09-28 01:03:06 +0000 (Sun, 28 Sep 2008) Log Message: ----------- Removed thousands of redundant checks for m_pUser in CClient::ReadLine(). We already checked for it on line 144 which should be enough. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-09-27 14:42:34 UTC (rev 1219) +++ trunk/Client.cpp 2008-09-28 01:03:06 UTC (rev 1220) @@ -150,24 +150,22 @@ PutStatus("Hello. How may I help you?"); return; } else if (sCommand.CaseCmp("DETACH") == 0) { - if (m_pUser) { - CString sChan = sLine.Token(1); + CString sChan = sLine.Token(1); - if (sChan.empty()) { - PutStatusNotice("Usage: /detach <#chan>"); - return; - } + if (sChan.empty()) { + PutStatusNotice("Usage: /detach <#chan>"); + return; + } - CChan* pChan = m_pUser->FindChan(sChan); - if (!pChan) { - PutStatusNotice("You are not on [" + sChan + "]"); - return; - } - - pChan->DetachUser(); - PutStatusNotice("Detached from [" + sChan + "]"); + CChan* pChan = m_pUser->FindChan(sChan); + if (!pChan) { + PutStatusNotice("You are not on [" + sChan + "]"); return; } + + pChan->DetachUser(); + PutStatusNotice("Detached from [" + sChan + "]"); + return; } else if (sCommand.CaseCmp("PING") == 0) { CString sTarget = sLine.Token(1); @@ -188,36 +186,34 @@ sChans.LeftChomp(); } - if (m_pUser) { - VCString vChans; - sChans.Split(",", vChans, false); - sChans.clear(); + VCString vChans; + sChans.Split(",", vChans, false); + sChans.clear(); - for (unsigned int a = 0; a < vChans.size(); a++) { - CString sChannel = vChans[a]; - MODULECALL(OnUserJoin(sChannel, sKey), m_pUser, this, continue); + for (unsigned int a = 0; a < vChans.size(); a++) { + CString sChannel = vChans[a]; + MODULECALL(OnUserJoin(sChannel, sKey), m_pUser, this, continue); - CChan* pChan = m_pUser->FindChan(sChannel); + CChan* pChan = m_pUser->FindChan(sChannel); - if (pChan) { - pChan->JoinUser(false, sKey); - continue; - } - - if (!sChannel.empty()) { - sChans += (sChans.empty()) ? sChannel : CString("," + sChannel); - } + if (pChan) { + pChan->JoinUser(false, sKey); + continue; } - if (sChans.empty()) { - return; + if (!sChannel.empty()) { + sChans += (sChans.empty()) ? sChannel : CString("," + sChannel); } + } - sLine = "JOIN " + sChans; + if (sChans.empty()) { + return; + } - if (!sKey.empty()) { - sLine += " " + sKey; - } + sLine = "JOIN " + sChans; + + if (!sKey.empty()) { + sLine += " " + sKey; } } else if (sCommand.CaseCmp("PART") == 0) { CString sChan = sLine.Token(1); @@ -233,14 +229,12 @@ MODULECALL(OnUserPart(sChan, sMessage), m_pUser, this, return); - if (m_pUser) { - CChan* pChan = m_pUser->FindChan(sChan); + CChan* pChan = m_pUser->FindChan(sChan); - if (pChan && !pChan->IsOn()) { - PutStatusNotice("Removing channel [" + sChan + "]"); - m_pUser->DelChan(sChan); - return; - } + if (pChan && !pChan->IsOn()) { + PutStatusNotice("Removing channel [" + sChan + "]"); + m_pUser->DelChan(sChan); + return; } sLine = "PART " + sChan; @@ -264,7 +258,7 @@ CString sTarget = sLine.Token(1); CString sModes = sLine.Token(2, true); - if (m_pUser && m_pUser->IsChan(sTarget)) { + if (m_pUser->IsChan(sTarget)) { CChan *pChan = m_pUser->FindChan(sTarget); if (pChan && sModes.empty()) { @@ -276,9 +270,7 @@ } } } else if (sCommand.CaseCmp("QUIT") == 0) { - if (m_pUser) { - m_pUser->UserDisconnected(this); - } + m_pUser->UserDisconnected(this); Close(); // Treat a client quit as a detach return; // Don't forward this msg. We don't want the client getting us disconnected. @@ -301,18 +293,16 @@ sMsg.LeftChomp(); } - if ((!m_pUser) || (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status"))) == 0) { + if (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0) { return; } if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { #ifdef _MODULES - if (m_pUser) { - CString sModule = sTarget; - sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); + CString sModule = sTarget; + sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - CALLMOD(sModule, this, m_pUser, OnModNotice(sMsg)); - } + CALLMOD(sModule, this, m_pUser, OnModNotice(sMsg)); #endif return; } @@ -350,7 +340,7 @@ } // Relay to the rest of the clients that may be connected to this user - if (m_pUser && m_pUser->IsChan(sTarget)) { + if (m_pUser->IsChan(sTarget)) { vector<CClient*>& vClients = m_pUser->GetClients(); for (unsigned int a = 0; a < vClients.size(); a++) { @@ -377,7 +367,7 @@ sCTCP.LeftChomp(); sCTCP.RightChomp(); - if (strncasecmp(sCTCP.c_str(), "DCC ", 4) == 0 && m_pUser && m_pUser->BounceDCCs()) { + if (strncasecmp(sCTCP.c_str(), "DCC ", 4) == 0 && m_pUser->BounceDCCs()) { CString sType = sCTCP.Token(1); CString sFile = sCTCP.Token(2); unsigned long uLongIP = strtoul(sCTCP.Token(3).c_str(), NULL, 10); @@ -401,11 +391,7 @@ // DCC SEND readme.txt 403120438 5550 1104 if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { - if ((!m_pUser) || (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0)) { - if (!m_pUser) { - return; - } - + if (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0) { CString sPath = m_pUser->GetDLPath(); if (!CFile::Exists(sPath)) { PutStatus("Could not create [" + sPath + "] directory."); @@ -417,9 +403,7 @@ CString sLocalFile = sPath + "/" + sFile; - if (m_pUser) { - m_pUser->GetFile(GetNick(), CUtils::GetIP(uLongIP), uPort, sLocalFile, uFileSize); - } + m_pUser->GetFile(GetNick(), CUtils::GetIP(uLongIP), uPort, sLocalFile, uFileSize); } else { MODULECALL(OnDCCUserSend(sTarget, uLongIP, uPort, sFile, uFileSize), m_pUser, this, return); } @@ -436,7 +420,7 @@ // Need to lookup the connection by port, filter the port, and forward to the user if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { - if ((m_pUser) && (m_pUser->ResumeFile(uResumePort, uResumeSize))) { + if (m_pUser->ResumeFile(uResumePort, uResumeSize)) { PutClient(":" + sTarget + "!zn...@zn... PRIVMSG " + GetNick() + " :\001DCC ACCEPT " + sFile + " " + CString(uResumePort) + " " + CString(uResumeSize) + "\001"); } else { PutStatus("DCC -> [" + GetNick() + "][" + sFile + "] Unable to find send to initiate resume."); @@ -496,7 +480,7 @@ } // Relay to the rest of the clients that may be connected to this user - if (m_pUser && m_pUser->IsChan(sTarget)) { + if (m_pUser->IsChan(sTarget)) { vector<CClient*>& vClients = m_pUser->GetClients(); for (unsigned int a = 0; a < vClients.size(); a++) { @@ -515,7 +499,7 @@ return; } - if ((m_pUser) && (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0)) { + if (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0) { MODULECALL(OnStatusCommand(sMsg), m_pUser, this, return); UserCommand(sMsg); return; @@ -523,12 +507,10 @@ if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { #ifdef _MODULES - if (m_pUser) { - CString sModule = sTarget; - sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); + CString sModule = sTarget; + sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - CALLMOD(sModule, this, m_pUser, OnModCommand(sMsg)); - } + CALLMOD(sModule, this, m_pUser, OnModCommand(sMsg)); #endif return; } @@ -553,7 +535,7 @@ // Relay to the rest of the clients that may be connected to this user - if (m_pUser && m_pUser->IsChan(sTarget)) { + if (m_pUser->IsChan(sTarget)) { vector<CClient*>& vClients = m_pUser->GetClients(); for (unsigned int a = 0; a < vClients.size(); a++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kr...@us...> - 2008-09-28 11:53:33
|
Revision: 1221 http://znc.svn.sourceforge.net/znc/?rev=1221&view=rev Author: kroimon Date: 2008-09-28 11:53:30 +0000 (Sun, 28 Sep 2008) Log Message: ----------- Fixed the CALLMOD macro in Client.cpp Simple copy&paste error Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-09-28 01:03:06 UTC (rev 1220) +++ trunk/Client.cpp 2008-09-28 11:53:30 UTC (rev 1221) @@ -14,10 +14,8 @@ #include "User.h" #include "znc.h" -#define CALLMOD(MOD, CLIENT, USER, FUNC) \ -do { \ +#define CALLMOD(MOD, CLIENT, USER, FUNC) { \ CModule* pModule = CZNC::Get().GetModules().FindModule(MOD); \ - \ if (pModule) { \ try { \ pModule->SetClient(CLIENT); \ @@ -31,7 +29,7 @@ } \ } \ } else { \ - pModule = USER->GetModules().FindModule(sModule); \ + pModule = (USER)->GetModules().FindModule(MOD); \ if (pModule) { \ try { \ pModule->SetClient(CLIENT); \ @@ -39,14 +37,14 @@ pModule->SetClient(NULL); \ } catch (CModule::EModException e) { \ if (e == CModule::UNLOAD) { \ - USER->GetModules().UnloadModule(MOD); \ + (USER)->GetModules().UnloadModule(MOD); \ } \ } \ } else { \ - PutStatus("No such module [" + sModule + "]"); \ + PutStatus("No such module [" + MOD + "]"); \ } \ } \ -} while (false) +} CClient::~CClient() { if (!m_spAuth.IsNull()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kr...@us...> - 2008-09-28 19:30:48
|
Revision: 1226 http://znc.svn.sourceforge.net/znc/?rev=1226&view=rev Author: kroimon Date: 2008-09-28 19:30:20 +0000 (Sun, 28 Sep 2008) Log Message: ----------- Introduced CString::TrimPrefix() and CString::CaseCmp() for parsing targets. Dropped all occurences of strncasecmp() and simplified the detection of messages targeting modules. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-09-28 17:17:46 UTC (rev 1225) +++ trunk/Client.cpp 2008-09-28 19:30:20 UTC (rev 1226) @@ -291,16 +291,11 @@ sMsg.LeftChomp(); } - if (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0) { - return; - } - - if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { + if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { #ifdef _MODULES - CString sModule = sTarget; - sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - - CALLMOD(sModule, this, m_pUser, OnModNotice(sMsg)); + if (sTarget.CaseCmp("status") != 0) { + CALLMOD(sTarget, this, m_pUser, OnModNotice(sMsg)); + } #endif return; } @@ -365,7 +360,7 @@ sCTCP.LeftChomp(); sCTCP.RightChomp(); - if (strncasecmp(sCTCP.c_str(), "DCC ", 4) == 0 && m_pUser->BounceDCCs()) { + if (sCTCP.CaseCmp("DCC ", 4) == 0 && m_pUser->BounceDCCs()) { CString sType = sCTCP.Token(1); CString sFile = sCTCP.Token(2); unsigned long uLongIP = strtoul(sCTCP.Token(3).c_str(), NULL, 10); @@ -378,8 +373,7 @@ } if (sType.CaseCmp("CHAT") == 0) { - if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { - } else { + if (!sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { unsigned short uBNCPort = CDCCBounce::DCCRequest(sTarget, uLongIP, uPort, "", true, m_pUser, (m_pIRCSock) ? m_pIRCSock->GetLocalIP() : GetLocalIP(), ""); if (uBNCPort) { PutIRC("PRIVMSG " + sTarget + " :\001DCC CHAT chat " + CString(CUtils::GetLongIP(sIP)) + " " + CString(uBNCPort) + "\001"); @@ -388,8 +382,8 @@ } else if (sType.CaseCmp("SEND") == 0) { // DCC SEND readme.txt 403120438 5550 1104 - if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { - if (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0) { + if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { + if (sTarget.CaseCmp("status") == 0) { CString sPath = m_pUser->GetDLPath(); if (!CFile::Exists(sPath)) { PutStatus("Could not create [" + sPath + "] directory."); @@ -403,7 +397,7 @@ m_pUser->GetFile(GetNick(), CUtils::GetIP(uLongIP), uPort, sLocalFile, uFileSize); } else { - MODULECALL(OnDCCUserSend(sTarget, uLongIP, uPort, sFile, uFileSize), m_pUser, this, return); + MODULECALL(OnDCCUserSend(CString(m_pUser->GetStatusPrefix() + sTarget), uLongIP, uPort, sFile, uFileSize), m_pUser, this, return); } } else { unsigned short uBNCPort = CDCCBounce::DCCRequest(sTarget, uLongIP, uPort, sFile, false, m_pUser, (m_pIRCSock) ? m_pIRCSock->GetLocalIP() : GetLocalIP(), ""); @@ -417,7 +411,8 @@ unsigned long uResumeSize = strtoul(sCTCP.Token(4).c_str(), NULL, 10); // Need to lookup the connection by port, filter the port, and forward to the user - if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { + CString sStatusPrefix = m_pUser->GetStatusPrefix(); + if (sTarget.CaseCmp(sStatusPrefix, sStatusPrefix.length()) == 0) { if (m_pUser->ResumeFile(uResumePort, uResumeSize)) { PutClient(":" + sTarget + "!zn...@zn... PRIVMSG " + GetNick() + " :\001DCC ACCEPT " + sFile + " " + CString(uResumePort) + " " + CString(uResumeSize) + "\001"); } else { @@ -425,20 +420,20 @@ } } else { CDCCBounce* pSock = (CDCCBounce*) CZNC::Get().GetManager().FindSockByLocalPort(uResumePort); - if ((pSock) && (strncasecmp(pSock->GetSockName().c_str(), "DCC::", 5) == 0)) { + if ((pSock) && (pSock->GetSockName().CaseCmp("DCC::", 5) == 0)) { PutIRC("PRIVMSG " + sTarget + " :\001DCC " + sType + " " + sFile + " " + CString(pSock->GetUserPort()) + " " + sCTCP.Token(4) + "\001"); } } } else if (sType.CaseCmp("ACCEPT") == 0) { - if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { - } else { + CString sStatusPrefix = m_pUser->GetStatusPrefix(); + if (sTarget.CaseCmp(sStatusPrefix, sStatusPrefix.length()) != 0) { // Need to lookup the connection by port, filter the port, and forward to the user CSockManager& Manager = CZNC::Get().GetManager(); for (unsigned int a = 0; a < Manager.size(); a++) { CDCCBounce* pSock = (CDCCBounce*) Manager[a]; - if ((pSock) && (strncasecmp(pSock->GetSockName().c_str(), "DCC::", 5) == 0)) { + if ((pSock) && (pSock->GetSockName().CaseCmp("DCC::", 5) == 0)) { if (pSock->GetUserPort() == atoi(sCTCP.Token(3).c_str())) { PutIRC("PRIVMSG " + sTarget + " :\001DCC " + sType + " " + sFile + " " + CString(pSock->GetLocalPort()) + " " + sCTCP.Token(4) + "\001"); } @@ -450,19 +445,14 @@ return; } - if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { - CString sModule = sTarget; - sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - - if (sModule == "status") { + if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { + if (sTarget.CaseCmp("status") == 0) { StatusCTCP(sCTCP); - - return; - } - + } else { #ifdef _MODULES - CALLMOD(sModule, this, m_pUser, OnModCTCP(sCTCP)); + CALLMOD(sTarget, this, m_pUser, OnModCTCP(sCTCP)); #endif + } return; } @@ -497,19 +487,15 @@ return; } - if (sTarget.CaseCmp(CString(m_pUser->GetStatusPrefix() + "status")) == 0) { - MODULECALL(OnStatusCommand(sMsg), m_pUser, this, return); - UserCommand(sMsg); - return; - } - - if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { + if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { + if (sTarget.CaseCmp("status") == 0) { + MODULECALL(OnStatusCommand(sMsg), m_pUser, this, return); + UserCommand(sMsg); + } else { #ifdef _MODULES - CString sModule = sTarget; - sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - - CALLMOD(sModule, this, m_pUser, OnModCommand(sMsg)); + CALLMOD(sTarget, this, m_pUser, OnModCommand(sMsg)); #endif + } return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kr...@us...> - 2008-09-29 13:33:21
|
Revision: 1228 http://znc.svn.sourceforge.net/znc/?rev=1228&view=rev Author: kroimon Date: 2008-09-29 13:33:15 +0000 (Mon, 29 Sep 2008) Log Message: ----------- Enhanced the /znc command to optionally accept commands. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-09-28 19:46:12 UTC (rev 1227) +++ trunk/Client.cpp 2008-09-29 13:33:15 UTC (rev 1228) @@ -145,7 +145,29 @@ } if (sCommand.CaseCmp("ZNC") == 0) { - PutStatus("Hello. How may I help you?"); + CString sTarget = sLine.Token(1); + CString sModCommand; + + if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { + sModCommand = sLine.Token(2, true); + } else { + sTarget = "status"; + sModCommand = sLine.Token(1, true); + } + + if (sTarget.CaseCmp("status") == 0) { + if (sModCommand.empty()) + PutStatus("Hello. How may I help you?"); + else + UserCommand(sModCommand); + } else { +#ifdef _MODULES + if (sModCommand.empty()) + CALLMOD(sTarget, this, m_pUser, PutModule("Hello. How may I help you?")) + else + CALLMOD(sTarget, this, m_pUser, OnModCommand(sModCommand)) +#endif + } return; } else if (sCommand.CaseCmp("DETACH") == 0) { CString sChan = sLine.Token(1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-12-13 17:02:00
|
Revision: 1290 http://znc.svn.sourceforge.net/znc/?rev=1290&view=rev Author: psychon Date: 2008-12-13 17:01:55 +0000 (Sat, 13 Dec 2008) Log Message: ----------- Bugfix: Only reply to a client's MODE request if we actually know the answer (Plus some indent fixup) Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-12-12 15:38:57 UTC (rev 1289) +++ trunk/Client.cpp 2008-12-13 17:01:55 UTC (rev 1290) @@ -281,12 +281,12 @@ if (m_pUser->IsChan(sTarget)) { CChan *pChan = m_pUser->FindChan(sTarget); - if (pChan && sModes.empty()) { + if (pChan && sModes.empty() && !pChan->GetModeString().empty()) { PutClient(":" + m_pUser->GetIRCServer() + " 324 " + GetNick() + " " + sTarget + " " + pChan->GetModeString()); if (pChan->GetCreationDate() > 0) { PutClient(":" + m_pUser->GetIRCServer() + " 329 " + GetNick() + " " + sTarget + " " + CString(pChan->GetCreationDate())); } - return; + return; } } } else if (sCommand.Equals("QUIT")) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sil...@us...> - 2008-12-31 13:49:34
|
Revision: 1315 http://znc.svn.sourceforge.net/znc/?rev=1315&view=rev Author: silverleo Date: 2008-12-31 13:49:29 +0000 (Wed, 31 Dec 2008) Log Message: ----------- Show client IP in debug when username is not available. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-12-31 12:22:38 UTC (rev 1314) +++ trunk/Client.cpp 2008-12-31 13:49:29 UTC (rev 1315) @@ -67,7 +67,7 @@ sLine.RightChomp(); } - DEBUG_ONLY(cout << "(" << ((m_pUser) ? m_pUser->GetUserName() : CString("")) << ") CLI -> ZNC [" << sLine << "]" << endl); + DEBUG_ONLY(cout << "(" << ((m_pUser) ? m_pUser->GetUserName() : GetRemoteIP()) << ") CLI -> ZNC [" << sLine << "]" << endl); #ifdef _MODULES if (IsAttached()) { @@ -729,7 +729,7 @@ } void CClient::PutClient(const CString& sLine) { - DEBUG_ONLY(cout << "(" << ((m_pUser) ? m_pUser->GetUserName() : CString("")) << ") ZNC -> CLI [" << sLine << "]" << endl); + DEBUG_ONLY(cout << "(" << ((m_pUser) ? m_pUser->GetUserName() : GetRemoteIP()) << ") ZNC -> CLI [" << sLine << "]" << endl); Write(sLine + "\r\n"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sil...@us...> - 2009-02-27 19:52:32
|
Revision: 1403 http://znc.svn.sourceforge.net/znc/?rev=1403&view=rev Author: silverleo Date: 2009-02-27 19:52:31 +0000 (Fri, 27 Feb 2009) Log Message: ----------- ZNC usernames can't have a : and passwords that have a : can break anyways so we can chomp it from the beginning to please CGames. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2009-02-27 16:11:53 UTC (rev 1402) +++ trunk/Client.cpp 2009-02-27 19:52:31 UTC (rev 1403) @@ -88,6 +88,8 @@ if (!IsAttached()) { m_bGotPass = true; m_sPass = sLine.Token(1); + if (m_sPass.Left(1) == ":") + m_sPass.LeftChomp(); if (m_sPass.find(":") != CString::npos) { m_sUser = m_sPass.Token(0, false, ":"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-03-07 12:44:24
|
Revision: 1416 http://znc.svn.sourceforge.net/znc/?rev=1416&view=rev Author: psychon Date: 2009-03-07 12:44:11 +0000 (Sat, 07 Mar 2009) Log Message: ----------- Fix my previous commit and also display the remote IP for the failed login Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2009-03-07 12:37:38 UTC (rev 1415) +++ trunk/Client.cpp 2009-03-07 12:44:11 UTC (rev 1416) @@ -628,14 +628,14 @@ } void CAuthBase::RefuseLogin(const CString& sReason) { - CUser* pUser = GetUser(GetUsername()); + CUser* pUser = CZNC::Get().GetUser(GetUsername()); // If the username is valid, notify that user that someone tried to // login. Use sReason because there are other reasons than "wrong // password" for a login to be rejected (e.g. fail2ban). if (pUser) { - pUser->PutStatus("Another client attempted to login as you [" - + sReason + "]."); + pUser->PutStatus("A client from [" + GetRemoteIP() + "] attempted " + "to login as you, but was rejected [" + sReason + "]."); } #ifdef _MODULES This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-05-11 16:07:07
|
Revision: 1506 http://znc.svn.sourceforge.net/znc/?rev=1506&view=rev Author: psychon Date: 2009-05-11 16:06:40 +0000 (Mon, 11 May 2009) Log Message: ----------- Close client sockets only after all pending data was sent Now e.g. the message "Invalid Password" on login even reaches the other end before the connection shoots itself in the foot. There is one place in Client.cpp which I didn't change: ReachedMaxBuffer() If a client is flooding is, why should we wait until we are done answering that flood?... Thanks to morelia for making me notice this. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2009-05-10 09:50:37 UTC (rev 1505) +++ trunk/Client.cpp 2009-05-11 16:06:40 UTC (rev 1506) @@ -295,7 +295,7 @@ } else if (sCommand.Equals("QUIT")) { m_pUser->UserDisconnected(this); - Close(); // Treat a client quit as a detach + Close(Csock::CLT_AFTERWRITE); // Treat a client quit as a detach return; // Don't forward this msg. We don't want the client getting us disconnected. } else if (sCommand.Equals("PROTOCTL")) { unsigned int i = 1; @@ -652,7 +652,7 @@ PutStatus("Bad username and/or password."); PutClient(":irc.znc.in 464 " + GetNick() + " :" + sReason); - Close(); + Close(Csock::CLT_AFTERWRITE); } void CClientAuth::AcceptedLogin(CUser& User) { @@ -729,7 +729,7 @@ void CClient::BouncedOff() { PutStatusNotice("You are being disconnected because another user just authenticated as you."); m_pIRCSock = NULL; - Close(); + Close(Csock::CLT_AFTERWRITE); } void CClient::IRCDisconnected() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-05-11 16:16:30
|
Revision: 1507 http://znc.svn.sourceforge.net/znc/?rev=1507&view=rev Author: psychon Date: 2009-05-11 16:16:10 +0000 (Mon, 11 May 2009) Log Message: ----------- Fix a wrong cached /mode reply ZNC replies to /mode #chan with the cached channel modes without querying the IRCd. This was added to avoid traffic spikes to the ircd when a client logged in. The logic in this code had a bug that made it also reply with stale cached values if we once were but aren't anymore in that channel (e.g. after you've been kicked). Thanks to tomaw for reporting this. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2009-05-11 16:06:40 UTC (rev 1506) +++ trunk/Client.cpp 2009-05-11 16:16:10 UTC (rev 1507) @@ -284,7 +284,10 @@ if (m_pUser->IsChan(sTarget)) { CChan *pChan = m_pUser->FindChan(sTarget); - if (pChan && sModes.empty() && !pChan->GetModeString().empty()) { + // If we are on that channel and already received a + // /mode reply from the server, we can answer this + // request ourself. + if (pChan && pChan->IsOn() && sModes.empty() && !pChan->GetModeString().empty()) { PutClient(":" + m_pUser->GetIRCServer() + " 324 " + GetNick() + " " + sTarget + " " + pChan->GetModeString()); if (pChan->GetCreationDate() > 0) { PutClient(":" + m_pUser->GetIRCServer() + " 329 " + GetNick() + " " + sTarget + " " + CString(pChan->GetCreationDate())); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-07-21 18:49:05
|
Revision: 1570 http://znc.svn.sourceforge.net/znc/?rev=1570&view=rev Author: psychon Date: 2009-07-21 18:49:02 +0000 (Tue, 21 Jul 2009) Log Message: ----------- Fix a high-impact directory traversal bug You can upload files to znc via /dcc send *status. The files will be saved in <datadir>/users/<user>/downloads/. The code for this didn't do any checking on the file name at all and thus allowed directory traversal attacks by all znc users (no admin privileges required!). By exploiting this bug, attackers could e.g. upload a new ssh authorized_keys file or upload a znc module which lets everyone gain shell access. Anything is possible. Again: ONLY A NORMAL USER ACCOUNT NEEDED, no admin privileges. THE ATTACKER GOT WRITE ACCESS TO ALL PLACES ZNC GOT WRITE ACCESS TO. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2009-07-21 18:36:33 UTC (rev 1569) +++ trunk/Client.cpp 2009-07-21 18:49:02 UTC (rev 1570) @@ -421,9 +421,14 @@ return; } - CString sLocalFile = sPath + "/" + sFile; + CString sAbsolutePath = CDir::CheckPathPrefix(sPath, sFile); - m_pUser->GetFile(GetNick(), CUtils::GetIP(uLongIP), uPort, sLocalFile, uFileSize); + if (sAbsolutePath.empty()) { + PutStatus("Illegal path."); + return; + } + + m_pUser->GetFile(GetNick(), CUtils::GetIP(uLongIP), uPort, sAbsolutePath, uFileSize); } else { MODULECALL(OnDCCUserSend(CString(m_pUser->GetStatusPrefix() + sTarget), uLongIP, uPort, sFile, uFileSize), m_pUser, this, return); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2009-10-10 12:29:53
|
Revision: 1646 http://znc.svn.sourceforge.net/znc/?rev=1646&view=rev Author: psychon Date: 2009-10-10 12:29:40 +0000 (Sat, 10 Oct 2009) Log Message: ----------- Comment out some weird code from Client.cpp Suggestions for what this was good for? Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2009-10-09 17:11:49 UTC (rev 1645) +++ trunk/Client.cpp 2009-10-10 12:29:40 UTC (rev 1646) @@ -325,9 +325,13 @@ return; } + // No idea what this is supposed to do, but it doesn't seem to + // make sense. Comment this out and wait for complaints. +#if 0 if (sMsg.WildCmp("DCC * (*)")) { sMsg = "DCC " + sLine.Token(3) + " (" + ((m_pIRCSock) ? m_pIRCSock->GetLocalIP() : GetLocalIP()) + ")"; } +#endif #ifdef _MODULES if (sMsg.WildCmp("\001*\001")) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-01-28 19:29:35
|
Revision: 1723 http://znc.svn.sourceforge.net/znc/?rev=1723&view=rev Author: psychon Date: 2010-01-28 19:29:24 +0000 (Thu, 28 Jan 2010) Log Message: ----------- Remove a pointless if If there is no connection to the IRC server, we can't forward a nick change anyway, so there is no need to check for this case. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-01-25 21:54:55 UTC (rev 1722) +++ trunk/Client.cpp 2010-01-28 19:29:24 UTC (rev 1723) @@ -113,11 +113,6 @@ } return; // Don't forward this msg. ZNC will handle nick changes until auth is complete } - - if (!m_pIRCSock) { - // No need to forward it - return; - } } else if (sCommand.Equals("USER")) { if (!IsAttached()) { if (m_sUser.empty()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-01-28 19:46:16
|
Revision: 1726 http://znc.svn.sourceforge.net/znc/?rev=1726&view=rev Author: psychon Date: 2010-01-28 19:46:06 +0000 (Thu, 28 Jan 2010) Log Message: ----------- CClient::PutIRC(): Use CUser::PutIRC() This won't save the world, but it won't destroy it either. ;) Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-01-28 19:44:37 UTC (rev 1725) +++ trunk/Client.cpp 2010-01-28 19:46:06 UTC (rev 1726) @@ -739,9 +739,7 @@ } void CClient::PutIRC(const CString& sLine) { - if (GetIRCSock()) { - GetIRCSock()->PutIRC(sLine); - } + m_pUser->PutIRC(sLine); } void CClient::PutClient(const CString& sLine) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-04-30 18:15:56
|
Revision: 1956 http://znc.svn.sourceforge.net/znc/?rev=1956&view=rev Author: psychon Date: 2010-04-30 18:15:50 +0000 (Fri, 30 Apr 2010) Log Message: ----------- MOTD: Use ExpandString() Thanks to Un1matr1x for the idea. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-04-30 10:50:33 UTC (rev 1955) +++ trunk/Client.cpp 2010-04-30 18:15:50 UTC (rev 1956) @@ -586,7 +586,7 @@ } for (unsigned int a = 0; a < vsMotd.size(); a++) { - PutStatusNotice(vsMotd[a]); + PutStatusNotice(m_pUser->ExpandString(vsMotd[a])); } return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-06-13 07:15:43
|
Revision: 2021 http://znc.svn.sourceforge.net/znc/?rev=2021&view=rev Author: psychon Date: 2010-06-13 07:15:35 +0000 (Sun, 13 Jun 2010) Log Message: ----------- Move some common code into CClient::AuthUser() Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-06-12 20:20:33 UTC (rev 2020) +++ trunk/Client.cpp 2010-06-13 07:15:35 UTC (rev 2021) @@ -92,10 +92,7 @@ m_sPass = m_sPass.Token(1, true, ":"); } - if ((m_bGotNick) && (m_bGotUser)) { - AuthUser(); - } - + AuthUser(); return; // Don't forward this msg. ZNC has already registered us. } } else if (sCommand.Equals("NICK")) { @@ -108,9 +105,7 @@ m_sNick = sNick; m_bGotNick = true; - if ((m_bGotPass) && (m_bGotUser)) { - AuthUser(); - } + AuthUser(); return; // Don't forward this msg. ZNC will handle nick changes until auth is complete } } else if (sCommand.Equals("USER")) { @@ -121,9 +116,9 @@ m_bGotUser = true; - if ((m_bGotPass) && (m_bGotNick)) { + if (m_bGotPass) { AuthUser(); - } else if (!m_bGotPass) { + } else { PutClient(":irc.znc.in NOTICE AUTH :*** " "You need to send your password. " "Try /quote PASS <username>:<password>"); @@ -593,6 +588,9 @@ } void CClient::AuthUser() { + if (!m_bGotNick || !m_bGotUser) + return; + m_spAuth = new CClientAuth(this, m_sUser, m_sPass); CZNC::Get().AuthUser(m_spAuth); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-06-13 07:47:03
|
Revision: 2024 http://znc.svn.sourceforge.net/znc/?rev=2024&view=rev Author: psychon Date: 2010-06-13 07:46:57 +0000 (Sun, 13 Jun 2010) Log Message: ----------- Add support for some capabilities multi-prefix is just NAMESX' CAP name and userhost-in-names is just UHNAMES for CAP. This makes it pretty easy to make them work. :) Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-06-13 07:37:47 UTC (rev 2023) +++ trunk/Client.cpp 2010-06-13 07:46:57 UTC (rev 2024) @@ -788,15 +788,43 @@ CString sSubCmd = sLine.Token(1); if (sSubCmd.Equals("LS")) { - RespondCap("LS :"); + RespondCap("LS :userhost-in-names multi-prefix"); m_bInCap = true; } else if (sSubCmd.Equals("END")) { m_bInCap = false; AuthUser(); } else if (sSubCmd.Equals("REQ")) { - // No capabilities supported for now - RespondCap("NAK :" + sLine.Token(2, true).TrimPrefix_n(":")); + bool bReqUHNames = false; + bool bReqNamesx = false; + + VCString vsTokens; + VCString::iterator it; + sLine.Token(2).TrimPrefix_n(":").Split(" ", vsTokens, false); + + for (it = vsTokens.begin(); it != vsTokens.end(); ++it) { + if (*it == "multi-prefix") { + bReqNamesx = true; + } else if (*it == "userhost-in-names") { + bReqUHNames = true; + } else { + // Some unsupported capability is requested + RespondCap("NAK :" + sLine.Token(2, true).TrimPrefix_n(":")); + return; + } + } + + // All is fine, we support what was requested + RespondCap("ACK :" + sLine.Token(2, true).TrimPrefix_n(":")); + if (bReqUHNames) + m_bUHNames = true; + if (bReqNamesx) + m_bNamesx = true; } else if (sSubCmd.Equals("LIST")) { - RespondCap("LIST :"); + CString sList = ""; + if (m_bNamesx) + sList += "multi-prefix "; + if (m_bUHNames) + sList += "userhost-in-names "; + RespondCap("LIST :" + sList.TrimSuffix_n(" ")); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-06-16 18:48:37
|
Revision: 2027 http://znc.svn.sourceforge.net/znc/?rev=2027&view=rev Author: psychon Date: 2010-06-16 18:48:30 +0000 (Wed, 16 Jun 2010) Log Message: ----------- Support disabling CAPabilities This commits adds support for cap commands like this one: CAP REQ :-multi-prefix Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-06-13 17:14:52 UTC (rev 2026) +++ trunk/Client.cpp 2010-06-16 18:48:30 UTC (rev 2027) @@ -796,16 +796,24 @@ } else if (sSubCmd.Equals("REQ")) { bool bReqUHNames = false; bool bReqNamesx = false; + bool bValueUHNames = false; + bool bValueNamesx = false; VCString vsTokens; VCString::iterator it; sLine.Token(2).TrimPrefix_n(":").Split(" ", vsTokens, false); for (it = vsTokens.begin(); it != vsTokens.end(); ++it) { + bool bVal = true; + if (it->TrimPrefix("-")) + bVal = false; + if (*it == "multi-prefix") { bReqNamesx = true; + bValueNamesx = bVal; } else if (*it == "userhost-in-names") { bReqUHNames = true; + bValueUHNames = bVal; } else { // Some unsupported capability is requested RespondCap("NAK :" + sLine.Token(2, true).TrimPrefix_n(":")); @@ -816,9 +824,9 @@ // All is fine, we support what was requested RespondCap("ACK :" + sLine.Token(2, true).TrimPrefix_n(":")); if (bReqUHNames) - m_bUHNames = true; + m_bUHNames = bValueUHNames; if (bReqNamesx) - m_bNamesx = true; + m_bNamesx = bValueNamesx; } else if (sSubCmd.Equals("LIST")) { CString sList = ""; if (m_bNamesx) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-06-16 19:11:13
|
Revision: 2028 http://znc.svn.sourceforge.net/znc/?rev=2028&view=rev Author: psychon Date: 2010-06-16 19:11:07 +0000 (Wed, 16 Jun 2010) Log Message: ----------- Micro optimization Only call GetUser() when we actually need the result Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-06-16 18:48:30 UTC (rev 2027) +++ trunk/Client.cpp 2010-06-16 19:11:07 UTC (rev 2028) @@ -631,11 +631,11 @@ } void CAuthBase::RefuseLogin(const CString& sReason) { - CUser* pUser = CZNC::Get().GetUser(GetUsername()); - if (!m_pSock) return; + CUser* pUser = CZNC::Get().GetUser(GetUsername()); + // If the username is valid, notify that user that someone tried to // login. Use sReason because there are other reasons than "wrong // password" for a login to be rejected (e.g. fail2ban). This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-06-30 17:39:46
|
Revision: 2048 http://znc.svn.sourceforge.net/znc/?rev=2048&view=rev Author: psychon Date: 2010-06-30 17:39:39 +0000 (Wed, 30 Jun 2010) Log Message: ----------- Correctly handle CAP REQ The old code only looked at the first capability request. Found and patched by DarthGandalf, thanks. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-06-29 19:07:04 UTC (rev 2047) +++ trunk/Client.cpp 2010-06-30 17:39:39 UTC (rev 2048) @@ -796,7 +796,7 @@ VCString vsTokens; VCString::iterator it; - sLine.Token(2).TrimPrefix_n(":").Split(" ", vsTokens, false); + sLine.Token(2, true).TrimPrefix_n(":").Split(" ", vsTokens, false); for (it = vsTokens.begin(); it != vsTokens.end(); ++it) { bool bVal = true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2010-08-03 09:50:42
|
Revision: 2093 http://znc.svn.sourceforge.net/znc/?rev=2093&view=rev Author: psychon Date: 2010-08-03 09:50:32 +0000 (Tue, 03 Aug 2010) Log Message: ----------- Fix an out-of-range access to std::string When we received a "PING" from a client without an argument, std::string would throw a std::out_of_range exception which killed znc. Thanks to Sm0ke0ut for reporting this. Modified Paths: -------------- trunk/Client.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2010-07-24 20:34:26 UTC (rev 2092) +++ trunk/Client.cpp 2010-08-03 09:50:32 UTC (rev 2093) @@ -180,7 +180,10 @@ } else if (sCommand.Equals("PING")) { // All PONGs are generated by znc. We will still forward this to // the ircd, but all PONGs from irc will be blocked. - PutClient(":irc.znc.in PONG irc.znc.in " + sLine.substr(5)); + if (sLine.length() >= 5) + PutClient(":irc.znc.in PONG irc.znc.in " + sLine.substr(5)); + else + PutClient(":irc.znc.in PONG irc.znc.in"); } else if (sCommand.Equals("PONG")) { // Block PONGs, we already responded to the pings return; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |