四、08年3月04日
作者:青青子衿
email:anzijin@sina.com
1、 class CMac : public CCommandHandler 类的分析 该类主要用于用户什么的检查
为 CCommandHandler 的子类
在类定义之前定义了一些结构体,注释都很明白,就不多解释了
typedef struct func_s
{
CString sFuncname ; // Function name
} func ;
typedef struct user_s
{
CString sUsername ; // Username
CString sPassword ; // Password
CString sHost ; // Host
CString sIdentd ; // Identd
list < func *> lDeny ; // Functions to deny 拒绝
} user ;
typedef struct login_s
{
user * pUser ; // Pointer to the user of this login
CString sUsername ; // Username
CString sIRCUsername ; // Username in IRC
CString sHost ; // Host
CString sIdentd ; // Identd
} login ;
两个私有成员变量,分别是:
list < user *> luStart ;
list < login *> llStart ;
两个公有成员变量,分别是:
command m_cmdLogin , m_cmdLogout ;
23个成员函数
(1) 、构造函数和析构函数,将两个列表变量清0
CMac :: CMac ()
{
luStart . clear ();
llStart . clear ();
}
CMac ::~ CMac ()
{
luStart . clear ();
llStart . clear ();
}
(2) 、 void CMac :: Init () 初始化函数
void CMac :: Init ()
{
//增加login登录,和mac.logout登出两个命令
g_cMainCtrl . m_cCommands . RegisterCommand (& m_cmdLogout , "mac.logout" , "logs the user out" , this );
g_cMainCtrl . m_cCommands . RegisterCommand (& m_cmdLogin , "login" , "logs the user in" , this );
}
(3)、 FindLogin ( CString sIRCUsername ) 函数
//
//
//函数功能:寻找指定的用户名对应的login结构体
//参数: CString sIRCUsername IRC用户名称
//返回值: login *类型的变量,如果找到返回对应的login 结构体的指针
// 否则返回NULL
//
///
login * CMac :: FindLogin ( CString sIRCUsername )
{
if (! sIRCUsername . CStr ()) //如果要查找的用户名为空,函数返回
{
return NULL ;
}
list < login *>:: iterator il ;
for ( il = llStart . begin (); il != llStart . end (); ++ il )
{
if (!(* il )-> sIRCUsername . Compare ( sIRCUsername ))
{
return (* il ); //找到对应的结构体元素,返回该指针
}
}
return NULL ;
}
(4) 、 FindUser ( CString sUsername ) 函数, 还没有完全弄明白具体的实现过程
//
//
//函数功能:寻找指定的用户名对应 的user *结 构体
//参数: CString sUsername 用户名称
//返回值: user *类型的变量,如果找到返回对应的user 结构体的指针
// 否则返回NULL
//
///
user * CMac :: FindUser ( CString sUsername )
{
if (! sUsername . CStr ()) //判断用户名字符串是否是NULL
{
return NULL ;
}
list < user *>:: iterator iu ;
for ( iu = luStart . begin (); iu != luStart . end (); ++ iu )
{
user * pUser =(* iu ); //定义一个user类型的变量,并保存luStart列表的当前位置
login * pLogin = FindLogin ( sUsername ); //在login类型列表llStart中,找到与sUsername相匹配的login元素。找到是sIRCUsername
if ( pLogin ) //如果找到了
{
pUser = pLogin -> pUser ; //将login类型变量中的pLogin->pUser变量,赋值给pUser
}
if (! pUser -> sUsername . Compare ( sUsername ) || pLogin )
{
return pUser ;
}
}
return NULL ;
}
(5) 、 FindFunc ( CString sFuncname , list < func *> lStart )
//
//
//函数功能:寻找相应的func 结构体变量
//参数: CString sFuncname 名称
// list<func*> lStart 函数结构体列表
//返回值: func *变量
//
//
/
func * CMac :: FindFunc ( CString sFuncname , list < func *> lStart )
{
if (! sFuncname . CStr ()) //保证函数名称不等于空
{
return NULL ;
}
list < func *>:: iterator i ;
for ( i = lStart . begin (); i != lStart . end (); ++ i ) //在func*列表中进行查找,与sFuncname名字相匹配的元素
{
if (!(* i )-> sFuncname . Compare ( sFuncname ))
{
return (* i ); //将给元素返回
}
}
return NULL ;
}
(6)、 CheckPassword 函数用来校验密码
/
//
//函数功能:检测密码
//参数: CString sPassword 密码字符串
// user *pUser 指向用户结构体变量的指针
//返回值: 通过检测返回true, 否则返回false
//
///
bool CMac :: CheckPassword ( CString sPassword , user * pUser )
{
if (! sPassword . CStr ()) //密码字符串不为空
{
return false ;
}
/*
#define MD5_CBLOCK 64
#define MD5_LBLOCK (MD5_CBLOCK/4)
#define MD5_DIGEST_LENGTH 16
typedef struct MD5state_st
{
MD5_LONG A,B,C,D;
MD5_LONG Nl,Nh;
MD5_LONG data[MD5_LBLOCK];
int num;
} MD5_CTX;
*/
MD5_CTX md5 ; //申请一个MD5类型的结构体
MD5_Init (& md5 );
unsigned char szMD5 [16];
CString sMD5 ;
sMD5 . Assign ( "" );
MD5_Update (& md5 , ( unsigned char *) sPassword . Str (), sPassword . GetLength ()); //第二个参数为需要做md5计算的字符串,第三个参数是该字符串的长度
MD5_Final ( szMD5 , & md5 ); //szMD5为生成的0x10位的md5值
for ( int i =0; i <16; i ++) //将计算出来的MD5值,保存到MD5中
{
CString sTemp ;
sTemp . Format ( "%2.2X" , szMD5 [ i ]);
sMD5 . Append ( sTemp );
}
if (! pUser -> sPassword . Compare ( sMD5 )) //用计算出来的MD5值,与pUser结构体中保存的密码比较如果相等返回true,否则返回false。
{
return true ;
}
return false ;
}
(7)、 CheckBadFunc ( CString sFuncname , CString sUsername ) 函数, 检查特定用户是否有操作特定函数的权限
//
//函数功能:检查特定用户是否有操作特定函数的权限
//参数: CString sFuncname 所需要验证函数的名称
// CString sUsername 所需要验证的用户的名称
//返回值: 如果有权限返回true,否则返回false
//
bool CMac :: CheckBadFunc ( CString sFuncname , CString sUsername )
{
user * pUser = FindUser ( sUsername ); //判断该用户是否存在
if (! pUser ) return false ; //如果不存在,返回false
if ( FindFunc ( sFuncname , pUser -> lDeny )) //调用函数在用户的函数列表中寻找,指定的函数名称
{
return true ; //如果找到返回true
}
return false ; //否则返回false
}
(8) 、 AddBadFunc ( CString sFuncname , user * pUser ) 函数
//
//函数功能:为特定用户添加使用指定函数的权限
//参数: CString sFuncname 函数名称
// user *pUser 指向特定用户结构体变量的指针
//返回值:为空
//
/
void CMac :: AddBadFunc ( CString sFuncname , user * pUser )
{
if (! pUser || ! sFuncname . CStr ()) //如果函数名称为空,或用户结构体指针为空,返回
{
return ;
}
int iToken =0;
while ( sFuncname . Token ( iToken , ":" ). Compare ( "" )) //如果sFuncname字符串的":"后边的子字符串不为空,执行循环里边的代码,
{
func * pFunc = new func ;
pFunc -> sFuncname = sFuncname . Token ( iToken , ":" ); //获得":"号后边的子字符串,放到申请的func类型变量中
pUser -> lDeny . push_back ( pFunc ); //将赋值后的pFunc变量,添加到user类型变量的链表中。
iToken ++;
}
}
(9)、 AddLogin 函数
///
//
//函数功能:添加登录账号
//参数: CString sUsername 用户名称
// CString sPassword 用户密码
// CString sIRCUsername IRC的用户名称
// CString sHost 主机名信息
// CString sIdentd 或许是用户的ID吧,不确定
//返回值: bool 添加成功返回true,否则返回false
//
/
bool CMac :: AddLogin ( CString sUsername , CString sPassword , CString sIRCUsername , CString sHost , CString sIdentd )
{
if ( FindLogin ( sIRCUsername )) //寻找IRC用户名(或许是频道名),有人登录
{
return false ; //如果找到返回false
}
user * pUser = FindUser ( sUsername ); //寻找sUsername名称对应的用户结构体变量
if (! pUser ) //如果没有找到返回false
{
return false ;
}
if ( pUser ) //找到该用户执行下面操作
if ( CheckPassword ( sPassword , pUser )) //检查密码的合法性
{ //如果合法
if ( pUser -> sHost . Compare ( "" )) //判断sHost是否为空
{ //如果不为空
if (! strstr ( sHost . CStr (), pUser -> sHost . CStr ())) //用户结构体变量中的主机名,是否是参数主机名字符串的字串
{ //如果不是返回false
return false ;
}
}
login * pLogin = new login ; //申请一块login结构体大小的空间
pLogin -> pUser = pUser ; //将用户结构体指针,加入login结构体变量
pLogin -> sUsername = sUsername ; //添加用户名
pLogin -> sIRCUsername = sIRCUsername ; //添加IRC用户名
llStart . push_back ( pLogin ); //将申请的pLogin变量,加入llStart列表中
return true ; //返回添加成功
}
return false ;
}
(10) 、 ClearLogins () 函数清除所有登录账号
/
//
//函数功能:清除用户登录信息列表
//参数: 无
//返回值: void
//
/
void CMac :: ClearLogins ()
{
llStart . clear ();
}
(11) 、 AddUser ( CString sUsername , CString sPassword , CString sHost , CString sIdentd ) 添加用户函数
/
//
//函数功能:添加用户
//参数: CString sUsername 用户名
// CString sPassword 密码
// CString sHost 主机名
// CString sIdentd 用户的ID
//返回值: void
//
/
void CMac :: AddUser ( CString sUsername , CString sPassword , CString sHost , CString sIdentd )
{
user * pUser = new user ; //申请user类型的变量空间
pUser -> sUsername = sUsername ;
pUser -> sPassword = sPassword ;
pUser -> sHost = sHost ;
pUser -> sIdentd = sIdentd ;
luStart . push_back ( pUser ); //加入用户列表
}
(12) 、 DelBadFunc_int 函数 删除指定用户某个函数功能调用的权限
//
//函数功能:删除指定用户某个函数功能调用的权限
//参数: CString sFuncname 功能函数的名称
// user *pUser 用户结构体指针
//返回值: bool 调用成功返回true,否则返回false
//
///
bool CMac :: DelBadFunc_int ( CString sFuncname , user * pUser )
{
func * pRemove = NULL ;
list < func *>:: iterator i ;
for ( i = pUser -> lDeny . begin (); i != pUser -> lDeny . end (); ++ i ) //在指定用户的func列表中查找
{
if (!(* i )-> sFuncname . Compare ( sFuncname )) pRemove =(* i ); //如果找到一个与参数中的函数名称相同的func结构体元素,将该原始结构体指针赋值给pRemove指针变量中
}
if ( pRemove ) //如果pRemove不为空,将pRemove所指的元素从pUser->lDeny列表中删除。
{
pUser -> lDeny . remove ( pRemove );
delete pRemove ;
return true ; //删除成功返回true
}
return false ; //否则返回false
}
(13) 、 DelBadFunc 函数
//
//函数功能:删除指定用户的多个函数功能调用的权限,各函数用:分隔
//参数: CString sFuncname 功能函数的名称
// user *pUser 用户结构体指针
//返回值: bool 调用成功返回true,否则返回false
//
///
bool CMac :: DelBadFunc ( CString sFuncname , user * pUser )
{
bool bRetVal = true ;
int iToken =0;
while ( sFuncname . Token ( iToken , ":" ). Compare ( "" )) //循环提取出函数功能名,分别调用DelBadFunc_int函数
{
if (! DelBadFunc_int ( sFuncname . Token ( iToken , ":" ), pUser ))
{
bRetVal = false ;
}
iToken ++;
}
return bRetVal ;
}
(14) 、 DelUser ( CString sUsername ) 函数,删除指定的用户
///
//
//函数功能:删除用户记录
//参数: CString sUsername 要用户名称
//返回值: bool 删除成功返回true,否则返回false
//
///
bool CMac :: DelUser ( CString sUsername )
{
if (! sUsername . CStr ()) //保证用户名字符串不为空,否则函数返回false
{
return false ;
}
user * pRemove = NULL ;
list < user *>:: iterator i ;
for ( i = luStart . begin (); i != luStart . end (); ++ i ) //从列表中检索要删除的用户名
{
if (!(* i )-> sUsername . Compare ( sUsername ))
{
pRemove =(* i ); //如果找到,将保存该用户名信息的结构体变量的指针的值赋值给pRemove
}
}
if ( pRemove )
{
luStart . remove ( pRemove ); //删除列表中该元素。
delete pRemove ;
return true ;
}
return false ;
}
(15) HandleCommand ( CMessage * pMsg ) 消息处理函数
//
//函数功能:处理与该类相关的消息
//参数: CMessage *pMsg 消息变量
//返回值: bool 调用成功返回true,否则false
//
///
bool CMac :: HandleCommand ( CMessage * pMsg )
{
if (! pMsg -> sCmd . Compare ( "login" )) //处理login消息
{
if ( g_cMainCtrl . m_cMac . AddLogin ( pMsg -> sChatString . Token (1, " " , true ), pMsg -> sChatString . Token (2, " " , true ), pMsg -> sSrc , pMsg -> sHost , pMsg -> sIdentd ))
{
CString sReply ;
sReply . Format ( "Password accepted." );
g_cMainCtrl . m_cIRC . SendMsg ( pMsg -> bSilent , pMsg -> bNotice , sReply . Str (), pMsg -> sReplyTo . Str ());
return true ;
}
else return false ;
}
else if (! pMsg -> sCmd . Compare ( "mac.logout" )) //处理mac.logout 消息
{
if ( g_cMainCtrl . m_cMac . DelLogin ( CString ( "" ), pMsg -> sSrc ))
{
CString sReply ;
sReply . Format ( "User %s logged out." , pMsg -> sSrc . CStr ());
g_cMainCtrl . m_cIRC . SendMsg ( pMsg -> bSilent , pMsg -> bNotice , sReply . Str (), pMsg -> sReplyTo . Str ());
return true ;
}
else return false ;
}
return false ;
}