]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_connflood.cpp
Set EOL to WINDOWS-style always for Visual Studio files.
[user/henk/code/inspircd.git] / src / modules / m_connflood.cpp
1 /*       +------------------------------------+\r *       | Inspire Internet Relay Chat Daemon |\r *       +------------------------------------+\r *\r *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r *            the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#include "inspircd.h"\r#include "users.h"\r#include "modules.h"\r\r/* $ModDesc: Connection throttle */\r\rint conns = 0, throttled = 0;\r\rclass ModuleConnFlood : public Module\r{\rprivate:\r        int seconds, maxconns, timeout, boot_wait;\r     time_t first;\r  std::string quitmsg;\r\r  ConfigReader* conf;\r    \r\rpublic:\r      ModuleConnFlood(InspIRCd* Me) : Module(Me)\r     {\r              \r               InitConf();\r    }\r\r     virtual ~ModuleConnFlood()\r     {\r      }\r\r     virtual Version GetVersion()\r   {\r              return Version(1,1,0,0,VF_VENDOR,API_VERSION);\r }\r\r     void Implements(char* List)\r    {\r              List[I_OnRehash] = List[I_OnUserRegister] = 1;\r }\r   \r  void InitConf()\r        {\r              /* read configuration variables */\r             conf = new ConfigReader(ServerInstance);\r               /* throttle configuration */\r           seconds = conf->ReadInteger("connflood", "seconds", 0, true);\r          maxconns = conf->ReadInteger("connflood", "maxconns", 0, true);\r                timeout = conf->ReadInteger("connflood", "timeout", 0, true);\r          quitmsg = conf->ReadValue("connflood", "quitmsg", 0);\r\r         /* seconds to wait when the server just booted */\r              boot_wait = conf->ReadInteger("connflood", "bootwait", 0, true);\r\r              first = ServerInstance->Time();\r        }\r \r    virtual int OnUserRegister(userrec* user)\r      {\r              time_t next = ServerInstance->Time();\r          \r               if ((ServerInstance->startup_time + boot_wait) > next)\r                 return 0;\r              \r               /* time difference between first and latest connection */\r              time_t tdiff = next - first;\r\r          /* increase connection count */\r                conns++;\r\r              if (throttled == 1)\r            {\r                      if (tdiff > seconds + timeout)\r                 {\r                              /* expire throttle */\r                          throttled = 0;\r                         ServerInstance->WriteOpers("*** Connection throttle deactivated");\r                             return 0;\r                      }\r                      userrec::QuitUser(ServerInstance, user, quitmsg);\r                      return 1;\r              }\r\r             if (tdiff <= seconds)\r          {\r                      if (conns >= maxconns)\r                 {\r                              throttled = 1;\r                         ServerInstance->WriteOpers("*** Connection throttle activated");\r                               userrec::QuitUser(ServerInstance, user, quitmsg);\r                              return 1;\r                      }\r              }\r              else\r           {\r                      conns = 1;\r                     first = next;\r          }\r              return 0;\r      }\r\r     virtual void OnRehash(userrec* user, const std::string &parameter)\r     {\r              InitConf();\r    }\r\r};\r\rMODULE_INIT(ModuleConnFlood)\r