X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fmodules%2Fm_spanningtree%2Ftreesocket2.cpp;h=5a6a9f301e731d67867dfcfc53b90209c8f2e4fd;hb=d185decae97752368d5cf62311cbc0d1a52aa22c;hp=056df2cc513df2f35cc443d85ced2b1ddb0ae502;hpb=0a162813268d16304eb5e3245abdc105433d56bd;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/treesocket2.cpp b/src/modules/m_spanningtree/treesocket2.cpp index 056df2cc5..5a6a9f301 100644 --- a/src/modules/m_spanningtree/treesocket2.cpp +++ b/src/modules/m_spanningtree/treesocket2.cpp @@ -74,22 +74,22 @@ bool TreeSocket::ProcessLine(std::string &line) Instance->Logs->Log("m_spanningtree",DEBUG, "S[%d] I %s", this->GetFd(), line.c_str()); this->Split(line.c_str(),params); - + if (params.empty()) return true; - + if ((params[0][0] == ':') && (params.size() > 1)) { prefix = params[0].substr(1); params.pop_front(); - + if (prefix.empty()) { this->SendError("BUG (?) Empty prefix recieved."); return false; } } - + command = params[0].c_str(); params.pop_front(); @@ -313,8 +313,8 @@ bool TreeSocket::ProcessLine(std::string &line) /* * Now, check for (and parse) commands as appropriate. -- w - */ - + */ + /* Find the server that this command originated from, used in the handlers below */ TreeServer *ServerSource = Utils->FindServer(prefix); @@ -361,6 +361,15 @@ bool TreeSocket::ProcessLine(std::string &line) { return this->Admin(prefix, params); } + else if (command == "MAP") + { + User* user = Instance->FindNick(prefix); + if (user) + { + std::vector p(params.begin(), params.end()); + return Utils->Creator->HandleMap(p, user); + } + } else if (command == "SERVER") { return this->RemoteServer(prefix,params); @@ -381,10 +390,6 @@ bool TreeSocket::ProcessLine(std::string &line) { return this->ForceTopic(prefix,params); } - else if (command == "REHASH") - { - return this->RemoteRehash(prefix,params); - } else if (command == "METADATA") { return this->MetaData(prefix,params); @@ -441,11 +446,12 @@ bool TreeSocket::ProcessLine(std::string &line) { if (params.size() == 3) { + TreeServer* pf = Utils->FindServer(prefix); User* user = this->Instance->FindNick(params[1]); Channel* chan = this->Instance->FindChan(params[0]); - if (user && chan) + if (pf && user && chan) { - if (!chan->ServerKickUser(user, params[2].c_str(), false)) + if (!chan->ServerKickUser(user, params[2].c_str(), false, pf->GetName().c_str())) /* Yikes, the channels gone! */ delete chan; } @@ -469,17 +475,12 @@ bool TreeSocket::ProcessLine(std::string &line) } return true; } - else if (command == "OPERNOTICE") - { - if (params.size() >= 1) - Instance->SNO->WriteToSnoMask('A', "From " + prefix + ": " + params[0]); - return Utils->DoOneToAllButSenderRaw(line, sourceserv, prefix, command, params); - } else if (command == "MODENOTICE") { if (params.size() >= 2) { - Instance->Users->WriteMode(params[0].c_str(), WM_AND, "*** From %s: %s", prefix.c_str(), params[1].c_str()); + if (ServerSource) + Instance->Users->WriteMode(params[0].c_str(), WM_AND, "*** From %s: %s", (ServerSource ? ServerSource->GetName().c_str() : prefix.c_str()), params[1].c_str()); } return Utils->DoOneToAllButSenderRaw(line, sourceserv, prefix, command, params); } @@ -487,19 +488,20 @@ bool TreeSocket::ProcessLine(std::string &line) { if (params.size() >= 2) { - Instance->SNO->WriteToSnoMask(*(params[0].c_str()), "From " + prefix + ": "+ params[1]); + Instance->SNO->WriteToSnoMask(*(params[0].c_str()), "From " + (ServerSource ? ServerSource->GetName().c_str() : prefix) + ": "+ params[1]); + return Utils->DoOneToAllButSenderRaw(line, sourceserv, prefix, command, params); } - return Utils->DoOneToAllButSenderRaw(line, sourceserv, prefix, command, params); + } else if (command == "BURST") { // Set prefix server as bursting if (!ServerSource) { - this->Instance->SNO->WriteToSnoMask('l', "WTF: Got BURST from a nonexistant server(?): %s", prefix.c_str()); + this->Instance->SNO->WriteToSnoMask('l', "WTF: Got BURST from a nonexistant server(?): %s", (ServerSource ? ServerSource->GetName().c_str() : prefix.c_str())); return false; } - + ServerSource->bursting = true; return Utils->DoOneToAllButSenderRaw(line, sourceserv, prefix, command, params); } @@ -507,38 +509,35 @@ bool TreeSocket::ProcessLine(std::string &line) { if (!ServerSource) { - this->Instance->SNO->WriteToSnoMask('l', "WTF: Got ENDBURST from a nonexistant server(?): %s", prefix.c_str()); + this->Instance->SNO->WriteToSnoMask('l', "WTF: Got ENDBURST from a nonexistant server(?): %s", (ServerSource ? ServerSource->GetName().c_str() : prefix.c_str())); return false; } - + ServerSource->FinishBurst(); return Utils->DoOneToAllButSenderRaw(line, sourceserv, prefix, command, params); } else if (command == "ENCAP") { - ServerSource->FinishBurst(); return this->Encap(prefix, params); } else if (command == "MODE") { // Server-prefix MODE. - const char* modelist[MAXPARAMETERS]; - for (size_t i = 0; i < params.size(); i++) - modelist[i] = params[i].c_str(); + std::vector modelist(params.begin(), params.end()); /* We don't support this for channel mode changes any more! */ if (params.size() >= 1) { if (Instance->FindChan(params[0])) { - this->SendError("Protocol violation by '"+prefix+"'! MODE for channel mode changes is not supported by the InspIRCd 1.2 protocol. You must use FMODE to preserve channel timestamps."); + this->SendError("Protocol violation by '"+(ServerSource ? ServerSource->GetName().c_str() : prefix)+"'! MODE for channel mode changes is not supported by the InspIRCd 1.2 protocol. You must use FMODE to preserve channel timestamps."); return false; } } - + // Insert into the parser - this->Instance->SendMode(modelist, params.size(), this->Instance->FakeClient); - + this->Instance->SendMode(modelist, this->Instance->FakeClient); + // Pass out to the network return Utils->DoOneToAllButSenderRaw(line,sourceserv,prefix,command,params); } @@ -588,29 +587,27 @@ bool TreeSocket::ProcessLine(std::string &line) } } } - + // its a user - const char* strparams[127]; - for (unsigned int q = 0; q < params.size(); q++) - { - strparams[q] = params[q].c_str(); - } + std::vector strparams(params.begin(), params.end()); - switch (this->Instance->CallCommandHandler(command.c_str(), strparams, params.size(), who)) + switch (this->Instance->CallCommandHandler(command.c_str(), strparams, who)) { case CMD_INVALID: - // command is irc::string, hence ugliness + /* + * XXX: command is irc::string, hence ugliness + */ this->SendError("Unrecognised or malformed command '" + std::string(command.c_str()) + "' -- possibly loaded mismatched modules"); return false; break; - /* - * CMD_LOCALONLY is aliased to CMD_FAILURE, so this won't go out onto the network. - */ case CMD_FAILURE: + /* + * CMD_LOCALONLY is aliased to CMD_FAILURE, so this won't go out onto the network. + */ return true; break; default: - /* CMD_SUCCESS and CMD_USER_DELETED fall through here */ + /* CMD_SUCCESS falls through here */ break; } @@ -667,7 +664,7 @@ void TreeSocket::OnClose() if (!quitserver.empty()) { Utils->Creator->RemoteMessage(NULL,"Connection to '\2%s\2' failed.",quitserver.c_str()); - time_t server_uptime = Instance->Time() - this->age; + time_t server_uptime = Instance->Time() - this->age; if (server_uptime) Utils->Creator->RemoteMessage(NULL,"Connection to '\2%s\2' was established for %s", quitserver.c_str(), Utils->Creator->TimeToStr(server_uptime).c_str()); } @@ -675,18 +672,19 @@ void TreeSocket::OnClose() int TreeSocket::OnIncomingConnection(int newsock, char* ip) { - /* To prevent anyone from attempting to flood opers/DDoS by connecting to the server port, - * or discovering if this port is the server port, we don't allow connections from any - * IPs for which we don't have a link block. - */ bool found = false; found = (std::find(Utils->ValidIPs.begin(), Utils->ValidIPs.end(), ip) != Utils->ValidIPs.end()); if (!found) { for (std::vector::iterator i = Utils->ValidIPs.begin(); i != Utils->ValidIPs.end(); i++) - if (irc::sockets::MatchCIDR(ip, (*i).c_str())) + { + if (*i == "*" || irc::sockets::MatchCIDR(ip, *i)) + { found = true; + break; + } + } if (!found) {