]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_connflood.cpp
OOPS! We try again, since I'm smoking craq. LF is 0x0a NOT CR.
[user/henk/code/inspircd.git] / src / modules / m_connflood.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
6  * See: http://www.inspircd.org/wiki/index.php/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 #include "inspircd.h"
15 #include "users.h"
16 #include "modules.h"
17
18 /* $ModDesc: Connection throttle */
19
20 int conns = 0, throttled = 0;
21
22 class ModuleConnFlood : public Module
23 {
24 private:
25         int seconds, maxconns, timeout, boot_wait;
26         time_t first;
27         std::string quitmsg;
28
29         ConfigReader* conf;
30         
31
32 public:
33         ModuleConnFlood(InspIRCd* Me) : Module(Me)
34         {
35                 
36                 InitConf();
37         }
38
39         virtual ~ModuleConnFlood()
40         {
41         }
42
43         virtual Version GetVersion()
44         {
45                 return Version(1,1,0,0,VF_VENDOR,API_VERSION);
46         }
47
48         void Implements(char* List)
49         {
50                 List[I_OnRehash] = List[I_OnUserRegister] = 1;
51         }
52    
53         void InitConf()
54         {
55                 /* read configuration variables */
56                 conf = new ConfigReader(ServerInstance);
57                 /* throttle configuration */
58                 seconds = conf->ReadInteger("connflood", "seconds", 0, true);
59                 maxconns = conf->ReadInteger("connflood", "maxconns", 0, true);
60                 timeout = conf->ReadInteger("connflood", "timeout", 0, true);
61                 quitmsg = conf->ReadValue("connflood", "quitmsg", 0);
62
63                 /* seconds to wait when the server just booted */
64                 boot_wait = conf->ReadInteger("connflood", "bootwait", 0, true);
65
66                 first = ServerInstance->Time();
67         }
68  
69         virtual int OnUserRegister(userrec* user)
70         {
71                 time_t next = ServerInstance->Time();
72                 
73                 if ((ServerInstance->startup_time + boot_wait) > next)
74                         return 0;
75                 
76                 /* time difference between first and latest connection */
77                 time_t tdiff = next - first;
78
79                 /* increase connection count */
80                 conns++;
81
82                 if (throttled == 1)
83                 {
84                         if (tdiff > seconds + timeout)
85                         {
86                                 /* expire throttle */
87                                 throttled = 0;
88                                 ServerInstance->WriteOpers("*** Connection throttle deactivated");
89                                 return 0;
90                         }
91                         userrec::QuitUser(ServerInstance, user, quitmsg);
92                         return 1;
93                 }
94
95                 if (tdiff <= seconds)
96                 {
97                         if (conns >= maxconns)
98                         {
99                                 throttled = 1;
100                                 ServerInstance->WriteOpers("*** Connection throttle activated");
101                                 userrec::QuitUser(ServerInstance, user, quitmsg);
102                                 return 1;
103                         }
104                 }
105                 else
106                 {
107                         conns = 1;
108                         first = next;
109                 }
110                 return 0;
111         }
112
113         virtual void OnRehash(userrec* user, const std::string &parameter)
114         {
115                 InitConf();
116         }
117
118 };
119
120 MODULE_INIT(ModuleConnFlood)