]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/utils.cpp
Remove InspIRCd* parameters and fields
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / utils.cpp
index 8a17baf84be5a8c27853612ffdadaa5d6cc7f8b4..729f6d4ee5617bada8bc97bcc41ded37fe3eba78 100644 (file)
@@ -12,8 +12,6 @@
  */
 
 #include "inspircd.h"
-#include "commands/cmd_whois.h"
-#include "commands/cmd_stats.h"
 #include "socket.h"
 #include "xline.h"
 #include "../transport.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 */
 
 /* Create server sockets off a listener. */
-void ServerSocketListener::OnAcceptReady(const std::string &ipconnectedto, int newsock, const std::string &incomingip)
+void ServerSocketListener::OnAcceptReady(int newsock)
 {
        bool found = false;
-       char *ip = (char *)incomingip.c_str(); // XXX ugly cast
+       int port;
+       std::string incomingip;
+       irc::sockets::satoap(&client, incomingip, port);
+       char *ip = const_cast<char*>(incomingip.c_str());
 
        found = (std::find(Utils->ValidIPs.begin(), Utils->ValidIPs.end(), ip) != Utils->ValidIPs.end());
        if (!found)
@@ -48,19 +49,18 @@ void ServerSocketListener::OnAcceptReady(const std::string &ipconnectedto, int n
 
                if (!found)
                {
-                       this->ServerInstance->SNO->WriteToSnoMask('l', "Server connection from %s denied (no link blocks with that IP address)", ip);
+                       ServerInstance->SNO->WriteToSnoMask('l', "Server connection from %s denied (no link blocks with that IP address)", ip);
                        ServerInstance->SE->Close(newsock);
                        return;
                }
        }
 
-       if (this->GetIOHook())
-       {
-               this->GetIOHook()->OnRawSocketAccept(newsock, &client, &server);
-       }
+       /* we don't need to do anything with the pointer, creating it stores it in the necessary places */
+       TreeSocket* ts = new TreeSocket(Utils, newsock, ip, NULL, Hook);
+
+       if (Hook)
+               Hook->OnStreamSocketAccept(ts, &client, &server);
 
-       /* we don't need a pointer to this, creating it stores it in the necessary places */
-       new TreeSocket(this->Utils, this->ServerInstance, newsock, ip, this->GetIOHook());
        return;
 }
 
@@ -72,7 +72,7 @@ void ServerSocketListener::OnAcceptReady(const std::string &ipconnectedto, int n
  */
 TreeServer* SpanningTreeUtilities::FindServer(const std::string &ServerName)
 {
-       if (this->ServerInstance->IsSID(ServerName))
+       if (ServerInstance->IsSID(ServerName))
                return this->FindServerID(ServerName);
 
        server_hash::iterator iter = serverlist.find(ServerName.c_str());
@@ -147,14 +147,12 @@ bool SpanningTreeUtilities::IsServer(const std::string &ServerName)
        return (FindServer(ServerName) != NULL);
 }
 
-SpanningTreeUtilities::SpanningTreeUtilities(InspIRCd* Instance, ModuleSpanningTree* C) : ServerInstance(Instance), Creator(C)
+SpanningTreeUtilities::SpanningTreeUtilities(ModuleSpanningTree* C) : Creator(C)
 {
-       Bindings.clear();
-
        ServerInstance->Logs->Log("m_spanningtree",DEBUG,"***** Using SID for hash: %s *****", ServerInstance->Config->GetSID().c_str());
 
-       this->TreeRoot = new TreeServer(this, ServerInstance, ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc, ServerInstance->Config->GetSID());
-       this->ServerUser = new FakeUser(ServerInstance, TreeRoot->GetID());
+       this->TreeRoot = new TreeServer(this, ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc, ServerInstance->Config->GetSID());
+       ServerUser = new FakeUser(TreeRoot->GetID());
 
        this->ReadConfiguration(true);
 }
@@ -181,7 +179,6 @@ SpanningTreeUtilities::~SpanningTreeUtilities()
        ServerUser->uuid = TreeRoot->GetID();
        delete TreeRoot;
        delete ServerUser;
-       ServerInstance->BufferedSocketCull();
 }
 
 void SpanningTreeUtilities::AddThisServer(TreeServer* server, TreeServerList &list)
