#include "inspircd.h"
#include "main.h"
#include "treesocket.h"
+#include "treeserver.h"
static std::string newline("\n");
{
if (line[0] != ':')
{
- ServerInstance->Logs->Log("m_spanningtree", LOG_DEFAULT, "Sending line without server prefix!");
+ ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Sending line without server prefix!");
line = ":" + ServerInstance->Config->GetSID() + " " + line;
}
if (proto_version != ProtocolVersion)
line.erase(c, d-c);
}
}
+ else if (command == "FTOPIC")
+ {
+ // Drop channel TS for FTOPIC
+ // :sid FTOPIC #target TS TopicTS ...
+ // A B C D
+ if (b == std::string::npos)
+ return;
+
+ std::string::size_type c = line.find(' ', b + 1);
+ if (c == std::string::npos)
+ return;
+
+ std::string::size_type d = line.find(' ', c + 1);
+ if (d == std::string::npos)
+ return;
+
+ line.erase(c, d-c);
+ }
+ else if ((command == "PING") || (command == "PONG"))
+ {
+ // :22D PING 20D
+ if (line.length() < 13)
+ return;
+
+ // Insert the source SID (and a space) between the command and the first parameter
+ line.insert(10, line.substr(1, 4));
+ }
+ else if (command == "OPERTYPE")
+ {
+ std::string::size_type colon = line.find(':', b);
+ if (colon != std::string::npos)
+ {
+ for (std::string::iterator i = line.begin()+colon; i != line.end(); ++i)
+ {
+ if (*i == ' ')
+ *i = '_';
+ }
+ line.erase(colon, 1);
+ }
+ }
}
}
}
- ServerInstance->Logs->Log("m_spanningtree", LOG_RAWIO, "S[%d] O %s", this->GetFd(), line.c_str());
+ ServerInstance->Logs->Log(MODNAME, LOG_RAWIO, "S[%d] O %s", this->GetFd(), line.c_str());
this->WriteData(line);
this->WriteData(newline);
}
bool TreeSocket::PreProcessOldProtocolMessage(User*& who, std::string& cmd, std::vector<std::string>& params)
{
- if ((cmd == "METADATA") && (params.size() >= 3))
+ if ((cmd == "METADATA") && (params.size() >= 3) && (params[0][0] == '#'))
{
// :20D METADATA #channel extname :extdata
return InsertCurrentChannelTS(params);
}
+ else if ((cmd == "FTOPIC") && (params.size() >= 4))
+ {
+ // :20D FTOPIC #channel 100 Attila :topic text
+ return InsertCurrentChannelTS(params);
+ }
+ else if ((cmd == "PING") || (cmd == "PONG"))
+ {
+ if (params.size() == 1)
+ {
+ // If it's a PING with 1 parameter, reply with a PONG now, if it's a PONG with 1 parameter (weird), do nothing
+ if (cmd[1] == 'I')
+ this->WriteData(":" + ServerInstance->Config->GetSID() + " PONG " + params[0] + newline);
+
+ // Don't process this message further
+ return false;
+ }
+
+ // :20D PING 20D 22D
+ // :20D PONG 20D 22D
+ // Drop the first parameter
+ params.erase(params.begin());
+
+ // If the target is a server name, translate it to a SID
+ if (!InspIRCd::IsSID(params[0]))
+ {
+ TreeServer* server = Utils->FindServer(params[0]);
+ if (!server)
+ {
+ // We've no idea what this is, log and stop processing
+ ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Received a " + cmd + " with an unknown target: \"" + params[0] + "\", command dropped");
+ return false;
+ }
+
+ params[0] = server->GetID();
+ }
+ }
+ else if ((cmd == "GLINE") || (cmd == "KLINE") || (cmd == "ELINE") || (cmd == "ZLINE") || (cmd == "QLINE"))
+ {
+ // Fix undocumented protocol usage: translate GLINE, ZLINE, etc. into ADDLINE or DELLINE
+ if ((params.size() != 1) && (params.size() != 3))
+ return false;
+
+ parameterlist p;
+ p.push_back(cmd.substr(0, 1));
+ p.push_back(params[0]);
+
+ if (params.size() == 3)
+ {
+ cmd = "ADDLINE";
+ p.push_back(who->nick);
+ p.push_back(ConvToStr(ServerInstance->Time()));
+ p.push_back(ConvToStr(InspIRCd::Duration(params[1])));
+ p.push_back(params[2]);
+ }
+ else
+ cmd = "DELLINE";
+
+ params.swap(p);
+ }
+ else if (cmd == "SVSMODE")
+ {
+ cmd = "MODE";
+ }
return true; // Passthru
}