diff options
-rw-r--r-- | docs/inspircd.conf.example | 7 | ||||
-rw-r--r-- | src/modules/m_cloaking.cpp | 17 | ||||
-rw-r--r-- | src/modules/m_conn_umodes.cpp | 137 |
3 files changed, 145 insertions, 16 deletions
diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example index 2b577ee5c..2e204b653 100644 --- a/docs/inspircd.conf.example +++ b/docs/inspircd.conf.example @@ -874,6 +874,13 @@ #<module name="m_conn_lusers.so"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# +# Conn-Usermodes: Set modes on users when they connect +# When this module is loaded <connect:allow> tags may have an optional +# modes="" value, which contains modes to add or remove from users +# when they connect to the server. +#<module name="m_conn_umodes.so"> + +#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Conn-Wait-for-Pong: Don't let a user connect until they PONG #<module name="m_conn_waitpong.so"> # diff --git a/src/modules/m_cloaking.cpp b/src/modules/m_cloaking.cpp index f26e16e0e..60f62b099 100644 --- a/src/modules/m_cloaking.cpp +++ b/src/modules/m_cloaking.cpp @@ -434,23 +434,8 @@ class ModuleCloaking : public Module void Implements(char* List) { - List[I_OnRehash] = List[I_OnUserConnect] = 1; + List[I_OnRehash] = 1; } - - virtual void OnUserConnect(userrec* user) - { - // Heres the weird bit. When a user connects we must set +x on them, so - // we're going to use the SendMode method of the Server class to send - // the mode to the client. This is basically the same as sending an - // SAMODE in unreal. Note that to the user it will appear as if they set - // the mode on themselves. - - const char* modes[2]; // only two parameters - modes[0] = user->nick; // first parameter is the nick - modes[1] = "+x"; // second parameter is the mode - ServerInstance->SendMode(modes,2,user); // send these, forming the command "MODE <nick> +x" - } - }; // stuff down here is the module-factory stuff. For basic modules you can ignore this. diff --git a/src/modules/m_conn_umodes.cpp b/src/modules/m_conn_umodes.cpp new file mode 100644 index 000000000..8c962ae57 --- /dev/null +++ b/src/modules/m_conn_umodes.cpp @@ -0,0 +1,137 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. + * E-mail: + * <brain@chatspike.net> + * <Craig@chatspike.net> + * + * Written by Craig Edwards, Craig McLure, and others. + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +using namespace std; + +#include <stdio.h> +#include <vector> +#include "users.h" +#include "channels.h" +#include "inspircd.h" +#include "modules.h" +#include "wildcard.h" + +/* $ModDesc: Sets (and unsets) modes on users when they connect */ + +class ModuleModesOnConnect : public Module +{ + private: + + ConfigReader *Conf; + + public: + ModuleModesOnConnect(InspIRCd* Me) + : Module::Module(Me) + { + + Conf = new ConfigReader(ServerInstance); + } + + void Implements(char* List) + { + List[I_OnPostConnect] = List[I_OnRehash] = 1; + } + + virtual void OnRehash(const std::string ¶meter) + { + DELETE(Conf); + Conf = new ConfigReader(ServerInstance); + } + + virtual ~ModuleModesOnConnect() + { + DELETE(Conf); + } + + virtual Version GetVersion() + { + return Version(1,0,0,1,VF_VENDOR); + } + + virtual void OnPostConnect(userrec* user) + { + if (!IS_LOCAL(user)) + return; + + ServerInstance->Log(DEBUG,"Post connect for mode setting"); + for (int j = 0; j < Conf->Enumerate("connect"); j++) + { + std::string hostn = Conf->ReadValue("connect","allow",j); + if ((match(user->GetIPString(),hostn.c_str(),true)) || (match(user->host,hostn.c_str()))) + { + ServerInstance->Log(DEBUG,"Found matching connect block '%s'",hostn.c_str()); + std::string ThisModes = Conf->ReadValue("connect","modes",j); + if (ThisModes != "") + { + std::string buf; + stringstream ss(ThisModes); + + vector<string> tokens; + + // split ThisOperModes into modes and mode params + while (ss >> buf) + tokens.push_back(buf); + + int size = tokens.size() + 1; + const char* modes[size]; + modes[0] = user->nick; + modes[1] = tokens[0].c_str(); + + if (tokens.size() > 1) + { + // process mode params + int i = 2; + for (unsigned int k = 1; k < tokens.size(); k++) + { + modes[i] = tokens[k].c_str(); + i++; + } + } + + ServerInstance->SendMode(modes, size, user); + } + break; + } + } + } +}; + +// stuff down here is the module-factory stuff. For basic modules you can ignore this. + +class ModuleModesOnConnectFactory : public ModuleFactory +{ + public: + ModuleModesOnConnectFactory() + { + } + + ~ModuleModesOnConnectFactory() + { + } + + virtual Module * CreateModule(InspIRCd* Me) + { + return new ModuleModesOnConnect(Me); + } + +}; + + +extern "C" void * init_module( void ) +{ + return new ModuleModesOnConnectFactory; +} + |