Skip to content

Commit 64afbfa

Browse files
committed
fixed:HTTP authentication switch does not support individual verification
1 parent 55d022b commit 64afbfa

File tree

2 files changed

+120
-114
lines changed

2 files changed

+120
-114
lines changed

XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp

Lines changed: 119 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,114 @@ XHTHREAD XCALLBACK HTTPTask_TastPost_Thread(XPVOID lParam)
5555
}
5656
return 0;
5757
}
58+
bool HTTPTask_TastPost_Verification(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR lpszClientAddr, XCHAR** pptszHDRList, int nHDRCount)
59+
{
60+
//http验证
61+
int nVType = 0;
62+
int nSDLen = 0;
63+
XCHAR tszSDBuffer[XPATH_MAX] = {};
64+
RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {};
65+
66+
st_HDRParam.nHttpCode = 401;
67+
st_HDRParam.bIsClose = true;
68+
st_HDRParam.bAuth = true;
69+
//打包验证信息
70+
int nHDRLen = 0;
71+
XCHAR tszHDRBuffer[XPATH_MAX] = {};
72+
if (1 == st_ServiceConfig.st_XVerifcation.nVType)
73+
{
74+
Verification_HTTP_BasicServerPacket(tszHDRBuffer, &nHDRLen);
75+
}
76+
else
77+
{
78+
XCHAR tszNonceStr[64] = {};
79+
XCHAR tszOpaqueStr[64] = {};
80+
Verification_HTTP_DigestServerPacket(tszHDRBuffer, &nHDRLen, tszNonceStr, tszOpaqueStr);
81+
}
82+
//后去验证方法
83+
if (!Verification_HTTP_GetType(pptszHDRList, nHDRCount, &nVType))
84+
{
85+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
86+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
87+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式:%d,错误:%lX"), lpszClientAddr, st_ServiceConfig.st_XVerifcation.nVType, Verification_GetLastError());
88+
return false;
89+
}
90+
//验证方式是否一致
91+
if (st_ServiceConfig.st_XVerifcation.nVType != nVType)
92+
{
93+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
94+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
95+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式错误,请求:%d,需求:%d"), lpszClientAddr, nVType, st_ServiceConfig.st_XVerifcation.nVType);
96+
return false;
97+
}
98+
bool bRet = false;
99+
100+
if (_tcsxlen(st_ServiceConfig.st_XVerifcation.tszAPIAuth) > 0)
101+
{
102+
int nHTTPCode = 0;
103+
int nMSGLen = 0;
104+
XCLIENT_APIHTTP st_APIHttp = {};
105+
XCHAR* ptszMSGBuffer = NULL;
106+
if (!APIClient_Http_Request(_X("GET"), st_ServiceConfig.st_XVerifcation.tszAPIAuth, NULL, &nHTTPCode, &ptszMSGBuffer, &nMSGLen, NULL, NULL, &st_APIHttp))
107+
{
108+
st_HDRParam.nHttpCode = 500;
109+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
110+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
111+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,GET请求验证服务:%s 失败,错误码:%lX"), lpszClientAddr, st_ServiceConfig.st_XVerifcation.tszAPIAuth, APIClient_GetLastError());
112+
return false;
113+
}
114+
if (200 != nHTTPCode)
115+
{
116+
st_HDRParam.nHttpCode = 500;
117+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
118+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
119+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,GET请求验证服务:%s 失败,错误:%d"), lpszClientAddr, st_ServiceConfig.st_XVerifcation.tszAPIAuth, nHTTPCode);
120+
return false;
121+
}
122+
XENGINE_PROTOCOL_USERAUTH st_UserAuth = {};
123+
if (!ModuleProtocol_Parse_Verifcation(ptszMSGBuffer, nSDLen, st_UserAuth.tszUserName, st_UserAuth.tszUserPass))
124+
{
125+
st_HDRParam.nHttpCode = 500;
126+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
127+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
128+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,返回内容:%s 错误,无法继续"), lpszClientAddr, ptszMSGBuffer);
129+
BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer);
130+
return false;
131+
}
132+
BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer);
133+
134+
if (1 == nVType)
135+
{
136+
bRet = Verification_HTTP_Basic(st_UserAuth.tszUserName, st_UserAuth.tszUserPass, pptszHDRList, nHDRCount);
137+
}
138+
else if (2 == nVType)
139+
{
140+
bRet = Verification_HTTP_Digest(st_UserAuth.tszUserName, st_UserAuth.tszUserPass, pSt_HTTPParam->tszHttpMethod, pptszHDRList, nHDRCount);
141+
}
142+
}
143+
else
144+
{
145+
if (1 == nVType)
146+
{
147+
bRet = Verification_HTTP_Basic(st_ServiceConfig.st_XVerifcation.tszUserName, st_ServiceConfig.st_XVerifcation.tszUserPass, pptszHDRList, nHDRCount);
148+
}
149+
else if (2 == nVType)
150+
{
151+
bRet = Verification_HTTP_Digest(st_ServiceConfig.st_XVerifcation.tszUserName, st_ServiceConfig.st_XVerifcation.tszUserPass, pSt_HTTPParam->tszHttpMethod, pptszHDRList, nHDRCount);
152+
}
153+
}
154+
155+
if (!bRet)
156+
{
157+
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
158+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
159+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证处理错误,可能用户密码登信息不匹配,类型:%d"), lpszClientAddr, nVType);
160+
return false;
161+
}
162+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,HTTP验证类型:%d 通过"), lpszClientAddr, nVType);
163+
return true;
164+
}
165+
58166
bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen, XCHAR** pptszHDRList, int nHDRCount)
59167
{
60168
bool bVerification = false;
@@ -103,107 +211,12 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST
103211
//http验证
104212
if (st_ServiceConfig.st_XVerifcation.bEnable)
105213
{
106-
int nVType = 0;
107-
RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {};
108-
109-
st_HDRParam.nHttpCode = 401;
110-
st_HDRParam.bIsClose = true;
111-
st_HDRParam.bAuth = true;
112-
//打包验证信息
113-
int nHDRLen = 0;
114-
XCHAR tszHDRBuffer[XPATH_MAX] = {};
115-
if (1 == st_ServiceConfig.st_XVerifcation.nVType)
116-
{
117-
Verification_HTTP_BasicServerPacket(tszHDRBuffer, &nHDRLen);
118-
}
119-
else
120-
{
121-
XCHAR tszNonceStr[64] = {};
122-
XCHAR tszOpaqueStr[64] = {};
123-
Verification_HTTP_DigestServerPacket(tszHDRBuffer, &nHDRLen, tszNonceStr, tszOpaqueStr);
124-
}
125-
//后去验证方法
126-
if (!Verification_HTTP_GetType(pptszHDRList, nHDRCount, &nVType))
127-
{
128-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
129-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
130-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式:%d,错误:%lX"), lpszClientAddr, st_ServiceConfig.st_XVerifcation.nVType, Verification_GetLastError());
131-
return false;
132-
}
133-
//验证方式是否一致
134-
if (st_ServiceConfig.st_XVerifcation.nVType != nVType)
135-
{
136-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
137-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
138-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证方式错误,请求:%d,需求:%d"), lpszClientAddr, nVType, st_ServiceConfig.st_XVerifcation.nVType);
139-
return false;
140-
}
141-
bool bRet = false;
142-
143-
if (_tcsxlen(st_ServiceConfig.st_XVerifcation.tszAPIAuth) > 0)
144-
{
145-
int nHTTPCode = 0;
146-
int nMSGLen = 0;
147-
XCLIENT_APIHTTP st_APIHttp = {};
148-
XCHAR* ptszMSGBuffer = NULL;
149-
if (!APIClient_Http_Request(_X("GET"), st_ServiceConfig.st_XVerifcation.tszAPIAuth, NULL, &nHTTPCode, &ptszMSGBuffer, &nMSGLen, NULL, NULL, &st_APIHttp))
150-
{
151-
st_HDRParam.nHttpCode = 500;
152-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
153-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
154-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,GET请求验证服务:%s 失败,错误码:%lX"), lpszClientAddr, st_ServiceConfig.st_XVerifcation.tszAPIAuth, APIClient_GetLastError());
155-
return false;
156-
}
157-
if (200 != nHTTPCode)
158-
{
159-
st_HDRParam.nHttpCode = 500;
160-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
161-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
162-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,GET请求验证服务:%s 失败,错误:%d"), lpszClientAddr, st_ServiceConfig.st_XVerifcation.tszAPIAuth, nHTTPCode);
163-
return false;
164-
}
165-
XENGINE_PROTOCOL_USERAUTH st_UserAuth = {};
166-
if (!ModuleProtocol_Parse_Verifcation(ptszMSGBuffer, nSDLen, st_UserAuth.tszUserName, st_UserAuth.tszUserPass))
167-
{
168-
st_HDRParam.nHttpCode = 500;
169-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
170-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
171-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,返回内容:%s 错误,无法继续"), lpszClientAddr, ptszMSGBuffer);
172-
BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer);
173-
return false;
174-
}
175-
BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer);
176-
177-
if (1 == nVType)
178-
{
179-
bRet = Verification_HTTP_Basic(st_UserAuth.tszUserName, st_UserAuth.tszUserPass, pptszHDRList, nHDRCount);
180-
}
181-
else if (2 == nVType)
182-
{
183-
bRet = Verification_HTTP_Digest(st_UserAuth.tszUserName, st_UserAuth.tszUserPass, pSt_HTTPParam->tszHttpMethod, pptszHDRList, nHDRCount);
184-
}
185-
}
186-
else
214+
//全面验证
215+
if (!HTTPTask_TastPost_Verification(pSt_HTTPParam, lpszClientAddr, pptszHDRList, nHDRCount))
187216
{
188-
if (1 == nVType)
189-
{
190-
bRet = Verification_HTTP_Basic(st_ServiceConfig.st_XVerifcation.tszUserName, st_ServiceConfig.st_XVerifcation.tszUserPass, pptszHDRList, nHDRCount);
191-
}
192-
else if (2 == nVType)
193-
{
194-
bRet = Verification_HTTP_Digest(st_ServiceConfig.st_XVerifcation.tszUserName, st_ServiceConfig.st_XVerifcation.tszUserPass, pSt_HTTPParam->tszHttpMethod, pptszHDRList, nHDRCount);
195-
}
196-
}
197-
198-
if (!bRet)
199-
{
200-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHDRBuffer);
201-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
202-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,用户验证失败,验证处理错误,可能用户密码登信息不匹配,类型:%d"), lpszClientAddr, nVType);
203217
return false;
204218
}
205219
bVerification = true;
206-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,HTTP验证类型:%d 通过"), lpszClientAddr, nVType);
207220
}
208221

