]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_connflood.cpp
d6d9eee0fc0be984539026f77ff95f964bcdf790
[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
16 /* $ModDesc: Connection throttle */
17
18 int conns = 0, throttled = 0;
19
20 class ModuleConnFlood : public Module
21 {
22 private:
23         int seconds, maxconns, timeout, boot_wait;
24         time_t first;
25         std::string quitmsg;
26
27         ConfigReader* conf;
28         
29
30 public:
31         ModuleConnFlood(InspIRCd* Me) : Module(Me)
32         {
33                 
34                 InitConf();
35         }
36
37         virtual ~ModuleConnFlood()
38         {
39         }
40
41         virtual Version GetVersion()
42         {
43                 return Version(1,1,0,0,VF_VENDOR,API_VERSION);
44         }
45
46         void Implements(char* List)
47         {
48                 List[I_OnRehash] = List[I_OnUserRegister] = 1;
49         }
50    
51         void InitConf()
52         {
53                 /* read configuration variables */
54                 conf = new ConfigReader(ServerInstance);
55                 /* throttle configuration */
56                 seconds = conf->ReadInteger("connflood", "seconds", 0, true);
57                 maxconns = conf->ReadInteger("connflood", "maxconns", 0, true);
58                 timeout = conf->ReadInteger("connflood", "timeout", 0, true);
59                 quitmsg = conf->ReadValue("connflood", "quitmsg", 0);
60
61                 /* seconds to wait when the server just booted */
62                 boot_wait = conf->ReadInteger("connflood", "bootwait", 0, true);
63
64                 first = ServerInstance->Time();
65         }
66  
67         virtual int OnUserRegister(User* user)
68         {
69                 time_t next = ServerInstance->Time();
70                 
71                 if ((ServerInstance->startup_time + boot_wait) > next)
72                         return 0;
73                 
74                 /* time difference between first and latest connection */
75                 time_t tdiff = next - first;
76
77                 /* increase connection count */
78                 conns++;
79
80                 if (throttled == 1)
81                 {
82                         if (tdiff > seconds + timeout)
83                         {
84                                 /* expire throttle */
85                                 throttled = 0;
86                                 ServerInstance->WriteOpers("*** Connection throttle deactivated");
87                                 return 0;
88                         }
89                         User::QuitUser(ServerInstance, user, quitmsg);
90                         return 1;
91                 }
92
93                 if (tdiff <= seconds)
94                 {
95                         if (conns >= maxconns)
96                         {
97                                 throttled = 1;
98                                 ServerInstance->WriteOpers("*** Connection throttle activated");
99                                 User::QuitUser(ServerInstance, user, quitmsg);
100                                 return 1;
101                         }
102                 }
103                 else
104                 {
105                         conns = 1;
106                         first = next;
107                 }
108                 return 0;
109         }
110
111         virtual void OnRehash(User* user, const std::string &parameter)
112         {
113                 InitConf();
114         }
115
116 };
117
118 MODULE_INIT(ModuleConnFlood)