📄 cli_webif.c
字号:
/************************************************************************
Copyright 200X - 200X+1.
filename : Cli_WebIf.c
description : 命令行模块提供给web网管的接口的源文件;
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__
/*-----------------------------------------------------------------------------
函数名称 : CLI_WebTermAlloc();
功能 : 申请web终端;
输入参数 : 无;
输出参数 : pulTermId, 返回的web终端ID
返回值 : G_SUCCESS, 成功;
G_FAILURE 失败;
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_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;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_WebLogin();
功能 : Web网管用户登录;
输入参数 : ulLogIp, 登录IP;
username, 用户名;
password, 口令;
输出参数 : pulTermId, 返回终端ID;
返回值 : G_SUCCESS, 成功;
G_FAILURE 失败;
ERR_CLI_WEB_USER_ONLINE, 用户在线;
函数调用说明: 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';
/* 用户名不区分打小写 */
(_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 );
/* 如果该用户对应的终端ID不为零,表示该用户在另一个终端已经登录 */
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;
}
/* 成功登录后的一些用户与终端数据初始化 */
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;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_WebLogout();
功能 : Web网管用户退出;
输入参数 : ulLogIp, 登录IP;
ulTermId, 终端ID;
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_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 );
/* 如果该终端已经注销过,不能重复注销 */
if( ( G_NULL == pTermUser ) || ( 0 == pTermUser->ulTermId ) )
{
DBG_ErrLog( 0, EN_ERR_LEVEL_GENERAL, ulTermId, (_U32)pTermUser );
return;
}
/* 考虑到可能在该终端注销前另一个终端已经使用同名用户登录 ??? */
if( pTermUser->ulTermId == ulTermId )
{
pTermUser->ulTermId = 0;
pTermUser->ucUserStatus = TERM_SLEEPING;
}
else
{
/* 如果是cli用户踢web用户, 是否会走到这里 ??? 应该不可能走到这里 */
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;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_WebSendKickOffUserMsg();
功能 : 向web模块发送踢用户消息;
输入参数 : ulTermId: 要踢掉的用户的终端标识符
输出参数 : 无
返回值 : 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;
}
/* 设置消息包 */
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;
/* 发送消息包 */
ulRet = BOARD_SEND_MSG( pstMsg );
if( G_SUCCESS != ulRet )
{
/* 发送消息失败,释放消息包 */
ROS_MsgFree( pstMsg );
MT_ERRLOG(ulRet);
return G_FAILURE;
}
// 操作成功
return G_SUCCESS;
}
#undef __WNM_IF_USER__
/*-----------------------------------------------------------------------------
函数名称 : CLI_WebGetUserInfoByIndex();
功能 : 获取用户信息;
输入参数 : szOprName, 操作用户名;
ulIndex, 用户索引;
输出参数 : szName, 用户名;
*pucLevel, 用户权限级别;
*pucLan, 用户惯用语种(中文,英文);
*pbIsLogin, 是否处于登录状态;
*pulLogMode, 用户登录方式, 枚举EN_USER_LOG_MODE.
注: ( *pbIsLogin == G_TRUE )才有效
*pulLogIP, 用户登录的IP地址
注: ( *pulLogMode == LOG_MODE_WEB )
或 ( *pulLogMode == LOG_MODE_TELNET ) 才有效
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_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;
}
/* 根据用户名获取用户信息 */
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];
/* 此用户表项未使用 */
if( pstShowUser->ucUserType == USER_NOT_USED)
{
return G_FAILURE;
}
/* 检查当前用户是否有查看的权限 */
if( pstOprUser->ulLevel < pstShowUser->ulLevel )
{
return G_FAILURE;
}
/* 调试用户不显示 */
if( CT_AL_DEBUG <= pstShowUser->ulLevel)
{
return G_FAILURE;
}
/* 获取用户的当前信息 */
(_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;
/* 如果已经登录, 则获取登录方式 */
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -