diff --git a/CHANGELOG b/CHANGELOG index 35c01cb9b9646b6a2b3f7060c6fcd5bff842be13..239704662b252d2d4f25bbbd2b36853912b175ee 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,17 @@ +XEngine_APIService V2.10.0.1001 + +增加:敏感词过滤系统 +增加:配置热重载功能,支持基本配置和插件配置热重载 +修正:ModulePlugin_Loader_Destory 释放锁不正确的问题 +修正:http json的返回CODE值不正确的问题 +更新:匹配XEngineV8.15版本 + +added:words filter supported +added:basic and plugin configure hot reload support +fixed:ModulePlugin_Loader_Destory unlock is incorrent +fixed:code of http json for packet protocol is incorrent +update:match xengine v8.15 +====================================================================================== XEngine_APIService V2.9.0.1001 增加:短连接生成与转发功能支持 diff --git a/README.en.md b/README.en.md index 1c8ca9975d5a82751ddd43bb08c0f0dd127a1be3..8694b36133cf220111584a6db8a42c8c6751780d 100644 --- a/README.en.md +++ b/README.en.md @@ -44,8 +44,8 @@ Support privatization deployment, free, safe, open source, controllable 24. local system time 25. math Calculation 26. log service -27. Plugin hot reload(planned) -28. Sensitive word detection(planned) +27. Plugin hot reload +28. Sensitive word detection ## install @@ -92,8 +92,7 @@ make FLAGS=CleanAll clear 2. download code 3. complie 4. install -5. uncompress /XEngine_Release/XEngine_DBFile/ipdata.rar into current dir -6. run +5. run ## directory struct - XEngine_Docment docment directory diff --git a/README.md b/README.md index 9db710acc3bcfb02830cd11f024b1958852cc9d4..c47a10ae7dab4aa3e1f2d412b293a1ee2052e630 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,8 @@ c c++ interface api service 24. 本地标准时间 25. 数学计算 26. 日志服务 -27. 插件脚本热重载(计划中) -28. 敏感词检测(计划中) +27. 插件脚本热重载 +28. 敏感词检测 ## 安装教程 @@ -96,8 +96,7 @@ make FLAGS=CleanAll 清理编译 2. 下载代码 3. 编译 4. 安装 -5. 解压/XEngine_Release/XEngine_DBFile/ipdata.rar 到当前目录 -6. 运行 +5. 运行 ## 目录结构 - XEngine_Docment 文档目录结构 diff --git a/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.cpp b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..58979ed54a36269f40a89e1e89de763cccd88344 --- /dev/null +++ b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.cpp @@ -0,0 +1,108 @@ +#ifdef _MSC_BUILD +#include +#include +#pragma comment(lib,"Ws2_32") +#pragma comment(lib,"jsoncpp") +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient") +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//需要优先配置XEngine +//WINDOWS支持VS2022 x64 debug 编译调试 +//linux::g++ -std=c++17 -Wall -g APPClient_WordFilter.cpp -o APPClient_WordFilter.exe -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -lXEngine_BaseLib -lNetHelp_APIClient +//macos::g++ -std=c++17 -Wall -g APPClient_WordFilter.cpp -o APPClient_WordFilter.exe -lXEngine_BaseLib -lNetHelp_APIClient + +LPCXSTR lpszTableName = _T("xengine"); + +int test_insert() +{ + int nLen = 0; + int nCode = 0; + LPCXSTR lpszAPIUrl = _T("http://127.0.0.1:5501/api?function=wordfilter¶ms1=0"); + + Json::Value st_JsonRoot; + Json::StreamWriterBuilder st_JsonBuilder; + st_JsonRoot["tszWordsFrom"] = "root"; + st_JsonRoot["tszWordsTo"] = "user"; + st_JsonRoot["nLevel"] = 1; + + st_JsonBuilder["emitUTF8"] = true; + + XCHAR* ptszMsgBuffer = NULL; + if (!APIClient_Http_Request(_T("POST"), lpszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen)) + { + printf("发送投递失败!\n"); + return 0; + } + printf("接受到数据,大小:%d,内容:%s\n", nLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + + return 0; +} +int test_query() +{ + int nLen = 0; + int nCode = 0; + LPCXSTR lpszAPIUrl = _T("http://127.0.0.1:5501/api?function=wordfilter¶ms1=2"); + + Json::Value st_JsonRoot; + st_JsonRoot["tszWordsFrom"] = "root"; + + XCHAR* ptszMsgBuffer = NULL; + if (!APIClient_Http_Request(_T("POST"), lpszAPIUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + { + printf("发送投递失败!\n"); + return 0; + } + printf("接受到数据,大小:%d,内容:%s\n", nLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + + return 0; +} +int test_delete() +{ + int nLen = 0; + int nCode = 0; + LPCXSTR lpszAPIUrl = _T("http://127.0.0.1:5501/api?function=wordfilter¶ms1=1"); + + Json::Value st_JsonRoot; + st_JsonRoot["tszWordsFrom"] = "root"; + + XCHAR* ptszMsgBuffer = NULL; + if (!APIClient_Http_Request(_T("POST"), lpszAPIUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + { + printf("发送投递失败!\n"); + return 0; + } + printf("接受到数据,大小:%d,内容:%s\n", nLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + + return 0; +} + +int main() +{ +#ifdef _MSC_BUILD + WSADATA st_WSAData; + WSAStartup(MAKEWORD(2, 2), &st_WSAData); +#endif + test_insert(); + test_query(); + test_delete(); + +#ifdef _MSC_BUILD + WSACleanup(); +#endif + return 0; +} \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..f1331269d13c95a249c834dd4455e8ebadb12bd1 --- /dev/null +++ b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj @@ -0,0 +1,143 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {6f2d2186-1ed7-444d-9981-1acae4226811} + APPClientWordFilter + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);../../XEngine_Source/x64/Debug;$(LibraryPath) + + + $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj.filters b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj.filters new file mode 100644 index 0000000000000000000000000000000000000000..aeb9f52ab093d5f0668ef11919cefe273f9f430e --- /dev/null +++ b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj.user b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj.user new file mode 100644 index 0000000000000000000000000000000000000000..88a550947edbc3c5003a41726f0749201fdb6822 --- /dev/null +++ b/XEngine_APPClient/APPClient_WordFilter/APPClient_WordFilter.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/XEngine_APPClient/XEngine_APPClient.sln b/XEngine_APPClient/XEngine_APPClient.sln index 2a2662244615d0407208faee34731fb1d896919b..b130bda957214f614112a70c8a59cba382940383 100644 --- a/XEngine_APPClient/XEngine_APPClient.sln +++ b/XEngine_APPClient/XEngine_APPClient.sln @@ -35,6 +35,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_DTestExample", "A EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_SocketExample", "APPClient_SocketExample\APPClient_SocketExample.vcxproj", "{5DF5E1D4-318C-468D-A427-88D873E095D3}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_WordFilter", "APPClient_WordFilter\APPClient_WordFilter.vcxproj", "{6F2D2186-1ED7-444D-9981-1ACAE4226811}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -171,6 +173,14 @@ Global {5DF5E1D4-318C-468D-A427-88D873E095D3}.Release|x64.Build.0 = Release|x64 {5DF5E1D4-318C-468D-A427-88D873E095D3}.Release|x86.ActiveCfg = Release|Win32 {5DF5E1D4-318C-468D-A427-88D873E095D3}.Release|x86.Build.0 = Release|Win32 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Debug|x64.ActiveCfg = Debug|x64 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Debug|x64.Build.0 = Debug|x64 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Debug|x86.ActiveCfg = Debug|Win32 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Debug|x86.Build.0 = Debug|Win32 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Release|x64.ActiveCfg = Release|x64 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Release|x64.Build.0 = Release|x64 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Release|x86.ActiveCfg = Release|Win32 + {6F2D2186-1ED7-444D-9981-1ACAE4226811}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 118856a3e7b6bad29becb396f81b3d19a49fbb69..17fc12de100ce7beabad4d63c87adc30884ab18e 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 d433529801d6da82ac05a474d86a35d84d6705a5..240b5f578b1c06d80501531986c61e897d0b88e7 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 c2ddfa7a65163776b1b776998e6689dc10c7a9f4..ae2dd79c4ef6b443a87c8acbf0ae89b7759118b4 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -42,6 +42,7 @@ "nHTTPCode":301 }, "XVer":[ + "2.10.0.1001 Build20230810", "2.9.0.1001 Build20230421", "2.8.0.1001 Build20230207", "2.7.0.1001 Build20230117", diff --git a/XEngine_SQL/CreateDatabase.sql b/XEngine_SQL/CreateDatabase.sql index 3572252900a30c647958efc1d6e7f1713751538d..ac3997b62e25e94d32e8d57ba32c7e51b7f3309f 100644 --- a/XEngine_SQL/CreateDatabase.sql +++ b/XEngine_SQL/CreateDatabase.sql @@ -5,4 +5,5 @@ CREATE DATABASE `XEngine_APIInfo` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE `XEngine_APILog` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci; -CREATE DATABASE `XEngine_APISLink` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci; \ No newline at end of file +CREATE DATABASE `XEngine_APISLink` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci; +CREATE DATABASE `XEngine_APIWords` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci; \ No newline at end of file diff --git a/XEngine_SQL/XEngine_APIWords.sql b/XEngine_SQL/XEngine_APIWords.sql new file mode 100644 index 0000000000000000000000000000000000000000..4c0d2ea2c4a533043a8d280e038c00d5c0bcfd64 --- /dev/null +++ b/XEngine_SQL/XEngine_APIWords.sql @@ -0,0 +1,30 @@ +/* + Navicat Premium Data Transfer + + Source Server : mysql + Source Server Type : MySQL + Source Server Version : 80033 (8.0.33-0ubuntu0.22.04.4) + Source Host : 10.0.3.155:3306 + Source Schema : XEngine_APIWords + + Target Server Type : MySQL + Target Server Version : 80033 (8.0.33-0ubuntu0.22.04.4) + File Encoding : 65001 + + Date: 09/08/2023 14:10:48 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for WordFilter +-- ---------------------------- +DROP TABLE IF EXISTS `WordFilter`; +CREATE TABLE `WordFilter` ( + `tszWordsFrom` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '替换源', + `tszWordsTo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '替换目标', + `nLevel` tinyint NULL DEFAULT NULL COMMENT '过滤级别' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/XEngine_Source/XEngine.sln b/XEngine_Source/XEngine.sln index 17bcd6be309fdd1c9a898452597baf805ba49029..a4d03990a212cf0ae96e5647b8ebea446532650f 100644 --- a/XEngine_Source/XEngine.sln +++ b/XEngine_Source/XEngine.sln @@ -40,7 +40,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_Meter", "XE EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_Phone", "XEngine_PluginModule\ModulePlugin_Phone\ModulePlugin_Phone.vcxproj", "{8FBC495D-C05E-49A4-B938-A81C9DFC1E5A}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ModulePlugin_IPAddr", "XEngine_PluginModule\ModulePlugin_IPAddr\ModulePlugin_IPAddr.vcxproj", "{D549160C-CC16-47F8-8345-1F4CF7A25CA2}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_IPAddr", "XEngine_PluginModule\ModulePlugin_IPAddr\ModulePlugin_IPAddr.vcxproj", "{D549160C-CC16-47F8-8345-1F4CF7A25CA2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index 70a67d698bc2a0f3a87cb68d2117ae972a288380..5e05329ca61159c9e42a3cd4a000a84148fde54f 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -67,6 +67,11 @@ typedef struct int nHTTPCode; //转发模式,301 永久,302 临时 }st_XShortLink; struct + { + bool bReload; //配置重载 + XBYTE byCode; //1基本配置,2插件,3全部 + }st_XReload; + struct { list* pStl_ListVer; }st_XVer; diff --git a/XEngine_Source/XEngine_ModuleDatabase/Makefile b/XEngine_Source/XEngine_ModuleDatabase/Makefile index 1932c1738d0b38f8c541d12ea0491ea302432f82..750f4f4ee5a1d2f50f24c59f5624304422569c98 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/Makefile +++ b/XEngine_Source/XEngine_ModuleDatabase/Makefile @@ -10,7 +10,7 @@ LOADHDR = -I ./ LOADSO = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_HelpComponents LIB = -lXEngine_BaseLib -lHelpComponents_DataBase LIBEX = -OBJECTS = ModuleDatabase_IDCard.o ModuleDatabase_Bank.o ModuleDatabase_ZIPCode.o ModuleDatabase_XLog.o ModuleDatabase_ShortLink.o pch.o +OBJECTS = ModuleDatabase_IDCard.o ModuleDatabase_Bank.o ModuleDatabase_ZIPCode.o ModuleDatabase_XLog.o ModuleDatabase_ShortLink.o ModuleDatabase_WordFilter.o pch.o ifeq ($(RELEASE),1) FLAGS = -c @@ -62,6 +62,8 @@ ModuleDatabase_XLog.o:./ModuleDatabase_XLog/ModuleDatabase_XLog.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleDatabase_XLog/ModuleDatabase_XLog.cpp ModuleDatabase_ShortLink.o:./ModuleDatabase_ShortLink/ModuleDatabase_ShortLink.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleDatabase_ShortLink/ModuleDatabase_ShortLink.cpp +ModuleDatabase_WordFilter.o:./ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.cpp pch.o:./pch.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h b/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h index 9263ba5cb67cf0479f95cb077fb690bbac242857..f9cee09e5d0bae5cacdf2bd1f663706fff448736 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h @@ -322,4 +322,72 @@ extern "C" bool ModuleDatabase_ShortLink_Query(XENGINE_SHORTLINK* pSt_SLinkInfo) 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ModuleDatabase_ShortLink_Delete(XENGINE_SHORTLINK* pSt_SLinkInfo); \ No newline at end of file +extern "C" bool ModuleDatabase_ShortLink_Delete(XENGINE_SHORTLINK* pSt_SLinkInfo); +/************************************************************************/ +/* 导出的敏感词过滤数据库函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Init +函数功能:初始化SQLITE文件系统 + 参数.一:pSt_DBConnector + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要操作的数据库 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_WordFilter_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector); +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_WordFilter_Destory(); +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Query +函数功能:获取敏感词系统 + 参数.一:pSt_WordFilter + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:输入要查询的词,输出查询到的敏感词 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_WordFilter_Query(XENGINE_WORDFILTER* pSt_WordFilter); +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Insert +函数功能:查询一条敏感词 + 参数.一:pSt_WordFilter + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:输入要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_WordFilter_Insert(XENGINE_WORDFILTER* pSt_WordFilter); +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Delete +函数功能:删除一条敏感词 + 参数.一:pSt_WordFilter + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_WordFilter_Delete(XENGINE_WORDFILTER* pSt_WordFilter); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.cpp b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0385fb87ba74d7d4770bd2dbbe16e4c362bbc1e1 --- /dev/null +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.cpp @@ -0,0 +1,192 @@ +#include "pch.h" +#include "ModuleDatabase_WordFilter.h" +/******************************************************************** +// Created: 2023/08/09 10:57:03 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_WordFilter\ModuleDatabase_WordFilter.cpp +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_WordFilter +// File Base: ModuleDatabase_WordFilter +// File Ext: cpp +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 敏感词过滤器 +// History: +*********************************************************************/ +CModuleDatabase_WordFilter::CModuleDatabase_WordFilter() +{ +} +CModuleDatabase_WordFilter::~CModuleDatabase_WordFilter() +{ + +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Init +函数功能:初始化SQLITE文件系统 + 参数.一:pSt_DBConnector + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要操作的数据库 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_WordFilter::ModuleDatabase_WordFilter_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector) +{ + DBModule_IsErrorOccur = false; + + if (NULL == pSt_DBConnector) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_PARAMENT; + return false; + } + //连接数据库 + _tcsxcpy(pSt_DBConnector->tszDBName, _X("XEngine_APIWords")); + if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector)) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_WordFilter::ModuleDatabase_WordFilter_Destory() +{ + DBModule_IsErrorOccur = false; + + DataBase_MySQL_Close(xhDBSQL); + return true; +} +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Query +函数功能:获取敏感词系统 + 参数.一:pSt_WordFilter + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:输入要查询的词,输出查询到的敏感词 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_WordFilter::ModuleDatabase_WordFilter_Query(XENGINE_WORDFILTER* pSt_WordFilter) +{ + DBModule_IsErrorOccur = false; + + if (NULL == pSt_WordFilter) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_PARAMENT; + return false; + } + //查询 + __int64u nLine = 0; + __int64u nRow = 0; + XNETHANDLE xhTable = 0; + XCHAR tszSQLStatement[1024]; + + memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); + _xstprintf(tszSQLStatement, _X("SELECT * FROM `WordFilter` WHERE tszWordsFrom LIKE '%s'"), pSt_WordFilter->tszWordsFrom); + if (!DataBase_MySQL_ExecuteQuery(xhDBSQL, &xhTable, tszSQLStatement, &nLine, &nRow)) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = DataBase_GetLastError(); + return false; + } + if (nLine <= 0) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_NOTFOUND; + return false; + } + XCHAR** pptszResult = DataBase_MySQL_GetResult(xhDBSQL, xhTable); + + _tcsxcpy(pSt_WordFilter->tszWordsTo, pptszResult[1]); + pSt_WordFilter->nLevel = _ttxoi(pptszResult[2]); + + DataBase_MySQL_FreeResult(xhDBSQL, xhTable); + return true; +} +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Insert +函数功能:查询一条敏感词 + 参数.一:pSt_WordFilter + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:输入要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_WordFilter::ModuleDatabase_WordFilter_Insert(XENGINE_WORDFILTER* pSt_WordFilter) +{ + DBModule_IsErrorOccur = false; + + if (NULL == pSt_WordFilter) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStatement[11240]; + memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); + + _xstprintf(tszSQLStatement, _X("INSERT INTO `WordFilter` (tszWordsFrom,tszWordsTo,nLevel) VALUES('%s','%s',%d)"), pSt_WordFilter->tszWordsFrom, pSt_WordFilter->tszWordsTo, pSt_WordFilter->nLevel); + if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLStatement)) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:ModuleDatabase_WordFilter_Delete +函数功能:删除一条敏感词 + 参数.一:pSt_WordFilter + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要操作的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_WordFilter::ModuleDatabase_WordFilter_Delete(XENGINE_WORDFILTER* pSt_WordFilter) +{ + DBModule_IsErrorOccur = false; + + if (NULL == pSt_WordFilter) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStatement[10240]; + memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); + + _xstprintf(tszSQLStatement, _X("DELETE FROM `WordFilter` WHERE tszWordsFrom = '%s'"), pSt_WordFilter->tszWordsFrom); + if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLStatement)) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.h b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.h new file mode 100644 index 0000000000000000000000000000000000000000..3be1ca69a739e553ba555bc3e3515389a881a16e --- /dev/null +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.h @@ -0,0 +1,29 @@ +#pragma once +/******************************************************************** +// Created: 2023/08/09 10:56:39 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_WordFilter\ModuleDatabase_WordFilter.h +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_WordFilter +// File Base: ModuleDatabase_WordFilter +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 敏感词过滤器 +// History: +*********************************************************************/ + + +class CModuleDatabase_WordFilter +{ +public: + CModuleDatabase_WordFilter(); + ~CModuleDatabase_WordFilter(); +public: + bool ModuleDatabase_WordFilter_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector); + bool ModuleDatabase_WordFilter_Destory(); + bool ModuleDatabase_WordFilter_Query(XENGINE_WORDFILTER* pSt_WordFilter); + bool ModuleDatabase_WordFilter_Insert(XENGINE_WORDFILTER* pSt_WordFilter); + bool ModuleDatabase_WordFilter_Delete(XENGINE_WORDFILTER* pSt_WordFilter); +protected: +private: + XNETHANDLE xhDBSQL; +}; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def index 65e6cdb80e05d290902a87a25a2a850b4103b91f..29f6b3fe2cd65ad3274641568b5a653445a58529 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def +++ b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def @@ -27,4 +27,10 @@ EXPORTS ModuleDatabase_ShortLink_Destory ModuleDatabase_ShortLink_Insert ModuleDatabase_ShortLink_Query - ModuleDatabase_ShortLink_Delete \ No newline at end of file + ModuleDatabase_ShortLink_Delete + + ModuleDatabase_WordFilter_Init + ModuleDatabase_WordFilter_Destory + ModuleDatabase_WordFilter_Query + ModuleDatabase_WordFilter_Insert + ModuleDatabase_WordFilter_Delete \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj index e511582dbc2da3ff8d13a90c4d91df2bee782fbf..e4b330e47f5cc47103c0c1221a77405b6505699a 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj +++ b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj @@ -167,6 +167,7 @@ + @@ -178,6 +179,7 @@ + diff --git a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters index 568540c788cee61d0e41b3572508d987cded4e55..bd3b62d70e84eec98da2c547912f57ee2ec5c549 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters +++ b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters @@ -43,6 +43,12 @@ {358aae26-1704-4e1e-bca3-b48c05449281} + + {ffc19ee5-eece-4bb5-8678-8d0ec04d3371} + + + {b4156605-0cb0-4272-a5ef-d109f2b20126} + @@ -72,6 +78,9 @@ 头文件\ModuleDatabase_ShortLink + + 头文件\ModuleDatabase_WordFilter + @@ -95,6 +104,9 @@ 源文件\ModuleDatabase_ShortLink + + 源文件\ModuleDatabase_WordFilter + diff --git a/XEngine_Source/XEngine_ModuleDatabase/pch.cpp b/XEngine_Source/XEngine_ModuleDatabase/pch.cpp index 8d822a56dc2e18bf3016e2183ea0e1f176727f44..d22236a630bb507283a6f89af824dc1c16bed0ed 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/pch.cpp +++ b/XEngine_Source/XEngine_ModuleDatabase/pch.cpp @@ -4,6 +4,7 @@ #include "ModuleDatabase_ZIPCode/ModuleDatabase_ZIPCode.h" #include "ModuleDatabase_XLog/ModuleDatabase_XLog.h" #include "ModuleDatabase_ShortLink/ModuleDatabase_ShortLink.h" +#include "ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.h" /******************************************************************** // Created: 2022/02/28 13:26:15 // File Name: D:\XEngine_IPInfo\XEngine_Source\XEngine_ModuleDatabase\pch.cpp @@ -23,6 +24,7 @@ CModuleDatabase_Bank m_Bank; CModuleDatabase_ZIPCode m_ZIPCode; CModuleDatabase_XLog m_XLog; CModuleDatabase_ShortLink m_ShortLink; +CModuleDatabase_WordFilter m_WordFilter; ////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// @@ -132,4 +134,27 @@ extern "C" bool ModuleDatabase_ShortLink_Query(XENGINE_SHORTLINK * pSt_SLinkInfo extern "C" bool ModuleDatabase_ShortLink_Delete(XENGINE_SHORTLINK * pSt_SLinkInfo) { return m_ShortLink.ModuleDatabase_ShortLink_Delete(pSt_SLinkInfo); +} +/************************************************************************/ +/* 导出的敏感词过滤数据库函数 */ +/************************************************************************/ +extern "C" bool ModuleDatabase_WordFilter_Init(DATABASE_MYSQL_CONNECTINFO * pSt_DBConnector) +{ + return m_WordFilter.ModuleDatabase_WordFilter_Init(pSt_DBConnector); +} +extern "C" bool ModuleDatabase_WordFilter_Destory() +{ + return m_WordFilter.ModuleDatabase_WordFilter_Destory(); +} +extern "C" bool ModuleDatabase_WordFilter_Query(XENGINE_WORDFILTER * pSt_WordFilter) +{ + return m_WordFilter.ModuleDatabase_WordFilter_Query(pSt_WordFilter); +} +extern "C" bool ModuleDatabase_WordFilter_Insert(XENGINE_WORDFILTER * pSt_WordFilter) +{ + return m_WordFilter.ModuleDatabase_WordFilter_Insert(pSt_WordFilter); +} +extern "C" bool ModuleDatabase_WordFilter_Delete(XENGINE_WORDFILTER * pSt_WordFilter) +{ + return m_WordFilter.ModuleDatabase_WordFilter_Delete(pSt_WordFilter); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Define.h b/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Define.h index 8fb710170fb39452dd69beeef9d9012616818536..a707ced6a46596b8677d742a1fff31f1ffb6458c 100644 --- a/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Define.h +++ b/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Define.h @@ -206,6 +206,15 @@ extern "C" bool ModulePlugin_LuaCore_Destroy(); * 加载器导出函数定义 * *********************************************************************************/ /******************************************************************** +函数名称:ModulePlugin_Loader_Init +函数功能:初始化插件加载器 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModulePlugin_Loader_Init(); +/******************************************************************** 函数名称:ModulePlugin_Loader_Insert 函数功能:插入一个模块到加载器 参数.一:lpszModuleMethod diff --git a/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.cpp b/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.cpp index 8d37468a6d4ad08516f3dbf4dbbdb6c742855572..6899f6f0afcb336451c43d52c7ca66ccdf1efa5f 100644 --- a/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.cpp +++ b/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.cpp @@ -21,6 +21,21 @@ CModulePlugin_Loader::~CModulePlugin_Loader() // 公有函数 ////////////////////////////////////////////////////////////////////////// /******************************************************************** +函数名称:ModulePlugin_Loader_Init +函数功能:初始化插件加载器 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModulePlugin_Loader::ModulePlugin_Loader_Init() +{ + ModulePlugin_LibCore_Init(); + ModulePlugin_LuaCore_Init(); + + return true; +} +/******************************************************************** 函数名称:ModulePlugin_Loader_Insert 函数功能:插入一个模块到加载器 参数.一:lpszModuleMethod @@ -213,8 +228,11 @@ bool CModulePlugin_Loader::ModulePlugin_Loader_Destory() { ModulePlugin_IsErrorOccur = false; + ModulePlugin_LibCore_Destroy(); + ModulePlugin_LuaCore_Destroy(); + st_Locker.lock(); stl_MapLoader.clear(); - st_Locker.unlock_shared(); + st_Locker.unlock(); return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.h b/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.h index d89df9012eca683a7ef870544c5dfbc8f8c3c9bd..5a63a5a746249a894ec28306cd7633428d878426 100644 --- a/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.h +++ b/XEngine_Source/XEngine_ModulePlugin/ModulePlugin_Loader/ModulePlugin_Loader.h @@ -24,6 +24,7 @@ public: CModulePlugin_Loader(); ~CModulePlugin_Loader(); public: + bool ModulePlugin_Loader_Init(); bool ModulePlugin_Loader_Insert(LPCXSTR lpszModuleMethod, LPCXSTR lpszModuleName, int nType = 0); bool ModulePlugin_Loader_Find(LPCXSTR lpszMethodName, int* pInt_Type); bool ModulePlugin_Loader_Exec(LPCXSTR lpszMethodName, XCHAR*** pppHDRList, int nListCount, int* pInt_HTTPCode, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); diff --git a/XEngine_Source/XEngine_ModulePlugin/XEngine_ModulePlugin.def b/XEngine_Source/XEngine_ModulePlugin/XEngine_ModulePlugin.def index 55b4d1369066f1e5ae581b00deb667ebfa50a23e..09acda4dcf57fbcd95b4c935be550bd51dcf28d3 100644 --- a/XEngine_Source/XEngine_ModulePlugin/XEngine_ModulePlugin.def +++ b/XEngine_Source/XEngine_ModulePlugin/XEngine_ModulePlugin.def @@ -13,6 +13,7 @@ EXPORTS ModulePlugin_LuaCore_Exec ModulePlugin_LuaCore_Destroy + ModulePlugin_Loader_Init ModulePlugin_Loader_Insert ModulePlugin_Loader_Find ModulePlugin_Loader_Exec diff --git a/XEngine_Source/XEngine_ModulePlugin/pch.cpp b/XEngine_Source/XEngine_ModulePlugin/pch.cpp index 6ab861843ac303b38eae4fe0ea3fbfc765801371..6593af137ae9cd31d5cd26a171f75e27a00818c7 100644 --- a/XEngine_Source/XEngine_ModulePlugin/pch.cpp +++ b/XEngine_Source/XEngine_ModulePlugin/pch.cpp @@ -52,6 +52,10 @@ extern "C" bool ModulePlugin_LibCore_Destroy() /********************************************************************************* * LUA插件框架导出函数定义 * *********************************************************************************/ +extern "C" bool ModulePlugin_Loader_Init() +{ + return m_PluginLoader.ModulePlugin_Loader_Init(); +} extern "C" bool ModulePlugin_LuaCore_Init() { return m_PluginLua.ModulePlugin_LuaCore_Init(); diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h index 87e32acffb6405df225fc8e724a573d7fde921b0..57826956b8f2e0b1ddc7d9af5cb36934a36901b8 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h @@ -457,6 +457,30 @@ extern "C" bool ModuleProtocol_Packet_Log(XCHAR* ptszMsgBuffer, int* pInt_MsgLen 备注: *********************************************************************/ extern "C" bool ModuleProtocol_Packet_ShortLink(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_SHORTLINK* pSt_ShortLink); +/******************************************************************** +函数名称:ModuleProtocol_Packet_WordFilter +函数功能:敏感词生成协议打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打包的数据信息 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出打包大小 + 参数.三:pSt_WordFilter + In/Out:In + 类型:数据结构 + 可空:N + 意思:输入要打包的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleProtocol_Packet_WordFilter(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WORDFILTER* pSt_WordFilter); /************************************************************************/ /* 导出的协议解析函数 */ /************************************************************************/ @@ -670,4 +694,28 @@ extern "C" bool ModuleProtocol_Parse_SocketTest(LPCXSTR lpszMsgBuffer, int nMsgL 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ModuleProtocol_Parse_ShortLink(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_SHORTLINK* pSt_ShortLink); \ No newline at end of file +extern "C" bool ModuleProtocol_Parse_ShortLink(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_SHORTLINK* pSt_ShortLink); +/******************************************************************** +函数名称:ModuleProtocol_Parse_WordFilter +函数功能:敏感词协议解析 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pSt_ShortLink + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析好的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleProtocol_Parse_WordFilter(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WORDFILTER* pSt_WordFilter); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp index 309f1ebb07246f8b90610ad96503b7b0da172520..cbd8b4671cd8493c7ca0621462202b00a88ff06a 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp @@ -61,7 +61,7 @@ bool CModuleProtocol_Packet::ModuleProtocol_Packet_Common(XCHAR* ptszMsgBuffer, } Json::Value st_JsonRoot; - st_JsonRoot["code"] = 0; + st_JsonRoot["code"] = nCode; if (NULL != lpszMsgBuffer) { st_JsonRoot["msg"] = lpszMsgBuffer; @@ -715,6 +715,56 @@ bool CModuleProtocol_Packet::ModuleProtocol_Packet_ShortLink(XCHAR* ptszMsgBuffe return true; } /******************************************************************** +函数名称:ModuleProtocol_Packet_WordFilter +函数功能:敏感词生成协议打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打包的数据信息 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出打包大小 + 参数.三:pSt_WordFilter + In/Out:In + 类型:数据结构 + 可空:N + 意思:输入要打包的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleProtocol_Packet::ModuleProtocol_Packet_WordFilter(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WORDFILTER* pSt_WordFilter) +{ + ModuleProtocol_IsErrorOccur = false; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = true; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + Json::StreamWriterBuilder st_JsonBuilder; + + st_JsonObject["tszWordsFrom"] = pSt_WordFilter->tszWordsFrom; + st_JsonObject["tszWordsTo"] = pSt_WordFilter->tszWordsTo; + st_JsonObject["nLevel"] = pSt_WordFilter->nLevel; + + st_JsonRoot["code"] = 0; + st_JsonRoot["msg"] = "success"; + st_JsonRoot["data"] = st_JsonObject; + 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; +} +/******************************************************************** 函数名称:ModuleProtocol_Packet_P2PLan 函数功能:响应同步局域网地址列表 参数.一:ptszMsgBuffer diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h index 9a993e8a5d1d97f6fbbd6f54a5dfdf4cee4122bc..239ed886a005a33fcb85a0776be2c0ed15b12a65 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h @@ -32,6 +32,7 @@ public: bool ModuleProtocol_Packet_TestReport(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XNETHANDLE xhToken, LPCXSTR lpszIPAddr, int nIPPort, __int64x nNumber, __int64x nFailed, __int64x nSuccess, int nStatus); bool ModuleProtocol_Packet_TestReply(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XNETHANDLE xhToken); bool ModuleProtocol_Packet_ShortLink(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_SHORTLINK* pSt_ShortLink); + bool ModuleProtocol_Packet_WordFilter(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WORDFILTER* pSt_WordFilter); public: bool ModuleProtocol_Packet_P2PLan(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount); bool ModuleProtocol_Packet_P2PWLan(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients); diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp index d38bb9b6c04d0ea126ccee94b2bb252354883056..38fa18881102b2fc7f9288615f66a4aa0a11af64 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp @@ -696,4 +696,63 @@ bool CModuleProtocol_Parse::ModuleProtocol_Parse_ShortLink(LPCXSTR lpszMsgBuffer pSt_ShortLink->nLength = st_JsonRoot["nLength"].asInt(); } return true; +} +/******************************************************************** +函数名称:ModuleProtocol_Parse_WordFilter +函数功能:敏感词协议解析 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的数据 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:要解析的大小 + 参数.三:pSt_ShortLink + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出解析好的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleProtocol_Parse::ModuleProtocol_Parse_WordFilter(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WORDFILTER* pSt_WordFilter) +{ + ModuleProtocol_IsErrorOccur = false; + + if ((NULL == lpszMsgBuffer) || (NULL == pSt_WordFilter)) + { + ModuleProtocol_IsErrorOccur = true; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PARSE_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::CharReaderBuilder st_ReaderBuilder; + //解析JSON + std::unique_ptr const pSt_JsonReader(st_ReaderBuilder.newCharReader()); + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + ModuleProtocol_IsErrorOccur = true; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PARSE_PARAMENT; + return false; + } + + if (!st_JsonRoot["tszWordsFrom"].isNull()) + { + _tcsxcpy(pSt_WordFilter->tszWordsFrom, st_JsonRoot["tszWordsFrom"].asCString()); + } + if (!st_JsonRoot["tszWordsTo"].isNull()) + { + _tcsxcpy(pSt_WordFilter->tszWordsTo, st_JsonRoot["tszWordsTo"].asCString()); + } + if (!st_JsonRoot["nLevel"].isNull()) + { + pSt_WordFilter->nLevel = st_JsonRoot["byLevel"].asInt(); + } + return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h index eb0168c2755a63223bc1750da9801727edb4b6ac..04ef836b201c6a4c1472ad02db828b306d251d55 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h @@ -27,5 +27,6 @@ public: bool ModuleProtocol_Parse_QRCode(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_QRCODE* pSt_QRCode); bool ModuleProtocol_Parse_SocketTest(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_SOCKETTEST* pSt_SocketTest); bool ModuleProtocol_Parse_ShortLink(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_SHORTLINK* pSt_ShortLink); + bool ModuleProtocol_Parse_WordFilter(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WORDFILTER* pSt_WordFilter); private: }; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def index cfd70936039a58a8753b1e9c52bc9e69f588cdff..cd9344db14510038cc6eb1acb8c9b78e70c4fbc9 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def @@ -13,6 +13,7 @@ EXPORTS ModuleProtocol_Packet_TestReport ModuleProtocol_Packet_TestReply ModuleProtocol_Packet_ShortLink + ModuleProtocol_Packet_WordFilter ModuleProtocol_Packet_P2PLan ModuleProtocol_Packet_P2PWLan ModuleProtocol_Packet_P2PUser @@ -26,4 +27,5 @@ EXPORTS ModuleProtocol_Parse_XLog ModuleProtocol_Parse_QRCode ModuleProtocol_Parse_SocketTest - ModuleProtocol_Parse_ShortLink \ No newline at end of file + ModuleProtocol_Parse_ShortLink + ModuleProtocol_Parse_WordFilter \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp index 76d520422bb830767f2f107dc426d4fbcd390cda..54364142ed955392f8e8b42881b753d4901ffc95 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp @@ -71,6 +71,10 @@ extern "C" bool ModuleProtocol_Packet_ShortLink(XCHAR * ptszMsgBuffer, int* pInt { return m_ProtocolPacket.ModuleProtocol_Packet_ShortLink(ptszMsgBuffer, pInt_MsgLen, pSt_ShortLink); } +extern "C" bool ModuleProtocol_Packet_WordFilter(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WORDFILTER * pSt_WordFilter) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_WordFilter(ptszMsgBuffer, pInt_MsgLen, pSt_WordFilter); +} extern "C" bool ModuleProtocol_Packet_P2PLan(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL * **pppSt_ListClients, int nListCount) { return m_ProtocolPacket.ModuleProtocol_Packet_P2PLan(ptszMsgBuffer, pInt_MsgLen, pppSt_ListClients, nListCount); @@ -125,4 +129,8 @@ extern "C" bool ModuleProtocol_Parse_SocketTest(LPCXSTR lpszMsgBuffer, int nMsgL extern "C" bool ModuleProtocol_Parse_ShortLink(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_SHORTLINK * pSt_ShortLink) { return m_ProtocolParse.ModuleProtocol_Parse_ShortLink(lpszMsgBuffer, nMsgLen, pSt_ShortLink); +} +extern "C" bool ModuleProtocol_Parse_WordFilter(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WORDFILTER * pSt_WordFilter) +{ + return m_ProtocolParse.ModuleProtocol_Parse_WordFilter(lpszMsgBuffer, nMsgLen, pSt_WordFilter); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile index af217e7ad5d803aee1b0d6c5cc2114b882e10f45..c89dbd81c42ffbc5c17f52e376685ab448f04bde 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile @@ -15,8 +15,8 @@ LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -ljsoncpp LIBEX = OBJECTS = XEngine_Configure.o XEngine_Network.o XEngine_HTTPTask.o XEngine_PluginTask.o XEngine_HttpApp.o \ - TaskGet_Bank.o TaskGet_IDCard.o TaskGet_Language.o TaskGet_Locker.o TaskGet_Translation.o \ - TaskPost_DTest.o TaskPost_Log.o TaskPost_P2PClient.o TaskPost_PostCode.o TaskPost_QRCode.o TaskPost_ShortLink.o TaskPost_SocketTest.o + TaskGet_Bank.o TaskGet_IDCard.o TaskGet_Language.o TaskGet_Locker.o TaskGet_Translation.o TaskGet_Reload.o \ + TaskPost_DTest.o TaskPost_Log.o TaskPost_P2PClient.o TaskPost_PostCode.o TaskPost_QRCode.o TaskPost_ShortLink.o TaskPost_SocketTest.o TaskPost_WordFilter.o ifeq ($(RELEASE),1) FLAGS = -c @@ -76,6 +76,8 @@ TaskGet_Locker.o:./XEngine_TaskGet/TaskGet_Locker.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskGet/TaskGet_Locker.cpp TaskGet_Translation.o:./XEngine_TaskGet/TaskGet_Translation.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskGet/TaskGet_Translation.cpp +TaskGet_Reload.o:./XEngine_TaskGet/TaskGet_Reload.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskGet/TaskGet_Reload.cpp TaskPost_DTest.o:./XEngine_TaskPost/TaskPost_DTest.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskPost/TaskPost_DTest.cpp @@ -91,6 +93,8 @@ TaskPost_ShortLink.o:./XEngine_TaskPost/TaskPost_ShortLink.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskPost/TaskPost_ShortLink.cpp TaskPost_SocketTest.o:./XEngine_TaskPost/TaskPost_SocketTest.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskPost/TaskPost_SocketTest.cpp +TaskPost_WordFilter.o:./XEngine_TaskPost/TaskPost_WordFilter.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskPost/TaskPost_WordFilter.cpp XEngine_HttpApp.o:./XEngine_HttpApp.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_HttpApp.cpp diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp index f13b6d4d3b689b105f7e4ffa688994e5659a20bb..dd2ade7c5fb83e15f850b446f73abc81dbea44b0 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp @@ -14,6 +14,12 @@ bool XEngine_Configure_Parament(int argc, char** argv, XENGINE_SERVICECONFIG* pS { LPCXSTR lpszConfigFile = _X("./XEngine_Config/XEngine_Config.json"); + if (NULL != pSt_Configure->st_XVer.pStl_ListVer) + { + delete pSt_Configure->st_XVer.pStl_ListVer; + pSt_Configure->st_XVer.pStl_ListVer = NULL; + } + memset(pSt_Configure, '\0', sizeof(XENGINE_SERVICECONFIG)); if (!ModuleConfigure_Json_File(lpszConfigFile, pSt_Configure)) { printf("解析配置文件失败,ModuleConfigure_Json_File:%lX\n", ModuleConfigure_GetLastError()); @@ -31,6 +37,11 @@ bool XEngine_Configure_Parament(int argc, char** argv, XENGINE_SERVICECONFIG* pS { pSt_Configure->bDeamon = _ttxoi(argv[i + 1]); } + else if (0 == _tcsxcmp("-r", argv[i])) + { + pSt_Configure->st_XReload.bReload = true; + pSt_Configure->st_XReload.byCode = _ttxoi(argv[i + 1]); + } } return true; diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index 3d31fa257af25b8e0362a39cf1b1e980c13e0cd1..fcb09594813a3dd863c72c81c0befb0d424a0059 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -24,7 +24,7 @@ XHTHREAD CALLBACK HTTPTask_TastPost_Thread(XPVOID lParam) continue; } int nListCount = 0; - RFCCOMPONENTS_HTTP_PKTCLIENT** ppSst_ListAddr; + XENGINE_MANAGEPOOL_TASKEVENT** ppSst_ListAddr; //获得编号1的所有待处理任务的客户端列表(也就是客户端发送过来的数据已经组好了一个包,需要我们处理) HttpProtocol_Server_GetPoolEx(xhHTTPPacket, nThreadPos, &ppSst_ListAddr, &nListCount); //先循环客户端 @@ -101,6 +101,7 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST LPCXSTR lpszParamLanguage = _X("language"); LPCXSTR lpszParamTranslation = _X("translation"); LPCXSTR lpszParamLocker = _X("lock"); + LPCXSTR lpszParamReload = _X("reload"); //post LPCXSTR lpszParamP2PClient = _X("p2p"); LPCXSTR lpszParamZIPCode = _X("zipcode"); @@ -109,6 +110,7 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST LPCXSTR lpszParamSocket = _X("socket"); LPCXSTR lpszParamDTest = _X("dtest"); LPCXSTR lpszParamShortLink = _X("slink"); + LPCXSTR lpszParamWordFilter = _X("wordfilter"); memset(tszKey, '\0', MAX_PATH); memset(tszValue, '\0', MAX_PATH); @@ -253,6 +255,15 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszType); HTTPTask_TaskPost_ShortLink(lpszClientAddr, lpszRVBuffer, nRVLen, _ttxoi(tszType)); } + else if (0 == _tcsxnicmp(lpszParamWordFilter, tszValue, _tcsxlen(lpszParamWordFilter))) + { + //敏感词:http://app.xyry.org:5501/api?function=wordfilter¶ms1=0 + XCHAR tszType[64]; + memset(tszType, '\0', sizeof(tszType)); + + BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszType); + HTTPTask_TastPost_WordFilter(lpszClientAddr, lpszRVBuffer, nRVLen, _ttxoi(tszType)); + } else { st_HDRParam.nHttpCode = 404; @@ -263,7 +274,14 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST } else if (0 == _tcsxnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet))) { - if (0 == _tcsxnicmp(lpszParamIDCard, tszValue, _tcsxlen(lpszParamIDCard))) + if (0 == _tcsxnicmp(lpszParamReload, tszValue, _tcsxlen(lpszParamReload))) + { + //是不是配置重载 + memset(tszKey, '\0', sizeof(tszKey)); + BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); + HTTPTask_TaskGet_Reload(lpszClientAddr, tszValue); + } + else if (0 == _tcsxnicmp(lpszParamIDCard, tszValue, _tcsxlen(lpszParamIDCard))) { //是不是身份证查询 memset(tszKey, '\0', sizeof(tszKey)); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index 1969ceded1efb91684193a35eeddde83b69f4554..485e231fd757063000b5b6e8ee3748df26bef670 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -66,12 +66,14 @@ using namespace std; #include "XEngine_TaskPost/TaskPost_SocketTest.h" #include "XEngine_TaskPost/TaskPost_QRCode.h" #include "XEngine_TaskPost/TaskPost_ShortLink.h" +#include "XEngine_TaskPost/TaskPost_WordFilter.h" //get #include "XEngine_TaskGet/TaskGet_IDCard.h" #include "XEngine_TaskGet/TaskGet_Bank.h" #include "XEngine_TaskGet/TaskGet_Language.h" #include "XEngine_TaskGet/TaskGet_Translation.h" #include "XEngine_TaskGet/TaskGet_Locker.h" +#include "XEngine_TaskGet/TaskGet_Reload.h" /******************************************************************** // Created: 2022/01/20 14:42:06 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_HttpApp\XEngine_Hdr.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index cea9e3346a6768f4c7438d029215b23ad1ad7f93..f686d933373f577aed34ce184844ad91fc934b25 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -41,9 +41,9 @@ void ServiceApp_Stop(int signo) ModuleDatabase_ZIPCode_Destory(); ModuleDatabase_XLog_Destory(); ModuleDatabase_ShortLink_Destory(); + ModuleDatabase_WordFilter_Destory(); //销毁其他 - ModulePlugin_LibCore_Destroy(); - ModulePlugin_LuaCore_Destroy(); + ModulePlugin_Loader_Destory(); ModuleHelp_P2PClient_Destory(); //销毁日志资源 HelpComponents_XLog_Destroy(xhLog); @@ -112,6 +112,17 @@ int main(int argc, char** argv) { return -1; } + //配置重载 + if (st_ServiceConfig.st_XReload.bReload) + { + //重载配置文件后退出 + XCHAR tszAddr[128]; + memset(tszAddr, '\0', sizeof(tszAddr)); + //http://127.0.0.1:5501/api?function=reload&opcode=0 + _xstprintf(tszAddr, _X("http://127.0.0.1:%d/api?function=reload&opcode=%d"), st_ServiceConfig.nHttpPort, st_ServiceConfig.st_XReload.byCode); + APIClient_Http_Request(_X("GET"), tszAddr); + return 0; + } //判断是否以守护进程启动 if (st_ServiceConfig.bDeamon) { @@ -197,6 +208,12 @@ int main(int argc, char** argv) goto XENGINE_SERVICEAPP_EXIT; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化短连接数据库成功")); + if (!ModuleDatabase_WordFilter_Init((DATABASE_MYSQL_CONNECTINFO*)&st_ServiceConfig.st_XSql)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化敏感词数据库失败,错误:%lX"), ModuleDB_GetLastError()); + goto XENGINE_SERVICEAPP_EXIT; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化敏感词数据库成功")); //启动HTTP服务相关代码 if (st_ServiceConfig.nHttpPort > 0) { @@ -264,13 +281,13 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动P2P客户端管理器成功,超时时间设置:%d 秒"), st_ServiceConfig.st_XTime.nP2PTimeOut); //启动插件 - if (!ModulePlugin_LibCore_Init()) + if (!ModulePlugin_Loader_Init()) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化Lib插件系统失败,错误:%lX"), ModulePlugin_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化插件系统失败,错误:%lX"), ModulePlugin_GetLastError()); goto XENGINE_SERVICEAPP_EXIT; } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化插件系统成功,开始加载插件")); //加载插件 - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化Lib插件系统成功,开始加载插件")); { list::const_iterator stl_ListIterator = st_PluginLibConfig.pStl_ListPlugin->begin(); for (int i = 1; stl_ListIterator != st_PluginLibConfig.pStl_ListPlugin->end(); stl_ListIterator++, i++) @@ -292,12 +309,7 @@ int main(int argc, char** argv) } } } - if (!ModulePlugin_LuaCore_Init()) - { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化Lua插件系统失败,错误:%lX"), ModulePlugin_GetLastError()); - goto XENGINE_SERVICEAPP_EXIT; - } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化Lua插件系统成功,开始加载插件")); + { list::const_iterator stl_ListIterator = st_PluginLuaConfig.pStl_ListPlugin->begin(); for (int i = 1; stl_ListIterator != st_PluginLuaConfig.pStl_ListPlugin->end(); stl_ListIterator++, i++) @@ -344,9 +356,9 @@ XENGINE_SERVICEAPP_EXIT: ModuleDatabase_ZIPCode_Destory(); ModuleDatabase_XLog_Destory(); ModuleDatabase_ShortLink_Destory(); + ModuleDatabase_WordFilter_Destory(); //销毁其他 - ModulePlugin_LibCore_Destroy(); - ModulePlugin_LuaCore_Destroy(); + ModulePlugin_Loader_Destory(); ModuleHelp_P2PClient_Destory(); //销毁日志资源 HelpComponents_XLog_Destroy(xhLog); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index d77cf17a0b0fb07eaa858610e9da6ffbf9ccbe8a..75afb80c868fa2ab4bd9814cfb6881a4253d1f1e 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -162,6 +162,7 @@ + @@ -170,6 +171,7 @@ + @@ -181,6 +183,7 @@ + @@ -189,6 +192,7 @@ + diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters index 8d35df7b476a582c15b1eb6da1b98bf2f6483a90..f67fa11d293f901d2d761ba7241bf9939fb0ac89 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -78,6 +78,12 @@ 源文件\XEngine_TaskPost + + 源文件\XEngine_TaskGet + + + 源文件\XEngine_TaskPost + @@ -131,5 +137,11 @@ 头文件\XEngine_TaskPost + + 头文件\XEngine_TaskGet + + + 头文件\XEngine_TaskPost + \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.user b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.user index 88a550947edbc3c5003a41726f0749201fdb6822..9cad7f7cc556d4d7ef9d4dbd5f2cb07d4f2c6d3f 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.user +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.user @@ -1,4 +1,8 @@  - + + + + WindowsLocalDebugger + \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Reload.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Reload.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1c83bc3c016bb05fe73e1af4f472b080722bb812 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Reload.cpp @@ -0,0 +1,89 @@ +#include "../XEngine_Hdr.h" + +bool HTTPTask_TaskGet_Reload(LPCXSTR lpszClientAddr, LPCXSTR lpszOPCode) +{ + int nMsgLen = 4096; + XCHAR tszMsgBuffer[4096]; + RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; //发送给客户端的参数 + + memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); + memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); + + st_HDRParam.nHttpCode = 200; //HTTP CODE码 + st_HDRParam.bIsClose = true; //收到回复后就关闭 + + if (0 == _ttxoi(lpszOPCode)) + { + XEngine_Configure_Parament(0, NULL, &st_ServiceConfig); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求操作配置重载成功,操作的配置:%s"), lpszClientAddr, lpszOPCode); + } + else if (1 == _ttxoi(lpszOPCode)) + { + ModulePlugin_Loader_Destory(); + delete st_PluginLibConfig.pStl_ListPlugin; + delete st_PluginLuaConfig.pStl_ListPlugin; + st_PluginLibConfig.pStl_ListPlugin = NULL; + st_PluginLuaConfig.pStl_ListPlugin = NULL; + + ModulePlugin_Loader_Init(); + if (!ModuleConfigure_Json_PluginFile(st_ServiceConfig.st_XPlugin.tszPluginLib, &st_PluginLibConfig)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求操作配置重载失败,加载Lib插件配置失败,错误:%lX"), lpszClientAddr, ModuleConfigure_GetLastError()); + return false; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求操作配置重载成功,加载Lib插件配置成功"), lpszClientAddr); + if (!ModuleConfigure_Json_PluginFile(st_ServiceConfig.st_XPlugin.tszPluginLua, &st_PluginLuaConfig)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,请求操作配置重载失败,加载Lua插件配置失败,错误:%lX"), lpszClientAddr, ModuleConfigure_GetLastError()); + return false; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求操作配置重载成功,加载lua插件配置成功"), lpszClientAddr); + + { + list::const_iterator stl_ListIterator = st_PluginLibConfig.pStl_ListPlugin->begin(); + for (int i = 1; stl_ListIterator != st_PluginLibConfig.pStl_ListPlugin->end(); stl_ListIterator++, i++) + { + if (stl_ListIterator->bEnable) + { + if (ModulePlugin_Loader_Insert(stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile, 0)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,重载Lib模块插件中,当前第:%d 个加载成功,方法:%s,路径:%s"), lpszClientAddr, i, stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile); + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,重载Lib模块插件中,当前第:%d 个加载失败,方法:%s,路径:%s,错误:%lX"), lpszClientAddr, i, stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile, ModulePlugin_GetLastError()); + } + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,重载Lib模块插件中,当前第:%d 个加载失败,因为没有启用,方法:%s,路径:%s"), lpszClientAddr, i, stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile); + } + } + } + { + list::const_iterator stl_ListIterator = st_PluginLuaConfig.pStl_ListPlugin->begin(); + for (int i = 1; stl_ListIterator != st_PluginLuaConfig.pStl_ListPlugin->end(); stl_ListIterator++, i++) + { + if (stl_ListIterator->bEnable) + { + if (ModulePlugin_Loader_Insert(stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile, 1)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,重载Lua模块插件中,当前第:%d 个加载成功,方法:%s,路径:%s"), lpszClientAddr, i, stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile); + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("HTTP客户端:%s,重载Lua模块插件中,当前第:%d 个加载失败,方法:%s,路径:%s,错误:%lX"), lpszClientAddr, i, stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile, ModulePlugin_GetLastError()); + } + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("HTTP客户端:%s,重载Lua模块插件中,当前第:%d 个加载失败,因为没有启用,方法:%s,路径:%s"), lpszClientAddr, i, stl_ListIterator->tszPluginMethod, stl_ListIterator->tszPluginFile); + } + } + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求重载插件成功,Lib插件:%d 个,Lua插件:%d 个"), lpszClientAddr, st_PluginLibConfig.pStl_ListPlugin->size(), st_PluginLuaConfig.pStl_ListPlugin->size()); + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Reload.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Reload.h new file mode 100644 index 0000000000000000000000000000000000000000..418cfa411a1e11f97bd73ccc2274967db2ad733a --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Reload.h @@ -0,0 +1,3 @@ +#pragma once + +bool HTTPTask_TaskGet_Reload(LPCXSTR lpszClientAddr, LPCXSTR lpszOPCode); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_WordFilter.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_WordFilter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..35b4ae9937ca6ed7234b73b5f51da4f184498945 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_WordFilter.cpp @@ -0,0 +1,52 @@ +#include "../XEngine_Hdr.h" + +bool HTTPTask_TastPost_WordFilter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nType) +{ + int nSDLen = 0; + int nRVLen = 0; + XCHAR tszSDBuffer[4096]; + XCHAR tszRVBuffer[4096]; + XENGINE_WORDFILTER st_WordFilter; + RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; //发送给客户端的参数 + + memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); + memset(tszRVBuffer, '\0', sizeof(tszRVBuffer)); + memset(&st_WordFilter, '\0', sizeof(XENGINE_WORDFILTER)); + memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); + + st_HDRParam.nHttpCode = 200; //HTTP CODE码 + st_HDRParam.bIsClose = true; //收到回复后就关闭 + ModuleProtocol_Parse_WordFilter(lpszMsgBuffer, nMsgLen, &st_WordFilter); + + if (0 == nType) + { + ModuleDatabase_WordFilter_Insert(&st_WordFilter); + ModuleProtocol_Packet_Common(tszRVBuffer, &nRVLen); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求插入一条敏感词成功,敏感词:%s,"), lpszClientAddr, st_WordFilter.tszWordsFrom); + } + else if (1 == nType) + { + ModuleDatabase_WordFilter_Delete(&st_WordFilter); + ModuleProtocol_Packet_Common(tszRVBuffer, &nRVLen); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求删除一条敏感词成功,敏感词:%s"), lpszClientAddr, st_WordFilter.tszWordsFrom); + } + else + { + if (!ModuleDatabase_WordFilter_Query(&st_WordFilter)) + { + ModuleProtocol_Packet_Common(tszRVBuffer, &nRVLen, 404, "not found"); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求查询一条敏感词:%s 失败,错误码:%lX"), lpszClientAddr, st_WordFilter.tszWordsFrom, ModuleDB_GetLastError()); + } + ModuleProtocol_Packet_WordFilter(tszRVBuffer, &nRVLen, &st_WordFilter); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求查询一条敏感词成功,敏感词:%s,过滤词:%s,级别:%d"), lpszClientAddr, st_WordFilter.tszWordsFrom, st_WordFilter.tszWordsTo, st_WordFilter.nLevel); + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_WordFilter.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_WordFilter.h new file mode 100644 index 0000000000000000000000000000000000000000..c885fdd92953ac2b372f037e2f0dee4c91359d7b --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_WordFilter.h @@ -0,0 +1,3 @@ +#pragma once + +bool HTTPTask_TastPost_WordFilter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nType); \ No newline at end of file diff --git a/XEngine_Source/XEngine_UserProtocol.h b/XEngine_Source/XEngine_UserProtocol.h index 421b597923db36f35a378669ca726ecac7f78d08..91e210a4662c03cbee5e00ca0a2704a5e85abb53 100644 --- a/XEngine_Source/XEngine_UserProtocol.h +++ b/XEngine_Source/XEngine_UserProtocol.h @@ -218,4 +218,11 @@ typedef struct int nLength; int nID; }XENGINE_SHORTLINK; +//敏感词过滤器 +typedef struct +{ + XCHAR tszWordsFrom[MAX_PATH]; + XCHAR tszWordsTo[MAX_PATH]; + XBYTE nLevel; //过滤级别,0替换,1删除,2禁止 +}XENGINE_WORDFILTER; #pragma pack(pop) \ No newline at end of file