ServerWebHandler.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2004
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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         // Check for an add
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         // Check for any action
00088         const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00089         if (action)
00090         {
00091                 for (itor = tanks.begin(); itor != tanks.end(); itor++)
00092                 {
00093                         // Is this tank selected
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         // Player Entries
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>" // Id
00180                         "<td>%s</td>" // Name
00181                         "<td>%s</td>" // Type
00182                         "<td>%s</td>" // Time
00183                         "<td>%s</td>" // Score
00184                         "<td>%s</td>" // State
00185                         "<td>%s</td>" // Team
00186                         "<td><input type=\"checkbox\" name=\"player-%u\"></td>" // Select
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         // Add entries
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         // Check for any action
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         // Log entries
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         // Pages
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>&nbsp;",
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                 // Disallow directory backtracking
00332                 !strstr(logFilename, "..") &&
00333                 !strstr(logFilename, ":") &&
00334                 !strstr(logFilename, "/") &&
00335                 !strstr(logFilename, "\\"))
00336         {
00337                 // We've requested to view a log file
00338                 // So load the file and display it
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                 // We've requested to see the list of current log files
00356 
00357                 // Check to see if we want to search these files
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                 // Iterator through all of the log files in the logs directory
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                                 // Only show files from this server (this port)
00383                                 if (0 == strstr(fileName.c_str(), portNumber.c_str())) continue;
00384 
00385                                 // If searching is enabled check to see if this file contains 
00386                                 // the specified string
00387                                 if (search)
00388                                 {
00389                                         std::string file = ServerWebServerUtil::getFile(fullFilename);
00390                                         if (0 == strstr(file.c_str(), search)) continue;
00391                                 }
00392 
00393                                 // Add this file to the list of files to view
00394                                 LogFile logFile;
00395                                 logFile.fileName = fileName;
00396                                 logFile.fileTime = S3D::fileModTime(fullFilename);
00397                                 logFiles.push_back(logFile);
00398                         }
00399                 }
00400 
00401                 // Sort the list of files to view
00402                 std::sort(logFiles.begin(), logFiles.end(), lt_logfile);
00403 
00404                 // Create the table that will show the list of log files
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         // Check for any action
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         // Check for any action
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>" // Select
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>" // Name
00639                 "<td>%s</td>" // Permisions
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         // Sessions Entries
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 &params = (*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>" // Name
00665                                 "<td>%s</td>" // Time
00666                                 "<td>%s</td>" // Ip
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         // List of admins
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 }

Generated on Mon Feb 16 15:14:53 2009 for Scorched3D by  doxygen 1.5.3