X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_passforward.cpp;h=e373068b859f4762577811098fb380a2bd7dc6af;hb=HEAD;hp=7f3cb6421ff4dd668f7f998dae204917dfc33d30;hpb=1031f333332cf1b09db4fd632f141143ee637c34;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_passforward.cpp b/src/modules/m_passforward.cpp index 7f3cb6421..e373068b8 100644 --- a/src/modules/m_passforward.cpp +++ b/src/modules/m_passforward.cpp @@ -1,6 +1,12 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2019 linuxdaemon + * Copyright (C) 2014 Googolplexed + * Copyright (C) 2013, 2018, 2020 Sadie Powell + * Copyright (C) 2012-2014 Attila Molnar + * Copyright (C) 2012 Robby + * Copyright (C) 2012 Boleslaw Tokarski * Copyright (C) 2010 Daniel De Graaf * * This file is part of InspIRCd. InspIRCd is free software: you can @@ -18,28 +24,24 @@ #include "inspircd.h" +#include "modules/account.h" class ModulePassForward : public Module { std::string nickrequired, forwardmsg, forwardcmd; public: - void init() CXX11_OVERRIDE - { - OnRehash(NULL); - } - Version GetVersion() CXX11_OVERRIDE { - return Version("Sends server password to NickServ", VF_VENDOR); + return Version("Allows the /PASS password to be forwarded to a services pseudoclient such as NickServ.", VF_VENDOR); } - void OnRehash(User* user) CXX11_OVERRIDE + void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE { ConfigTag* tag = ServerInstance->Config->ConfValue("passforward"); nickrequired = tag->getString("nick", "NickServ"); forwardmsg = tag->getString("forwardmsg", "NOTICE $nick :*** Forwarding PASS to $nickrequired"); - forwardcmd = tag->getString("cmd", "PRIVMSG $nickrequired :IDENTIFY $pass"); + forwardcmd = tag->getString("cmd", "SQUERY $nickrequired :IDENTIFY $pass", 1); } void FormatStr(std::string& result, const std::string& format, const LocalUser* user) @@ -49,22 +51,22 @@ class ModulePassForward : public Module char c = format[i]; if (c == '$') { - if (format.substr(i, 13) == "$nickrequired") + if (!format.compare(i, 13, "$nickrequired", 13)) { result.append(nickrequired); i += 12; } - else if (format.substr(i, 5) == "$nick") + else if (!format.compare(i, 5, "$nick", 5)) { result.append(user->nick); i += 4; } - else if (format.substr(i, 5) == "$user") + else if (!format.compare(i, 5, "$user", 5)) { result.append(user->ident); i += 4; } - else if (format.substr(i,5) == "$pass") + else if (!format.compare(i, 5, "$pass", 5)) { result.append(user->password); i += 4; @@ -83,21 +85,35 @@ class ModulePassForward : public Module if (!user || user->password.empty()) return; + // If the connect class requires a password, don't forward it + if (!user->MyClass->config->getString("password").empty()) + return; + + AccountExtItem* actext = GetAccountExtItem(); + if (actext && actext->get(user)) + { + // User is logged in already (probably via SASL) don't forward the password + return; + } + if (!nickrequired.empty()) { /* Check if nick exists and its server is ulined */ User* u = ServerInstance->FindNick(nickrequired); - if (!u || !ServerInstance->ULine(u->server)) + if (!u || !u->server->IsULine()) return; } std::string tmp; - FormatStr(tmp,forwardmsg, user); - user->WriteServ(tmp); + if (!forwardmsg.empty()) + { + FormatStr(tmp, forwardmsg, user); + ServerInstance->Parser.ProcessBuffer(user, tmp); + tmp.clear(); + } - tmp.clear(); - FormatStr(tmp,forwardcmd, user); - ServerInstance->Parser->ProcessBuffer(tmp,user); + FormatStr(tmp, forwardcmd, user); + ServerInstance->Parser.ProcessBuffer(user, tmp); } };