📄 cli_acl.c
字号:
/************************************************************************
Copyright 200X - 200X+1.
filename : Cli_Acl.c
description : 访问控制列表(Access Control List)的源文件;
author : Woodhead
modification : Woodhead create 2004-12-07
************************************************************************/
#include "Ros.h"
#include "CLI_Private.inc"
#include "ML.h"
#include "Sys_Ml.h"
#include "Cli_MlPriv.h"
#include "Config\Cli_ConfigGlbVar.h"
/* 访问控制列表 */
ST_ACL m_stCliAcl[MT_ACL_NUM];
#if CLI_DBASE_SUPPORT
/*-----------------------------------------------------------------------------
函数名称 : CLI_AclDBInit();
功能 : ACL与数据库相关的初始化.
默认配置0.0.0.0/0.0.0.0
输入参数 : 无.
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_AclDBInit( _VOID )
{
_U32 i;
_BOOL isTelnetActNull = G_TRUE; /* 用来判断Telnet_Act表项是否为空 */
/* 是否包含RDB模块 */
if( G_YES != g_ul_INCLUDE_MODULE_CLI_RDB )
{
return G_SUCCESS;
}
/* 函数指针是否注册 */
if( ( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectQuery ) || ( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectInsert ) )
{
MT_ERRLOG(0);
return G_FAILURE;
}
for (i = 0; i < MT_ACL_NUM; i++)
{
if (G_SUCCESS != g_pfn_CFG_CLI_RDB_RecordDirectQuery(m_ulCliUserHandle, m_usClientACLTable, i,
G_FALSE, &m_stCliAcl[i]))
{
EOS_MemZero(&m_stCliAcl[i], sizeof(ST_ACL));
/*此处做了修改,以使初始化清零后的Ip 地址和子网掩码不同时为零---*/
/*因为允许IP和子网掩码同时为0.0.0.0的情况-----------------------*/
/*G_NULL_DWORD表示使得Ip地址和掩码初始化的值均为255.255.255.255-*/
/*同时,不允许用户设置| Ip:255.255.255.255| */
/* |子网掩码:255.255.255.255| 这一种情况 */
/*--------------------------------------------------------------*/
m_stCliAcl[i].ulIpAddr = G_NULL_DWORD;
m_stCliAcl[i].ulIpMask = G_NULL_DWORD;
}
else /* 如果读取数据成功,表明Telnet_Act表项不为空 */
{
isTelnetActNull = G_FALSE;
}
}
/* 为Telnet_Act表项为空的情况专门做初始化,将Telnet_Act表项的第一项初始化为0.0.0.0/0.0.0.0 */
if( G_TRUE == isTelnetActNull )
{
EOS_MemZero(&m_stCliAcl[0], sizeof(ST_ACL));
m_stCliAcl[0].ulIpAddr = G_NULL;
m_stCliAcl[0].ulIpMask = G_NULL;
m_stCliAcl[0].ulState = ACL_USED_FLAG;
if (g_pfn_CFG_CLI_RDB_RecordDirectInsert(m_ulCliUserHandle, m_usClientACLTable, 0, &m_stCliAcl[0])!= G_SUCCESS)
{
DBG_Out(PID_CLI, MT_DBGOUT_NOTE, "\r\n CLI_AclDBInit::RDB_RecordDirectInsert() failed!");
MT_ERRLOG(0);
}
}
return G_SUCCESS;
}
#endif
/*-----------------------------------------------------------------------------
函数名称 : CLI_AclGet();
功能 : 获取指定索引的ACL表项
输入参数 : ulIndex, ACL的索引;
输出参数 : *pulIP, IP地址;
*pulMask, 子网掩码;
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_AclGet( _U32 ulIndex, _U32 *pulIP, _U32 *pulMask )
{
/* 输入指针的合法性检查 */
if( ( G_NULL == pulIP ) || ( G_NULL == pulMask ) )
{
MT_ERRLOG(0);
return G_FAILURE;
}
/* 索引的合法性检查 */
if( MT_ACL_NUM <= ulIndex )
{
MT_ERRLOG(0);
return G_FAILURE;
}
/* ACL表项的是否正在使用 */
if( ACL_USED_FLAG != m_stCliAcl[ulIndex].ulState )
{
return G_FAILURE;
}
*pulIP = m_stCliAcl[ulIndex].ulIpAddr;
*pulMask = m_stCliAcl[ulIndex].ulIpMask;
return G_SUCCESS;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_AclAdd();
功能 : 增加一个ACL表项
输入参数 : ulIpaddr IP地址
ulIpMask IP掩码
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_AclAdd( _U32 ulIpaddr, _U32 ulIpMask )
{
_S8 szIPAdd[20], szIpMsk[20];
_U32 i;
_IPAddrToStr(ulIpaddr, szIPAdd);
_IPAddrToStr(ulIpMask, szIpMsk);
/* 修改前的代码段如下: ----------------------------------------------------*/
/* if (ulIpaddr == 0 || ulIpMask == 0 */
/* || _VerifyGeneralIPAddress(szIPAdd) != G_SUCCESS */
/* || _VerifyMASKAddress(szIpMsk) != G_SUCCESS) */
/* 产生的问题: 使IP和子网掩码为0.0.0.0的情况非法---------------------------*/
/* 修改后,可以让用户设置IP、子网掩码为0.0.0.0的情况-----------------------*/
if (_VerifyGeneralIPAddress(szIPAdd) != G_SUCCESS
|| _VerifyMASKAddress(szIpMsk) != G_SUCCESS) /* 修改后的代码*/
{
IO_Print(CLI_CLIENT_PARAM_VERIFY_FAILED);
return G_FAILURE;
}
for (i = 0; i < MT_ACL_NUM; i++)
{
if (((m_stCliAcl[i].ulIpAddr & m_stCliAcl[i].ulIpMask)
== (ulIpaddr & ulIpMask))
&& (m_stCliAcl[i].ulIpMask == ulIpMask))
{
IO_Print(CLI_CLIENT_LIST_EXISTED);
return G_FAILURE;
}
}
for (i = 0; i < MT_ACL_NUM; i++)
{
if (m_stCliAcl[i].ulState != ACL_USED_FLAG)
{
m_stCliAcl[i].ulIpAddr = ulIpaddr;
m_stCliAcl[i].ulIpMask = ulIpMask;
m_stCliAcl[i].ulState = ACL_USED_FLAG;
#if CLI_DBASE_SUPPORT
/* 是否包含RDB模块 */
if( G_YES == g_ul_INCLUDE_MODULE_CLI_RDB )
{
/* 函数指针是否注册 */
if( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectInsert )
{
MT_ERRLOG(0);
return G_FAILURE;
}
if (g_pfn_CFG_CLI_RDB_RecordDirectInsert(m_ulCliUserHandle, m_usClientACLTable, i, &m_stCliAcl[i])!= G_SUCCESS)
{
DBG_Out(PID_CLI, MT_DBGOUT_NOTE,
"\r\n CLI_AclAdd::RDB_RecordDirectInsert() failed!");
MT_ERRLOG(0);
return G_FAILURE;
}
}
#endif
return G_SUCCESS;
}
}
IO_Print(CLI_CLIENT_TABLE_FULL);
return G_FAILURE;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_AclDel();
功能 : 删除一个ACL表项
输入参数 : ulIpaddr IP地址
ulIpMask IP掩码
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_AclDel( _U32 ulIpaddr, _U32 ulIpMask )
{
_S8 szIPAdd[20], szIpMsk[20];
_U32 i;
_IPAddrToStr(ulIpaddr, szIPAdd);
_IPAddrToStr(ulIpMask, szIpMsk);
/* 修改前的代码段如下: ----------------------------------------------------*/
/* if (ulIpaddr == 0 || ulIpMask == 0 */
/* || _VerifyGeneralIPAddress(szIPAdd) != G_SUCCESS */
/* || _VerifyMASKAddress(szIpMsk) != G_SUCCESS) */
/* 产生的问题: 使IP和子网掩码为0.0.0.0的情况非法---------------------------*/
/* 修改后,可以让用户设置IP、子网掩码为0.0.0.0的情况-----------------------*/
if ( _VerifyGeneralIPAddress(szIPAdd) != G_SUCCESS
|| _VerifyMASKAddress(szIpMsk) != G_SUCCESS)
{
return G_FAILURE;
}
for (i = 0; i < MT_ACL_NUM; i++)
{
if (m_stCliAcl[i].ulIpAddr == ulIpaddr
&& m_stCliAcl[i].ulIpMask == ulIpMask
&& m_stCliAcl[i].ulState == ACL_USED_FLAG)
{
/*将Ip地址和掩码初始化为255.255.255.255*/
m_stCliAcl[i].ulIpAddr = G_NULL_DWORD;
m_stCliAcl[i].ulIpMask = G_NULL_DWORD;
m_stCliAcl[i].ulState = 0;
#if CLI_DBASE_SUPPORT
/* 是否包含RDB模块 */
if( G_YES == g_ul_INCLUDE_MODULE_CLI_RDB )
{
/* 函数指针是否注册 */
if( G_NULL == g_pfn_CFG_CLI_RDB_RecordDirectDelete )
{
MT_ERRLOG(0);
return G_FAILURE;
}
if (g_pfn_CFG_CLI_RDB_RecordDirectDelete( m_ulCliUserHandle, m_usClientACLTable, i) != G_SUCCESS)
{
DBG_Out(PID_CLI, MT_DBGOUT_NOTE,
"\r\n CLI_AclDel::RDB_RecordDirectDelete() failed!");
MT_ERRLOG(0);
return G_FAILURE;
}
}
#endif
return G_SUCCESS;
}
}
IO_Print(CLI_TELNET_ACL_UNFIND);
return G_FAILURE;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_AclCheck();
功能 : ACL的表项的合法性检查, 检查试图登录的IP地址是否合法;
输入参数 : ulIpaddr, 客户端IP地址
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_AclCheck( _U32 ulIpaddr )
{
_U32 i;
for (i = 0; i < MT_ACL_NUM; i++)
{
if (m_stCliAcl[i].ulState != ACL_USED_FLAG)
continue;
if ((m_stCliAcl[i].ulIpAddr & m_stCliAcl[i].ulIpMask)
== (m_stCliAcl[i].ulIpMask & ulIpaddr))
{
return G_SUCCESS;
}
}
return G_FAILURE;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_AclDisplay();
功能 : 显示所有ACL表项
输入参数 : 无.
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_AclDisplay(_VOID)
{
_U32 i, ulFlag = G_FALSE;
_S8 szIpAddr[20], szMask[20];
for (i = 0; i < MT_ACL_NUM; i++)
{
if (m_stCliAcl[i].ulState == ACL_USED_FLAG)
{
if (ulFlag == G_FALSE)
{
IO_Print(CLI_CLIENT_LIST_HEAD);
IO_Print(PUB_TABLE_EMBODY);
ulFlag = G_TRUE;
}
_IPAddrToStr(m_stCliAcl[i].ulIpAddr, szIpAddr);
_IPAddrToStr(m_stCliAcl[i].ulIpMask, szMask);
IO_Print(CLI_CLIENT_LIST_BODY, szIpAddr, szMask);
}
}
if (ulFlag == G_FALSE)
{
IO_Print(CLI_CLIENT_LIST_NULL);
}
else
IO_Print(PUB_TABLE_EMBODY);
return G_SUCCESS;
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_CmdACL();
功能 : 增加访问控制列表的表项的命令
输入参数 : 无.
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_CmdAclAdd(_U32 ulTermID)
{
_S8 *pIpAddr, *pIpMask;
_U32 ulIpaddr, ulIpMask;
pIpAddr = CT_GetParamByName("ip-address", ulTermID);
pIpMask = CT_GetParamByName("mask", ulTermID);
if (pIpAddr == G_NULL || pIpMask == G_NULL)
return G_FAILURE;
if ((_StrToIPAddr(pIpAddr, &ulIpaddr) != G_SUCCESS)
|| (_StrToIPAddr(pIpMask, &ulIpMask) != G_SUCCESS))
return G_FAILURE;
return CLI_AclAdd(ulIpaddr, ulIpMask);
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_CmdACL();
功能 : 删除访问控制列表的表项的命令
输入参数 : 无.
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_CmdAclDel(_U32 ulTermID)
{
_S8 *pIpAddr, *pIpMask;
_U32 ulIpaddr, ulIpMask;
pIpAddr = CT_GetParamByName("ip-address", ulTermID);
pIpMask = CT_GetParamByName("mask", ulTermID);
if (pIpAddr == G_NULL || pIpMask == G_NULL)
return G_FAILURE;
if ((_StrToIPAddr(pIpAddr, &ulIpaddr) != G_SUCCESS)
|| (_StrToIPAddr(pIpMask, &ulIpMask) != G_SUCCESS))
return G_FAILURE;
return CLI_AclDel(ulIpaddr, ulIpMask);
}
/*-----------------------------------------------------------------------------
函数名称 : CLI_CmdShowACL();
功能 : 访问控制列表的查询命令
输入参数 : 无.
输出参数 : 无.
返回值 : G_SUCCESS, 成功;
其他, 失败.
函数调用说明:
典型使用示例:
-----------------------------------------------------------------------------*/
_U32 CLI_CmdShowACL(_U32 ulTermID)
{
(_VOID)ulTermID;
return CLI_AclDisplay();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -