]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/utils.cpp
Make VF_OPTCOMMON module mismatches a fatal link error by default
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / utils.cpp
index b9216ca9a269e7bb4ea321ddc378936fdb412eba..13a4cc760fd27e88a4a2d4118031f814f6316979 100644 (file)
@@ -3,7 +3,7 @@
  *       +------------------------------------+
  *
  *  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 "main.h"
+#include "utils.h"
+#include "treeserver.h"
+#include "link.h"
+#include "treesocket.h"
+#include "resolvers.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)
@@ -56,7 +59,7 @@ void ServerSocketListener::OnAcceptReady(const std::string &ipconnectedto, int n
 
        if (this->GetIOHook())
        {
-               this->GetIOHook()->OnRawSocketAccept(newsock, incomingip.c_str(), this->bind_port);
+               this->GetIOHook()->OnRawSocketAccept(newsock, &client, &server);
        }
 
        /* we don't need a pointer to this, creating it stores it in the necessary places */
@@ -154,24 +157,7 @@ SpanningTreeUtilities::SpanningTreeUtilities(InspIRCd* Instance, ModuleSpanningT
        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());
-
-       modulelist* ml = ServerInstance->Modules->FindInterface("BufferedSocketHook");
-
-       /* Did we find any modules? */
-       if (ml)
-       {
-               /* Yes, enumerate them all to find out the hook name */
-               for (modulelist::iterator m = ml->begin(); m != ml->end(); m++)
-               {
-                       /* Make a request to it for its name, its implementing
-                        * BufferedSocketHook so we know its safe to do this
-                        */
-                       std::string name = BufferedSocketNameRequest((Module*)Creator, *m).Send();
-                       /* Build a map of them */
-                       hooks[name.c_str()] = *m;
-                       hooknames.push_back(name);
-               }
-       }
+       this->ServerUser = new FakeUser(ServerInstance, TreeRoot->GetID());
 
        this->ReadConfiguration(true);
 }
@@ -193,7 +179,11 @@ SpanningTreeUtilities::~SpanningTreeUtilities()
                        sock->Close();
                }
        }
+       
+       // This avoids a collision on reload
+       ServerUser->uuid = TreeRoot->GetID();
        delete TreeRoot;
+       delete ServerUser;
        ServerInstance->BufferedSocketCull();
 }
 
@@ -226,7 +216,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);
@@ -246,7 +236,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);
@@ -255,7 +245,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());
@@ -299,7 +289,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;
@@ -326,7 +316,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();
@@ -348,21 +338,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)
@@ -415,7 +405,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(),':'))
                {
@@ -424,7 +413,6 @@ void SpanningTreeUtilities::RefreshIPCache()
                                ipvalid = false;
                }
                else
-#endif
                {
                        in_addr n;
                        if (inet_aton(L->IPAddr.c_str(),&n) < 1)
@@ -449,6 +437,30 @@ void SpanningTreeUtilities::RefreshIPCache()
 void SpanningTreeUtilities::ReadConfiguration(bool rebind)
 {
        ConfigReader* Conf = new ConfigReader(ServerInstance);
+
+       /* 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.
+        */
+       hooks.clear();
+       hooknames.clear();
+       modulelist* ml = ServerInstance->Modules->FindInterface("BufferedSocketHook");
+
+       /* Did we find any modules? */
+       if (ml)
+       {
+               /* Yes, enumerate them all to find out the hook name */
+               for (modulelist::iterator m = ml->begin(); m != ml->end(); m++)
+               {
+                       /* Make a request to it for its name, its implementing
+                        * BufferedSocketHook so we know its safe to do this
+                        */
+                       std::string name = BufferedSocketNameRequest((Module*)Creator, *m).Send();
+                       /* Build a map of them */
+                       hooks[name.c_str()] = *m;
+                       hooknames.push_back(name);
+               }
+       }
+
        if (rebind)
        {
                for (unsigned int i = 0; i < Bindings.size(); i++)
@@ -498,6 +510,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);
@@ -522,6 +535,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind)
                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);
@@ -556,7 +570,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(),':'))
                        {
@@ -570,11 +583,6 @@ 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)
                        {
@@ -656,7 +664,7 @@ void SpanningTreeUtilities::DoFailOver(Link* x)
 
 Link* SpanningTreeUtilities::FindLink(const std::string& name)
 {
-       for (std::vector<Link>::iterator x = LinkBlocks.begin(); x < LinkBlocks.end(); x++)
+       for (std::vector<Link>::iterator x = LinkBlocks.begin(); x != LinkBlocks.end(); x++)
        {
                if (InspIRCd::Match(x->Name.c_str(), name.c_str()))
                {