Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- webservermanager.cpp:
- #include "stdinc.h"
- #include "DCPlusPlus.h"
- #include "WebServerManager.h"
- #include "QueueManager.h"
- #include "FinishedManager.h"
- #include "ClientManager.h"
- #include "LogManager.h"
- #include "StringTokenizer.h"
- WebServerManager* Singleton<WebServerManager>::instance = NULL;
- WebServerManager::WebServerManager() : started(false), sended_search(false), hub(-1) {
- SettingsManager::getInstance()->addListener(this);
- html_header1 =
- "<html>\n"
- "<head>\n"
- "<title>ZouDC</title>\n"
- "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n"
- ;
- html_header2 =
- "<link rel=\"stylesheet\" type=\"text/css\" href=\"http://www.123gen.com/monstyle.css\">\n"
- "<style type=\"text/css\">\n"
- "body {\n"
- "text-align: center;\n"
- "cursor: url(http://www.123gen.com/curseur.ani)\n"
- "}\n"
- "td {\n"
- "text-align: center;\n"
- "font: x-small Georgia, \"Times New Roman\", Times, serif\n"
- "}\n"
- "</style>\n"
- "</head>\n"
- "\n"
- "<body>\n"
- "<h1><a href=\"index.html\" style=\"color: #FF962D\">Contrôle de ZouDC par le web</a></h1>\n"
- "<font face=\"Georgia, Times New Roman, Times, serif\" size=\"2\"><b>\n"
- ;
- html_footer =
- "</blockquote>\n"
- "</b></font>\n"
- "</body>\n"
- "</html>"
- ;
- if(BOOLSETTING(WEBSERVER)) {
- try {
- Start();
- } catch(const Exception&) { }
- }
- }
- WebServerManager::~WebServerManager() {
- SettingsManager::getInstance()->removeListener(this);
- Stop();
- }
- void WebServerManager::Restart() {
- Stop();
- Start();
- }
- string WebServerManager::getLoginPage(bool mauvais_identifiants) {
- string pagehtml =
- html_header1 +
- html_header2 +
- "<blockquote>\n"
- ;
- if(mauvais_identifiants)
- pagehtml += "<font color=\"#FF0000\">Mauvais identifiants</font>\n";
- pagehtml +=
- "<form method=\"post\" action=\"index.html\">\n"
- "Login :\n"
- "<input type=\"text\" name=\"login\" size=\"20\"><br>\n"
- "Passe :\n"
- "<input type=\"password\" name=\"passe\" size=\"20\"><br>\n"
- "<input type=\"submit\" value=\"Connexion\">\n"
- "</form>\n" +
- html_footer
- ;
- return
- "HTTP/1.1 200 OK\r\n"
- "Content-Type: text/html\r\n"
- "Content-Length: " + Util::toString((int)pagehtml.size()) + "\r\n"
- "Connection: close\r\n"
- "\r\n" +
- pagehtml
- ;
- }
- string WebServerManager::getPage(const string& file) {
- string header = "HTTP/1.1 200 OK\r\n", pagehtml = html_header1;
- if(sended_search && (Util::stricmp(file.c_str(), "/rech.htm") == 0))
- pagehtml += "<meta http-equiv=\"refresh\" content=\"10;URL=rech.htm?stop=true\">";
- bool pas_dans_hub = ((Util::stricmp(file.c_str(), "/hub_.htm") != 0) && (Util::stricmp(file.c_str(), "/chat.htm") != 0));
- if(pas_dans_hub) {
- pagehtml +=
- html_header2 +
- "<a href=\"\"><img src=\"http://www.123gen.com/zoudc/barre.gif\" width=\"216\" height=\"24\" border=\"0\" usemap=\"#Barre\"></a>\n"
- "<map name=\"Barre\">\n"
- "<area shape=\"rect\" coords=\"0,0,24,24\" href=\"hubs.htm\" title=\"Hubs\">\n"
- "<area shape=\"rect\" coords=\"24,0,48,24\" href=\"liste_dl.htm\" title=\"Liste de téléchargement\">\n"
- "<area shape=\"rect\" coords=\"48,0,72,24\" href=\"dl_finis.htm\" title=\"Téléchargements terminés\">\n"
- "<area shape=\"rect\" coords=\"72,0,96,24\" href=\"ul_finis.htm\" title=\"Envois terminés\">\n"
- "<area shape=\"rect\" coords=\"96,0,120,24\" href=\"rech.htm\" title=\"Recherche\">\n"
- "<area shape=\"rect\" coords=\"120,0,144,24\" href=\"log.htm\" title=\"Log\">\n"
- "<area shape=\"rect\" coords=\"144,0,168,24\" href=\"options.htm\" title=\"Options\">\n"
- "<area shape=\"rect\" coords=\"168,0,192,24\" href=\"arret.htm\" title=\"Arrêt automatique\">\n"
- "<area shape=\"rect\" coords=\"192,0,216,24\" href=\"notepad.htm\" title=\"Bloc-notes\">\n"
- "</map>\n"
- "<hr>\n"
- "<blockquote>\n"
- ;
- }
- int action_arret = -1;
- if((Util::stricmp(file.c_str(), "/") == 0) || (Util::stricmp(file.c_str(), "/index.html") == 0)) {
- pagehtml += "Temps de fonctionnement : " + Util::formatSeconds(Util::getUptime()) + "<br>\n";
- StringList a_afficher = ClientManager::getInstance()->getStats();
- for(StringIter id_for = a_afficher.begin(); id_for != a_afficher.end(); ++id_for)
- pagehtml += *id_for + "<br>\n";
- } else if(Util::stricmp(file.c_str(), "/hubs.htm") == 0) {
- hubs.clear();
- ClientManager* clientMgr = ClientManager::getInstance();
- clientMgr->lock();
- Client::List& clients = clientMgr->getClients();
- for(Client::Iter i = clients.begin(); i != clients.end(); ++i) {
- hubs.push_back((*i)->getAddressPort());
- pagehtml += "<p><a href=\"hub.htm?hub=" + Util::toString(hubs.size() - 1) + "\">" + (*i)->getName() + "</a></p>\n";
- }
- clientMgr->unlock();
- } else if(Util::stricmp(file.c_str(), "/hub.htm") == 0) {
- chat = "";
- pagehtml +=
- "</blockquote>\n"
- "<iframe name=\"cadre_hub_\" width=\"0\" height=\"0\" style=\"display: none; visibility: hidden\"></iframe>\n"
- "<table width=\"90%\" height=\"50%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"
- "<tr>\n"
- "<td>\n"
- "<iframe name=\"cadre_chat\" src=\"chat.htm\" width=\"100%\" height=\"100%\" leftmargin=\"1\" topmargin=\"0\" marginwidth=\"1\" marginheight=\"0\"></iframe>\n"
- "</td>\n"
- "<td width=\"200\">\n"
- "<iframe name=\"cadre_users\" width=\"100%\" height=\"100%\" leftmargin=\"1\" topmargin=\"0\" marginwidth=\"1\" marginheight=\"0\"></iframe>\n"
- "</td>\n"
- "</tr>\n"
- "</table>\n"
- "<blockquote>\n"
- "<form name=\"form_envoi\" method=\"post\" action=\"hub_.htm\" target=\"cadre_hub_\" onSubmit=\"submit(); message.value=''; return false\">\n"
- "<input type=\"text\" name=\"message\" size=\"86\">\n"
- "<input type=\"submit\" value=\"Envoyer\">\n"
- "</form>\n"
- ;
- } else if(Util::stricmp(file.c_str(), "/hub_.htm") == 0) {
- pagehtml +=
- "</head>\n"
- "\n"
- "<body>\n"
- "<script language=\"JavaScript\">\n"
- "with (parent){\n"
- ;
- if((hub >= 0) && (hub < (int)hubs.size())) {
- fire(WebServerListener::CHAT_WEB, hubs[hub]);
- pagehtml +=
- "with (cadre_chat.document){\n"
- "body.innerHTML=\"" + chat + "\";\n"
- "if (getElementById(\"fin\")){ getElementById(\"fin\").scrollIntoView(); }\n"
- "}\n"
- "cadre_users.document.body.innerHTML=\"" + users + "\";\n"
- "}\n"
- "setTimeout(\"location='hub_.htm'\", 1000);\n"
- ;
- } else {
- pagehtml +=
- "cadre_chat.document.body.innerHTML=\"\";\n"
- "cadre_users.document.body.innerHTML=\"\";\n"
- "}\n"
- ;
- }
- pagehtml +=
- "</script>\n"
- "</body>\n"
- "</html>"
- ;
- } else if(Util::stricmp(file.c_str(), "/chat.htm") == 0) {
- pagehtml +=
- Util::styles +
- "</head>\n"
- "\n"
- "<body onLoad=\"parent.cadre_hub_.location='hub_.htm'\">\n"
- "</body>\n"
- "</html>"
- ;
- } else if(Util::stricmp(file.c_str(), "/liste_dl.htm") == 0)
- pagehtml += getDLQueue();
- else if(Util::stricmp(file.c_str(), "/dl_finis.htm") == 0)
- pagehtml += getFinished(false);
- else if(Util::stricmp(file.c_str(), "/ul_finis.htm") == 0)
- pagehtml += getFinished(true);
- else if(Util::stricmp(file.c_str(), "/rech.htm") == 0)
- pagehtml += getSearch();
- else if(Util::stricmp(file.c_str(), "/log.htm") == 0) {
- pagehtml +=
- "<p align=\"left\">\n" +
- fichier_HTML(Util::validateFileName(SETTING(LOG_DIRECTORY) + "Contrôle de ZouDC par le web.log")) +
- "</p>\n"
- ;
- } else if(Util::stricmp(file.c_str(), "/options.htm") == 0) {
- pagehtml +=
- "<form method=\"get\" action=\"options.htm\">\n"
- "<input type=\"checkbox\" name=\"deconnexion_lents\""
- ;
- if(BOOLSETTING(DISCONNECTING_ENABLE))
- pagehtml += " checked";
- pagehtml +=
- ">Activer la déconnexion des utilisateurs lents<br>\n"
- "<input type=\"checkbox\" name=\"limiter\""
- ;
- if(BOOLSETTING(THROTTLE_ENABLE))
- pagehtml += " checked";
- pagehtml +=
- ">Limiter la bande passante<br>\n"
- "<input type=\"submit\" name=\"options\" value=\"Ok !\">\n"
- "</form>\n"
- ;
- } else if(Util::stricmp(file.c_str(), "/arret.htm") == 0)
- pagehtml +=
- "<p><a href=\"eteindre.htm\">Éteindre l'ordinateur</a></p>\n"
- "<p><a href=\"session.htm\">Fermer la session</a></p>\n"
- "<p><a href=\"redem.htm\">Redémarrer l'ordinateur</a></p>\n"
- "<p><a href=\"quitter.htm\">Quitter ZouDC</a></p>\n"
- ;
- else if(Util::stricmp(file.c_str(), "/eteindre.htm") == 0)
- action_arret = 0;
- else if(Util::stricmp(file.c_str(), "/session.htm") == 0)
- action_arret = 1;
- else if(Util::stricmp(file.c_str(), "/redem.htm") == 0)
- action_arret = 2;
- else if(Util::stricmp(file.c_str(), "/quitter.htm") == 0)
- action_arret = 3;
- else if(Util::stricmp(file.c_str(), "/notepad.htm") == 0) {
- pagehtml +=
- "<p align=\"left\">\n" +
- fichier_HTML(Util::getAppPath() + "Notepad.txt") +
- "</p>\n"
- ;
- } else {
- header = "HTTP/1.1 404 Not Found\r\n";
- pagehtml += "Page introuvable\n";
- }
- if(action_arret != -1) {
- fire(WebServerListener::ARRET, action_arret);
- pagehtml +=
- "Demande d'arrêt envoyée<br>\n"
- "Temps avant l'arrêt : " + Util::toTime(SETTING(SHUTDOWN_TIMEOUT)) + "\n"
- ;
- }
- if(pas_dans_hub) {
- pagehtml +=
- "</blockquote>\n"
- "<hr>\n"
- "<blockquote>\n"
- "<a href=\"javascript:location.reload()\">Rafraîchir</a> - <a href=\"index.html\">Retour à la page d'accueil</a> - <a href=\"?deconnexion=1\">Déconnexion</a>\n" +
- html_footer
- ;
- }
- header +=
- "Content-Type: text/html\r\n"
- "Content-Length: " + Util::toString((int)pagehtml.size()) + "\r\n"
- "Connection: close\r\n"
- "\r\n"
- ;
- return header + pagehtml;
- }
- void WebServerManager::search(string search_str, int search_type) {
- if(!sended_search) {
- int i = 0;
- while((i = search_str.find("+", i)) != string::npos) {
- search_str.replace(i, 1, " ");
- i++;
- }
- if((SearchManager::TypeModes)search_type == SearchManager::TYPE_HASH)
- search_str = "TTH:" + search_str;
- SearchManager::getInstance()->addListener(this);
- SearchManager::getInstance()->search(search_str, (SearchManager::TypeModes)search_type);
- results = Util::emptyString;
- row = 0;
- sended_search = true;
- }
- }
- void WebServerManager::reset() {
- row = 0;
- SearchManager::getInstance()->removeListener(this);
- }
- void WebServerManager::Start() {
- if(started)
- return;
- Lock l(cs);
- started = true;
- socket.addListener(this);
- socket.waitForConnections((uint16_t)SETTING(WEBSERVER_PORT));
- fire(WebServerListener::SETUP);
- }
- void WebServerManager::Stop() {
- if(!started)
- return;
- started = false;
- Lock l(cs);
- socket.removeListener(this);
- socket.disconnect();
- }
- string WebServerManager::getDLQueue() {
- string ret =
- "</blockquote>\n"
- "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"
- "<tr>\n"
- "<td><b>Nom du fichier</b></td>\n"
- "<td><b>Taille</b></td>\n"
- "<td><b>Téléchargé</b></td>\n"
- "</tr>\n"
- ;
- const QueueItem::StringMap& li = QueueManager::getInstance()->lockQueue();
- for(QueueItem::StringMap::const_iterator j = li.begin(); j != li.end(); ++j) {
- QueueItem* aQI = j->second;
- double percent = (aQI->getSize() > 0) ? aQI->getDownloadedBytes() * 100.0 / aQI->getSize() : 0;
- ret +=
- "<tr>\n"
- "<td>" + aQI->getTargetFileName() + "</td>\n"
- "<td>" + Util::formatBytes(aQI->getSize()) + "</td>\n"
- "<td>" + Util::formatBytes(aQI->getDownloadedBytes()) + " (" + Util::toString(percent) + "%)</td>\n"
- "</tr>\n"
- ;
- }
- QueueManager::getInstance()->unlockQueue();
- ret +=
- "</table>\n"
- "<blockquote>\n"
- ;
- return ret;
- }
- string WebServerManager::getFinished(bool uploads) {
- string ret =
- "</blockquote>\n"
- "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"
- "<tr>\n"
- "<td><b>Temps</b></td>\n"
- "<td><b>Fichier</b></td>\n"
- "<td><b>Taille</b></td>\n"
- "</tr>\n"
- ;
- const FinishedItem::List& fl = FinishedManager::getInstance()->lockList(uploads);
- for(FinishedItem::List::const_iterator i = fl.begin(); i != fl.end(); ++i) {
- ret +=
- "<tr>\n"
- "<td>" + Util::formatTime(SETTING(TIMESTAMPS_LOGS), (*i)->getTime()) + "</td>\n"
- "<td>" + Util::getFileName((*i)->getTarget()) + "</td>\n"
- "<td>" + Util::formatBytes((*i)->getSize()) + "</td>\n"
- "</tr>\n"
- ;
- }
- FinishedManager::getInstance()->unlockList();
- ret +=
- "</table>\n"
- "<blockquote>\n"
- ;
- return ret;
- }
- string WebServerManager::getSearch() {
- string ret = "<form method=\"post\" action=\"rech.htm\" enctype=\"multipart/form-data\">\n";
- if(sended_search) {
- ret +=
- "Recherche en cours...<br>\n"
- "<input type=\"submit\" name=\"stop\" value=\"Arrêter la recherche\">\n"
- "</form>\n"
- ;
- sended_search = false;
- } else {
- ret +=
- "Rechercher :\n"
- "<input type=\"text\" name=\"recherche\" size=\"20\"><br>\n"
- "<select name=\"type\">\n"
- "<option value=\"0\" selected>Tous</option>\n"
- "<option value=\"1\">Audio</option>\n"
- "<option value=\"2\">Fichier compressé</option>\n"
- "<option value=\"3\">Document</option>\n"
- "<option value=\"4\">Programme</option>\n"
- "<option value=\"5\">Image</option>\n"
- "<option value=\"6\">Vidéo</option>\n"
- "<option value=\"7\">Dossier</option>\n"
- "<option value=\"8\">TTH</option>\n"
- "</select><br>\n"
- "<input type=\"submit\" value=\"Recherche\">\n"
- "</form>\n"
- ;
- if(!results.empty()) {
- ret +=
- "</blockquote>\n"
- "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"
- "<tr>\n"
- "<td><b>Utilisateur</b></td>\n"
- "<td><b>Fichier</b></td>\n"
- "<td><b>Taille</b></td>\n"
- "<td><b>TTH</b></td>\n"
- "</tr>\n" +
- results +
- "</table>\n"
- ;
- }
- results = Util::emptyString;
- }
- return ret;
- }
- string WebServerManager::fichier_HTML(const string& chemin) {
- string a_retourner;
- try {
- a_retourner = File(chemin, File::READ, File::OPEN).read();
- } catch (const FileException&) { }
- if(!a_retourner.empty())
- Util::remplacer("\r\n", "<br>\n", a_retourner);
- return a_retourner;
- }
- // ServerSocketListener
- void WebServerManager::onAction(ServerSocketListener::Types type) throw() {
- if(type == ServerSocketListener::INCOMING_CONNECTION) {
- WebServerSocket* wss = new WebServerSocket();
- wss->accept(&socket);
- wss->start();
- }
- }
- // SettingsManagerListener
- void WebServerManager::onAction(SettingsManagerListener::Types type, SimpleXML* /*xml*/) throw() {
- if((type == SettingsManagerListener::LOAD) || (type == SettingsManagerListener::SAVE))
- BOOLSETTING(WEBSERVER) ? Restart() : Stop();
- }
- // SearchManagerListener
- void WebServerManager::onAction(SearchManagerListener::Types type, SearchResult* sr) throw() {
- if(type == SearchManagerListener::SEARCH_RESULT) {
- {
- Lock l(cs);
- if(sr->getType() == SearchResult::TYPE_FILE) {
- string TTH = (sr->getTTH() == NULL) ? Util::emptyString : sr->getTTH()->toBase32();
- results +=
- "<tr style=\"cursor: hand\" onMouseOver=\"this.style.background='#DEFFBD'\" onMouseOut=\"this.style.background=''\" onClick=\"form" + Util::toString(row) + ".submit()\">\n"
- "<td>\n"
- "<form method=\"post\" name=\"form" + Util::toString(row) + "\" action=\"rech.htm\">\n"
- "<input type=\"hidden\" name=\"taille\" value=\"" + Util::toString(sr->getSize()) + "\">\n"
- "<input type=\"hidden\" name=\"fichier\" value=\"" + sr->getFileName() + "\">\n"
- "<input type=\"hidden\" name=\"tth\" value=\"" + TTH + "\">\n"
- "<input type=\"hidden\" name=\"type\" value=\"" + Util::toString(sr->getType()) + "\">\n"
- "</form>\n" +
- sr->getUser()->getNick() + "\n"
- "</td>\n"
- "<td>" + sr->getFileName() + "</td>\n"
- "<td>" + Util::formatBytes(sr->getSize()) + "</td>\n"
- "<td>" + (TTH.empty() ? "Pas de TTH" : "<span title=\"" + TTH + "\">" + TTH.substr(0, 2) + "..." + TTH.substr(TTH.size() - 2) + "</span>") + "</td>\n"
- "</tr>\n"
- ;
- row++;
- }
- }
- }
- }
- void WebServerSocket::accept(ServerSocket* s) {
- int fromlen = sizeof(from);
- sock = ::accept(s->getSocket(), (struct sockaddr*)&from, &fromlen);
- u_long b = 1;
- ::ioctlsocket(sock, FIONBIO, &b);
- }
- string WebServerSocket::erreur(const string& contenu) {
- return
- "HTTP/1.1 " + contenu + "\r\n"
- "Connection: close\r\n"
- "\r\n"
- ;
- }
- StringMap WebServerSocket::getArgs(const string& arguments) {
- StringMap args;
- string::size_type i, j = 0, idx;
- while((i = arguments.find("=", j)) != string::npos) {
- string key = arguments.substr(j, i - j), value = arguments.substr(i + 1);
- j = i + 1;
- if((i = arguments.find("&", j)) != string::npos) {
- value = arguments.substr(j, i - j);
- j = i + 1;
- }
- for(idx = 0; idx < value.size(); ++idx) {
- if((value.size() > (idx + 2)) && (value[idx] == '%') && isxdigit(value[idx + 1]) && isxdigit(value[idx + 2])) {
- value[idx] = Util::fromHexEscape(value.substr(idx + 1, 2));
- value.erase(idx + 1, 2);
- } else if(value[idx] == '+')
- value[idx] = ' ';
- }
- args[key] = value;
- }
- return args;
- }
- int WebServerSocket::run() {
- string requete;
- int compteur = 0;
- while(true) {
- if(++compteur > 10000)
- break;
- u_long restants;
- if(::ioctlsocket(sock, FIONREAD, &restants) == SOCKET_ERROR)
- continue;
- if(restants > 0) {
- char* buffeur = new char[restants + 1];
- int recus = ::recv(sock, buffeur, restants, 0);
- if((recus != SOCKET_ERROR) && (recus > 0))
- requete.append(buffeur, recus);
- delete[] buffeur;
- continue;
- }
- if(requete.empty())
- continue;
- string::size_type fin = requete.find("\r\n");
- if(fin == string::npos)
- continue;
- string a_envoyer;
- StringList champs = StringTokenizer(requete.substr(0, fin), ' ').getTokens();
- if(champs.size() == 3) {
- if((champs[2] == "HTTP/1.0") || (champs[2] == "HTTP/1.1")) {
- bool par_POST = (champs[0] == "POST");
- if(par_POST) {
- string::size_type debut = requete.find("Content-Length: ");
- if(debut == string::npos) {
- if(requete.find("\r\n\r\n") != string::npos)
- a_envoyer = erreur("411 Length Required");
- else
- continue;
- } else {
- debut += 16;
- fin = requete.find("\r\n", debut);
- if(fin == string::npos)
- continue;
- if(fin == debut)
- a_envoyer = erreur("400 Bad Request");
- else {
- int64_t content_length = Util::toInt64(requete.substr(debut, fin - debut));
- if(content_length < 0)
- a_envoyer = erreur("400 Bad Request");
- else {
- debut = requete.find("\r\n\r\n");
- if((debut == string::npos) || ((requete.size() - debut - 4) != content_length))
- continue;
- }
- }
- }
- }
- if((par_POST && a_envoyer.empty()) || (champs[0] == "GET")) {
- if(champs[1].empty())
- a_envoyer = erreur("400 Bad Request");
- else {
- string IP = Util::toString(from.sin_addr.S_un.S_un_b.s_b1) + '.' + Util::toString(from.sin_addr.S_un.S_un_b.s_b2) + '.' + Util::toString(from.sin_addr.S_un.S_un_b.s_b3) + '.' + Util::toString(from.sin_addr.S_un.S_un_b.s_b4);
- if(BOOLSETTING(LOG_WEBSERVER) && (Util::stricmp(champs[1].c_str(), "/hub_.htm") != 0) && (Util::stricmp(champs[1].c_str(), "/chat.htm") != 0))
- LOGDT("Contrôle de ZouDC par le web", IP + " : " + champs[1]);
- bool mauvais_identifiants = false;
- string::size_type start = par_POST ? requete.rfind("\r\n") : champs[1].find("?");
- if(start != string::npos) {
- StringMap m = getArgs(par_POST ? requete.substr(start + 2) : champs[1].substr(start + 1));
- if(par_POST && (!m["login"].empty())) {
- if((m["login"] == SETTING(WEBSERVER_LOGIN)) && (m["passe"] == SETTING(WEBSERVER_PASSE)))
- WebServerManager::getInstance()->setLogin_IP(IP);
- else
- mauvais_identifiants = true;
- }
- if(WebServerManager::getInstance()->getLogin_IP() == IP) {
- if(!m["deconnexion"].empty())
- WebServerManager::getInstance()->setLogin_IP("");
- if(!m["recherche"].empty())
- WebServerManager::getInstance()->search(m["recherche"], Util::toInt(m["type"]));
- if(!m["stop"].empty())
- WebServerManager::getInstance()->reset();
- if(!m["fichier"].empty())
- QueueManager::getInstance()->add(m["fichier"], Util::toInt64(m["taille"]), m["tth"]);
- if(!m["hub"].empty())
- WebServerManager::getInstance()->setHub(Util::toInt(m["hub"]));
- if(!m["message"].empty()) {
- string hub_courant = WebServerManager::getInstance()->hub_courant();
- if(!hub_courant.empty())
- WebServerManager::getInstance()->fire(WebServerListener::MESSAGE_HUB, hub_courant, m["message"]);
- }
- if(!m["options"].empty()) {
- SettingsManager::getInstance()->set(SettingsManager::DISCONNECTING_ENABLE, !m["deconnexion_lents"].empty());
- SettingsManager::getInstance()->set(SettingsManager::THROTTLE_ENABLE, !m["limiter"].empty());
- WebServerManager::getInstance()->fire(WebServerListener::LIMITATION, !m["limiter"].empty());
- }
- }
- }
- a_envoyer = (WebServerManager::getInstance()->getLogin_IP() == IP) ? WebServerManager::getInstance()->getPage(par_POST ? champs[1] : champs[1].substr(0, start)) : WebServerManager::getInstance()->getLoginPage(mauvais_identifiants);
- }
- } else
- a_envoyer = erreur("501 Not Implemented");
- } else
- a_envoyer = erreur("505 Version not supported");
- } else
- a_envoyer = erreur("400 Bad Request");
- if(!a_envoyer.empty())
- ::send(sock, a_envoyer.c_str(), a_envoyer.size(), 0);
- break;
- }
- ::closesocket(sock);
- delete this;
- return 0;
- }
- webservermanager.h:
- #ifndef ZOUDC_CLIENT_WEBSERVERMANAGER_H
- #define ZOUDC_CLIENT_WEBSERVERMANAGER_H
- #pragma once
- #include "ServerSocket.h"
- #include "SettingsManager.h"
- #include "SearchManager.h"
- class WebServerListener {
- public:
- enum Types {
- SETUP,
- CHAT_WEB,
- MESSAGE_HUB,
- LIMITATION,
- ARRET
- };
- virtual void onAction(Types) throw() { }
- virtual void onAction(Types, const string&) throw() { }
- virtual void onAction(Types, const string&, const string&) throw() { }
- virtual void onAction(Types, bool) throw() { }
- virtual void onAction(Types, int) throw() { }
- };
- class WebServerManager : public Singleton<WebServerManager>, public ServerSocketListener, public Speaker<WebServerListener>, private SettingsManagerListener, private SearchManagerListener
- {
- private:
- friend Singleton<WebServerManager>;
- WebServerManager();
- ~WebServerManager();
- public:
- void Restart();
- string getLoginPage(bool mauvais_identifiants);
- string getPage(const string& file);
- void search(string search_str, int search_type);
- void reset();
- ServerSocket& getServerSocket() { return socket; }
- void setHub(int hub_) { hub = hub_; }
- string hub_courant() { return ((hub >= 0) && (hub < (int)hubs.size())) ? hubs[hub] : ""; }
- void setChat(const string& chat_) { chat = chat_; }
- void setUsers(const string& users_) { users = users_; }
- GETSET(string, login_IP, Login_IP);
- private:
- ServerSocket socket;
- string html_header1, html_header2, html_footer;
- StringList hubs;
- int hub;
- string chat, users;
- bool started, sended_search;
- string results;
- int row; // Counter to permit FireFox correct item clicks
- CriticalSection cs;
- void Start();
- void Stop();
- string getDLQueue();
- string getFinished(bool uploads);
- string getSearch();
- string fichier_HTML(const string& chemin);
- // ServerSocketListener
- virtual void onAction(ServerSocketListener::Types type) throw();
- // SettingsManagerListener
- virtual void onAction(SettingsManagerListener::Types type, SimpleXML* /*xml*/) throw();
- // SearchManagerListener
- virtual void onAction(SearchManagerListener::Types type, SearchResult* sr) throw();
- };
- class WebServerSocket : public Thread {
- public:
- void accept(ServerSocket* s);
- inline string erreur(const string& contenu);
- StringMap getArgs(const string& arguments);
- virtual int run();
- private:
- sockaddr_in from;
- SOCKET sock;
- };
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement