From b6a5e2bd143cdd2fc610f79c87729d2e211da7ff Mon Sep 17 00:00:00 2001 From: danieldg Date: Fri, 9 Oct 2009 19:00:09 +0000 Subject: Add server ports to ServerInstance->ports, enable SSL on them using OnHookIO git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11810 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/socket.h | 30 ++++++++------------------- src/listensocket.cpp | 6 +++--- src/modules/extra/m_sqlite3.cpp | 2 +- src/modules/extra/m_ssl_gnutls.cpp | 15 +++++--------- src/modules/extra/m_ssl_openssl.cpp | 12 +++-------- src/modules/m_httpd.cpp | 3 ++- src/modules/m_spanningtree/override_stats.cpp | 17 --------------- src/modules/m_spanningtree/treesocket1.cpp | 23 +++++++++++++++++++- src/modules/m_spanningtree/utils.cpp | 20 +++++++----------- src/modules/m_spanningtree/utils.h | 9 ++------ src/socket.cpp | 4 ++-- src/stats.cpp | 4 ++-- 12 files changed, 59 insertions(+), 86 deletions(-) diff --git a/include/socket.h b/include/socket.h index 2941606a3..a42696379 100644 --- a/include/socket.h +++ b/include/socket.h @@ -124,8 +124,6 @@ namespace irc } } - - /** This class handles incoming connections on client ports. * It will create a new User for every valid connection * and assign it a file descriptor. @@ -133,13 +131,8 @@ namespace irc class CoreExport ListenSocketBase : public EventHandler { protected: - /** Socket description (shown in stats p) */ - std::string desc; - /** Raw address socket is bound to */ std::string bind_addr; - /** Port socket is bound to */ - int bind_port; /** Human-readable address/port socket is bound to */ std::string bind_desc; @@ -155,27 +148,21 @@ class CoreExport ListenSocketBase : public EventHandler static irc::sockets::sockaddrs server; public: + /** Socket type (client/server) */ + const std::string type; + /** Socket hook (plain/gnutls/openssl/zip) */ + const std::string hook; + /** Port socket is bound to */ + const int bind_port; /** Create a new listening socket */ - ListenSocketBase(int port, const std::string &addr); + ListenSocketBase(int port, const std::string &addr, const std::string &type, const std::string &hook); /** Handle an I/O event */ void HandleEvent(EventType et, int errornum = 0); /** Close the socket */ ~ListenSocketBase(); - /** Set descriptive text - */ - void SetDescription(const std::string &description) - { - desc = description; - } - /** Get description for socket - */ - const std::string& GetDescription() { return desc; } - /** Get port number for socket - */ - int GetPort() const { return bind_port; } /** Get IP address socket is bound to */ @@ -197,7 +184,8 @@ class CoreExport ClientListenSocket : public ListenSocketBase { virtual void OnAcceptReady(int fd); public: - ClientListenSocket(int port, const std::string &addr) : ListenSocketBase(port, addr) { } + ClientListenSocket(int port, const std::string &addr, const std::string &Type, const std::string &Hook) + : ListenSocketBase(port, addr, Type, Hook) { } }; #endif diff --git a/src/listensocket.cpp b/src/listensocket.cpp index c6b91a4f6..e0a18a043 100644 --- a/src/listensocket.cpp +++ b/src/listensocket.cpp @@ -21,7 +21,8 @@ irc::sockets::sockaddrs ListenSocketBase::client; irc::sockets::sockaddrs ListenSocketBase::server; -ListenSocketBase::ListenSocketBase(int port, const std::string &addr) : desc("plaintext") +ListenSocketBase::ListenSocketBase(int port, const std::string &addr, const std::string &Type, const std::string &Hook) + : type(Type), hook(Hook), bind_port(port) { irc::sockets::sockaddrs bind_to; @@ -30,13 +31,12 @@ ListenSocketBase::ListenSocketBase(int port, const std::string &addr) : desc("pl { // malformed address bind_addr = addr; - bind_port = port; bind_desc = addr + ":" + ConvToStr(port); this->fd = -1; } else { - irc::sockets::satoap(&bind_to, bind_addr, bind_port); + irc::sockets::satoap(&bind_to, bind_addr, port); bind_desc = irc::sockets::satouser(&bind_to); this->fd = irc::sockets::OpenTCPSocket(bind_addr); diff --git a/src/modules/extra/m_sqlite3.cpp b/src/modules/extra/m_sqlite3.cpp index 680053bf1..cb4fb0b5e 100644 --- a/src/modules/extra/m_sqlite3.cpp +++ b/src/modules/extra/m_sqlite3.cpp @@ -74,7 +74,7 @@ class SQLiteListener : public ListenSocketBase FileReader* index; public: - SQLiteListener(ModuleSQLite3* P, int port, const std::string &addr) : ListenSocketBase(port, addr), Parent(P) + SQLiteListener(ModuleSQLite3* P, int port, const std::string &addr) : ListenSocketBase(port, addr, "ITC", "none"), Parent(P) { uslen = sizeof(sock_us); if (getsockname(this->fd,(sockaddr*)&sock_us,&uslen)) diff --git a/src/modules/extra/m_ssl_gnutls.cpp b/src/modules/extra/m_ssl_gnutls.cpp index 3530b0e1f..fd572492a 100644 --- a/src/modules/extra/m_ssl_gnutls.cpp +++ b/src/modules/extra/m_ssl_gnutls.cpp @@ -122,8 +122,6 @@ class CommandStartTLS : public Command class ModuleSSLGnuTLS : public Module { - std::set listenports; - issl_session* sessions; gnutls_certificate_credentials x509_cred; @@ -171,21 +169,18 @@ class ModuleSSLGnuTLS : public Module { ConfigReader Conf; - listenports.clear(); sslports.clear(); for (size_t i = 0; i < ServerInstance->ports.size(); i++) { ListenSocketBase* port = ServerInstance->ports[i]; - std::string desc = port->GetDescription(); - if (desc != "gnutls") + if (port->hook != "gnutls") continue; - listenports.insert(port); - std::string portid = port->GetBindDesc(); - + const std::string& portid = port->GetBindDesc(); ServerInstance->Logs->Log("m_ssl_gnutls", DEFAULT, "m_ssl_gnutls.so: Enabling SSL for port %s", portid.c_str()); - if (port->GetIP() != "127.0.0.1") + + if (port->type == "clients" && port->GetIP() != "127.0.0.1") sslports.append(portid).append(";"); } @@ -345,7 +340,7 @@ class ModuleSSLGnuTLS : public Module void OnHookIO(StreamSocket* user, ListenSocketBase* lsb) { - if (!user->GetIOHook() && listenports.find(lsb) != listenports.end()) + if (!user->GetIOHook() && lsb->hook == "gnutls") { /* Hook the user with our module */ user->AddIOHook(this); diff --git a/src/modules/extra/m_ssl_openssl.cpp b/src/modules/extra/m_ssl_openssl.cpp index 8af930aa9..a348726e7 100644 --- a/src/modules/extra/m_ssl_openssl.cpp +++ b/src/modules/extra/m_ssl_openssl.cpp @@ -81,8 +81,6 @@ static int OnVerify(int preverify_ok, X509_STORE_CTX *ctx) class ModuleSSLOpenSSL : public Module { - std::set listenports; - int inbufsize; issl_session* sessions; @@ -135,7 +133,7 @@ class ModuleSSLOpenSSL : public Module void OnHookIO(StreamSocket* user, ListenSocketBase* lsb) { - if (!user->GetIOHook() && listenports.find(lsb) != listenports.end()) + if (!user->GetIOHook() && lsb->hook == "openssl") { /* Hook the user with our module */ user->AddIOHook(this); @@ -146,21 +144,17 @@ class ModuleSSLOpenSSL : public Module { ConfigReader Conf; - listenports.clear(); sslports.clear(); for (size_t i = 0; i < ServerInstance->ports.size(); i++) { ListenSocketBase* port = ServerInstance->ports[i]; - std::string desc = port->GetDescription(); - if (desc != "openssl") + if (port->hook != "openssl") continue; - listenports.insert(port); std::string portid = port->GetBindDesc(); - ServerInstance->Logs->Log("m_ssl_openssl", DEFAULT, "m_ssl_openssl.so: Enabling SSL for port %s", portid.c_str()); - if (port->GetIP() != "127.0.0.1") + if (port->type == "clients" && port->GetIP() != "127.0.0.1") sslports.append(portid).append(";"); } diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index 9d1acfbb9..88b635f6f 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -341,7 +341,8 @@ class HttpListener : public ListenSocketBase FileReader* index; public: - HttpListener(FileReader *idx, int port, const std::string &addr) : ListenSocketBase(port, addr) + HttpListener(FileReader *idx, int port, const std::string &addr) + : ListenSocketBase(port, addr, "httpd", "plaintext") { this->index = idx; } diff --git a/src/modules/m_spanningtree/override_stats.cpp b/src/modules/m_spanningtree/override_stats.cpp index 09d0a691d..f43aa8d3b 100644 --- a/src/modules/m_spanningtree/override_stats.cpp +++ b/src/modules/m_spanningtree/override_stats.cpp @@ -65,23 +65,6 @@ ModResult ModuleSpanningTree::OnStats(char statschar, User* user, string_list &r } return MOD_RES_DENY; } - - if (statschar == 'p') - { - /* show all server ports, after showing client ports. -- w00t */ - - for (unsigned int i = 0; i < Utils->Bindings.size(); i++) - { - std::string ip = Utils->Bindings[i]->GetIP(); - if (ip.empty()) - ip = "*"; - - std::string transport(Utils->Bindings[i]->Hook); - - results.push_back(ServerInstance->Config->ServerName + " 249 "+user->nick+" :" + ip + ":" + ConvToStr(Utils->Bindings[i]->GetPort())+ - " (server, " + transport + ")"); - } - } return MOD_RES_PASSTHRU; } diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 2c845bbd4..432ee2a09 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -38,9 +38,30 @@ TreeSocket::TreeSocket(SpanningTreeUtilities* Util, const std::string& shost, in capab_phase = 0; proto_version = 0; LinkState = CONNECTING; + if (!hook.empty()) + { + modulelist* ml = ServerInstance->Modules->FindInterface("BufferedSocketHook"); + if (ml) + { + for(modulelist::iterator i = ml->begin(); i != ml->end(); ++i) + { + std::string name = (**i).ModuleSourceFile; + int a = name.rfind('_'); + int b = name.rfind('.'); + name = name.substr(a, b-a-1); + if (name == hook) + { + AddIOHook(*i); + goto found; + } + } + } + SetError("Could not find hook '" + hook + "' for connection to " + ServerName); + return; + } +found: DoConnect(shost, iport, maxtime, bindto); Utils->timeoutlist[this] = std::pair(ServerName, maxtime); - // TODO AddIOHook using the given hook SendCapabilities(1); } diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp index 3b70fce31..09333fdd2 100644 --- a/src/modules/m_spanningtree/utils.cpp +++ b/src/modules/m_spanningtree/utils.cpp @@ -153,9 +153,10 @@ SpanningTreeUtilities::SpanningTreeUtilities(ModuleSpanningTree* C) : Creator(C) bool SpanningTreeUtilities::cull() { - for (unsigned int i = 0; i < Bindings.size(); i++) + for (unsigned int i = 0; i < ServerInstance->ports.size(); i++) { - Bindings[i]->cull(); + if (ServerInstance->ports[i]->type == "servers") + ServerInstance->ports[i]->cull(); } while (TreeRoot->ChildCount()) @@ -177,9 +178,10 @@ bool SpanningTreeUtilities::cull() SpanningTreeUtilities::~SpanningTreeUtilities() { - for (unsigned int i = 0; i < Bindings.size(); i++) + for (unsigned int i = 0; i < ServerInstance->ports.size(); i++) { - delete Bindings[i]; + if (ServerInstance->ports[i]->type == "servers") + delete ServerInstance->ports[i]; } delete TreeRoot; @@ -383,12 +385,6 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind) if (rebind) { - for (unsigned int i = 0; i < Bindings.size(); i++) - { - delete Bindings[i]; - } - Bindings.clear(); - for (int j = 0; j < Conf->Enumerate("bind"); j++) { std::string Type = Conf->ReadValue("bind","type",j); @@ -412,7 +408,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind) continue; } - Bindings.push_back(listener); + ServerInstance->ports.push_back(listener); } } } @@ -448,7 +444,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind) L->Fingerprint = Conf->ReadValue("link", "fingerprint", j); L->HiddenFromStats = Conf->ReadFlag("link", "statshidden", j); L->Timeout = Conf->ReadInteger("link", "timeout", j, true); - L->Hook = Conf->ReadValue("link", "transport", j); + L->Hook = Conf->ReadValue("link", "ssl", j); L->Bind = Conf->ReadValue("link", "bind", j); L->Hidden = Conf->ReadFlag("link", "hidden", j); diff --git a/src/modules/m_spanningtree/utils.h b/src/modules/m_spanningtree/utils.h index 7c15b2839..48677e57d 100644 --- a/src/modules/m_spanningtree/utils.h +++ b/src/modules/m_spanningtree/utils.h @@ -45,13 +45,11 @@ class ServerSocketListener : public ListenSocketBase SpanningTreeUtilities *Utils; public: - ServerSocketListener(SpanningTreeUtilities *u, int port, const std::string& addr, const std::string& hook) - : ListenSocketBase(port, addr), Utils(u), Hook(hook) + ServerSocketListener(SpanningTreeUtilities *u, int port, const std::string& addr, const std::string& Hook) + : ListenSocketBase(port, addr, "servers", Hook), Utils(u) { } - std::string Hook; - virtual void OnAcceptReady(int nfd); }; @@ -85,9 +83,6 @@ class SpanningTreeUtilities : public classbase */ bool quiet_bursts; - /** Socket bindings for listening sockets - */ - std::vector Bindings; /* Number of seconds that a server can go without ping * before opers are warned of high latency. */ diff --git a/src/socket.cpp b/src/socket.cpp index 9ec6c9982..74427d42a 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -144,16 +144,16 @@ int InspIRCd::BindPorts(FailedPortList &failed_ports) } if (!skip) { - ClientListenSocket *ll = new ClientListenSocket(portno, Addr); + ClientListenSocket *ll = new ClientListenSocket(portno, Addr, "clients", *Desc ? Desc : "plaintext"); if (ll->GetFd() > -1) { bound++; - ll->SetDescription(*Desc ? Desc : "plaintext"); ports.push_back(ll); } else { failed_ports.push_back(std::make_pair(bind_readable, strerror(errno))); + delete ll; } } } diff --git a/src/stats.cpp b/src/stats.cpp index 448d6deee..a512ccc38 100644 --- a/src/stats.cpp +++ b/src/stats.cpp @@ -50,8 +50,8 @@ void InspIRCd::DoStats(char statschar, User* user, string_list &results) if (ip.empty()) ip.assign("*"); - results.push_back(sn+" 249 "+user->nick+" :"+ ip + ":"+ConvToStr(this->ports[i]->GetPort())+" (client, " + - this->ports[i]->GetDescription() + ")"); + results.push_back(sn+" 249 "+user->nick+" :"+ ip + ":"+ConvToStr(ports[i]->bind_port)+ + " (" + ports[i]->type + ", " + ports[i]->hook + ")"); } } break; -- cgit v1.2.3