]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_lockserv.cpp
Replace copyright headers with headers granting specific authors copyright
[user/henk/code/inspircd.git] / src / modules / m_lockserv.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2006-2007 Dennis Friis <peavey@inspircd.org>
5  *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
6  *
7  * This file is part of InspIRCd.  InspIRCd is free software: you can
8  * redistribute it and/or modify it under the terms of the GNU General Public
9  * License as published by the Free Software Foundation, version 2.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
14  * details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20
21 #include "inspircd.h"
22
23 /* $ModDesc: Allows locking of the server to stop all incoming connections till unlocked again */
24
25 /** Adds numerics
26  * 988 <nick> <servername> :Closed for new connections
27  * 989 <nick> <servername> :Open for new connections
28 */
29
30
31 class CommandLockserv : public Command
32 {
33         bool& locked;
34 public:
35         CommandLockserv(Module* Creator, bool& lock) : Command(Creator, "LOCKSERV", 0), locked(lock)
36         {
37                 flags_needed = 'o'; syntax.clear();
38         }
39
40         CmdResult Handle (const std::vector<std::string> &parameters, User *user)
41         {
42                 locked = true;
43                 user->WriteNumeric(988, "%s %s :Closed for new connections", user->nick.c_str(), user->server.c_str());
44                 ServerInstance->SNO->WriteGlobalSno('a', "Oper %s used LOCKSERV to temporarily close for new connections", user->nick.c_str());
45                 /* Dont send to the network */
46                 return CMD_SUCCESS;
47         }
48 };
49
50 class CommandUnlockserv : public Command
51 {
52 private:
53         bool& locked;
54
55 public:
56         CommandUnlockserv(Module* Creator, bool &lock) : Command(Creator, "UNLOCKSERV", 0), locked(lock)
57         {
58                 flags_needed = 'o'; syntax.clear();
59         }
60
61         CmdResult Handle (const std::vector<std::string> &parameters, User *user)
62         {
63                 locked = false;
64                 user->WriteNumeric(989, "%s %s :Open for new connections", user->nick.c_str(), user->server.c_str());
65                 ServerInstance->SNO->WriteGlobalSno('a', "Oper %s used UNLOCKSERV to allow for new connections", user->nick.c_str());
66                 /* Dont send to the network */
67                 return CMD_SUCCESS;
68         }
69 };
70
71 class ModuleLockserv : public Module
72 {
73 private:
74         bool locked;
75         CommandLockserv lockcommand;
76         CommandUnlockserv unlockcommand;
77
78 public:
79         ModuleLockserv() : lockcommand(this, locked), unlockcommand(this, locked)
80         {
81                 locked = false;
82                 ServerInstance->AddCommand(&lockcommand);
83                 ServerInstance->AddCommand(&unlockcommand);
84                 Implementation eventlist[] = { I_OnUserRegister, I_OnRehash, I_OnCheckReady };
85                 ServerInstance->Modules->Attach(eventlist, this, 3);
86         }
87
88         virtual ~ModuleLockserv()
89         {
90         }
91
92
93         virtual void OnRehash(User* user)
94         {
95                 // Emergency way to unlock
96                 if (!user) locked = false;
97         }
98
99         virtual ModResult OnUserRegister(LocalUser* user)
100         {
101                 if (locked)
102                 {
103                         ServerInstance->Users->QuitUser(user, "Server is temporarily closed. Please try again later.");
104                         return MOD_RES_DENY;
105                 }
106                 return MOD_RES_PASSTHRU;
107         }
108
109         virtual ModResult OnCheckReady(LocalUser* user)
110         {
111                 return locked ? MOD_RES_DENY : MOD_RES_PASSTHRU;
112         }
113
114         virtual Version GetVersion()
115         {
116                 return Version("Allows locking of the server to stop all incoming connections until unlocked again", VF_VENDOR);
117         }
118 };
119
120 MODULE_INIT(ModuleLockserv)