X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_jumpserver.cpp;h=e54d1efb22556ba7007c4bc1d4b2092811d92f2b;hb=b7716ed57704b2b2bcc665a590aecc8f02de631d;hp=50aa26c91555ed97f8699f6300fe6feefc1e1c47;hpb=fd0fa86da89ab4cefa778307088ef2552a05a170;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_jumpserver.cpp b/src/modules/m_jumpserver.cpp index 50aa26c91..e54d1efb2 100644 --- a/src/modules/m_jumpserver.cpp +++ b/src/modules/m_jumpserver.cpp @@ -20,6 +20,13 @@ #include "inspircd.h" +#include "modules/ssl.h" + +enum +{ + // From ircd-ratbox. + RPL_REDIR = 10 +}; /** Handle /JUMPSERVER */ @@ -30,15 +37,18 @@ class CommandJumpserver : public Command std::string redirect_to; std::string reason; int port; + int sslport; CommandJumpserver(Module* Creator) : Command(Creator, "JUMPSERVER", 0, 4) { - flags_needed = 'o'; syntax = "[ <+/-an> ]"; + flags_needed = 'o'; + syntax = "[ [:] <+/-an> ]"; port = 0; + sslport = 0; redirect_new_users = false; } - CmdResult Handle (const std::vector ¶meters, User *user) + CmdResult Handle(const std::vector& parameters, User* user) CXX11_OVERRIDE { int n_done = 0; reason = (parameters.size() < 4) ? "Please use this server/port instead" : parameters[3]; @@ -48,7 +58,7 @@ class CommandJumpserver : public Command std::string n_done_s; /* No parameters: jumpserver disabled */ - if (!parameters.size()) + if (parameters.empty()) { if (port) user->WriteNotice("*** Disabled jumpserver (previously set to '" + redirect_to + ":" + ConvToStr(port) + "')"); @@ -56,6 +66,7 @@ class CommandJumpserver : public Command user->WriteNotice("*** Jumpserver was not enabled."); port = 0; + sslport = 0; redirect_to.clear(); return CMD_SUCCESS; } @@ -88,7 +99,13 @@ class CommandJumpserver : public Command } } - if (!atoi(parameters[1].c_str())) + size_t delimpos = parameters[1].find(':'); + port = ConvToInt(parameters[1].substr(0, delimpos ? delimpos : std::string::npos)); + sslport = (delimpos == std::string::npos ? 0 : ConvToInt(parameters[1].substr(delimpos + 1))); + + if (parameters[1].find_first_not_of("0123456789:") != std::string::npos + || parameters[1].rfind(':') != delimpos + || port > 65535 || sslport > 65535) { user->WriteNotice("*** Invalid port number"); return CMD_FAILURE; @@ -97,12 +114,15 @@ class CommandJumpserver : public Command if (redirect_all_immediately) { /* Redirect everyone but the oper sending the command */ - for (LocalUserList::const_iterator i = ServerInstance->Users->local_users.begin(); i != ServerInstance->Users->local_users.end(); ++i) + const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers(); + for (UserManager::LocalList::const_iterator i = list.begin(); i != list.end(); ) { - User* t = *i; + // Quitting the user removes it from the list + LocalUser* t = *i; + ++i; if (!t->IsOper()) { - t->WriteNumeric(10, "%s %s %s :Please use this Server/Port instead", t->nick.c_str(), parameters[0].c_str(), parameters[1].c_str()); + t->WriteNumeric(RPL_REDIR, parameters[0], GetPort(t), "Please use this Server/Port instead"); ServerInstance->Users->QuitUser(t, reason); n_done++; } @@ -114,18 +134,23 @@ class CommandJumpserver : public Command } if (redirect_new_users) - { redirect_to = parameters[0]; - port = atoi(parameters[1].c_str()); - } - user->WriteNotice("*** Set jumpserver to server '" + parameters[0] + "' port '" + parameters[1] + "', flags '+" + + user->WriteNotice("*** Set jumpserver to server '" + parameters[0] + "' port '" + (port ? ConvToStr(port) : "Auto") + ", SSL " + (sslport ? ConvToStr(sslport) : "Auto") + "', flags '+" + (redirect_all_immediately ? "a" : "") + (redirect_new_users ? "n'" : "'") + (n_done ? " (" + n_done_s + "user(s) redirected): " : ": ") + reason); } return CMD_SUCCESS; } + + int GetPort(LocalUser* user) + { + int p = (SSLIOHook::IsSSL(&user->eh) ? sslport : port); + if (p == 0) + p = user->GetServerPort(); + return p; + } }; class ModuleJumpServer : public Module @@ -136,29 +161,23 @@ class ModuleJumpServer : public Module { } - void init() CXX11_OVERRIDE - { - ServerInstance->Modules->AddService(js); - Implementation eventlist[] = { I_OnUserRegister, I_OnRehash }; - ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); - } - ModResult OnUserRegister(LocalUser* user) CXX11_OVERRIDE { - if (js.port && js.redirect_new_users) + if (js.redirect_new_users) { - user->WriteNumeric(10, "%s %s %d :Please use this Server/Port instead", - user->nick.c_str(), js.redirect_to.c_str(), js.port); + int port = js.GetPort(user); + user->WriteNumeric(RPL_REDIR, js.redirect_to, port, "Please use this Server/Port instead"); ServerInstance->Users->QuitUser(user, js.reason); - return MOD_RES_PASSTHRU; + return MOD_RES_DENY; } return MOD_RES_PASSTHRU; } - void OnRehash(User* user) CXX11_OVERRIDE + void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE { // Emergency way to unlock - if (!user) js.redirect_new_users = false; + if (!status.srcuser) + js.redirect_new_users = false; } Version GetVersion() CXX11_OVERRIDE