@@ -193,9 +190,9 @@ void SpanningTreeUtilities::AddThisServer(TreeServer* server, TreeServerList &li
 /* returns a list of DIRECT servernames for a specific channel */
 void SpanningTreeUtilities::GetListOfServersForChannel(Channel* c, TreeServerList &list, char status, const CUList &exempt_list)
 {
-       CUList *ulist = c->GetUsers();
+       const UserMembList *ulist = c->GetUsers();
 
-       for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
+       for (UserMembCIter i = ulist->begin(); i != ulist->end(); i++)
        {
                if (IS_LOCAL(i->first))
                        continue;
@@ -213,7 +210,7 @@ void SpanningTreeUtilities::GetListOfServersForChannel(Channel* c, TreeServerLis
        return;
 }
 
-bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, std::deque<std::string> &params)
+bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, parameterlist &params)
 {
        char pfx = 0;
        TreeServer* omitroute = this->BestRouteTo(omit);
@@ -233,7 +230,7 @@ bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, cons
                                User* d = ServerInstance->FindNick(params[0]);
                                if (d)
                                {
-                                       std::deque<std::string> par;
+                                       parameterlist par;
                                        par.push_back(params[0]);
                                        par.push_back(":"+params[1]);
                                        this->DoOneToOne(prefix,command.c_str(),par,d->server);
@@ -242,7 +239,7 @@ bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, cons
                        }
                        else if (*(params[0].c_str()) == '$')
                        {
-                               std::deque<std::string> par;
+                               parameterlist par;
                                par.push_back(params[0]);
                                par.push_back(":"+params[1]);
                                this->DoOneToAllButSender(prefix,command.c_str(),par,omitroute->GetName());
@@ -286,7 +283,7 @@ bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, cons
        return true;
 }
 
-bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const std::string &command, std::deque<std::string> &params, std::string omit)
+bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const std::string &command, parameterlist &params, std::string omit)
 {
        TreeServer* omitroute = this->BestRouteTo(omit);
        std::string FullLine = ":" + prefix + " " + command;
@@ -313,7 +310,7 @@ bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const
        return true;
 }
 
-bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::string &command, std::deque<std::string> &params)
+bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::string &command, parameterlist &params)
 {
        std::string FullLine = ":" + prefix + " " + command;
        unsigned int words = params.size();
@@ -335,21 +332,21 @@ bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::st
        return true;
 }
 
-bool SpanningTreeUtilities::DoOneToMany(const char* prefix, const char* command, std::deque<std::string> &params)
+bool SpanningTreeUtilities::DoOneToMany(const char* prefix, const char* command, parameterlist &params)
 {
        std::string spfx = prefix;
        std::string scmd = command;
        return this->DoOneToMany(spfx, scmd, params);
 }
 
-bool SpanningTreeUtilities::DoOneToAllButSender(const char* prefix, const char* command, std::deque<std::string> &params, std::string omit)
+bool SpanningTreeUtilities::DoOneToAllButSender(const char* prefix, const char* command, parameterlist &params, std::string omit)
 {
        std::string spfx = prefix;
        std::string scmd = command;
        return this->DoOneToAllButSender(spfx, scmd, params, omit);
 }
 
