]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_connflood.cpp
fix for bug #175, change OnUserRegister to return int, and if greater than 0 = user...
[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
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,1,0,0,VF_VENDOR,API_VERSION);
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 int 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 0;
97                         }
98                         userrec::QuitUser(ServerInstance, user, quitmsg);
99                         return 1;
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 1;
110                         }
111                 }
112                 else
113                 {
114                         conns = 1;
115                         first = next;
116                 }
117                 return 0;
118         }
119
120         virtual void OnRehash(const std::string &parameter)
121         {
122                 InitConf();
123         }
124
125 };
126
127
128 class ModuleConnFloodFactory : public ModuleFactory
129 {
130 public:
131         ModuleConnFloodFactory()
132         {
133         }
134
135         ~ModuleConnFloodFactory()
136         {
137         }
138     
139         virtual Module * CreateModule(InspIRCd* Me)
140         {
141                 return new ModuleConnFlood(Me);
142         }
143 };
144
145
146 extern "C" void * init_module( void )
147 {
148         return new ModuleConnFloodFactory;
149 }