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

📄 weblib.c

📁 VIA VT6524 8口网管交换机源码
💻 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()>&lt; 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 + -