X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_connflood.cpp;h=f77691e3276a8efe2f6649b4da04d31a588b79fc;hb=a5d110282a864fd2e91b51ce360a977cd0643657;hp=71e52fd01ad8b1e134968d32567b2b1031deebc8;hpb=bab14f0dd2345c9d7dcbc47c918563709e1ac094;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_connflood.cpp b/src/modules/m_connflood.cpp index 71e52fd01..f77691e32 100644 --- a/src/modules/m_connflood.cpp +++ b/src/modules/m_connflood.cpp @@ -1 +1,125 @@ -/* +------------------------------------+ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * * InspIRCd: (C) 2002-2007 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see * the file COPYING for details. * * --------------------------------------------------- */ #include "inspircd.h" #include "users.h" #include "modules.h" /* $ModDesc: Connection throttle */ int conns = 0, throttled = 0; class ModuleConnFlood : public Module { private: int seconds, maxconns, timeout, boot_wait; time_t first; std::string quitmsg; ConfigReader* conf; public: ModuleConnFlood(InspIRCd* Me) : Module(Me) { InitConf(); } virtual ~ModuleConnFlood() { } virtual Version GetVersion() { return Version(1,1,0,0,VF_VENDOR,API_VERSION); } void Implements(char* List) { List[I_OnRehash] = List[I_OnUserRegister] = 1; } void InitConf() { /* read configuration variables */ conf = new ConfigReader(ServerInstance); /* 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 = ServerInstance->Time(); } virtual int OnUserRegister(userrec* user) { time_t next = ServerInstance->Time(); if ((ServerInstance->startup_time + boot_wait) > next) return 0; /* 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; ServerInstance->WriteOpers("*** Connection throttle deactivated"); return 0; } userrec::QuitUser(ServerInstance, user, quitmsg); return 1; } if (tdiff <= seconds) { if (conns >= maxconns) { throttled = 1; ServerInstance->WriteOpers("*** Connection throttle activated"); userrec::QuitUser(ServerInstance, user, quitmsg); return 1; } } else { conns = 1; first = next; } return 0; } virtual void OnRehash(userrec* user, const std::string ¶meter) { InitConf(); } }; MODULE_INIT(ModuleConnFlood) \ No newline at end of file +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2007 Robin Burchell + * Copyright (C) 2006 Craig Edwards + * + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "inspircd.h" + +/* $ModDesc: Connection throttle */ + +class ModuleConnFlood : public Module +{ +private: + int seconds, timeout, boot_wait; + unsigned int conns; + unsigned int maxconns; + bool throttled; + time_t first; + std::string quitmsg; + +public: + ModuleConnFlood() + : conns(0), throttled(false) + { + } + + void init() + { + InitConf(); + Implementation eventlist[] = { I_OnRehash, I_OnUserRegister }; + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); + } + + virtual Version GetVersion() + { + return Version("Connection throttle", VF_VENDOR); + } + + void InitConf() + { + /* read configuration variables */ + ConfigTag* tag = ServerInstance->Config->ConfValue("connflood"); + /* throttle configuration */ + seconds = tag->getInt("seconds"); + maxconns = tag->getInt("maxconns"); + timeout = tag->getInt("timeout"); + quitmsg = tag->getString("quitmsg"); + + /* seconds to wait when the server just booted */ + boot_wait = tag->getInt("bootwait"); + + first = ServerInstance->Time(); + } + + virtual ModResult OnUserRegister(LocalUser* user) + { + if (user->exempt) + return MOD_RES_PASSTHRU; + + time_t next = ServerInstance->Time(); + + if ((ServerInstance->startup_time + boot_wait) > next) + return MOD_RES_PASSTHRU; + + /* time difference between first and latest connection */ + time_t tdiff = next - first; + + /* increase connection count */ + conns++; + + if (throttled) + { + if (tdiff > seconds + timeout) + { + /* expire throttle */ + throttled = false; + ServerInstance->SNO->WriteGlobalSno('a', "Connection throttle deactivated"); + return MOD_RES_PASSTHRU; + } + + ServerInstance->Users->QuitUser(user, quitmsg); + return MOD_RES_DENY; + } + + if (tdiff <= seconds) + { + if (conns >= maxconns) + { + throttled = true; + ServerInstance->SNO->WriteGlobalSno('a', "Connection throttle activated"); + ServerInstance->Users->QuitUser(user, quitmsg); + return MOD_RES_DENY; + } + } + else + { + conns = 1; + first = next; + } + return MOD_RES_PASSTHRU; + } + + virtual void OnRehash(User* user) + { + InitConf(); + } + +}; + +MODULE_INIT(ModuleConnFlood)