209222
XCHAR tszKey[XPATH_MAX];
@@ -339,17 +352,13 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST
339352
//后台管理接口:http://app.xyry.org:5501/api?function=back&params1=0
340353
XCHAR tszType[64];
341354
memset(tszType, '\0', sizeof(tszType));
342-
355+
//单独验证
343356
if (st_ServiceConfig.st_XVerifcation.st_VerSwitch.bBackService && !bVerification)
344357
{
345-
st_HDRParam.nHttpCode = 401;
346-
st_HDRParam.bAuth = true;
347-
st_HDRParam.bIsClose = true;
348-
ModuleProtocol_Packet_Common(tszRVBuffer, &nSDLen, 403, _X("User verification required"));
349-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
350-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
351-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求后台协议失败,此模式需要进行验证,但是请求未验证"), lpszClientAddr);
352-
return false;
358+
if (!HTTPTask_TastPost_Verification(pSt_HTTPParam, lpszClientAddr, pptszHDRList, nHDRCount))
359+
{
360+
return false;
361+
}
353362
}
354363
BaseLib_String_GetKeyValue(pptszList[1], "=", tszKey, tszType);
355364
HTTPTask_TaskPost_BackService(lpszClientAddr, lpszMSGBuffer, nMSGLen, _ttxoi(tszType));
@@ -364,14 +373,10 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST
364373
//守护进程接口:http://app.xyry.org:5501/api?function=deamon&params1=0
365374
if (st_ServiceConfig.st_XVerifcation.st_VerSwitch.bDeamon && !bVerification)
366375
{
367-
st_HDRParam.nHttpCode = 401;
368-
st_HDRParam.bAuth = true;
369-
st_HDRParam.bIsClose = true;
370-
ModuleProtocol_Packet_Common(tszRVBuffer, &nSDLen, 403, _X("User verification required"));
371-
HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
372-
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen);
373-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求守护进程协议失败,此模式需要进行验证,但是请求未验证"), lpszClientAddr);
374-
return false;
376+
if (!HTTPTask_TastPost_Verification(pSt_HTTPParam, lpszClientAddr, pptszHDRList, nHDRCount))
377+
{
378+
return false;
379+
}
375380
}
376381
HTTPTask_TaskPost_Deamon(lpszClientAddr, lpszMSGBuffer, nMSGLen);
377382
}

XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@
1313
//任务处理池,用来获取一个完整包
1414
XHTHREAD XCALLBACK HTTPTask_TastPost_Thread(XPVOID lParam);
1515
//任务处理相关函数,处理包的内容
16+
bool HTTPTask_TastPost_Verification(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR lpszClientAddr, XCHAR** pptszHDRList, int nHDRCount);
1617
bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen, XCHAR** pptszHDRList, int nHDRCount);

0 commit comments

Comments
 (0)