diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-01-07 17:32:10 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-01-07 17:32:10 +0000 |
commit | ae61237cdc5e4d94681fc801d3076d202825ff45 (patch) | |
tree | 39a363278ec332b8f11f5728e14d9922aa436a9e /src | |
parent | 9bac1580319dacbb95ac22b906d3ee949e23db41 (diff) |
Add m_passforward, based on m_conn_pass_nickserv by satmd
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12244 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/m_passforward.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/modules/m_passforward.cpp b/src/modules/m_passforward.cpp new file mode 100644 index 000000000..a1993c25a --- /dev/null +++ b/src/modules/m_passforward.cpp @@ -0,0 +1,97 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2010 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#include "inspircd.h" + +class ModulePassForward : public Module +{ + private: + std::string nickrequired, forwardmsg, forwardcmd; + + public: + ModulePassForward() + { + OnRehash(NULL); + Implementation eventlist[] = { I_OnPostConnect, I_OnRehash }; + ServerInstance->Modules->Attach(eventlist, this, 2); + } + + Version GetVersion() + { + return Version("Sends server password to NickServ", VF_VENDOR); + } + + void OnRehash(User* user) + { + ConfigReader Conf; + nickrequired = Conf.ReadValue("passforward", "nick", "NickServ", 0); + forwardmsg = Conf.ReadValue("passforward", "forwardmsg", "NOTICE $nick :*** Forwarding PASS to $nickrequired", 0); + forwardcmd = Conf.ReadValue("passforward", "cmd", "PRIVMSG $nickrequired :IDENTIFY $pass", 0); + } + + void FormatStr(std::string& result, const std::string& format, const std::string &nick, const std::string &pass) + { + for (unsigned int i = 0; i < format.length(); i++) + { + char c = format[i]; + if (c == '$') + { + if (format.substr(i, 13) == "$nickrequired") + { + result.append(nickrequired); + i += 12; + } + else if (format.substr(i, 5) == "$nick") + { + result.append(nick); + i += 4; + } + else if (format.substr(i,5) == "$pass") + { + result.append(pass); + i += 4; + } + else + result.push_back(c); + } + else + result.push_back(c); + } + } + + virtual void OnPostConnect(User* ruser) + { + LocalUser* user = IS_LOCAL(ruser); + if (!user || user->password.empty()) + return; + + if (!nickrequired.empty()) + { + /* Check if nick exists and its server is ulined */ + User* u = ServerInstance->FindNick(nickrequired.c_str()); + if (!u || !ServerInstance->ULine(u->server)) + return; + } + + std::string tmp; + FormatStr(tmp,forwardmsg, user->nick, user->password); + user->WriteServ(tmp); + + tmp.clear(); + FormatStr(tmp,forwardcmd, user->nick, user->password); + ServerInstance->Parser->ProcessBuffer(tmp,user); + } +}; + +MODULE_INIT(ModulePassForward) + |