]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/utils.cpp
m_spanningtree Move SecurityIPResolver code to resolvers.cpp from resolvers.h
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / utils.cpp
index d35d9ac830b8b6aec62b957966709183ac142b7b..75d4eaca3a7fea125317997e2ba732bcea8ac8a7 100644 (file)
@@ -1,16 +1,25 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2007-2009 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
  *
- * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 #include "inspircd.h"
 #include "socket.h"
 #include "xline.h"
@@ -144,14 +153,13 @@ CullResult SpanningTreeUtilities::cull()
                {
                        TreeSocket* sock = child_server->GetSocket();
                        sock->Close();
-                       ServerInstance->GlobalCulls.AddItem(sock);
                }
        }
 
        for(std::map<TreeSocket*, std::pair<std::string, int> >::iterator i = timeoutlist.begin(); i != timeoutlist.end(); ++i)
        {
                TreeSocket* s = i->first;
-               ServerInstance->GlobalCulls.AddItem(s);
+               s->Close();
        }
        TreeRoot->cull();
 
@@ -172,6 +180,14 @@ 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)
 {
+       unsigned int minrank = 0;
+       if (status)
+       {
+               ModeHandler* mh = ServerInstance->Modes->FindPrefix(status);
+               if (mh)
+                       minrank = mh->GetPrefixRank();
+       }
+
        const UserMembList *ulist = c->GetUsers();
 
        for (UserMembCIter i = ulist->begin(); i != ulist->end(); i++)
@@ -179,7 +195,7 @@ void SpanningTreeUtilities::GetListOfServersForChannel(Channel* c, TreeServerLis
                if (IS_LOCAL(i->first))
                        continue;
 
-               if (status && !strchr(c->GetAllPrefixChars(i->first), status))
+               if (minrank && i->second->getRank() < minrank)
                        continue;
 
                if (exempt_list.find(i->first) == exempt_list.end())
@@ -192,7 +208,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, parameterlist &params)
+bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, const parameterlist &params)
 {
        TreeServer* omitroute = this->BestRouteTo(omit);
        unsigned int items =this->TreeRoot->ChildCount();
@@ -209,7 +225,7 @@ bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, cons
        return true;
 }
 
-bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const std::string &command, parameterlist &params, std::string omit)
+bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const std::string &command, const parameterlist &params, std::string omit)
 {
        TreeServer* omitroute = this->BestRouteTo(omit);
        std::string FullLine = ":" + prefix + " " + command;
@@ -236,7 +252,7 @@ bool SpanningTreeUtilities::DoOneToAllButSender(const std::string &prefix, const
        return true;
 }
 
-bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::string &command, parameterlist &params)
+bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::string &command, const parameterlist &params)
 {
        std::string FullLine = ":" + prefix + " " + command;
        unsigned int words = params.size();
@@ -258,21 +274,21 @@ bool SpanningTreeUtilities::DoOneToMany(const std::string &prefix, const std::st
        return true;
 }
 
-bool SpanningTreeUtilities::DoOneToMany(const char* prefix, const char* command, parameterlist &params)
+bool SpanningTreeUtilities::DoOneToMany(const char* prefix, const char* command, const 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, parameterlist &params, std::string omit)
+bool SpanningTreeUtilities::DoOneToAllButSender(const char* prefix, const char* command, const 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, parameterlist &params, std::string target)
+bool SpanningTreeUtilities::DoOneToOne(const std::string &prefix, const std::string &command, const parameterlist &params, std::string target)
 {
        TreeServer* Route = this->BestRouteTo(target);
        if (Route)
@@ -303,17 +319,9 @@ void SpanningTreeUtilities::RefreshIPCache()
        for (std::vector<reference<Link> >::iterator i = LinkBlocks.begin(); i != LinkBlocks.end(); ++i)
        {
                Link* L = *i;
-               if (L->IPAddr.empty() || L->RecvPass.empty() || L->SendPass.empty() || L->Name.empty() || !L->Port)
+               if (!L->Port)
                {
-                       if (L->Name.empty())
-                       {
-                               ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"m_spanningtree: Ignoring a malformed link block (all link blocks require a name!)");
-                       }
-                       else
-                       {
-                               ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"m_spanningtree: Ignoring a link block missing recvpass, sendpass, port or ipaddr.");
-                       }
-
+                       ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"m_spanningtree: Ignoring a link block without a port.");
                        /* Invalid link block */
                        continue;
                }
@@ -323,7 +331,7 @@ void SpanningTreeUtilities::RefreshIPCache()
 
                irc::sockets::sockaddrs dummy;
                bool ipvalid = irc::sockets::aptosa(L->IPAddr, L->Port, dummy);
