?? cli_webif.c
字號(hào):
/************************************************************************
Copyright 200X - 200X+1.
filename : Cli_WebIf.c
description : 命令行模塊提供給web網(wǎng)管的接口的源文件;
author : Woodhead
modification : Woodhead create 2004-12-07
************************************************************************/
#include "Ros.h"
#include "Dbg.h"
#include "Board_Pub.h"
#include "CLI_Private.inc"
#include "ML.h"
#include "Sys_Ml.h"
#include "Cli_MlPriv.h"
#include "CLI_Io.h"
#include "CLI_User.inc"
#include "CLI_Log.inc"
#include "CLI_Intp.inc"
#include "CLI_Telnet.inc"
#include "Config\Cli_ConfigGlbVar.h"
#include "CLI_WebIf.inc"
#if ( CLI_WEB_SUPPORT == G_YES )
#undef __WNM_IF_LOGIN__
/*-----------------------------------------------------------------------------
函數(shù)名稱 : CLI_WebTermAlloc();
功能 : 申請web終端;
輸入?yún)?shù) : 無;
輸出參數(shù) : pulTermId, 返回的web終端ID
返回值 : G_SUCCESS, 成功;
G_FAILURE 失敗;
函數(shù)調(diào)用說明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebTermAlloc( _U32 *pulTermID )
{
_U32 i;
if( G_NULL == pulTermID )
{
MT_ERRLOG(0);
return G_FAILURE;
}
for( i = m_ulCliWebTermFirstIndex; i <= m_ulCliWebTermLastIndex; i ++ )
{
DBG_ASSERT( ( m_TDTable[i].pTermStruct->ulTermId - 1 ) == i );
if( m_TDTable[i].pTermStruct->ucTermStatus == TERM_SLEEPING )
{
*pulTermID = i + 1;
return G_SUCCESS;
}
}
return G_FAILURE;
}
/*-----------------------------------------------------------------------------
函數(shù)名稱 : CLI_WebLogin();
功能 : Web網(wǎng)管用戶登錄;
輸入?yún)?shù) : ulLogIp, 登錄IP;
username, 用戶名;
password, 口令;
輸出參數(shù) : pulTermId, 返回終端ID;
返回值 : G_SUCCESS, 成功;
G_FAILURE 失敗;
ERR_CLI_WEB_USER_ONLINE, 用戶在線;
函數(shù)調(diào)用說明: cli用戶可以踢cli/web用戶; web用戶不能踢cli/web用戶;
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebLogin( _U32 ulLogIp, const _S8* username, const _S8* password,_U32* pulTermId )
{
_S8 szUsername[USERNAME_LEN] ;
_S8 szPassword[PASSWORD_LEN] ;
_U32 ulRet;
_U32 ulTermID;
PTermUserItem pTermUser;
PTerm_Data_S pstTerm;
(_VOID)EOS_StrNCpy( szUsername, username, ( USERNAME_LEN - 1 ) );
szUsername[USERNAME_LEN - 1] = '\0';
(_VOID)EOS_StrNCpy( szPassword, password, ( PASSWORD_LEN - 1 ) );
szPassword[PASSWORD_LEN - 1] = '\0';
/* 用戶名不區(qū)分打小寫 */
(_VOID)_AffirmStrBeLower( szUsername );
ulRet = CLI_CheckUserPassword( szUsername, szPassword );
if( G_SUCCESS != ulRet )
{
DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
"CLI_WebLogin(): USER <%s> 's PASSWORD <%s> is invalid !",
szUsername, szPassword
);
return G_FAILURE;
}
/* 申請終端控制塊 */
ulRet = CLI_WebTermAlloc( &ulTermID );
if( G_SUCCESS != ulRet )
{
DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
"CLI_WebLogin(): CLI_WebTermAlloc() fail !" );
return G_FAILURE;
}
pstTerm = m_TDTable[ulTermID - 1].pTermStruct;
DBG_ASSERT( ulTermID == pstTerm->ulTermId );
/* 獲取用戶信息 */
pTermUser = CLI_GetUserByName( szUsername );
/* 如果該用戶對應(yīng)的終端ID不為零,表示該用戶在另一個(gè)終端已經(jīng)登錄 */
if( pTermUser->ulTermId != 0 )
{
DBG_ASSERT( 0 == EOS_StriCmp(szUsername, m_TDTable[pTermUser->ulTermId - 1].pTermStruct->szCurUserName) );
DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
"CLI_WebLogin(): USER <%s> has log on from term <%ld> !",
szUsername, pTermUser->ulTermId
);
(_VOID)WNM_SendErrString( CLI_USER_ONLINE );
return ERR_CLI_WEB_USER_ONLINE;
}
/* 成功登錄后的一些用戶與終端數(shù)據(jù)初始化 */
pTermUser->ucUserStatus = TERM_LOGED;
pTermUser->ucInvadedFlag = EN_USER_NOT_INVADED;
pTermUser->ulTermId = pstTerm->ulTermId;
pstTerm->ucTermStatus = TERM_LOGED;
pstTerm->iSocket = SOCKET_FOR_WEB;
pstTerm->ucUserLevel = (_U8)pTermUser->ulLevel;
pstTerm->ulClientIP = ulLogIp;
(_VOID)EOS_StrCpy( pstTerm->szCurUserName, szUsername );
(_VOID)ML_SetLanguage( pstTerm->ulTermId, pTermUser->ucLanguage );
/* 寫日志 */
CLI_SaveUserLog(pstTerm->szCurUserName, LOG_MODE_WEB, ulLogIp, "logon[s]") ;
DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
"CLI_WebLogin(): USER <%s> log on web term <%d> ! CurTick = %ld",
szUsername, pTermUser->ulTermId, EOS_GetCurTick() );
*pulTermId = pstTerm->ulTermId;
return G_SUCCESS;
}
/*-----------------------------------------------------------------------------
函數(shù)名稱 : CLI_WebLogout();
功能 : Web網(wǎng)管用戶退出;
輸入?yún)?shù) : ulLogIp, 登錄IP;
ulTermId, 終端ID;
輸出參數(shù) : 無.
返回值 : G_SUCCESS, 成功;
其他, 失敗.
函數(shù)調(diào)用說明:
典型使用示例:
-----------------------------------------------------------------------------*/
_VOID CLI_WebLogout( _U32 ulLogIp, _U32 ulTermId )
{
PTermUserItem pTermUser;
PTerm_Data_S pstTerm;
/* web終端ID的合法性檢查 */
if( ! IS_WEB_TERMID(ulTermId) )
{
MT_ERRLOG(ulTermId);
return;
}
pstTerm = m_TDTable[ulTermId - 1].pTermStruct;
DBG_ASSERT( ulTermId == pstTerm->ulTermId );
if( TERM_LOGED != pstTerm->ucTermStatus )
{
DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
"CLI_WebLogout() : try to log out unlogon term <%ld>. pstTerm->ucTermStatus = 0x%lx",
ulTermId, pstTerm->ucTermStatus );
DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulTermId, pstTerm->ucTermStatus );
return;
}
/* 寫日志 */
DBG_ASSERT( ulLogIp == pstTerm->ulClientIP );
CLI_SaveUserLog(pstTerm->szCurUserName, LOG_MODE_WEB, ulLogIp, "logout[s]") ;
pTermUser = CLI_GetUserByName( pstTerm->szCurUserName );
/* 如果該終端已經(jīng)注銷過,不能重復(fù)注銷 */
if( ( G_NULL == pTermUser ) || ( 0 == pTermUser->ulTermId ) )
{
DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulTermId, (_U32)pTermUser );
return;
}
/* 考慮到可能在該終端注銷前另一個(gè)終端已經(jīng)使用同名用戶登錄 ??? */
if( pTermUser->ulTermId == ulTermId )
{
pTermUser->ulTermId = 0;
pTermUser->ucUserStatus = TERM_SLEEPING;
}
else
{
/* 如果是cli用戶踢web用戶, 是否會(huì)走到這里 ??? 應(yīng)該不可能走到這里 */
DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulTermId, pTermUser->ulTermId );
}
CLI_TaskDataInit( pstTerm );
DBG_Out( PID_CLI, MT_DBGOUT_NOTE, G_STR_HEAD
"CLI_WebOut(): USER <%s> Log out from Web term <%d> ! CurTick = %ld",
pTermUser->szUserName, ulTermId, EOS_GetCurTick() );
return;
}
/*-----------------------------------------------------------------------------
函數(shù)名稱 : CLI_WebSendKickOffUserMsg();
功能 : 向web模塊發(fā)送踢用戶消息;
輸入?yún)?shù) : ulTermId: 要踢掉的用戶的終端標(biāo)識(shí)符
輸出參數(shù) : 無
返回值 : G_SUCCESS, 成功;
其他 失敗;
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebSendKickOffUserMsg( _U32 ulTermId )
{
static _U32 s_ulSeqNo = 0;
_U32 ulRet;
_U16 usPayLoadLen;
ST_MSG* pstMsg;
WNM_KICK_USER_MSG_DATA* pstKickOffUser;
/* 消息包凈荷的長度 */
usPayLoadLen = sizeof(WNM_KICK_USER_MSG_DATA);
/* 申請消息包 */
pstMsg = (ST_MSG *)ROS_MsgAlloc( PUBLIC_LENS_TOTAL + usPayLoadLen,
ROS_MSG_ALLOC_OPT_LEAK_CHECK );
if( G_NULL == pstMsg )
{
MT_ERRLOG( usPayLoadLen );
return G_FAILURE;
}
/* 設(shè)置消息包 */
pstMsg->usSrcBid = 0;
pstMsg->usDstBid = 0;
pstMsg->usSrcPid = PID_CLI;
pstMsg->usDstPid = PID_WNM;
pstMsg->ulSendSeq = s_ulSeqNo ++;
pstMsg->usMsgCode = MSG_CODE_WNM_KICK_USER;
pstMsg->usDataOffset = 0;
pstMsg->usDataLens = usPayLoadLen;
pstKickOffUser = (WNM_KICK_USER_MSG_DATA *)( pstMsg->ucData );
EOS_MemZero( pstKickOffUser, usPayLoadLen );
pstKickOffUser->ulTermId = ulTermId;
/* 發(fā)送消息包 */
ulRet = BOARD_SEND_MSG( pstMsg );
if( G_SUCCESS != ulRet )
{
/* 發(fā)送消息失敗,釋放消息包 */
ROS_MsgFree( pstMsg );
MT_ERRLOG(ulRet);
return G_FAILURE;
}
// 操作成功
return G_SUCCESS;
}
#undef __WNM_IF_USER__
/*-----------------------------------------------------------------------------
函數(shù)名稱 : CLI_WebGetUserInfoByIndex();
功能 : 獲取用戶信息;
輸入?yún)?shù) : szOprName, 操作用戶名;
ulIndex, 用戶索引;
輸出參數(shù) : szName, 用戶名;
*pucLevel, 用戶權(quán)限級(jí)別;
*pucLan, 用戶慣用語種(中文,英文);
*pbIsLogin, 是否處于登錄狀態(tài);
*pulLogMode, 用戶登錄方式, 枚舉EN_USER_LOG_MODE.
注: ( *pbIsLogin == G_TRUE )才有效
*pulLogIP, 用戶登錄的IP地址
注: ( *pulLogMode == LOG_MODE_WEB )
或 ( *pulLogMode == LOG_MODE_TELNET ) 才有效
返回值 : G_SUCCESS, 成功;
其他, 失敗.
函數(shù)調(diào)用說明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_WebGetUserInfoByIndex(
const _S8* szOprName, _U32 ulIndex,
_S8 *szName, _U8* pucLevel, _U8* pucLan,
_BOOL* pbIsLogin, _U32* pulLogMode, _U32* pulLogIP )
{
PTermUserItem pstOprUser, pstShowUser;
/* 輸入索引的合法性檢查 */
if( MAX_USER_NUM <= ulIndex )
{
MT_ERRLOG(0);
return G_FAILURE;
}
/* 入口指針的合法性檢查 */
if( ( G_NULL == szName )
|| ( G_NULL == pucLevel )
|| ( G_NULL == pucLan )
|| ( G_NULL == pbIsLogin )
)
{
MT_ERRLOG(0);
return G_FAILURE;
}
/* 根據(jù)用戶名獲取用戶信息 */
pstOprUser = CLI_GetUserByName( szOprName );
if( pstOprUser == G_NULL )
{
DBG_Out( PID_CLI, CLI_DBGOUT_NOTE, G_STR_HEAD"CLI_WebGetUserInfoByIndex() :: "
"Operation user <%s> is not exist !", szOprName );
(_VOID)WNM_SendErrString( CLI_USER_NOT_EXISTED );
return G_FAILURE;
}
pstShowUser = &m_sUserTable[ulIndex];
/* 此用戶表項(xiàng)未使用 */
if( pstShowUser->ucUserType == USER_NOT_USED)
{
return G_FAILURE;
}
/* 檢查當(dāng)前用戶是否有查看的權(quán)限 */
if( pstOprUser->ulLevel < pstShowUser->ulLevel )
{
return G_FAILURE;
}
/* 調(diào)試用戶不顯示 */
if( CT_AL_DEBUG <= pstShowUser->ulLevel)
{
return G_FAILURE;
}
/* 獲取用戶的當(dāng)前信息 */
(_VOID)EOS_StrNCpy( szName, pstShowUser->szUserName, ( USERNAME_LEN - 1 ) );
szName[USERNAME_LEN - 1] = '\0';
*pucLevel = (_U8)pstShowUser->ulLevel;
*pucLan = (_U8)pstShowUser->ucLanguage;
*pbIsLogin = ( TERM_LOGED == pstShowUser->ucUserStatus ) ? G_TRUE : G_FALSE;
/* 如果已經(jīng)登錄, 則獲取登錄方式 */
if( G_TRUE == *pbIsLogin )
{
*pulLogMode = CLI_GetUserLogModeByTermID( pstShowUser->ulTermId );
}
else
{
return G_SUCCESS;
}
/* 如果是從telnet或web登錄, 則返回IP地址 */
if( ( *pulLogMode == LOG_MODE_WEB )
|| ( *pulLogMode == LOG_MODE_TELNET )
)
{
*pulLogIP = m_TDTable[pstShowUser->ulTermId - 1].pTermStruct->ulClientIP;
}
return G_SUCCESS;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -