]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_connflood.cpp
519088324868a5aaf1bea41f82f465f4005dc5cf
[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 "users.h"
15 #include "modules.h"
16
17 #include "inspircd.h"
18
19 /* $ModDesc: Connection throttle */
20
21 int conns = 0, throttled = 0;
22
23 class ModuleConnFlood : public Module
24 {
25 private:
26         int seconds, maxconns, timeout, boot_wait;
27         time_t first;
28         std::string quitmsg;
29
30         ConfigReader* conf;
31         
32
33 public:
34         ModuleConnFlood(InspIRCd* Me) : Module::Module(Me)
35         {
36                 
37                 InitConf();
38         }
39
40         virtual ~ModuleConnFlood()
41         {
42         }
43
44         virtual Version GetVersion()
45         {
46                 return Version(1,1,0,0,VF_VENDOR,API_VERSION);
47         }
48
49         void Implements(char* List)
50         {
51                 List[I_OnRehash] = List[I_OnUserRegister] = 1;
52         }
53    
54         void InitConf()
55         {
56                 /* read configuration variables */
57                 conf = new ConfigReader(ServerInstance);
58                 /* throttle configuration */
59                 seconds = conf->ReadInteger("connflood", "seconds", 0, true);
60                 maxconns = conf->ReadInteger("connflood", "maxconns", 0, true);
61                 timeout = conf->ReadInteger("connflood", "timeout", 0, true);
62                 quitmsg = conf->ReadValue("connflood", "quitmsg", 0);
63
64                 /* seconds to wait when the server just booted */
65                 boot_wait = conf->ReadInteger("connflood", "bootwait", 0, true);
66
67                 first = ServerInstance->Time();
68         }
69  
70         virtual int OnUserRegister(userrec* user)
71         {
72                 time_t next = ServerInstance->Time();
73                 if (!first)
74                         first = next - boot_wait;
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(const std::string &parameter)
114         {
115                 InitConf();
116         }
117
118 };
119
120
121 class ModuleConnFloodFactory : public ModuleFactory
122 {
123 public:
124         ModuleConnFloodFactory()
125         {
126         }
127
128         ~ModuleConnFloodFactory()
129         {
130         }
131     
132         virtual Module * CreateModule(InspIRCd* Me)
133         {
134                 return new ModuleConnFlood(Me);
135         }
136 };
137
138
139 extern "C" void * init_module( void )
140 {
141         return new ModuleConnFloodFactory;
142 }