📄 webserver.cpp
字号:
#include "StdAfx.h"
#include "emule.h"
#include "webserver.h"
#include "XBMDraw.h"
#include "ED2KLink.h"
#include "MD5Sum.h"
#include <stdlib.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define HTTPInit "Server: eMule\r\nPragma: no-cache\r\nExpires: 0\r\nCache-Control: no-cache, no-store, must-revalidate\r\nConnection: close\r\nContent-Type: text/html\r\n"
#define HTTPInitGZ "Server: eMule\r\nPragma: no-cache\r\nExpires: 0\r\nCache-Control: no-cache, no-store, must-revalidate\r\nConnection: close\r\nContent-Type: text/html\r\nContent-Encoding: gzip\r\n"
#define WEB_SERVER_TEMPLATES_VERSION 2
static dwThread = 0;
CWebServer::CWebServer(void)
{
m_Params.bShowUploadQueue = false;
m_Params.DownloadSort = DOWN_SORT_NAME;
m_Params.bDownloadSortReverse = false;
m_Params.ServerSort = SERVER_SORT_NAME;
m_Params.bServerSortReverse = false;
m_Params.SharedSort = SHARED_SORT_NAME;
m_Params.bSharedSortReverse = false;
dwThread = GetCurrentThreadId();
m_bServerWorking = false;
}
void CWebServer::ReloadTemplates()
{
CString sFile = theApp.glob_prefs->GetAppDir() + CString("eMule.tmpl");
CStdioFile file;
if(file.Open(sFile, CFile::modeRead|CFile::typeText))
{
CString sAll;
for(;;)
{
CString sLine;
if(!file.ReadString(sLine))
break;
sAll += sLine + "\n";
}
file.Close();
CString sVersion = _LoadTemplate(sAll,"TMPL_VERSION");
long lVersion = atol(sVersion);
if(lVersion < WEB_SERVER_TEMPLATES_VERSION)
{
if(m_bServerWorking)
theApp.emuledlg->AddLogLine(true,GetResString(IDS_WS_ERR_LOADTEMPLATE),sFile);
}
else
{
m_Templates.sHeader = _LoadTemplate(sAll,"TMPL_HEADER");
m_Templates.sHeaderMetaRefresh = _LoadTemplate(sAll,"TMPL_HEADER_META_REFRESH");
m_Templates.sHeaderStylesheet = _LoadTemplate(sAll,"TMPL_HEADER_STYLESHEET");
m_Templates.sFooter = _LoadTemplate(sAll,"TMPL_FOOTER");
m_Templates.sServerList = _LoadTemplate(sAll,"TMPL_SERVER_LIST");
m_Templates.sServerLine = _LoadTemplate(sAll,"TMPL_SERVER_LINE");
m_Templates.sTransferImages = _LoadTemplate(sAll,"TMPL_TRANSFER_IMAGES");
m_Templates.sTransferList = _LoadTemplate(sAll,"TMPL_TRANSFER_LIST");
m_Templates.sTransferDownHeader = _LoadTemplate(sAll,"TMPL_TRANSFER_DOWN_HEADER");
m_Templates.sTransferDownFooter = _LoadTemplate(sAll,"TMPL_TRANSFER_DOWN_FOOTER");
m_Templates.sTransferDownLine = _LoadTemplate(sAll,"TMPL_TRANSFER_DOWN_LINE");
m_Templates.sTransferDownLineGood = _LoadTemplate(sAll,"TMPL_TRANSFER_DOWN_LINE_GOOD");
m_Templates.sTransferUpHeader = _LoadTemplate(sAll,"TMPL_TRANSFER_UP_HEADER");
m_Templates.sTransferUpFooter = _LoadTemplate(sAll,"TMPL_TRANSFER_UP_FOOTER");
m_Templates.sTransferUpLine = _LoadTemplate(sAll,"TMPL_TRANSFER_UP_LINE");
m_Templates.sTransferUpQueueShow = _LoadTemplate(sAll,"TMPL_TRANSFER_UP_QUEUE_SHOW");
m_Templates.sTransferUpQueueHide = _LoadTemplate(sAll,"TMPL_TRANSFER_UP_QUEUE_HIDE");
m_Templates.sTransferUpQueueLine = _LoadTemplate(sAll,"TMPL_TRANSFER_UP_QUEUE_LINE");
m_Templates.sTransferBadLink = _LoadTemplate(sAll,"TMPL_TRANSFER_BAD_LINK");
m_Templates.sDownloadLink = _LoadTemplate(sAll,"TMPL_DOWNLOAD_LINK");
m_Templates.sSharedList = _LoadTemplate(sAll,"TMPL_SHARED_LIST");
m_Templates.sSharedLine = _LoadTemplate(sAll,"TMPL_SHARED_LINE");
m_Templates.sSharedLineChanged = _LoadTemplate(sAll,"TMPL_SHARED_LINE_CHANGED");
m_Templates.sGraphs = _LoadTemplate(sAll,"TMPL_GRAPHS");
m_Templates.sLog = _LoadTemplate(sAll,"TMPL_LOG");
m_Templates.sServerInfo = _LoadTemplate(sAll,"TMPL_SERVERINFO");
m_Templates.sDebugLog = _LoadTemplate(sAll,"TMPL_DEBUGLOG");
m_Templates.sStats = _LoadTemplate(sAll,"TMPL_STATS");
m_Templates.sPreferences = _LoadTemplate(sAll,"TMPL_PREFERENCES");
m_Templates.sLogin = _LoadTemplate(sAll,"TMPL_LOGIN");
m_Templates.sConnectedServer = _LoadTemplate(sAll,"TMPL_CONNECTED_SERVER");
m_Templates.sAddServerBox = _LoadTemplate(sAll,"TMPL_ADDSERVERBOX");
m_Templates.sWebSearch = _LoadTemplate(sAll,"TMPL_WEBSEARCH");
m_Templates.iProgressbarWidth=atoi(_LoadTemplate(sAll,"PROGRESSBARWIDTH"));
m_Templates.sResDir = _LoadTemplate(sAll,"RESSOURCES_PATH");
}
}
else
if(m_bServerWorking)
theApp.emuledlg->AddLogLine(true,GetResString(IDS_WEB_ERR_CANTLOAD), sFile);
}
CWebServer::~CWebServer(void)
{
if (m_bServerWorking) StopSockets();
}
CString CWebServer::_LoadTemplate(CString sAll, CString sTemplateName)
{
CString sRet = "";
int nStart = sAll.Find("<--" + sTemplateName + "-->");
int nEnd = sAll.Find("<--" + sTemplateName + "_END-->");
if(nStart != -1 && nEnd != -1)
{
nStart += sTemplateName.GetLength() + 7;
sRet = sAll.Mid(nStart, nEnd - nStart - 1);
}
if(sRet.IsEmpty())
{
if (sTemplateName=="TMPL_VERSION")
theApp.emuledlg->AddLogLine(true,GetResString(IDS_WS_ERR_LOADTEMPLATE),sTemplateName);
theApp.emuledlg->AddDebugLogLine(false,GetResString(IDS_WEB_ERR_CANTLOAD),sTemplateName);
}
return sRet;
}
void CWebServer::StartServer(void)
{
if(m_bServerWorking != theApp.glob_prefs->GetWSIsEnabled())
m_bServerWorking = theApp.glob_prefs->GetWSIsEnabled();
else
return;
if (m_bServerWorking) {
ReloadTemplates();
StartSockets(this);
} else StopSockets();
if(theApp.glob_prefs->GetWSIsEnabled())
theApp.emuledlg->AddLogLine(false,"%s: %s",_GetPlainResString(IDS_PW_WS), _GetPlainResString(IDS_ENABLED));
else
theApp.emuledlg->AddLogLine(false,"%s: %s",_GetPlainResString(IDS_PW_WS), _GetPlainResString(IDS_DISABLED));
}
void CWebServer::_RemoveServer(CString sIP)
{
CServer* server=theApp.serverlist->GetServerByAddress(sIP.GetBuffer() ,0);
if (server!=NULL) theApp.emuledlg->SendMessage(WEB_REMOVE_SERVER, (WPARAM)server, NULL);
}
void CWebServer::_SetSharedFilePriority(CString hash, uint8 priority)
{
CKnownFile* cur_file;
uchar fileid[16];
DecodeBase16(hash.GetBuffer(),hash.GetLength(),fileid);
cur_file=theApp.sharedfiles->GetFileByID(fileid);
if (cur_file==0) return;
if(priority >= 0 && priority < 5)
{
cur_file->SetAutoUpPriority(false);
cur_file->SetUpPriority(priority);
}
else if(priority == 5)// && cur_file->IsPartFile())
{
cur_file->SetAutoUpPriority(true);
cur_file->UpdateAutoUpPriority();
}
}
void CWebServer::AddStatsLine(UpDown line)
{
m_Params.PointsForWeb.Add(line);
if(m_Params.PointsForWeb.GetCount() > WEB_GRAPH_WIDTH)
m_Params.PointsForWeb.RemoveAt(0);
}
CString CWebServer::_SpecialChars(CString str)
{
str.Replace("&","&");
str.Replace("<","<");
str.Replace(">",">");
str.Replace("\"",""");
return str;
}
void CWebServer::_ConnectToServer(CString sIP)
{
CServer* server=theApp.serverlist->GetServerByAddress(sIP.GetBuffer(),0);
if (server!=NULL) theApp.emuledlg->SendMessage(WEB_CONNECT_TO_SERVER, (WPARAM)server, NULL);
}
void CWebServer::ProcessURL(ThreadData Data)
{
CWebServer *pThis = (CWebServer *)Data.pThis;
if(pThis == NULL)
return;
SetThreadLocale(theApp.glob_prefs->GetLanguageID());
CoInitialize(NULL);
bool isUseGzip = theApp.glob_prefs->GetWebUseGzip();
CString Out = "";
CString OutE = ""; // List Entry Templates
CString OutE2 = "";
CString OutS = ""; // ServerStatus Templates
TCHAR *gzipOut = NULL;
long gzipLen;
CString HTTPProcessData = "";
CString HTTPTemp = "";
char HTTPTempC[100] = "";
srand ( time(NULL) );
long lSession = 0;
if(_ParseURL(Data.sURL, "ses") != "")
lSession = atol(_ParseURL(Data.sURL, "ses"));
if (_ParseURL(Data.sURL, "w") == "password")
{
CString test=MD5Sum(_ParseURL(Data.sURL, "p")).GetHash();
if(MD5Sum(_ParseURL(Data.sURL, "p")).GetHash() == theApp.glob_prefs->GetWSPass())
{
Session ses;
ses.admin=true;
ses.startTime = CTime::GetCurrentTime();
ses.lSession = lSession = rand() * 10000L + rand();
pThis->m_Params.Sessions.Add(ses);
theApp.emuledlg->AddLogLine(true,GetResString(IDS_WEB_ADMINLOGIN),ses.lSession);
}
else if(theApp.glob_prefs->GetWSLowPass()!="" && MD5Sum(_ParseURL(Data.sURL, "p")).GetHash() == theApp.glob_prefs->GetWSLowPass())
{
Session ses;
ses.admin=false;
ses.startTime = CTime::GetCurrentTime();
ses.lSession = lSession = rand() * 10000L + rand();
pThis->m_Params.Sessions.Add(ses);
theApp.emuledlg->AddLogLine(true,GetResString(IDS_WEB_GUESTLOGIN),ses.lSession);
} else {
theApp.emuledlg->AddLogLine(true,GetResString(IDS_WEB_BADLOGINATTEMPT));
}
isUseGzip = false; // [Julien]
}
CString sSession; sSession.Format("%ld", lSession);
if (_ParseURL(Data.sURL, "w") == "logout")
_RemoveSession(Data, lSession);
if(_IsLoggedIn(Data, lSession))
{
Out += _GetHeader(Data, lSession);
CString sPage = _ParseURL(Data.sURL, "w");
if (sPage == "server")
{
Out += _GetServerList(Data);
}
else
if (sPage == "download")
{
Out += _GetDownloadLink(Data);
}
else
if (sPage == "shared")
{
Out += _GetSharedFilesList(Data);
}
else
if (sPage == "transfer")
{
Out += _GetTransferList(Data);
}
else
if (sPage == "websearch")
{
Out += _GetWebSearch(Data);
}
else
if (sPage == "graphs")
{
Out += _GetGraphs(Data);
}
else
if (sPage == "log")
{
Out += _GetLog(Data);
}
if (sPage == "sinfo")
{
Out += _GetServerInfo(Data);
}
if (sPage == "debuglog")
{
Out += _GetDebugLog(Data);
}
if (sPage == "stats")
{
Out += _GetStats(Data);
}
if (sPage == "options")
{
Out += _GetPreferences(Data);
}
Out += _GetFooter(Data);
if (sPage == "")
isUseGzip = false;
if(isUseGzip)
{
bool bOk = false;
try
{
uLongf destLen = Out.GetLength() + 1024;
gzipOut = new TCHAR[destLen];
if(_GzipCompress((Bytef*)gzipOut, &destLen, (const Bytef*)(TCHAR*)Out.GetBuffer(0), Out.GetLength(), Z_DEFAULT_COMPRESSION) == Z_OK)
{
bOk = true;
gzipLen = destLen;
}
}
catch(...)
{
}
if(!bOk)
{
isUseGzip = false;
if(gzipOut != NULL)
{
delete[] gzipOut;
gzipOut = NULL;
}
}
}
}
else
{
isUseGzip = false;
Out += _GetLoginScreen(Data);
}
// send answer ...
if(!isUseGzip)
{
Data.pSocket->SendContent(HTTPInit, Out, Out.GetLength());
}
else
{
Data.pSocket->SendContent(HTTPInitGZ, gzipOut, gzipLen);
}
if(gzipOut != NULL)
delete[] gzipOut;
}
CString CWebServer::_ParseURL(CString URL, CString fieldname)
{
CString value = "";
CString Parameter = "";
char fromReplace[4] = ""; // decode URL
char toReplace[2] = ""; // decode URL
int i = 0;
int findPos = -1;
int findLength = 0;
if (URL.Find("?") > -1) {
Parameter = URL.Mid(URL.Find("?")+1, URL.GetLength()-URL.Find("?")-1);
// search the fieldname beginning / middle and strip the rest...
if (Parameter.Find(fieldname + "=") == 0) {
findPos = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -