* +------------------------------------+
*
* InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
#include "commands/cmd_stats.h"
#include "socket.h"
#include "xline.h"
-#include "transport.h"
+#include "../transport.h"
#include "socketengine.h"
-#include "m_spanningtree/main.h"
-#include "m_spanningtree/utils.h"
-#include "m_spanningtree/treeserver.h"
-#include "m_spanningtree/link.h"
-#include "m_spanningtree/treesocket.h"
-#include "m_spanningtree/resolvers.h"
-#include "m_spanningtree/handshaketimer.h"
+#include "main.h"
+#include "utils.h"
+#include "treeserver.h"
+#include "link.h"
+#include "treesocket.h"
+#include "resolvers.h"
+#include "handshaketimer.h"
/* $ModDep: m_spanningtree/resolvers.h m_spanningtree/main.h m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/link.h m_spanningtree/treesocket.h m_spanningtree/handshaketimer.h */
if (prefix.empty())
{
- this->SendError("BUG (?) Empty prefix recieved.");
+ this->SendError("BUG (?) Empty prefix recieved: " + line);
return false;
}
}
ServerInstance->Logs->Log("m_spanningtree",DEBUG,"Protocol violation: Fake direction in command '%s' from connection '%s'",line.c_str(),this->GetName().c_str());
return true;
}
- /* Fix by brain:
- * When there is activity on the socket, reset the ping counter so
- * that we're not wasting bandwidth pinging an active server.
- */
- route_back_again->SetNextPingTime(ServerInstance->Time() + Utils->PingFreq);
- route_back_again->SetPingFlag();
}
else
{
/* Find the server that this command originated from, used in the handlers below */
TreeServer *ServerSource = Utils->FindServer(prefix);
+ if (ServerSource)
+ {
+ Utils->ServerUser->SetFakeServer(ServerSource->GetName());
+ Utils->ServerUser->uuid = ServerSource->GetID();
+ }
/* Find the link we just got this from so we don't bounce it back incorrectly */
std::string sourceserv = this->myhost;
*/
if (command == "UID")
{
- return this->ParseUID(prefix, params, sourceserv);
+ return this->ParseUID(prefix, params);
}
else if (command == "FJOIN")
{
}
else if (command == "OPERTYPE")
{
- return this->OperType(prefix, params, sourceserv);
+ return this->OperType(prefix,params);
}
else if (command == "FMODE")
{
{
return this->Time(prefix,params);
}
- else if ((command == "KICK") && (Utils->IsServer(prefix)))
- {
- if (params.size() == 3)
- {
- TreeServer* pf = Utils->FindServer(prefix);
- if (pf)
- {
- irc::commasepstream nicks(params[1]);
- std::string nick;
- Channel* chan = this->ServerInstance->FindChan(params[0]);
- if (chan)
- {
- while (nicks.GetToken(nick))
- {
- User* user = this->ServerInstance->FindNick(nick);
- if (user)
- {
- if (!chan->ServerKickUser(user, params[2].c_str(), false, pf->GetName().c_str()))
- /* Yikes, the channels gone! */
- delete chan;
- }
- }
- }
- }
- }
-
- return Utils->DoOneToAllButSenderRaw(line,sourceserv,prefix,command,params);
- }
else if (command == "SVSJOIN")
{
return this->ServiceJoin(prefix,params);
{
return this->Encap(prefix, params);
}
- else if (command == "MODE" && !this->ServerInstance->FindUUID(prefix)) // XXX we should check for no such serv?
- {
- // Server-prefix MODE.
- std::vector<std::string> modelist(params.begin(), params.end());
-
- /* We don't support this for channel mode changes any more! */
- if (params.size() >= 1)
- {
- if (ServerInstance->FindChan(params[0]))
- {
- 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->ServerInstance->SendMode(modelist, this->ServerInstance->FakeClient);
-
- // Pass out to the network
- return Utils->DoOneToAllButSenderRaw(line,sourceserv,prefix,command,params);
- }
else
{
/*
*/
User* who = this->ServerInstance->FindUUID(prefix);
- if (!who)
+ if (ServerSource)
+ {
+ who = Utils->ServerUser;
+ }
+ else if (!who)
{
/* this looks ugly because command is an irc::string
* It is important that we dont close the link here, unknown prefix can occur
}
}
- // its a user
+ // it's a user
std::vector<std::string> strparams(params.begin(), params.end());
switch (this->ServerInstance->CallCommandHandler(command.c_str(), strparams, who))