-               if (ipvalid)
+               if ((L->IPAddr == "*") || (ipvalid))
                        ValidIPs.push_back(L->IPAddr);
                else
                {
@@ -361,7 +369,6 @@ void SpanningTreeUtilities::ReadConfiguration()
 
        AutoconnectBlocks.clear();
        LinkBlocks.clear();
-       ValidIPs.clear();
        ConfigTagList tags = ServerInstance->Config->ConfTags("link");
        for(ConfigIter i = tags.first; i != tags.second; ++i)
        {
@@ -375,51 +382,42 @@ void SpanningTreeUtilities::ReadConfiguration()
                L->RecvPass = tag->getString("recvpass", tag->getString("password"));
                L->Fingerprint = tag->getString("fingerprint");
                L->HiddenFromStats = tag->getBool("statshidden");
-               L->Timeout = tag->getInt("timeout");
+               L->Timeout = tag->getInt("timeout", 30);
                L->Hook = tag->getString("ssl");
                L->Bind = tag->getString("bind");
                L->Hidden = tag->getBool("hidden");
 
+               if (L->Name.empty())
+                       throw ModuleException("Invalid configuration, found a link tag without a name!" + (!L->IPAddr.empty() ? " IP address: "+L->IPAddr : ""));
+
                if (L->Name.find('.') == std::string::npos)
-                       throw CoreException("The link name '"+assign(L->Name)+"' is invalid and must contain at least one '.' character");
+                       throw ModuleException("The link name '"+assign(L->Name)+"' is invalid as it must contain at least one '.' character");
 
                if (L->Name.length() > 64)
-                       throw CoreException("The link name '"+assign(L->Name)+"' is longer than 64 characters!");
+                       throw ModuleException("The link name '"+assign(L->Name)+"' is invalid as it is longer than 64 characters");
 
-               if ((!L->IPAddr.empty()) && (!L->RecvPass.empty()) && (!L->SendPass.empty()) && (!L->Name.empty()) && (L->Port))
-               {
-                       ValidIPs.push_back(L->IPAddr);
-               }
-               else
-               {
-                       if (L->IPAddr.empty())
-                       {
-                               L->IPAddr = "*";
-                               ValidIPs.push_back("*");
-                               ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"Configuration warning: Link block " + assign(L->Name) + " has no IP defined! This will allow any IP to connect as this server, and MAY not be what you want.");
-                       }
+               if (L->RecvPass.empty())
+                       throw ModuleException("Invalid configuration for server '"+assign(L->Name)+"', recvpass not defined");
 
-                       if (L->RecvPass.empty())
-                       {
-                               throw CoreException("Invalid configuration for server '"+assign(L->Name)+"', recvpass not defined!");
-                       }
+               if (L->SendPass.empty())
+                       throw ModuleException("Invalid configuration for server '"+assign(L->Name)+"', sendpass not defined");
 
-                       if (L->SendPass.empty())
-                       {
-                               throw CoreException("Invalid configuration for server '"+assign(L->Name)+"', sendpass not defined!");
-                       }
+               if ((L->SendPass.find(' ') != std::string::npos) || (L->RecvPass.find(' ') != std::string::npos))
+                       throw ModuleException("Link block '" + assign(L->Name) + "' has a password set that contains a space character which is invalid");
 
-                       if (L->Name.empty())
-                       {
-                               throw CoreException("Invalid configuration, link tag without a name! IP address: "+L->IPAddr);
-                       }
+               if ((L->SendPass[0] == ':') || (L->RecvPass[0] == ':'))
+                       throw ModuleException("Link block '" + assign(L->Name) + "' has a password set that begins with a colon (:) which is invalid");
 
-                       if (!L->Port)
-                       {
-                               ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"Configuration warning: Link block " + assign(L->Name) + " has no port defined, you will not be able to /connect it.");
-                       }
+               if (L->IPAddr.empty())
+               {
+                       L->IPAddr = "*";
+                       ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"Configuration warning: Link block '" + assign(L->Name) + "' has no IP defined! This will allow any IP to connect as this server, and MAY not be what you want.");
                }
 
+               if (!L->Port)
+                       ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"Configuration warning: Link block '" + assign(L->Name) + "' has no port defined, you will not be able to /connect it.");
+
+               L->Fingerprint.erase(std::remove(L->Fingerprint.begin(), L->Fingerprint.end(), ':'), L->Fingerprint.end());
                LinkBlocks.push_back(L);
        }
 
@@ -440,12 +438,12 @@ void SpanningTreeUtilities::ReadConfiguration()
 
                if (A->Period <= 0)
                {
-                       throw CoreException("Invalid configuration for autoconnect, period not a positive integer!");
+                       throw ModuleException("Invalid configuration for autoconnect, period not a positive integer!");
                }
 
                if (A->servers.empty())
                {
-                       throw CoreException("Invalid configuration for autoconnect, server cannot be empty!");
+                       throw ModuleException("Invalid configuration for autoconnect, server cannot be empty!");
                }
 
                AutoconnectBlocks.push_back(A);