diff --git a/InstallerServerApp_amd64/InstallerServerApp_amd64.vdproj b/InstallerServerApp_amd64/InstallerServerApp_amd64.vdproj index 4769edf..89d60d1 100644 --- a/InstallerServerApp_amd64/InstallerServerApp_amd64.vdproj +++ b/InstallerServerApp_amd64/InstallerServerApp_amd64.vdproj @@ -69,6 +69,18 @@ } "Entry" { + "MsmKey" = "8:_C492C60DB8E550E830CE1C2C460B4AD3" + "OwnerKey" = "8:_051B58ED18044668A8D8F5D293AEFB1B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D0A1E4927356B199FDD97B12CBDBC86E" + "OwnerKey" = "8:_051B58ED18044668A8D8F5D293AEFB1B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_D64BF7F7A4C54240763CB0C07962C5D9" "OwnerKey" = "8:_051B58ED18044668A8D8F5D293AEFB1B" "MsmSig" = "8:_UNDEFINED" @@ -81,6 +93,12 @@ } "Entry" { + "MsmKey" = "8:_DC0B62A757A10195CC98D20A71CB2871" + "OwnerKey" = "8:_051B58ED18044668A8D8F5D293AEFB1B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_E42C46DD524A1F15E4C053C79430527B" "OwnerKey" = "8:_051B58ED18044668A8D8F5D293AEFB1B" "MsmSig" = "8:_UNDEFINED" @@ -127,6 +145,22 @@ "PrivateKeyFile" = "8:" "TimeStampServer" = "8:" "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.7.2" + { + "Name" = "8:Microsoft .NET Framework 4.7.2 (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.7.2" + } + } + } } "Release" { @@ -143,6 +177,14 @@ "PrivateKeyFile" = "8:" "TimeStampServer" = "8:" "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + } } } "Deployable" @@ -304,6 +346,46 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C492C60DB8E550E830CE1C2C460B4AD3" + { + "SourcePath" = "8:libssl-3-x64.dll" + "TargetName" = "8:libssl-3-x64.dll" + "Tag" = "8:" + "Folder" = "8:_0777490231CD48A0970C1FCD623EA32A" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D0A1E4927356B199FDD97B12CBDBC86E" + { + "SourcePath" = "8:CRYPT32.dll" + "TargetName" = "8:CRYPT32.dll" + "Tag" = "8:" + "Folder" = "8:_0777490231CD48A0970C1FCD623EA32A" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D64BF7F7A4C54240763CB0C07962C5D9" { "SourcePath" = "8:ucrtbased.dll" @@ -324,6 +406,26 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DC0B62A757A10195CC98D20A71CB2871" + { + "SourcePath" = "8:libcrypto-3-x64.dll" + "TargetName" = "8:libcrypto-3-x64.dll" + "Tag" = "8:" + "Folder" = "8:_0777490231CD48A0970C1FCD623EA32A" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E42C46DD524A1F15E4C053C79430527B" { "SourcePath" = "8:VCRUNTIME140D.dll" @@ -441,7 +543,7 @@ "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:SCCServer" "ProductCode" = "8:{E00CE8DB-D79F-4890-910F-64AE0F37AEED}" - "PackageCode" = "8:{2881D34B-31F4-4DA0-AE7A-7FAF55389480}" + "PackageCode" = "8:{4A613EBB-74F1-4F04-9B7F-CC39E5BDC4D4}" "UpgradeCode" = "8:{3089869A-5F6B-4EC2-B2CA-54B51499079F}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" diff --git a/NetTunnelApp/MainForm.cs b/NetTunnelApp/MainForm.cs index f83f395..ac8b654 100644 --- a/NetTunnelApp/MainForm.cs +++ b/NetTunnelApp/MainForm.cs @@ -45,8 +45,8 @@ public partial class MainForm : Form var path = Environment.CurrentDirectory + "\\tunnelsdk_" + string.Format("{0:yyyyMMdd}", DateTime.Now) + ".log"; //NetTunnelLib.InitTunnelSDKLog(path, LogLevel.LOG_DEBUG); - NetTunnelLib.TunnelSDKInitEnv(Environment.CurrentDirectory, "http://xajhuang.com:9276", path, LogLevel.LOG_TRACE, menuSetModeServer.Checked); - NetTunnelLib.EnableSCGProxy(true, "efc.xajhuang.com", 10001); + NetTunnelLib.TunnelSDKInitEnv(Environment.CurrentDirectory, "http://172.21.40.39:32549", path, LogLevel.LOG_TRACE, menuSetModeServer.Checked); + //NetTunnelLib.EnableSCGProxy(true, "efc.xajhuang.com", 10001); GetCurrentNetCard(); NetCardMenuItems menuItems = new NetCardMenuItems(_curNetCard); @@ -189,7 +189,7 @@ public partial class MainForm : Form IntPtr pt = new IntPtr(); if (NetTunnelLib.GetUserClientConfigure(args.HashArgs["UserName"] as string, - args.HashArgs["Password"] as string, + "1689189114026041344", out pt) == 0) { IntPtr p = new IntPtr(pt.ToInt64()); @@ -334,21 +334,22 @@ public partial class MainForm : Form private void menuControlSvrStop_Click(object sender, EventArgs e) { - var ret = NetTunnelLib.RemoteWireGuardControl(false); - - if (ret != 0) - { - MessageBox.Show("RemoteWireGuardControl Error: " + ret.ToString()); - return; - } - - ret = NetTunnelLib.LocalWireGuardControl(false); + var ret = NetTunnelLib.LocalWireGuardControl(false); if (ret != 0) { MessageBox.Show("LocalWireGuardControl Error: " + ret.ToString()); return; } + + ret = NetTunnelLib.RemoteWireGuardControl(false); + + + if (ret != 0) + { + MessageBox.Show("RemoteWireGuardControl Error: " + ret.ToString()); + return; + } } private void menuControlHeartStart_Click(object sender, EventArgs e) diff --git a/NetTunnelSDK/UserManager.cpp b/NetTunnelSDK/UserManager.cpp index 581eb4b..d15c398 100644 --- a/NetTunnelSDK/UserManager.cpp +++ b/NetTunnelSDK/UserManager.cpp @@ -233,7 +233,7 @@ int RemoteCtrlSvrCfgUserTunnel(int vmId, const TCHAR *pCliNetwork) { GetIpV4InfoFromCIDR(pUserCfg->cliAddress, &ipInfo); req.msgContent.cliTunnelAddr = ipInfo.ip; - GetGlobalCfgInfo()->curConnVmId = vmId; + GetGlobalCfgInfo()->curConnVmId = vmId; SPDLOG_DEBUG(TEXT("Current VMID: {0}"), vmId); // 连接到服务端控制服务 @@ -404,8 +404,13 @@ int GetUserServerConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_SE PUSER_CONFIG pUser = &GetGlobalCfgInfo()->userCfg; PUSER_SERVER_CONFIG pUserCfg = &pUser->svrConfig; +#if USER_REAL_PLATFORM ProtocolRequest req; ProtocolResponse rsp; +#else + PlatformReqServerCfgParms req; + PlatformRspServerCfgParams rsp; +#endif if (pSvrCfg == nullptr) { SPDLOG_ERROR(TEXT("Input pSvrCfg params error")); @@ -426,6 +431,7 @@ int GetUserServerConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_SE StringCbCopy(pUser->userToken, MAX_PATH, pToken); +#if USER_REAL_PLATFORM req.msgContent.token = pToken; req.msgContent.user = pUser->userName; @@ -439,6 +445,26 @@ int GetUserServerConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_SE StringCbCopy(pUserCfg->svrPrivateKey, 64, rsp.msgContent.svrPrivateKey.c_str()); StringCbCopy(pUserCfg->svrAddress, MAX_IP_LEN, rsp.msgContent.svrAddress.c_str()); +#else + req.vmIp = pToken; + ret = PlatformProtolPostMessage(GET_SERVERCFG_PATH, &req, &rsp); + + if (ret != ERR_SUCCESS) { + return ret; + } + + ret = strtol(rsp.code.c_str(), nullptr, 10); + + if (ret != 0) { + SPDLOG_ERROR(TEXT("Server response error code: {0}"), ret); + return -ERR_HTTP_SERVER_RSP; + } + + pUserCfg->svrListenPort = rsp.data.svrPort; + StringCbCopy(pUserCfg->svrPrivateKey, 64, rsp.data.svrPriKey.c_str()); + StringCbCopy(pUserCfg->svrAddress, MAX_IP_LEN, rsp.data.svrHost.c_str()); +#endif + *pSvrCfg = pUserCfg; return ERR_SUCCESS; } @@ -449,8 +475,13 @@ int GetUserClientConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_CL TCHAR userPath[MAX_PATH]; int ret; +#if USER_REAL_PLATFORM ProtocolRequest req; ProtocolResponse rsp; +#else + PlatformReqClientCfgParms req; + PlatformRspClientCfgParams rsp; +#endif if (pUserName == nullptr || lstrlen(pUserName) == 0) { SPDLOG_ERROR(TEXT("Input pUserName params error: {0}"), pUserName); @@ -482,6 +513,7 @@ int GetUserClientConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_CL } StringCbCopy(pUser->userToken, MAX_PATH, pToken); +#if USER_REAL_PLATFORM req.msgContent.token = pToken; req.msgContent.user = pUserName; @@ -490,7 +522,7 @@ int GetUserClientConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_CL if (ret != ERR_SUCCESS) { return ret; } - + StringCbCopy(pUserCfg->cliPrivateKey, 64, rsp.msgContent.cliPrivateKey.c_str()); StringCbCopy(pUserCfg->cliPublicKey, 64, rsp.msgContent.cliPublicKey.c_str()); StringCbCopy(pUserCfg->cliAddress, MAX_IP_LEN, rsp.msgContent.cliAddress.c_str()); @@ -523,7 +555,55 @@ int GetUserClientConfigure(const TCHAR *pUserName, const TCHAR *pToken, PUSER_CL pVm++; } } +#else + req.userName = pUserName; + req.token = pToken; + ret = PlatformProtolPostMessage(GET_CLIENTCFG_PATH, &req, &rsp); + + if (ret != ERR_SUCCESS) { + return ret; + } + + ret = strtol(rsp.code.c_str(), nullptr, 10); + + if (ret != 0) { + SPDLOG_ERROR(TEXT("Server response error code: {0}"), ret); + return -ERR_HTTP_SERVER_RSP; + } + + StringCbCopy(pUserCfg->cliPrivateKey, 64, rsp.data.cliPriKey.c_str()); + StringCbCopy(pUserCfg->cliPublicKey, 64, rsp.data.cliPubKey.c_str()); + StringCbCopy(pUserCfg->cliAddress, MAX_IP_LEN, rsp.data.cliHost.c_str()); + + if (!rsp.data.vmInfoList.empty()) { + PVM_CFG pVm; + unsigned int memSize = sizeof(VM_CFG) * static_cast(rsp.data.vmInfoList.size()); + pUserCfg->pVMConfig = static_cast(CoTaskMemAlloc(memSize)); + if (pUserCfg->pVMConfig == nullptr) { + SPDLOG_ERROR(TEXT("Error allocating memory {0} bytes"), memSize); + return -ERR_MALLOC_MEMORY; + } + + memset(pUserCfg->pVMConfig, 0, memSize); + + pUserCfg->tolVM = static_cast(rsp.data.vmInfoList.size()); + pVm = pUserCfg->pVMConfig; + + for (auto vm : rsp.data.vmInfoList) { + pVm->vmId = vm.vmId; + StringCbCopy(pVm->vmName, MAX_PATH, vm.vmName.c_str()); + StringCbCopy(pVm->svrPublicKey, 64, vm.svrPubKey.c_str()); + StringCbCopy(pVm->vmNetwork, MAX_IP_LEN, vm.vmNetwork.c_str()); + //StringCbCopy(pVm->scgGateWay, MAX_PATH, vm.scgGateway.c_str()); + StringCbPrintf(pVm->scgGateWay, MAX_PATH, TEXT("http://%s:%d"), vm.scgIp.c_str(), vm.scgPort); + httplib::Client cli(pVm->scgGateWay); + StringCbPrintf(pVm->scgTunnelGw, MAX_PATH, TEXT("%s:%d"), cli.host().c_str(), cli.port() - 1); + pVm++; + } + } + +#endif *pCliCfg = pUserCfg; return ERR_SUCCESS; } diff --git a/NetTunnelSDK/include/ProtocolBase.h b/NetTunnelSDK/include/ProtocolBase.h index b9beaea..c96bece 100644 --- a/NetTunnelSDK/include/ProtocolBase.h +++ b/NetTunnelSDK/include/ProtocolBase.h @@ -1,6 +1,8 @@ #pragma once #include "AIGCJson.hpp" +#define USER_REAL_PLATFORM (0) + class ProtocolBase { public: ProtocolBase() { @@ -15,8 +17,8 @@ public: AIGC_JSON_HELPER(ver, cryptoType, timeStamp) - void SetVersion(unsigned int ver) { - this->ver = ver; + void SetVersion(unsigned int versino) { + this->ver = versino; } void SetTimeStamp(unsigned int ts) { @@ -24,7 +26,7 @@ public: } void SetCryptoType(unsigned int crypto) { - this->cryptoType = cryptoType; + this->cryptoType = crypto; } }; diff --git a/NetTunnelSDK/include/common.h b/NetTunnelSDK/include/common.h index e00315a..8037c5e 100644 --- a/NetTunnelSDK/include/common.h +++ b/NetTunnelSDK/include/common.h @@ -25,6 +25,15 @@ */ #define MAX_NETCARD_NAME (64) +/** + * @brief SCG 服务 ID + * + */ +typedef enum { + WG_TUNNEL_SCG_ID = 3, ///< 隧道服务 + WG_CTRL_SCG_ID = 4 ///< 隧道控制服务 +} SCG_SVR_ID; + /** * @brief 协议加密类型 * diff --git a/NetTunnelSDK/include/framework.h b/NetTunnelSDK/include/framework.h index 612dab5..54b7315 100644 --- a/NetTunnelSDK/include/framework.h +++ b/NetTunnelSDK/include/framework.h @@ -1,5 +1,7 @@ #pragma once #define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 +#define CPPHTTPLIB_OPENSSL_SUPPORT + // Windows 头文件 #include diff --git a/NetTunnelSDK/include/protocol.h b/NetTunnelSDK/include/protocol.h index 2b81e15..e134712 100644 --- a/NetTunnelSDK/include/protocol.h +++ b/NetTunnelSDK/include/protocol.h @@ -1,6 +1,94 @@ #pragma once #include "ProtocolBase.h" +#if !USER_REAL_PLATFORM +class PlatformReqServerCfgParms { +public: + std::string vmIp; + AIGC_JSON_HELPER(vmIp) +}; + +class PlatformReqClientCfgParms { +public: + std::string userName; + std::string token; + AIGC_JSON_HELPER(userName) +}; + +class PlatformRspUserSvrCfgParams { +public: + PlatformRspUserSvrCfgParams() { + this->svrHost = TEXT(""); + this->svrPort = 0; + this->svrPriKey = TEXT(""); + } + + int svrPort; + std::string svrPriKey; + std::string svrHost; + + AIGC_JSON_HELPER(svrPort, svrPriKey, svrHost) +}; + +class VitrualMathineInfo { +public: + VitrualMathineInfo() { + this->vmId = 0; + this->scgPort = 0; + this->vmName = TEXT(""); + this->scgIp = TEXT(""); + this->vmNetwork = TEXT(""); + this->svrPubKey = TEXT(""); + } + + int vmId; + std::string vmName; + std::string svrPubKey; + std::string vmNetwork; + std::string scgIp; + int scgPort; + + AIGC_JSON_HELPER(vmId, vmName, svrPubKey, vmNetwork, scgIp, scgPort) +}; + +class PlatformRspUserClientCfgParams { +public: + PlatformRspUserClientCfgParams() { + this->scgTunnelAppId = WG_TUNNEL_SCG_ID; + this->scgCtrlAppId = WG_CTRL_SCG_ID; + this->cliHost = TEXT(""); + } + + int scgCtrlAppId; + int scgTunnelAppId; + std::string cliPriKey; + std::string cliPubKey; + std::string cliHost; + std::list vmInfoList; + + AIGC_JSON_HELPER(scgCtrlAppId, scgTunnelAppId, cliPriKey, cliPubKey, vmInfoList, cliHost) +}; + +class PlatformRspServerCfgParams { +public: + std::string code; + std::string message; + PlatformRspUserSvrCfgParams data; + + AIGC_JSON_HELPER(code, data) +}; + +class PlatformRspClientCfgParams { +public: + std::string code; + std::string message; + PlatformRspUserClientCfgParams data; + + AIGC_JSON_HELPER(code, data) +}; + +#endif + class ReqClientCfgParams { public: std::string identifier; @@ -102,8 +190,13 @@ public: AIGC_JSON_HELPER(scgCtrlAppId, scgTunnelAppId, cliPrivateKey, cliPublicKey, cliAddress, vmConfig) }; -#define GET_CLIENTCFG_PATH TEXT("/tunnel/getuserconfig") -#define GET_SERVERCFG_PATH TEXT("/tunnel/getserverconfig") +#if USER_REAL_PLATFORM +#define GET_CLIENTCFG_PATH TEXT("/tunnel/getuserconfig") +#define GET_SERVERCFG_PATH TEXT("/tunnel/getserverconfig") +#else +#define GET_CLIENTCFG_PATH TEXT("/sc/open-portal/openapi/scc/cliTunnelCfg") +#define GET_SERVERCFG_PATH TEXT("/sc/open-portal/openapi/scc/svrTunnelCfg") +#endif #define SET_CLIENTCFG_PATH TEXT("/tunnel/setconfig") #define SET_CLIENTSTART_TUNNEL TEXT("/tunnel/start") @@ -156,4 +249,23 @@ extern template int ProtolPostMessage(const TCHAR *pUr extern template int ProtolPostMessage(const TCHAR *pUrlPath, ProtocolRequest *pReq, ProtocolResponse *pRsp, - bool platformServer); \ No newline at end of file + bool platformServer); + +#if !USER_REAL_PLATFORM +template int PlatformProtolPostMessage(const TCHAR *pUrlPath, T1 *pReq, T2 *pRsp); + +extern template int PlatformProtolPostMessage(const TCHAR *pUrlPath, + PlatformReqServerCfgParms *pReq, + PlatformRspServerCfgParams *pRsp); + +extern template int PlatformProtolPostMessage(const TCHAR *pUrlPath, + PlatformReqClientCfgParms *pReq, + PlatformRspClientCfgParams *pRsp); + +#if 0 +template int PlatformProtolGetMessage(const TCHAR *pUrlPath, T1 *pRsp); + +extern template int PlatformProtolGetMessage(const TCHAR *pUrlPath, + PlatformRspUserClientCfgParams *pRsp); +#endif +#endif \ No newline at end of file diff --git a/NetTunnelSDK/include/resource.h b/NetTunnelSDK/include/resource.h index 8778149..0e59447 100644 --- a/NetTunnelSDK/include/resource.h +++ b/NetTunnelSDK/include/resource.h @@ -2,15 +2,15 @@ // Microsoft Visual C++ ɵİļ // NetTunnelSDK.rc ʹ // -#define IDR_TXT1 105 +#define IDR_TXT1 105 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 106 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 +#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/NetTunnelSDK/include/tunnel.h b/NetTunnelSDK/include/tunnel.h index 84ae5ef..8004a47 100644 --- a/NetTunnelSDK/include/tunnel.h +++ b/NetTunnelSDK/include/tunnel.h @@ -1,11 +1,6 @@ #pragma once #include "sccsdk.h" -typedef enum { - WG_TUNNEL_SCG_ID = 3, - WG_CTRL_SCG_ID = 4 -} SCG_SVR_ID; - typedef enum { CHK_SYSTEM_INIT, CHK_WIREGUARD_CONFIG, diff --git a/NetTunnelSDK/include/user.h b/NetTunnelSDK/include/user.h index 972afe8..1e1b80d 100644 --- a/NetTunnelSDK/include/user.h +++ b/NetTunnelSDK/include/user.h @@ -45,7 +45,7 @@ int SetTunnelConfigure(const TCHAR *pCliPrivateKey, const TCHAR *pSvrNetwork, const TCHAR *pCliNetwork, const TCHAR *pSvrTunnelAddr, - const TCHAR *pSvrEndPoint); + const TCHAR *pSvrEndPoint); int GetUserConfigFiles(const TCHAR *pUserName, PUSER_CFGFILE* pCfgFile, int *pItems); diff --git a/NetTunnelSDK/protocol/protocol.cpp b/NetTunnelSDK/protocol/protocol.cpp index 2ab7195..2e1f2fe 100644 --- a/NetTunnelSDK/protocol/protocol.cpp +++ b/NetTunnelSDK/protocol/protocol.cpp @@ -219,6 +219,190 @@ int ProtolPostMessage(const TCHAR *pUrlPath, return ERR_SUCCESS; } +#if 0 +template int PlatformProtolGetMessage(const TCHAR *pUrlPath, T1 *pRsp) { + httplib::Result res; + TCHAR *pJson = nullptr; + std::string timestamp = std::to_string(time(nullptr)) + "000"; + TCHAR hashValeu[MAX_PATH] = {0}; + TCHAR hashBuf[1024] = {}; + + if (lstrlen(GetGlobalCfgInfo()->platformServerUrl) == 0) { + SPDLOG_ERROR(TEXT("Platform Server URL uninitialize.")); + return -ERR_SYSTEM_UNINITIALIZE; + } + + if (pRsp == nullptr) { + SPDLOG_ERROR(TEXT("Input ProtocolResponse *pRsp params error")); + return -ERR_INPUT_PARAMS; + } + + StringCbPrintf(hashBuf, + 1024, + TEXT("%s|%s|%s|%s"), + GetGlobalCfgInfo()->clientId, + GetGlobalCfgInfo()->clientSecret, + timestamp.c_str(), + pJson); + + if (lstrlen(GetGlobalCfgInfo()->clientSecret) > 0 && + CalcHmacHash(HASH_SHA256, + reinterpret_cast(hashBuf), + lstrlen(hashBuf), + reinterpret_cast(GetGlobalCfgInfo()->clientSecret), + lstrlen(GetGlobalCfgInfo()->clientSecret), + hashValeu, + true) == ERR_SUCCESS) { + const httplib::Headers headers = { + {"gzs-client-id", GetGlobalCfgInfo()->clientId}, + {"gzs-sign", hashValeu }, + {"gzs-timestamp", timestamp }, + }; + res = g_httpCtx->Get(pUrlPath, headers); + } else { + res = g_httpCtx->Get(pUrlPath); + } + + if (res.error() != httplib::Error::Success) { + SPDLOG_ERROR(TEXT("[{0}]:Post Data {1} error: {2}"), pUrlPath, pJson, httplib::to_string(res.error())); + free(pJson); + return -ERR_HTTP_POST_DATA; + } + + if (res->status != 200) { + SPDLOG_ERROR(TEXT("[{0}]:Post Data {1} server return HTTP error: {2}"), pUrlPath, pJson, res->status); + free(pJson); + return -ERR_HTTP_SERVER_RSP; + } + + SPDLOG_DEBUG(TEXT("+++++ Http Request {0}\n---- Http Response {1}"), pJson, res->body.c_str()); + + free(pJson); + + if (lstrlen(res->body.c_str()) == 0) { + SPDLOG_ERROR(TEXT("Server response empty message")); + return -ERR_READ_FILE; + } + + if (DecodeProtocolResponse(pRsp, res->body.c_str()) != ERR_SUCCESS) { + SPDLOG_ERROR(TEXT("Decode JSON {0} to ProtocolResponse<{1}> error"), res->body, typeid(T1).name()); + return -ERR_JSON_DECODE; + } + + return ERR_SUCCESS; +} +#endif + +template int PlatformProtolPostMessage(const TCHAR *pUrlPath, T1 *pReq, T2 *pRsp) { + int ret; + httplib::Result res; + TCHAR *pJson = nullptr; + std::string timestamp = std::to_string(time(nullptr)) + "000"; + TCHAR hashValeu[MAX_PATH] = {0}; + TCHAR hashBuf[1024] = {}; + + if (lstrlen(GetGlobalCfgInfo()->platformServerUrl) == 0) { + SPDLOG_ERROR(TEXT("Platform Server URL uninitialize.")); + return -ERR_SYSTEM_UNINITIALIZE; + } + + if (pReq == nullptr) { + SPDLOG_ERROR(TEXT("Input pToken params error")); + SPDLOG_ERROR(TEXT("Input ProtocolRequest *pReq params error")); + return -ERR_INPUT_PARAMS; + } + + if (pRsp == nullptr) { + SPDLOG_ERROR(TEXT("Input ProtocolResponse *pRsp params error")); + return -ERR_INPUT_PARAMS; + } + + ret = CreateProtocolRequest(pReq, &pJson); + + if (ret != ERR_SUCCESS) { + if (pJson) { + free(pJson); + } + return ret; + } + + StringCbPrintf(hashBuf, + 1024, + TEXT("%s|%s|%s|%s"), + GetGlobalCfgInfo()->clientId, + GetGlobalCfgInfo()->clientSecret, + timestamp.c_str(), + pJson); + + if (lstrlen(GetGlobalCfgInfo()->clientSecret) > 0 && + CalcHmacHash(HASH_SHA256, + reinterpret_cast(hashBuf), + lstrlen(hashBuf), + reinterpret_cast(GetGlobalCfgInfo()->clientSecret), + lstrlen(GetGlobalCfgInfo()->clientSecret), + hashValeu, + true) == ERR_SUCCESS) { + + if (lstrcmp(typeid(T1).name(), TEXT("class PlatformReqClientCfgParms")) == 0) { + const auto *p = reinterpret_cast(pReq); + const httplib::Headers headers = { + {"gzs-client-id", GetGlobalCfgInfo()->clientId}, + {"gzs-sign", hashValeu }, + {"gzs-timestamp", timestamp }, + {"gzs-userid", p->token.c_str() }, + }; + + res = g_httpCtx->Post(pUrlPath, headers, pJson, HTTP_JSON_CONTENT); + } else { + const httplib::Headers headers = { + {"gzs-client-id", GetGlobalCfgInfo()->clientId}, + {"gzs-sign", hashValeu }, + {"gzs-timestamp", timestamp }, + }; + + res = g_httpCtx->Post(pUrlPath, headers, pJson, HTTP_JSON_CONTENT); + } + } else { + if (lstrcmp(typeid(T1).name(), TEXT("class PlatformReqClientCfgParms")) == 0) { + const auto *p = reinterpret_cast(pReq); + const httplib::Headers headers = { + {"gzs-userid", p->token.c_str()}, + }; + res = g_httpCtx->Post(pUrlPath, headers, pJson, HTTP_JSON_CONTENT); + } else { + res = g_httpCtx->Post(pUrlPath, pJson, HTTP_JSON_CONTENT); + } + } + + if (res.error() != httplib::Error::Success) { + SPDLOG_ERROR(TEXT("[{0}]:Post Data {1} error: {2}"), pUrlPath, pJson, httplib::to_string(res.error())); + free(pJson); + return -ERR_HTTP_POST_DATA; + } + + if (res->status != 200) { + SPDLOG_ERROR(TEXT("[{0}]:Post Data {1} server return HTTP error: {2}"), pUrlPath, pJson, res->status); + free(pJson); + return -ERR_HTTP_SERVER_RSP; + } + + SPDLOG_DEBUG(TEXT("+++++ Http Request {0}\n---- Http Response {1}"), pJson, res->body.c_str()); + + free(pJson); + + if (lstrlen(res->body.c_str()) == 0) { + SPDLOG_ERROR(TEXT("Server response empty message")); + return -ERR_READ_FILE; + } + + if (DecodeProtocolResponse(pRsp, res->body.c_str()) != ERR_SUCCESS) { + SPDLOG_ERROR(TEXT("Decode JSON {0} to ProtocolResponse<{1}> error"), res->body, typeid(T2).name()); + return -ERR_JSON_DECODE; + } + + return ERR_SUCCESS; +} + template int ProtolPostMessage(const TCHAR *pUrlPath, ProtocolRequest *pReq, ProtocolResponse *pRsp, @@ -242,4 +426,16 @@ template int ProtolPostMessage(const TCHAR *pUrlPath, template int ProtolPostMessage(const TCHAR *pUrlPath, ProtocolRequest *pReq, ProtocolResponse *pRsp, - bool platformServer); \ No newline at end of file + bool platformServer); + +#if !USER_REAL_PLATFORM +template int PlatformProtolPostMessage(const TCHAR *pUrlPath, + PlatformReqServerCfgParms *pReq, + PlatformRspServerCfgParams *pRsp); + +template int PlatformProtolPostMessage(const TCHAR *pUrlPath, + PlatformReqClientCfgParms *pReq, + PlatformRspClientCfgParams *pRsp); + +//template int PlatformProtolGetMessage(const TCHAR *pUrlPath, PlatformRspUserClientCfgParams *pRsp); +#endif \ No newline at end of file diff --git a/NetTunnelSDK/sdk/common.h b/NetTunnelSDK/sdk/common.h index 011d0a9..5a426aa 100644 --- a/NetTunnelSDK/sdk/common.h +++ b/NetTunnelSDK/sdk/common.h @@ -25,6 +25,15 @@ */ #define MAX_NETCARD_NAME (64) +/** + * @brief SCG ID + * + */ +typedef enum { + WG_TUNNEL_SCG_ID = 3, ///< + WG_CTRL_SCG_ID = 4 ///< Ʒ +} SCG_SVR_ID; + /** * @brief Э * diff --git a/NetTunnelSDK/tunnel/WireGuardService.cpp b/NetTunnelSDK/tunnel/WireGuardService.cpp index 8ab9a33..3f51e2e 100644 --- a/NetTunnelSDK/tunnel/WireGuardService.cpp +++ b/NetTunnelSDK/tunnel/WireGuardService.cpp @@ -35,7 +35,7 @@ int InitializeWireGuardLibrary() { TCHAR dllPath[MAX_PATH]; StringCbPrintf(dllPath, MAX_PATH, TEXT("%s\\wireguard.dll"), GetGlobalCfgInfo()->workDirectory); - if(!PathFileExists(dllPath)) { + if (!PathFileExists(dllPath)) { SPDLOG_ERROR(TEXT("WireGuard DLL Not Found: {0}"), dllPath); return -ERR_ITEM_UNEXISTS; } @@ -87,7 +87,7 @@ int GetWireGuradTunnelInfo(const TCHAR *pTunnelName) { SPDLOG_ERROR("Failed to get configuration: {0}", GetLastError()); } } - + return ERR_SUCCESS; } diff --git a/NetTunnelSDK/tunnel/tunnel.cpp b/NetTunnelSDK/tunnel/tunnel.cpp index 0908f05..42fadba 100644 --- a/NetTunnelSDK/tunnel/tunnel.cpp +++ b/NetTunnelSDK/tunnel/tunnel.cpp @@ -141,6 +141,7 @@ int TunnelSDKInitEnv(const TCHAR *pWorkDir, StringCbCat(g_globalConfig.configDirectory, MAX_PATH, "\\NetTunnel"); SPDLOG_DEBUG(TEXT("Configure directory: {0}."), g_globalConfig.configDirectory); + SPDLOG_DEBUG(TEXT("Platform Server: {}, Work Module: {}"), pSvrUrl, isWorkServer? TEXT("SERVER") : TEXT("Client")); // 如果配置目录不存在则自动创建 if (!PathFileExists(g_globalConfig.configDirectory)) { @@ -169,7 +170,7 @@ int TunnelSDKInitEnv(const TCHAR *pWorkDir, return -ERR_ITEM_UNEXISTS; } #endif - + return ERR_SUCCESS; } diff --git a/NetTunnelSDK/tunnel/wireguard.cpp b/NetTunnelSDK/tunnel/wireguard.cpp index 7a594d8..dfcfe01 100644 --- a/NetTunnelSDK/tunnel/wireguard.cpp +++ b/NetTunnelSDK/tunnel/wireguard.cpp @@ -35,7 +35,7 @@ int GetWireGuardWorkMode(bool *pIsWorkServer) { int WireGuardInstallDefaultServerService(bool bInstall) { TCHAR cfgVal[MAX_PATH]; - + GetPrivateProfileString(CFG_WIREGUARD_SECTION, CFG_WGCFG_PATH, TEXT(""), @@ -51,7 +51,7 @@ int WireGuardInstallDefaultServerService(bool bInstall) { StringCbCopy(svrName, MAX_PATH, cfgVal); PathStripPath(svrName); PathRemoveExtension(svrName); - + if (bInstall) { ret = WireGuardInstallServerService(cfgVal); //CreateWireGuardService(svrName, cfgVal); } else { @@ -103,14 +103,14 @@ int WireGuardInstallServerService(const TCHAR *pTunnelCfgPath) { } int WireGuardUnInstallServerService(const TCHAR *pTunnelName) { - // 卸载服务 - int ret; + // 卸载服务 + int ret; if (pTunnelName == nullptr || lstrlen(pTunnelName) == 0) { SPDLOG_ERROR(TEXT("Input pTunnelName params error")); return -ERR_INPUT_PARAMS; } - + if ((ret = RemoveGuardService(pTunnelName, true)) != ERR_SUCCESS) { SPDLOG_ERROR(TEXT("Stop WireGuard Service Error: {0}"), ret); return ret; diff --git a/NetTunnelServerApp/NetTunnelServerApp.cpp b/NetTunnelServerApp/NetTunnelServerApp.cpp index 304902c..3efca8b 100644 --- a/NetTunnelServerApp/NetTunnelServerApp.cpp +++ b/NetTunnelServerApp/NetTunnelServerApp.cpp @@ -8,8 +8,9 @@ int main() { PUSER_SERVER_CONFIG pSvrCfg; int ret; - - if ((ret = TunnelSDKInitEnv(nullptr, "http://xajhuang.com:9276", nullptr, LOG_DEBUG, true)) != ERR_SUCCESS) { + //https://xajhuang.com:9276 + //http://172.21.40.39:32549 + if ((ret = TunnelSDKInitEnv(nullptr, "http://172.21.40.39:32549", nullptr, LOG_DEBUG, true)) != ERR_SUCCESS) { wprintf(L"Init SCC SDK Error: %d\n", ret); return -1; } diff --git a/TestNetTunnelSDK/TestNetTunnelSDK.cpp b/TestNetTunnelSDK/TestNetTunnelSDK.cpp index 89f2cd8..b60a3c1 100644 --- a/TestNetTunnelSDK/TestNetTunnelSDK.cpp +++ b/TestNetTunnelSDK/TestNetTunnelSDK.cpp @@ -14,13 +14,13 @@ TEST_MODULE_INITIALIZE(ModuleInitialize) { Logger::WriteMessage("In Module Initialize"); Assert::AreEqual(0, TunnelSDKInitEnv(path, - "http://xajhuang.com:9276", + "http://172.21.40.39:32549", TEXT("C:\\Users\\HuangXin\\Documents\\development\\visual_studio\\tunnel_" "windows\\NetTunnelApp\\bin\\Debug\\utest.log"), LOG_TRACE, false)); - Assert::AreEqual(0, EnableVerifySignature(TEXT("123"), TEXT("123456"))); - Assert::AreEqual(0, EnableSCGProxy(true, TEXT("efc.xajhuang.com"), 10001)); + //Assert::AreEqual(0, EnableVerifySignature(TEXT("123"), TEXT("123456"))); + //Assert::AreEqual(0, EnableSCGProxy(true, TEXT("efc.xajhuang.com"), 10001)); } TEST_MODULE_CLEANUP(ModuleCleanup) { @@ -194,7 +194,7 @@ public: TEST_METHOD(TestUserLogin) { PUSER_CLIENT_CONFIG pCfg; - Assert::AreEqual(RET_OK, GetUserClientConfigure(TEXT("admin"), TEXT("123455"), &pCfg)); + Assert::AreEqual(RET_OK, GetUserClientConfigure(TEXT("admin"), TEXT("1689189114026041344"), &pCfg)); } TEST_METHOD(TestClientProgress) { @@ -209,13 +209,13 @@ public: //EnableSCGProxy(true, 10000); //Sleep(30 * 1000); - Assert::AreEqual(RET_OK, RemoteWireGuardControl(false)); Assert::AreEqual(RET_OK, LocalWireGuardControl(false, false)); + Assert::AreEqual(RET_OK, RemoteWireGuardControl(false)); } TEST_METHOD(TestClientProgressFree) { - Assert::AreEqual(RET_OK, RemoteWireGuardControl(false)); Assert::AreEqual(RET_OK, LocalWireGuardControl(false, false)); + Assert::AreEqual(RET_OK, RemoteWireGuardControl(false)); } TEST_METHOD(TestGetSDKErrorMessage) {