Fix: DateVerify causes master program UI blocked

This commit is contained in:
yuanyuanxiang
2025-12-17 21:59:03 +01:00
parent b4687bb1a2
commit 23564ef19f
2 changed files with 64 additions and 34 deletions

View File

@@ -1821,7 +1821,7 @@ std::string joinString(const std::vector<std::string>& tokens, char delimiter)
bool CMy2015RemoteDlg::CheckValid(int trail)
{
DateVerify verify;
static DateVerify verify;
BOOL isTrail = verify.isTrail(trail);
if (!isTrail) {

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <iostream>
#include <ctime>
@@ -6,7 +6,7 @@
#include <Windows.h>
#pragma comment(lib, "ws2_32.lib")
// <EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>NTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
// 中国大陆优化的NTP服务器列表
const char* CN_NTP_SERVERS[] = {
"ntp.aliyun.com",
"time1.aliyun.com",
@@ -19,18 +19,24 @@ const int CN_NTP_COUNT = sizeof(CN_NTP_SERVERS) / sizeof(CN_NTP_SERVERS[0]);
const int NTP_PORT = 123;
const uint64_t NTP_EPOCH_OFFSET = 2208988800ULL;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 检测程序是否处于试用期
class DateVerify
{
private:
// <20><>ʼ<EFBFBD><CABC>Winsock
bool m_hasVerified = false;
bool m_lastVerifyResult = true;
time_t m_lastVerifyLocalTime = 0;
time_t m_lastNetworkTime = 0;
static const int VERIFY_INTERVAL = 6 * 3600; // 6小时
// 初始化Winsock
bool initWinsock()
{
WSADATA wsaData;
return WSAStartup(MAKEWORD(2, 2), &wsaData) == 0;
}
// <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>NTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡʱ<EFBFBD><EFBFBD>
// 从指定NTP服务器获取时间
time_t getTimeFromServer(const char* server)
{
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
@@ -40,7 +46,7 @@ private:
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(NTP_PORT);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 解析主机名
hostent* host = gethostbyname(server);
if (!host) {
closesocket(sock);
@@ -48,22 +54,22 @@ private:
}
serverAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr_list[0]);
// <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ
DWORD timeout = 2000; // 2<EFBFBD>볬ʱ
// 设置超时
DWORD timeout = 2000; // 2秒超时
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
// ׼<EFBFBD><EFBFBD>NTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 准备NTP请求包
char ntpPacket[48] = { 0 };
ntpPacket[0] = 0x1B; // LI=0, VN=3, Mode=3
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 发送请求
if (sendto(sock, ntpPacket, sizeof(ntpPacket), 0,
(sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
closesocket(sock);
return 0;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
// 接收响应
if (recv(sock, ntpPacket, sizeof(ntpPacket), 0) <= 0) {
closesocket(sock);
return 0;
@@ -71,12 +77,12 @@ private:
closesocket(sock);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>NTPʱ<EFBFBD><EFBFBD>
// 解析NTP时间
uint32_t ntpTime = ntohl(*((uint32_t*)(ntpPacket + 40)));
return ntpTime - NTP_EPOCH_OFFSET;
}
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取网络时间(尝试多个服务器)
time_t getNetworkTimeInChina()
{
if (!initWinsock()) return 0;
@@ -93,7 +99,7 @@ private:
return result;
}
// <EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>дת<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1-12)
// 将月份缩写转换为数字(1-12)
int monthAbbrevToNumber(const std::string& month)
{
static const std::map<std::string, int> months = {
@@ -105,7 +111,7 @@ private:
return (it != months.end()) ? it->second : 0;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>__DATE__<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Ϊtm<EFBFBD>
// 解析__DATE__字符串为tm结构
tm parseCompileDate(const char* compileDate)
{
tm tmCompile = { 0 };
@@ -120,7 +126,7 @@ private:
return tmCompile;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 计算两个日期之间的天数差
int daysBetweenDates(const tm& date1, const tm& date2)
{
auto timeToTimePoint = [](const tm& tmTime) {
@@ -135,7 +141,7 @@ private:
return std::chrono::duration_cast<std::chrono::hours>(duration).count() / 24;
}
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 获取当前日期
tm getCurrentDate()
{
std::time_t now = std::time(nullptr);
@@ -146,24 +152,48 @@ private:
return tmNow;
}
// <EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
bool isLocalDateModified()
{
time_t networkTime = getNetworkTimeInChina();
if (networkTime == 0) {
return true; // <20>޷<EFBFBD><DEB7><EFBFBD>֤
}
// 验证本地日期是否被修改
bool isLocalDateModified()
{
time_t currentLocalTime = time(nullptr);
time_t localTime = time(nullptr);
double diffDays = difftime(networkTime, localTime) / 86400.0;
// 检查是否可以使用缓存
if (m_hasVerified) {
time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳٺ<D3B3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
if (fabs(diffDays) > 1.0) {
return true;
}
// 本地时间在合理范围内前进,使用缓存推算
if (localElapsed >= 0 && localElapsed < VERIFY_INTERVAL) {
time_t estimatedNetworkTime = m_lastNetworkTime + localElapsed;
double diffDays = difftime(estimatedNetworkTime, currentLocalTime) / 86400.0;
if (fabs(diffDays) <= 1.0) {
return false;
}
}
}
return false;
}
// 执行网络验证
time_t networkTime = getNetworkTimeInChina();
if (networkTime == 0) {
// 网络不可用:如果之前验证通过且本地时间没异常,暂时信任
if (m_hasVerified && !m_lastVerifyResult) {
time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime;
if (localElapsed >= -300 && localElapsed < 24 * 3600) {
return false;
}
}
return true;
}
// 更新缓存
m_hasVerified = true;
m_lastVerifyLocalTime = currentLocalTime;
m_lastNetworkTime = networkTime;
double diffDays = difftime(networkTime, currentLocalTime) / 86400.0;
m_lastVerifyResult = fabs(diffDays) > 1.0;
return m_lastVerifyResult;
}
public:
@@ -174,7 +204,7 @@ public:
tm tmCompile = parseCompileDate(__DATE__), tmCurrent = getCurrentDate();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 计算天数差
int daysDiff = daysBetweenDates(tmCompile, tmCurrent);
return daysDiff <= trailDays;