]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_connflood.cpp
Document TimerManager class
[user/henk/code/inspircd.git] / src / modules / m_connflood.cpp
1 /*   +------------------------------------+
2  *   | Inspire Internet Relay Chat Daemon |
3  *   +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                    E-mail:
7  *             <brain@chatspike.net>
8  *             <Craig@chatspike.net>
9  *
10  *     --- This module contributed by pippijn ---
11  * 
12  * Written by Craig Edwards, Craig McLure, and others.
13  * This program is free but copyrighted software; see
14  * the file COPYING for details.
15  *
16  * ---------------------------------------------------
17  */
18
19 using namespace std;
20
21 #include "users.h"
22 #include "modules.h"
23 #include "helperfuncs.h"
24 #include "inspircd.h"
25
26 /* $ModDesc: Connection throttle */
27
28 int conns = 0, throttled = 0;
29
30 class ModuleConnFlood : public Module
31 {
32 private:
33         int seconds, maxconns, timeout, boot_wait;
34         time_t first;
35         std::string quitmsg;
36
37         ConfigReader* conf;
38         
39
40 public:
41         ModuleConnFlood(InspIRCd* Me) : Module::Module(Me)
42         {
43                 
44                 InitConf();
45         }
46
47         virtual ~ModuleConnFlood()
48         {
49         }
50
51         virtual Version GetVersion()
52         {
53                 return Version(1,0,0,0,0);
54         }
55
56         void Implements(char* List)
57         {
58                 List[I_OnRehash] = List[I_OnUserRegister] = 1;
59         }
60    
61         void InitConf()
62         {
63                 /* read configuration variables */
64                 conf = new ConfigReader(ServerInstance);
65                 /* throttle configuration */
66                 seconds = conf->ReadInteger("connflood", "seconds", 0, true);
67                 maxconns = conf->ReadInteger("connflood", "maxconns", 0, true);
68                 timeout = conf->ReadInteger("connflood", "timeout", 0, true);
69                 quitmsg = conf->ReadValue("connflood", "quitmsg", 0);
70
71                 /* seconds to wait when the server just booted */
72                 boot_wait = conf->ReadInteger("connflood", "bootwait", 0, true);
73
74                 first = ServerInstance->Time();
75         }
76  
77         virtual void OnUserRegister(userrec* user)
78         {
79                 time_t next = ServerInstance->Time();
80                 if (!first)
81                         first = next - boot_wait;
82
83                 /* time difference between first and latest connection */
84                 time_t tdiff = next - first;
85
86                 /* increase connection count */
87                 conns++;
88
89                 if (throttled == 1)
90                 {
91                         if (tdiff > seconds + timeout)
92                         {
93                                 /* expire throttle */
94                                 throttled = 0;
95                                 ServerInstance->WriteOpers("*** Connection throttle deactivated");
96                                 return;
97                         }
98                         userrec::QuitUser(ServerInstance, user, quitmsg);
99                         return;
100                 }
101
102                 if (tdiff <= seconds)
103                 {
104                         if (conns >= maxconns)
105                         {
106                                 throttled = 1;
107                                 ServerInstance->WriteOpers("*** Connection throttle activated");
108                                 userrec::QuitUser(ServerInstance, user, quitmsg);
109                                 return;
110                         }
111                 }
112                 else
113                 {
114                         conns = 1;
115                         first = next;
116                 }
117         }
118
119         virtual void OnRehash(const std::string &parameter)
120         {
121                 InitConf();
122         }
123
124 };
125
126
127 class ModuleConnFloodFactory : public ModuleFactory
128 {
129 public:
130         ModuleConnFloodFactory()
131         {
132         }
133
134         ~ModuleConnFloodFactory()
135         {
136         }
137     
138         virtual Module * CreateModule(InspIRCd* Me)
139         {
140                 return new ModuleConnFlood(Me);
141         }
142 };
143
144
145 extern "C" void * init_module( void )
146 {
147         return new ModuleConnFloodFactory;
148 }