📄 webserver.cpp
字号:
srand ( time(NULL) );
long lSession = 0;
if(_ParseURL(Data.sURL, _T("ses")) != _T(""))
lSession = _tstol(_ParseURL(Data.sURL, _T("ses")));
if (_ParseURL(Data.sURL, _T("w")) == _T("password"))
{
CString test=MD5Sum(_ParseURL(Data.sURL, _T("p"))).GetHash();
bool login=false;
CString ip=ipstr(Data.inadr);
if(MD5Sum(_ParseURL(Data.sURL, _T("p"))).GetHash() == thePrefs.GetWSPass())
{
Session ses;
ses.admin=true;
ses.startTime = CTime::GetCurrentTime();
ses.lSession = lSession = GetRandomUInt32();
pThis->m_Params.Sessions.Add(ses);
theApp.emuledlg->serverwnd->UpdateMyInfo();
AddLogLine(true,GetResString(IDS_WEB_ADMINLOGIN)+_T(" (%s)"),ip);
login=true;
}
else if(thePrefs.GetWSIsLowUserEnabled() && thePrefs.GetWSLowPass()!=_T("") && MD5Sum(_ParseURL(Data.sURL, _T("p"))).GetHash() == thePrefs.GetWSLowPass())
{
Session ses;
ses.admin=false;
ses.startTime = CTime::GetCurrentTime();
ses.lSession = lSession = GetRandomUInt32();
pThis->m_Params.Sessions.Add(ses);
theApp.emuledlg->serverwnd->UpdateMyInfo();
AddLogLine(true,GetResString(IDS_WEB_GUESTLOGIN)+_T(" (%s)"),ip);
login=true;
} else {
AddLogLine(true,GetResString(IDS_WEB_BADLOGINATTEMPT)+_T(" (%s)"),ip);
BadLogin newban={inet_addr(T2CA(ip)), ::GetTickCount()}; // save failed attempt (ip,time)
pThis->m_Params.badlogins.Add(newban);
login=false;
}
isUseGzip = false; // [Julien]
if (login) {
uint32 ipn=inet_addr(T2CA(ip)) ;
for(int i = 0; i < pThis->m_Params.badlogins.GetSize();)
{
if (ipn == pThis->m_Params.badlogins[i].datalen) {
pThis->m_Params.badlogins.RemoveAt(i);
}
else
i++;
}
}
}
CString sSession; sSession.Format(_T("%u"), lSession);
if (_ParseURL(Data.sURL, _T("w")) == _T("logout"))
_RemoveSession(Data, lSession);
if(_IsLoggedIn(Data, lSession))
{
Out += _GetHeader(Data, lSession);
CString sPage = _ParseURL(Data.sURL, _T("w"));
if (sPage == _T("server"))
{
Out += _GetServerList(Data);
}
else
if (sPage == _T("download"))
{
Out += _GetDownloadLink(Data);
}
if (sPage == _T("kad"))
{
Out += _GetKadPage(Data);
}
else
if (sPage == _T("shared"))
{
Out += _GetSharedFilesList(Data);
}
else
if (sPage == _T("transfer"))
{
Out += _GetTransferList(Data);
}
else
if (sPage == _T("websearch"))
{
Out += _GetWebSearch(Data);
}
else
if (sPage == _T("search"))
{
Out += _GetSearch(Data);
}
else
if (sPage == _T("graphs"))
{
Out += _GetGraphs(Data);
}
else
if (sPage == _T("log"))
{
Out += _GetLog(Data);
}
if (sPage == _T("sinfo"))
{
Out += _GetServerInfo(Data);
}
if (sPage == _T("debuglog"))
{
Out += _GetDebugLog(Data);
}
if (sPage == _T("stats"))
{
Out += _GetStats(Data);
}
if (sPage == _T("options"))
{
Out += _GetPreferences(Data);
}
Out += _GetFooter(Data);
if (sPage == _T(""))
isUseGzip = false;
if(isUseGzip)
{
bool bOk = false;
try
{
const CStringA* pstrOutA;
#ifdef _UNICODE
CStringA strA(Out);
pstrOutA = &strA;
#else
pstrOutA = &Out;
#endif
uLongf destLen = pstrOutA->GetLength() + 1024;
gzipOut = new TCHAR[destLen];
if(_GzipCompress((Bytef*)gzipOut, &destLen, (const Bytef*)(LPCSTR)*pstrOutA, pstrOutA->GetLength(), Z_DEFAULT_COMPRESSION) == Z_OK)
{
bOk = true;
gzipLen = destLen;
}
}
catch(...){
ASSERT(0);
}
if(!bOk)
{
isUseGzip = false;
if(gzipOut != NULL)
{
delete[] gzipOut;
gzipOut = NULL;
}
}
}
}
else
{
isUseGzip = false;
uint32 ip= inet_addr(T2CA(ipstr(Data.inadr)));
uint32 faults=0;
// check for bans
for(int i = 0; i < pThis->m_Params.badlogins.GetSize();i++)
if ( pThis->m_Params.badlogins[i].datalen==ip ) faults++;
if (faults>4) {
Out += _GetPlainResString(IDS_ACCESSDENIED);
// set 15 mins ban by using the badlist
BadLogin preventive={ip, ::GetTickCount() + (15*60*1000) };
for (int i=0;i<=5;i++)
pThis->m_Params.badlogins.Add(preventive);
}
else
Out += _GetLoginScreen(Data);
}
// send answer ...
if(!isUseGzip)
{
Data.pSocket->SendContent(T2CA(HTTPInit), Out);
}
else
{
Data.pSocket->SendContent(T2CA(HTTPInitGZ), gzipOut, gzipLen);
}
if(gzipOut != NULL)
delete[] gzipOut;
}
catch(...){
TRACE("*** Unknown exception in CWebServer::ProcessURL\n");
ASSERT(0);
}
CoUninitialize();
}
CString CWebServer::_ParseURLArray(CString URL, CString fieldname) {
CString res,temp;
while (URL.GetLength()>0) {
int pos=URL.MakeLower().Find(fieldname.MakeLower() +_T("="));
if (pos>-1) {
temp=_ParseURL(URL,fieldname);
if (temp==_T("")) break;
res.Append(temp+_T("|"));
URL.Delete(pos,10);
} else break;
}
return res;
}
CString CWebServer::_ParseURL(CString URL, CString fieldname)
{
CString value = _T("");
CString Parameter = _T("");
TCHAR fromReplace[4] = _T(""); // decode URL
TCHAR toReplace[2] = _T(""); // decode URL
int i = 0;
int findPos = -1;
int findLength = 0;
if (URL.Find(_T("?")) > -1) {
Parameter = URL.Mid(URL.Find(_T("?"))+1, URL.GetLength()-URL.Find(_T("?"))-1);
// search the fieldname beginning / middle and strip the rest...
if (Parameter.Find(fieldname + _T("=")) == 0) {
findPos = 0;
findLength = fieldname.GetLength() + 1;
}
if (Parameter.Find(_T("&") + fieldname + _T("=")) > -1) {
findPos = Parameter.Find(_T("&") + fieldname + _T("="));
findLength = fieldname.GetLength() + 2;
}
if (findPos > -1) {
Parameter = Parameter.Mid(findPos + findLength, Parameter.GetLength());
if (Parameter.Find(_T("&")) > -1) {
Parameter = Parameter.Mid(0, Parameter.Find(_T("&")));
}
value = Parameter;
// decode value ...
value.Replace(_T("+"), _T(" "));
value=URLDecode(value);
}
}
#ifdef _UNICODE
CStringA strValueA;
LPSTR pszA = strValueA.GetBuffer(value.GetLength());
for (int i = 0; i < value.GetLength(); i++)
*pszA++ = (CHAR)value[i];
strValueA.ReleaseBuffer(value.GetLength());
value = strValueA;
#endif
return value;
}
CString CWebServer::_GetHeader(ThreadData Data, long lSession)
{
CWebServer *pThis = (CWebServer *)Data.pThis;
if(pThis == NULL)
return _T("");
CString buffer;
CString sSession; sSession.Format(_T("%u"), lSession);
CString Out = pThis->m_Templates.sHeader;
Out.Replace(_T("[CharSet]"), _GetWebCharSet());
if(thePrefs.GetWebPageRefresh() != 0)
{
CString sPage = _ParseURL(Data.sURL, _T("w"));
if ((sPage == _T("transfer")) ||
(sPage == _T("server")) ||
(sPage == _T("graphs")) ||
(sPage == _T("log")) ||
(sPage == _T("sinfo")) ||
(sPage == _T("debuglog")) ||
(sPage == _T("kad")) ||
(sPage == _T("stats")))
{
CString sT = pThis->m_Templates.sHeaderMetaRefresh;
CString sRefresh; sRefresh.Format(_T("%d"), thePrefs.GetWebPageRefresh());
sT.Replace(_T("[RefreshVal]"), sRefresh);
CString catadd=_T("");
if (sPage == _T("transfer"))
catadd=_T("&cat=")+_ParseURL(Data.sURL, _T("cat"));
sT.Replace(_T("[wCommand]"), _ParseURL(Data.sURL, _T("w"))+catadd);
Out.Replace(_T("[HeaderMeta]"), sT);
}
}
Out.Replace(_T("[Session]"), sSession);
Out.Replace(_T("[HeaderMeta]"), _T("")); // In case there are no meta
Out.Replace(_T("[eMuleAppName]"), _T("eMule"));
Out.Replace(_T("[version]"), theApp.m_strCurVersionLong);
Out.Replace(_T("[StyleSheet]"), pThis->m_Templates.sHeaderStylesheet);
Out.Replace(_T("[WebControl]"), _GetPlainResString(IDS_WEB_CONTROL));
Out.Replace(_T("[Transfer]"), _GetPlainResString(IDS_CD_TRANS));
Out.Replace(_T("[Server]"), _GetPlainResString(IDS_SV_SERVERLIST));
Out.Replace(_T("[Shared]"), _GetPlainResString(IDS_SHAREDFILES));
Out.Replace(_T("[Download]"), _GetPlainResString(IDS_SW_LINK));
Out.Replace(_T("[Graphs]"), _GetPlainResString(IDS_GRAPHS));
Out.Replace(_T("[Log]"), _GetPlainResString(IDS_SV_LOG));
Out.Replace(_T("[ServerInfo]"), _GetPlainResString(IDS_SV_SERVERINFO));
Out.Replace(_T("[DebugLog]"), _GetPlainResString(IDS_SV_DEBUGLOG));
Out.Replace(_T("[Stats]"), _GetPlainResString(IDS_SF_STATISTICS));
Out.Replace(_T("[Options]"), _GetPlainResString(IDS_EM_PREFS));
Out.Replace(_T("[Logout]"), _GetPlainResString(IDS_WEB_LOGOUT));
Out.Replace(_T("[Search]"), _GetPlainResString(IDS_SW_SEARCHBOX));
Out.Replace(_T("[Kad]"), _GetPlainResString(IDS_KADEMLIA));
TCHAR HTTPTempC[100] = _T("");
CString sConnected = _T("");
if (theApp.IsConnected())
{
if(!theApp.IsFirewalled())
sConnected = _GetPlainResString(IDS_CONNECTED);
else
sConnected = _GetPlainResString(IDS_CONNECTED) + _T(" (") + _GetPlainResString(IDS_IDLOW) + _T(")");
if( theApp.serverconnect->IsConnected()){
CServer* cur_server = theApp.serverconnect->GetCurrentServer();
sConnected += _T(": ") + cur_server->GetListName();
_stprintf(HTTPTempC, _T("%i "), cur_server->GetUsers());
sConnected += _T(" [") + CString(HTTPTempC) + _GetPlainResString(IDS_LUSERS) + _T("]");
}
}
else if (theApp.serverconnect->IsConnecting())
{
sConnected = _GetPlainResString(IDS_CONNECTING);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -