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

📄 cli_acl.c

📁 命令行在嵌入式系统的实现
💻 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 + -