diff --git a/Listener.cpp b/Listener.cpp index 55a157db..0eb02b8e 100644 --- a/Listener.cpp +++ b/Listener.cpp @@ -111,10 +111,7 @@ void CIncomingConnection::ReadLine(const CString& sLine) { return; } - CModule* pMod = new CModule(NULL, "", ""); - pMod->SetFake(true); - - pSock = new CWebSock(pMod); + pSock = new CWebSock(); CZNC::Get().GetManager().SwapSockByAddr(pSock, this); // And don't forget to give it some sane name / timeout diff --git a/Socket.cpp b/Socket.cpp index 866e4a58..42742715 100644 --- a/Socket.cpp +++ b/Socket.cpp @@ -37,14 +37,14 @@ CS_STRING CZNCSock::ConvertAddress(void *addr, bool ipv6) { /////////////////// CSocket /////////////////// CSocket::CSocket(CModule* pModule) : CZNCSock() { m_pModule = pModule; - m_pModule->AddSocket(this); + if (m_pModule) m_pModule->AddSocket(this); EnableReadLine(); SetMaxBufferThreshold(10240); } CSocket::CSocket(CModule* pModule, const CString& sHostname, unsigned short uPort, int iTimeout) : CZNCSock(sHostname, uPort, iTimeout) { m_pModule = pModule; - m_pModule->AddSocket(this); + if (m_pModule) m_pModule->AddSocket(this); EnableReadLine(); SetMaxBufferThreshold(10240); } @@ -58,7 +58,7 @@ CSocket::~CSocket() { m_pModule->UnlinkSocket(this); } - if (pUser && !m_pModule->IsGlobal()) { + if (pUser && m_pModule && !m_pModule->IsGlobal()) { pUser->AddBytesWritten(GetBytesWritten()); pUser->AddBytesRead(GetBytesRead()); } else { @@ -69,7 +69,7 @@ CSocket::~CSocket() { void CSocket::ReachedMaxBuffer() { DEBUG(GetSockName() << " == ReachedMaxBuffer()"); - PutModule("Some socket reached its max buffer limit and was closed!"); + if (m_pModule) m_pModule->PutModule("Some socket reached its max buffer limit and was closed!"); Close(); } @@ -86,6 +86,11 @@ bool CSocket::ConnectionFrom(const CString& sHost, unsigned short uPort) { } bool CSocket::Connect(const CString& sHostname, unsigned short uPort, bool bSSL, unsigned int uTimeout) { + if (!m_pModule) { + DEBUG("ERROR: CSocket::Connect called on instance without m_pModule handle!"); + return false; + } + CUser* pUser = m_pModule->GetUser(); CString sSockName = "MOD::C::" + m_pModule->GetModName(); CString sVHost; @@ -104,6 +109,11 @@ bool CSocket::Connect(const CString& sHostname, unsigned short uPort, bool bSSL, } bool CSocket::Listen(unsigned short uPort, bool bSSL, unsigned int uTimeout) { + if (!m_pModule) { + DEBUG("ERROR: CSocket::Listen called on instance without m_pModule handle!"); + return false; + } + CUser* pUser = m_pModule->GetUser(); CString sSockName = "MOD::L::" + m_pModule->GetModName(); @@ -118,25 +128,5 @@ bool CSocket::Listen(unsigned short uPort, bool bSSL, unsigned int uTimeout) { return m_pModule->GetManager()->ListenAll(uPort, sSockName, bSSL, SOMAXCONN, this); } -bool CSocket::PutIRC(const CString& sLine) { - return (m_pModule) ? m_pModule->PutIRC(sLine) : false; -} - -bool CSocket::PutUser(const CString& sLine) { - return (m_pModule) ? m_pModule->PutUser(sLine) : false; -} - -bool CSocket::PutStatus(const CString& sLine) { - return (m_pModule) ? m_pModule->PutStatus(sLine) : false; -} - -bool CSocket::PutModule(const CString& sLine, const CString& sIdent, const CString& sHost) { - return (m_pModule) ? m_pModule->PutModule(sLine, sIdent, sHost) : false; -} -bool CSocket::PutModNotice(const CString& sLine, const CString& sIdent, const CString& sHost) { - return (m_pModule) ? m_pModule->PutModNotice(sLine, sIdent, sHost) : false; -} - -void CSocket::SetModule(CModule* p) { m_pModule = p; } CModule* CSocket::GetModule() const { return m_pModule; } /////////////////// !CSocket /////////////////// diff --git a/Socket.h b/Socket.h index 5b236e66..e5528096 100644 --- a/Socket.h +++ b/Socket.h @@ -127,15 +127,6 @@ public: bool Connect(const CString& sHostname, unsigned short uPort, bool bSSL = false, unsigned int uTimeout = 60); bool Listen(unsigned short uPort, bool bSSL = false, unsigned int uTimeout = 0); - virtual bool PutIRC(const CString& sLine); - virtual bool PutUser(const CString& sLine); - virtual bool PutStatus(const CString& sLine); - virtual bool PutModule(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.in"); - virtual bool PutModNotice(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.in"); - - // Setters - void SetModule(CModule* p); - // !Setters // Getters CModule* GetModule() const; diff --git a/WebModules.cpp b/WebModules.cpp index 7a9a0f48..9886b3d8 100644 --- a/WebModules.cpp +++ b/WebModules.cpp @@ -114,16 +114,14 @@ void CWebAuth::Invalidate() { m_pWebSock = NULL; } -CWebSock::CWebSock(CModule* pModule) : CHTTPSock(pModule) { - m_pModule = pModule; +CWebSock::CWebSock() : CHTTPSock(NULL) { m_bPathsSet = false; m_Template.AddTagHandler(new CZNCTagHandler(*this)); } -CWebSock::CWebSock(CModule* pModule, const CString& sHostname, unsigned short uPort, int iTimeout) - : CHTTPSock(pModule, sHostname, uPort, iTimeout) { - m_pModule = pModule; +CWebSock::CWebSock(const CString& sHostname, unsigned short uPort, int iTimeout) + : CHTTPSock(NULL, sHostname, uPort, iTimeout) { m_bPathsSet = false; m_Template.AddTagHandler(new CZNCTagHandler(*this)); @@ -134,6 +132,8 @@ CWebSock::~CWebSock() { m_spAuth->Invalidate(); } + // we have to account for traffic here because CSocket does + // not have a valid CModule* pointer. CUser *pUser = GetSession()->GetUser(); if (pUser) { pUser->AddBytesWritten(GetBytesWritten()); @@ -146,13 +146,6 @@ CWebSock::~CWebSock() { // bytes have been accounted for, so make sure they don't get again: ResetBytesWritten(); ResetBytesRead(); - - // If the module IsFake() then it was created as a dummy and needs to be deleted - if (m_pModule && m_pModule->IsFake()) { - m_pModule->UnlinkSocket(this); - delete m_pModule; - m_pModule = NULL; - } } void CWebSock::ParsePath() { @@ -216,9 +209,6 @@ CModule* CWebSock::ResolveModule() { if (!pModRet) { DEBUG("Module not found"); - } else if (pModRet->IsFake()) { - DEBUG("Fake module found, ignoring"); - pModRet = NULL; } return pModRet; @@ -747,9 +737,8 @@ bool CWebSock::OnLogin(const CString& sUser, const CString& sPass) { } Csock* CWebSock::GetSockObj(const CString& sHost, unsigned short uPort) { - CWebSock* pSock = new CWebSock(GetModule(), sHost, uPort); + CWebSock* pSock = new CWebSock(sHost, uPort, 120); pSock->SetSockName("Web::Client"); - pSock->SetTimeout(120); return pSock; } diff --git a/WebModules.h b/WebModules.h index 95eba663..7380fbfb 100644 --- a/WebModules.h +++ b/WebModules.h @@ -117,8 +117,8 @@ public: PAGE_DONE // all stuff has been done }; - CWebSock(CModule* pModule); - CWebSock(CModule* pModule, const CString& sHostname, unsigned short uPort, int iTimeout = 60); + CWebSock(); + CWebSock(const CString& sHostname, unsigned short uPort, int iTimeout = 60); virtual ~CWebSock(); virtual bool ForceLogin();