📄 weblib.c
字号:
/*
* Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
* All rights reserved.
*
* This software is copyrighted by and is the sole property of
* VIA Networking Technologies, Inc. This software may only be used
* in accordance with the corresponding license agreement. Any unauthorized
* use, duplication, transmission, distribution, or disclosure of this
* software is expressly forbidden.
*
* This software is provided by VIA Networking Technologies, Inc. "as is"
* and any express or implied warranties, including, but not limited to, the
* implied warranties of merchantability and fitness for a particular purpose
* are disclaimed. In no event shall VIA Networking Technologies, Inc.
* be liable for any direct, indirect, incidental, special, exemplary, or
* consequential damages.
*
*
* File: weblib.c
*
* Purpose:
*
* Author: Jenda Jao
*
* Date: Jan 08, 2002
*
* Functions:
*
* Revision History:
*
*/
#include <stdio.h> // for sprintf
#include "str.h"
#include "taskweb.h"
#if !defined(__PLATFORM_H__)
#include "platform.h"
#endif
#if !defined(__SWPKT_H__)
#include "swpkt.h"
#endif
#include "weblib.h"
#include "cgi_show.h"
#include "cgi_set.h"
#include "webfs.h"
/*--------------------- Static Definitions ------------------------*/
/*--------------------- Static Types ------------------------------*/
// CGI function name/pointer mapping
typedef struct tagSWEBCgiMap {
PSTR szName;
UINT16 (*pfnCgi)(void); // Cgi func ptr
} SWEBCgiMap;
/*--------------------- Static Macros -----------------------------*/
/*--------------------- Static Classes ----------------------------*/
/*--------------------- Static Variables --------------------------*/
DIRECT_MEMTYPE_CODE SWEBCgiMap s_aSCgiTbl[] = {
{"ShowList", CGI_wShowList},
{"ShowLogin", CGI_wShowLogin},
{"Login", CGI_wLogin},
{"Logout", CGI_wLogout},
{"ShowPortSts", CGI_wShowPortSts},
{"ShowPortCfg", CGI_wShowPortCfg},
{"SetPortCfg", CGI_wSetPortCfg},
{"ShowTrkCfg", CGI_wShowTrkCfg},
{"SetTrkCfg", CGI_wSetTrkCfg},
{"ShowVlanCfg", CGI_wShowVlanCfg},
{"SetVlanCfg", CGI_wSetVlanCfg},
{"ShowVlanGrp", CGI_wShowVlanGrp},
{"SetVlanGrp", CGI_wSetVlanGrp},
{"ShowV1qifCfg", CGI_wShowV1qifCfg},
{"SetV1qifCfg", CGI_wSetV1qifCfg},
#ifdef __ASIC_VT6526
{"ShowRateCfg", CGI_wShowRateCfg},
{"SetRateCfg", CGI_wSetRateCfg},
#endif
{"ShowQosCfg", CGI_wShowQosCfg},
{"SetQosCfg", CGI_wSetQosCfg},
{"ShowSnfCfg", CGI_wShowSnfCfg},
{"SetSnfCfg", CGI_wSetSnfCfg},
{"ShowMiscCfg", CGI_wShowMiscCfg},
{"SetMiscCfg", CGI_wSetMiscCfg},
{"ShowAdmCfg", CGI_wShowAdmCfg},
{"SetAdmCfg", CGI_wSetAdmCfg},
{"ShowIpCfg", CGI_wShowIpCfg},
{"SetIpCfg", CGI_wSetIpCfg},
{"WriteDefault", CGI_wWriteDefault},
{"Reboot", CGI_wReboot},
{"ShowSysInfo", CGI_wShowSysInfo},
{0, CGI_wShowMain} // this should be the last entry for ending mark
};
/*--------------------- Static Functions --------------------------*/
/*--------------------- Export Variables --------------------------*/
// page config buffer, public for SSI and CGI
UConfigBuf WEBg_UCfgBuf;
SWEBCgiInfo WEBg_SCgiInfo;
BOOL WEBg_bLoginEbl;
DIRECT_MEMTYPE_CODE char g_szHtmlOkHeader[] =
"HTTP/1.1 200 OK\r\nContent-type: text/html\r\nCache-Control: no-cache\r\n\r\n"; //Pragma: no-cache
static void s_vParsingCgiInfo(PSTR pchar)
{
WEBg_SCgiInfo.byParaNum = 0;
while(*pchar != ' ' /*&& *pchar != '\r' && *pchar != '\n'*/)
{
if (*pchar == '=')
{
WEBg_SCgiInfo.apszParaVal[WEBg_SCgiInfo.byParaNum++] = ++pchar; // Directly point parameter string at inpkt array
// add end of string
while(*pchar != '&' && *pchar != ' ')
pchar++;
*pchar = '\0';
}
pchar++;
}
}
// For the purpose of that only one can login at the same time, all webpages
// should be authenticated by an unique key with time factor that generated
// by server before response to browser. The browser should also send a
// request with that unique key. In order to implement that, I use the property
// of "relative path". That is, the browser will auto add the pathname to the
// filename for whole URL. Therefore I replace the pathname by an unique key
// generated by server, and all filenames in webpages are relative. The browser
// will auto add the unique key to the request URL. All the server should do is
// to generate and maintain the unique key, to clear the key after logout or
// timeout.
// PS: For this purpose, the server does not support html file system and SSI,
// all html header and content are generated by CGI functions.
UINT16 WEB_wProcHttpRequest(PBYTE abyInBuf)
{
BYTE si, byFilenamePtr;
// check login: "GET /LoginUID/filename?A=a&B=b HTTP/1.1\r\n"
if (! WEBg_bLoginEbl)
{
byFilenamePtr = 5;
}
else if (*WEBg_szLoginID) // have login
{
if (STRcMemcmp(abyInBuf+4, WEBg_szLoginID, 10) != 0)
return WEB_wGenResultMsgPkt("Only one can login at the same time");
byFilenamePtr = 14;
}
else // not login yet
{
if (STRcMemcmp(abyInBuf+4, "/Login?", 7) == 0)
{
s_vParsingCgiInfo(abyInBuf+11);
return CGI_wLogin();
}
else
return CGI_wShowLogin();
}
// if "GET /LoginUID/ HTTP/1.1"
if (abyInBuf[byFilenamePtr] == ' ')
return CGI_wShowMain();
// Find the CGI filename
for(si = byFilenamePtr; si < 0xFF; si++)
{
if( abyInBuf[si] == ' ' || abyInBuf[si] == '?' /* || abyInBuf[si] == '\r' || abyInBuf[si] == '\n'*/)
{
abyInBuf[si] = 0; // replace EOS
break;
}
}
// Search cgi table
for (si = 0; s_aSCgiTbl[si].szName; si++)
{
if ( STRcStrcmp(s_aSCgiTbl[si].szName, abyInBuf+byFilenamePtr) == 0 ) // if found
{
// reload web auto logout counter
g_wWebAutoLogoutCntr = 0;
// parsing cgi parameter
s_vParsingCgiInfo(abyInBuf + STRbyStrlen(abyInBuf) + 1);
// run cgi
return s_aSCgiTbl[si].pfnCgi();
}
}
// Search static html files
#ifdef WEBFS_BANK_SWITCH
{
UINT16 wSize;
STRvStrcpy(HTTPg_abyOutBuf, "HTTP/1.1 200 OK\r\n\r\n");
wSize = wGetFileByName(abyInBuf+byFilenamePtr, HTTPg_abyOutBuf+19);
if (wSize)
return wSize+19;
}
#else
for (si=0; g_SHtmlFileMap[si].szName; si++)
{
if ( STRcStrcmp(g_SHtmlFileMap[si].szName, abyInBuf+byFilenamePtr) == 0 ) // if found
{
// reload web auto logout counter
g_wWebAutoLogoutCntr = 0;
STRvStrcpy(HTTPg_abyOutBuf, "HTTP/1.1 200 OK\r\n\r\n");
STRvMemcpy(HTTPg_abyOutBuf+19, g_SHtmlFileMap[si].abyData, g_SHtmlFileMap[si].wSize);
return 19 + g_SHtmlFileMap[si].wSize;
}
}
#endif
// if not found, return 404
return sprintf(HTTPg_abyOutBuf, "HTTP/1.1 404 OK\r\n\r\n");
}
///////////////////////////////////////////////////////////////////////////////
UINT16 WEB_wGenResultMsgPkt(char* szMsg)
{
return sprintf(HTTPg_abyOutBuf, "%s<CENTER><H2>%s</H2><A HREF=javascript:history.back()>< Back</A>", g_szHtmlOkHeader, szMsg);
}
UINT16 WEB_wGenRedirectPkt(char* szFilename)
{
return sprintf(HTTPg_abyOutBuf, "HTTP/1.1 307 OK\r\nLocation: %s\r\n\r\n", szFilename);
}
UINT16 WEB_wPopupMsgBoxThenRedirect(char* szMsg, char* szUrl)
{
return sprintf(HTTPg_abyOutBuf, "%s<SCRIPT>alert(\"%s\");top.location=\"%s\";</SCRIPT>", g_szHtmlOkHeader, szMsg, szUrl);
}
// generate an unique key: MAC[2-6] ^ IP ^ time
void WEB_vGenUniqueLoginID(void)
{
BYTE si;
UINT32 dwVal;
// dwVal = source ip address
dwVal = (UINT32)(((UINT32 *)&SWPKTg_abyEpktBuf[EPKT_LLH_LEN]) + 3);
for (si=0; si<4; si++)
((BYTE*)&dwVal)[si] ^= (SWPKTg_abyEpktBuf[8+si] ^ g_byTimer);
sprintf(WEBg_szLoginID, "/%08lX/", dwVal); // in the form of "/12345678/"
// reload web auto logout counter
g_wWebAutoLogoutCntr = 0;
}
// Output <SELECT> tag for listbox option
UINT16 WEB_wAddSelectTag(PBYTE pbyOutBuf, char cName, BYTE byName, char** aszStringTable, BYTE byStringNum, BYTE bySelected, BOOL bIsAddTD, char* szExtraAttrib)
{
char* psz = pbyOutBuf;
BYTE si;
psz += sprintf(psz, "%s<SELECT name=%c%bd%s>", (bIsAddTD ? "<TD>" : ""), cName, byName, ((*szExtraAttrib) ? szExtraAttrib : ""));
// output all <option> tag
for (si=0; si<byStringNum; si++)
{
psz += sprintf(psz, "<OPTION value=%bd%s>%s", si, ((si == bySelected) ? " selected" : ""), aszStringTable[si]);
}
psz += sprintf(psz, "</SELECT>");
return psz-pbyOutBuf;
}
// Output <INPUT type=checkbox> tag for multiple-checked option
UINT16 WEB_wAddCheckboxTag(PBYTE pbyOutBuf, BYTE byName, BYTE byValue, BOOL bChecked)
{
return sprintf(pbyOutBuf, "<INPUT type=checkbox name=X%bd value=%bd%s>", byName, byValue,
((bChecked) ? " checked" : ""));
}
// Output <INPUT type=radio> tag for only-one-checked option
//UINT16 WEB_wAddRadioTag(PBYTE pbyOutBuf, BYTE byName, BYTE byValue, BYTE byChecked)
//{
// return sprintf(pbyOutBuf, "<TD><INPUT type=radio name=R%bd value=%bd%s>", byName, byValue,
// ((byValue == byChecked) ? " checked" : ""));
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -