⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserver.cpp

📁 非常出名开源客户端下载的程序emule
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#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("&","&amp;");
	str.Replace("<","&lt;");
	str.Replace(">","&gt;");
	str.Replace("\"","&quot;");
	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 + -