virtual void OnModCommand(const CString& sLine) { CString sCommand = sLine.Token(0); CString sArg = sLine.Token(1, true); if (sCommand.Equals("LIST")) { bool bShowHosts = true; if (sArg.Equals("-n")) { bShowHosts = false; } ShowSocks(bShowHosts); } else { PutModule("Use 'list' to view a list of active sockets"); PutModule("Use 'list -n' if you want IP addresses to be displayed"); } }
virtual EModRet OnPrivNotice(CNick& Nick, CString& sMessage) { if (!sMessage.Token(0).Equals("!ZNCAO")) { return CONTINUE; } CString sCommand = sMessage.Token(1); if (sCommand.Equals("CHALLENGE")) { ChallengeRespond(Nick, sMessage.Token(2)); } else if (sCommand.Equals("RESPONSE")) { VerifyResponse(Nick, sMessage.Token(2)); } return HALTCORE; }
virtual bool OnLoad(const CString & sArgs, CString & sMessage) { CString sTarget = GetNV("target"); if (sTarget.Equals("syslog")) m_eLogMode = LOG_TO_SYSLOG; else if (sTarget.Equals("both")) m_eLogMode = LOG_TO_BOTH; else if (sTarget.Equals("file")) m_eLogMode = LOG_TO_FILE; else m_eLogMode = LOG_TO_FILE; m_sLogFile = GetSavePath() + "/znc.log"; Log("Logging started. ZNC PID[" + CString(getpid()) + "] UID/GID[" + CString(getuid()) + ":" + CString(getgid()) + "]"); return true; }
void CIMAPSock::ReadLine(const CString& sLine) { if (!m_bSentLogin) { CString sUsername = m_spAuth->GetUsername(); m_bSentLogin = true; const CString& sFormat = m_pIMAPMod->GetUserFormat(); if (!sFormat.empty()) { if (sFormat.find('%') != CString::npos) { sUsername = sFormat.Replace_n("%", sUsername); } else { sUsername += sFormat; } } Write("AUTH LOGIN " + sUsername + " " + m_spAuth->GetPassword() + "\r\n"); } else if (sLine.Left(5) == "AUTH ") { CUser* pUser = CZNC::Get().FindUser(m_spAuth->GetUsername()); if (pUser && sLine.Equals("AUTH OK", false, 7)) { m_spAuth->AcceptLogin(*pUser); m_pIMAPMod->CacheLogin(CString(m_spAuth->GetUsername() + ":" + m_spAuth->GetPassword()).MD5()); // Use MD5 so passes don't sit in memory in plain text DEBUG("+++ Successful IMAP lookup"); } else { m_spAuth->RefuseLogin("Invalid Password"); DEBUG("--- FAILED IMAP lookup"); } m_bSentReply = true; Close(); } }
virtual EModRet OnPrivCTCP(CNick& Nick, CString& sMessage) { if (sMessage.Equals("DCC SCHAT ", false, 10)) { // chat ip port unsigned long iIP = sMessage.Token(3).ToULong(); unsigned short iPort = sMessage.Token(4).ToUShort(); if (iIP > 0 && iPort > 0) { pair<u_long, u_short> pTmp; CString sMask; pTmp.first = iIP; pTmp.second = iPort; sMask = "(s)" + Nick.GetNick() + "!" + "(s)" + Nick.GetNick() + "@" + CUtils::GetIP(iIP); m_siiWaitingChats["(s)" + Nick.GetNick()] = pTmp; SendToUser(sMask, "*** Incoming DCC SCHAT, Accept ? (yes/no)"); CRemMarkerJob *p = new CRemMarkerJob(this, 60, 1, "Remove (s)" + Nick.GetNick(), "Removes this nicks entry for waiting DCC."); p->SetNick("(s)" + Nick.GetNick()); AddTimer(p); return(HALT); } } return(CONTINUE); }
virtual EModRet OnUserMsg(CString& sTarget, CString& sMessage) { if (sTarget.Left(3) == "(s)") { CString sSockName = GetModName().AsUpper() + "::" + sTarget; CSChatSock *p = (CSChatSock *)FindSocket(sSockName); if (!p) { map< CString,pair< u_long,u_short > >::iterator it; it = m_siiWaitingChats.find(sTarget); if (it != m_siiWaitingChats.end()) { if (!sMessage.Equals("yes")) SendToUser(sTarget + "!" + sTarget + "@" + CUtils::GetIP(it->second.first), "Refusing to accept DCC SCHAT!"); else AcceptSDCC(sTarget, it->second.first, it->second.second); m_siiWaitingChats.erase(it); return(HALT); } PutModule("No such SCHAT to [" + sTarget + "]"); } else p->Write(sMessage + "\n"); return(HALT); } return(CONTINUE); }
CChan::CChan(const CString& sName, CIRCNetwork* pNetwork, bool bInConfig, CConfig *pConfig) { m_sName = sName.Token(0); m_sKey = sName.Token(1); m_pNetwork = pNetwork; if (!m_pNetwork->IsChan(m_sName)) { m_sName = "#" + m_sName; } m_bInConfig = bInConfig; m_Nick.SetNetwork(m_pNetwork); m_bDetached = false; m_uBufferCount = m_pNetwork->GetUser()->GetBufferCount(); m_bKeepBuffer = m_pNetwork->GetUser()->KeepBuffer(); m_bDisabled = false; Reset(); if (pConfig) { CString sValue; if (pConfig->FindStringEntry("buffer", sValue)) SetBufferCount(sValue.ToUInt(), true); if (pConfig->FindStringEntry("keepbuffer", sValue)) SetKeepBuffer(sValue.ToBool()); if (pConfig->FindStringEntry("detached", sValue)) SetDetached(sValue.ToBool()); if (pConfig->FindStringEntry("autocycle", sValue)) if (sValue.Equals("true")) CUtils::PrintError("WARNING: AutoCycle has been removed, instead try -> LoadModule = autocycle " + sName); if (pConfig->FindStringEntry("key", sValue)) SetKey(sValue); if (pConfig->FindStringEntry("modes", sValue)) SetDefaultModes(sValue); } }
bool OnLoad(const CString & sArgs, CString & sMessage) override { CString sTarget = GetNV("target"); if (sTarget.Equals("syslog")) m_eLogMode = LOG_TO_SYSLOG; else if (sTarget.Equals("both")) m_eLogMode = LOG_TO_BOTH; else if (sTarget.Equals("file")) m_eLogMode = LOG_TO_FILE; else m_eLogMode = LOG_TO_FILE; SetLogFilePath(GetNV("path")); Log("Logging started. ZNC PID[" + CString(getpid()) + "] UID/GID[" + CString(getuid()) + ":" + CString(getgid()) + "]"); return true; }
virtual EModRet OnRaw(CString& sLine) { // We do the same as ZNC would without the OnRaw hook, // except we do not forward 305's or 306's to clients CString sCmd = sLine.Token(1); if (sCmd.Equals("305")) { m_pNetwork->SetIRCAway(false); return HALTCORE; } else if (sCmd.Equals("306")) { m_pNetwork->SetIRCAway(true); return HALTCORE; } return CONTINUE; }
virtual EModRet OnUserRaw(CString& sLine) { // We dont care if we are not connected to IRC if (!m_pNetwork->IsIRCConnected()) return CONTINUE; // We are trying to get the config nick and this is a /nick? if (!m_pTimer || !sLine.Token(0).Equals("NICK")) return CONTINUE; // Is the nick change for the nick we are trying to get? CString sNick = sLine.Token(1); // Don't even think of using spaces in your nick! if (sNick.Left(1) == ":") sNick.LeftChomp(); if (!sNick.Equals(GetNick())) return CONTINUE; // Indeed trying to change to this nick, generate a 433 for it. // This way we can *always* block incoming 433s from the server. PutUser(":" + m_pNetwork->GetIRCServer() + " 433 " + m_pNetwork->GetIRCNick().GetNick() + " " + sNick + " :ZNC is already trying to get this nickname"); return CONTINUE; }
virtual EModRet OnUserRaw(CString& sLine) { CAlias current_alias; try { if (sLine.Equals("ZNC-CLEAR-ALL-ALIASES!")) { ListCommand(""); PutModule("Clearing all of them!"); ClearNV(); return HALT; } else if (CAlias::AliasGet(current_alias, this, sLine)) { VCString rawLines; current_alias.Imprint(sLine).Split("\n", rawLines, false); for (size_t i = 0; i < rawLines.size(); ++i) PutIRC(rawLines[i]); return HALT; } } catch (std::exception &e) { CString my_nick = (GetNetwork() == NULL ? "" : GetNetwork()->GetCurNick()); if (my_nick.empty()) my_nick = "*"; PutUser(CString(":znc.in 461 " + my_nick + " " + current_alias.GetName() + " :ZNC alias error: ") + e.what()); return HALTCORE; } return CONTINUE; }
bool CClient::OnOtherMessage(CMessage& Message) { const CString& sCommand = Message.GetCommand(); if (sCommand.Equals("ZNC")) { CString sTarget = Message.GetParam(0); CString sModCommand; if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { sModCommand = Message.GetParams(1); } else { sTarget = "status"; sModCommand = Message.GetParams(0); } if (sTarget.Equals("status")) { if (sModCommand.empty()) PutStatus("Hello. How may I help you?"); else UserCommand(sModCommand); } else { if (sModCommand.empty()) CALLMOD(sTarget, this, m_pUser, m_pNetwork, PutModule("Hello. How may I help you?")) else CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModCommand(sModCommand)) } return true; } else if (sCommand.Equals("ATTACH")) {
void OnModCommand(const CString& sCmdLine) override { CString sCommand = sCmdLine.Token(0); CString sArgs = sCmdLine.Token(1, true); if (sCommand.Equals("dumpbuff")) { // for testing purposes - hidden from help CString sFile; CString sName; if (DecryptBuffer(GetPath(sArgs), sFile, sName)) { VCString vsLines; VCString::iterator it; sFile.Split("\n", vsLines); for (it = vsLines.begin(); it != vsLines.end(); ++it) { CString sLine(*it); sLine.Trim(); PutModule("[" + sLine + "]"); } } PutModule("//!-- EOF " + sArgs); } else { HandleCommand(sCmdLine); } }
bool IsCtcpNotifier(const CString& sCtcp) { // Return true if we want all ctcps notified to us, or if "ctcp_"+sCtcp exists. // CTCP ACTIONs are the only CTCP query we choose to ignore all the time. if (sCtcp.Equals("ACTION")) return false; return !GetNV("ctcp_showall").empty() || !GetNV("ctcp_" + sCtcp.AsUpper()).empty(); }
virtual EModRet OnStatusCommand(CString& sCommand) { if (sCommand.Equals("SAMPLE")) { PutModule("Hi, I'm your friendly sample module."); return HALT; } return CONTINUE; }
bool CFile::IsDir(const CString& sLongName, bool bUseLstat) { if (sLongName.Equals("/")) return CFile::FType(sLongName, FT_DIRECTORY, bUseLstat); // Some OS don't like trailing slashes for directories return CFile::FType(sLongName.TrimRight_n("/"), FT_DIRECTORY, bUseLstat); }
virtual EModRet OnInvite(const CNick& Nick, const CString& sChan) { if (sChan.Equals("#test")) { PutModule(Nick.GetNick() + " invited us to " + sChan + ", ignoring invites to " + sChan); return HALT; } PutModule(Nick.GetNick() + " invited us to " + sChan); return CONTINUE; }
void OnListCommand(const CString& sLine) { CString sArg = sLine.Token(1, true); bool bShowHosts = true; if (sArg.Equals("-n")) { bShowHosts = false; } ShowSocks(bShowHosts); }
bool SupportsMechanism(const CString& sMechanism) const { for (const auto& it : SupportedMechanisms) { if (sMechanism.Equals(it.szName)) { return true; } } return false; }
bool CZNCTagHandler::HandleTag(CTemplate& Tmpl, const CString& sName, const CString& sArgs, CString& sOutput) { if (sName.Equals("URLPARAM")) { //sOutput = CZNC::Get() sOutput = m_WebSock.GetParam(sArgs.Token(0), false); return true; } return false; }
bool SupportsMechanism(const CString& sMechanism) const { for (size_t i = 0; SupportedMechanisms[i].szName != NULL; i++) { if (sMechanism.Equals(SupportedMechanisms[i].szName)) { return true; } } return false; }
void OnModCommand(const CString& sCommand) { CString sCmd = sCommand.Token(0); if (!m_pUser->IsAdmin()) { PutModule("Access denied"); return; } if (sCmd.Equals("list")) { CTable Table; MCString::iterator it; Table.AddColumn("Blocked user"); for (it = BeginNV(); it != EndNV(); ++it) { Table.AddRow(); Table.SetCell("Blocked user", it->first); } if (PutModule(Table) == 0) PutModule("No users blocked"); } else if (sCmd.Equals("block")) { CString sUser = sCommand.Token(1, true); if (m_pUser->GetUserName().Equals(sUser)) { PutModule("You can't block yourself"); return; } if (Block(sUser)) PutModule("Blocked [" + sUser + "]"); else PutModule("Could not block [" + sUser + "] (misspelled?)"); } else if (sCmd.Equals("unblock")) { CString sUser = sCommand.Token(1, true); if (DelNV(sUser)) PutModule("Unblocked [" + sUser + "]"); else PutModule("This user is not blocked"); } else { PutModule("Commands: list, block [user], unblock [user]"); } }
virtual EModRet OnUserRaw(CString& sLine) { CString sCmd = sLine.Token(0).AsUpper(); if (!m_pNetwork->GetIRCSock()) return CONTINUE; if (sCmd.Equals("MODE")) { // Check if this is a mode request that needs to be handled // If there are arguments to a mode change, // we must not route it. if (!sLine.Token(3, true).empty()) return CONTINUE; // Grab the mode change parameter CString sMode = sLine.Token(2); // If this is a channel mode request, znc core replies to it if (sMode.empty()) return CONTINUE; // Check if this is a mode change or a specific // mode request (the later needs to be routed). sMode.TrimPrefix("+"); if (sMode.length() != 1) return CONTINUE; // Now just check if it's one of the supported modes switch (sMode[0]) { case 'I': case 'b': case 'e': break; default: return CONTINUE; } // Ok, this looks like we should route it. // Fall through to the next loop } for (size_t i = 0; vRouteReplies[i].szRequest != NULL; i++) { if (vRouteReplies[i].szRequest == sCmd) { struct queued_req req = { sLine, vRouteReplies[i].vReplies }; m_vsPending[m_pClient].push_back(req); SendRequest(); return HALTCORE; } } return CONTINUE; }
void SetCommandCommand(const CString& sLine) { CString sCmd = sLine.Token(1); CString sNewCmd = sLine.Token(2, true); if (sCmd.Equals("IDENTIFY")) { SetNV("IdentifyCmd", sNewCmd); } else if (sCmd.Equals("GHOST")) { SetNV("GhostCmd", sNewCmd); } else if (sCmd.Equals("RECOVER")) { SetNV("RecoverCmd", sNewCmd); } else if (sCmd.Equals("RELEASE")) { SetNV("ReleaseCmd", sNewCmd); } else if (sCmd.Equals("GROUP")) { SetNV("GroupCmd", sNewCmd); } else { PutModule("No such editable command. See ViewCommands for list."); return; } PutModule("Ok"); }
EModRet OnUserNotice(CString& sTarget, CString& sMessage) { if(m_pClient && sTarget.Equals(m_pUser->GetIRCNick().GetNick()) && sMessage.Token(0).Equals("LAGCHK")) { m_waiting.AddItem(sMessage, m_pClient); } return CONTINUE; }
TEST(StringTest, Cmp) { CString s = "Bbb"; EXPECT_EQ(CString("Bbb"), s); EXPECT_LT(CString("Aaa"), s); EXPECT_GT(CString("Ccc"), s); EXPECT_EQ(0, s.StrCmp("Bbb")); EXPECT_GT(0, s.StrCmp("bbb")); EXPECT_LT(0, s.StrCmp("Aaa")); EXPECT_GT(0, s.StrCmp("Ccc")); EXPECT_EQ(0, s.CaseCmp("Bbb")); EXPECT_EQ(0, s.CaseCmp("bbb")); EXPECT_LT(0, s.CaseCmp("Aaa")); EXPECT_GT(0, s.CaseCmp("Ccc")); EXPECT_TRUE(s.Equals("bbb")); EXPECT_FALSE(s.Equals("bbb", true)); EXPECT_FALSE(s.Equals("bb")); }
void CIRCSock::SendAltNick(const CString& sBadNick) { const CString& sLastNick = m_Nick.GetNick(); // We don't know the maximum allowed nick length yet, but we know which // nick we sent last. If sBadNick is shorter than that, we assume the // server truncated our nick. if (sBadNick.length() < sLastNick.length()) m_uMaxNickLen = (unsigned int)sBadNick.length(); unsigned int uMax = m_uMaxNickLen; const CString& sConfNick = m_pNetwork->GetNick(); const CString& sAltNick = m_pNetwork->GetAltNick(); CString sNewNick = sConfNick.Left(uMax - 1); if (sLastNick.Equals(sConfNick)) { if ((!sAltNick.empty()) && (!sConfNick.Equals(sAltNick))) { sNewNick = sAltNick; } else { sNewNick += "-"; } } else if (sLastNick.Equals(sAltNick) && !sAltNick.Equals(sNewNick + "-")) { sNewNick += "-"; } else if (sLastNick.Equals(sNewNick + "-") && !sAltNick.Equals(sNewNick + "|")) { sNewNick += "|"; } else if (sLastNick.Equals(sNewNick + "|") && !sAltNick.Equals(sNewNick + "^")) { sNewNick += "^"; } else if (sLastNick.Equals(sNewNick + "^") && !sAltNick.Equals(sNewNick + "a")) { sNewNick += "a"; } else { char cLetter = 0; if (sBadNick.empty()) { m_pNetwork->PutUser("No free nick available"); Quit(); return; } cLetter = sBadNick.back(); if (cLetter == 'z') { m_pNetwork->PutUser("No free nick found"); Quit(); return; } sNewNick = sConfNick.Left(uMax - 1) + ++cLetter; if (sNewNick.Equals(sAltNick)) sNewNick = sConfNick.Left(uMax - 1) + ++cLetter; } PutIRC("NICK " + sNewNick); m_Nick.SetNick(sNewNick); }
bool CIRCNetwork::DelQuery(const CString& sName) { for (vector<CQuery*>::iterator a = m_vQueries.begin(); a != m_vQueries.end(); ++a) { if (sName.Equals((*a)->GetName())) { delete *a; m_vQueries.erase(a); return true; } } return false; }
bool CUser::DelChan(const CString& sName) { for (vector<CChan*>::iterator a = m_vChans.begin(); a != m_vChans.end(); ++a) { if (sName.Equals((*a)->GetName())) { delete *a; m_vChans.erase(a); return true; } } return false; }
void Authenticate(const CString& sLine) { if (m_Mechanisms.GetCurrent().Equals("PLAIN") && sLine.Equals("+")) { CString sAuthLine = GetNV("username") + '\0' + GetNV("username") + '\0' + GetNV("password"); sAuthLine.Base64Encode(); PutIRC("AUTHENTICATE " + sAuthLine); } else { /* Send blank authenticate for other mechanisms (like EXTERNAL). */ PutIRC("AUTHENTICATE +"); } }