00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <webserver/ServerWebHandler.h>
00022 #include <server/ServerLog.h>
00023 #include <server/ScorchedServer.h>
00024 #include <server/ScorchedServerUtil.h>
00025 #include <webserver/ServerWebServerUtil.h>
00026 #include <server/ServerCommon.h>
00027 #include <server/ServerAdminCommon.h>
00028 #include <server/ServerAdminSessions.h>
00029 #include <server/ServerState.h>
00030 #include <server/ServerParams.h>
00031 #include <server/ServerChannelManager.h>
00032 #include <landscapedef/LandscapeDefinitionsBase.h>
00033 #include <engine/ModFiles.h>
00034 #include <common/Defines.h>
00035 #include <common/Logger.h>
00036 #include <common/OptionsScorched.h>
00037 #include <common/OptionsTransient.h>
00038 #include <common/StatsLogger.h>
00039 #include <common/FileList.h>
00040 #include <net/NetInterface.h>
00041 #include <tank/TankContainer.h>
00042 #include <tank/TankColorGenerator.h>
00043 #include <tank/TankState.h>
00044 #include <tank/TankScore.h>
00045 #include <tankai/TankAIStore.h>
00046 #include <XML/XMLParser.h>
00047 #include <vector>
00048 #include <algorithm>
00049
00050 struct LogFile
00051 {
00052 std::string fileName;
00053 time_t fileTime;
00054 };
00055
00056 static inline bool lt_logfile(const LogFile &o1, const LogFile &o2)
00057 {
00058 return o1.fileTime < o2.fileTime;
00059 }
00060
00061 static const char *getAdminUserName(std::map<std::string, std::string> &fields)
00062 {
00063 unsigned int sid = atoi(ServerWebServerUtil::getField(fields, "sid"));
00064 ServerAdminSessions::SessionParams *session =
00065 ServerAdminSessions::instance()->getSession(sid);
00066 if (session) return session->credentials.username.c_str();
00067 return "Unknown";
00068 }
00069
00070 bool ServerWebHandler::PlayerHandler::processRequest(
00071 ServerWebServerIRequest &request,
00072 std::string &text)
00073 {
00074
00075 const char *addType = ServerWebServerUtil::getField(request.getFields(), "add");
00076 if (addType)
00077 {
00078 ServerAdminCommon::addPlayer(request.getSession()->credentials, addType);
00079 }
00080
00081 std::map<unsigned int, Tank *> &tanks =
00082 ScorchedServer::instance()->getTankContainer().getAllTanks();
00083 std::map<unsigned int, Tank *>::iterator itor;
00084
00085 const char *adminName = getAdminUserName(request.getFields());
00086
00087
00088 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00089 if (action)
00090 {
00091 for (itor = tanks.begin(); itor != tanks.end(); itor++)
00092 {
00093
00094 Tank *tank = (*itor).second;
00095 if (ServerWebServerUtil::getField(request.getFields(), S3D::formatStringBuffer("player-%u", tank->getPlayerId())))
00096 {
00097 if (0 == strcmp(action, "Kick"))
00098 {
00099 ServerAdminCommon::kickPlayer(request.getSession()->credentials, tank->getPlayerId());
00100 break;
00101 }
00102 else if (0 == strcmp(action, "Mute"))
00103 {
00104 ServerAdminCommon::mutePlayer(request.getSession()->credentials, tank->getPlayerId(), true);
00105 }
00106 else if (0 == strcmp(action, "UnMute"))
00107 {
00108 ServerAdminCommon::mutePlayer(request.getSession()->credentials, tank->getPlayerId(), false);
00109 }
00110 else if (0 == strcmp(action, "Flag"))
00111 {
00112 ServerAdminCommon::flagPlayer(request.getSession()->credentials, tank->getPlayerId(),
00113 ServerWebServerUtil::getField(request.getFields(), "reason"));
00114 }
00115 else if (0 == strcmp(action, "Poor"))
00116 {
00117 ServerAdminCommon::poorPlayer(request.getSession()->credentials, tank->getPlayerId());
00118 }
00119 else if (0 == strcmp(action, "PermMute"))
00120 {
00121 ServerAdminCommon::permMutePlayer(request.getSession()->credentials, tank->getPlayerId(),
00122 ServerWebServerUtil::getField(request.getFields(), "reason"));
00123 }
00124 else if (0 == strcmp(action, "UnPermMute"))
00125 {
00126 ServerAdminCommon::unpermMutePlayer(request.getSession()->credentials, tank->getPlayerId());
00127 }
00128 else if (0 == strcmp(action, "Banned"))
00129 {
00130 ServerAdminCommon::banPlayer(request.getSession()->credentials, tank->getPlayerId(),
00131 ServerWebServerUtil::getField(request.getFields(), "reason"));
00132 }
00133 else if (0 == strcmp(action, "Slap"))
00134 {
00135 ServerAdminCommon::slapPlayer(request.getSession()->credentials, tank->getPlayerId(), 25.0f);
00136 }
00137 else if (0 == strcmp(action, "ShowAliases"))
00138 {
00139 if (!request.getSession()->credentials.hasPermission(
00140 ServerAdminSessions::PERMISSION_ALIASPLAYER)) return true;
00141
00142 ServerWebServerUtil::getHtmlRedirect(
00143 S3D::formatStringBuffer("/playersthreaded?sid=%s&action=%s&uniqueid=%s",
00144 ServerWebServerUtil::getField(request.getFields(), "sid"),
00145 ServerWebServerUtil::getField(request.getFields(), "action"),
00146 tank->getUniqueId()), text);
00147 return true;
00148 }
00149 else if (0 == strcmp(action, "ShowIPAliases"))
00150 {
00151 if (!request.getSession()->credentials.hasPermission(
00152 ServerAdminSessions::PERMISSION_ALIASPLAYER)) return true;
00153
00154 ServerWebServerUtil::getHtmlRedirect(
00155 S3D::formatStringBuffer("/playersthreaded?sid=%s&action=%s&uniqueid=%s",
00156 ServerWebServerUtil::getField(request.getFields(), "sid"),
00157 ServerWebServerUtil::getField(request.getFields(), "action"),
00158 tank->getUniqueId()), text);
00159 return true;
00160 }
00161 else
00162 {
00163 Logger::log(S3D::formatStringBuffer("Unknown web handler player action \"%s\"", action));
00164 }
00165 }
00166 }
00167 }
00168
00169
00170 std::string players;
00171 for (itor = tanks.begin(); itor != tanks.end(); itor++)
00172 {
00173 Tank *tank = (*itor).second;
00174 std::string cleanName;
00175 std::string dirtyName(LangStringUtil::convertFromLang(tank->getTargetName()));
00176 XMLNode::removeSpecialChars(dirtyName, cleanName);
00177 players += S3D::formatStringBuffer(
00178 "<tr>"
00179 "<td>dest=%i ip=%s id=%i</td>"
00180 "<td>%s</td>"
00181 "<td>%s</td>"
00182 "<td>%s</td>"
00183 "<td>%s</td>"
00184 "<td>%s</td>"
00185 "<td>%s</td>"
00186 "<td><input type=\"checkbox\" name=\"player-%u\"></td>"
00187 "</tr>\n",
00188 tank->getDestinationId(), NetInterface::getIpName(tank->getIpAddress()), tank->getPlayerId(),
00189 cleanName.c_str(),
00190 tank->getTankAI()?tank->getTankAI()->getName():"Human",
00191 tank->getScore().getTimePlayedString(),
00192 tank->getScore().getScoreString(),
00193 tank->getState().getStateString(),
00194 TankColorGenerator::getTeamName(tank->getTeam()),
00195 tank->getPlayerId()
00196 );
00197 }
00198 request.getFields()["PLAYERS"] = players;
00199 request.getFields()["NOPLAYERS"] = S3D::formatStringBuffer("%i/%i", tanks.size(),
00200 ScorchedServer::instance()->getOptionsGame().getNoMaxPlayers());
00201
00202
00203 std::string add;
00204 std::list<TankAI *> &ais = ScorchedServer::instance()->getTankAIs().getAis();
00205 std::list<TankAI *>::iterator aiitor;
00206 for (aiitor = ais.begin();
00207 aiitor != ais.end();
00208 aiitor++)
00209 {
00210 TankAI *ai = (*aiitor);
00211 if (ai->availableForPlayers())
00212 {
00213 add += S3D::formatStringBuffer(
00214 "<input type=\"submit\" name=\"add\" value=\"%s\"\n>",
00215 ai->getName());
00216 }
00217 }
00218 request.getFields()["ADD"] = add;
00219
00220 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "player.html", request.getFields(), text);
00221 }
00222
00223 bool ServerWebHandler::PlayerHandlerThreaded::processRequest(
00224 ServerWebServerIRequest &request,
00225 std::string &text)
00226 {
00227 if (!request.getSession()->credentials.hasPermission(
00228 ServerAdminSessions::PERMISSION_ALIASPLAYER)) return true;
00229
00230
00231 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00232 const char *uniqueid = ServerWebServerUtil::getField(request.getFields(), "uniqueid");
00233 if (action && uniqueid)
00234 {
00235 if (0 == strcmp(action, "ShowAliases"))
00236 {
00237 std::list<std::string> aliases =
00238 StatsLogger::instance()->getAliases(uniqueid);
00239 std::string lines = ServerWebServerUtil::concatLines(aliases);
00240 return ServerWebServerUtil::getHtmlMessage(
00241 request.getSession(),
00242 "ShowAliases", lines.c_str(), request.getFields(), text);
00243 }
00244 else if (0 == strcmp(action, "ShowIPAliases"))
00245 {
00246 std::list<std::string> aliases =
00247 StatsLogger::instance()->getIpAliases(uniqueid);
00248 std::string lines = ServerWebServerUtil::concatLines(aliases);
00249 return ServerWebServerUtil::getHtmlMessage(
00250 request.getSession(),
00251 "ShowIPAliases", lines.c_str(), request.getFields(), text);
00252 }
00253 }
00254
00255 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "player.html", request.getFields(), text);
00256 }
00257
00258 bool ServerWebHandler::LogHandler::processRequest(
00259 ServerWebServerIRequest &request,
00260 std::string &text)
00261 {
00262 if (!request.getSession()->credentials.hasPermission(
00263 ServerAdminSessions::PERMISSION_VIEWLOGS)) return true;
00264
00265 std::deque<ServerLog::ServerLogEntry> &entries =
00266 ServerLog::instance()->getEntries();
00267
00268 const int pagesize = 20;
00269 int start = (int(entries.size()) / pagesize) * pagesize;
00270 const char *page = ServerWebServerUtil::getField(request.getFields(), "page");
00271 if (page) start = atoi(page);
00272 else start = entries.size() - pagesize;
00273
00274
00275 std::string log;
00276
00277 int min = MAX(start, 0);
00278 int max = MIN((int) entries.size(), start + pagesize);
00279 for (int i=min; i<max; i++)
00280 {
00281 std::string cleanText;
00282 XMLNode::removeSpecialChars(entries[i].text, cleanText);
00283 log += S3D::formatStringBuffer(
00284 "<tr>"
00285 "<td><font size=-1>%u</font></td>"
00286 "<td><font size=-1>%s</font></td>"
00287 "</tr>\n",
00288 i,
00289 cleanText.c_str());
00290 }
00291 request.getFields()["LOG"] = log;
00292
00293
00294 std::string pages;
00295 for (int i =0; i<=int(entries.size())/pagesize-1; i++)
00296 {
00297 pages +=
00298 S3D::formatStringBuffer("<a href='?sid=%s&page=%i'>%i - %i</a> ",
00299 request.getFields()["sid"].c_str(),
00300 i * pagesize, i * pagesize, i * pagesize + pagesize - 1);
00301 }
00302 pages +=
00303 S3D::formatStringBuffer("<a href='?sid=%s'>Last</a>",
00304 request.getFields()["sid"].c_str());
00305 request.getFields()["PAGES"] = pages;
00306
00307 const char *refreshRate = ServerWebServerUtil::getField(request.getFields(), "RefreshRate");
00308 int refreshSeconds = 0;
00309 if (refreshRate) refreshSeconds = atoi(refreshRate);
00310 else request.getFields()["RefreshRate"]="0";
00311
00312 if (refreshSeconds > 0)
00313 request.getFields()["Meta"] = S3D::formatStringBuffer("<meta HTTP-EQUIV=\"Refresh\" CONTENT=\"%d;URL=%s?sid=%s&RefreshRate=%s\">", refreshSeconds,
00314 request.getUrl(),request.getFields()["sid"].c_str(),refreshRate);
00315
00316 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "log.html", request.getFields(), text);
00317 }
00318
00319 bool ServerWebHandler::LogFileHandler::processRequest(
00320 ServerWebServerIRequest &request,
00321 std::string &text)
00322 {
00323 if (!request.getSession()->credentials.hasPermission(
00324 ServerAdminSessions::PERMISSION_VIEWLOGS)) return true;
00325
00326 std::deque<ServerLog::ServerLogEntry> &entries =
00327 ServerLog::instance()->getEntries();
00328
00329 const char *logFilename = ServerWebServerUtil::getField(request.getFields(), "filename");
00330 if (logFilename &&
00331
00332 !strstr(logFilename, "..") &&
00333 !strstr(logFilename, ":") &&
00334 !strstr(logFilename, "/") &&
00335 !strstr(logFilename, "\\"))
00336 {
00337
00338
00339 text.append(S3D::formatStringBuffer(
00340 "HTTP/1.1 200 OK\r\n"
00341 "Server: Scorched3D\r\n"
00342 "Content-Type: text/plain\r\n"
00343 "Content-Disposition: filename=%s.txt\r\n"
00344 "Connection: Close\r\n"
00345 "\r\n", logFilename));
00346
00347 std::string filename = S3D::getLogFile(logFilename);
00348 std::string file = ServerWebServerUtil::getFile(filename);
00349 request.getFields()["FILE"] = file;
00350
00351 return ServerWebServerUtil::getTemplate(request.getSession(), "logfile.html", request.getFields(), text);
00352 }
00353 else
00354 {
00355
00356
00357
00358 const char *search = 0;
00359 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00360 if (action && 0 == strcmp(action, "Search"))
00361 {
00362 search = ServerWebServerUtil::getField(request.getFields(), "search");
00363 }
00364
00365
00366 std::vector<LogFile> logFiles;
00367 std::string portNumber = S3D::formatStringBuffer("%i",
00368 ScorchedServer::instance()->getOptionsGame().getPortNo());
00369 std::string dirName = S3D::getLogFile("");
00370 FileList dir(dirName, "*.log", false);
00371 if (dir.getStatus())
00372 {
00373 std::list<std::string> &files = dir.getFiles();
00374 std::list<std::string>::iterator itor;
00375 for (itor = files.begin();
00376 itor!= files.end();
00377 itor++)
00378 {
00379 const std::string &fileName = (*itor).c_str();
00380 const std::string &fullFilename = S3D::getLogFile(fileName);
00381
00382
00383 if (0 == strstr(fileName.c_str(), portNumber.c_str())) continue;
00384
00385
00386
00387 if (search)
00388 {
00389 std::string file = ServerWebServerUtil::getFile(fullFilename);
00390 if (0 == strstr(file.c_str(), search)) continue;
00391 }
00392
00393
00394 LogFile logFile;
00395 logFile.fileName = fileName;
00396 logFile.fileTime = S3D::fileModTime(fullFilename);
00397 logFiles.push_back(logFile);
00398 }
00399 }
00400
00401
00402 std::sort(logFiles.begin(), logFiles.end(), lt_logfile);
00403
00404
00405 std::string log;
00406 {
00407 std::vector<LogFile>::iterator itor;
00408 for (itor = logFiles.begin();
00409 itor != logFiles.end();
00410 itor++)
00411 {
00412 LogFile &logFile = *itor;
00413 const char *fileName = logFile.fileName.c_str();
00414 log += S3D::formatStringBuffer(
00415 "<tr>"
00416 "<td><font size=-1><a href=?filename=%s&sid=%s>%s</a></font></td>"
00417 "<td><font size=-1>%s</font></td>"
00418 "</tr>\n",
00419 fileName,
00420 request.getFields()["sid"].c_str(),
00421 fileName,
00422 ctime(&logFile.fileTime));
00423 }
00424 }
00425 request.getFields()["LOG"] = log;
00426
00427 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "logfiles.html", request.getFields(), text);
00428 }
00429 return false;
00430 }
00431
00432 bool ServerWebHandler::GameHandler::processRequest(
00433 ServerWebServerIRequest &request,
00434 std::string &text)
00435 {
00436 const char *adminName = getAdminUserName(request.getFields());
00437
00438
00439 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00440 if (action)
00441 {
00442 if (!request.getSession()->credentials.hasPermission(
00443 ServerAdminSessions::PERMISSION_ALTERGAME)) return true;
00444
00445 if (0 == strcmp(action, "NewGame"))
00446 {
00447 ServerAdminCommon::newGame(request.getSession()->credentials);
00448 }
00449 else if (0 == strcmp(action, "KillAll"))
00450 {
00451 ServerAdminCommon::killAll(request.getSession()->credentials);
00452 }
00453 }
00454
00455 std::map<unsigned int, Tank *> &tanks =
00456 ScorchedServer::instance()->getTankContainer().getPlayingTanks();
00457 request.getFields()["PLAYERS"] = S3D::formatStringBuffer("%i/%i", tanks.size(),
00458 ScorchedServer::instance()->getOptionsGame().getNoMaxPlayers());
00459
00460 unsigned int state = ScorchedServer::instance()->getGameState().getState();
00461 request.getFields()["STATE"] = ((state == ServerState::ServerStateTooFewPlayers)?"Not Playing":"Playing");
00462
00463 request.getFields()["ROUND"] = S3D::formatStringBuffer("%i/%i",
00464 ScorchedServer::instance()->getOptionsTransient().getCurrentRoundNo(),
00465 ScorchedServer::instance()->getOptionsGame().getNoRounds());
00466 request.getFields()["MOVE"] = S3D::formatStringBuffer("%i/%i",
00467 ScorchedServer::instance()->getOptionsTransient().getCurrentGameNo(),
00468 ScorchedServer::instance()->getOptionsGame().getNoMaxRoundTurns());
00469
00470 request.getFields()["BI"] = S3D::formatStringBuffer("%uK", NetInterface::getBytesIn() / 1000);
00471 request.getFields()["BO"] = S3D::formatStringBuffer("%uK", NetInterface::getBytesOut() / 1000);
00472 request.getFields()["P"] = S3D::formatStringBuffer("%u", NetInterface::getPings());
00473 request.getFields()["C"] = S3D::formatStringBuffer("%u", NetInterface::getConnects());
00474
00475 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "game.html", request.getFields(), text);
00476 }
00477
00478 bool ServerWebHandler::ServerHandler::processRequest(
00479 ServerWebServerIRequest &request,
00480 std::string &text)
00481 {
00482 bool &messageLogging = ScorchedServer::instance()->
00483 getComsMessageHandler().getMessageLogging();
00484 bool &stateLogging = ScorchedServer::instance()->
00485 getGameState().getStateLogging();
00486
00487
00488 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00489 if (action)
00490 {
00491 if (!request.getSession()->credentials.hasPermission(
00492 ServerAdminSessions::PERMISSION_ALTERSERVER)) return true;
00493
00494 if (0 == strcmp(action, "Stop Server"))
00495 {
00496 exit(0);
00497 }
00498 else if (0 == strcmp(action, "Stop Server When Empty"))
00499 {
00500 ServerCommon::getExitEmpty() = true;
00501 }
00502 else if (0 == strcmp(action, "Set Logging"))
00503 {
00504 messageLogging = (0 == strcmp(request.getFields()["MessageLogging"].c_str(), "on"));
00505 stateLogging = (0 == strcmp(request.getFields()["StateLogging"].c_str(), "on"));
00506 }
00507 }
00508
00509 {
00510 request.getFields()["MESSAGELOGGING"] = S3D::formatStringBuffer(
00511 "<input type='radio' name='MessageLogging' %s value='on'>On</input>"
00512 "<input type='radio' name='MessageLogging' %s value='off'>Off</input>",
00513 (messageLogging?"checked":""),
00514 (!messageLogging?"checked":""));
00515 request.getFields()["STATELOGGING"] = S3D::formatStringBuffer(
00516 "<input type='radio' name='StateLogging' %s value='on'>On</input>"
00517 "<input type='radio' name='StateLogging' %s value='off'>Off</input>",
00518 (stateLogging?"checked":""),
00519 (!stateLogging?"checked":""));
00520 }
00521
00522 unsigned int state = ScorchedServer::instance()->getGameState().getState();
00523 request.getFields()["STATE"] = ((state == ServerState::ServerStateTooFewPlayers)?"Not Playing":"Playing");
00524 request.getFields()["VERSION"] = S3D::formatStringBuffer("%s (%s) - Built %s",
00525 S3D::ScorchedVersion.c_str(),
00526 S3D::ScorchedProtocolVersion.c_str(),
00527 S3D::ScorchedBuildTime.c_str());
00528 request.getFields()["STARTTIME"] = S3D::getStartTime();
00529 request.getFields()["EXITEMPTY"] = (ServerCommon::getExitEmpty()?"True":"False");
00530
00531 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "server.html", request.getFields(), text);
00532 }
00533
00534 bool ServerWebHandler::BannedHandler::processRequest(
00535 ServerWebServerIRequest &request,
00536 std::string &text)
00537 {
00538 if (!request.getSession()->credentials.hasPermission(
00539 ServerAdminSessions::PERMISSION_BANPLAYER)) return true;
00540
00541 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00542 if (action && 0 == strcmp(action, "Load"))
00543 ScorchedServerUtil::instance()->bannedPlayers.load(true);
00544
00545 const char *selected = ServerWebServerUtil::getField(request.getFields(), "selected");
00546 std::string banned;
00547 std::list<ServerBanned::BannedRange> &bannedIps =
00548 ScorchedServerUtil::instance()->bannedPlayers.getBannedIps();
00549 std::list<ServerBanned::BannedRange>::iterator itor;
00550 for (itor = bannedIps.begin();
00551 itor != bannedIps.end();
00552 itor++)
00553 {
00554 ServerBanned::BannedRange &range = (*itor);
00555 std::string mask = NetInterface::getIpName(range.mask);
00556
00557 std::map<unsigned int, ServerBanned::BannedEntry>::iterator ipitor;
00558 for (ipitor = range.ips.begin();
00559 ipitor != range.ips.end();
00560 ipitor++)
00561 {
00562 unsigned int ip = (*ipitor).first;
00563 ServerBanned::BannedEntry &entry = (*ipitor).second;
00564 std::string ipName = NetInterface::getIpName(ip);
00565
00566 if (selected && 0 == strcmp(selected, ipName.c_str()))
00567 {
00568 entry.type = ServerBanned::NotBanned;
00569 }
00570
00571 std::string cleanName;
00572 XMLNode::removeSpecialChars(LangStringUtil::convertFromLang(entry.name), cleanName);
00573 banned += S3D::formatStringBuffer("<tr><td>%s</td><td>%s</td><td>%s</td>"
00574 "<td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td>"
00575 "<td><input type=\"checkbox\" name=\"selected\" value=\"%s\"></td>"
00576 "</tr>",
00577 (entry.bantime?ctime(&entry.bantime):""),
00578 cleanName.c_str(),
00579 entry.uniqueid.c_str(),
00580 entry.SUI.c_str(),
00581 ServerBanned::getBannedTypeStr(entry.type),
00582 ipName.c_str(), mask.c_str(),
00583 entry.adminname.c_str(), entry.reason.c_str(),
00584 ipName.c_str());
00585 }
00586 }
00587 request.getFields()["BANNED"] = banned;
00588
00589 if (action && 0 == strcmp(action, "Save"))
00590 ScorchedServerUtil::instance()->bannedPlayers.save();
00591
00592 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "banned.html", request.getFields(), text);
00593 }
00594
00595 bool ServerWebHandler::ModsHandler::processRequest(
00596 ServerWebServerIRequest &request,
00597 std::string &text)
00598 {
00599 std::string modfiles;
00600 std::map<std::string, ModFileEntry *> &modFiles =
00601 ScorchedServer::instance()->getModFiles().getFiles();
00602 std::map<std::string, ModFileEntry *>::iterator itor;
00603 for (itor = modFiles.begin();
00604 itor != modFiles.end();
00605 itor++)
00606 {
00607 ModFileEntry *entry = (*itor).second;
00608 std::string cleanFileName;
00609 std::string dirtyFileName(entry->getFileName());
00610 XMLNode::removeSpecialChars(dirtyFileName, cleanFileName);
00611 modfiles += S3D::formatStringBuffer("<tr><td>%s</td><td>%u</td><td>%u</td><td>%u</td></tr>",
00612 cleanFileName.c_str(),
00613 entry->getCompressedSize(),
00614 entry->getCompressedCrc(),
00615 entry->getUncompressedSize());
00616 }
00617 request.getFields()["MODFILES"] = modfiles;
00618
00619 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "mods.html", request.getFields(), text);
00620 }
00621
00622 static void addUser(std::string &admins, ServerAdminSessions::Credential &crendential)
00623 {
00624 std::string permissions;
00625 std::set<std::string>::iterator permitor;
00626 for (permitor = crendential.permissions.begin();
00627 permitor != crendential.permissions.end();
00628 )
00629 {
00630 permissions.append(*permitor);
00631
00632 permitor++;
00633 if (permitor != crendential.permissions.end()) permissions.append(", ");
00634 }
00635
00636 admins += S3D::formatStringBuffer(
00637 "<tr>"
00638 "<td>%s</td>"
00639 "<td>%s</td>"
00640 "</tr>\n",
00641 crendential.username.c_str(),
00642 permissions.c_str()
00643 );
00644 }
00645
00646 bool ServerWebHandler::SessionsHandler::processRequest(
00647 ServerWebServerIRequest &request,
00648 std::string &text)
00649 {
00650
00651 {
00652 std::string sessions;
00653 std::map<unsigned int, ServerAdminSessions::SessionParams> &sessionparams =
00654 ServerAdminSessions::instance()->getAllSessions();
00655 std::map<unsigned int, ServerAdminSessions::SessionParams>::iterator itor;
00656 for (itor = sessionparams.begin(); itor != sessionparams.end(); itor++)
00657 {
00658 ServerAdminSessions::SessionParams ¶ms = (*itor).second;
00659
00660 time_t theTime = (time_t) params.sessionTime;
00661 const char *timeStr = ctime(&theTime);
00662 sessions += S3D::formatStringBuffer(
00663 "<tr>"
00664 "<td>%s</td>"
00665 "<td>%s</td>"
00666 "<td>%s</td>"
00667 "</tr>\n",
00668 params.credentials.username.c_str(),
00669 timeStr,
00670 params.ipAddress.c_str()
00671 );
00672 }
00673 request.getFields()["SESSIONS"] = sessions;
00674 }
00675
00676
00677 {
00678 std::string admins;
00679 addUser(admins, ServerAdminSessions::instance()->getLocalUserCredentials());
00680 std::list<ServerAdminSessions::Credential> creds;
00681 std::list<ServerAdminSessions::Credential>::iterator itor;
00682 ServerAdminSessions::instance()->getAllCredentials(creds);
00683 for (itor = creds.begin();
00684 itor != creds.end();
00685 itor++)
00686 {
00687 ServerAdminSessions::Credential &crendential = (*itor);
00688 addUser(admins, crendential);
00689 }
00690 request.getFields()["ADMINS"] = admins;
00691 }
00692
00693 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "sessions.html", request.getFields(), text);
00694 }
00695
00696 bool ServerWebHandler::AccountHandler::processRequest(
00697 ServerWebServerIRequest &request,
00698 std::string &text)
00699 {
00700 request.getFields()["USERNAME"] = request.getSession()->credentials.username;
00701
00702 const char *setpassword = ServerWebServerUtil::getField(request.getFields(), "setpassword");
00703 const char *oldpassword = ServerWebServerUtil::getField(request.getFields(), "oldpassword");
00704 const char *newpassword = ServerWebServerUtil::getField(request.getFields(), "newpassword");
00705 if (setpassword && oldpassword && newpassword)
00706 {
00707 if (request.getSession()->credentials.username ==
00708 ServerAdminSessions::instance()->getLocalUserCredentials().username)
00709 {
00710 request.getFields()["MESSAGE"] = "<b>Cannot set local connection password</b><br/>";
00711 }
00712 else
00713 {
00714 if (ServerAdminSessions::instance()->setPassword(
00715 request.getSession()->credentials.username.c_str(),
00716 oldpassword,
00717 newpassword))
00718 {
00719 request.getFields()["MESSAGE"] = "<b>New Password Set</b><br/>";
00720 }
00721 else
00722 {
00723 request.getFields()["MESSAGE"] = "<b>Wrong old password!</b><br/>";
00724 }
00725 }
00726 }
00727
00728 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "account.html", request.getFields(), text);
00729 }
00730
00731 bool ServerWebHandler::StatsHandler::processRequest(
00732 ServerWebServerIRequest &request,
00733 std::string &text)
00734 {
00735 std::string message;
00736
00737 const char *find;
00738 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00739 if (action &&
00740 (0 == strcmp(action, "Find")) &&
00741 (find = ServerWebServerUtil::getField(request.getFields(), "find")))
00742 {
00743 message.append("<b>Players</b>\n");
00744 message.append(StatsLogger::instance()->getPlayerInfo(find));
00745 }
00746 else if (action && (0 == strcmp(action, "Combine")))
00747 {
00748 const char *player1 = ServerWebServerUtil::getField(request.getFields(), "player1");
00749 const char *player2 = ServerWebServerUtil::getField(request.getFields(), "player2");
00750 if (player1 && player2)
00751 {
00752 int p1 = atoi(player1);
00753 int p2 = atoi(player2);
00754 if (p1 && p2)
00755 {
00756 StatsLogger::instance()->combinePlayers(p1, p2);
00757 message.append("<b>Combined</b>\n");
00758 }
00759 }
00760 }
00761 else
00762 {
00763 message.append("<b>Ranks</b>\n");
00764 message.append(StatsLogger::instance()->getTopRanks());
00765 }
00766
00767 int pos;
00768 while ((pos = message.find("\n")) > 0)
00769 {
00770 message.replace(pos, 1, "<br>");
00771 }
00772
00773 request.getFields()["RANKS"] = message;
00774
00775 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "stats.html", request.getFields(), text);
00776 }