#include "resolvers.h"
/* Create server sockets off a listener. */
-void ServerSocketListener::OnAcceptReady(int newsock)
+ModResult ModuleSpanningTree::OnAcceptConnection(int newsock, ListenSocket* from, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server)
{
- bool found = false;
- int port;
- std::string incomingip;
- irc::sockets::satoap(&client, incomingip, port);
+ if (from->bind_tag->getString("type") != "servers")
+ return MOD_RES_PASSTHRU;
- found = (std::find(Utils->ValidIPs.begin(), Utils->ValidIPs.end(), incomingip) != Utils->ValidIPs.end());
- if (!found)
- {
- for (std::vector<std::string>::iterator i = Utils->ValidIPs.begin(); i != Utils->ValidIPs.end(); i++)
- {
- if (*i == "*" || irc::sockets::MatchCIDR(incomingip, *i))
- {
- found = true;
- break;
- }
- }
+ std::string incomingip = client->addr();
- if (!found)
+ for (std::vector<std::string>::iterator i = Utils->ValidIPs.begin(); i != Utils->ValidIPs.end(); i++)
+ {
+ if (*i == "*" || *i == incomingip || irc::sockets::cidr_mask(*i).match(*client))
{
- ServerInstance->SNO->WriteToSnoMask('l', "Server connection from %s denied (no link blocks with that IP address)", incomingip.c_str());
- ServerInstance->SE->Close(newsock);
- return;
+ /* we don't need to do anything with the pointer, creating it stores it in the necessary places */
+ new TreeSocket(Utils, newsock, from, client, server);
+ return MOD_RES_ALLOW;
}
}
-
- /* we don't need to do anything with the pointer, creating it stores it in the necessary places */
-
- new TreeSocket(Utils, newsock, this, &client, &server);
+ ServerInstance->SNO->WriteToSnoMask('l', "Server connection from %s denied (no link blocks with that IP address)", incomingip.c_str());
+ return MOD_RES_DENY;
}
/** Yay for fast searches!
ServerInstance->Logs->Log("m_spanningtree",DEBUG,"***** Using SID for hash: %s *****", ServerInstance->Config->GetSID().c_str());
this->TreeRoot = new TreeServer(this, ServerInstance->Config->ServerName, ServerInstance->Config->ServerDesc, ServerInstance->Config->GetSID());
- ServerUser = new FakeUser(TreeRoot->GetID());
-
- this->ReadConfiguration(true);
+ this->ReadConfiguration();
}
CullResult SpanningTreeUtilities::cull()
{
- for (unsigned int i = 0; i < ServerInstance->ports.size(); i++)
- {
- if (ServerInstance->ports[i]->type == "servers")
- ServerInstance->ports[i]->cull();
- }
-
while (TreeRoot->ChildCount())
{
TreeServer* child_server = TreeRoot->GetChild(0);
}
}
- ServerUser->uuid = TreeRoot->GetID();
- ServerUser->cull();
- delete ServerUser;
+ 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);
+ }
+ TreeRoot->cull();
+
return classbase::cull();
}
SpanningTreeUtilities::~SpanningTreeUtilities()
{
- for (unsigned int i = 0; i < ServerInstance->ports.size(); i++)
- {
- if (ServerInstance->ports[i]->type == "servers")
- delete ServerInstance->ports[i];
- }
-
delete TreeRoot;
}
ValidIPs.push_back(L->AllowMask);
irc::sockets::sockaddrs dummy;
- bool ipvalid = irc::sockets::aptosa(L->IPAddr, L->Port, &dummy);
+ bool ipvalid = irc::sockets::aptosa(L->IPAddr, L->Port, dummy);
if (ipvalid)
ValidIPs.push_back(L->IPAddr);
else
}
}
-void SpanningTreeUtilities::ReadConfiguration(bool rebind)
+void SpanningTreeUtilities::ReadConfiguration()
{
ConfigReader Conf;
- if (rebind)
- {
- ConfigTagList tags = ServerInstance->Config->ConfTags("bind");
- for(ConfigIter i = tags.first; i != tags.second; ++i)
- {
- ConfigTag* tag = i->second;
- std::string Type = tag->getString("type");
- std::string IP = tag->getString("address");
- std::string Port = tag->getString("port");
- std::string ssl = tag->getString("ssl");
- if (Type == "servers")
- {
- irc::portparser portrange(Port, false);
- int portno = -1;
-
- if (IP == "*")
- IP.clear();
-
- while ((portno = portrange.GetToken()))
- {
- ServerSocketListener *listener = new ServerSocketListener(this, portno, IP, ssl);
- if (listener->GetFd() == -1)
- {
- delete listener;
- continue;
- }
-
- ServerInstance->ports.push_back(listener);
- }
- }
- }
- }
FlatLinks = Conf.ReadFlag("security","flatlinks",0);
HideULines = Conf.ReadFlag("security","hideulines",0);
AnnounceTSChange = Conf.ReadFlag("options","announcets",0);