bool CClient::OnJoinMessage(CJoinMessage& Message) { CString sChans = Message.GetTarget(); CString sKeys = Message.GetKey(); VCString vsChans; sChans.Split(",", vsChans, false); sChans.clear(); VCString vsKeys; sKeys.Split(",", vsKeys, true); sKeys.clear(); for (unsigned int a = 0; a < vsChans.size(); a++) { Message.SetTarget(vsChans[a]); Message.SetKey((a < vsKeys.size()) ? vsKeys[a] : ""); if (m_pNetwork) { // May be nullptr. Message.SetChan(m_pNetwork->FindChan(vsChans[a])); } bool bContinue = false; NETWORKMODULECALL(OnUserJoinMessage(Message), m_pUser, m_pNetwork, this, &bContinue); if (bContinue) continue; CString sChannel = Message.GetTarget(); CString sKey = Message.GetKey(); if (m_pNetwork) { CChan* pChan = m_pNetwork->FindChan(sChannel); if (pChan) { if (pChan->IsDetached()) pChan->AttachUser(this); else pChan->JoinUser(sKey); continue; } else if (!sChannel.empty()) { pChan = new CChan(sChannel, m_pNetwork, false); if (m_pNetwork->AddChan(pChan)) { pChan->SetKey(sKey); } } } if (!sChannel.empty()) { sChans += (sChans.empty()) ? sChannel : CString("," + sChannel); if (!vsKeys.empty()) { sKeys += (sKeys.empty()) ? sKey : CString("," + sKey); } } } Message.SetTarget(sChans); Message.SetKey(sKeys); return sChans.empty(); }
void CLogMod::SetRulesCmd(const CString& sLine) { VCString vsRules = SplitRules(sLine.Token(1, true)); if (vsRules.empty()) { PutModule("Usage: SetRules <rules>"); PutModule("Wildcards are allowed"); } else { SetRules(vsRules); SetNV("rules", JoinRules(",")); ListRulesCmd(); } }
void CUrlBufferModule::CheckLineForTrigger(const CString& sMessage, const CString& sTarget) { if(GetNV("enablepublic").ToBool()) { VCString words; sMessage.Split(" ", words, false, "", "", true, true); for (size_t a = 0; a < words.size(); a++) { CString& word = words[a]; if(word.AsLower() == "!showlinks") { if(lastUrls.empty()) PutIRC("PRIVMSG " + sTarget + " :No links were found..."); else { unsigned int maxLinks = GetNV("buffersize").ToUInt(); if (a+1 < words.size()) { unsigned int size = words[a+1].ToUInt(); if(size!=0 && size<UINT_MAX) //if it was a valid number maxLinks = size; } unsigned int maxSize = lastUrls.size()-1; for(unsigned int i=0; i<=maxSize && i<maxLinks; i++) { sleep(1); PutIRC("PRIVMSG " + sTarget + " :" + nicks[maxSize-i] + ": "+ lastUrls[maxSize-i]); } } } } } }
void CHTTPSock::ReadLine(const CString& sData) { if (m_bGotHeader) { return; } CString sLine = sData; sLine.TrimRight("\r\n"); CString sName = sLine.Token(0); if (sName.Equals("GET")) { m_bPost = false; m_sURI = sLine.Token(1); m_bHTTP10Client = sLine.Token(2).Equals("HTTP/1.0"); ParseURI(); } else if (sName.Equals("POST")) { m_bPost = true; m_sURI = sLine.Token(1); ParseURI(); } else if (sName.Equals("Cookie:")) { VCString vsNV; sLine.Token(1, true).Split(";", vsNV, false, "", "", true, true); for (const CString& s : vsNV) { m_msRequestCookies[s.Token(0, false, "=").Escape_n(CString::EURL, CString::EASCII)] = s.Token(1, true, "=").Escape_n(CString::EURL, CString::EASCII); } } else if (sName.Equals("Authorization:")) { CString sUnhashed; sLine.Token(2).Base64Decode(sUnhashed); m_sUser = sUnhashed.Token(0, false, ":"); m_sPass = sUnhashed.Token(1, true, ":"); m_bBasicAuth = true; // Postpone authorization attempt until end of headers, because cookies should be read before that, otherwise session id will be overwritten in GetSession() } else if (sName.Equals("Content-Length:")) { m_uPostLen = sLine.Token(1).ToULong(); if (m_uPostLen > MAX_POST_SIZE) PrintErrorPage(413, "Request Entity Too Large", "The request you sent was too large."); } else if (sName.Equals("X-Forwarded-For:")) { // X-Forwarded-For: client, proxy1, proxy2 if (m_sForwardedIP.empty()) { const VCString& vsTrustedProxies = CZNC::Get().GetTrustedProxies(); CString sIP = GetRemoteIP(); VCString vsIPs; sLine.Token(1, true).Split(",", vsIPs, false, "", "", false, true); while (!vsIPs.empty()) { // sIP told us that it got connection from vsIPs.back() // check if sIP is trusted proxy bool bTrusted = false; for (const CString& sTrustedProxy : vsTrustedProxies) { if (sIP.WildCmp(sTrustedProxy)) { bTrusted = true; break; } } if (bTrusted) { // sIP is trusted proxy, so use vsIPs.back() as new sIP sIP = vsIPs.back(); vsIPs.pop_back(); } else { break; } } // either sIP is not trusted proxy, or it's in the beginning of the X-Forwarded-For list // in both cases use it as the endpoind m_sForwardedIP = sIP; } } else if (sName.Equals("If-None-Match:")) { // this is for proper client cache support (HTTP 304) on static files: m_sIfNoneMatch = sLine.Token(1, true); } else if (sName.Equals("Accept-Encoding:") && !m_bHTTP10Client) { SCString ssEncodings; // trimming whitespace from the tokens is important: sLine.Token(1, true).Split(",", ssEncodings, false, "", "", false, true); m_bAcceptGzip = (ssEncodings.find("gzip") != ssEncodings.end()); } else if (sLine.empty()) { if (m_bBasicAuth && !m_bLoggedIn) { m_bLoggedIn = OnLogin(m_sUser, m_sPass, true); // After successful login ReadLine("") will be called again to trigger "else" block // Failed login sends error and closes socket, so no infinite loop here } else { m_bGotHeader = true; if (m_bPost) { m_sPostData = GetInternalReadBuffer(); CheckPost(); } else { GetPage(); } DisableReadLine(); } } }
void CUrlBufferModule::OnModCommand(const CString& sCommand) { CString command = sCommand.Token(0).AsLower().Trim_n(); if (command == "help") { CTable CmdTable; CmdTable.AddColumn("Command"); CmdTable.AddColumn("Description"); CmdTable.AddRow(); CmdTable.SetCell("Command", "ENABLE"); CmdTable.SetCell("Description", "Activates link buffering."); CmdTable.AddRow(); CmdTable.SetCell("Command", "DISABLE"); CmdTable.SetCell("Description", "Deactivates link buffering."); CmdTable.AddRow(); CmdTable.SetCell("Command", "ENABLELOCAL"); CmdTable.SetCell("Description", "Enables downloading of each link to local directory."); CmdTable.AddRow(); CmdTable.SetCell("Command", "DISABLELOCAL"); CmdTable.SetCell("Description", "Disables downloading of each link to local directory."); CmdTable.AddRow(); CmdTable.SetCell("Command","ENABLEPUBLIC"); CmdTable.SetCell("Description", "Enables the usage of !showlinks publicly, by other users."); CmdTable.AddRow(); CmdTable.SetCell("Command","DISABLEPUBLIC"); CmdTable.SetCell("Description", "Disables the usage of !showlinks publicly, by other users."); CmdTable.AddRow(); CmdTable.SetCell("Command", "DIRECTORY <#directory>"); CmdTable.SetCell("Description", "Sets the local directory where the links will be saved."); CmdTable.AddRow(); CmdTable.SetCell("Command", "CLEARBUFFER"); CmdTable.SetCell("Description", "Empties the link buffer."); CmdTable.AddRow(); CmdTable.SetCell("Command", "BUFFERSIZE <#size>"); CmdTable.SetCell("Description", "Sets the size of the link buffer. Only integers >=0."); CmdTable.AddRow(); CmdTable.SetCell("Command", "SHOWSETTINGS"); CmdTable.SetCell("Description", "Prints all the settings."); CmdTable.AddRow(); CmdTable.SetCell("Command", "BUFFERALLLINKS"); CmdTable.SetCell("Description", "Toggles the buffering of all links or only image links."); CmdTable.AddRow(); CmdTable.SetCell("Command", "REUPLOAD"); CmdTable.SetCell("Description", "Toggles the reuploading of image links to imgur."); CmdTable.AddRow(); CmdTable.SetCell("Command", "SHOWLINKS <#number>"); CmdTable.SetCell("Description", "Prints <#number> or <#buffersize> number of cached links."); CmdTable.AddRow(); CmdTable.SetCell("Command", "HELP"); CmdTable.SetCell("Description", "This help."); PutModule(CmdTable); return; } else if (command == "enable") { SetNV("enable","true",true); PutModule("Enabled buffering"); } else if (command == "disable") { SetNV("enable","false",true); PutModule("Disabled buffering"); } else if (command == "enablelocal") { if(GetNV("directory") == "") { PutModule("Directory is not set. First set a directory and then enable local caching"); return; } SetNV("enablelocal","true",true); PutModule("Enabled local caching"); } else if (command == "disablelocal") { SetNV("enablelocal", "false", true); PutModule("Disabled local caching"); } else if (command == "enablepublic") { SetNV("enablepublic", "true", true); PutModule("Enabled public usage of showlinks."); } else if (command == "disablepublic") { SetNV("enablepublic", "false", true); PutModule("Disabled public usage of showlinks."); } else if (command == "directory") { CString dir=sCommand.Token(1).Replace_n("//", "/").TrimRight_n("/") + "/"; if (!isValidDir(dir)) { PutModule("Error in directory name. Avoid using: | ; ! @ # ( ) < > \" ' ` ~ = & ^ <space> <tab>"); return; } // Check if file exists and is directory if (dir.empty() || !CFile::Exists(dir) || !CFile::IsDir(dir, false)) { PutModule("Invalid path or no write access to ["+ sCommand.Token(1) +"]."); return; } SetNV("directory", dir, true); PutModule("Directory for local caching set to " + GetNV("directory")); } else if (command == "clearbuffer") { lastUrls.clear(); nicks.clear(); } else if (command == "buffersize") { unsigned int bufSize = sCommand.Token(1).ToUInt(); if(bufSize==0 || bufSize==UINT_MAX) { PutModule("Error in buffer size. Use only integers >= 0."); return; } SetNV("buffersize", CString(bufSize), true); PutModule("Buffer size set to " + GetNV("buffersize")); } else if (command == "showsettings") { for(MCString::iterator it = BeginNV(); it != EndNV(); it++) { PutModule(it->first.AsUpper() + " : " + it->second); } } else if(command == "bufferalllinks"){ SetNV("bufferalllinks", CString(!GetNV("bufferalllinks").ToBool()), true); PutModule( CString(GetNV("bufferalllinks").ToBool()?"Enabled":"Disabled") + " buffering of all links."); } else if(command == "reupload"){ SetNV("reupload", CString(!GetNV("reupload").ToBool()), true); PutModule( CString(GetNV("reupload").ToBool()?"Enabled":"Disabled") + " reuploading of images."); } else if (command == "showlinks") { if(lastUrls.empty()) PutModule("No links were found..."); else { unsigned int maxLinks = GetNV("buffersize").ToUInt(); unsigned int size = sCommand.Token(1).ToUInt(); if(size!=0 && size<UINT_MAX) //if it was a valid number maxLinks = size; unsigned int maxSize = lastUrls.size()-1; for(unsigned int i=0; i<=maxSize && i< maxLinks; i++) { PutModule(nicks[maxSize-i] + ": " + lastUrls[maxSize-i]); } } } else { PutModule("Unknown command! Try HELP."); } }