CString CUser::GetLocalIP() { CIRCSock* pIRCSock = GetIRCSock(); if (pIRCSock) { return pIRCSock->GetLocalIP(); } if (!m_vClients.empty()) { return m_vClients[0]->GetLocalIP(); } return ""; }
CString CUser::GetLocalDCCIP() const { if (!GetDCCBindHost().empty()) return GetDCCBindHost(); for (CIRCNetwork* pNetwork : m_vIRCNetworks) { CIRCSock* pIRCSock = pNetwork->GetIRCSock(); if (pIRCSock) { return pIRCSock->GetLocalIP(); } } if (!GetAllClients().empty()) { return GetAllClients()[0]->GetLocalIP(); } return ""; }
CString CUser::GetLocalDCCIP() { if (!GetDCCBindHost().empty()) return GetDCCBindHost(); for (vector<CIRCNetwork*>::iterator it = m_vIRCNetworks.begin(); it != m_vIRCNetworks.end(); ++it) { CIRCNetwork *pNetwork = *it; CIRCSock* pIRCSock = pNetwork->GetIRCSock(); if (pIRCSock) { return pIRCSock->GetLocalIP(); } } if (!GetAllClients().empty()) { return GetAllClients()[0]->GetLocalIP(); } return ""; }
CString CIdentServer::GetResponse(const CString& sLine, const CString& sSocketIP, const CString& sRemoteIP) { unsigned short uLocalPort = 0; // local port that ZNC connected to IRC FROM unsigned short uRemotePort = 0; // remote server port that ZNC connected TO, e.g. 6667 CString sResponseType = "ERROR"; CString sAddInfo = "INVALID-PORT"; DEBUG("IDENT request: " << sLine << " from " << sRemoteIP << " on " << sSocketIP); if(sscanf(sLine.c_str(), "%hu , %hu", &uLocalPort, &uRemotePort) == 2) { sAddInfo = "NO-USER"; for(auto itu = CZNC::Get().GetUserMap().begin(); itu != CZNC::Get().GetUserMap().end(); ++itu) { CUser* pUser = itu->second; bool bFound = false; for(CIRCNetwork* pNetwork : pUser->GetNetworks()) { CIRCSock *pSock = pNetwork->GetIRCSock(); if(!pSock) continue; DEBUG("Checking user (" << pSock->GetLocalPort() << ", " << pSock->GetRemotePort() << ", " << pSock->GetLocalIP() << ")"); if(pSock->GetLocalPort() == uLocalPort && pSock->GetRemotePort() == uRemotePort && AreIPStringsEqual(pSock->GetLocalIP(), sSocketIP)) { sResponseType = "USERID"; sAddInfo = "UNIX : " + pUser->GetIdent(); // exact match found, leave the loop: bFound = true; break; } DEBUG("Checking user fallback (" << pSock->GetRemoteIP() << ", " << pSock->GetRemotePort() << ", " << pSock->GetLocalIP() << ")"); if(pSock->GetRemoteIP() == sRemoteIP && pSock->GetRemotePort() == uRemotePort && AreIPStringsEqual(pSock->GetLocalIP(), sSocketIP)) { sResponseType = "USERID"; sAddInfo = "UNIX : " + pUser->GetIdent(); // keep looping, we may find something better } } if(bFound) break; } } CString sReply = CString(uLocalPort) + ", " + CString(uRemotePort) + " : " + sResponseType + " : " + sAddInfo; DEBUG("IDENT response: " << sReply); CIdentServerMod *pMod = reinterpret_cast<CIdentServerMod*>(m_pModule); if(pMod) { pMod->SetLastRequest(sLine.Replace_n("\r", "").Replace_n("\n", " ") + "from " + sRemoteIP + " on " + sSocketIP); pMod->SetLastReply(sReply); } return sReply; }