📄 caccess.cpp
字号:
}
void CALLBACK CAccess::TimerProc(HWND hwnd, UINT uMsg, UINT uIDEvent,\
DWORD dwTime)
{
CAccess*p=(CAccess*)uIDEvent;
p->DeleteClientPointer();
}
//客户端接收到返回包后调用的回调函数
void CAccess::ClientProcessPendingRead(CObject* pCObject,char*pBuffer,\
int BufferSize)
{
CAccess* pCAccess=(CAccess*)pCObject;
pCAccess->PackageRead(pBuffer,BufferSize);
/* pCAccess->StopTimer();
CSrvSocket * pSrvSocket=pCAccess->GetSrvP ();
CClientSocket* pCCSocket=pCAccess->GetClientP();
int r=pSrvSocket->SendData(pBuffer,BufferSize);
pCAccess->FreeClientP();
CString and="与";
CString disconnect="断开连接";
CString add;
add="192.168.2.123:11";
add=and+add;
add+=disconnect;
pDoc->SetLogInfo(add);
ActiveConnect--;
ClientConnect--;
pMainFrame->DisplayConInfo(CAccess::ActiveConnect,CAccess::ClientConnect,CAccess::ServerConnect);
*/
}
//服务器收到数据包后调用的回调函数
void CAccess::SrvProcessPendingRead(CSrvSocket*pCSrvSocket,\
char* pBuffer,int BufferSize)
{
/* int length=0;
char p[1024];
CString Error;
char* cookie="1234";
char* role="yuan";
char* url="http";
if(!PackageMake(p,1024,&length,MOD_RUNTIME,MOD_ACCESS,PKG_RAc4,cookie,role,url,""))
int m=1;*/
//用指针pSrvSocket给CAccess对象的成员变量赋值
CAccess * pCAccess;
if((pCSrvSocket->GetSrvPCObject())==NULL)
{
pCAccess=new CAccess;
pCAccess->SrvPInitial(pCSrvSocket);
pCSrvSocket->SrvInitial(pCAccess);
//将连接信息写入文档对象
CString and="Access与";
CString connect="建立连接";
UINT port;
CString sPort;
CString add;
pCSrvSocket->GetPeerAdd(add,port);
sPort.Format("%d",port);
add+=':';
add+=sPort;
pCAccess->SetConnectAdd(add);
add=and+add;
add+=connect;
pDoc->SetConnectInfo(add);
//将连接信息在状态条显示出来
ActiveConnect++;
ServerConnect++;
pMainFrame->DisplayConInfo(CAccess::ActiveConnect,CAccess::ClientConnect,CAccess::ServerConnect);
//调用CAccess::PackageRead()进行数据处理
pCAccess->PackageRead(pBuffer,BufferSize);
}
else
{
pCAccess=(CAccess*)(pCSrvSocket->GetSrvPCObject());
pCAccess->PackageRead(pBuffer,BufferSize);
}
/* CClientSocket* pCClientSocket;
pCClientSocket=new CClientSocket(pCAccess,CAccess::ClientProcessPendingRead);
int r=pCClientSocket->BuildConnect(11,"192.168.2.123");
if(r!=0)
{
::MessageBox(0,"建立连接失败","发送连接请求",MB_OK);
delete pCClientSocket;
return;
}
pCAccess->ClientPInitial(pCClientSocket);
int c=pCClientSocket->SendData(pBuffer,BufferSize);
pCAccess->BuildTimer();
add.Empty();
sPort.Empty();
add="192.168.2.123";
port=11;
sPort.Format("%d",port);
add+=':';
add+=sPort;
add=and+add;
add+=connect;
pDoc->SetLogInfo(add);
ActiveConnect++;
ClientConnect++;
pMainFrame->DisplayConInfo(CAccess::ActiveConnect,CAccess::ClientConnect,CAccess::ServerConnect);
pCClientSocket=NULL;*/
}
//服务端收到对方关闭信息时调用的回调函数,进行CAccess对象的释放
void CAccess::SrvCloseSocket(CObject* pCObject)
{
if(pCObject!=NULL)
{
CAccess* pCAccess=(CAccess*)pCObject;
//向文档对象写入关闭信息
CString and="Access与";
CString connect="断开连接";
CString add;
add=pCAccess->GetConnectAdd();
add=and+add;
add+=connect;
pDoc->SetConnectInfo(add);
//将关闭连接信息在状态条中显示出来
ActiveConnect--;
ServerConnect--;
pMainFrame->DisplayConInfo(CAccess::ActiveConnect,CAccess::ClientConnect,CAccess::ServerConnect);
//释放CAccess对象
pCAccess->Destroy();
delete pCAccess;
}
}
//初始化成员变量pDoc和pMainFrame
void CAccess::InitStatusDoc()
{
//初始化静态成员变量pStatus
(CAccess::pMainFrame)=(CMainFrame*)AfxGetApp()->m_pMainWnd;
//初始化静态成员变量pDoc
CSingleDocTemplate* pDocTemp;
POSITION p=AfxGetApp()\
->GetFirstDocTemplatePosition();
pDocTemp=(CSingleDocTemplate*)(AfxGetApp()\
->GetNextDocTemplate(p));
p=pDocTemp->GetFirstDocPosition();
(CAccess::pDoc)=(CAccessDoc*)pDocTemp->GetNextDoc(p);
pDoc->SetTitle(ACCESSTITLE);
}
/////////////////////////////////////////////////////////////////////////////
int CAccess::RuntimeWithAccess01()
{
char tag[2];
tag[0]=LogType; //系统支持的认证方式
tag[1]='\0';
char pBuffer[6];
pBuffer[5]='\0';
CString Error;
int PackLength;
bool r=PackageMake(pBuffer,5,&PackLength,MOD_ACCESS,MOD_RUNTIME,1,tag,"");
if(r==0)
{
Error=GetLastErrorStr();
Error="CAccess::RuntimeWithAccess01:"+Error;
pDoc->SetConnectInfo(Error);
return -1;
}
int l=m_pSrvSocket->SendData(pBuffer,PackLength);
if(l!=PackLength)
{
LPVOID lpMsgBuf; //Windows will allocate
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言
(LPTSTR)&lpMsgBuf, 0, NULL );
//显示
Error=(LPCTSTR)lpMsgBuf;
Error="CAccess::RuntimeWithAccess01:"+Error;
pDoc->SetConnectInfo(Error);
//释放内存
::LocalFree( lpMsgBuf );
return -1;
}
return 0;
}
int CAccess::RuntimeWithAccess2()
{
int NameLength;
int PassLength;
CString UserName;
CString PassWord;
int result;
int count=0;
int i;
MY_DB_MESSAGE AuthTag;
char* pl;
char* pg;
char* ErrorStr=NULL;
CString Error;
switch(m_LogTag)
{
case NAMEPASS: //用户的登陆方式为“用户名/口令”
pl=(char*)(&m_LogInfoLength);
//取出“用户名”长度
NameLength=(int)(*pl);
pl++;
//取出“密码”长度
PassLength=(int)(*pl);
m_pUserName=new char[NameLength+1];
pl=m_pUserName;
pl+=NameLength;
*pl='\0';
m_pPassWord=new char[PassLength+1];
pl=m_pPassWord;
pl+=PassLength;
*pl='\0';
pl=m_pUserName;
pg=m_pLogInfo;
//取出“用户名”
for(i=0;i<NameLength;i++)
{
*pl=*pg;
pl++;
pg++;
}
//取出“密码”
pl=m_pPassWord;
for(i=0;i<PassLength;i++)
{
*pl=*pg;
pl++;
pg++;
}
//验证用户名和密码
UserName=m_pUserName;
PassWord=m_pPassWord;
if(!(pDatabase->IfConnected()))
{
int c=pDatabase->ConnectDB(DbSource,DbUser,DbPass);
if(c!=0)
{
((CMainFrame*)AfxGetMainWnd())->OnFileShutlisten();
return -1;
}
}
result=pDatabase->IfHavingAuthority(UserName,PassWord,&AuthTag);
if(result!=0)
{
m_ErrorCode=5;
RuntimeWithAccess255();
return 0;
}
if((AuthTag.boolMessage)==0)
{
m_AuthTag=NAK;
RuntimeWithAccess3();
}
if((AuthTag.boolMessage)==1)
{
m_AuthTag=ACK;
m_uid=AuthTag.iMessage;
if(m_uid<1||m_uid>9999)
{
pDoc->SetConnectInfo("Access读数据库时UID值越界");
return -1;
}
SessionMSWithAccess0();
}
else
{
pDoc->SetConnectInfo("Access读数据库时,结构体MY_DB_MESSAGE中iMessage值错误");
return -1;
}
delete m_pUserName;
m_pUserName=NULL;
delete m_pPassWord;
m_pPassWord=NULL;
delete m_pLogInfo;
m_pLogInfo=NULL;
break;
case CERT: //用户的登陆方式为证书方式
AuthorityWithAccess0();
break;
}
return 0;
}
int CAccess::RuntimeWithAccess3()
{
CArray<MY_ROLE_DATA,MY_ROLE_DATA>* pRoleList;
MY_ROLE_DATA role;
char** rolelist;
int r=0;
char tag[2];
tag[0]=m_AuthTag;
tag[1]='\0';
int length=0;
CString Error;
if(m_AuthTag==NAK)
{
char pBuffer[6];
pBuffer[5]='\0';
if(!PackageMake(pBuffer,5,&length,MOD_ACCESS,MOD_RUNTIME,PKG_AcR3,tag,""))
{
Error=GetLastErrorStr();
Error="CAccess::RuntimeWithAccess3:"+Error;
pDoc->SetConnectInfo(Error);
return -1;
}
r=m_pSrvSocket->SendData(pBuffer,length);
if(r!=length)
{
LPVOID lpMsgBuf; //Windows will allocate
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言
(LPTSTR)&lpMsgBuf, 0, NULL );
//显示
Error=(LPTSTR)lpMsgBuf;
Error="CAccess::RuntimeWithAccess3:"+Error;
pDoc->SetConnectInfo(Error);
//释放内存
::LocalFree( lpMsgBuf );
FreeClientP();
return -1;
}
}
if(m_AuthTag==ACK) //身份信息正确
{
if(m_CreateSidTag==ACK) //会话对象创建成功
{
pRoleList=new CArray<MY_ROLE_DATA,MY_ROLE_DATA>;
if(!(pDatabase->IfConnected()))
{
int c=pDatabase->ConnectDB(DbSource,DbUser,DbPass);
if(c!=0)
{
((CMainFrame*)AfxGetMainWnd())->OnFileShutlisten();
return -1;
}
}
int r=pDatabase->GetRolesListFrmUID(m_uid,pRoleList);
if(r!=0)
{
m_ErrorCode=5;
RuntimeWithAccess255();
return 0;
}
BYTE rolenum=pRoleList->GetSize();
char RoleNum[2];
RoleNum[0]=rolenum;
RoleNum[1]='\0';
rolelist=new LPTSTR[rolenum+1];
char** p=rolelist;
for(int i=0;i<rolenum;i++)
{
role=pRoleList->GetAt(i);
*p=(char*)(LPCTSTR)(role.Role);
p++;
}
*p=NULL;
rolelist[rolenum]=NULL;
int length;
char pBuffer[1024];
CString Error;
if(!PackageMake(pBuffer,1024,&length,MOD_ACCESS,MOD_RUNTIME,PKG_AcR3,tag,m_pSid,RoleNum,rolelist,""))
{
Error=GetLastErrorStr();
Error="CAccess::RuntimeWithAccess3:"+Error;
pDoc->SetConnectInfo(Error);
return -1;
}
pBuffer[length]='\0';
r=m_pSrvSocket->SendData(pBuffer,length);
if(r!=length)
{
LPVOID lpMsgBuf; //Windows will allocate
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言
(LPTSTR)&lpMsgBuf, 0, NULL );
//显示
Error=(LPTSTR)lpMsgBuf;
Error="CAccess::RuntimeWithAccess3:"+Error;
pDoc->SetConnectInfo(Error);
//释放内存
::LocalFree( lpMsgBuf );
FreeClientP();
return -1;
}
delete rolelist;
delete pRoleList;
}
if(m_CreateSidTag==NAK)
{
m_ErrorCode=8;
RuntimeWithAccess255();
return 0;
}
}
return 0;
}
int CAccess::RuntimeWithAccess4()
{
CString Role;
Role=m_pRole;
//对称解密并进行base64解码
char SDBIkey[17]="!@#$%^&*()_+|<>?";
DWORD OutLength=0;
DWORD BaseLength=0;
BYTE out[30];
char OutBase[30];
for(int i=0;i<30;i++)
OutBase[i]=0;
Base64Decode(m_pCookie, out, &OutLength);
SDBIDec(out,OutLength,(BYTE*)OutBase,&BaseLength,(BYTE*)SDBIkey);
delete m_pCookie;
m_pCookie=new char[BaseLength+1];
strcpy(m_pCookie,OutBase);
//解密结束
MY_DB_MESSAGE uidstruct;
//从sid得到uid
if(!(pDatabase->IfConnected()))
{
int c=pDatabase->ConnectDB(DbSource,DbUser,DbPass);
if(c!=0)
{
((CMainFrame*)AfxGetMainWnd())->OnFileShutlisten();
return -1;
}
}
int r=pDatabase->GetUIDFromSID(m_pCookie,&uidstruct);
if(r!=RETURNRIGHTCODE)
{
m_ErrorCode=5;
RuntimeWithAccess255();
return -1;
}
if(!(pDatabase->IfConnected()))
{
int c=pDatabase->ConnectDB(DbSource,DbUser,DbPass);
if(c!=0)
{
((CMainFrame*)AfxGetMainWnd())->OnFileShutlisten();
return -1;
}
}
r=pDatabase->AddCurRole(Role,uidstruct.iMessage);
if(r!=0)
{
m_ErrorCode=5;
RuntimeWithAccess255();
return -1;
}
EntitlementWithAccess0();
return 0;
}
int CAccess::RuntimeWithAccess5()
{
char pBuffer[1024];
int length;
CString Error;
char tag[2];
tag[0]=m_EntitleTag;
tag[1]='\0';
if(!PackageMake(pBuffer,1024,&length,MOD_ACCESS,MOD_RUNTIME,PKG_AcR5,tag,m_pUrl,m_pMenu,""))
{
Error=GetLastErrorStr();
Error="CAccess::RuntimeWithAccess5:"+Error;
pDoc->SetConnectInfo(Error);
return -1;
}
pBuffer[length]='\0';
int r=m_pSrvSocket->SendData(pBuffer,length);
if(r!=length)
{
LPVOID lpMsgBuf; //Windows will allocate
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言
(LPTSTR)&lpMsgBuf, 0, NULL );
//显示
Error=(LPTSTR)lpMsgBuf;
Error="CAccess::RuntimeWithAccess5:"+Error;
pDoc->SetConnectInfo(Error);
//释放内存
::LocalFree( lpMsgBuf );
return -1;
}
return 0;
}
int CAccess::RuntimeWithAccess6()
{
//对称解密并进行base64解码
char SDBIkey[17]="!@#$%^&*()_+|<>?";
DWORD OutLength=0;
DWORD BaseLength=0;
BYTE out[30];
char OutBase[30];
for(int i=0;i<30;i++)
OutBase[i]=0;
Base64Decode(m_pCookie, out, &OutLength);
SDBIDec(out,OutLength,(BYTE*)OutBase,&BaseLength,(BYTE*)SDBIkey);
delete m_pCookie;
m_pCookie=new char[BaseLength+1];
strcpy(m_pCookie,OutBase);
//解密结束
SessionMSWithAccess2();
return 0;
}
int CAccess::RuntimeWithAccess7()
{
char pBuffer[6];
CString Error;
int length;
pBuffer[5]='\0';
char tag[2];
tag[0]=m_RevokeSidTag;
tag[1]='\0';
if(!PackageMake(pBuffer,5,&length,MOD_ACCESS,MOD_RUNTIME,PKG_AcR7,tag,""))
{
Error=GetLastErrorStr();
Error="CAccess::RuntimeWithAccess7:"+Error;
pDoc->SetConnectInfo(Error);
return -1;
}
int r=m_pSrvSocket->SendData(pBuffer,length);
if(r!=length)
{
LPVOID lpMsgBuf; //Windows will allocate
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言
(LPTSTR)&lpMsgBuf, 0, NULL );
//显示
Error=(LPTSTR)lpMsgBuf;
Error="CAccess::RuntimeWithAccess7:"+Error;
pDoc->SetConnectInfo(Error);
//释放内存
::LocalFree( lpMsgBuf );
return -1;
}
return 0;
}
int CAccess::RuntimeWithAccess255()
{
char ErrorStr[2];
ErrorStr[0]=m_ErrorCode;
ErrorStr[1]='\0';
char pBuffer[6];
CString Error;
pBuffer[5]='\0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -