|
@@ -1,4 +1,7 @@
|
|
|
-#include "StdAfx.h"
|
|
|
+#include "stdafx.h"
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
+ #include <wincrypt.h>
|
|
|
+#endif // RVC_OS_WIN
|
|
|
#include "CenterSettingConn.h"
|
|
|
#include "Event.h"
|
|
|
#include <map>
|
|
@@ -8,7 +11,8 @@ using namespace std;
|
|
|
#include "mod_centersetting.h"
|
|
|
|
|
|
#include "fileutil.h"
|
|
|
-#pragma comment(lib, "crypt32.lib")
|
|
|
+#include "iniutil.h"
|
|
|
+#include "md5.h"
|
|
|
|
|
|
CCenterSettingConn::CCenterSettingConn(CEntityBase *pEntity)
|
|
|
: SpSecureClient(pEntity)
|
|
@@ -109,10 +113,17 @@ ErrorCodeEnum CCenterSettingConn::BeginPollConfig()
|
|
|
{
|
|
|
auto &fileInfo = it->second;
|
|
|
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
strncpy_s(pReq[nIndex].TerminalNo, sizeof(pReq[nIndex].TerminalNo), info.strTerminalID, _TRUNCATE);
|
|
|
strncpy_s(pReq[nIndex].MachineType, sizeof(pReq[nIndex].MachineType), info.strMachineType, _TRUNCATE);
|
|
|
strncpy_s(pReq[nIndex].Sites, sizeof(pReq[nIndex].Sites), it->first.c_str(), _TRUNCATE);
|
|
|
strncpy_s(pReq[nIndex].LastHash, sizeof(pReq[nIndex].LastHash), fileInfo.strFileHash, _TRUNCATE);
|
|
|
+#else
|
|
|
+ strncpy(pReq[nIndex].TerminalNo, info.strTerminalID, strlen(info.strTerminalID));
|
|
|
+ strncpy(pReq[nIndex].MachineType, info.strMachineType, strlen(info.strMachineType));
|
|
|
+ strncpy(pReq[nIndex].Sites, it->first.c_str(), it->first.length());
|
|
|
+ strncpy(pReq[nIndex].LastHash, fileInfo.strFileHash, strlen(fileInfo.strFileHash));
|
|
|
+#endif
|
|
|
|
|
|
nIndex++;
|
|
|
}
|
|
@@ -123,10 +134,16 @@ ErrorCodeEnum CCenterSettingConn::BeginPollConfig()
|
|
|
else
|
|
|
{
|
|
|
PollCfgReq req = {};
|
|
|
-
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
strncpy_s(req.TerminalNo, sizeof(req.TerminalNo), info.strTerminalID, _TRUNCATE);
|
|
|
strncpy_s(req.MachineType, sizeof(req.MachineType), info.strMachineType, _TRUNCATE);
|
|
|
- strncpy_s(req.Sites, sizeof(req.Sites),info.strSite, _TRUNCATE);
|
|
|
+ strncpy_s(req.Sites, sizeof(req.Sites), info.strSite, _TRUNCATE);
|
|
|
+#else
|
|
|
+ strncpy(req.TerminalNo, info.strTerminalID, strlen(info.strTerminalID));
|
|
|
+ strncpy(req.MachineType, info.strMachineType, strlen(info.strMachineType));
|
|
|
+ strncpy(req.Sites, info.strSite, strlen(info.strSite));
|
|
|
+#endif
|
|
|
+
|
|
|
|
|
|
pPackage->AddStruct("PollReq", false, false, (BYTE*)&req, sizeof(PollCfgReq));
|
|
|
}
|
|
@@ -176,11 +193,14 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
|
|
|
Dbg("center config changed, hash: %s, file: %s", (const char*)pRet->FileHash, (const char*)pRet->FileName);
|
|
|
|
|
|
// 校验Hash是否匹配
|
|
|
+ //BYTE md5digest[16] = {};
|
|
|
+ //if(0 != md5(md5digest, (BYTE*)pRet->FileContent, nRetLen - sizeof(PollCfgRet)))
|
|
|
+
|
|
|
BYTE md5[16] = {};
|
|
|
if (!MD5Hash((BYTE*)pRet->FileContent, nRetLen - sizeof(PollCfgRet), md5))
|
|
|
{
|
|
|
- delete pBuf;
|
|
|
Dbg("compute md5 hash fail");
|
|
|
+ delete[] pBuf;
|
|
|
return Error_Unexpect;
|
|
|
}
|
|
|
|
|
@@ -190,8 +210,8 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
|
|
|
|
|
|
if (stricmp(strHash, pRet->FileHash) != 0)
|
|
|
{
|
|
|
- delete pBuf;
|
|
|
Dbg("computed hash [%s] != return hash [%s]", (const char*)strHash, pRet->FileHash);
|
|
|
+ delete[] pBuf;
|
|
|
return Error_Unexpect;
|
|
|
}
|
|
|
|
|
@@ -199,7 +219,7 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
|
|
|
assert(pFunc != NULL);
|
|
|
CSimpleStringA strPath;
|
|
|
pFunc->GetPath("Cfg", strPath);
|
|
|
- CSimpleStringA strCurFile = CSimpleStringA::Format("%s\\%s", (const char*)strPath, pRet->FileName);
|
|
|
+ CSimpleStringA strCurFile = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)pRet->FileName);
|
|
|
|
|
|
// 保存新配置文件
|
|
|
CSimpleStringA strNewFile = strCurFile + ".new";
|
|
@@ -210,51 +230,65 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
|
|
|
|
|
|
if (nLen < nRetLen - sizeof(PollCfgRet))
|
|
|
{
|
|
|
- delete pBuf;
|
|
|
Dbg("save %s fail, fwrite len: %d, act len: %d", pRet->FileName, nLen, nRetLen - sizeof(PollCfgRet));
|
|
|
+ delete[] pBuf;
|
|
|
return Error_Unexpect;
|
|
|
}
|
|
|
|
|
|
// 检测新集中配置地址是否可用
|
|
|
char tmp[32] = {};
|
|
|
- if (GetPrivateProfileStringA("CenterSetting", "Server", "", tmp, 32, strNewFile) < 10)
|
|
|
+ if(inifile_read_str_s("CenterSetting", "Server", "", tmp, 32, strNewFile) < 10)
|
|
|
{
|
|
|
- delete pBuf;
|
|
|
- Dbg("read center setting service addr from %s fail", pRet->FileName);
|
|
|
+ Dbg("read center setting service addr from %s fail", (const char*)strNewFile);
|
|
|
+ delete[] pBuf;
|
|
|
return Error_Unexpect;
|
|
|
}
|
|
|
|
|
|
if (!IsServiceAvailable(tmp))
|
|
|
{
|
|
|
- //delete pBuf;
|
|
|
+ //delete[] pBuf;
|
|
|
Dbg("集中配置服务新地址[%s]无法连接!!!", tmp);
|
|
|
//return Error_Unexpect;
|
|
|
}
|
|
|
|
|
|
// 读出当前集中配置服务地址
|
|
|
memset(tmp, 0, 32);
|
|
|
- GetPrivateProfileStringA("CenterSetting", "Server", "", tmp, 32, strCurFile);
|
|
|
+ inifile_read_str_s("CenterSetting", "Server", "", tmp, 32, strCurFile);
|
|
|
CSimpleStringA strCurServer = tmp;
|
|
|
|
|
|
// 写入同步信息
|
|
|
- WritePrivateProfileStringA("Main", "LastServer", strCurServer, strNewFile);
|
|
|
+ inifile_write_str(strNewFile, "Main", "LastServer", strCurServer);
|
|
|
+ //WritePrivateProfileStringA("Main", "LastServer", strCurServer, strNewFile);
|
|
|
DWORD dwSyncTime = CSmallDateTime::GetNow();
|
|
|
sprintf_s(tmp, sizeof(tmp), "0x%X", dwSyncTime);
|
|
|
- WritePrivateProfileStringA("Main", "SyncTime", tmp, strNewFile);
|
|
|
- WritePrivateProfileStringA("Main", "SyncHash", pRet->FileHash, strNewFile);
|
|
|
- WritePrivateProfileStringA("Main", "SyncFile", pRet->FileName, strNewFile);
|
|
|
+
|
|
|
+ //WritePrivateProfileStringA("Main", "SyncTime", tmp, strNewFile);
|
|
|
+ //WritePrivateProfileStringA("Main", "SyncHash", pRet->FileHash, strNewFile);
|
|
|
+ //WritePrivateProfileStringA("Main", "SyncFile", pRet->FileName, strNewFile);
|
|
|
+ inifile_write_str(strNewFile, "Main", "SyncTime", tmp);
|
|
|
+ inifile_write_str(strNewFile, "Main", "SyncHash", pRet->FileHash);
|
|
|
+ inifile_write_str(strNewFile, "Main", "SyncFile", pRet->FileName);
|
|
|
|
|
|
// 保存原配置文件
|
|
|
- SYSTEMTIME st = {};
|
|
|
- GetLocalTime(&st);
|
|
|
+
|
|
|
+ time_t t = time(NULL);
|
|
|
+ tm* t1 = localtime(&t);
|
|
|
+
|
|
|
+ //SYSTEMTIME st = {};
|
|
|
+ //GetLocalTime(&st);
|
|
|
+ //CSimpleStringA strBackFile = CSimpleStringA::Format("%s.%04d%02d%02d%02d%02d", (const char*)strCurFile,
|
|
|
+ // st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);
|
|
|
CSimpleStringA strBackFile = CSimpleStringA::Format("%s.%04d%02d%02d%02d%02d", (const char*)strCurFile,
|
|
|
- st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);
|
|
|
- CopyFileA(strCurFile, strBackFile, FALSE);
|
|
|
+ t1->tm_year + 1900, t1->tm_mon + 1, t1->tm_mday, t1->tm_hour, t1->tm_min);
|
|
|
+ fileutil_copy_file(strBackFile, strCurFile);
|
|
|
+ //CopyFileA(strCurFile, strBackFile, FALSE);
|
|
|
|
|
|
// 替换当前配置文件
|
|
|
- CopyFileA(strNewFile, strCurFile, FALSE);
|
|
|
- DeleteFileA(strNewFile);
|
|
|
- Dbg("save config %s succ", pRet->FileName);
|
|
|
+ fileutil_copy_file(strCurFile, strNewFile);
|
|
|
+ //CopyFileA(strNewFile, strCurFile, FALSE);
|
|
|
+ fileutil_delete_file(strNewFile);
|
|
|
+ //DeleteFileA(strNewFile);
|
|
|
+ Dbg("save config %s succ", (const char*)pRet->FileName);
|
|
|
|
|
|
// 保存同步信息
|
|
|
CCenterSettingEntity::ConfigFileInfo info;
|
|
@@ -263,10 +297,12 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
|
|
|
info.strFileName = pRet->FileName;
|
|
|
|
|
|
CSimpleStringA str1, str2;
|
|
|
- if (pEntity->ExtractSiteFromFileName(info.strFileName, str1, str2))
|
|
|
+ if (pEntity->TryExtractSiteFromFileName(info.strFileName, str1, str2))
|
|
|
+ {
|
|
|
pEntity->m_SyncFileInfo[(const char*)str2] = info;
|
|
|
+ }
|
|
|
|
|
|
- delete pBuf;
|
|
|
+ delete[] pBuf;
|
|
|
pBuf = NULL;
|
|
|
} // end while
|
|
|
|
|
@@ -280,8 +316,7 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
|
|
|
|
|
|
// 缓存当前RVCWeb版本
|
|
|
char szVersion[64] = {};
|
|
|
- ::GetPrivateProfileStringA("IEBrowser", "RvcWebVersion", "", szVersion, 64, strFilePath);
|
|
|
-
|
|
|
+ inifile_read_str_s("IEBrowser", "RvcWebVersion", "", szVersion, 64, strFilePath);
|
|
|
if (strcmp(szVersion, pEntity->m_strRvcWebVersion) != 0)
|
|
|
{
|
|
|
Dbg("rvc web version changed, last: [%s], current: [%s]", (const char*)pEntity->m_strRvcWebVersion, szVersion);
|
|
@@ -295,17 +330,27 @@ ErrorCodeEnum CCenterSettingConn::OnEndPollConfig(const CSmartPointer<IPackage>
|
|
|
|
|
|
bool CCenterSettingConn::MD5Hash(BYTE *pData, int nDataLen, BYTE hash[16])
|
|
|
{
|
|
|
+
|
|
|
+#if !defined(RVC_OS_WIN)
|
|
|
+ md5_ctx_t ctx;
|
|
|
+ md5_init(&ctx);
|
|
|
+ if (0 != md5_update(&ctx, pData, nDataLen))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (0 != md5_final(hash, &ctx))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
+#else
|
|
|
bool bRet = false;
|
|
|
HCRYPTPROV hCryptProv;
|
|
|
if (CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)) {
|
|
|
int rc = Error_Unexpect;
|
|
|
HCRYPTHASH hHash;
|
|
|
- if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
|
|
|
- {
|
|
|
+ if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)) {
|
|
|
if (!CryptHashData(hHash, pData, nDataLen, 0))
|
|
|
Dbg("CryptHashData fail");
|
|
|
- else
|
|
|
- {
|
|
|
+ else {
|
|
|
DWORD dwLen = 16;
|
|
|
if (CryptGetHashParam(hHash, HP_HASHVAL, (LPBYTE)&hash[0], &dwLen, 0))
|
|
|
bRet = true;
|
|
@@ -322,6 +367,9 @@ bool CCenterSettingConn::MD5Hash(BYTE *pData, int nDataLen, BYTE hash[16])
|
|
|
else {
|
|
|
Dbg("CryptAcquireContextA failed");
|
|
|
}
|
|
|
-
|
|
|
return bRet;
|
|
|
+#endif // RVC_OS_WIN
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|