]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_globalload.cpp
Update copyright headers.
[user/henk/code/inspircd.git] / src / modules / m_globalload.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2013, 2017-2018, 2021 Sadie Powell <sadie@witchery.services>
5  *   Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
6  *   Copyright (C) 2012, 2014-2016 Attila Molnar <attilamolnar@hush.com>
7  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
8  *   Copyright (C) 2009 Robin Burchell <robin+git@viroteck.net>
9  *   Copyright (C) 2007-2008 Dennis Friis <peavey@inspircd.org>
10  *   Copyright (C) 2007 John Brooks <special@inspircd.org>
11  *   Copyright (C) 2006-2008, 2010 Craig Edwards <brain@inspircd.org>
12  *
13  * This file is part of InspIRCd.  InspIRCd is free software: you can
14  * redistribute it and/or modify it under the terms of the GNU General Public
15  * License as published by the Free Software Foundation, version 2.
16  *
17  * This program is distributed in the hope that it will be useful, but WITHOUT
18  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
20  * details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
24  */
25
26
27 #include "inspircd.h"
28
29 class CommandGLoadModule : public Command
30 {
31  public:
32         CommandGLoadModule(Module* Creator)
33                 : Command(Creator,"GLOADMODULE", 1)
34         {
35                 allow_empty_last_param = false;
36                 flags_needed = 'o';
37                 syntax = "<modulename> [<servermask>]";
38         }
39
40         CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
41         {
42                 std::string servername = parameters.size() > 1 ? parameters[1] : "*";
43
44                 if (InspIRCd::Match(ServerInstance->Config->ServerName.c_str(), servername))
45                 {
46                         if (ServerInstance->Modules->Load(parameters[0].c_str()))
47                         {
48                                 ServerInstance->SNO->WriteToSnoMask('a', "NEW MODULE '%s' GLOBALLY LOADED BY '%s'",parameters[0].c_str(), user->nick.c_str());
49                                 user->WriteRemoteNumeric(RPL_LOADEDMODULE, parameters[0], "Module successfully loaded.");
50                         }
51                         else
52                         {
53                                 user->WriteRemoteNumeric(ERR_CANTLOADMODULE, parameters[0], ServerInstance->Modules->LastError());
54                         }
55                 }
56                 else
57                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBAL LOAD BY '%s' (not loaded here)",parameters[0].c_str(), user->nick.c_str());
58
59                 return CMD_SUCCESS;
60         }
61
62         RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE
63         {
64                 return ROUTE_BROADCAST;
65         }
66 };
67
68 class CommandGUnloadModule : public Command
69 {
70  public:
71         bool allowcoreunload;
72
73         CommandGUnloadModule(Module* Creator)
74                 : Command(Creator,"GUNLOADMODULE", 1)
75         {
76                 allow_empty_last_param = false;
77                 flags_needed = 'o';
78                 syntax = "<modulename> [<servermask>]";
79         }
80
81         CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
82         {
83                 if (!allowcoreunload && InspIRCd::Match(parameters[0], "core_*.so", ascii_case_insensitive_map))
84                 {
85                         user->WriteRemoteNumeric(ERR_CANTUNLOADMODULE, parameters[0], "You cannot unload core commands!");
86                         return CMD_FAILURE;
87                 }
88
89                 std::string servername = parameters.size() > 1 ? parameters[1] : "*";
90
91                 if (InspIRCd::Match(ServerInstance->Config->ServerName.c_str(), servername))
92                 {
93                         Module* m = ServerInstance->Modules->Find(parameters[0]);
94                         if (m)
95                         {
96                                 if (ServerInstance->Modules->Unload(m))
97                                 {
98                                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBALLY UNLOADED BY '%s'",parameters[0].c_str(), user->nick.c_str());
99                                         user->WriteRemoteNumeric(RPL_UNLOADEDMODULE, parameters[0], "Module successfully unloaded.");
100                                 }
101                                 else
102                                 {
103                                         user->WriteRemoteNumeric(ERR_CANTUNLOADMODULE, parameters[0], ServerInstance->Modules->LastError());
104                                 }
105                         }
106                         else
107                                 user->WriteRemoteNumeric(ERR_CANTUNLOADMODULE, parameters[0], "No such module");
108                 }
109                 else
110                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBAL UNLOAD BY '%s' (not unloaded here)",parameters[0].c_str(), user->nick.c_str());
111
112                 return CMD_SUCCESS;
113         }
114
115         RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE
116         {
117                 return ROUTE_BROADCAST;
118         }
119 };
120
121 class CommandGReloadModule : public Command
122 {
123  public:
124         CommandGReloadModule(Module* Creator)
125                 : Command(Creator, "GRELOADMODULE", 1)
126         {
127                 allow_empty_last_param = false;
128                 flags_needed = 'o';
129                 syntax = "<modulename> [<servermask>]";
130         }
131
132         CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
133         {
134                 std::string servername = parameters.size() > 1 ? parameters[1] : "*";
135
136                 if (InspIRCd::Match(ServerInstance->Config->ServerName.c_str(), servername))
137                 {
138                         Module* m = ServerInstance->Modules->Find(parameters[0]);
139                         if (m)
140                         {
141                                 ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBALLY RELOADED BY '%s'", parameters[0].c_str(), user->nick.c_str());
142                                 ServerInstance->Parser.CallHandler("RELOADMODULE", parameters, user);
143                         }
144                         else
145                         {
146                                 user->WriteRemoteNumeric(ERR_CANTUNLOADMODULE, parameters[0], "Could not find module by that name");
147                                 return CMD_FAILURE;
148                         }
149                 }
150                 else
151                         ServerInstance->SNO->WriteToSnoMask('a', "MODULE '%s' GLOBAL RELOAD BY '%s' (not reloaded here)",parameters[0].c_str(), user->nick.c_str());
152
153                 return CMD_SUCCESS;
154         }
155
156         RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE
157         {
158                 return ROUTE_BROADCAST;
159         }
160 };
161
162 class ModuleGlobalLoad : public Module
163 {
164  private:
165         CommandGLoadModule cmdgloadmodule;
166         CommandGUnloadModule cmdgunloadmodule;
167         CommandGReloadModule cmdgreloadmodule;
168
169  public:
170         ModuleGlobalLoad()
171                 : cmdgloadmodule(this)
172                 , cmdgunloadmodule(this)
173                 , cmdgreloadmodule(this)
174         {
175         }
176
177         void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
178         {
179                 ConfigTag* securitytag = ServerInstance->Config->ConfValue("security");
180                 cmdgunloadmodule.allowcoreunload = securitytag->getBool("allowcoreunload");
181         }
182
183         Version GetVersion() CXX11_OVERRIDE
184         {
185                 return Version("Adds the /GLOADMODULE, /GRELOADMODULE, and /GUNLOADMODULE commands which allows server operators to load, reload, and unload modules on remote servers.", VF_COMMON | VF_VENDOR);
186         }
187 };
188
189 MODULE_INIT(ModuleGlobalLoad)