From 2e328fd5fae4c4a121d170d06432da96dcd72b0f Mon Sep 17 00:00:00 2001 From: brain Date: Mon, 3 Jul 2006 15:34:06 +0000 Subject: Add m_connflood, pippijn's connect throttle module (now we are offering another paid unreal feature for nothing :p) git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4109 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_connflood.cpp | 147 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 src/modules/m_connflood.cpp diff --git a/src/modules/m_connflood.cpp b/src/modules/m_connflood.cpp new file mode 100644 index 000000000..8df8ecefc --- /dev/null +++ b/src/modules/m_connflood.cpp @@ -0,0 +1,147 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. + * E-mail: + * + * + * + * --- This module contributed by pippijn --- + * + * 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 "users.h" +#include "modules.h" + +/* $ModDesc: Connection throttle */ + +int conns = 0, throttled = 0; +extern time_t TIME; + +class ModuleConnFlood : public Module +{ +private: + int seconds, maxconns, timeout, boot_wait; + time_t first; + std::string quitmsg; + + ConfigReader* conf; + Server *Srv; + +public: + ModuleConnFlood(Server* Me) : Module::Module(Me) + { + Srv = Me; + InitConf(); + } + + virtual ~ModuleConnFlood() + { + } + + virtual Version GetVersion() + { + return Version(1,0,0,0,0); + } + + void Implements(char* List) + { + List[I_OnRehash] = List[I_OnUserRegister] = 1; + } + + void InitConf() + { + /* read configuration variables */ + conf = new ConfigReader; + /* throttle configuration */ + seconds = conf->ReadInteger("connflood", "seconds", 0, true); + maxconns = conf->ReadInteger("connflood", "maxconns", 0, true); + timeout = conf->ReadInteger("connflood", "timeout", 0, true); + quitmsg = conf->ReadValue("connflood", "quitmsg", 0); + + /* seconds to wait when the server just booted */ + boot_wait = conf->ReadInteger("connflood", "bootwait", 0, true); + + first = TIME; + } + + virtual void OnUserRegister(userrec* user) + { + time_t next = TIME; + if (!first) + first = next - boot_wait; + + /* time difference between first and latest connection */ + time_t tdiff = next - first; + + /* increase connection count */ + conns++; + + if (throttled == 1) + { + if (tdiff > seconds + timeout) + { + /* expire throttle */ + throttled = 0; + Srv->SendOpers("*** Connection throttle deactivated"); + return; + } + Srv->QuitUser(user, quitmsg); + return; + } + + if (tdiff <= seconds) + { + if (conns >= maxconns) + { + throttled = 1; + Srv->SendOpers("*** Connection throttle activated"); + Srv->QuitUser(user, quitmsg); + return; + } + } + else + { + conns = 1; + first = next; + } + } + + virtual void OnRehash(const std::string ¶meter) + { + InitConf(); + } + +}; + + +class ModuleConnFloodFactory : public ModuleFactory +{ +public: + ModuleConnFloodFactory() + { + } + + ~ModuleConnFloodFactory() + { + } + + virtual Module * CreateModule(Server* Me) + { + return new ModuleConnFlood(Me); + } +}; + + +extern "C" void * init_module( void ) +{ + return new ModuleConnFloodFactory; +} -- cgit v1.2.3