]> git.lizzy.rs Git - minetest.git/blob - src/servercommand.cpp
added ipban support
[minetest.git] / src / servercommand.cpp
1 /*
2 Part of Minetest-c55
3 Copyright (C) 2010-11 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2011 Ciaran Gultnieks <ciaran@ciarang.com>
5
6 Permission to use, copy, modify, and distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include "servercommand.h"
20 #include "utility.h"
21
22 void cmd_status(std::wostringstream &os,
23         ServerCommandContext *ctx)
24 {
25         os<<ctx->server->getStatusString();
26 }
27
28 void cmd_privs(std::wostringstream &os,
29         ServerCommandContext *ctx)
30 {
31         if(ctx->parms.size() == 1)
32         {
33                 // Show our own real privs, without any adjustments
34                 // made for admin status
35                 os<<L"-!- " + narrow_to_wide(privsToString(
36                                 ctx->server->getPlayerAuthPrivs(ctx->player->getName())));
37                 return;
38         }
39
40         if((ctx->privs & PRIV_PRIVS) == 0)
41         {
42                 os<<L"-!- You don't have permission to do that";
43                 return;
44         }
45                 
46         Player *tp = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
47         if(tp == NULL)
48         {
49                 os<<L"-!- No such player";
50                 return;
51         }
52         
53         os<<L"-!- " + narrow_to_wide(privsToString(ctx->server->getPlayerAuthPrivs(tp->getName())));
54 }
55
56 void cmd_grantrevoke(std::wostringstream &os,
57         ServerCommandContext *ctx)
58 {
59         if(ctx->parms.size() != 3)
60         {
61                 os<<L"-!- Missing parameter";
62                 return;
63         }
64
65         if((ctx->privs & PRIV_PRIVS) == 0)
66         {
67                 os<<L"-!- You don't have permission to do that";
68                 return;
69         }
70
71         u64 newprivs = stringToPrivs(wide_to_narrow(ctx->parms[2]));
72         if(newprivs == PRIV_INVALID)
73         {
74                 os<<L"-!- Invalid privileges specified";
75                 return;
76         }
77
78         Player *tp = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
79         if(tp == NULL)
80         {
81                 os<<L"-!- No such player";
82                 return;
83         }
84         
85         std::string playername = wide_to_narrow(ctx->parms[1]);
86         u64 privs = ctx->server->getPlayerAuthPrivs(playername);
87
88         if(ctx->parms[0] == L"grant")
89                 privs |= newprivs;
90         else
91                 privs &= ~newprivs;
92         
93         ctx->server->setPlayerAuthPrivs(playername, privs);
94         
95         os<<L"-!- Privileges change to ";
96         os<<narrow_to_wide(privsToString(privs));
97 }
98
99 void cmd_time(std::wostringstream &os,
100         ServerCommandContext *ctx)
101 {
102         if(ctx->parms.size() != 2)
103         {
104                 os<<L"-!- Missing parameter";
105                 return;
106         }
107
108         if((ctx->privs & PRIV_SETTIME) ==0)
109         {
110                 os<<L"-!- You don't have permission to do that";
111                 return;
112         }
113
114         u32 time = stoi(wide_to_narrow(ctx->parms[1]));
115         ctx->server->setTimeOfDay(time);
116         os<<L"-!- time_of_day changed.";
117 }
118
119 void cmd_shutdown(std::wostringstream &os,
120         ServerCommandContext *ctx)
121 {
122         if((ctx->privs & PRIV_SERVER) ==0)
123         {
124                 os<<L"-!- You don't have permission to do that";
125                 return;
126         }
127
128         dstream<<DTIME<<" Server: Operator requested shutdown."
129                 <<std::endl;
130         ctx->server->requestShutdown();
131                                         
132         os<<L"*** Server shutting down (operator request)";
133         ctx->flags |= 2;
134 }
135
136 void cmd_setting(std::wostringstream &os,
137         ServerCommandContext *ctx)
138 {
139         if((ctx->privs & PRIV_SERVER) ==0)
140         {
141                 os<<L"-!- You don't have permission to do that";
142                 return;
143         }
144
145         /*std::string confline = wide_to_narrow(
146                         ctx->parms[1] + L" = " + ctx->params[2]);*/
147
148         std::string confline = wide_to_narrow(ctx->paramstring);
149         
150         g_settings.parseConfigLine(confline);
151         
152         ctx->server->saveConfig();
153
154         os<< L"-!- Setting changed and configuration saved.";
155 }
156
157 void cmd_teleport(std::wostringstream &os,
158         ServerCommandContext *ctx)
159 {
160         if((ctx->privs & PRIV_TELEPORT) ==0)
161         {
162                 os<<L"-!- You don't have permission to do that";
163                 return;
164         }
165
166         if(ctx->parms.size() != 2)
167         {
168                 os<<L"-!- Missing parameter";
169                 return;
170         }
171
172         std::vector<std::wstring> coords = str_split(ctx->parms[1], L',');
173         if(coords.size() != 3)
174         {
175                 os<<L"-!- You can only specify coordinates currently";
176                 return;
177         }
178
179         v3f dest(stoi(coords[0])*10, stoi(coords[1])*10, stoi(coords[2])*10);
180         ctx->player->setPosition(dest);
181         ctx->server->SendMovePlayer(ctx->player);
182
183         os<< L"-!- Teleported.";
184 }
185
186 void cmd_ipbanunban(std::wostringstream &os, ServerCommandContext *ctx)
187 {
188         if((ctx->privs && PRIV_BAN) == 0)
189         {
190                 os<<L"-!- You don't have permission to do that";
191                 return;
192         }
193
194         if(ctx->parms.size() != 2)
195         {
196                 os<<L"-!- Missing parameter";
197                 return;
198         }
199         if(ctx->parms[0] == L"ipban")
200         {
201                 Player *player = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
202
203                 if(player == NULL)
204                 {
205                         os<<L"-!- No such Player!";
206                         return;
207                 }
208
209                 con::Peer *peer = ctx->server->getPeerNoEx(player->peer_id);
210                 if(peer == NULL)
211                 {
212                         dstream<<"peer was not found!"<<std::endl;
213                 }
214                 ctx->server->setIpBanned(peer->address.serializeString());
215                 os<<L"-!- IP: "<<narrow_to_wide(peer->address.serializeString())<<L" was banned!";
216         }
217         else
218         {
219                 ctx->server->unsetIpBanned(wide_to_narrow(ctx->parms[1]));
220                 os<<L"-!- IP: "<<ctx->parms[1]<<L" was unbanned!";
221         }
222 }
223
224
225 std::wstring processServerCommand(ServerCommandContext *ctx)
226 {
227
228         std::wostringstream os(std::ios_base::binary);
229         ctx->flags = 1; // Default, unless we change it.
230
231         u64 privs = ctx->privs;
232
233         if(ctx->parms.size() == 0 || ctx->parms[0] == L"help")
234         {
235                 os<<L"-!- Available commands: ";
236                 os<<L"status privs ";
237                 if(privs & PRIV_SERVER)
238                         os<<L"shutdown setting ";
239                 if(privs & PRIV_SETTIME)
240                         os<<L" time";
241                 if(privs & PRIV_TELEPORT)
242                         os<<L" teleport";
243                 if(privs & PRIV_PRIVS)
244                         os<<L" grant revoke";
245                 if(privs & PRIV_BAN)
246                         os<<L" ipban ipunban";
247         }
248         else if(ctx->parms[0] == L"status")
249         {
250                 cmd_status(os, ctx);
251         }
252         else if(ctx->parms[0] == L"privs")
253         {
254                 cmd_privs(os, ctx);
255         }
256         else if(ctx->parms[0] == L"grant" || ctx->parms[0] == L"revoke")
257         {
258                 cmd_grantrevoke(os, ctx);
259         }
260         else if(ctx->parms[0] == L"time")
261         {
262                 cmd_time(os, ctx);
263         }
264         else if(ctx->parms[0] == L"shutdown")
265         {
266                 cmd_shutdown(os, ctx);
267         }
268         else if(ctx->parms[0] == L"setting")
269         {
270                 cmd_setting(os, ctx);
271         }
272         else if(ctx->parms[0] == L"teleport")
273         {
274                 cmd_teleport(os, ctx);
275         }
276         else if(ctx->parms[0] == L"ipban" || ctx->parms[0] == L"ipunban")
277         {
278                 cmd_ipbanunban(os, ctx);
279         }
280         else
281         {
282                 os<<L"-!- Invalid command: " + ctx->parms[0];
283         }
284         return os.str();
285 }
286
287