X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Ftreesocket1.cpp;h=db448df36b8c29e3244f0d285bbc7e6b8c0bc2b9;hb=HEAD;hp=2198d6208c1f6927f2e386eae57dd25543047710;hpb=a6433b37967e22e19658967ae4e798febea86356;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 2198d6208..db448df36 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -1,10 +1,13 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2013, 2017-2020 Sadie Powell + * Copyright (C) 2012-2016 Attila Molnar + * Copyright (C) 2012, 2019 Robby * Copyright (C) 2009-2010 Daniel De Graaf - * Copyright (C) 2007-2008 Robin Burchell - * Copyright (C) 2007 Craig Edwards - * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2007-2008, 2010 Craig Edwards + * Copyright (C) 2007-2008 Dennis Friis + * Copyright (C) 2007 Robin Burchell * * 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 @@ -24,7 +27,6 @@ #include "iohook.h" #include "main.h" -#include "modules/spanningtree.h" #include "utils.h" #include "treeserver.h" #include "link.h" @@ -36,17 +38,42 @@ * BufferedSocket, we just call DoConnect() for most of the action, * and only do minor initialization tasks ourselves. */ -TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const std::string& ipaddr) - : linkID(assign(link->Name)), LinkState(CONNECTING), MyRoot(NULL), proto_version(0) - , burstsent(false), age(ServerInstance->Time()) +TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const irc::sockets::sockaddrs& dest) + : linkID(link->Name) + , LinkState(CONNECTING) + , MyRoot(NULL) + , proto_version(0) + , burstsent(false) + , age(ServerInstance->Time()) { capab = new CapabData; capab->link = link; capab->ac = myac; capab->capab_phase = 0; + capab->remotesa = dest; - DoConnect(ipaddr, link->Port, link->Timeout, link->Bind); - Utils->timeoutlist[this] = std::pair(linkID, link->Timeout); + irc::sockets::sockaddrs bind; + memset(&bind, 0, sizeof(bind)); + if (!link->Bind.empty() && (dest.family() == AF_INET || dest.family() == AF_INET6)) + { + if (!irc::sockets::aptosa(link->Bind, 0, bind)) + { + state = I_ERROR; + SetError("Bind address '" + link->Bind + "' is not a valid IPv4 or IPv6 address"); + TreeSocket::OnError(I_ERR_BIND); + return; + } + else if (bind.family() != dest.family()) + { + state = I_ERROR; + SetError("Bind address '" + bind.addr() + "' is not the same address family as destination address '" + dest.addr() + "'"); + TreeSocket::OnError(I_ERR_BIND); + return; + } + } + + DoConnect(dest, bind, link->Timeout); + Utils->timeoutlist[this] = std::pair(linkID, link->Timeout); SendCapabilities(1); } @@ -54,17 +81,35 @@ TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const std::string& ipaddr) */ TreeSocket::TreeSocket(int newfd, ListenSocket* via, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server) : BufferedSocket(newfd) - , linkID("inbound from " + client->addr()), LinkState(WAIT_AUTH_1), MyRoot(NULL), proto_version(0) - , burstsent(false), age(ServerInstance->Time()) + , linkID("inbound from " + client->addr()) + , LinkState(WAIT_AUTH_1) + , MyRoot(NULL) + , proto_version(0) + , burstsent(false) + , age(ServerInstance->Time()) { capab = new CapabData; capab->capab_phase = 0; + capab->remotesa = *client; + + for (ListenSocket::IOHookProvList::iterator i = via->iohookprovs.begin(); i != via->iohookprovs.end(); ++i) + { + ListenSocket::IOHookProvRef& iohookprovref = *i; + if (!iohookprovref) + continue; + + iohookprovref->OnAccept(this, client, server); + // IOHook could have encountered a fatal error, e.g. if the TLS ClientHello was already in the queue and there was no common TLS version + if (!getError().empty()) + { + TreeSocket::OnError(I_ERR_OTHER); + return; + } + } - if (via->iohookprov) - via->iohookprov->OnAccept(this, client, server); SendCapabilities(1); - Utils->timeoutlist[this] = std::pair(linkID, 30); + Utils->timeoutlist[this] = std::pair(linkID, 30); } void TreeSocket::CleanNegotiationInfo() @@ -101,7 +146,7 @@ void TreeSocket::OnConnected() { if (!capab->link->Hook.empty()) { - ServiceProvider* prov = ServerInstance->Modules->FindService(SERVICE_IOHOOK, capab->link->Hook); + ServiceProvider* prov = ServerInstance->Modules->FindService(SERVICE_IOHOOK, "ssl/" + capab->link->Hook); if (!prov) { SetError("Could not find hook '" + capab->link->Hook + "' for connection to " + linkID); @@ -110,7 +155,7 @@ void TreeSocket::OnConnected() static_cast(prov)->OnConnect(this); } - ServerInstance->SNO->WriteGlobalSno('l', "Connection to \2%s\2[%s] started.", linkID.c_str(), + ServerInstance->SNO->WriteGlobalSno('l', "Connection to \002%s\002[%s] started.", linkID.c_str(), (capab->link->HiddenFromStats ? "" : capab->link->IPAddr.c_str())); this->SendCapabilities(1); } @@ -132,7 +177,7 @@ void TreeSocket::SendError(const std::string &errormessage) SetError(errormessage); } -CmdResult CommandSQuit::HandleServer(TreeServer* server, std::vector& params) +CmdResult CommandSQuit::HandleServer(TreeServer* server, CommandBase::Params& params) { TreeServer* quitting = Utils->FindServer(params[0]); if (!quitting)