diff --git a/.github/workflows/Rocky_build.yml b/.github/workflows/Rocky_build.yml index 12ebcfc..50aa58f 100644 --- a/.github/workflows/Rocky_build.yml +++ b/.github/workflows/Rocky_build.yml @@ -97,6 +97,6 @@ jobs: - name: Upload folder as artifact with CentOS uses: actions/upload-artifact@v4 with: - name: XEngine_MQServiceApp-CentOS_${{ matrix.version }}_${{ matrix.artifact }} + name: XEngine_MQServiceApp-RockyLinux_${{ matrix.version }}_${{ matrix.artifact }} path: XEngine_Release/ retention-days: 1 diff --git a/CHANGELOG b/CHANGELOG index a340d7c..019df1b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,39 @@ +XEngine_MQService V3.19.0.1001 + +增加:权限控制开关 +增加:数据传输加密支持 +更新:依赖库 +修改:mqtt协议的订阅和取消订阅不在交给tcp处理并且mqtt协议流程代码修改 +修改:当tcp登录的时候会创建http的token了 +修改:重构了tcp和http协议,现在大部分消息处理都通过http实现,tcp只处理投递订阅和获取消息 +修改:绑定消息协议字符串 +修改:协议消息统一 +修改:权限控制和处理 +修改:tcp登录权限处理 +修正:某些时候协议没有响应和解析问题 +修正:当post的协议找不到的时候没有响应问题 +修正:当没有找到http协议的时候无响应问题 +删除:http公用消息打包函数 +删除:多余的协议错误定义 + +added:permission control of build switch +added:data transfer crypt +update:depend library +modify:mqtt protcol bind and unbind does not post tcp handle and mqtt protocol process modify +modify:create token of http when tcp login +modify:Reconstruct the TCP and HTTP protocols,now the data processed by the HTTP protocol is no longer handed over to the TCP for processing +modify:message and topic modify and request message number to http protocol +modify:does not case-sensitive +modify:bind message protocol string +modify:protocol user unified +modify:permission management and process +modify:tcp login permission handle +fixed:some protocol not reply and parse process failure +fixed:no reply when not found post protocol +fixed:http protocol not reply when not found protocol +delete:http comm message packet +delete:more protocol error define +====================================================================================== XEngine_MQService V3.18.0.1001 ci:增加CentOS和Alma以及debian13系统支持 diff --git a/README.en.md b/README.en.md index c967926..93e9089 100644 --- a/README.en.md +++ b/README.en.md @@ -19,7 +19,7 @@ this software support following features 3. message timeout 4. topic Partition 5. message tracking(planning) -6. encrypt Communication(planning) +6. encrypt Communication 7. load balanc(planning) 8. message get time 9. message subcribe @@ -38,6 +38,7 @@ this software support following features 22. http verification 23. email notify 24. sms notify(plan) +25. permission control ## install @@ -108,6 +109,8 @@ database you need to open the database matching fields and tables are consistent ## other problems You can refer to the document under the docment directory. It contains API protocol and service description. +#### Compiler Options +When __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__ == 1, permission control can be enabled. Only users with administrator privileges can operate critical permissions, and this is mainly intended for HTTP interfaces ## Test Server Address Address:app.xyry.org Port:TCP 5200,WEBSOCKET 5201,HTTP Management Interface 5202 diff --git a/README.md b/README.md index 63144b5..1644db1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ c c++Message Service 3. 消息超时 4. 主题分区 5. 消息回溯 -6. 加密通信(planning) +6. 加密通信 7. 负载均衡(planning) 8. 消息次数 9. 消息订阅 @@ -40,6 +40,7 @@ c c++Message Service 22. http验证 23. 电子邮件通知 24. 短信通知(plan) +25. 权限控制 ## 安装教程 @@ -118,6 +119,9 @@ make FLAGS=CleanAll 清理编译 ## 其他问题 你可以参考docment目录下的文档.里面包含了API协议和服务说明. +#### 编译选项 +__XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__ == 1 可以开启权限控制,只有管理员权限才可以操作关键权限,主要用于HTTP接口 + ## 测试服务器 地址:app.xyry.org 端口:TCP 5200,WEBSOCKET 5201,管理接口HTTP 5202 diff --git a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp index 22f52ca..6ebb118 100644 --- a/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp +++ b/XEngine_Apps/MQCore_HTTPApp/MQCore_HTTPApp.cpp @@ -22,6 +22,53 @@ //VS2022 Debug x86 Compile //g++ -std=c++17 -Wall -g MQCore_HTTPApp.cpp -o MQCore_HTTPApp.exe -lXEngine_BaseLib -lXClient_APIHelp __int64x xhToken = 0; + +//获取未读消息 +void MQ_GetUNRead() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=unreadmsg"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszMQKey"] = "XEngine_MSGKeyName"; + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_GetUNRead:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_DelMsg() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deletemsg"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["nSerial"] = 1; + st_JsonObject["tszMQKey"] = "XEngine_MSGKeyName"; + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_DelMsg:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} + void MQ_UserRegister() { LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=register"); @@ -71,7 +118,7 @@ void MQ_UserLogin() } void MQ_UserDelete() { - LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deluser"); + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deleteuser"); Json::Value st_JsonRoot; Json::Value st_JsonUser; @@ -132,7 +179,32 @@ void MQ_TopicCreate() Json::Value st_JsonRoot; Json::Value st_JsonObject; - st_JsonObject["name"] = "topictest"; + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszMQKey"] = "topictest"; + + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_TopicCreate:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_TopicModify() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=modifytopic"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszSrcTopic"] = "topictest"; + st_JsonObject["tszDstTopic"] = "topic2test"; st_JsonRoot["xhToken"] = xhToken; st_JsonRoot["Object"] = st_JsonObject; @@ -147,6 +219,7 @@ void MQ_TopicCreate() _xtprintf("MQ_TopicCreate:%s\n", ptszMsgBody); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); } + void MQ_TopicDelete() { LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=deletetopic"); @@ -154,7 +227,8 @@ void MQ_TopicDelete() Json::Value st_JsonRoot; Json::Value st_JsonObject; - st_JsonObject["name"] = "topictest"; + st_JsonObject["tszMQUsr"] = "123123aa"; + st_JsonObject["tszMQKey"] = "topic2test"; st_JsonRoot["xhToken"] = xhToken; st_JsonRoot["Object"] = st_JsonObject; @@ -169,6 +243,49 @@ void MQ_TopicDelete() _xtprintf("MQ_TopicDelete:%s\n", ptszMsgBody); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); } +void MQ_GetTopic() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=gettopic"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonRoot["xhToken"] = xhToken; + st_JsonObject["tszMQKey"] = "topictest"; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_GetTopic:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} +void MQ_GetNumber() +{ + LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getnumber"); + + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + + st_JsonObject["nKeepTime"] = 1; + st_JsonObject["tszMQKey"] = "XEngine_CommKey"; + st_JsonRoot["xhToken"] = xhToken; + st_JsonRoot["Object"] = st_JsonObject; + + int nLen = 0; + XCHAR* ptszMsgBody = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszPostUrl, st_JsonRoot.toStyledString().c_str(), NULL, &ptszMsgBody, &nLen)) + { + _xtprintf("发送投递失败!\n"); + return; + } + _xtprintf("MQ_GetNumber:%s\n", ptszMsgBody); + BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBody); +} void MQ_GetTopicList() { LPCXSTR lpszPostUrl = _X("http://127.0.0.1:5202/api?function=getlist"); @@ -196,12 +313,17 @@ int main() MQ_UserRegister(); MQ_UserLogin(); + MQ_GetUNRead(); MQ_GetUserList(); MQ_GetOnlineList(); MQ_TopicCreate(); + MQ_GetTopic(); + MQ_GetNumber(); MQ_GetTopicList(); + MQ_TopicModify(); MQ_TopicDelete(); MQ_UserDelete(); + #ifdef _MSC_BUILD WSACleanup(); #endif diff --git a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp index 238db5a..099a40c 100644 --- a/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp +++ b/XEngine_Apps/MQCore_TCPApp/MQCore_TCPApp.cpp @@ -3,6 +3,7 @@ #include #pragma comment(lib,"Ws2_32.lib") #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") +#pragma comment(lib,"XEngine_Core/XEngine_Cryption.lib") #pragma comment(lib,"XEngine_Client/XClient_Socket.lib") #endif #include @@ -15,18 +16,22 @@ using namespace std; #include #include #include +#include +#include #include #include #include "../../XEngine_Source/XQueue_ProtocolHdr.h" //VS2022 Debug x86 Compile -//g++ -std=c++17 -Wall -g MQCore_TCPApp.cpp -o MQCore_TCPApp.exe -lXEngine_BaseLib -lXClient_Socket +//g++ -std=c++17 -Wall -g MQCore_TCPApp.cpp -o MQCore_TCPApp.exe -lXEngine_BaseLib -lXEngine_Cryption -lXClient_Socket +#define XENGINE_CRYPTION_DATA_ENABLE 0 XSOCKET m_Socket; __int64x nLastNumber = 0; LPCXSTR lpszKey = _X("XEngine_CommKey"); //主题 LPCXSTR lpszUser = _X("123123aa"); LPCXSTR lpszPass = _X("123123"); +LPCXSTR lpszCryptKey = _X("123123aa"); //加解密密钥 void MQ_Authorize() { @@ -55,6 +60,10 @@ void MQ_Authorize() memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_ProtocolAuth, sizeof(XENGINE_PROTOCOL_USERAUTH)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif + if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -74,103 +83,6 @@ void MQ_Authorize() BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } } -//获取未读消息 -void MQ_GetUNRead(int nType = 0) -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; //必须为真 - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - - while (true) - { - nLen = 0; - XCHAR* ptszMsgBuffer; - - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) - { - if (0 == st_ProtocolHdr.wReserve) - { - _xtprintf("接受到数据,长度:%d,内容:%s\n", st_ProtocolHdr.unPacketSize, ptszMsgBuffer); - } - else - { - _xtprintf("获取消息队列数据失败,错误码:%d\n", st_ProtocolHdr.wReserve); - } - BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } -} - -void MQ_Create() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; //获得处理返回结果 - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - memcpy(&st_ProtocolHdr, tszMsgBuffer, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(&st_XMQProtocol, tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), sizeof(XENGINE_PROTOCOL_XMQ)); -} typedef struct { @@ -229,6 +141,9 @@ void MQ_Post(LPCXSTR lpszMsgBuffer, int nType = 0, int nPubTime = -1, bool bSelf memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_XMQ), lpszMsgBuffer, strlen(lpszMsgBuffer)); } +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -243,6 +158,10 @@ void MQ_Post(LPCXSTR lpszMsgBuffer, int nType = 0, int nPubTime = -1, bool bSelf _xtprintf("接受数据失败!\n"); return; } + +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); @@ -279,6 +198,9 @@ void MQ_PostEMail(LPCXSTR lpszMsgBuffer) memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_XMQ), lpszMsgBuffer, strlen(lpszMsgBuffer)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -293,6 +215,9 @@ void MQ_PostEMail(LPCXSTR lpszMsgBuffer) _xtprintf("接受数据失败!\n"); return; } +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); @@ -323,6 +248,9 @@ void MQ_Get(int nType = 0) memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -338,6 +266,9 @@ void MQ_Get(int nType = 0) memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); if (XClient_TCPSelect_RecvPkt(m_Socket, &ptszMsgBuffer, &nLen, &st_ProtocolHdr)) { +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(XENGINE_PROTOCOL_XMQ)); if (0 == st_ProtocolHdr.wReserve) @@ -395,6 +326,9 @@ void MQ_TimePublish() memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_PROTOCOL_XMQ), lpszMsgBuffer, _tcsxlen(lpszMsgBuffer)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptEncodec(NULL, (XBYTE*)(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR)), (int*)&st_ProtocolHdr.unPacketSize, lpszCryptKey); +#endif if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) { _xtprintf("发送投递失败!\n"); @@ -417,151 +351,16 @@ void MQ_TimePublish() memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); +#if 1 == XENGINE_CRYPTION_DATA_ENABLE + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nLen, lpszCryptKey); +#endif + memcpy(&st_XMQProtocol, ptszMsgBuffer, sizeof(st_XMQProtocol)); _xtprintf("接受到通知消息,主题:%s,序列:%lld,长度:%d,内容:%s\n", st_XMQProtocol.tszMQKey, st_XMQProtocol.nSerial, st_ProtocolHdr.unPacketSize - sizeof(XENGINE_PROTOCOL_XMQ), ptszMsgBuffer + sizeof(XENGINE_PROTOCOL_XMQ)); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } -void MQ_GetNumber() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nLen)) - { - XENGINE_MQNUMBER st_MQNumber; - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_MQNumber, '\0', sizeof(XENGINE_MQNUMBER)); - - memcpy(&st_ProtocolHdr, tszMsgBuffer, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(&st_MQNumber, tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), sizeof(XENGINE_MQNUMBER)); - - if (0 == st_ProtocolHdr.wReserve) - { - nLastNumber = st_MQNumber.nLastNumber; - _xtprintf("接受到消息信息,主题:%s,个数:%lld,起始编号:%lld,结束编号:%lld\n", st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); - } - else - { - _xtprintf("接受到消息信息失败,错误码:%d\n", st_ProtocolHdr.wReserve); - } - } -} -void MQ_BindTopic() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - - st_XMQProtocol.nSerial = 1; //设置为1开始读取 - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (XClient_TCPSelect_RecvMsg(m_Socket, tszMsgBuffer, &nLen)) - { - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - memcpy(&st_ProtocolHdr, tszMsgBuffer, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(&st_XMQProtocol, tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), sizeof(XENGINE_PROTOCOL_XMQ)); - - if (0 == st_ProtocolHdr.wReserve) - { - _xtprintf("请求某个位置开始获取消息成功,主题:%s,序列号:%lld\n", st_XMQProtocol.tszMQKey, st_XMQProtocol.nSerial); - } - else - { - _xtprintf("请求某个位置开始获取消息失败,错误码:%d\n", st_ProtocolHdr.wReserve); - } - } -} - -//删除主题 -void MQ_DeleteTopic() -{ - int nLen = 0; - XENGINE_PROTOCOLHDR st_ProtocolHdr; - XENGINE_PROTOCOL_XMQ st_XMQProtocol; - XCHAR tszMsgBuffer[2048]; - - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - memset(&st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - memset(&st_XMQProtocol, '\0', sizeof(XENGINE_PROTOCOL_XMQ)); - - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE; - st_ProtocolHdr.byVersion = 1; - st_ProtocolHdr.byIsReply = true; //不获取结果 - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - strcpy(st_XMQProtocol.tszMQKey, lpszKey); - - nLen = sizeof(XENGINE_PROTOCOLHDR) + st_ProtocolHdr.unPacketSize; - memcpy(tszMsgBuffer, &st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(tszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), &st_XMQProtocol, sizeof(XENGINE_PROTOCOL_XMQ)); - - if (!XClient_TCPSelect_SendMsg(m_Socket, tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } -} int main(int argc, char** argv) { @@ -580,10 +379,7 @@ int main(int argc, char** argv) MQ_Authorize(); //MQ_PostEMail("test for email"); - MQ_GetUNRead(); - MQ_Create(); MQ_Post(NULL, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN, -1, true); - MQ_BindTopic(); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN); MQ_Post(lpszMsgBuffer, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING, 0); @@ -591,12 +387,10 @@ int main(int argc, char** argv) { MQ_Post(lpszMsgBuffer, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING, -1, true); } - MQ_GetNumber(); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING); MQ_Get(ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_STRING); MQ_TimePublish(); - MQ_DeleteTopic(); std::this_thread::sleep_for(std::chrono::seconds(1)); XClient_TCPSelect_Close(m_Socket); diff --git a/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp b/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp index 29d9bd8..40d122d 100644 --- a/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp +++ b/XEngine_Apps/MQCore_WSApp/MQCore_WSApp.cpp @@ -102,44 +102,6 @@ void MQ_Authorize() _xtprintf("MQ_Authorize:%s\n", tszMsgBuffer); } -void MQ_Create() -{ - int nLen = 0; - XCHAR tszMsgBuffer[2048]; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - - Json::Value st_JsonRoot; - Json::Value st_JsonMQProtocol; - st_JsonRoot["unOperatorType"] = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_JsonRoot["unOperatorCode"] = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE; - st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - st_JsonRoot["byIsReply"] = 1; - - st_JsonMQProtocol["tszMQKey"] = lpszKey; - st_JsonMQProtocol["nSerial"] = 0; - st_JsonMQProtocol["nKeepTime"] = 0; - st_JsonMQProtocol["nGetTimer"] = 0; - - st_JsonRoot["st_MQProtocol"] = st_JsonMQProtocol; - - nLen = st_JsonRoot.toStyledString().length(); - memcpy(tszMsgBuffer, st_JsonRoot.toStyledString().c_str(), nLen); - - if (!MQ_SendPacket(tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!MQ_RecvPacket(tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - _xtprintf("MQ_Create:%s\n", tszMsgBuffer); -} - void MQ_Post(LPCXSTR lpszMsgBuffer) { int nLen = 0; @@ -192,79 +154,6 @@ void MQ_Post(LPCXSTR lpszMsgBuffer) _xtprintf("MQ_Post:%s\n", tszMsgBuffer); } - -void MQ_BindTopic() -{ - int nLen = 0; - XCHAR tszMsgBuffer[2048]; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - - Json::Value st_JsonRoot; - Json::Value st_JsonMQProtocol; - Json::Value st_JsonPayload; - st_JsonRoot["unOperatorType"] = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_JsonRoot["unOperatorCode"] = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND; - st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - st_JsonRoot["byIsReply"] = 1; - - st_JsonMQProtocol["tszMQKey"] = lpszKey; - st_JsonMQProtocol["nSerial"] = 1; - - st_JsonRoot["st_MQProtocol"] = st_JsonMQProtocol; - - nLen = st_JsonRoot.toStyledString().length(); - memcpy(tszMsgBuffer, st_JsonRoot.toStyledString().c_str(), nLen); - - if (!MQ_SendPacket(tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!MQ_RecvPacket(tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - _xtprintf("MQ_GetOrder:%s\n", tszMsgBuffer); -} - -void MQ_GetNumber() -{ - int nLen = 0; - XCHAR tszMsgBuffer[2048]; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - - Json::Value st_JsonRoot; - Json::Value st_JsonMQProtocol; - Json::Value st_JsonPayload; - st_JsonRoot["unOperatorType"] = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_JsonRoot["unOperatorCode"] = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER; - st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - st_JsonRoot["byIsReply"] = 1; - - st_JsonMQProtocol["tszMQKey"] = lpszKey; - - st_JsonRoot["st_MQProtocol"] = st_JsonMQProtocol; - - nLen = st_JsonRoot.toStyledString().length(); - memcpy(tszMsgBuffer, st_JsonRoot.toStyledString().c_str(), nLen); - - if (!MQ_SendPacket(tszMsgBuffer, nLen)) - { - _xtprintf("发送投递失败!\n"); - return; - } - nLen = 2048; - memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - if (!MQ_RecvPacket(tszMsgBuffer, &nLen)) - { - _xtprintf("接受数据失败!\n"); - return; - } - _xtprintf("MQ_GetSerial:%s\n", tszMsgBuffer); -} void MQ_Get() { int nLen = 0; @@ -351,10 +240,7 @@ int main() _xtprintf("%s\n", tszMsgBuffer + nPos); } MQ_Authorize(); - MQ_Create(); MQ_Post("MTIzMTIz"); - MQ_GetNumber(); - MQ_BindTopic(); MQ_Get(); #ifdef _MSC_BUILD diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 43eade6..b3eb094 100644 Binary files a/XEngine_Docment/Docment_en.docx and b/XEngine_Docment/Docment_en.docx differ diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 0da0a4b..18d2e25 100644 Binary files a/XEngine_Docment/Docment_zh.docx and b/XEngine_Docment/Docment_zh.docx differ diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index d7e6a71..8e4a4f5 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -23,10 +23,10 @@ "LogType": 17 }, "XSql": { - "SQLAddr": "127.0.0.1", + "SQLAddr": "118.25.14.242", "SQLPort": 3306, "SQLUser": "root", - "SQLPass": "123123" + "SQLPass": "123123Qyt!" }, "XPass": { "nTimeout": 2, @@ -53,7 +53,7 @@ "tszEMailSubject": "XEngine MessageQueue Notify", "tszServiceAddr": "smtp://smtp.163.com", "tszUser": "ggqytgodlove@163.com", - "tszPass": "1" + "tszPass": "STZsBi3uuJvWsWL3" }, "SMSNotify": { "bEnable": false @@ -63,5 +63,10 @@ "bEnable": true, "tszServiceName": "XEngine_MQService", "tszAPIUrl": "http://app.xyry.org:5501/api?function=machine" + }, + "XCryption": { + "bEnable": false, + "nCryptionType": 1, + "tszPassword": "123123aa" } } \ No newline at end of file diff --git a/XEngine_Release/XEngine_Config/XEngine_VerConfig.json b/XEngine_Release/XEngine_Config/XEngine_VerConfig.json index 296adc0..e663a9f 100644 --- a/XEngine_Release/XEngine_Config/XEngine_VerConfig.json +++ b/XEngine_Release/XEngine_Config/XEngine_VerConfig.json @@ -1,6 +1,8 @@ { "XVer":[ - "3.17.0.1001 Build20250901", + "3.19.0.1001 Build20260228", + "3.18.0.1001 Build20251016", + "3.17.0.1001 Build20250907", "3.16.0.1001 Build20250524", "3.15.0.1001 Build20250313", "3.14.0.1001 Build20250120", diff --git a/XEngine_Source/MQCore_ConfigModule/Config_Define.h b/XEngine_Source/MQCore_ConfigModule/Config_Define.h index 05ae453..3e9c59a 100644 --- a/XEngine_Source/MQCore_ConfigModule/Config_Define.h +++ b/XEngine_Source/MQCore_ConfigModule/Config_Define.h @@ -91,6 +91,12 @@ typedef struct XCHAR tszAPIUrl[XPATH_MAX]; XCHAR tszServiceName[128]; }st_XReport; + struct + { + bool bEnable; + int nCryptionType; + XCHAR tszPassword[XPATH_MIN]; + }st_XCryption; struct { list *pStl_ListStorage; diff --git a/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp b/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp index 34bcad8..b5111bc 100644 --- a/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp +++ b/XEngine_Source/MQCore_ConfigModule/Config_Json/Config_Json.cpp @@ -168,6 +168,17 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile,XENGINE_SERVERCONFIG pSt_ServerConfig->st_XReport.bEnable = st_JsonXReport["bEnable"].asBool(); _tcsxcpy(pSt_ServerConfig->st_XReport.tszAPIUrl, st_JsonXReport["tszAPIUrl"].asCString()); _tcsxcpy(pSt_ServerConfig->st_XReport.tszServiceName, st_JsonXReport["tszServiceName"].asCString()); + + if (st_JsonRoot["XCryption"].empty() || (3 != st_JsonRoot["XCryption"].size())) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_MQ_MODULE_CONFIG_JSON_XREPORT; + return false; + } + Json::Value st_JsonXCryption = st_JsonRoot["XCryption"]; + pSt_ServerConfig->st_XCryption.bEnable = st_JsonXCryption["bEnable"].asBool(); + pSt_ServerConfig->st_XCryption.nCryptionType = st_JsonXCryption["nCryptionType"].asInt(); + _tcsxcpy(pSt_ServerConfig->st_XCryption.tszPassword, st_JsonXCryption["tszPassword"].asCString()); return true; } bool CConfig_Json::Config_Json_VersionFile(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG* pSt_ServerConfig) diff --git a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def index f0d3201..c7760b5 100644 --- a/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def +++ b/XEngine_Source/MQCore_ProtocolModule/MQCore_ProtocolModule.def @@ -13,12 +13,12 @@ EXPORTS ProtocolModule_Packet_TopicList ProtocolModule_Packet_OnlineList ProtocolModule_Packet_TopicName - ProtocolModule_Packet_UNReadCreate - ProtocolModule_Packet_UNReadInsert - ProtocolModule_Packet_UNReadDelete + ProtocolModule_Packet_UNReadMsg ProtocolModule_Parse_Websocket ProtocolModule_Parse_Register ProtocolModule_Parse_Token ProtocolModule_Parse_Type - ProtocolModule_Parse_Name \ No newline at end of file + ProtocolModule_Parse_XMQ + ProtocolModule_Parse_MessageQueue + ProtocolModule_Parse_ModifyTopic \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp index a63e3e9..e8a437a 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.cpp @@ -75,10 +75,6 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_Common(int nNetType, XENGINE_ { ProtocolModule_Packet_WSCommon(pSt_ProtocolHdr, pSt_MQProtocol, ptszMsgBuffer, pInt_MsgLen, lpszMsgBuffer, nMsgLen); } - else if (XENGINE_MQAPP_NETTYPE_HTTP == nNetType) - { - ProtocolModule_Packet_Http(ptszMsgBuffer, pInt_MsgLen, pSt_ProtocolHdr->wReserve); - } else { ProtocolModule_Packet_MQTTCommon(pSt_ProtocolHdr, pSt_MQProtocol, ptszMsgBuffer, pInt_MsgLen, lpszMsgBuffer, nMsgLen); @@ -88,76 +84,51 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_Common(int nNetType, XENGINE_ /******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入协议头 - 参数.二:pSt_MQNumber - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的序列号信息 - 参数.三:ptszMsgBuffer + 参数.一:ptszMsgBuffer In/Out:Out 类型:字符指针 可空:N 意思:输出打好包的缓冲区 - 参数.四:pInt_MsgLen + 参数.二:pInt_MsgLen In/Out:Out 类型:整数型指针 可空:N 意思:输出缓冲区大小 - 参数.五:nNetType - In/Out:Out - 类型:整数型 + 参数.三:pSt_MQNumber + In/Out:In + 类型:数据结构指针 可空:N - 意思:输入网络类型 + 意思:输入要打包的序列号信息 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CProtocolModule_Packet::ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType) +bool CProtocolModule_Packet::ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber) { Protocol_IsErrorOccur = false; - if ((NULL == pSt_ProtocolHdr) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; return false; } + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + Json::StreamWriterBuilder st_JsonBuilder; - if (XENGINE_MQAPP_NETTYPE_TCP == nNetType) - { - pSt_ProtocolHdr->unPacketSize = sizeof(XENGINE_MQNUMBER); - memcpy(ptszMsgBuffer, pSt_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(ptszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), pSt_MQNumber, sizeof(XENGINE_MQNUMBER)); - *pInt_MsgLen = sizeof(XENGINE_PROTOCOLHDR) + sizeof(XENGINE_MQNUMBER); - } - else - { - Json::Value st_JsonRoot; - Json::Value st_JsonObject; - Json::StreamWriterBuilder st_JsonBuilder; - - st_JsonRoot["unOperatorType"] = pSt_ProtocolHdr->unOperatorType; - st_JsonRoot["unOperatorCode"] = pSt_ProtocolHdr->unOperatorCode; - st_JsonRoot["wReserve"] = pSt_ProtocolHdr->wReserve; + st_JsonObject["tszMQKey"] = pSt_MQNumber->tszMQKey; + st_JsonObject["nCount"] = (Json::Value::Int64)pSt_MQNumber->nCount; + st_JsonObject["nFirstNumber"] = (Json::Value::Int64)pSt_MQNumber->nFirstNumber; + st_JsonObject["nLastNumber"] = (Json::Value::Int64)pSt_MQNumber->nLastNumber; - st_JsonObject["tszMQKey"] = pSt_MQNumber->tszMQKey; - st_JsonObject["nCount"] = (Json::Value::Int64)pSt_MQNumber->nCount; - st_JsonObject["nFirstNumber"] = (Json::Value::Int64)pSt_MQNumber->nFirstNumber; - st_JsonObject["nLastNumber"] = (Json::Value::Int64)pSt_MQNumber->nLastNumber; - - st_JsonRoot["st_MQNumber"] = st_JsonObject; + st_JsonRoot["st_MQNumber"] = st_JsonObject; - st_JsonBuilder["emitUTF8"] = true; + st_JsonBuilder["emitUTF8"] = true; - *pInt_MsgLen = Json::writeString(st_JsonBuilder, st_JsonRoot).length(); - memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), *pInt_MsgLen); - } + *pInt_MsgLen = Json::writeString(st_JsonBuilder, st_JsonRoot).length(); + memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), *pInt_MsgLen); return true; } /******************************************************************** @@ -601,159 +572,66 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_TopicName(XCHAR* ptszMsgBuffe return true; } /******************************************************************** -函数名称:ProtocolModule_Packet_UNReadCreate -函数功能:未读消息打包创建函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的协议头 - 参数.二:enPayType - In/Out:In - 类型:枚举型 +函数名称:ProtocolModule_Packet_UNReadMsg +函数功能:获取未读消息打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 可空:N - 意思:输入打包的负载类型 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -XHANDLE CProtocolModule_Packet::ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType) -{ - Protocol_IsErrorOccur = false; - - if (NULL == pSt_ProtocolHdr) - { - Protocol_IsErrorOccur = true; - Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; - return NULL; - } - //申请内存 - PROTOCOL_PACKETUNREAD* pSt_UNRead = new PROTOCOL_PACKETUNREAD; - if (NULL == pSt_UNRead) - { - Protocol_IsErrorOccur = true; - Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_MALLOC; - return NULL; - } - memset(&pSt_UNRead->st_ProtocolHdr, '\0', sizeof(XENGINE_PROTOCOLHDR)); - - pSt_UNRead->nType = enPayType; - if (pSt_UNRead->nType == ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN) - { - pSt_UNRead->st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - pSt_UNRead->st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - pSt_UNRead->st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - pSt_UNRead->st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD; - pSt_UNRead->st_ProtocolHdr.byVersion = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - } - else - { - pSt_UNRead->st_JsonRoot["wHeader"] = pSt_ProtocolHdr->wHeader; - pSt_UNRead->st_JsonRoot["wTail"] = pSt_ProtocolHdr->wTail; - pSt_UNRead->st_JsonRoot["unOperatorType"] = pSt_ProtocolHdr->unOperatorType; - pSt_UNRead->st_JsonRoot["unOperatorCode"] = pSt_ProtocolHdr->unOperatorCode; - pSt_UNRead->st_JsonRoot["byVersion"] = ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON; - pSt_UNRead->st_JsonRoot["wReserve"] = 0; - } - return pSt_UNRead; -} -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadInsert -函数功能:消息打包数据插入 - 参数.一:xhToken - In/Out:In - 类型:句柄 + 意思:输出打包的内容 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 可空:N - 意思:输入要操作的句柄 - 参数.二:lpszKeyName + 意思:输出打包大小 + 参数.三:pppSt_UserKey In/Out:In 类型:三级指针 可空:N - 意思:输入队列名称 - 参数.三:nListCount + 意思:输入要打包的数据 + 参数.四:nListCount In/Out:In 类型:整数型 可空:N - 意思:输入队列个数 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -bool CProtocolModule_Packet::ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount) -{ - Protocol_IsErrorOccur = false; - - PROTOCOL_PACKETUNREAD* pSt_UNRead = (PROTOCOL_PACKETUNREAD*)xhToken; - if (NULL == pSt_UNRead) - { - Protocol_IsErrorOccur = true; - Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_NOTFOUND; - return false; - } - Json::Value st_JsonSubArray; - - st_JsonSubArray["Name"] = lpszKeyName; - st_JsonSubArray["Count"] = nListCount; - pSt_UNRead->st_JsonArray.append(st_JsonSubArray); - return true; -} -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadDelete -函数功能:删除数据并且导出 - 参数.一:xhToken - In/Out:In - 类型:句柄 - 可空:N - 意思:输入要操作的句柄 - 参数.二:ptszMsgBuffer - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出打好包的数据 - 参数.三:pInt_MsgLen - In/Out:Out - 类型:整数型指针 - 可空:N - 意思:输出数据大小 + 意思:输入要打包的数据的个数 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CProtocolModule_Packet::ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR* ptszMsgBuffer, int* pInt_MsgLen) +bool CProtocolModule_Packet::ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount) { Protocol_IsErrorOccur = false; - PROTOCOL_PACKETUNREAD* pSt_UNRead = (PROTOCOL_PACKETUNREAD*)xhToken; - if (NULL == pSt_UNRead) + if (NULL == ptszMsgBuffer || NULL == pInt_MsgLen) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_NOTFOUND; return false; } + Json::Value st_JsonRoot; + Json::Value st_JsonArray; Json::StreamWriterBuilder st_JsonBuilder; - st_JsonBuilder["emitUTF8"] = true; - pSt_UNRead->st_JsonRoot["Array"] = pSt_UNRead->st_JsonArray; - pSt_UNRead->st_JsonRoot["Count"] = pSt_UNRead->st_JsonArray.size(); + st_JsonRoot["code"] = 0; + st_JsonRoot["msg"] = "success"; - if (pSt_UNRead->nType == ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN) - { - pSt_UNRead->st_ProtocolHdr.unPacketSize = Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).length(); - memcpy(ptszMsgBuffer, &pSt_UNRead->st_ProtocolHdr, sizeof(XENGINE_PROTOCOLHDR)); - memcpy(ptszMsgBuffer + sizeof(XENGINE_PROTOCOLHDR), Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).c_str(), pSt_UNRead->st_ProtocolHdr.unPacketSize); - *pInt_MsgLen = sizeof(XENGINE_PROTOCOLHDR) + pSt_UNRead->st_ProtocolHdr.unPacketSize; - } - else + for (int i = 0; i < nListCount; i++) { - *pInt_MsgLen = Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).length(); - memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, pSt_UNRead->st_JsonRoot).c_str(), *pInt_MsgLen); + Json::Value st_JsonObject; + st_JsonObject["tszUserName"] = (*pppSt_UserKey)[i]->tszUserName; + st_JsonObject["nKeySerial"] = (Json::Value::Int64)(*pppSt_UserKey)[i]->nKeySerial; + st_JsonObject["tszCreateTime"] = (*pppSt_UserKey)[i]->tszCreateTime; + st_JsonObject["tszKeyName"] = (*pppSt_UserKey)[i]->tszKeyName; + st_JsonObject["tszUPTime"] = (*pppSt_UserKey)[i]->tszUPTime; + st_JsonArray.append(st_JsonObject); } + st_JsonRoot["Array"] = st_JsonArray; + st_JsonRoot["Count"] = nListCount; - delete pSt_UNRead; - pSt_UNRead = NULL; + st_JsonBuilder["emitUTF8"] = true; + *pInt_MsgLen = Json::writeString(st_JsonBuilder, st_JsonRoot).length(); + memcpy(ptszMsgBuffer, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), *pInt_MsgLen); return true; } /////////////////////////////////////////////////////////////////////////////// @@ -990,23 +868,6 @@ bool CProtocolModule_Packet::ProtocolModule_Packet_MQTTCommon(XENGINE_PROTOCOLHD } } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICBIND == pSt_ProtocolHdr->unOperatorCode) - { - if (0 == pSt_ProtocolHdr->wReserve) - { - MQTTProtocol_Packet_REPComm(tszRVBuffer, &nRVLen, pSt_ProtocolHdr->wPacketSerial, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_REASON_SUCCESS); - } - else - { - MQTTProtocol_Packet_REPComm(tszRVBuffer, &nRVLen, pSt_ProtocolHdr->wPacketSerial, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_REASON_TOPICNAME); - } - MQTTProtocol_Packet_Header(ptszMsgBuffer, pInt_MsgLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_SUBACK, tszRVBuffer, nRVLen); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICUNBIND == pSt_ProtocolHdr->unOperatorCode) - { - MQTTProtocol_Packet_REPComm(tszRVBuffer, &nRVLen, pSt_ProtocolHdr->wPacketSerial, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_REASON_SUCCESS); - MQTTProtocol_Packet_Header(ptszMsgBuffer, pInt_MsgLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_UNSUBACK, tszRVBuffer, nRVLen); - } else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_MSGNOTIFY == pSt_ProtocolHdr->unOperatorCode) { MQTTProtocol_Packet_REQPublish(tszRVBuffer, &nRVLen, pSt_MQProtocol->tszMQKey, lpszMsgBuffer, nMsgLen); diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h index 3721aae..db0b550 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Packet/ProtocolModule_Packet.h @@ -26,7 +26,7 @@ class CProtocolModule_Packet ~CProtocolModule_Packet(); public: bool ProtocolModule_Packet_Common(int nNetType, XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_PROTOCOL_XMQ* pSt_MQProtocol, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszMsgBuffer = NULL, int nMsgLen = 0); - bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType); + bool ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber); bool ProtocolModule_Packet_PassAuth(XENGINE_PROTOCOL_USERAUTH* pSt_ProtocolAuth, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode); bool ProtocolModule_Packet_PassUser(XENGINE_PROTOCOL_USERINFO* pSt_ProtocolUser, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode); bool ProtocolModule_Packet_PassHttp(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszToken, LPCXSTR lpszAPIUser, LPCXSTR lpszURIApi); @@ -35,10 +35,7 @@ class CProtocolModule_Packet bool ProtocolModule_Packet_TopicList(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** pppszTableName, int nListCount); bool ProtocolModule_Packet_OnlineList(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListUser, int nListCount); bool ProtocolModule_Packet_TopicName(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszTopicName, int nTopicCount); -public: - XHANDLE ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType); - bool ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount); - bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); + bool ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount); protected: bool ProtocolModule_Packet_TCPCommon(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_PROTOCOL_XMQ* pSt_MQProtocol, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszMsgBuffer = NULL, int nMsgLen = 0); bool ProtocolModule_Packet_WSCommon(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_PROTOCOL_XMQ* pSt_MQProtocol, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszMsgBuffer = NULL, int nMsgLen = 0); diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp index c5267aa..48993cb 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.cpp @@ -421,17 +421,17 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int 类型:整数型 可空:N 意思:要解析的大小 - 参数.三:ptszMSGBuffer + 参数.三:pSt_XMQProtocol In/Out:Out - 类型:字符指针 + 类型:数据结构指针 可空:N - 意思:输出解析到的名称 + 意思:输出解析的XMQ协议 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -bool CProtocolModule_Parse::ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer) +bool CProtocolModule_Parse::ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol) { Protocol_IsErrorOccur = false; @@ -453,10 +453,180 @@ bool CProtocolModule_Parse::ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int return false; } Json::Value st_JsonObject = st_JsonRoot["Object"]; - if (!st_JsonObject["name"].isNull()) + if (!st_JsonObject["tszMQKey"].isNull()) + { + _tcsxcpy(pSt_XMQProtocol->tszMQKey, st_JsonObject["tszMQKey"].asCString()); + } + if (!st_JsonObject["tszMQUsr"].isNull()) + { + _tcsxcpy(pSt_XMQProtocol->tszMQUsr, st_JsonObject["tszMQUsr"].asCString()); + } + if (!st_JsonObject["nKeepTime"].isNull()) + { + pSt_XMQProtocol->nKeepTime = st_JsonObject["nKeepTime"].asInt(); + } + if (!st_JsonObject["nPubTime"].isNull()) + { + pSt_XMQProtocol->nPubTime = st_JsonObject["nPubTime"].asInt(); + } + if (!st_JsonObject["nSerial"].isNull()) + { + pSt_XMQProtocol->nSerial = st_JsonObject["nSerial"].asInt(); + } + return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_MessageQueue +函数功能:解析消息数据协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pSt_MQMessage + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析的消息协议 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage) +{ + Protocol_IsErrorOccur = false; + if ((NULL == lpszMsgBuffer)) { - _tcsxcpy(ptszMSGBuffer, st_JsonObject["name"].asCString()); + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; + return false; } + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::CharReaderBuilder st_ReaderBuilder; + std::unique_ptr const pSt_JsonReader(st_ReaderBuilder.newCharReader()); + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARSE; + return false; + } + Json::Value st_JsonObject = st_JsonRoot["Object"]; + if (!st_JsonObject["byMsgType"].isNull()) + { + pSt_MQMessage->byMsgType = st_JsonObject["byMsgType"].asInt(); + } + if (!st_JsonObject["nMsgAttr"].isNull()) + { + XSHOT nMsgAttr = st_JsonObject["nMsgAttr"].asUInt(); + memcpy(&pSt_MQMessage->nMsgAttr, &nMsgAttr, sizeof(XENGINE_PROTOCOL_MSGATTR)); + } + if (!st_JsonObject["nQueueSerial"].isNull()) + { + pSt_MQMessage->nQueueSerial = st_JsonObject["nQueueSerial"].asInt64(); + } + if (!st_JsonObject["nMsgLen"].isNull()) + { + pSt_MQMessage->nMsgLen = st_JsonObject["nMsgLen"].asInt(); + } + if (!st_JsonObject["tszMsgBuffer"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszMsgBuffer, st_JsonObject["tszMsgBuffer"].asCString()); + } + if (!st_JsonObject["tszUserName"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszUserName, st_JsonObject["tszUserName"].asCString()); + } + if (!st_JsonObject["tszUserBelong"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszUserBelong, st_JsonObject["tszUserBelong"].asCString()); + } + if (!st_JsonObject["tszQueueName"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszQueueName, st_JsonObject["tszQueueName"].asCString()); + } + if (!st_JsonObject["tszQueueLeftTime"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszQueueLeftTime, st_JsonObject["tszQueueLeftTime"].asCString()); + } + if (!st_JsonObject["tszQueuePublishTime"].isNull()) + { + _tcsxcpy(pSt_MQMessage->tszQueuePublishTime, st_JsonObject["tszQueuePublishTime"].asCString()); + } + return true; +} +/******************************************************************** +函数名称:ProtocolModule_Parse_ModifyTopic +函数功能:解析修改主题协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:ptszSrcTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出原始主题名称 + 参数.四:ptszDstTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出目标主题名称 + 参数.五:ptszUser + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出所属用户 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CProtocolModule_Parse::ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser) +{ + Protocol_IsErrorOccur = false; + + if (NULL == lpszMsgBuffer) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::CharReaderBuilder st_ReaderBuilder; + std::unique_ptr const pSt_JsonReader(st_ReaderBuilder.newCharReader()); + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = true; + Protocol_dwErrorCode = ERROR_MQ_MODULE_PROTOCOL_PARSE; + return false; + } + Json::Value st_JsonObject = st_JsonRoot["Object"]; + if (!st_JsonObject["tszSrcTopic"].isNull()) + { + _tcsxcpy(ptszSrcTopic, st_JsonObject["tszSrcTopic"].asCString()); + } + if (!st_JsonObject["tszDstTopic"].isNull()) + { + _tcsxcpy(ptszDstTopic, st_JsonObject["tszDstTopic"].asCString()); + } + if (!st_JsonObject["tszMQUsr"].isNull()) + { + _tcsxcpy(ptszUser, st_JsonObject["tszMQUsr"].asCString()); + } return true; } \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h index d503748..bdac465 100644 --- a/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h +++ b/XEngine_Source/MQCore_ProtocolModule/ProtocolModule_Parse/ProtocolModule_Parse.h @@ -21,7 +21,9 @@ class CProtocolModule_Parse bool ProtocolModule_Parse_Register(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_USERINFO* pSt_UserInfo); bool ProtocolModule_Parse_Token(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Type); - bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer); + bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol); + bool ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage); + bool ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser); protected: private: }; diff --git a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h index 1bdc723..c9a5d3c 100644 --- a/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h +++ b/XEngine_Source/MQCore_ProtocolModule/Protocol_Define.h @@ -64,37 +64,27 @@ extern "C" bool ProtocolModule_Packet_Common(int nNetType, XENGINE_PROTOCOLHDR* /******************************************************************** 函数名称:ProtocolModule_Packet_MQNumber 函数功能:获取序列打包函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入协议头 - 参数.二:pSt_MQNumber - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的序列号信息 - 参数.三:ptszMsgBuffer + 参数.一:ptszMsgBuffer In/Out:Out 类型:字符指针 可空:N 意思:输出打好包的缓冲区 - 参数.四:pInt_MsgLen + 参数.二:pInt_MsgLen In/Out:Out 类型:整数型指针 可空:N 意思:输出缓冲区大小 - 参数.五:nNetType - In/Out:Out - 类型:整数型 + 参数.三:pSt_MQNumber + In/Out:In + 类型:数据结构指针 可空:N - 意思:输入网络类型 + 意思:输入要打包的序列号信息 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, XENGINE_MQNUMBER* pSt_MQNumber, XCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nNetType); +extern "C" bool ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber); /******************************************************************** 函数名称:ProtocolModule_Packet_PassAuth 函数功能:HTTP代理打包函数 @@ -333,72 +323,34 @@ extern "C" bool ProtocolModule_Packet_OnlineList(XCHAR* ptszMsgBuffer, int* pInt *********************************************************************/ extern "C" bool ProtocolModule_Packet_TopicName(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszTopicName, int nTopicCount); /******************************************************************** -函数名称:ProtocolModule_Packet_UNReadCreate -函数功能:未读消息打包创建函数 - 参数.一:pSt_ProtocolHdr - In/Out:In - 类型:数据结构指针 - 可空:N - 意思:输入要打包的协议头 - 参数.二:enPayType - In/Out:In - 类型:枚举型 +函数名称:ProtocolModule_Packet_UNReadMsg +函数功能:获取未读消息打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 可空:N - 意思:输入打包的负载类型 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -extern "C" XHANDLE ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType); -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadInsert -函数功能:消息打包数据插入 - 参数.一:xhToken - In/Out:In - 类型:句柄 + 意思:输出打包的内容 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 可空:N - 意思:输入要操作的句柄 - 参数.二:lpszKeyName + 意思:输出打包大小 + 参数.三:pppSt_UserKey In/Out:In 类型:三级指针 可空:N - 意思:输入队列名称 - 参数.三:nListCount + 意思:输入要打包的数据 + 参数.四:nListCount In/Out:In 类型:整数型 可空:N - 意思:输入队列个数 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -extern "C" bool ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount); -/******************************************************************** -函数名称:ProtocolModule_Packet_UNReadDelete -函数功能:删除数据并且导出 - 参数.一:xhToken - In/Out:In - 类型:句柄 - 可空:N - 意思:输入要操作的句柄 - 参数.二:ptszMsgBuffer - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出打好包的数据 - 参数.三:pInt_MsgLen - In/Out:Out - 类型:整数型指针 - 可空:N - 意思:输出数据大小 + 意思:输入要打包的数据的个数 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); +extern "C" bool ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount); /************************************************************************/ /* 解析类函数 */ /************************************************************************/ @@ -521,14 +473,72 @@ extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, in 类型:整数型 可空:N 意思:要解析的大小 - 参数.三:ptszMSGBuffer + 参数.三:pSt_XMQProtocol + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析的XMQ协议 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol); +/******************************************************************** +函数名称:ProtocolModule_Parse_MessageQueue +函数功能:解析消息数据协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pSt_MQMessage + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析的消息协议 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage); +/******************************************************************** +函数名称:ProtocolModule_Parse_ModifyTopic +函数功能:解析修改主题协议 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:ptszSrcTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出原始主题名称 + 参数.四:ptszDstTopic + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出目标主题名称 + 参数.五:ptszUser In/Out:Out 类型:字符指针 可空:N - 意思:输出解析到的名称 + 意思:输出所属用户 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer); \ No newline at end of file +extern "C" bool ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser); \ No newline at end of file diff --git a/XEngine_Source/MQCore_ProtocolModule/pch.cpp b/XEngine_Source/MQCore_ProtocolModule/pch.cpp index ee4b5f7..8564ca2 100644 --- a/XEngine_Source/MQCore_ProtocolModule/pch.cpp +++ b/XEngine_Source/MQCore_ProtocolModule/pch.cpp @@ -35,9 +35,9 @@ extern "C" bool ProtocolModule_Packet_Common(int nNetType, XENGINE_PROTOCOLHDR * { return m_ProtocolPacket.ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, pSt_MQProtocol, ptszMsgBuffer, pInt_MsgLen, lpszMsgBuffer, nMsgLen); } -extern "C" bool ProtocolModule_Packet_MQNumber(XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, XENGINE_MQNUMBER * pSt_MQNumber, XCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nNetType) +extern "C" bool ProtocolModule_Packet_MQNumber(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_MQNUMBER* pSt_MQNumber) { - return m_ProtocolPacket.ProtocolModule_Packet_MQNumber(pSt_ProtocolHdr, pSt_MQNumber, ptszMsgBuffer, pInt_MsgLen, nNetType); + return m_ProtocolPacket.ProtocolModule_Packet_MQNumber(ptszMsgBuffer, pInt_MsgLen, pSt_MQNumber); } extern "C" bool ProtocolModule_Packet_PassAuth(XENGINE_PROTOCOL_USERAUTH * pSt_ProtocolAuth, XCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nCode) { @@ -71,17 +71,9 @@ extern "C" bool ProtocolModule_Packet_TopicName(XCHAR * ptszMsgBuffer, int* pInt { return m_ProtocolPacket.ProtocolModule_Packet_TopicName(ptszMsgBuffer, pInt_MsgLen, lpszTopicName, nTopicCount); } -extern "C" XHANDLE ProtocolModule_Packet_UNReadCreate(XENGINE_PROTOCOLHDR * pSt_ProtocolHdr, ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE enPayType) +extern "C" bool ProtocolModule_Packet_UNReadMsg(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_DBUSERKEY*** pppSt_UserKey, int nListCount) { - return m_ProtocolPacket.ProtocolModule_Packet_UNReadCreate(pSt_ProtocolHdr, enPayType); -} -extern "C" bool ProtocolModule_Packet_UNReadInsert(XHANDLE xhToken, LPCXSTR lpszKeyName, int nListCount) -{ - return m_ProtocolPacket.ProtocolModule_Packet_UNReadInsert(xhToken, lpszKeyName, nListCount); -} -extern "C" bool ProtocolModule_Packet_UNReadDelete(XHANDLE xhToken, XCHAR * ptszMsgBuffer, int* pInt_MsgLen) -{ - return m_ProtocolPacket.ProtocolModule_Packet_UNReadDelete(xhToken, ptszMsgBuffer, pInt_MsgLen); + return m_ProtocolPacket.ProtocolModule_Packet_UNReadMsg(ptszMsgBuffer, pInt_MsgLen, pppSt_UserKey, nListCount); } /************************************************************************/ /* 解析类函数 */ @@ -102,7 +94,15 @@ extern "C" bool ProtocolModule_Parse_Type(LPCXSTR lpszMsgBuffer, int nMsgLen, in { return m_ProtocolParse.ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, pInt_Type); } -extern "C" bool ProtocolModule_Parse_Name(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszMSGBuffer) +extern "C" bool ProtocolModule_Parse_XMQ(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_PROTOCOL_XMQ* pSt_XMQProtocol) +{ + return m_ProtocolParse.ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, pSt_XMQProtocol); +} +extern "C" bool ProtocolModule_Parse_MessageQueue(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_DBMESSAGEQUEUE* pSt_MQMessage) +{ + return m_ProtocolParse.ProtocolModule_Parse_MessageQueue(lpszMsgBuffer, nMsgLen, pSt_MQMessage); +} +extern "C" bool ProtocolModule_Parse_ModifyTopic(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszSrcTopic, XCHAR* ptszDstTopic, XCHAR* ptszUser) { - return m_ProtocolParse.ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, ptszMSGBuffer); + return m_ProtocolParse.ProtocolModule_Parse_ModifyTopic(lpszMsgBuffer, nMsgLen, ptszSrcTopic, ptszDstTopic, ptszUser); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_DependLibrary b/XEngine_Source/XEngine_DependLibrary index 24bde9d..adf48e2 160000 --- a/XEngine_Source/XEngine_DependLibrary +++ b/XEngine_Source/XEngine_DependLibrary @@ -1 +1 @@ -Subproject commit 24bde9d212cd48b822ad8aab90956033972ee46b +Subproject commit adf48e22d68f741ec52f299945f8f8f8fb3df9d2 diff --git a/XEngine_Source/XEngine_MQServiceApp.sln b/XEngine_Source/XEngine_MQServiceApp.sln index 3e25035..c963bf0 100644 --- a/XEngine_Source/XEngine_MQServiceApp.sln +++ b/XEngine_Source/XEngine_MQServiceApp.sln @@ -32,6 +32,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MQCore_SessionModule", "MQC EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MQCore_Hdr", "MQCore_Hdr", "{3A9FE48B-7FD1-4D02-8ED7-7521DC469765}" ProjectSection(SolutionItems) = preProject + XQueue_BuildSwtich.h = XQueue_BuildSwtich.h XQueue_ProtocolHdr.h = XQueue_ProtocolHdr.h EndProjectSection EndProject diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp index 230faf7..8694711 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPGet.cpp @@ -20,7 +20,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH LPCXSTR lpszAPIUPDate = _X("update"); LPCXSTR lpszAPIClose = _X("close"); - if (0 == _tcsxnicmp(lpszAPILogin, lpszFuncName, _tcsxlen(lpszAPILogin))) + if (0 == _tcsxncmp(lpszAPILogin, lpszFuncName, _tcsxlen(lpszAPILogin))) { //http://app.xyry.org:5202/api?function=login&user=123123aa&pass=123123 XNETHANDLE xhToken = 0; @@ -47,7 +47,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH return true; } //权限是否正确 - if (0 != st_UserInfo.nUserLevel) + if (ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_BAN == st_UserInfo.nUserLevel) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "permission error"); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); @@ -66,7 +66,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求登录获得TOKEN:%lld 成功,用户级别:%d"), lpszClientAddr, xhToken, st_UserInfo.nUserLevel); } - else if (0 == _tcsxnicmp(lpszAPIUPDate, lpszFuncName, _tcsxlen(lpszAPIUPDate))) + else if (0 == _tcsxncmp(lpszAPIUPDate, lpszFuncName, _tcsxlen(lpszAPIUPDate))) { //http://app.xyry.org:5202/api?function=update&token=1000112345 XCHAR tszUserToken[128]; @@ -85,7 +85,7 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求更新TOKEN:%s 成功"), lpszClientAddr, tszUserToken); } - else if (0 == _tcsxnicmp(lpszAPIClose, lpszFuncName, _tcsxlen(lpszAPIClose))) + else if (0 == _tcsxncmp(lpszAPIClose, lpszFuncName, _tcsxlen(lpszAPIClose))) { //http://app.xyry.org:5202/api?function=close&token=1000112345 XCHAR tszUserToken[128]; @@ -98,6 +98,12 @@ bool MessageQueue_HttpTask_Get(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, XCH XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求关闭TOKEN:%s 成功"), lpszClientAddr, tszUserToken); } + else + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp index 7e75528..53f1fca 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HTTPTask/MQService_HTTPPost.cpp @@ -16,15 +16,40 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XNETHANDLE xhToken = 0; XCHAR tszSDBuffer[1024] = {}; LPCXSTR lpszAPIRegister = _X("register"); + LPCXSTR lpszAPIDelUser = _X("deleteuser"); LPCXSTR lpszAPIGetUser = _X("getuser"); LPCXSTR lpszAPIGetTopic = _X("gettopic"); LPCXSTR lpszAPIGetList = _X("getlist"); LPCXSTR lpszAPIGetOnline = _X("getonline"); + LPCXSTR lpszAPIGetNumber = _X("getnumber"); //请求消息队列编号信息 + + LPCXSTR lpszAPIBind = _X("bind"); + LPCXSTR lpszAPIUMBind = _X("unbind"); + LPCXSTR lpszAPIUNReadMsg = _X("unreadmsg"); + LPCXSTR lpszAPICreateTopic = _X("createtopic"); LPCXSTR lpszAPIDelTopic = _X("deletetopic"); - LPCXSTR lpszAPIDelUser = _X("deleteuser"); + LPCXSTR lpszAPIDelMsg = _X("deletemsg"); + LPCXSTR lpszAPIModifyMsg = _X("modifymsg"); + LPCXSTR lpszAPIModifyTopic = _X("modifytopic"); + + if (!ProtocolModule_Parse_Token(lpszMsgBuffer, nMsgLen, &xhToken)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("token value not set")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求POST消息失败,TOKEN没有设置或者协议错误,无法继续"), lpszClientAddr); + return false; + } + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + if (!Session_Token_Get(xhToken, &st_UserInfo)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("token not found")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求POST消息失败,TOKEN不存在"), lpszClientAddr); + return false; + } //判断请求 - if (0 == _tcsxnicmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) + if (0 == _tcsxncmp(lpszAPIRegister, lpszFuncName, _tcsxlen(lpszAPIRegister))) { XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) @@ -36,7 +61,7 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP } if (DBModule_MQUser_UserQuery(&st_UserInfo)) { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXISTED, _X("user is existed")); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXIST, _X("user is existed")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求用户注册失败,用户已经存在,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); return false; @@ -86,7 +111,56 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户注册成功,用户名:%s,密码:%s"), lpszClientAddr, st_UserInfo.tszUserName, st_UserInfo.tszUserPass); } - else if (0 == _tcsxnicmp(lpszAPIGetUser, lpszFuncName, _tcsxlen(lpszAPIGetUser))) + else if (0 == _tcsxncmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) + { + XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; + if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求注册消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + if (!DBModule_MQUser_UserDelete(&st_UserInfo)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_DELETE, _X("delete user failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求用户删除失败,删除数据库失败,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); + return false; + } + if (_tcsxlen(st_ServiceCfg.st_XPass.tszPassUNReg) > 0) + { + int nHTTPCode = 0; + XCLIENT_APIHTTP st_HTTPParament; + memset(&st_HTTPParament, '\0', sizeof(XCLIENT_APIHTTP)); + + st_HTTPParament.nTimeConnect = 2; + + ProtocolModule_Packet_PassUser(&st_UserInfo, tszSDBuffer, &nSDLen, XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQDELETE); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassUNReg, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); + if (200 != nHTTPCode) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIDEL, _X("delete user failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求远程注销失败,错误:%lX,HTTPCode:%d"), lpszClientAddr, nHTTPCode); + } + } + XENGINE_DBUSERKEY st_UserKey; + XENGINE_DBTOPICOWNER st_DBOwner; + + memset(&st_UserKey, '\0', sizeof(XENGINE_DBUSERKEY)); + memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); + + _tcsxcpy(st_UserKey.tszUserName, st_UserInfo.tszUserName); + _tcsxcpy(st_DBOwner.tszUserName, st_UserInfo.tszUserName); + + DBModule_MQUser_KeyDelete(&st_UserKey); + DBModule_MQUser_OwnerDelete(&st_DBOwner); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户删除成功,用户名:%s"), lpszClientAddr, st_UserInfo.tszUserName); + } + else if (0 == _tcsxncmp(lpszAPIGetUser, lpszFuncName, _tcsxlen(lpszAPIGetUser))) { //用户 http://127.0.0.1:5202/api?function=getuser int nListCount = 0; @@ -97,122 +171,421 @@ bool MessageQueue_HttpTask_Post(LPCXSTR lpszClientAddr, LPCXSTR lpszFuncName, LP BaseLib_Memory_Free((XPPPMEM)&ppSt_UserInfo, nListCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取用户列表请求成功,获取到的用户列表个数:%d"), lpszClientAddr, nListCount); } - else if (0 == _tcsxnicmp(lpszAPIGetOnline, lpszFuncName, _tcsxlen(lpszAPIGetOnline))) + else if (0 == _tcsxncmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) + { + //主题 http://127.0.0.1:5202/api?function=gettopic + int nDBCount = 0; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求获取主题信息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + DBModule_MQData_GetLeftCount(st_MQProtocol.tszMQKey, 0, &nDBCount); + ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, st_MQProtocol.tszMQKey, nDBCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题信息成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); + } + else if (0 == _tcsxncmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) + { + //主题 http://127.0.0.1:5202/api?function=getlist + int nListCount = 0; + XCHAR** ppszTableName; + DBModule_MQData_ShowTable(&ppszTableName, &nListCount); + ProtocolModule_Packet_TopicList(tszSDBuffer, &nSDLen, &ppszTableName, nListCount); + BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题列表个数:%d"), lpszClientAddr, nListCount); + } + else if (0 == _tcsxncmp(lpszAPIGetOnline, lpszFuncName, _tcsxlen(lpszAPIGetOnline))) { //获取在线用户 http://127.0.0.1:5202/api?function=getonline int nType = 0; int nListCount = 0; XCHAR** pptszListAddr; - ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, &nType); + if (!ProtocolModule_Parse_Type(lpszMsgBuffer, nMsgLen, &nType)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求获取在线用户失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } SessionModule_Client_GetListAddr(&pptszListAddr, &nListCount, nType); ProtocolModule_Packet_OnlineList(tszSDBuffer, &nSDLen, &pptszListAddr, nListCount); BaseLib_Memory_Free((XPPPMEM)&pptszListAddr, nListCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取在线列表信息成功,在线用户数:%d"), lpszClientAddr, nListCount); } - else if (0 == _tcsxnicmp(lpszAPIGetTopic, lpszFuncName, _tcsxlen(lpszAPIGetTopic))) + else if (0 == _tcsxncmp(lpszAPIGetNumber, lpszFuncName, _tcsxlen(lpszAPIGetNumber))) { - //主题 http://127.0.0.1:5202/api?function=gettopic - int nDBCount = 0; - XCHAR tszTopicName[XPATH_MAX] = {}; - ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, tszTopicName); - DBModule_MQData_GetLeftCount(tszTopicName, 0, &nDBCount); - ProtocolModule_Packet_TopicName(tszSDBuffer, &nSDLen, tszTopicName, nDBCount); + //获取消息队列编号 http://127.0.0.1:5202/api?function=getnumber + XENGINE_DBMESSAGEQUEUE st_DBStart = {}; + XENGINE_DBMESSAGEQUEUE st_DBEnd = {}; + XENGINE_MQNUMBER st_MQNumber = {}; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("request json parse failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求的获取消息队列编号失败,数据不正确:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + if (!DBModule_MQData_GetSerial(st_MQProtocol.tszMQKey, &st_MQNumber.nCount, &st_DBStart, &st_DBEnd)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("not found topic message")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,获取消息队列序列属性失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nKeepTime == 1 ? "顺序" : "倒序", st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + + st_MQNumber.nFirstNumber = st_DBStart.nQueueSerial; + st_MQNumber.nLastNumber = st_DBEnd.nQueueSerial; + _tcsxcpy(st_MQNumber.tszMQKey, st_MQProtocol.tszMQKey); + ProtocolModule_Packet_MQNumber(tszSDBuffer, &nSDLen, &st_MQNumber); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,获取主题序列编号成功,主题名称:%s,队列个数:%lld,开始编号:%lld,结尾编号:%lld"), lpszClientAddr, st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); } - else if (0 == _tcsxnicmp(lpszAPIGetList, lpszFuncName, _tcsxlen(lpszAPIGetList))) + else if (0 == _tcsxncmp(lpszAPIBind, lpszFuncName, _tcsxlen(lpszAPIBind))) { - //主题 http://127.0.0.1:5202/api?function=getlist + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求绑定主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + XENGINE_DBUSERKEY st_Userkey = {}; + + _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); + //先查询有没有 + if (DBModule_MQUser_KeyQuery(&st_Userkey)) + { + //有就更新 + st_Userkey.nKeySerial = st_MQProtocol.nSerial; + if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("update bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + } + else + { + //没有就创建 + st_Userkey.nKeySerial = st_MQProtocol.nSerial; + if (!DBModule_MQUser_KeyInsert(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("insert bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } + } + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求设置序列号成功,主题名称:%s,序列号:%lld"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); + } + else if (0 == _tcsxncmp(lpszAPIUMBind, lpszFuncName, _tcsxlen(lpszAPIUMBind))) + { + XENGINE_DBUSERKEY st_Userkey = {}; + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求解绑主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + _tcsxcpy(st_Userkey.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); + + if (!DBModule_MQUser_KeyDelete(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("unbind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.tszMQUsr, DBModule_GetLastError()); + return false; + } + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); + } + else if (0 == _tcsxncmp(lpszAPIUNReadMsg, lpszFuncName, _tcsxlen(lpszAPIUNReadMsg))) + { + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求未读消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } int nListCount = 0; - XCHAR** ppszTableName; - DBModule_MQData_ShowTable(&ppszTableName, &nListCount); - ProtocolModule_Packet_TopicList(tszSDBuffer, &nSDLen, &ppszTableName, nListCount); - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + XENGINE_DBUSERKEY** ppSt_UserKey; + DBModule_MQUser_KeyList(st_MQProtocol.tszMQUsr, _X(""), &ppSt_UserKey, &nListCount); + ProtocolModule_Packet_UNReadMsg(tszSDBuffer, &nSDLen, &ppSt_UserKey, nListCount); + BaseLib_Memory_Free((XPPPMEM)&ppSt_UserKey, nListCount); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,发送的获取主题列表请求成功,获取到的主题列表个数:%d"), lpszClientAddr, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,请求未读消息成功,用户名:%s,发送未读消息成功,发送的主题个数:%d"), lpszClientAddr, st_MQProtocol.tszMQUsr, nListCount); } - else if (0 == _tcsxnicmp(lpszAPICreateTopic, lpszFuncName, _tcsxlen(lpszAPICreateTopic))) + else if (0 == _tcsxncmp(lpszAPICreateTopic, lpszFuncName, _tcsxlen(lpszAPICreateTopic))) { //http://127.0.0.1:5202/api?function=createtopic - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求创建主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } +#endif + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("request json parse failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求的创建主题失败,数据不正确:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + int nListCount = 0; + XCHAR** ppszTableName; + //检查表是否存在 + DBModule_MQData_ShowTable(&ppszTableName, &nListCount); + for (int i = 0; i < nListCount; i++) + { + if (0 == _tcsxnicmp(ppszTableName[i], st_MQProtocol.tszMQKey, _tcsxlen(ppszTableName[i]))) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_EXIST, _X("topic name is exist")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,创建主题失败,主题名称:%s,主题存在,无法继续"), lpszClientAddr, st_MQProtocol.tszMQKey); + return false; + } + } + BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); + //创建表 + if (!DBModule_MQData_CreateTable(st_MQProtocol.tszMQKey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("create topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,创建主题失败,创建表失败,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); + return false; + } + //插入所有者 + XENGINE_DBTOPICOWNER st_DBOwner; + memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, st_MQProtocol.tszMQKey); - APIHelp_MQHelp_JsonToHex(&st_ProtocolHdr); + _tcsxcpy(st_DBOwner.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - st_ProtocolHdr.xhToken = xhToken; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE; - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); + if (!DBModule_MQUser_OwnerInsert(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("create topic bind with user is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,创建主题失败,插入所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); + return false; + } + //回复 + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,主题:%s,创建主题成功"), lpszClientAddr, st_MQProtocol.tszMQKey); } - else if (0 == _tcsxnicmp(lpszAPIDelTopic, lpszFuncName, _tcsxlen(lpszAPIDelTopic))) + else if (0 == _tcsxncmp(lpszAPIDelTopic, lpszFuncName, _tcsxlen(lpszAPIDelTopic))) { //http://127.0.0.1:5202/api?function=deletetopic - + XENGINE_DBTOPICOWNER st_DBOwner = {}; + XENGINE_DBUSERKEY st_UserKey = {}; + XENGINE_DBTIMERELEASE st_DBInfo = {}; XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - - ProtocolModule_Parse_Name(lpszMsgBuffer, nMsgLen, st_MQProtocol.tszMQKey); - APIHelp_MQHelp_JsonToHex(&st_ProtocolHdr); - - st_ProtocolHdr.xhToken = xhToken; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE; - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_HTTP); +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求删除主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } +#endif + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求删除主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + + _tcsxcpy(st_DBOwner.tszUserName, st_MQProtocol.tszMQUsr); + _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); + _tcsxcpy(st_UserKey.tszKeyName, st_MQProtocol.tszMQKey); + _tcsxcpy(st_DBInfo.tszQueueName, st_MQProtocol.tszMQKey); + + if (_tcsxlen(st_DBOwner.tszUserName) <= 0) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_MISS, _X("user name missing")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,用户名为空"), lpszClientAddr, st_MQProtocol.tszMQKey, st_DBOwner.tszUserName); + return false; + } + if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("delete owner db failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); + return false; + } + //清楚数据库 + APIHelp_Counter_SerialDel(st_MQProtocol.tszMQKey); + DBModule_MQData_DeleteTable(st_MQProtocol.tszMQKey); + DBModule_MQUser_KeyDelete(&st_UserKey); + DBModule_MQUser_TimeDelete(&st_DBInfo); + + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求主题删除成功,主题名:%s"), lpszClientAddr, st_MQProtocol.tszMQKey); } - else if (0 == _tcsxnicmp(lpszAPIDelUser, lpszFuncName, _tcsxlen(lpszAPIDelUser))) + else if (0 == _tcsxncmp(lpszAPIDelMsg, lpszFuncName, _tcsxlen(lpszAPIDelMsg))) { - XENGINE_PROTOCOL_USERINFO st_UserInfo = {}; - if (!ProtocolModule_Parse_Register(lpszMsgBuffer, nMsgLen, &st_UserInfo)) + //http://127.0.0.1:5202/api?function=deletemsg + XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; + XENGINE_DBMESSAGEQUEUE st_MessageQueue = {}; + +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求删除消息失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } +#endif + + if (!ProtocolModule_Parse_XMQ(lpszMsgBuffer, nMsgLen, &st_MQProtocol)) { ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求注册消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求删除消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); return false; } - if (!DBModule_MQUser_UserDelete(&st_UserInfo)) + + if (st_MQProtocol.nSerial <= 0) { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_DELETE, _X("delete user failure")); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_MISS, _X("message serial not set")); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求用户删除失败,删除数据库失败,错误:%lX"), lpszClientAddr, SessionModule_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,主题:%s,删除消息数据失败,删除指定消息序列:%lld 失败"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); return false; } - if (_tcsxlen(st_ServiceCfg.st_XPass.tszPassUNReg) > 0) + st_MessageQueue.nQueueSerial = st_MQProtocol.nSerial; + _tcsxcpy(st_MessageQueue.tszQueueName, st_MQProtocol.tszMQKey); + if (!DBModule_MQData_Delete(&st_MessageQueue)) { - int nHTTPCode = 0; - XCLIENT_APIHTTP st_HTTPParament; - memset(&st_HTTPParament, '\0', sizeof(XCLIENT_APIHTTP)); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_SERVICE, _X("message delete failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,主题:%s,删除消息数据失败,删除指定消息序列:%lld 失败,错误码:%lX"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); + return false; + } - st_HTTPParament.nTimeConnect = 2; + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,删除消息数据成功主题:%s,序列:%lld,"), lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial); + } + else if (0 == _tcsxncmp(lpszAPIModifyMsg, lpszFuncName, _tcsxlen(lpszAPIModifyMsg))) + { + XENGINE_DBMESSAGEQUEUE st_DBQueue = {}; - ProtocolModule_Packet_PassUser(&st_UserInfo, tszSDBuffer, &nSDLen, XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_AUTH_REQDELETE); - APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XPass.tszPassUNReg, tszSDBuffer, &nHTTPCode, NULL, NULL, NULL, NULL, &st_HTTPParament); - if (200 != nHTTPCode) - { - ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_APIDEL, _X("delete user failure")); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求远程注销失败,错误:%lX,HTTPCode:%d"), lpszClientAddr, nHTTPCode); - } +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求修改消息失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; } - XENGINE_DBUSERKEY st_UserKey; - XENGINE_DBTOPICOWNER st_DBOwner; +#endif - memset(&st_UserKey, '\0', sizeof(XENGINE_DBUSERKEY)); - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); + if (!ProtocolModule_Parse_MessageQueue(lpszMsgBuffer, nMsgLen, &st_DBQueue)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求修改消息失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + if (!DBModule_MQData_Modify(&st_DBQueue)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("modify message failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,修改消息:%s,序列号:%lld,失败,错误:%lX"), lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial, DBModule_GetLastError()); + return false; + } - _tcsxcpy(st_UserKey.tszUserName, st_UserInfo.tszUserName); - _tcsxcpy(st_DBOwner.tszUserName, st_UserInfo.tszUserName); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求修改消息成功,消息名:%s,序列号:%d"), lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial); + } + else if (0 == _tcsxncmp(lpszAPIModifyTopic, lpszFuncName, _tcsxlen(lpszAPIModifyTopic))) + { + XCHAR tszSrcTopic[XPATH_MIN] = {}; + XCHAR tszDstTopic[XPATH_MIN] = {}; + XCHAR tszUserName[XPATH_MIN] = {}; + +#if (1 == __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__) + if ((st_UserInfo.nUserLevel < ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_ROOT) || (st_UserInfo.nUserLevel >= ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_SVIP)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PERMISSION, _X("permission Error,user accesss Denied")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,请求修改主题失败,权限错误,权限级别:%d"), lpszClientAddr, st_UserInfo.nUserLevel); + return false; + } +#endif + + if (!ProtocolModule_Parse_ModifyTopic(lpszMsgBuffer, nMsgLen, tszSrcTopic, tszDstTopic, tszUserName)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_PARSE, _X("json load parse is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求修改主题失败,负载内容错误:%s"), lpszClientAddr, lpszMsgBuffer); + return false; + } + XENGINE_DBTOPICOWNER st_DBOwner = {}; + //验证所有者 + _tcsxcpy(st_DBOwner.tszUserName, tszUserName); + _tcsxcpy(st_DBOwner.tszQueueName, tszSrcTopic); + + if (!DBModule_MQUser_OwnerQuery(&st_DBOwner)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("query topic owner failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,修改主题失败,可能用户不拥有主题,主题名称:%s,无法继续,错误:%lX"), lpszClientAddr, tszSrcTopic, DBModule_GetLastError()); + return false; + } + //修改主题 + if (!DBModule_MQData_ModifyTable(tszSrcTopic, tszDstTopic)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("modify topic failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP消息端:%s,修改主题名称失败,原名称:%s,目标名:%s,错误:%lX"), lpszClientAddr, tszSrcTopic, tszDstTopic, DBModule_GetLastError()); + return false; + } + DBModule_MQUser_KeyTopicUPDate(tszSrcTopic, tszDstTopic); + DBModule_MQUser_TimeTopicUPDate(tszSrcTopic, tszDstTopic); + DBModule_MQUser_OwnerTopicUPDate(tszSrcTopic, tszDstTopic); - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_OwnerDelete(&st_DBOwner); ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求用户删除成功,用户名:%s"), lpszClientAddr, st_UserInfo.tszUserName); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP消息端:%s,修改主题名称成功,原名称:%s,目标名:%s"), lpszClientAddr, tszSrcTopic, tszDstTopic); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h index ee9ab7c..7504b20 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Hdr.h @@ -29,6 +29,8 @@ using namespace std; #include #include #include +#include +#include #include #include #include @@ -54,6 +56,7 @@ using namespace std; #include "../XEngine_DependLibrary/XEngine_Module/XEngine_MSGNotify/MSGNotify_Define.h" #include "../XEngine_DependLibrary/XEngine_Module/XEngine_MSGNotify/MSGNotify_Error.h" #include "../XQueue_ProtocolHdr.h" +#include "../XQueue_BuildSwtich.h" #include "../MQCore_ConfigModule/Config_Define.h" #include "../MQCore_ConfigModule/Config_Error.h" #include "../MQCore_SessionModule/Session_Define.h" @@ -103,6 +106,7 @@ extern MESSAGEQUEUE_DBCONFIG st_DBConfig; #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") #pragma comment(lib,"XEngine_Core/XEngine_Core.lib") #pragma comment(lib,"XEngine_Core/XEngine_ManagePool.lib") +#pragma comment(lib,"XEngine_Core/XEngine_Cryption.lib") #pragma comment(lib,"XEngine_Client/XClient_APIHelp.lib") #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIAddr.lib") #pragma comment(lib,"XEngine_HelpComponents/HelpComponents_XLog.lib") diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp index 2c444f7..980f526 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_HttpTask.cpp @@ -148,19 +148,21 @@ bool MessageQueue_Http_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST return false; } //判断请求 - if (0 == _tcsxnicmp(lpszPostMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszPostMethod))) + if (0 == _tcsxncmp(lpszPostMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszPostMethod))) { BaseLib_String_GetKeyValue(ppSt_ListUrl[0], _X("="), tszKey, tszValue); MessageQueue_HttpTask_Post(lpszClientAddr, tszValue, lpszMsgBuffer, nMsgLen); } - else if (0 == _tcsxnicmp(lpszGetMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszGetMethod))) + else if (0 == _tcsxncmp(lpszGetMethod, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszGetMethod))) { BaseLib_String_GetKeyValue(ppSt_ListUrl[0], _X("="), tszKey, tszValue); MessageQueue_HttpTask_Get(lpszClientAddr, tszValue, &ppSt_ListUrl, nUrlCount); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); + ProtocolModule_Packet_Http(tszPKTBuffer, &nPKTLen, ERROR_XENGINE_MESSAGE_HTTP_NOTFOUND, _X("protocol not support")); + XEngine_MQXService_Send(lpszClientAddr, tszPKTBuffer, nPKTLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,协议错误"), lpszClientAddr); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp index 332eb72..4a46f34 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_MQTTTask.cpp @@ -24,6 +24,10 @@ XHTHREAD XCALLBACK MessageQueue_MQTTThread(XPVOID lParam) if (MQTTProtocol_Parse_Recv(ppSst_ListAddr[i]->tszClientAddr, &st_MQTTHdr, &ptszMSGBuffer, &nMSGLen)) { + if (st_ServiceCfg.st_XCryption.bEnable) + { + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMSGBuffer, &nMSGLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } MQService_MQTT_Handle(ppSst_ListAddr[i]->tszClientAddr, &st_MQTTHdr, ptszMSGBuffer, nMSGLen); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMSGBuffer); } @@ -104,8 +108,19 @@ bool MQService_MQTT_Handle(LPCXSTR lpszClientAddr, MQTTPROTOCOL_FIXEDHEADER* pSt MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_ProtocolAuth, sizeof(XENGINE_PROTOCOL_USERAUTH), XENGINE_MQAPP_NETTYPE_MQTT); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求链接成功,客户端ID:%s,用户名:%s"), lpszClientAddr, st_USerInfo.tszClientID, st_USerInfo.tszClientUser); + return true; } - else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_SUBSCRIBE == pSt_MQTTHdr->byMsgType) + + XCHAR tszUserName[XPATH_MIN] = {}; + if (!SessionModule_Client_GetUser(lpszClientAddr, tszUserName)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求指定消息:%d 失败,用户未登录,错误码:%lX"), lpszClientAddr, pSt_MQTTHdr->byMsgType, MQTTProtocol_GetLastError()); + return false; + } + if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_SUBSCRIBE == pSt_MQTTHdr->byMsgType) { XSHOT wMsgID = 0; XCHAR tszTopicName[XPATH_MAX] = {}; @@ -121,17 +136,36 @@ bool MQService_MQTT_Handle(LPCXSTR lpszClientAddr, MQTTPROTOCOL_FIXEDHEADER* pSt XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求订阅失败,错误码:%lX"), lpszClientAddr, MQTTProtocol_GetLastError()); return false; } - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - st_ProtocolHdr.wPacketSerial = wMsgID; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; - - _tcsxcpy(st_MQProtocol.tszMQKey, tszTopicName); - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_MQTT); + XENGINE_DBUSERKEY st_Userkey = {}; + + _tcsxcpy(st_Userkey.tszUserName, tszUserName); + _tcsxcpy(st_Userkey.tszKeyName, tszTopicName); + //先查询有没有 + if (DBModule_MQUser_KeyQuery(&st_Userkey)) + { + //有就更新 + st_Userkey.nKeySerial = wMsgID; + if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("MQTT消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%d,错误:%lX"), lpszClientAddr, tszTopicName, wMsgID, DBModule_GetLastError()); + return false; + } + } + else + { + //没有就创建 + st_Userkey.nKeySerial = wMsgID; + if (!DBModule_MQUser_KeyInsert(&st_Userkey)) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_FAILURE, _X("insert bind topic is failure")); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("MQTT消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%d,错误:%lX"), lpszClientAddr, tszTopicName, wMsgID, DBModule_GetLastError()); + return false; + } + } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求订阅成功,主题名称:%s"), lpszClientAddr, tszTopicName); } else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_UNSUBSCRIBE == pSt_MQTTHdr->byMsgType) @@ -149,17 +183,19 @@ bool MQService_MQTT_Handle(LPCXSTR lpszClientAddr, MQTTPROTOCOL_FIXEDHEADER* pSt XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求取消订阅失败,错误码:%lX"), lpszClientAddr, MQTTProtocol_GetLastError()); return false; } - XENGINE_PROTOCOLHDR st_ProtocolHdr = {}; - XENGINE_PROTOCOL_XMQ st_MQProtocol = {}; - st_ProtocolHdr.wHeader = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_HEADER; - st_ProtocolHdr.unOperatorType = ENUM_XENGINE_COMMUNICATION_PROTOCOL_TYPE_XMQ; - st_ProtocolHdr.unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICUNBIND; - st_ProtocolHdr.unPacketSize = sizeof(XENGINE_PROTOCOL_XMQ); - st_ProtocolHdr.wPacketSerial = wMsgID; - st_ProtocolHdr.wTail = XENGIEN_COMMUNICATION_PACKET_PROTOCOL_TAIL; + XENGINE_DBUSERKEY st_Userkey = {}; - _tcsxcpy(st_MQProtocol.tszMQKey, tszTopicName); - MessageQueue_TCP_Handle(&st_ProtocolHdr, lpszClientAddr, (LPCXSTR)&st_MQProtocol, sizeof(XENGINE_PROTOCOL_XMQ), XENGINE_MQAPP_NETTYPE_MQTT); + _tcsxcpy(st_Userkey.tszUserName, tszUserName); + _tcsxcpy(st_Userkey.tszKeyName, tszTopicName); + + if (!DBModule_MQUser_KeyDelete(&st_Userkey)) + { + MQTTProtocol_Packet_DisConnect(tszRVBuffer, &nRVLen); + MQTTProtocol_Packet_Header(tszSDBuffer, &nSDLen, XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_DISCONN, tszRVBuffer, nRVLen); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_MQTT); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("MQTT消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"), lpszClientAddr, tszTopicName, tszUserName, DBModule_GetLastError()); + return false; + } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("MQTT客户端:%s,请求取消订阅,主题名称:%s"), lpszClientAddr, tszTopicName); } else if (XENGINE_RFCCOMPONENTS_MQTT_PROTOCOL_TYPE_PUBLISH == pSt_MQTTHdr->byMsgType) diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp index d792521..ce409db 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_Net.cpp @@ -161,6 +161,13 @@ void XEngine_MQXService_Close(LPCXSTR lpszClientAddr, int nIPProto, bool bHeart) } } DBModule_MQUser_UserUPDate(&st_UserInfo); + //释放token + XNETHANDLE xhToken = 0; + SessionModule_Client_GetInfoByUser(st_UserInfo.tszUserName, &st_UserInfo); + if (Session_Token_GetUser(st_UserInfo.tszUserName, st_UserInfo.tszUserPass, &xhToken)) + { + Session_Token_Delete(xhToken); + } } SessionModule_Client_Delete(lpszClientAddr); } diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp index 01a29e2..afbb92b 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_TCPTask.cpp @@ -25,6 +25,10 @@ XHTHREAD XCALLBACK MessageQueue_TCPThread(XPVOID lParam) XCHAR* ptszMsgBuffer = NULL; if (HelpComponents_Datas_GetMemoryEx(xhTCPPacket, ppSst_ListAddr[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_ProtocolHdr)) { + if (st_ServiceCfg.st_XCryption.bEnable) + { + Cryption_Api_CryptDecodec(NULL, (XBYTE *)ptszMsgBuffer, &nMsgLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } MessageQueue_TCP_Handle(&st_ProtocolHdr, ppSst_ListAddr[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, XENGINE_MQAPP_NETTYPE_TCP); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } @@ -49,10 +53,6 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC { lpszClientType = _X("WEBSOCKET"); } - else if (XENGINE_MQAPP_NETTYPE_HTTP == nNetType) - { - lpszClientType = _X("HTTP"); - } else { lpszClientType = _X("MQTT"); @@ -145,6 +145,18 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC st_UserInfo.nUserState = 1; DBModule_MQUser_UserUPDate(&st_UserInfo); } + //权限是否正确 + if (ENUM_XENGINE_PROTOCOLHDR_LEVEL_TYPE_BAN == st_UserInfo.nUserLevel) + { + ProtocolModule_Packet_Http(tszSDBuffer, &nSDLen, ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE, "permission error"); + XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, XENGINE_MQAPP_NETTYPE_HTTP); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,用户名:%s,登录失败,客户端权限不足够"), lpszClientAddr, st_UserInfo.tszUserName); + return false; + } + //创建TOKEN + BaseLib_Handle_Create(&pSt_ProtocolHdr->xhToken); + Session_Token_Insert(pSt_ProtocolHdr->xhToken, &st_UserInfo); + pSt_ProtocolHdr->wReserve = 0; SessionModule_Client_Create(lpszClientAddr, &st_UserInfo, nNetType); ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, NULL, tszSDBuffer, &nSDLen); @@ -211,6 +223,12 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC if (!SessionModule_Client_GetUser(lpszClientAddr, tszUserName)) { pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_AUTH_NOTLOGIN; + + if (st_ServiceCfg.st_XCryption.bEnable) + { + nSDLen = sizeof(XENGINE_PROTOCOL_XMQ); + Cryption_Api_CryptEncodec(NULL, (XBYTE*)&st_MQProtocol, &nSDLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s客户端:%s,请求失败,用户没有通过验证"), lpszClientType, lpszClientAddr); @@ -269,6 +287,12 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC if (pSt_ProtocolHdr->byIsReply) { pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_EXISTED; + + if (st_ServiceCfg.st_XCryption.bEnable) + { + nSDLen = sizeof(XENGINE_PROTOCOL_XMQ); + Cryption_Api_CryptEncodec(NULL, (XBYTE*)&st_MQProtocol, &nSDLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); } @@ -560,353 +584,6 @@ bool MessageQueue_TCP_Handle(XENGINE_PROTOCOLHDR* pSt_ProtocolHdr, LPCXSTR lpszC XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,序列:%lld,获取消息数据成功,消息大小:%d"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial, st_MessageQueue.nMsgLen); } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQDELETE == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_DBMESSAGEQUEUE st_MessageQueue; - memset(&st_MessageQueue, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPDELETE; - if (st_MQProtocol.nSerial <= 0) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_SERIAL; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,主题:%s,删除消息数据失败,删除指定消息序列:%lld 失败,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - st_MessageQueue.nQueueSerial = st_MQProtocol.nSerial; - _tcsxcpy(st_MessageQueue.tszQueueName, st_MQProtocol.tszMQKey); - DBModule_MQData_Delete(&st_MessageQueue); - - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->byVersion = st_MessageQueue.byMsgType; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,序列:%lld,删除消息数据成功"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MessageQueue.nQueueSerial); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICCREATE; - - int nListCount = 0; - XCHAR** ppszTableName; - //检查表是否存在 - DBModule_MQData_ShowTable(&ppszTableName, &nListCount); - for (int i = 0; i < nListCount; i++) - { - if (0 == _tcsxnicmp(ppszTableName[i], st_MQProtocol.tszMQKey, _tcsxlen(ppszTableName[i]))) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_EXISTED; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,创建主题失败,主题名称:%s,主题存在,无法继续"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - return false; - } - } - BaseLib_Memory_Free((XPPPMEM)&ppszTableName, nListCount); - //创建表 - if (!DBModule_MQData_CreateTable(st_MQProtocol.tszMQKey)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_CREATEKEY; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,创建主题失败,创建表失败,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //插入所有者 - XENGINE_DBTOPICOWNER st_DBOwner; - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - - _tcsxcpy(st_DBOwner.tszUserName, tszUserName); - _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - - if (!DBModule_MQUser_OwnerInsert(&st_DBOwner)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_BINDOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,创建主题失败,插入所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //回复 - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = 0; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,创建主题成功"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICDELETE; - //清理所有者 - XENGINE_DBTOPICOWNER st_DBOwner; - XENGINE_DBUSERKEY st_UserKey; - XENGINE_DBTIMERELEASE st_DBInfo; - - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - memset(&st_UserKey, '\0', sizeof(XENGINE_DBUSERKEY)); - memset(&st_DBInfo, '\0', sizeof(XENGINE_DBTIMERELEASE)); - - _tcsxcpy(st_DBOwner.tszUserName, tszUserName); - _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - _tcsxcpy(st_UserKey.tszKeyName, st_MQProtocol.tszMQKey); - _tcsxcpy(st_DBInfo.tszQueueName, st_MQProtocol.tszMQKey); - - if (_tcsxlen(st_DBOwner.tszUserName) <= 0) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_DELOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,用户名为空"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, tszUserName); - return false; - } - if (!DBModule_MQUser_OwnerDelete(&st_DBOwner)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_DELOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,删除主题失败,删除所有者失败,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //清楚数据库 - APIHelp_Counter_SerialDel(st_MQProtocol.tszMQKey); - DBModule_MQData_DeleteTable(st_MQProtocol.tszMQKey); - DBModule_MQUser_KeyDelete(&st_UserKey); - DBModule_MQUser_TimeDelete(&st_DBInfo); - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = 0; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,主题:%s,删除主题成功"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICBIND; - - XENGINE_DBUSERKEY st_Userkey; - memset(&st_Userkey, '\0', sizeof(XENGINE_DBUSERKEY)); - - _tcsxcpy(st_Userkey.tszUserName, tszUserName); - _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); - //先查询有没有 - if (DBModule_MQUser_KeyQuery(&st_Userkey)) - { - //有就更新 - st_Userkey.nKeySerial = st_MQProtocol.nSerial; - if (!DBModule_MQUser_KeyUPDate(&st_Userkey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_KEYUP; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,设置消息队列主题更新失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - } - else - { - //没有就创建 - st_Userkey.nKeySerial = st_MQProtocol.nSerial; - if (!DBModule_MQUser_KeyInsert(&st_Userkey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_BINDKEY; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,设置消息队列主题创建失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - } - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,请求设置序列号成功,主题名称:%s,序列号:%lld"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nSerial); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICUNBIND == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICUNBIND; - - XENGINE_DBUSERKEY st_Userkey; - memset(&st_Userkey, '\0', sizeof(XENGINE_DBUSERKEY)); - - _tcsxcpy(st_Userkey.tszUserName, tszUserName); - _tcsxcpy(st_Userkey.tszKeyName, st_MQProtocol.tszMQKey); - - if (!DBModule_MQUser_KeyDelete(&st_Userkey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_DELKEY; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,解除消息绑定订阅失败,可能没有找到主题用户,主题名称:%s,用户名称:%s,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, tszUserName, DBModule_GetLastError()); - return false; - } - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,解除消息绑定成功,主题名称:%s"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_DBMESSAGEQUEUE st_DBStart; - XENGINE_DBMESSAGEQUEUE st_DBEnd; - XENGINE_MQNUMBER st_MQNumber; - - memset(&st_DBStart, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - memset(&st_DBEnd, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - memset(&st_MQNumber, '\0', sizeof(XENGINE_MQNUMBER)); - if (!DBModule_MQData_GetSerial(st_MQProtocol.tszMQKey, &st_MQNumber.nCount, &st_DBStart, &st_DBEnd)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_SERIAL; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,获取消息队列序列属性失败,主题名称:%s,序列号:%lld,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQProtocol.nKeepTime == 1 ? "顺序" : "倒序", st_MQProtocol.nSerial, DBModule_GetLastError()); - return false; - } - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPNUMBER; - - st_MQNumber.nFirstNumber = st_DBStart.nQueueSerial; - st_MQNumber.nLastNumber = st_DBEnd.nQueueSerial; - _tcsxcpy(st_MQNumber.tszMQKey, st_MQProtocol.tszMQKey); - ProtocolModule_Packet_MQNumber(pSt_ProtocolHdr, &st_MQNumber, tszSDBuffer, &nSDLen, nNetType); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,获取主题序列编号成功,主题名称:%s,队列个数:%lld,开始编号:%lld,结尾编号:%lld"), lpszClientType, lpszClientAddr, st_MQNumber.tszMQKey, st_MQNumber.nCount, st_MQNumber.nFirstNumber, st_MQNumber.nLastNumber); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICMODIFY == pSt_ProtocolHdr->unOperatorCode) - { - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICMODIFY; - XENGINE_MQTOPIC st_MQTopic; - memset(&st_MQTopic, '\0', sizeof(XENGINE_MQTOPIC)); - - memcpy(&st_MQTopic, lpszMsgBuffer + sizeof(XENGINE_PROTOCOL_XMQ), sizeof(XENGINE_MQTOPIC)); - //验证所有者 - XENGINE_DBTOPICOWNER st_DBOwner; - memset(&st_DBOwner, '\0', sizeof(XENGINE_DBTOPICOWNER)); - - _tcsxcpy(st_DBOwner.tszUserName, tszUserName); - _tcsxcpy(st_DBOwner.tszQueueName, st_MQProtocol.tszMQKey); - - if (!DBModule_MQUser_OwnerQuery(&st_DBOwner)) - { - if (pSt_ProtocolHdr->byIsReply) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_QUERYOWNER; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,修改主题失败,可能用户不拥有主题,主题名称:%s,无法继续,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, DBModule_GetLastError()); - return false; - } - //修改主题 - if (!DBModule_MQData_ModifyTable(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_MODIFYTOPIC; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,修改主题名称失败,原名称:%s,目标名:%s,错误:%lX"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey, DBModule_GetLastError()); - return false; - } - pSt_ProtocolHdr->wReserve = 0; - DBModule_MQUser_KeyTopicUPDate(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - DBModule_MQUser_TimeTopicUPDate(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - DBModule_MQUser_OwnerTopicUPDate(st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,修改主题名称成功,原名称:%s,目标名:%s"), lpszClientType, lpszClientAddr, st_MQProtocol.tszMQKey, st_MQTopic.tszMQKey); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQMODIFY == pSt_ProtocolHdr->unOperatorCode) - { - XENGINE_DBMESSAGEQUEUE st_DBQueue; - memset(&st_DBQueue, '\0', sizeof(XENGINE_DBMESSAGEQUEUE)); - - st_DBQueue.byMsgType = pSt_ProtocolHdr->byVersion; - st_DBQueue.nQueueSerial = st_MQProtocol.nSerial; - st_DBQueue.nMsgLen = nMsgLen - sizeof(XENGINE_PROTOCOL_XMQ); - - _tcsxcpy(st_DBQueue.tszUserName, tszUserName); - _tcsxcpy(st_DBQueue.tszQueueName, st_MQProtocol.tszMQKey); - memcpy(st_DBQueue.tszMsgBuffer, lpszMsgBuffer + sizeof(XENGINE_PROTOCOL_XMQ), st_DBQueue.nMsgLen); - - if (st_MQProtocol.nKeepTime > 0) - { - XENGINE_LIBTIME st_LibTime; - memset(&st_LibTime, '\0', sizeof(XENGINE_LIBTIME)); - - time_t nTimeStart = time(NULL); - time_t nTimeEnd = nTimeStart + st_MQProtocol.nKeepTime; - BaseLib_TimeSpan_CalForTime(nTimeStart, nTimeEnd, &st_LibTime); - _xstprintf(st_DBQueue.tszQueueLeftTime, _X("%04d-%02d-%02d %02d:%02d:%02d"), st_LibTime.wYear, st_LibTime.wMonth, st_LibTime.wDay, st_LibTime.wHour, st_LibTime.wMinute, st_LibTime.wSecond); - } - if (st_MQProtocol.nPubTime > 0) - { - XENGINE_DBTIMERELEASE st_DBTime; - XENGINE_LIBTIME st_LibTime; - - memset(&st_DBTime, '\0', sizeof(XENGINE_DBTIMERELEASE)); - memset(&st_LibTime, '\0', sizeof(XENGINE_LIBTIME)); - - st_DBTime.nIDMsg = st_DBQueue.nQueueSerial; - st_DBTime.nIDTime = st_MQProtocol.nPubTime; - _tcsxcpy(st_DBTime.tszQueueName, st_DBQueue.tszQueueName); - - BaseLib_Time_TTimeToStuTime(st_MQProtocol.nPubTime, &st_LibTime); - BaseLib_Time_TimeToStr(st_DBQueue.tszQueuePublishTime, NULL, true, &st_LibTime); - DBModule_MQUser_TimeInsert(&st_DBTime); - } - if (!DBModule_MQData_Modify(&st_DBQueue)) - { - pSt_ProtocolHdr->wReserve = ERROR_XENGINE_MESSAGE_XMQ_MODIFYMSG; - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("%s消息端:%s,修改消息:%s,序列号:%lld,失败,错误:%lX"), lpszClientType, lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial, DBModule_GetLastError()); - return false; - } - pSt_ProtocolHdr->wReserve = 0; - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPMODIFY; - - ProtocolModule_Packet_Common(nNetType, pSt_ProtocolHdr, &st_MQProtocol, tszSDBuffer, &nSDLen); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,修改消息:%s,序列号:%lld,成功"), lpszClientType, lpszClientAddr, st_DBQueue.tszQueueName, st_DBQueue.nQueueSerial); - } - else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD == pSt_ProtocolHdr->unOperatorCode) - { - int nListCount = 0; - XENGINE_DBUSERKEY** ppSt_UserKey; - DBModule_MQUser_KeyList(tszUserName, _X(""), &ppSt_UserKey, &nListCount); - - pSt_ProtocolHdr->unOperatorCode = XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD; - XHANDLE xhUNRead = ProtocolModule_Packet_UNReadCreate(pSt_ProtocolHdr, XENGINE_MQAPP_NETTYPE_TCP == nNetType ? ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_BIN : ENUM_XENGINE_PROTOCOLHDR_PAYLOAD_TYPE_JSON); - //查找具体主题列表 - for (int i = 0; i < nListCount; i++) - { - int nDBCount = 0; - DBModule_MQData_GetLeftCount(ppSt_UserKey[i]->tszKeyName, ppSt_UserKey[i]->nKeySerial, &nDBCount); - ProtocolModule_Packet_UNReadInsert(xhUNRead, ppSt_UserKey[i]->tszKeyName, nDBCount); - } - ProtocolModule_Packet_UNReadDelete(xhUNRead, tszSDBuffer, &nSDLen); - BaseLib_Memory_Free((XPPPMEM)&ppSt_UserKey, nListCount); - XEngine_MQXService_Send(lpszClientAddr, tszSDBuffer, nSDLen, nNetType); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s消息端:%s,请求未读消息成功,用户名:%s,发送未读消息成功,发送的主题个数:%d"), lpszClientType, lpszClientAddr, tszUserName, nListCount); - } else { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("%s消息端:%s,子协议错误,子协议:%x"), lpszClientType, lpszClientAddr, pSt_ProtocolHdr->unOperatorCode); diff --git a/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp b/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp index a8ceb30..d7ba68c 100644 --- a/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/MQService_WSTask.cpp @@ -23,6 +23,10 @@ XHTHREAD XCALLBACK MessageQueue_WebsocketThread(XPVOID lParam) ENUM_XENGINE_RFCOMPONENTS_WEBSOCKET_OPCODE enOPCode; if (RfcComponents_WSPacket_GetMemoryEx(xhWSPacket, ppSst_ListAddr[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &enOPCode)) { + if (st_ServiceCfg.st_XCryption.bEnable) + { + Cryption_Api_CryptDecodec(NULL, (XBYTE*)ptszMsgBuffer, &nMsgLen, st_ServiceCfg.st_XCryption.tszPassword, (ENUM_XENGINE_CRYPTION_SYMMETRIC)st_ServiceCfg.st_XCryption.nCryptionType); + } MessageQueue_Websocket_Handle(ppSst_ListAddr[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, enOPCode); BaseLib_Memory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } diff --git a/XEngine_Source/XEngine_MQServiceApp/Makefile b/XEngine_Source/XEngine_MQServiceApp/Makefile index 92735b2..0059332 100644 --- a/XEngine_Source/XEngine_MQServiceApp/Makefile +++ b/XEngine_Source/XEngine_MQServiceApp/Makefile @@ -3,7 +3,7 @@ PLATVER = LOADHDR = -I ./ LOADSO = -L ../MQCore_ConfigModule -L ../MQCore_ProtocolModule -L ../MQCore_SessionModule -L ../MQCore_MemoryCache -L ../MQCore_DBModule -L ../MQCore_HelpModule \ -L ../XEngine_DependLibrary/XEngine_Module/jsoncpp -L ../XEngine_DependLibrary/XEngine_Module/XEngine_InfoReport -L ../XEngine_DependLibrary/XEngine_Module/XEngine_Token -L ../XEngine_DependLibrary/XEngine_Module/XEngine_Verification -L ../XEngine_DependLibrary/XEngine_Module/XEngine_MSGNotify -LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXClient_APIHelp -lNetHelp_APIAddr -lXEngine_SystemApi -lHelpComponents_XLog -lHelpComponents_Packets -lRfcComponents_WSProtocol -lRfcComponents_HttpProtocol -lRfcComponents_MQTTProtocol \ +LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_Cryption -lXClient_APIHelp -lNetHelp_APIAddr -lXEngine_SystemApi -lHelpComponents_XLog -lHelpComponents_Packets -lRfcComponents_WSProtocol -lRfcComponents_HttpProtocol -lRfcComponents_MQTTProtocol \ -lMQCore_ConfigModule -lMQCore_ProtocolModule -lMQCore_SessionModule -lMQCore_MemoryCache -lMQCore_DBModule -lMQCore_HelpModule \ -ljsoncpp -lXEngine_InfoReport -lXEngine_Token -lXEngine_Verification -lXEngine_MSGNotify LIBEX = diff --git a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp index 30aa972..519d604 100644 --- a/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp +++ b/XEngine_Source/XEngine_MQServiceApp/XEngine_MQServiceApp.cpp @@ -400,6 +400,15 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,MQTT消息服务没有被启用")); } + + if (st_ServiceCfg.st_XCryption.bEnable) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,数据加密服务已被启用,加密类型:%d"), st_ServiceCfg.st_XCryption.nCryptionType); + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,数据加密服务没有被启用")); + } #ifndef _DEBUG //发送信息报告 if (st_ServiceCfg.st_XReport.bEnable && !bIsTest) diff --git a/XEngine_Source/XQueue_BuildSwtich.h b/XEngine_Source/XQueue_BuildSwtich.h new file mode 100644 index 0000000..a6bb216 --- /dev/null +++ b/XEngine_Source/XQueue_BuildSwtich.h @@ -0,0 +1,13 @@ +#pragma once +/******************************************************************** +// Created: 2026/02/27 13:49:51 +// File Name: D:\XEngine_MQService\XEngine_Source\XQueue_BuildSwtich.h +// File Path: D:\XEngine_MQService\XEngine_Source +// File Base: XQueue_BuildSwtich +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: 编译选项 +// History: +*********************************************************************/ +#define __XENGINE_MESSAGEQUEUE_BUILD_SWITCH_PERMISSION__ 0 \ No newline at end of file diff --git a/XEngine_Source/XQueue_ProtocolHdr.h b/XEngine_Source/XQueue_ProtocolHdr.h index 6cbf109..51b48ff 100644 --- a/XEngine_Source/XQueue_ProtocolHdr.h +++ b/XEngine_Source/XQueue_ProtocolHdr.h @@ -24,24 +24,6 @@ #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPPOST 0x7001 //投递包回复 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQGET 0x7002 //获取包请求 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPGET 0x7003 //获取包回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQDELETE 0x7004 //消息删除请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPDELETE 0x7005 //消息删除回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQMODIFY 0x7006 //消息修改请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPMODIFY 0x7007 //消息修改回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQNUMBER 0x7008 //请求消息队列编号信息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPNUMBER 0x7009 //回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQUNREAD 0x7010 //请求未读消息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPUNREAD 0x7011 //响应未读消息 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICCREATE 0x7100 //主题创建请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICCREATE 0x7101 //主题创建回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICDELETE 0x7102 //主题删除请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICDELETE 0x7103 //主题删除回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICMODIFY 0x7104 //主题名修改请求 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICMODIFY 0x7105 //主题名修改回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICBIND 0x7106 //请求主题绑定操作 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICBIND 0x7107 //回复 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REQTOPICUNBIND 0x7108 //请求主题解绑操作 -#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_REPTOPICUNBIND 0x7109 //回复 //Only TCP and WEBSOCKET #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MQ_MSGNOTIFY 0x70A0 //消息通知 /////////////////////////////////////////////////////////////////////////// @@ -59,16 +41,6 @@ #define ERROR_XENGINE_MESSAGE_XMQ_TIMEOUT 0x105 //消息超时,无权使用 #define ERROR_XENGINE_MESSAGE_XMQ_PUBTIME 0x106 //定时消息,无权使用 #define ERROR_XENGINE_MESSAGE_XMQ_KEYQUERY 0x107 //查询绑定消息失败 -#define ERROR_XENGINE_MESSAGE_XMQ_SERIAL 0x108 //消息序号错误 -#define ERROR_XENGINE_MESSAGE_XMQ_CREATEKEY 0x109 //创建消息KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_BINDOWNER 0x110 //绑定所有者失败 -#define ERROR_XENGINE_MESSAGE_XMQ_DELOWNER 0x111 //删除所有者失败 -#define ERROR_XENGINE_MESSAGE_XMQ_KEYUP 0x112 //更新KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_BINDKEY 0x113 //绑定KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_DELKEY 0x114 //删除KEY失败 -#define ERROR_XENGINE_MESSAGE_XMQ_QUERYOWNER 0x115 //查询所有者失败 -#define ERROR_XENGINE_MESSAGE_XMQ_MODIFYTOPIC 0x116 //修改主题失败 -#define ERROR_XENGINE_MESSAGE_XMQ_MODIFYMSG 0x117 //修改消息失败 #define ERROR_XENGINE_MESSAGE_HTTP_PARAMENT 0x201 //HTTP请求参数错误 #define ERROR_XENGINE_MESSAGE_HTTP_AUTHORIZE 0x202 //验证失败没有权限 @@ -76,10 +48,13 @@ #define ERROR_XENGINE_MESSAGE_HTTP_PARSE 0x204 //解析失败,负载协议错误 #define ERROR_XENGINE_MESSAGE_HTTP_SERVICE 0x205 //服务器错误 #define ERROR_XENGINE_MESSAGE_HTTP_APIREG 0x206 //HTTP 远程注册失败 -#define ERROR_XENGINE_MESSAGE_HTTP_EXISTED 0x207 //用户已经存在 #define ERROR_XENGINE_MESSAGE_HTTP_REGISTER 0x208 //用户注册失败,数据错误 #define ERROR_XENGINE_MESSAGE_HTTP_APIDEL 0x209 //HTTP API删除失败 #define ERROR_XENGINE_MESSAGE_HTTP_DELETE 0x210 //本地删除失败 +#define ERROR_XENGINE_MESSAGE_HTTP_MISS 0x211 //缺少关键数据 +#define ERROR_XENGINE_MESSAGE_HTTP_EXIST 0x212 //数据已存在 +#define ERROR_XENGINE_MESSAGE_HTTP_FAILURE 0x213 //操作失败 +#define ERROR_XENGINE_MESSAGE_HTTP_PERMISSION 0x214 //权限错误 /////////////////////////////////////////////////////////////////////////// // 导出的数据结构 ///////////////////////////////////////////////////////////////////////////