]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/coremods/core_loadmodule.cpp
Merge branch 'insp20' into insp3.
[user/henk/code/inspircd.git] / src / coremods / core_loadmodule.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009 Daniel De Graaf <danieldg@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 /** Handle /LOADMODULE.
24  */
25 class CommandLoadmodule : public Command
26 {
27  public:
28         /** Constructor for loadmodule.
29          */
30         CommandLoadmodule ( Module* parent) : Command(parent,"LOADMODULE",1,1) { flags_needed='o'; syntax = "<modulename>"; }
31         /** Handle command.
32          * @param parameters The parameters to the command
33          * @param user The user issuing the command
34          * @return A value from CmdResult to indicate command success or failure.
35          */
36         CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE;
37 };
38
39 /** Handle /LOADMODULE
40  */
41 CmdResult CommandLoadmodule::Handle(User* user, const Params& parameters)
42 {
43         if (ServerInstance->Modules->Load(parameters[0]))
44         {
45                 ServerInstance->SNO->WriteGlobalSno('a', "NEW MODULE: %s loaded %s",user->nick.c_str(), parameters[0].c_str());
46                 user->WriteNumeric(RPL_LOADEDMODULE, parameters[0], "Module successfully loaded.");
47                 return CMD_SUCCESS;
48         }
49         else
50         {
51                 user->WriteNumeric(ERR_CANTLOADMODULE, parameters[0], ServerInstance->Modules->LastError());
52                 return CMD_FAILURE;
53         }
54 }
55
56 /** Handle /UNLOADMODULE.
57  */
58 class CommandUnloadmodule : public Command
59 {
60  public:
61         bool allowcoreunload;
62
63         /** Constructor for unloadmodule.
64          */
65         CommandUnloadmodule(Module* parent)
66                 : Command(parent, "UNLOADMODULE", 1)
67                 , allowcoreunload(false)
68         {
69                 flags_needed = 'o';
70                 syntax = "<modulename>";
71         }
72
73         /** Handle command.
74          * @param parameters The parameters to the command
75          * @param user The user issuing the command
76          * @return A value from CmdResult to indicate command success or failure.
77          */
78         CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE;
79 };
80
81 CmdResult CommandUnloadmodule::Handle(User* user, const Params& parameters)
82 {
83         if (!allowcoreunload && InspIRCd::Match(parameters[0], "core_*.so", ascii_case_insensitive_map))
84         {
85                 user->WriteNumeric(ERR_CANTUNLOADMODULE, parameters[0], "You cannot unload core commands!");
86                 return CMD_FAILURE;
87         }
88
89         Module* m = ServerInstance->Modules->Find(parameters[0]);
90         if (m == creator)
91         {
92                 user->WriteNumeric(ERR_CANTUNLOADMODULE, parameters[0], "You cannot unload module loading commands!");
93                 return CMD_FAILURE;
94         }
95
96         if (m && ServerInstance->Modules->Unload(m))
97         {
98                 ServerInstance->SNO->WriteGlobalSno('a', "MODULE UNLOADED: %s unloaded %s", user->nick.c_str(), parameters[0].c_str());
99                 user->WriteNumeric(RPL_UNLOADEDMODULE, parameters[0], "Module successfully unloaded.");
100         }
101         else
102         {
103                 user->WriteNumeric(ERR_CANTUNLOADMODULE, parameters[0], (m ? ServerInstance->Modules->LastError() : "No such module"));
104                 return CMD_FAILURE;
105         }
106
107         return CMD_SUCCESS;
108 }
109
110 class CoreModLoadModule : public Module
111 {
112         CommandLoadmodule cmdloadmod;
113         CommandUnloadmodule cmdunloadmod;
114
115  public:
116         CoreModLoadModule()
117                 : cmdloadmod(this), cmdunloadmod(this)
118         {
119         }
120
121         Version GetVersion() CXX11_OVERRIDE
122         {
123                 return Version("Provides the LOADMODULE and UNLOADMODULE commands", VF_VENDOR|VF_CORE);
124         }
125
126         void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
127         {
128                 ConfigTag* tag = ServerInstance->Config->ConfValue("security");
129                 cmdunloadmod.allowcoreunload = tag->getBool("allowcoreunload");
130         }
131 };
132
133 MODULE_INIT(CoreModLoadModule)