-bool SpanningTreeUtilities::DoOneToOne(const std::string &prefix, const std::string &command, std::deque<std::string> &params, std::string target)
+bool SpanningTreeUtilities::DoOneToOne(const std::string &prefix, const std::string &command, parameterlist &params, std::string target)
 {
        TreeServer* Route = this->BestRouteTo(target);
        if (Route)
@@ -402,7 +399,6 @@ void SpanningTreeUtilities::RefreshIPCache()
                /* Needs resolving */
                bool ipvalid = true;
                QueryType start_type = DNS_QUERY_A;
-#ifdef IPV6
                start_type = DNS_QUERY_AAAA;
                if (strchr(L->IPAddr.c_str(),':'))
                {
@@ -411,7 +407,6 @@ void SpanningTreeUtilities::RefreshIPCache()
                                ipvalid = false;
                }
                else
-#endif
                {
                        in_addr n;
                        if (inet_aton(L->IPAddr.c_str(),&n) < 1)
@@ -423,7 +418,7 @@ void SpanningTreeUtilities::RefreshIPCache()
                        try
                        {
                                bool cached;
-                               SecurityIPResolver* sr = new SecurityIPResolver((Module*)this->Creator, this, ServerInstance, L->IPAddr, *L, cached, start_type);
+                               SecurityIPResolver* sr = new SecurityIPResolver(Creator, this, L->IPAddr, *L, cached, start_type);
                                ServerInstance->AddResolver(sr, cached);
                        }
                        catch (...)
@@ -435,7 +430,7 @@ void SpanningTreeUtilities::RefreshIPCache()
 
 void SpanningTreeUtilities::ReadConfiguration(bool rebind)
 {
-       ConfigReader* Conf = new ConfigReader(ServerInstance);
+       ConfigReader* Conf = new ConfigReader;
 
        /* We don't need to worry about these being *unloaded* on the fly, only loaded,
         * because we 'use' the interface locking the module in memory.
@@ -466,7 +461,6 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
                {
                        delete Bindings[i];
                }
-               ServerInstance->BufferedSocketCull();
                Bindings.clear();
 
                for (int j = 0; j < Conf->Enumerate("bind"); j++)
@@ -491,7 +485,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
                                                break;
                                        }
 
-                                       ServerSocketListener *listener = new ServerSocketListener(ServerInstance, this, portno, (char *)IP.c_str());
+                                       ServerSocketListener *listener = new ServerSocketListener(this, portno, (char *)IP.c_str());
                                        if (listener->GetFd() == -1)
                                        {
                                                delete listener;
@@ -499,7 +493,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
                                        }
 
                                        if (!transport.empty())
-                                               listener->AddIOHook(hooks[transport.c_str()]);
+                                               listener->Hook = hooks[transport.c_str()];
 
                                        Bindings.push_back(listener);
                                }
@@ -509,6 +503,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
        FlatLinks = Conf->ReadFlag("security","flatlinks",0);
        HideULines = Conf->ReadFlag("security","hideulines",0);
        AnnounceTSChange = Conf->ReadFlag("options","announcets",0);
+       AllowOptCommon = Conf->ReadFlag("options", "allowmismatch", 0);
        ChallengeResponse = !Conf->ReadFlag("security", "disablehmac", 0);
        quiet_bursts = Conf->ReadFlag("performance", "quietbursts", 0);
        PingWarnTime = Conf->ReadInteger("options", "pingwarning", 0, true);
@@ -520,21 +515,20 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
        if (PingWarnTime < 0 || PingWarnTime > PingFreq - 1)
                PingWarnTime = 0;
 
+       AutoconnectBlocks.clear();
        LinkBlocks.clear();
        ValidIPs.clear();
-       for (int j = 0; j < Conf->Enumerate("link"); j++)
+       for (int j = 0; j < Conf->Enumerate("link"); ++j)
        {
                Link L;
                std::string Allow = Conf->ReadValue("link", "allowmask", j);
                L.Name = (Conf->ReadValue("link", "name", j)).c_str();
                L.AllowMask = Allow;
                L.IPAddr = Conf->ReadValue("link", "ipaddr", j);
-               L.FailOver = Conf->ReadValue("link", "failover", j).c_str();
                L.Port = Conf->ReadInteger("link", "port", j, true);
                L.SendPass = Conf->ReadValue("link", "sendpass", j);
                L.RecvPass = Conf->ReadValue("link", "recvpass", j);
                L.Fingerprint = Conf->ReadValue("link", "fingerprint", j);
-               L.AutoConnect = Conf->ReadInteger("link", "autoconnect", j, true);
                L.HiddenFromStats = Conf->ReadFlag("link", "statshidden", j);
                L.Timeout = Conf->ReadInteger("link", "timeout", j, true);
                L.Hook = Conf->ReadValue("link", "transport", j);
@@ -548,10 +542,6 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
 
                }
 
-               // Fix: Only trip autoconnects if this wouldn't delay autoconnect..
-               if (L.NextConnectTime > ((time_t)(ServerInstance->Time() + L.AutoConnect)))
-                       L.NextConnectTime = ServerInstance->Time() + L.AutoConnect;
-
                if (L.Name.find('.') == std::string::npos)
                        throw CoreException("The link name '"+assign(L.Name)+"' is invalid and must contain at least one '.' character");
 
@@ -568,7 +558,6 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
                        /* Needs resolving */
                        bool ipvalid = true;
                        QueryType start_type = DNS_QUERY_A;
-#ifdef IPV6
                        start_type = DNS_QUERY_AAAA;
                        if (strchr(L.IPAddr.c_str(),':'))
                        {
@@ -582,18 +571,13 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
                                if (inet_aton(L.IPAddr.c_str(),&n) < 1)
                                        ipvalid = false;
                        }
-#else
-                       in_addr n;
-                       if (inet_aton(L.IPAddr.c_str(),&n) < 1)
-                               ipvalid = false;
-#endif
 
                        if (!ipvalid)
                        {
                                try
                                {
                                        bool cached;
-                                       SecurityIPResolver* sr = new SecurityIPResolver((Module*)this->Creator, this, ServerInstance, L.IPAddr, L, cached, start_type);
+                                       SecurityIPResolver* sr = new SecurityIPResolver(Creator, this, L.IPAddr, L, cached, start_type);
                                        ServerInstance->AddResolver(sr, cached);
                                }
                                catch (...)
@@ -633,16 +617,41 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
 
                LinkBlocks.push_back(L);
        }
+
+       for (int j = 0; j < Conf->Enumerate("autoconnect"); ++j)
+       {
+               Autoconnect A;
+               A.Period = Conf->ReadInteger("autoconnect", "period", j, true);
+               A.Server = Conf->ReadValue("autoconnect", "server", j);
+               A.FailOver = Conf->ReadValue("autoconnect", "failover", j).c_str();
+
+               // Fix: Only trip autoconnects if this wouldn't delay autoconnect..
+               if (A.NextConnectTime > ((time_t)(ServerInstance->Time() + A.Period)))
+                       A.NextConnectTime = ServerInstance->Time() + A.Period;
+
+               if (A.Period <= 0)
+               {
+                       throw CoreException("Invalid configuration for autoconnect, period not a positive integer!");
+               }
+
+               if (A.Server.empty())
+               {
+                       throw CoreException("Invalid configuration for autoconnect, server cannot be empty!");
+               }
+
+               AutoconnectBlocks.push_back(A);
+       }
+
        delete Conf;
 }
 
-void SpanningTreeUtilities::DoFailOver(Link* x)
+void SpanningTreeUtilities::DoFailOver(Autoconnect* x)
 {
-       if (x->FailOver.length())
+       if (x && x->FailOver.length())
        {
-               if (x->FailOver == x->Name)
+               if (x->FailOver == x->Server)
                {
-                       this->ServerInstance->SNO->WriteToSnoMask('l', "FAILOVER: Some muppet configured the failover for server \002%s\002 to point at itself. Not following it!", x->Name.c_str());
+                       ServerInstance->SNO->WriteToSnoMask('l', "FAILOVER: Some muppet configured the failover for server \002%s\002 to point at itself. Not following it!", x->Server.c_str());
                        return;
                }
                Link* TryThisOne = this->FindLink(x->FailOver.c_str());
@@ -655,13 +664,13 @@ void SpanningTreeUtilities::DoFailOver(Link* x)
                        }
                        else
                        {
-                               this->ServerInstance->SNO->WriteToSnoMask('l', "FAILOVER: Trying failover link for \002%s\002: \002%s\002...", x->Name.c_str(), TryThisOne->Name.c_str());
-                               Creator->ConnectServer(TryThisOne);
+                               ServerInstance->SNO->WriteToSnoMask('l', "FAILOVER: Trying failover link for \002%s\002: \002%s\002...", x->Server.c_str(), TryThisOne->Name.c_str());
+                               Creator->ConnectServer(TryThisOne, NULL);
                        }
                }
                else
                {
-                       this->ServerInstance->SNO->WriteToSnoMask('l', "FAILOVER: Invalid failover server specified for server \002%s\002, will not follow!", x->Name.c_str());
+                       ServerInstance->SNO->WriteToSnoMask('l', "FAILOVER: Invalid failover server specified for server \002%s\002, will not follow!", x->Server.c_str());
                }
        }
 }