]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_connflood.cpp
c834605b0622419790586676f3269c1ad03be4ef
[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                 
74                 if ((ServerInstance->startup_time + boot_wait) > next)
75                         return 0;
76                 
77                 /* time difference between first and latest connection */
78                 time_t tdiff = next - first;
79
80                 /* increase connection count */
81                 conns++;
82
83                 if (throttled == 1)
84                 {
85                         if (tdiff > seconds + timeout)
86                         {
87                                 /* expire throttle */
88                                 throttled = 0;
89                                 ServerInstance->WriteOpers("*** Connection throttle deactivated");
90                                 return 0;
91                         }
92                         userrec::QuitUser(ServerInstance, user, quitmsg);
93                         return 1;
94                 }
95
96                 if (tdiff <= seconds)
97                 {
98                         if (conns >= maxconns)
99                         {
100                                 throttled = 1;
101                                 ServerInstance->WriteOpers("*** Connection throttle activated");
102                                 userrec::QuitUser(ServerInstance, user, quitmsg);
103                                 return 1;
104                         }
105                 }
106                 else
107                 {
108                         conns = 1;
109                         first = next;
110                 }
111                 return 0;
112         }
113
114         virtual void OnRehash(userrec* user, const std::string &parameter)
115         {
116                 InitConf();
117         }
118
119 };
120
121
122 class ModuleConnFloodFactory : public ModuleFactory
123 {
124 public:
125         ModuleConnFloodFactory()
126         {
127         }
128
129         ~ModuleConnFloodFactory()
130         {
131         }
132     
133         virtual Module * CreateModule(InspIRCd* Me)
134         {
135                 return new ModuleConnFlood(Me);
136         }
137 };
138
139
140 extern "C" void * init_module( void )
141 {
142         return new ModuleConnFloodFactory;
143 }