From cd3dca042d04eac03b4850b213f2dbba3f42f47a Mon Sep 17 00:00:00 2001 From: nikelaluo <2135665716@qq.com> Date: Wed, 1 Jul 2026 03:32:41 +0000 Subject: [PATCH] 1.0.0 --- .gitignore | 82 + client/.gitkeep | 0 client/Bootstrap/CMakeLists.txt | 6 + client/Bootstrap/main.cpp | 191 ++ client/CMakeLists.txt | 70 + client/Common/CMakeLists.txt | 32 + client/Common/ConfigHelper.cpp | 116 + client/Common/ConfigHelper.h | 16 + client/Common/FileHelper.cpp | 42 + client/Common/FileHelper.h | 14 + client/Common/HttpHelper.cpp | 49 + client/Common/HttpHelper.h | 17 + client/Common/LocalStateHelper.cpp | 147 + client/Common/LocalStateHelper.h | 33 + client/Common/PolicyHelper.cpp | 115 + client/Common/PolicyHelper.h | 32 + client/Launcher/CMakeLists.txt | 46 + client/Launcher/UpdateLogic.cpp | 114 + client/Launcher/UpdateLogic.h | 38 + client/Launcher/main.cpp | 143 + client/MainApp/CMakeLists.txt | 21 + client/MainApp/MainWindow.cpp | 72 + client/MainApp/MainWindow.h | 11 + client/MainApp/main.cpp | 110 + client/READMe.txt | 3 + client/Updater/CMakeLists.txt | 41 + client/Updater/UpdateTransaction.cpp | 269 ++ client/Updater/UpdateTransaction.h | 54 + client/Updater/UpdaterLogic.cpp | 670 ++++ client/Updater/UpdaterLogic.h | 69 + client/Updater/main.cpp | 325 ++ client/admin.html | 622 ++++ client/client.ini | 14 + client/config/app_config.example.json | 14 + client/config/local_state.json | 6 + client/config/manifest_public_key.pem | 9 + client/config/version_policy.dat | 1 + client/pdf_requirements.txt | 2943 +++++++++++++++++ ...自动升级与版本控制系统开发设计文档 v0.1.pdf | Bin 0 -> 721334 bytes client/项目进度.txt | 538 +++ server/db.py | 30 + server/keys/manifest_public_key.pem | 9 + server/main.py | 780 +++++ server/minio_tool.py | 93 + server/tables.sql | 65 + 45 files changed, 8072 insertions(+) create mode 100644 .gitignore create mode 100644 client/.gitkeep create mode 100644 client/Bootstrap/CMakeLists.txt create mode 100644 client/Bootstrap/main.cpp create mode 100644 client/CMakeLists.txt create mode 100644 client/Common/CMakeLists.txt create mode 100644 client/Common/ConfigHelper.cpp create mode 100644 client/Common/ConfigHelper.h create mode 100644 client/Common/FileHelper.cpp create mode 100644 client/Common/FileHelper.h create mode 100644 client/Common/HttpHelper.cpp create mode 100644 client/Common/HttpHelper.h create mode 100644 client/Common/LocalStateHelper.cpp create mode 100644 client/Common/LocalStateHelper.h create mode 100644 client/Common/PolicyHelper.cpp create mode 100644 client/Common/PolicyHelper.h create mode 100644 client/Launcher/CMakeLists.txt create mode 100644 client/Launcher/UpdateLogic.cpp create mode 100644 client/Launcher/UpdateLogic.h create mode 100644 client/Launcher/main.cpp create mode 100644 client/MainApp/CMakeLists.txt create mode 100644 client/MainApp/MainWindow.cpp create mode 100644 client/MainApp/MainWindow.h create mode 100644 client/MainApp/main.cpp create mode 100644 client/READMe.txt create mode 100644 client/Updater/CMakeLists.txt create mode 100644 client/Updater/UpdateTransaction.cpp create mode 100644 client/Updater/UpdateTransaction.h create mode 100644 client/Updater/UpdaterLogic.cpp create mode 100644 client/Updater/UpdaterLogic.h create mode 100644 client/Updater/main.cpp create mode 100644 client/admin.html create mode 100644 client/client.ini create mode 100644 client/config/app_config.example.json create mode 100644 client/config/local_state.json create mode 100644 client/config/manifest_public_key.pem create mode 100644 client/config/version_policy.dat create mode 100644 client/pdf_requirements.txt create mode 100644 client/软件自动升级与版本控制系统开发设计文档 v0.1.pdf create mode 100644 client/项目进度.txt create mode 100644 server/db.py create mode 100644 server/keys/manifest_public_key.pem create mode 100644 server/main.py create mode 100644 server/minio_tool.py create mode 100644 server/tables.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6095619 --- /dev/null +++ b/.gitignore @@ -0,0 +1,82 @@ +# Operating systems and editors +.DS_Store +Thumbs.db +Desktop.ini +.vscode/ +.idea/ +**/.vs/ +*.suo +*.user +*.userosscache +*.sln.docstates + +# Generic temporary files +*.tmp +*.temp +*.bak +*.swp +*.log + +# Client: CMake / Visual Studio build outputs +client/out/ +client/build/ +client/build-*/ +client/cmake-build-*/ +client/.cmake/ +client/CMakeSettings.json +client/CMakeUserPresets.json +client/Testing/ + +# Client: local runtime state and credentials +client/config/app_config.json +client/config/client_identity.dat +client/config/*.local.json +client/update/ +client/update_temp/ + +# C/C++ generated artifacts outside build directories +*.obj +*.o +*.pdb +*.ilk +*.idb +*.tlog +*.lastbuildstate +*.exp +*.lib +*.dll +*.exe + +# Keep source-controlled PEM public keys; never commit private keys +server/keys/*private*.pem +server/keys/*private*.key + +# Server: Python environments and caches +server/venv/ +server/.venv/ +server/__pycache__/ +server/**/*.py[cod] +server/.pytest_cache/ +server/.mypy_cache/ +server/.ruff_cache/ +server/.coverage +server/htmlcov/ + +# Server: local configuration and secrets +server/.env +server/.env.* +!server/.env.example +server/admin_token.sha256 + +# Server: runtime databases, uploads and object storage +server/*.db +server/*.db-journal +server/*.db-wal +server/*.db-shm +server/local_uploads/ +server/minio_data/ +server/minio + +# Server: runtime files +server/*.pid +server/*.log diff --git a/client/.gitkeep b/client/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/client/Bootstrap/CMakeLists.txt b/client/Bootstrap/CMakeLists.txt new file mode 100644 index 0000000..7b8e31c --- /dev/null +++ b/client/Bootstrap/CMakeLists.txt @@ -0,0 +1,6 @@ +project(Bootstrap LANGUAGES CXX) + +add_executable(Bootstrap WIN32 main.cpp) +target_compile_features(Bootstrap PRIVATE cxx_std_17) +target_compile_definitions(Bootstrap PRIVATE UNICODE _UNICODE) +target_link_libraries(Bootstrap PRIVATE shell32) diff --git a/client/Bootstrap/main.cpp b/client/Bootstrap/main.cpp new file mode 100644 index 0000000..592d6b6 --- /dev/null +++ b/client/Bootstrap/main.cpp @@ -0,0 +1,191 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace fs = std::filesystem; + +static std::wstring quote(const std::wstring& value) +{ + std::wstring result = L"\""; + unsigned backslashes = 0; + for (wchar_t ch : value) { + if (ch == L'\\') { ++backslashes; continue; } + if (ch == L'\"') { + result.append(backslashes * 2 + 1, L'\\'); + result.push_back(L'\"'); + backslashes = 0; + continue; + } + result.append(backslashes, L'\\'); + backslashes = 0; + result.push_back(ch); + } + result.append(backslashes * 2, L'\\'); + result.push_back(L'\"'); + return result; +} + +static std::wstring fromUtf8(const std::string& value) +{ + if (value.empty()) return {}; + const int size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, value.data(), + static_cast(value.size()), nullptr, 0); + if (size <= 0) return {}; + std::wstring result(size, L'\0'); + MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, value.data(), + static_cast(value.size()), result.data(), size); + return result; +} + +static bool safeRelative(const fs::path& path) +{ + if (path.empty() || path.is_absolute() || path.has_root_name()) return false; + for (const auto& part : path) + if (part == L"..") return false; + return true; +} + +static bool copyWithRetry(const fs::path& source, const fs::path& destination) +{ + std::error_code ec; + fs::create_directories(destination.parent_path(), ec); + for (int i = 0; i < 100; ++i) { + ec.clear(); + fs::copy_file(source, destination, fs::copy_options::overwrite_existing, ec); + if (!ec) return true; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + return false; +} + +static bool removeWithRetry(const fs::path& path) +{ + std::error_code ec; + for (int i = 0; i < 100; ++i) { + ec.clear(); + if (!fs::exists(path, ec)) return !ec; + if (fs::remove(path, ec)) return true; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + return false; +} + +static bool rollback(const fs::path& installDir, const fs::path& backupDir, + const std::vector& paths) +{ + bool success = true; + for (const auto& relative : paths) { + const fs::path destination = installDir / relative; + const fs::path backup = backupDir / relative; + std::error_code ec; + if (fs::exists(backup, ec)) { + if (!copyWithRetry(backup, destination)) success = false; + } else if (fs::exists(destination, ec) && !fs::remove(destination, ec)) { + success = false; + } + } + return success; +} + +static bool launchUpdater(const std::wstring& updater, const std::vector& updateArgs, + const std::wstring& result) +{ + std::wstring command = quote(updater); + for (const auto& arg : updateArgs) command += L" " + quote(arg); + command += L" " + quote(L"--bootstrap-resume=" + result); + STARTUPINFOW si{}; + si.cb = sizeof(si); + PROCESS_INFORMATION pi{}; + std::vector mutableCommand(command.begin(), command.end()); + mutableCommand.push_back(L'\0'); + const BOOL ok = CreateProcessW(updater.c_str(), mutableCommand.data(), nullptr, nullptr, + FALSE, 0, nullptr, fs::path(updater).parent_path().c_str(), &si, &pi); + if (ok) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } + return ok == TRUE; +} + +int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) +{ + int argc = 0; + LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); + if (!argv || argc < 11) { + MessageBoxW(nullptr, L"Bootstrap 参数不完整。", L"更新接管失败", MB_ICONERROR); + if (argv) LocalFree(argv); + return 2; + } + const fs::path planFile = argv[1]; + const fs::path installDir = argv[2]; + const fs::path stagingDir = argv[3]; + const fs::path backupDir = argv[4]; + const std::wstring updater = argv[5]; + const DWORD updaterPid = static_cast(_wtoi(argv[6])); + std::vector updateArgs{argv[7], argv[8], argv[9], argv[10]}; + const std::wstring mode = argc >= 12 ? argv[11] : L"install"; + LocalFree(argv); + + if (HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, updaterPid)) { + WaitForSingleObject(process, 30000); + CloseHandle(process); + } + + struct PlanItem { wchar_t operation; fs::path relative; }; + std::ifstream input(planFile, std::ios::binary); + std::vector items; + std::vector paths; + std::string line; + while (std::getline(input, line)) { + if (!line.empty() && line.back() == '\r') line.pop_back(); + if (line.size() < 3 || line[1] != '\t' || (line[0] != 'C' && line[0] != 'D')) { + MessageBoxW(nullptr, L"更新计划操作格式无效。", L"更新接管失败", MB_ICONERROR); + return 3; + } + const fs::path relative(fromUtf8(line.substr(2))); + if (!safeRelative(relative)) { + MessageBoxW(nullptr, L"更新计划包含不安全路径。", L"更新接管失败", MB_ICONERROR); + return 3; + } + items.push_back({static_cast(line[0]), relative}); + paths.push_back(relative); + } + + bool success = input.eof(); + bool rolledBack = false; + fs::path failedPath; + if (mode == L"rollback") { + rolledBack = success && rollback(installDir, backupDir, paths); + success = false; + } else if (success) { + for (const auto& item : items) { + const fs::path& relative = item.relative; + if (_wcsicmp(relative.filename().c_str(), L"Bootstrap.exe") == 0) { + success = false; + failedPath = relative; + break; + } + const bool itemOk = item.operation == L'C' + ? copyWithRetry(stagingDir / relative, installDir / relative) + : removeWithRetry(installDir / relative); + if (!itemOk) { + success = false; + failedPath = relative; + break; + } + } + if (!success) rolledBack = rollback(installDir, backupDir, paths); + } + + const std::wstring result = success ? L"success" : (rolledBack ? L"rolledback" : L"rollback-failed"); + if (!launchUpdater(updater, updateArgs, result)) { + std::wstring message = L"无法重新启动 Updater.exe。"; + if (!failedPath.empty()) message += L"\n失败文件:" + failedPath.wstring(); + MessageBoxW(nullptr, message.c_str(), L"更新接管失败", MB_ICONERROR); + return 4; + } + return (success || rolledBack) ? 0 : 5; +} diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt new file mode 100644 index 0000000..3ee01df --- /dev/null +++ b/client/CMakeLists.txt @@ -0,0 +1,70 @@ +cmake_minimum_required(VERSION 3.20) +project(ClientAll LANGUAGES C CXX) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +if(MSVC) + add_compile_options(/utf-8) +endif() +# Qt全局配置 +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_PREFIX_PATH "C:\\Qt\\5.15.2\\msvc2019_64" ${CMAKE_PREFIX_PATH}) +find_package(Qt5 REQUIRED COMPONENTS Core Network Gui Widgets) +# ========== OpenSSL 手动配置(完全抛弃find_package) ========== +set(OPENSSL_ROOT_DIR "C:/Program Files/OpenSSL-Win64") +set(OPENSSL_INC "${OPENSSL_ROOT_DIR}/include") +set(OPENSSL_LIB_DEBUG "${OPENSSL_ROOT_DIR}/lib/VC/x64/MDd") +set(OPENSSL_LIB_RELEASE "${OPENSSL_ROOT_DIR}/lib/VC/x64/MD") +# 全局宏,所有子项目统一启用OpenSSL +add_compile_definitions(HAVE_OPENSSL=1) +# ========================================================== +# 统一输出目录 +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/bin) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/bin) +# Bootstrap 不依赖 Qt,可在 Updater 退出后替换 Updater 与 Qt 运行库 +add_subdirectory(Bootstrap) +# 先编译公共库 +add_subdirectory(Common) +# 再编译三个业务程序 +add_subdirectory(Launcher) +add_subdirectory(Updater) +add_subdirectory(MainApp) +# 默认启动项目 +set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Launcher) +# Copy client.ini and config directory to output bin folder +set(APP_CONFIG_SOURCE_FILE "${CMAKE_SOURCE_DIR}/config/app_config.example.json") +set(CONFIG_SOURCE_DIR "${CMAKE_SOURCE_DIR}/config") +set(MANIFEST_PUBLIC_KEY_FILE "${CONFIG_SOURCE_DIR}/manifest_public_key.pem") +set(INI_TARGET_FOLDER "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") +# app_config.json 包含运行时版本状态;如果存在旧 client.ini,则交给客户端首次启动迁移 +file(MAKE_DIRECTORY "${INI_TARGET_FOLDER}") +file(MAKE_DIRECTORY "${INI_TARGET_FOLDER}/config") +if(NOT EXISTS "${INI_TARGET_FOLDER}/config/app_config.json" AND NOT EXISTS "${INI_TARGET_FOLDER}/client.ini") + configure_file("${APP_CONFIG_SOURCE_FILE}" "${INI_TARGET_FOLDER}/config/app_config.json" COPYONLY) +endif() +foreach(RUNTIME_RESOURCE local_state.json version_policy.dat) + if(NOT EXISTS "${INI_TARGET_FOLDER}/config/${RUNTIME_RESOURCE}") + configure_file("${CONFIG_SOURCE_DIR}/${RUNTIME_RESOURCE}" "${INI_TARGET_FOLDER}/config/${RUNTIME_RESOURCE}" COPYONLY) + endif() +endforeach() +# 编译阶段同步静态配置资源 +add_custom_target(copy_client_resources ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${INI_TARGET_FOLDER} + COMMAND ${CMAKE_COMMAND} -E make_directory ${INI_TARGET_FOLDER}/config + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MANIFEST_PUBLIC_KEY_FILE} ${INI_TARGET_FOLDER}/config/manifest_public_key.pem + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MANIFEST_PUBLIC_KEY_FILE} ${INI_TARGET_FOLDER}/manifest_public_key.pem + COMMENT "Copy client config directory and manifest public key to output bin folder" +) +add_dependencies(Launcher copy_client_resources) +add_dependencies(Updater copy_client_resources) +add_dependencies(MainApp copy_client_resources) +# Install rules for packaging +if(EXISTS ${CONFIG_SOURCE_DIR}) + install(DIRECTORY ${CONFIG_SOURCE_DIR} DESTINATION bin/config) +endif() +if(EXISTS ${MANIFEST_PUBLIC_KEY_FILE}) + install(FILES ${MANIFEST_PUBLIC_KEY_FILE} DESTINATION bin) +endif() \ No newline at end of file diff --git a/client/Common/CMakeLists.txt b/client/Common/CMakeLists.txt new file mode 100644 index 0000000..3995e31 --- /dev/null +++ b/client/Common/CMakeLists.txt @@ -0,0 +1,32 @@ +project(Common LANGUAGES C CXX) +find_package(Qt5 REQUIRED COMPONENTS Core Network Widgets) + +set(SRC + HttpHelper.h + HttpHelper.cpp + FileHelper.h + FileHelper.cpp + ConfigHelper.h + ConfigHelper.cpp + PolicyHelper.h + PolicyHelper.cpp + LocalStateHelper.h + LocalStateHelper.cpp +) +add_library(Common STATIC ${SRC}) + +# Common编译自身需要OpenSSL头文件 +target_include_directories(Common + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${OPENSSL_INC} +) + +# 链接库、库目录通过INTERFACE传递给所有依赖Common的exe +target_link_directories(Common INTERFACE + $<$:${OPENSSL_LIB_DEBUG}> + $<$:${OPENSSL_LIB_RELEASE}> +) +target_link_libraries(Common + PRIVATE Qt5::Core Qt5::Network Qt5::Widgets + INTERFACE libssl.lib libcrypto.lib +) \ No newline at end of file diff --git a/client/Common/ConfigHelper.cpp b/client/Common/ConfigHelper.cpp new file mode 100644 index 0000000..7c6f9ad --- /dev/null +++ b/client/Common/ConfigHelper.cpp @@ -0,0 +1,116 @@ +#include "ConfigHelper.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ConfigHelper& ConfigHelper::instance() +{ + static ConfigHelper obj; + return obj; +} + +ConfigHelper::ConfigHelper() +{ + m_configPath = QApplication::applicationDirPath() + "/config/app_config.json"; + migrateLegacyIniIfNeeded(); + qDebug() << "Loading app config path:" << m_configPath; + qDebug() << "File exists?" << QFile::exists(m_configPath); +} + +QString ConfigHelper::configPath() const +{ + return m_configPath; +} + +QString ConfigHelper::getValue(const QString& section, const QString& key) const +{ + Q_UNUSED(section); + QFile file(m_configPath); + if (!file.open(QIODevice::ReadOnly)) + return QString(); + + QJsonParseError error; + const QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &error); + if (error.error != QJsonParseError::NoError || !document.isObject()) + return QString(); + + return document.object().value(key).toVariant().toString(); +} + +bool ConfigHelper::setValue(const QString& section, const QString& key, const QString& value) +{ + Q_UNUSED(section); + QFile input(m_configPath); + QJsonObject config; + if (input.exists()) + { + if (!input.open(QIODevice::ReadOnly)) + return false; + QJsonParseError parseError; + const QByteArray raw = input.readAll(); + input.close(); + const QJsonDocument document = QJsonDocument::fromJson(raw, &parseError); + if (parseError.error != QJsonParseError::NoError || !document.isObject()) + return false; + config = document.object(); + } + + config.insert(key, value); + QDir().mkpath(QFileInfo(m_configPath).path()); + QSaveFile output(m_configPath); + if (!output.open(QIODevice::WriteOnly)) + return false; + const QByteArray payload = QJsonDocument(config).toJson(QJsonDocument::Indented); + if (output.write(payload) != payload.size()) + { + output.cancelWriting(); + return false; + } + return output.commit(); +} + +bool ConfigHelper::migrateLegacyIniIfNeeded() +{ + if (QFile::exists(m_configPath)) + return true; + + const QString legacyPath = QApplication::applicationDirPath() + "/client.ini"; + if (!QFile::exists(legacyPath)) + return false; + + QSettings ini(legacyPath, QSettings::IniFormat); + QJsonObject config; + const auto copyText = [&](const QString& section, const QString& key, const QString& fallback = QString()) { + const QString value = ini.value(section + "/" + key, fallback).toString(); + config.insert(key, value); + }; + + copyText("App", "app_id"); + copyText("App", "app_name", "Marsco Demo App"); + copyText("App", "channel", "stable"); + copyText("App", "current_version", "1.0.0"); + copyText("App", "launch_token"); + copyText("Server", "api_base_url"); + copyText("Server", "client_token"); + copyText("Update", "request_timeout_ms", "5000"); + copyText("Update", "temp_folder", "update_temp"); + copyText("Update", "device_id"); + config.insert("platform", "windows"); + config.insert("arch", "x64"); + + QDir().mkpath(QFileInfo(m_configPath).path()); + QSaveFile output(m_configPath); + if (!output.open(QIODevice::WriteOnly)) + return false; + output.write(QJsonDocument(config).toJson(QJsonDocument::Indented)); + const bool saved = output.commit(); + if (saved) + qDebug() << "Migrated legacy client.ini to" << m_configPath; + return saved; +} diff --git a/client/Common/ConfigHelper.h b/client/Common/ConfigHelper.h new file mode 100644 index 0000000..86a40d5 --- /dev/null +++ b/client/Common/ConfigHelper.h @@ -0,0 +1,16 @@ +#pragma once +#include + +class ConfigHelper +{ +public: + static ConfigHelper& instance(); + QString getValue(const QString& section, const QString& key) const; + bool setValue(const QString& section, const QString& key, const QString& value); + QString configPath() const; + +private: + ConfigHelper(); + bool migrateLegacyIniIfNeeded(); + QString m_configPath; +}; diff --git a/client/Common/FileHelper.cpp b/client/Common/FileHelper.cpp new file mode 100644 index 0000000..5aaf239 --- /dev/null +++ b/client/Common/FileHelper.cpp @@ -0,0 +1,42 @@ +#include "FileHelper.h" +#include + +bool FileHelper::createDir(const QString &path) +{ + QDir dir(path); + if (!dir.exists()) + return dir.mkpath("."); + return true; +} + +bool FileHelper::copyFileOverwrite(const QString &src, const QString &dst) +{ + if (QFile::exists(dst)) + { + if (!QFile::remove(dst)) + { + qDebug() << "无法删除旧文件:" << dst; + return false; + } + } + return QFile::copy(src, dst); +} + +bool FileHelper::isProcessRunning(const QString &exeName) +{ + QProcess process; + process.start("tasklist"); + process.waitForFinished(); + QString output = process.readAllStandardOutput(); + return output.contains(exeName, Qt::CaseInsensitive); +} + +bool FileHelper::killProcess(const QString &exeName) +{ + if (!isProcessRunning(exeName)) + return true; + QProcess process; + process.start("taskkill /f /im " + exeName); + process.waitForFinished(1000); + return !isProcessRunning(exeName); +} \ No newline at end of file diff --git a/client/Common/FileHelper.h b/client/Common/FileHelper.h new file mode 100644 index 0000000..828bbcf --- /dev/null +++ b/client/Common/FileHelper.h @@ -0,0 +1,14 @@ +#pragma once +#include +#include +#include +#include + +class FileHelper +{ +public: + static bool createDir(const QString& path); + static bool copyFileOverwrite(const QString& src, const QString& dst); + static bool isProcessRunning(const QString& exeName); + static bool killProcess(const QString& exeName); +}; \ No newline at end of file diff --git a/client/Common/HttpHelper.cpp b/client/Common/HttpHelper.cpp new file mode 100644 index 0000000..49fdcc3 --- /dev/null +++ b/client/Common/HttpHelper.cpp @@ -0,0 +1,49 @@ +#include "HttpHelper.h" +#include +#include "ConfigHelper.h" + +void HttpHelper::postRequest(const QString& url, const QJsonObject& jsonBody, + std::function callback) +{ + QNetworkAccessManager* manager = new QNetworkAccessManager(); + manager->setProxy(QNetworkProxy::NoProxy); + + QNetworkRequest req(url); + req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + // Add auth token header + QString token = ConfigHelper::instance().getValue("Server", "client_token"); + req.setRawHeader("X-Client-Token", token.toUtf8()); + + QByteArray data = QJsonDocument(jsonBody).toJson(QJsonDocument::Compact); + qDebug() << "=== POST Request ==="; + qDebug() << "Url:" << url; + qDebug() << "Body:" << data; + + QNetworkReply* reply = manager->post(req, data); + QEventLoop loop; + + QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + loop.exec(); + + int retCode = 0; + QJsonObject retObj; + + if (reply->error() != QNetworkReply::NoError) + { + qDebug() << "Network error code:" << reply->error(); + qDebug() << "Error detail:" << reply->errorString(); + } + else + { + retCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + QByteArray respData = reply->readAll(); + qDebug() << "Server raw response:" << respData; + QJsonDocument doc = QJsonDocument::fromJson(respData); + retObj = doc.object(); + } + + callback(retCode, retObj); + + reply->deleteLater(); + manager->deleteLater(); +} \ No newline at end of file diff --git a/client/Common/HttpHelper.h b/client/Common/HttpHelper.h new file mode 100644 index 0000000..3bef462 --- /dev/null +++ b/client/Common/HttpHelper.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpHelper +{ +public: + // 每次调用独立创建manager,不做成成员变量 + static void postRequest(const QString& url, const QJsonObject& jsonBody, + std::function callback); +}; \ No newline at end of file diff --git a/client/Common/LocalStateHelper.cpp b/client/Common/LocalStateHelper.cpp new file mode 100644 index 0000000..330e8a8 --- /dev/null +++ b/client/Common/LocalStateHelper.cpp @@ -0,0 +1,147 @@ +#include "LocalStateHelper.h" +#include +#include +#include +#include + +LocalStateHelper::LocalStateHelper(const QString& baseDir) + : m_baseDir(baseDir) + , m_filePath(baseDir + "/config/local_state.json") +{ +} + +bool LocalStateHelper::loadState(const QString& relativePath) +{ + m_filePath = m_baseDir + "/" + relativePath; + QFile file(m_filePath); + if (!file.exists()) + { + QDir dir(QFileInfo(m_filePath).path()); + if (!dir.exists() && !dir.mkpath(".")) + { + m_error = QString("Cannot create state directory: %1").arg(dir.path()); + return false; + } + + m_state = QJsonObject{ + {"max_policy_seq", 0}, + {"last_success_run_at", QString()}, + {"last_online_verified_at", QString()}, + {"last_success_version", QString()} + }; + m_loaded = true; + if (!saveState()) + { + m_error = QString("Cannot write new state file: %1").arg(m_filePath); + return false; + } + return true; + } + + if (!file.open(QIODevice::ReadOnly)) + { + m_error = QString("Cannot open state file: %1").arg(m_filePath); + return false; + } + + QByteArray raw = file.readAll(); + file.close(); + + QJsonParseError parseError; + QJsonDocument doc = QJsonDocument::fromJson(raw, &parseError); + if (parseError.error != QJsonParseError::NoError || !doc.isObject()) + { + m_error = QString("Invalid state JSON: %1").arg(parseError.errorString()); + return false; + } + + m_state = doc.object(); + m_loaded = true; + return true; +} + +bool LocalStateHelper::saveState() const +{ + if (!m_loaded) + return false; + + QFile file(m_filePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + return false; + } + + QJsonDocument doc(m_state); + file.write(doc.toJson(QJsonDocument::Indented)); + file.close(); + return true; +} + +bool LocalStateHelper::isLoaded() const +{ + return m_loaded; +} + +QString LocalStateHelper::errorString() const +{ + return m_error; +} + +qint64 LocalStateHelper::maxPolicySeq() const +{ + return m_state.value("max_policy_seq").toVariant().toLongLong(); +} + +QDateTime LocalStateHelper::lastSuccessRunAt() const +{ + return QDateTime::fromString(m_state.value("last_success_run_at").toString(), Qt::ISODate); +} + +QDateTime LocalStateHelper::lastOnlineVerifiedAt() const +{ + return QDateTime::fromString(m_state.value("last_online_verified_at").toString(), Qt::ISODate); +} + +QString LocalStateHelper::lastSuccessVersion() const +{ + return m_state.value("last_success_version").toString(); +} + +bool LocalStateHelper::isPolicySeqRolledBack(qint64 policySeq) const +{ + if (!m_loaded) + return false; + return policySeq < maxPolicySeq(); +} + +bool LocalStateHelper::isSystemTimeRewound() const +{ + if (!m_loaded) + return false; + const QDateTime now = QDateTime::currentDateTimeUtc(); + const QDateTime lastRun = lastSuccessRunAt(); + const QDateTime lastOnline = lastOnlineVerifiedAt(); + return (lastRun.isValid() && now < lastRun) + || (lastOnline.isValid() && now < lastOnline); +} + +void LocalStateHelper::updateAfterSuccessfulRun(const QString& currentVersion, qint64 policySeq) +{ + if (!m_loaded) + m_loaded = true; + + m_state["last_success_run_at"] = QDateTime::currentDateTimeUtc().toString(Qt::ISODate); + m_state["last_success_version"] = currentVersion; + if (policySeq > maxPolicySeq()) + m_state["max_policy_seq"] = policySeq; +} + +void LocalStateHelper::updateOnlineVerified(qint64 policySeq) +{ + if (!m_loaded) + m_loaded = true; + + m_state["last_online_verified_at"] = QDateTime::currentDateTimeUtc().toString(Qt::ISODate); + if (policySeq > maxPolicySeq()) + m_state["max_policy_seq"] = policySeq; +} diff --git a/client/Common/LocalStateHelper.h b/client/Common/LocalStateHelper.h new file mode 100644 index 0000000..dd166c5 --- /dev/null +++ b/client/Common/LocalStateHelper.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include +#include + +class LocalStateHelper +{ +public: + explicit LocalStateHelper(const QString& baseDir); + + bool loadState(const QString& relativePath = "config/local_state.json"); + bool saveState() const; + bool isLoaded() const; + QString errorString() const; + + qint64 maxPolicySeq() const; + QDateTime lastSuccessRunAt() const; + QDateTime lastOnlineVerifiedAt() const; + QString lastSuccessVersion() const; + + bool isPolicySeqRolledBack(qint64 policySeq) const; + bool isSystemTimeRewound() const; + + void updateAfterSuccessfulRun(const QString& currentVersion, qint64 policySeq); + void updateOnlineVerified(qint64 policySeq); + +private: + QString m_baseDir; + QString m_filePath; + QString m_error; + QJsonObject m_state; + bool m_loaded = false; +}; diff --git a/client/Common/PolicyHelper.cpp b/client/Common/PolicyHelper.cpp new file mode 100644 index 0000000..febed97 --- /dev/null +++ b/client/Common/PolicyHelper.cpp @@ -0,0 +1,115 @@ +#include "PolicyHelper.h" +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_OPENSSL +#include +#include +#endif + +PolicyHelper::PolicyHelper(const QString& baseDir) : m_baseDir(baseDir) {} + +bool PolicyHelper::loadPolicy(const QString& relativePath) +{ + QFile file(m_baseDir + "/" + relativePath); + if (!file.open(QIODevice::ReadOnly)) { m_error = "Cannot open policy file"; return false; } + QJsonParseError error; + const QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), &error); + if (error.error != QJsonParseError::NoError || !doc.isObject()) { + m_error = "Invalid policy JSON: " + error.errorString(); return false; + } + return loadPolicyObject(doc.object()); +} + +bool PolicyHelper::loadPolicyObject(const QJsonObject& policy, const QString& signedText) +{ + m_policy = policy; m_signedText = signedText; m_loaded = true; m_error.clear(); + return isValid(); +} + +bool PolicyHelper::savePolicy(const QString& relativePath) const +{ + QSaveFile file(m_baseDir + "/" + relativePath); + if (!file.open(QIODevice::WriteOnly)) return false; + const QByteArray bytes = QJsonDocument(m_policy).toJson(QJsonDocument::Indented); + return file.write(bytes) == bytes.size() && file.commit(); +} + +QByteArray PolicyHelper::canonicalPolicyBytes(const QJsonObject& policy) const +{ + QJsonObject copy = policy; copy.remove("signature"); + auto sortObject = [&](auto&& self, const QJsonObject& obj) -> QJsonObject { + QStringList keys = obj.keys(); std::sort(keys.begin(), keys.end()); + QJsonObject sorted; + for (const QString& key : keys) { + QJsonValue value = obj.value(key); + if (value.isObject()) value = self(self, value.toObject()); + else if (value.isArray()) { + QJsonArray array; + for (QJsonValue item : value.toArray()) { + if (item.isObject()) item = self(self, item.toObject()); + array.append(item); + } + value = array; + } + sorted.insert(key, value); + } + return sorted; + }; + return QJsonDocument(sortObject(sortObject, copy)).toJson(QJsonDocument::Compact); +} + +bool PolicyHelper::verifySignature(const QByteArray& payload, const QString& signatureBase64) const +{ +#ifndef HAVE_OPENSSL + Q_UNUSED(payload); Q_UNUSED(signatureBase64); m_error = "OpenSSL unavailable"; return false; +#else + QString keyPath = m_baseDir + "/config/manifest_public_key.pem"; + QFile keyFile(keyPath); + if (!keyFile.open(QIODevice::ReadOnly)) { m_error = "Cannot open policy public key"; return false; } + const QByteArray keyData = keyFile.readAll(); + BIO* bio = BIO_new_mem_buf(keyData.constData(), keyData.size()); + EVP_PKEY* key = bio ? PEM_read_bio_PUBKEY(bio, nullptr, nullptr, nullptr) : nullptr; + if (bio) BIO_free(bio); + if (!key) { m_error = "Invalid policy public key"; return false; } + EVP_MD_CTX* ctx = EVP_MD_CTX_new(); + const QByteArray signature = QByteArray::fromBase64(signatureBase64.toUtf8()); + bool ok = ctx && EVP_DigestVerifyInit(ctx, nullptr, EVP_sha256(), nullptr, key) == 1 + && EVP_DigestVerifyUpdate(ctx, payload.constData(), payload.size()) == 1 + && EVP_DigestVerifyFinal(ctx, reinterpret_cast(signature.constData()), signature.size()) == 1; + if (ctx) EVP_MD_CTX_free(ctx); EVP_PKEY_free(key); + if (!ok) m_error = "Invalid RSA policy signature"; + return ok; +#endif +} + +bool PolicyHelper::isValid() const +{ + if (!m_loaded) return false; + const QStringList required{"app_id","channel","current_version","policy_seq","allow_run", + "force_update","allow_rollback","offline_allowed","valid_until","signature_alg","key_id","signature"}; + for (const QString& key : required) if (!m_policy.contains(key)) { m_error = "Missing policy field: " + key; return false; } + if (m_policy.value("signature_alg").toString() != "RSA-2048-SHA256") return false; + const QByteArray payload = m_signedText.isEmpty() ? canonicalPolicyBytes(m_policy) : m_signedText.toUtf8(); + return verifySignature(payload, m_policy.value("signature").toString()); +} +QString PolicyHelper::errorString() const { return m_error; } +bool PolicyHelper::isVersionAllowed(const QString& version) const { + if (!isValid()) return false; + for (const QJsonValue& v : m_policy.value("disabled_versions").toArray()) if (v.toString() == version) return false; + return true; +} +bool PolicyHelper::allowRun() const { return isValid() && m_policy.value("allow_run").toBool(); } +bool PolicyHelper::forceUpdate() const { return isValid() && m_policy.value("force_update").toBool(); } +bool PolicyHelper::isOfflineAllowed() const { return isValid() && m_policy.value("offline_allowed").toBool(); } +bool PolicyHelper::isExpired() const { + if (!isValid()) return true; + const QDateTime expiry = QDateTime::fromString(m_policy.value("valid_until").toString(), Qt::ISODate); + return !expiry.isValid() || QDateTime::currentDateTimeUtc() > expiry; +} +qint64 PolicyHelper::policySeq() const { return isValid() ? m_policy.value("policy_seq").toVariant().toLongLong() : 0; } +QString PolicyHelper::message() const { return m_policy.value("message").toString(); } diff --git a/client/Common/PolicyHelper.h b/client/Common/PolicyHelper.h new file mode 100644 index 0000000..2a3fccb --- /dev/null +++ b/client/Common/PolicyHelper.h @@ -0,0 +1,32 @@ +#pragma once +#include +#include + +class PolicyHelper +{ +public: + explicit PolicyHelper(const QString& baseDir); + + bool loadPolicy(const QString& relativePath = "config/version_policy.dat"); + bool loadPolicyObject(const QJsonObject& policy, const QString& signedText = QString()); + bool savePolicy(const QString& relativePath = "config/version_policy.dat") const; + bool isValid() const; + QString errorString() const; + bool isVersionAllowed(const QString& currentVersion) const; + bool allowRun() const; + bool forceUpdate() const; + bool isOfflineAllowed() const; + bool isExpired() const; + qint64 policySeq() const; + QString message() const; + +private: + QByteArray canonicalPolicyBytes(const QJsonObject& obj) const; + bool verifySignature(const QByteArray& payload, const QString& signatureBase64) const; + + QString m_baseDir; + QJsonObject m_policy; + QString m_signedText; + mutable QString m_error; + bool m_loaded = false; +}; diff --git a/client/Launcher/CMakeLists.txt b/client/Launcher/CMakeLists.txt new file mode 100644 index 0000000..601eaf9 --- /dev/null +++ b/client/Launcher/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.20) +project(LauncherDemo LANGUAGES C CXX) +# C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +# Qt 自动处理ui/moc/rcc +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) +# 依赖Qt模块:网络、基础核心、窗口 +set(CMAKE_PREFIX_PATH "C:\\Qt\\5.15.2\\msvc2019_64" ${CMAKE_PREFIX_PATH}) +find_package(Qt5 REQUIRED COMPONENTS Core Network Gui Widgets) +# 所有源码文件 +set(SRC_LIST + main.cpp + UpdateLogic.h + UpdateLogic.cpp +) +# 生成可执行程序 +add_executable(Launcher ${SRC_LIST}) +if(WIN32) + set_target_properties(Launcher PROPERTIES WIN32_EXECUTABLE TRUE) +endif() + +# 关键:添加OpenSSL头文件目录 +target_include_directories(Launcher PRIVATE ${OPENSSL_INC}) + +# 链接Common,自动带上OpenSSL库 +target_link_libraries(Launcher Common Qt5::Core Qt5::Network Qt5::Gui Qt5::Widgets) +# 输出编译产物到 out 文件夹(干净不乱) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/bin) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/out/bin) +# 强制VS打开CMake文件夹时默认选中该可执行目标 +set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Launcher) +# 编译完成自动执行windeployqt,复制Qt dll到exe目录 +if(WIN32) + get_target_property(QT_WINDEPLOYQT_EXE Qt5::qmake IMPORTED_LOCATION) + get_filename_component(QT_BIN_PATH "${QT_WINDEPLOYQT_EXE}" DIRECTORY) + set(WINDEPLOYQT "${QT_BIN_PATH}/windeployqt.exe") + add_custom_command(TARGET Launcher POST_BUILD + COMMAND ${WINDEPLOYQT} --debug $ + COMMENT "自动部署Qt依赖dll" + ) +endif() \ No newline at end of file diff --git a/client/Launcher/UpdateLogic.cpp b/client/Launcher/UpdateLogic.cpp new file mode 100644 index 0000000..ef88bd9 --- /dev/null +++ b/client/Launcher/UpdateLogic.cpp @@ -0,0 +1,114 @@ +#include "UpdateLogic.h" +#include "ConfigHelper.h" +#include +#include +#include +#include "PolicyHelper.h" +#include "LocalStateHelper.h" + +UpdateLogic::UpdateLogic(QObject* parent) + : QObject(parent) +{ + ConfigHelper& cfg = ConfigHelper::instance(); + m_serverAddr = cfg.getValue("Server", "api_base_url"); + m_appId = cfg.getValue("App", "app_id"); + m_curVer = cfg.getValue("App", "current_version"); + m_channel = cfg.getValue("App", "channel"); + + // Debug print config + qDebug() << "Read server addr:" << m_serverAddr; + qDebug() << "Read app id:" << m_appId; +} + +void UpdateLogic::checkUpdate() +{ + if (m_serverAddr.isEmpty() || m_appId.isEmpty() || m_curVer.isEmpty() || m_channel.isEmpty()) + { + qDebug() << "Config incomplete, abort update check"; + m_needUpdate = false; + return; + } + QString url = m_serverAddr + "/api/v1/update/check"; + QJsonObject body; + body["app_id"] = m_appId; + body["current_version"] = m_curVer; + body["channel"] = m_channel; + + m_http.postRequest(url, body, [this](int code, const QJsonObject& resp) + { + qDebug() << "Check update HTTP code:" << code; + m_lastStatusCode = code; + m_checkResp = resp; + m_networkOk = (code == 200); + if (code == 200) + { + const QString appDir = QApplication::applicationDirPath(); + PolicyHelper onlinePolicy(appDir); + LocalStateHelper state(appDir); + const bool stateLoaded = state.loadState(); + const bool policyValid = onlinePolicy.loadPolicyObject( + resp.value("policy").toObject(), resp.value("policy_text").toString()); + if (!policyValid || !stateLoaded + || state.isPolicySeqRolledBack(onlinePolicy.policySeq()) + || !onlinePolicy.savePolicy()) + { + qDebug() << "Online policy rejected:" << onlinePolicy.errorString(); + m_networkOk = false; + m_needUpdate = false; + return; + } + state.updateOnlineVerified(onlinePolicy.policySeq()); + if (!state.saveState()) + { + qDebug() << "Cannot persist online policy state"; + m_networkOk = false; + m_needUpdate = false; + return; + } + m_needUpdate = resp["need_update"].toBool(); + m_latestVer = resp["latest_version"].toString(); + qDebug() << "Need update:" << m_needUpdate; + qDebug() << "Latest version:" << m_latestVer; + qDebug() << "Policy seq:" << onlinePolicy.policySeq(); + } + else + { + m_needUpdate = false; + qDebug() << "Check update api failed"; + } + }); +} + +void UpdateLogic::getDownloadUrl(const QString& appId, const QString& channel, const QString& ver, int verId) +{ + QString url = m_serverAddr + "/api/v1/update/download-url"; + QJsonObject body; + body["app_id"] = appId; + body["channel"] = channel; + body["version"] = ver; + body["version_id"] = verId; + QJsonArray files; + body["files"] = files; + + m_http.postRequest(url, body, [](int code, const QJsonObject& resp) + { + qDebug() << "\n========== File Download Url =========="; + qDebug() << resp["files"].toArray(); + }); +} + +void UpdateLogic::reportUpdateResult(const QString& deviceId, const QString& fromVer, const QString& toVer, bool success) +{ + QString url = m_serverAddr + "/api/v1/update/report"; + QJsonObject body; + body["device_id"] = deviceId; + body["from_version"] = fromVer; + body["to_version"] = toVer; + body["result"] = success ? "success" : "fail"; + + m_http.postRequest(url, body, [](int code, const QJsonObject& resp) + { + qDebug() << "\n========== Update Report Result =========="; + qDebug() << resp; + }); +} \ No newline at end of file diff --git a/client/Launcher/UpdateLogic.h b/client/Launcher/UpdateLogic.h new file mode 100644 index 0000000..3f2ea84 --- /dev/null +++ b/client/Launcher/UpdateLogic.h @@ -0,0 +1,38 @@ +#pragma once +#include +#include "HttpHelper.h" +#include +#include + +class UpdateLogic : public QObject +{ + Q_OBJECT +public: + explicit UpdateLogic(QObject* parent = nullptr); + + void checkUpdate(); + void getDownloadUrl(const QString& appId, const QString& channel, const QString& ver, int verId); + void reportUpdateResult(const QString& deviceId, const QString& fromVer, const QString& toVer, bool success); + + bool getNeedUpdate() const { return m_needUpdate; } + QString getLatestVersion() const { return m_latestVer; } + QJsonObject getCheckResult() const { return m_checkResp; } + bool isNetworkOk() const { return m_networkOk; } + int lastStatusCode() const { return m_lastStatusCode; } + + QString getAppId() const { return m_appId; } + QString getChannel() const { return m_channel; } + +private: + HttpHelper m_http; + QString m_serverAddr; + QString m_appId; + QString m_curVer; + QString m_channel; + + bool m_needUpdate = false; + bool m_networkOk = false; + int m_lastStatusCode = 0; + QString m_latestVer; + QJsonObject m_checkResp; +}; \ No newline at end of file diff --git a/client/Launcher/main.cpp b/client/Launcher/main.cpp new file mode 100644 index 0000000..0048b2d --- /dev/null +++ b/client/Launcher/main.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include +#include +#include +#include "UpdateLogic.h" +#include "../Common/ConfigHelper.h" +#include "../Common/PolicyHelper.h" +#include "../Common/LocalStateHelper.h" + +int main(int argc, char* argv[]) +{ + SetConsoleOutputCP(65001); + QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); + QApplication app(argc, argv); + QApplication::setApplicationName("Marsco Launcher"); + + QProgressDialog progress("正在检查软件更新...", QString(), 0, 0); + progress.setWindowTitle("Marsco 软件启动器"); + progress.setCancelButton(nullptr); + progress.setWindowModality(Qt::ApplicationModal); + progress.setMinimumDuration(0); + progress.setAutoClose(false); + progress.show(); + QApplication::processEvents(); + + UpdateLogic logic; + logic.checkUpdate(); + + const bool needUpdate = logic.getNeedUpdate(); + const bool networkOk = logic.isNetworkOk(); + const QString latestVer = logic.getLatestVersion(); + const QJsonObject response = logic.getCheckResult(); + const int targetVersionId = response.value("version_id").toInt(); + const QString appId = logic.getAppId(); + const QString channel = logic.getChannel(); + + ConfigHelper& config = ConfigHelper::instance(); + const QString launchToken = config.getValue("App", "launch_token"); + const QString currentVersion = config.getValue("App", "current_version"); + const QString appDir = QApplication::applicationDirPath(); + const QString mainAppPath = appDir + "/MainApp.exe"; + const QString updaterPath = appDir + "/Updater.exe"; + const QStringList mainArgs{QString("--launcher-token=%1").arg(launchToken)}; + + progress.setLabelText("正在验证本地运行策略..."); + QApplication::processEvents(); + + PolicyHelper policy(appDir); + if (!policy.loadPolicy("config/version_policy.dat") || !policy.isValid()) + { + progress.close(); + QMessageBox::critical(nullptr, "无法启动", QString("本地版本策略无效:%1").arg(policy.errorString())); + return -1; + } + if (policy.isExpired()) + { + progress.close(); + QMessageBox::critical(nullptr, "无法启动", "本地版本策略已过期,请连接网络或联系管理员。"); + return -1; + } + if ((!policy.allowRun() || !policy.isVersionAllowed(currentVersion)) && !(networkOk && needUpdate)) + { + progress.close(); + QMessageBox::critical(nullptr, "当前版本不可运行", + policy.message().isEmpty() ? QString("当前版本 %1 已被管理员停用。").arg(currentVersion) + : policy.message()); + return -1; + } + + LocalStateHelper state(appDir); + if (!state.loadState()) + { + progress.close(); + QMessageBox::critical(nullptr, "无法启动", QString("无法读取本地状态:%1").arg(state.errorString())); + return -1; + } + if (state.isPolicySeqRolledBack(policy.policySeq())) + { + progress.close(); + QMessageBox::critical(nullptr, "安全检查失败", "检测到版本策略序列回退,已阻止启动。"); + return -1; + } + if (state.isSystemTimeRewound()) + { + progress.close(); + QMessageBox::critical(nullptr, "安全检查失败", "检测到系统时间可能被回拨,已阻止启动。"); + return -1; + } + + if (networkOk && needUpdate) + { + progress.close(); + const bool rollbackOperation = response.value("action").toString() == "rollback_allowed"; + const QString dialogTitle = rollbackOperation ? "版本回退" + : (policy.forceUpdate() ? "必须更新" : "发现新版本"); + const QString prompt = policy.message().isEmpty() + ? QString(rollbackOperation ? "管理员提供了版本 %1 作为回退目标,是否现在降级?" + : "发现新版本 %1,是否现在更新?").arg(latestVer) + : policy.message() + QString("\n目标版本:%1").arg(latestVer); + bool accepted = true; + if (policy.forceUpdate()) { + QMessageBox::information(nullptr, dialogTitle, prompt); + } else { + accepted = QMessageBox::question(nullptr, dialogTitle, prompt, + QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes; + } + if (!accepted) { + if (!QProcess::startDetached(mainAppPath, mainArgs)) { + QMessageBox::critical(nullptr, "启动失败", QString("无法启动主程序:%1").arg(mainAppPath)); + return -1; + } + return 0; + } + const QStringList updaterArgs{appId, channel, latestVer, QString::number(targetVersionId)}; + if (!QProcess::startDetached(updaterPath, updaterArgs)) + { + QMessageBox::critical(nullptr, "更新器启动失败", QString("无法启动更新器:%1").arg(updaterPath)); + return -1; + } + return 0; + } + + if (!networkOk && !policy.isOfflineAllowed()) + { + progress.close(); + QMessageBox::critical(nullptr, "网络不可用", "无法连接更新服务器,且当前策略不允许离线启动。"); + return -1; + } + + progress.setLabelText(networkOk ? "当前已是最新版本,正在启动..." : "当前处于离线模式,正在启动..."); + QApplication::processEvents(); + if (!QProcess::startDetached(mainAppPath, mainArgs)) + { + progress.close(); + QMessageBox::critical(nullptr, "启动失败", QString("无法启动主程序:%1").arg(mainAppPath)); + return -1; + } + progress.close(); + return 0; +} diff --git a/client/MainApp/CMakeLists.txt b/client/MainApp/CMakeLists.txt new file mode 100644 index 0000000..7874908 --- /dev/null +++ b/client/MainApp/CMakeLists.txt @@ -0,0 +1,21 @@ +project(MainApp) +add_executable(MainApp + main.cpp + MainWindow.h + MainWindow.cpp + ../Common/ConfigHelper.h +) +target_include_directories(MainApp + PUBLIC ${CMAKE_SOURCE_DIR}/Common + PRIVATE ${OPENSSL_INC} +) +target_link_libraries(MainApp PRIVATE Common Qt5::Core Qt5::Gui Qt5::Widgets) + +if(WIN32) + get_target_property(QT_WINDEPLOYQT_EXE Qt5::qmake IMPORTED_LOCATION) + get_filename_component(QT_BIN_PATH "${QT_WINDEPLOYQT_EXE}" DIRECTORY) + set(WINDEPLOYQT "${QT_BIN_PATH}/windeployqt.exe") + add_custom_command(TARGET MainApp POST_BUILD + COMMAND ${WINDEPLOYQT} --debug $ + ) +endif() \ No newline at end of file diff --git a/client/MainApp/MainWindow.cpp b/client/MainApp/MainWindow.cpp new file mode 100644 index 0000000..77f4c58 --- /dev/null +++ b/client/MainApp/MainWindow.cpp @@ -0,0 +1,72 @@ +#include "MainWindow.h" +#include +#include +#include +#include +#include +#include +#include "../Common/PolicyHelper.h" +#include "../Common/ConfigHelper.h" + +static QString readDllVersion(const QString& dllPath) +{ + QFile file(dllPath); + if (!file.exists()) + return "missing"; + + if (!file.open(QIODevice::ReadOnly)) + return "unreadable"; + + QByteArray data = file.read(1024); + file.close(); + return QString::fromUtf8(QCryptographicHash::hash(data, QCryptographicHash::Sha256).toHex().left(8)); +} + +MainWindow::MainWindow(QWidget* parent) + : QWidget(parent) +{ + this->setWindowTitle("Marsco Demo MainApp"); + this->resize(600, 400); + + QString appVersion = ConfigHelper::instance().getValue("App", "current_version"); + if (appVersion.isEmpty()) + appVersion = "unknown"; + + QString dllVersion = readDllVersion(QApplication::applicationDirPath() + "/plugins/demo_plugin.dll"); + + PolicyHelper policy(QApplication::applicationDirPath()); + QString policyResult; + if (!policy.loadPolicy("config/version_policy.dat")) + { + policyResult = "policy missing"; + } + else if (!policy.isValid()) + { + policyResult = "policy invalid"; + } + else if (!policy.isVersionAllowed(appVersion)) + { + policyResult = "version disabled"; + } + else if (policy.isExpired()) + { + policyResult = "policy expired"; + } + else + { + policyResult = "policy ok"; + } + + QVBoxLayout* layout = new QVBoxLayout(this); + QLabel* label = new QLabel(QString("Software Running Successfully\nVersion: %1\nDLL Version: %2\nPolicy: %3") + .arg(appVersion) + .arg(dllVersion) + .arg(policyResult)); + QFont font = label->font(); + font.setPointSize(14); + label->setFont(font); + label->setAlignment(Qt::AlignCenter); + + layout->addWidget(label); + this->setLayout(layout); +} \ No newline at end of file diff --git a/client/MainApp/MainWindow.h b/client/MainApp/MainWindow.h new file mode 100644 index 0000000..0c57cc2 --- /dev/null +++ b/client/MainApp/MainWindow.h @@ -0,0 +1,11 @@ +#pragma once +#include +#include +#include + +class MainWindow : public QWidget +{ + Q_OBJECT +public: + explicit MainWindow(QWidget* parent = nullptr); +}; \ No newline at end of file diff --git a/client/MainApp/main.cpp b/client/MainApp/main.cpp new file mode 100644 index 0000000..ba2551a --- /dev/null +++ b/client/MainApp/main.cpp @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "MainWindow.h" +#include "../Common/ConfigHelper.h" +#include "../Common/PolicyHelper.h" +#include "../Common/LocalStateHelper.h" + +int main(int argc, char* argv[]) +{ + SetConsoleOutputCP(936); + QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); + + QApplication a(argc, argv); + + qDebug() << Qt::endl << "entered main app" << Qt::endl; + + const QString validToken = ConfigHelper::instance().getValue("App", "launch_token"); + bool pass = false; + QString healthFilePath; + + for (int i = 0; i < argc; ++i) + { + QString arg(argv[i]); + if (arg.startsWith("--launcher-token=")) + { + QString tk = arg.split("=").last(); + if (tk == validToken) + { + pass = true; + } + } + else if (arg.startsWith("--health-file=")) + { + healthFilePath = arg.mid(QString("--health-file=").size()); + } + } + + + if (!pass) + { + QMessageBox::critical(nullptr, "Startup Restriction", "Direct double-clicking MainApp.exe is prohibited. Please use Launcher.exe to open the software!"); + return -1; + } + + QString appDir = QApplication::applicationDirPath(); + PolicyHelper policy(appDir); + if (!policy.loadPolicy("config/version_policy.dat") || !policy.isValid()) + { + QMessageBox::critical(nullptr, "Policy Error", QString("Local policy invalid: %1").arg(policy.errorString())); + return -1; + } + + if (policy.isExpired()) + { + QMessageBox::critical(nullptr, "Policy Error", "Policy expired, cannot start the application."); + return -1; + } + + LocalStateHelper state(appDir); + if (!state.loadState()) + { + QMessageBox::critical(nullptr, "State Error", QString("Cannot load local state: %1").arg(state.errorString())); + return -1; + } + + if (state.isPolicySeqRolledBack(policy.policySeq())) + { + QMessageBox::critical(nullptr, "Policy Error", "Detected policy sequence rollback, startup blocked."); + return -1; + } + + if (state.isSystemTimeRewound()) + { + QMessageBox::critical(nullptr, "Policy Error", "System time appears to be rewound, startup blocked."); + return -1; + } + + MainWindow w; + w.show(); + + state.updateAfterSuccessfulRun(ConfigHelper::instance().getValue("App", "current_version"), policy.policySeq()); + if (!state.saveState()) + { + QMessageBox::critical(nullptr, "State Error", QString("Cannot save local state: %1").arg(state.errorString())); + return -1; + } + + if (!healthFilePath.isEmpty()) + { + QDir().mkpath(QFileInfo(healthFilePath).path()); + QSaveFile healthFile(healthFilePath); + const QByteArray healthy("ok\n"); + if (!healthFile.open(QIODevice::WriteOnly) + || healthFile.write(healthy) != healthy.size() + || !healthFile.commit()) + { + QMessageBox::critical(nullptr, "Startup Error", "Cannot write update health confirmation file."); + return -1; + } + } + + qDebug() << "Main program MainApp is running normally"; + return a.exec(); +} \ No newline at end of file diff --git a/client/READMe.txt b/client/READMe.txt new file mode 100644 index 0000000..8b03d6b --- /dev/null +++ b/client/READMe.txt @@ -0,0 +1,3 @@ +client目录下的CMakeList.txt用来统一管理client下的Launcher工程和MainApp工程和Updater工程 + +cofig.ini要跟exe同级目录 \ No newline at end of file diff --git a/client/Updater/CMakeLists.txt b/client/Updater/CMakeLists.txt new file mode 100644 index 0000000..ba0221e --- /dev/null +++ b/client/Updater/CMakeLists.txt @@ -0,0 +1,41 @@ +# ǿб롢ʱɾʹx64ֹWin32 +set(CMAKE_GENERATOR_PLATFORM x64 CACHE STRING "ǿx64ƽ̨Win32") +set(CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCH x64) +# رVSԶWin32ʱԤ +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD OFF) +# 32λStrawberry Perl· +list(REMOVE_ITEM CMAKE_INCLUDE_PATH "D:/softwaresInstallDir/strawberry-perl-5.22.1.3-32bit/c/include") +list(REMOVE_ITEM CMAKE_LIBRARY_PATH "D:/softwaresInstallDir/strawberry-perl-5.22.1.3-32bit/c/lib") + +project(Updater) +set(SRC + main.cpp + UpdaterLogic.h + UpdaterLogic.cpp + UpdateTransaction.h + UpdateTransaction.cpp +) +add_executable(Updater ${SRC}) + +if(WIN32) + set_target_properties(Updater PROPERTIES WIN32_EXECUTABLE TRUE) +endif() + +# ؼUpdaterOpenSSLͷļĿ¼#include openssl/*Ҳ +target_include_directories(Updater PRIVATE ${OPENSSL_INC}) + +# CommonQtOpenSSLCommon INTERFACEԶ +target_link_libraries(Updater PRIVATE + Common + Qt5::Core Qt5::Network Qt5::Gui Qt5::Widgets +) + +# Qtű +if(WIN32) + get_target_property(QT_WINDEPLOYQT_EXE Qt5::qmake IMPORTED_LOCATION) + get_filename_component(QT_BIN_PATH "${QT_WINDEPLOYQT_EXE}" DIRECTORY) + set(WINDEPLOYQT "${QT_BIN_PATH}/windeployqt.exe") + add_custom_command(TARGET Updater POST_BUILD + COMMAND ${WINDEPLOYQT} --debug $ + ) +endif() \ No newline at end of file diff --git a/client/Updater/UpdateTransaction.cpp b/client/Updater/UpdateTransaction.cpp new file mode 100644 index 0000000..cfed0fa --- /dev/null +++ b/client/Updater/UpdateTransaction.cpp @@ -0,0 +1,269 @@ +#include "UpdateTransaction.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +UpdateTransaction::UpdateTransaction(const QString& installDir, const QString& fromVersion, + const QString& toVersion, int manifestId) + : m_installDir(QDir::cleanPath(installDir)), + m_updateDir(QDir(installDir).filePath("update")), + m_stateFile(QDir(installDir).filePath("update/upgrade_state.json")), + m_transactionId(QUuid::createUuid().toString(QUuid::WithoutBraces)), + m_fromVersion(fromVersion), m_toVersion(toVersion), m_manifestId(manifestId) +{ + m_stagingDir = QDir(m_updateDir).filePath("staging/" + m_transactionId); + m_backupDir = QDir(m_updateDir).filePath("backup/" + m_transactionId); +} + +bool UpdateTransaction::safeRelativePath(const QString& path) +{ + const QString clean = QDir::cleanPath(QDir::fromNativeSeparators(path)); + return !clean.isEmpty() && !QDir::isAbsolutePath(clean) && clean != ".." + && !clean.startsWith("../") && !clean.contains(":"); +} + +bool UpdateTransaction::copyOverwrite(const QString& source, const QString& destination) const +{ + if (!QDir().mkpath(QFileInfo(destination).path())) return false; + if (QFile::exists(destination) && !QFile::remove(destination)) return false; + return QFile::copy(source, destination); +} + +bool UpdateTransaction::writeState(const QString& status, const QString& errorCode, const QString& message) +{ + m_state["transaction_id"] = m_transactionId; + m_state["from_version"] = m_fromVersion; + m_state["to_version"] = m_toVersion; + m_state["status"] = status; + m_state["manifest_id"] = m_manifestId; + m_state["updated_at"] = QDateTime::currentDateTimeUtc().toString(Qt::ISODate); + m_state["staging_dir"] = m_stagingDir; + m_state["backup_dir"] = m_backupDir; + m_state["error_code"] = errorCode; + m_state["message"] = message; + QJsonArray paths; + for (const QString& path : m_changedPaths) paths.append(path); + m_state["changed_paths"] = paths; + QJsonArray obsoletePaths; + for (const QString& path : m_obsoletePaths) obsoletePaths.append(path); + m_state["obsolete_paths"] = obsoletePaths; + + QDir().mkpath(m_updateDir); + QSaveFile file(m_stateFile); + if (!file.open(QIODevice::WriteOnly)) return false; + const QByteArray payload = QJsonDocument(m_state).toJson(QJsonDocument::Indented); + if (file.write(payload) != payload.size()) { file.cancelWriting(); return false; } + return file.commit(); +} + +bool UpdateTransaction::initialize() +{ + QDir(m_stagingDir).removeRecursively(); + QDir(m_backupDir).removeRecursively(); + if (!QDir().mkpath(m_stagingDir) || !QDir().mkpath(m_backupDir)) return false; + m_state["started_at"] = QDateTime::currentDateTimeUtc().toString(Qt::ISODate); + return writeState("prepared"); +} + +bool UpdateTransaction::resumeExisting(QString* errorMessage) +{ + QFile file(m_stateFile); + if (!file.open(QIODevice::ReadOnly)) { + if (errorMessage) *errorMessage = "cannot open upgrade_state.json"; + return false; + } + const QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); + file.close(); + if (!doc.isObject()) { + if (errorMessage) *errorMessage = "invalid upgrade_state.json"; + return false; + } + m_state = doc.object(); + const QString expectedToVersion = m_toVersion; + const int expectedManifestId = m_manifestId; + const QString stateStatus = m_state.value("status").toString(); + m_transactionId = m_state.value("transaction_id").toString(); + m_fromVersion = m_state.value("from_version").toString(); + m_toVersion = m_state.value("to_version").toString(); + m_manifestId = m_state.value("manifest_id").toInt(); + if (m_toVersion != expectedToVersion || m_manifestId != expectedManifestId + || (stateStatus != "awaiting_bootstrap" && stateStatus != "post_verify" + && stateStatus != "rollback_required")) { + if (errorMessage) *errorMessage = "upgrade state does not match resume request"; + return false; + } + m_stagingDir = m_state.value("staging_dir").toString(); + m_backupDir = m_state.value("backup_dir").toString(); + m_changedPaths.clear(); + m_obsoletePaths.clear(); + for (const QJsonValue& value : m_state.value("changed_paths").toArray()) { + const QString path = value.toString(); + if (!safeRelativePath(path)) { + if (errorMessage) *errorMessage = "unsafe path in upgrade state"; + return false; + } + m_changedPaths.append(path); + } + for (const QJsonValue& value : m_state.value("obsolete_paths").toArray()) { + const QString path = value.toString(); + if (!safeRelativePath(path)) { + if (errorMessage) *errorMessage = "unsafe obsolete path in upgrade state"; + return false; + } + m_obsoletePaths.append(path); + } + if (m_transactionId.isEmpty() || m_stagingDir.isEmpty() || m_backupDir.isEmpty()) { + if (errorMessage) *errorMessage = "incomplete upgrade state"; + return false; + } + return true; +} + +bool UpdateTransaction::recordVerifiedFiles(const QStringList& changedPaths, + const QStringList& obsoletePaths) +{ + m_changedPaths.clear(); + m_obsoletePaths.clear(); + QSet changedKeys; + for (const QString& path : changedPaths) { + if (!safeRelativePath(path)) return false; + const QString normalized = QDir::fromNativeSeparators(path); + changedKeys.insert(normalized.toCaseFolded()); + m_changedPaths.append(normalized); + } + for (const QString& path : obsoletePaths) { + if (!safeRelativePath(path)) return false; + const QString normalized = QDir::fromNativeSeparators(path); + if (changedKeys.contains(normalized.toCaseFolded())) return false; + m_obsoletePaths.append(normalized); + } + return writeState("verified"); +} + +bool UpdateTransaction::backupCurrentFiles() +{ + if (!writeState("waiting_mainapp_exit")) return false; + QStringList paths = m_changedPaths; + paths.append(m_obsoletePaths); + for (const QString& path : paths) { + const QString installed = QDir(m_installDir).filePath(path); + if (!QFile::exists(installed)) continue; + const QString backup = QDir(m_backupDir).filePath(path); + if (!copyOverwrite(installed, backup)) + return markFailed("backup_failed", path); + } + return writeState("backed_up"); +} + +bool UpdateTransaction::installStagedFiles(QString* failedPath) +{ + if (!writeState("replacing")) return false; + for (const QString& path : m_changedPaths) { + const QString source = QDir(m_stagingDir).filePath(path); + const QString destination = QDir(m_installDir).filePath(path); + if (!copyOverwrite(source, destination)) { + if (failedPath) *failedPath = path; + writeState("rollback_required", "replace_failed", path); + return false; + } + } + return writeState("replaced"); +} + +bool UpdateTransaction::markAwaitingBootstrap() { return writeState("awaiting_bootstrap"); } + +bool UpdateTransaction::markRollbackRequired(const QString& reason) +{ return writeState("rollback_required", "post_install_failed", reason); } + +bool UpdateTransaction::markRolledBack() { return writeState("rolled_back"); } + +bool UpdateTransaction::markPostVerify() { return writeState("post_verify"); } + +bool UpdateTransaction::rollback(QString* failedPath) +{ + writeState("rolling_back"); + bool ok = true; + QStringList paths = m_changedPaths; + paths.append(m_obsoletePaths); + for (const QString& path : paths) { + const QString installed = QDir(m_installDir).filePath(path); + const QString backup = QDir(m_backupDir).filePath(path); + if (QFile::exists(backup)) { + if (!copyOverwrite(backup, installed)) { ok = false; if (failedPath) *failedPath = path; } + } else if (QFile::exists(installed) && !QFile::remove(installed)) { + ok = false; if (failedPath) *failedPath = path; + } + } + writeState(ok ? "rolled_back" : "failed", ok ? QString() : "rollback_failed", + failedPath ? *failedPath : QString()); + return ok; +} + +bool UpdateTransaction::commit() +{ + if (!writeState("committed")) return false; + QDir(m_stagingDir).removeRecursively(); + QDir(m_backupDir).removeRecursively(); + return true; +} + +bool UpdateTransaction::markFailed(const QString& errorCode, const QString& message) +{ return writeState("failed", errorCode, message); } + +QString UpdateTransaction::transactionId() const { return m_transactionId; } +QString UpdateTransaction::fromVersion() const { return m_fromVersion; } +QString UpdateTransaction::stagingDir() const { return m_stagingDir; } +QString UpdateTransaction::backupDir() const { return m_backupDir; } +QStringList UpdateTransaction::obsoletePaths() const { return m_obsoletePaths; } +QString UpdateTransaction::healthFile() const { return QDir(m_updateDir).filePath("health_" + m_transactionId + ".ok"); } + +bool UpdateTransaction::recoverInterrupted(const QString& installDir, QString* restoredVersion, QString* errorMessage) +{ + const QString stateFile = QDir(installDir).filePath("update/upgrade_state.json"); + QFile file(stateFile); + if (!file.exists()) return true; + if (!file.open(QIODevice::ReadOnly)) { if (errorMessage) *errorMessage = "cannot open upgrade_state.json"; return false; } + const QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); + file.close(); + if (!doc.isObject()) { if (errorMessage) *errorMessage = "invalid upgrade_state.json"; return false; } + QJsonObject state = doc.object(); + const QString status = state.value("status").toString(); + if (status == "committed") return true; + if (status == "rolled_back") { + if (restoredVersion) *restoredVersion = state.value("from_version").toString(); + return true; + } + const QString backupDir = state.value("backup_dir").toString(); + QJsonArray paths = state.value("changed_paths").toArray(); + for (const QJsonValue& value : state.value("obsolete_paths").toArray()) paths.append(value); + const QString errorCode = state.value("error_code").toString(); + const bool mayContainNewFiles = status == "replacing" || status == "replaced" + || status == "post_verify" || status == "rollback_required" + || status == "awaiting_bootstrap" || status == "rolling_back" || errorCode == "rollback_failed"; + bool ok = true; + for (const QJsonValue& value : paths) { + const QString path = value.toString(); + if (!safeRelativePath(path)) { ok = false; continue; } + const QString installed = QDir(installDir).filePath(path); + const QString backup = QDir(backupDir).filePath(path); + if (QFile::exists(backup)) { + QDir().mkpath(QFileInfo(installed).path()); + if (QFile::exists(installed)) QFile::remove(installed); + if (!QFile::copy(backup, installed)) ok = false; + } else if (mayContainNewFiles) { + if (QFile::exists(installed) && !QFile::remove(installed)) ok = false; + } + } + if (restoredVersion) *restoredVersion = state.value("from_version").toString(); + state["status"] = ok ? "rolled_back" : "failed"; + QSaveFile output(stateFile); + if (output.open(QIODevice::WriteOnly)) { output.write(QJsonDocument(state).toJson(QJsonDocument::Indented)); output.commit(); } + if (!ok && errorMessage) *errorMessage = "failed to restore one or more files"; + return ok; +} diff --git a/client/Updater/UpdateTransaction.h b/client/Updater/UpdateTransaction.h new file mode 100644 index 0000000..432ca9a --- /dev/null +++ b/client/Updater/UpdateTransaction.h @@ -0,0 +1,54 @@ +#pragma once +#include +#include +#include + +class UpdateTransaction +{ +public: + UpdateTransaction(const QString& installDir, const QString& fromVersion, + const QString& toVersion, int manifestId); + + bool initialize(); + bool resumeExisting(QString* errorMessage = nullptr); + bool recordVerifiedFiles(const QStringList& changedPaths, const QStringList& obsoletePaths); + bool backupCurrentFiles(); + bool installStagedFiles(QString* failedPath = nullptr); + bool markAwaitingBootstrap(); + bool markRollbackRequired(const QString& reason); + bool markRolledBack(); + bool markPostVerify(); + bool rollback(QString* failedPath = nullptr); + bool commit(); + bool markFailed(const QString& errorCode, const QString& message); + + QString transactionId() const; + QString fromVersion() const; + QString stagingDir() const; + QString backupDir() const; + QStringList obsoletePaths() const; + QString healthFile() const; + + static bool recoverInterrupted(const QString& installDir, + QString* restoredVersion = nullptr, + QString* errorMessage = nullptr); + +private: + bool writeState(const QString& status, const QString& errorCode = QString(), + const QString& message = QString()); + bool copyOverwrite(const QString& source, const QString& destination) const; + static bool safeRelativePath(const QString& path); + + QString m_installDir; + QString m_updateDir; + QString m_stateFile; + QString m_transactionId; + QString m_fromVersion; + QString m_toVersion; + int m_manifestId = 0; + QString m_stagingDir; + QString m_backupDir; + QStringList m_changedPaths; + QStringList m_obsoletePaths; + QJsonObject m_state; +}; diff --git a/client/Updater/UpdaterLogic.cpp b/client/Updater/UpdaterLogic.cpp new file mode 100644 index 0000000..b86bd67 --- /dev/null +++ b/client/Updater/UpdaterLogic.cpp @@ -0,0 +1,670 @@ +#include "UpdaterLogic.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ConfigHelper.h" + +#ifdef HAVE_OPENSSL +#include +#include +#include +#include +#endif + +UpdaterLogic::UpdaterLogic(QObject* parent) + : QObject(parent) +{ + m_serverAddr = ConfigHelper::instance().getValue("Server", "api_base_url"); +} + +void UpdaterLogic::getManifest(const QString& appId, const QString& channel, const QString& targetVer, int versionId) +{ + QString url = m_serverAddr + "/api/v1/update/manifest"; + QJsonObject body; + body["app_id"] = appId; + body["channel"] = channel; + body["version"] = targetVer; + body["version_id"] = versionId; + + m_http.postRequest(url, body, [this](int code, const QJsonObject& resp) + { + qDebug() << "Manifest API returned code:" << code; + m_manifest = QJsonObject(); + m_manifestText.clear(); + + if (code == 200) + { + if (resp.contains("manifest_text") && resp.contains("manifest")) + { + m_manifestText = resp["manifest_text"].toString(); + m_manifest = resp["manifest"].toObject(); + qDebug() << "Received manifest version:" << m_manifest.value("version").toString(); + m_fileItems.clear(); + QJsonArray files = m_manifest.value("files").toArray(); + for (const QJsonValue& fileItem : files) + { + QJsonObject fileObj = fileItem.toObject(); + FileDownloadItem fi; + fi.path = fileObj.value("path").toString(); + fi.sha256 = fileObj.value("sha256").toString(); + fi.size = fileObj.value("size").toVariant().toLongLong(); + fi.url = m_serverAddr + "/api/v1/update/file/" + fi.path; // placeholder, actual download URL uses download-url or signed object URL + m_fileItems.append(fi); + } + } + else + { + qDebug() << "Manifest response missing fields"; + } + } + else + { + qDebug() << "Failed to get manifest"; + } + emit fetchUrlFinished(); + }); +} + +bool UpdaterLogic::verifySignature(const QByteArray& payload, const QString& signatureBase64, const QString& publicKeyPath) const +{ +#ifndef HAVE_OPENSSL + Q_UNUSED(payload); + Q_UNUSED(signatureBase64); + Q_UNUSED(publicKeyPath); + qDebug() << "OpenSSL not available, cannot verify manifest signature"; + return false; +#else + QFile keyFile(publicKeyPath); + if (!keyFile.open(QIODevice::ReadOnly)) + { + qDebug() << "Cannot open public key file:" << publicKeyPath; + return false; + } + + QByteArray keyData = keyFile.readAll(); + keyFile.close(); + + BIO* bio = BIO_new_mem_buf(keyData.constData(), keyData.size()); + if (!bio) + { + qDebug() << "BIO_new_mem_buf failed"; + return false; + } + + EVP_PKEY* pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); + BIO_free(bio); + if (!pkey) + { + qDebug() << "PEM_read_bio_PUBKEY failed"; + return false; + } + + QByteArray signature = QByteArray::fromBase64(signatureBase64.toUtf8()); + EVP_MD_CTX* mdctx = EVP_MD_CTX_new(); + if (!mdctx) + { + EVP_PKEY_free(pkey); + qDebug() << "EVP_MD_CTX_new failed"; + return false; + } + + bool ok = false; + if (EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pkey) == 1) + { + if (EVP_DigestVerifyUpdate(mdctx, payload.constData(), payload.size()) == 1) + { + if (EVP_DigestVerifyFinal(mdctx, reinterpret_cast(signature.constData()), signature.size()) == 1) + { + ok = true; + } + } + } + + EVP_MD_CTX_free(mdctx); + EVP_PKEY_free(pkey); + + if (!ok) + { + qDebug() << "Manifest signature verification failed"; + } + return ok; +#endif +} + +bool UpdaterLogic::verifyManifestSignature(const QString& publicKeyPath) const +{ + if (m_manifest.isEmpty() || m_manifestText.isEmpty()) + { + qDebug() << "No manifest available to verify"; + return false; + } + QString signature = m_manifest.value("signature").toString(); + if (signature.isEmpty()) + { + qDebug() << "Manifest signature empty"; + return false; + } + + QString path = publicKeyPath; + if (!QFile::exists(path)) + { + path = QApplication::applicationDirPath() + "/" + publicKeyPath; + } + return verifySignature(m_manifestText.toUtf8(), signature, path); +} + +bool UpdaterLogic::saveManifestCache(const QString& cacheDir) const +{ + if (m_manifest.isEmpty()) + return false; + + QDir dir(cacheDir); + if (!dir.exists() && !dir.mkpath(".")) + return false; + + QString version = m_manifest.value("version").toString(); + QString filePath = cacheDir + "/manifest_" + version + ".json"; + QFile file(filePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) + return false; + + QJsonObject wrapper; + wrapper["manifest"] = m_manifest; + wrapper["manifest_text"] = m_manifestText; + + QJsonDocument doc(wrapper); + file.write(doc.toJson(QJsonDocument::Indented)); + file.close(); + qDebug() << "Manifest cached to" << filePath; + return true; +} + +bool UpdaterLogic::loadManifestCache(const QString& cacheDir, const QString& version) +{ + QString filePath = cacheDir + "/manifest_" + version + ".json"; + QFile file(filePath); + if (!file.exists() || !file.open(QIODevice::ReadOnly)) + return false; + + QByteArray raw = file.readAll(); + file.close(); + QJsonDocument doc = QJsonDocument::fromJson(raw); + if (!doc.isObject()) + return false; + + QJsonObject wrapper = doc.object(); + if (!wrapper.contains("manifest") || !wrapper.contains("manifest_text")) + return false; + + m_manifest = wrapper["manifest"].toObject(); + m_manifestText = wrapper["manifest_text"].toString(); + qDebug() << "Loaded cached manifest" << version; + return true; +} + +QByteArray UpdaterLogic::canonicalManifestBytes(const QJsonObject& manifest) const +{ + QJsonObject copy = manifest; + copy.remove("signature"); + + auto sortObject = [&](auto&& self, const QJsonObject& obj) -> QJsonObject { + QStringList keys = obj.keys(); + std::sort(keys.begin(), keys.end(), std::less()); + QJsonObject sorted; + for (const auto& key : keys) + { + QJsonValue value = obj.value(key); + if (value.isObject()) + sorted.insert(key, self(self, value.toObject())); + else if (value.isArray()) + { + QJsonArray sortedArray; + for (const auto& element : value.toArray()) + { + if (element.isObject()) + sortedArray.append(self(self, element.toObject())); + else + sortedArray.append(element); + } + sorted.insert(key, sortedArray); + } + else + { + sorted.insert(key, value); + } + } + return sorted; + }; + + QJsonObject sorted = sortObject(sortObject, copy); + QJsonDocument doc(sorted); + return doc.toJson(QJsonDocument::Compact); +} + + +QStringList UpdaterLogic::obsoleteFilesComparedTo(const QJsonObject& oldManifest) const +{ + QSet newPaths; + for (const QJsonValue& value : m_manifest.value("files").toArray()) { + const QString path = QDir::fromNativeSeparators(value.toObject().value("path").toString()); + if (isSafeRelativePath(path)) newPaths.insert(path.toCaseFolded()); + } + + const QSet protectedPaths{ + QStringLiteral("bootstrap.exe"), + QStringLiteral("launcher.exe"), + QStringLiteral("updater.exe"), + QStringLiteral("client.ini"), + QStringLiteral("config/app_config.json"), + QStringLiteral("config/local_state.json"), + QStringLiteral("config/client_identity.dat"), + QStringLiteral("config/version_policy.dat") + }; + QStringList obsolete; + QSet seen; + for (const QJsonValue& value : oldManifest.value("files").toArray()) { + const QString path = QDir::fromNativeSeparators(value.toObject().value("path").toString()); + const QString folded = path.toCaseFolded(); + if (!isSafeRelativePath(path) || protectedPaths.contains(folded) + || newPaths.contains(folded) || seen.contains(folded)) + continue; + seen.insert(folded); + obsolete.append(path); + } + obsolete.sort(Qt::CaseInsensitive); + return obsolete; +} + +bool UpdaterLogic::validateLocalFiles(const QString& stagingDir, const QString& installedDir) const +{ + if (m_manifest.isEmpty()) + return false; + + const QJsonArray files = m_manifest.value("files").toArray(); + for (const auto& item : files) + { + const QJsonObject fileObject = item.toObject(); + const QString path = QDir::fromNativeSeparators(fileObject.value("path").toString()); + const QString expectedSha = fileObject.value("sha256").toString(); + if (!isSafeRelativePath(path)) + return false; + if (isRuntimeProtectedPath(path)) { + qDebug() << "Runtime-protected manifest entry ignored:" << path; + continue; + } + + QString fullPath = QDir(stagingDir).filePath(path); + if (!QFile::exists(fullPath) && !installedDir.isEmpty()) + fullPath = QDir(installedDir).filePath(path); + + if (!QFile::exists(fullPath)) + { + qDebug() << "Manifest file missing from staging and installation:" << path; + return false; + } + const QString actualSha = calcLocalFileSha256(fullPath); + if (actualSha.compare(expectedSha, Qt::CaseInsensitive) != 0) + { + qDebug() << "File hash mismatch:" << path << actualSha << expectedSha; + return false; + } + } + qDebug() << "Full manifest validation passed using staging plus installed files"; + return true; +} + +void UpdaterLogic::getDownloadUrl(const QString& appId, const QString& channel, const QString& targetVer, int versionId) +{ + QString url = m_serverAddr + "/api/v1/update/download-url"; + QJsonObject body; + body["app_id"] = appId; + body["channel"] = channel; + body["version"] = targetVer; + body["version_id"] = versionId; + + QJsonArray emptyFiles; + body["files"] = emptyFiles; + + m_http.postRequest(url, body, [this](int code, const QJsonObject& resp) + { + qDebug() << "Download URL API returned code:" << code; + m_fileItems.clear(); + + if (code == 200) + { + QJsonArray fileArr = resp["files"].toArray(); + for (auto item : fileArr) + { + QJsonObject obj = item.toObject(); + FileDownloadItem fi; + fi.path = obj["path"].toString(); + fi.url = obj["url"].toString(); + fi.sha256 = obj["sha256"].toString(); + fi.size = obj["size"].toVariant().toLongLong(); + m_fileItems.append(fi); + qDebug() << "File info:" << fi.path << fi.url << fi.sha256; + } + } + else + { + qDebug() << "Failed to get download URL"; + } + emit fetchUrlFinished(); + }); +} + + +QString UpdaterLogic::calcLocalFileSha256(const QString& filePath) const +{ + QFile f(filePath); + if (!f.open(QIODevice::ReadOnly)) + return ""; + QCryptographicHash hash(QCryptographicHash::Sha256); + while (!f.atEnd()) + { + QByteArray block = f.read(4096); + hash.addData(block); + } + f.close(); + return hash.result().toHex(); +} + +bool UpdaterLogic::downloadSingleFile(const QString& url, const QString& savePath, + const QString& expectSha256, qint64 expectedSize, + const QString& resumePartPath) +{ + const QString partPath = resumePartPath.isEmpty() ? savePath + ".part" : resumePartPath; + if (!QDir().mkpath(QFileInfo(partPath).path())) return false; + if (QFile::exists(savePath) + && calcLocalFileSha256(savePath).compare(expectSha256, Qt::CaseInsensitive) == 0) + return true; + QFile::remove(savePath); + + for (int attempt = 0; attempt < 4; ++attempt) + { + qint64 existingSize = QFileInfo(partPath).size(); + if (expectedSize >= 0 && existingSize > expectedSize) + { + QFile::remove(partPath); + existingSize = 0; + } + if (expectedSize >= 0 && existingSize == expectedSize && existingSize > 0) + { + if (calcLocalFileSha256(partPath).compare(expectSha256, Qt::CaseInsensitive) == 0) + { + QFile::remove(savePath); + return QFile::rename(partPath, savePath); + } + QFile::remove(partPath); + existingSize = 0; + } + + QFile partFile(partPath); + const QIODevice::OpenMode mode = QIODevice::WriteOnly + | (existingSize > 0 ? QIODevice::Append : QIODevice::Truncate); + if (!partFile.open(mode)) + { + qDebug() << "Cannot open partial download:" << partPath; + return false; + } + + QNetworkAccessManager manager; + manager.setProxy(QNetworkProxy::NoProxy); + QNetworkRequest request(url); + request.setTransferTimeout(60000); + if (existingSize > 0) + request.setRawHeader("Range", QByteArray("bytes=") + QByteArray::number(existingSize) + "-"); + + QNetworkReply* reply = manager.get(request); + QEventLoop loop; + bool writeOk = true; + QObject::connect(reply, &QNetworkReply::readyRead, [&]() { + const QByteArray data = reply->readAll(); + if (!data.isEmpty()) { + if (partFile.write(data) != data.size()) writeOk = false; + m_sessionDownloadedBytes += data.size(); + const qint64 received = qMin(m_downloadTotalBytes, + m_downloadCompletedBytes + partFile.size()); + const double speed = m_downloadTimer.elapsed() > 0 + ? (m_sessionDownloadedBytes * 1000.0 / m_downloadTimer.elapsed()) : 0.0; + emit downloadProgress(received, m_downloadTotalBytes, m_currentDownloadPath, speed); + } + }); + QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); + loop.exec(); + const QByteArray remaining = reply->readAll(); + if (!remaining.isEmpty() && partFile.write(remaining) != remaining.size()) writeOk = false; + partFile.flush(); + partFile.close(); + + const int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + const bool networkOk = reply->error() == QNetworkReply::NoError; + const QString networkError = reply->errorString(); + reply->deleteLater(); + + if (existingSize > 0 && httpStatus == 200) + { + // 服务端忽略 Range,当前文件是“旧片段 + 完整响应”,必须安全重下。 + qDebug() << "Server ignored Range; restart full download:" << savePath; + QFile::remove(partPath); + } + else if (networkOk && writeOk && (httpStatus == 200 || httpStatus == 206)) + { + const qint64 actualSize = QFileInfo(partPath).size(); + if ((expectedSize < 0 || actualSize == expectedSize) + && calcLocalFileSha256(partPath).compare(expectSha256, Qt::CaseInsensitive) == 0) + { + QFile::remove(savePath); + if (QFile::rename(partPath, savePath)) + { + qDebug() << "Download completed/resumed & sha pass:" << savePath; + return true; + } + } + else if (expectedSize >= 0 && actualSize >= expectedSize) + { + qDebug() << "Completed partial file has invalid size or SHA; restart:" << savePath; + QFile::remove(partPath); + } + } + else + { + qDebug() << "Download attempt failed; partial file retained:" << attempt + 1 + << savePath << httpStatus << networkError << "bytes" << QFileInfo(partPath).size(); + } + + if (attempt < 3) + { + const unsigned long delayMs = static_cast(500 * (1 << attempt)); + QElapsedTimer delay; + delay.start(); + while (delay.elapsed() < static_cast(delayMs)) + { + QApplication::processEvents(); + QThread::msleep(50); + } + } + } + return false; +} + +bool UpdaterLogic::isRuntimeProtectedPath(const QString& path) const +{ + const QString normalized = QDir::fromNativeSeparators(path).toCaseFolded(); + static const QSet protectedPaths{ + QStringLiteral("bootstrap.exe"), + QStringLiteral("client.ini"), + QStringLiteral("config/app_config.json"), + QStringLiteral("config/local_state.json"), + QStringLiteral("config/client_identity.dat"), + QStringLiteral("config/version_policy.dat") + }; + return protectedPaths.contains(normalized); +} + +bool UpdaterLogic::isSafeRelativePath(const QString& path) const +{ + const QString normalized = QDir::fromNativeSeparators(path); + const QString clean = QDir::cleanPath(normalized); + return !clean.isEmpty() + && !QDir::isAbsolutePath(clean) + && clean != ".." + && !clean.startsWith("../") + && !clean.contains(":"); +} + +qint64 UpdaterLogic::estimateAdditionalDiskBytes(const QString& targetDir, + const QStringList& obsoletePaths) const +{ + qint64 required = 0; + const QString cacheDir = QDir(targetDir).filePath("update/download_cache"); + for (const auto& item : m_fileItems) { + const QString relativePath = QDir::fromNativeSeparators(item.path); + if (isRuntimeProtectedPath(relativePath)) continue; + const QString installed = QDir(targetDir).filePath(relativePath); + if (QFile::exists(installed) + && calcLocalFileSha256(installed).compare(item.sha256, Qt::CaseInsensitive) == 0) + continue; + + const qint64 partialSize = QFileInfo(QDir(cacheDir).filePath( + item.sha256.toLower() + ".part")).size(); + required += qMax(0, item.size - qMin(item.size, partialSize)); + if (QFile::exists(installed)) required += QFileInfo(installed).size(); + } + for (const QString& path : obsoletePaths) { + const QString installed = QDir(targetDir).filePath(path); + if (QFile::exists(installed)) required += QFileInfo(installed).size(); + } + const qint64 reserve = qMax(128LL * 1024 * 1024, required / 10); + return required + reserve; +} + +bool UpdaterLogic::downloadAllFiles(const QString& tempDir, const QString& targetDir) +{ + if (m_fileItems.isEmpty()) + { + m_downloadAllOk = false; + return false; + } + + QDir stagingDir(tempDir); + if (!FileHelper::createDir(tempDir)) + return false; + const QString resumeCacheDir = QDir(targetDir).filePath("update/download_cache"); + if (!FileHelper::createDir(resumeCacheDir)) + return false; + QSet activePartialNames; + for (const auto& item : m_fileItems) + activePartialNames.insert(item.sha256.toLower() + ".part"); + QDir cacheDir(resumeCacheDir); + for (const QString& fileName : cacheDir.entryList(QStringList() << "*.part", QDir::Files)) { + if (!activePartialNames.contains(fileName.toLower())) + cacheDir.remove(fileName); + } + + m_downloadTotalBytes = 0; + m_downloadCompletedBytes = 0; + m_sessionDownloadedBytes = 0; + for (const auto& item : m_fileItems) { + const QString itemPath = QDir::fromNativeSeparators(item.path); + if (isRuntimeProtectedPath(itemPath)) continue; + const QString installed = QDir(targetDir).filePath(itemPath); + if (!QFile::exists(installed) + || calcLocalFileSha256(installed).compare(item.sha256, Qt::CaseInsensitive) != 0) + m_downloadTotalBytes += item.size; + } + m_downloadTimer.restart(); + emit downloadProgress(0, m_downloadTotalBytes, QString(), 0.0); + + for (const auto& fi : m_fileItems) + { + if (!isSafeRelativePath(fi.path)) + { + qDebug() << "Unsafe relative path in manifest:" << fi.path; + m_downloadAllOk = false; + return false; + } + + const QString relativePath = QDir::fromNativeSeparators(fi.path); + if (isRuntimeProtectedPath(relativePath)) { + qDebug() << "Runtime-protected file skipped:" << relativePath; + continue; + } + const QString installedFile = QDir(targetDir).filePath(relativePath); + if (QFile::exists(installedFile) + && calcLocalFileSha256(installedFile).compare(fi.sha256, Qt::CaseInsensitive) == 0) + { + qDebug() << "Unchanged file, skip download:" << relativePath; + continue; + } + + const QString tempFile = QDir(tempDir).filePath(relativePath); + const QString parentDir = QFileInfo(tempFile).path(); + if (!QDir().mkpath(parentDir)) + { + qDebug() << "Cannot create staging subdirectory:" << parentDir; + m_downloadAllOk = false; + return false; + } + + const QString resumePartPath = QDir(resumeCacheDir).filePath(fi.sha256.toLower() + ".part"); + m_currentDownloadPath = relativePath; + const qint64 resumedBytes = qMin(fi.size, QFileInfo(resumePartPath).size()); + const double speed = m_downloadTimer.elapsed() > 0 + ? (m_sessionDownloadedBytes * 1000.0 / m_downloadTimer.elapsed()) : 0.0; + emit downloadProgress(m_downloadCompletedBytes + resumedBytes, + m_downloadTotalBytes, m_currentDownloadPath, speed); + if (!downloadSingleFile(fi.url, tempFile, fi.sha256, fi.size, resumePartPath)) + { + m_downloadAllOk = false; + return false; + } + m_downloadCompletedBytes += fi.size; + emit downloadProgress(m_downloadCompletedBytes, m_downloadTotalBytes, + m_currentDownloadPath, speed); + } + + m_downloadAllOk = true; + return true; +} + +void UpdaterLogic::reportResult(const QString& deviceId, + const QString& fromVer, + const QString& toVer, + bool success) +{ + QString url = m_serverAddr + "/api/v1/update/report"; + + QJsonObject body; + body["device_id"] = deviceId; + body["from_version"] = fromVer; + body["to_version"] = toVer; + + if (success) + body["result"] = "success"; + else + body["result"] = "fail"; + + m_http.postRequest(url, body, [](int code, const QJsonObject& resp) + { + Q_UNUSED(resp); + qDebug() << "Update result report returned code:" << code; + }); +} + +QList UpdaterLogic::getFileList() const +{ + return m_fileItems; +} \ No newline at end of file diff --git a/client/Updater/UpdaterLogic.h b/client/Updater/UpdaterLogic.h new file mode 100644 index 0000000..6b2c0a3 --- /dev/null +++ b/client/Updater/UpdaterLogic.h @@ -0,0 +1,69 @@ +#pragma once +#include +#include "HttpHelper.h" +#include "FileHelper.h" +#include +#include +#include +#include +#include +#include +#include + +struct FileDownloadItem +{ + QString path; + QString url; + QString sha256; + qint64 size; +}; + +class UpdaterLogic : public QObject +{ + Q_OBJECT +public: + explicit UpdaterLogic(QObject* parent = nullptr); + + void getManifest(const QString& appId, const QString& channel, const QString& targetVer, int versionId); + bool verifyManifestSignature(const QString& publicKeyPath = "config/manifest_public_key.pem") const; + bool validateLocalFiles(const QString& stagingDir, const QString& installedDir = QString()) const; + bool saveManifestCache(const QString& cacheDir) const; + bool loadManifestCache(const QString& cacheDir, const QString& version); + + void getDownloadUrl(const QString& appId, const QString& channel, const QString& targetVer, int versionId); + void reportResult(const QString& deviceId, const QString& fromVer, const QString& toVer, bool success); + bool downloadAllFiles(const QString& tempDir, const QString& targetDir); + qint64 estimateAdditionalDiskBytes(const QString& targetDir, const QStringList& obsoletePaths) const; + QString calcLocalFileSha256(const QString& filePath) const; + + QList getFileList() const; + QJsonObject getManifest() const { return m_manifest; } + QStringList obsoleteFilesComparedTo(const QJsonObject& oldManifest) const; + QString getManifestText() const { return m_manifestText; } + bool allDownloadSuccess() const { return m_downloadAllOk; } + +signals: + void fetchUrlFinished(); + void downloadProgress(qint64 receivedBytes, qint64 totalBytes, + const QString& currentPath, double bytesPerSecond); + +private: + bool downloadSingleFile(const QString& url, const QString& savePath, const QString& expectSha256, + qint64 expectedSize, const QString& resumePartPath); + bool isSafeRelativePath(const QString& path) const; + bool isRuntimeProtectedPath(const QString& path) const; + QByteArray canonicalManifestBytes(const QJsonObject& manifest) const; + bool verifySignature(const QByteArray& payload, const QString& signatureBase64, const QString& publicKeyPath) const; + + HttpHelper m_http; + QString m_serverAddr; + QJsonObject m_manifest; + QString m_manifestText; + QList m_fileItems; + bool m_downloadAllOk = false; + qint64 m_downloadTotalBytes = 0; + qint64 m_downloadCompletedBytes = 0; + qint64 m_sessionDownloadedBytes = 0; + QString m_currentDownloadPath; + QElapsedTimer m_downloadTimer; +}; \ No newline at end of file diff --git a/client/Updater/main.cpp b/client/Updater/main.cpp new file mode 100644 index 0000000..f782472 --- /dev/null +++ b/client/Updater/main.cpp @@ -0,0 +1,325 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "UpdaterLogic.h" +#include "UpdateTransaction.h" +#include "FileHelper.h" +#include "ConfigHelper.h" + +int main(int argc, char* argv[]) +{ + SetConsoleOutputCP(65001); + QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); + QApplication app(argc, argv); + QApplication::setApplicationName("Marsco Updater"); + + if (argc < 5) { + QMessageBox::critical(nullptr, "更新器参数错误", "更新器缺少应用、渠道或目标版本参数,请从 Launcher 启动。"); + return -1; + } + + const QString appId = argv[1]; + const QString channel = argv[2]; + const QString targetVersion = argv[3]; + const int targetVersionId = QString(argv[4]).toInt(); + QString bootstrapResult; + for (int i = 5; i < argc; ++i) { + const QString arg = argv[i]; + if (arg.startsWith("--bootstrap-resume=")) + bootstrapResult = arg.mid(QString("--bootstrap-resume=").size()); + } + const bool resumingFromBootstrap = !bootstrapResult.isEmpty(); + const QString targetDir = QApplication::applicationDirPath(); + + ConfigHelper& config = ConfigHelper::instance(); + QString fromVersion = config.getValue("App", "current_version"); + QString deviceId = config.getValue("Update", "device_id"); + if (deviceId.isEmpty()) deviceId = "unknown_device"; + + if (!resumingFromBootstrap) { + QString restoredVersion; + QString recoveryError; + if (!UpdateTransaction::recoverInterrupted(targetDir, &restoredVersion, &recoveryError)) { + QMessageBox::critical(nullptr, "更新恢复失败", + QString("检测到上次更新未完成,但无法恢复旧版本:%1\n请不要继续运行软件,并联系管理员。").arg(recoveryError)); + return -1; + } + if (!restoredVersion.isEmpty() && restoredVersion != fromVersion) { + if (!config.setValue("App", "current_version", restoredVersion)) { + QMessageBox::critical(nullptr, "更新恢复失败", "旧文件已经恢复,但无法恢复版本状态,请检查配置目录写入权限。"); + return -1; + } + fromVersion = restoredVersion; + } + } + + QProgressDialog progress("正在准备更新...", QString(), 0, 100); + progress.setWindowTitle(QString("正在更新到 %1").arg(targetVersion)); + progress.setCancelButton(nullptr); + progress.setWindowModality(Qt::ApplicationModal); + progress.setMinimumDuration(0); + progress.setAutoClose(false); + progress.setValue(2); + progress.show(); + QApplication::processEvents(); + + UpdaterLogic logic; + UpdateTransaction transaction(targetDir, fromVersion, targetVersion, targetVersionId); + const auto setProgress = [&](int value, const QString& message) { + progress.setValue(value); + progress.setLabelText(message); + QApplication::processEvents(); + }; + const auto formatBytes = [](qint64 bytes) { + const double value = static_cast(bytes); + if (bytes >= 1024LL * 1024 * 1024) + return QString::number(value / (1024.0 * 1024 * 1024), 'f', 2) + " GB"; + if (bytes >= 1024LL * 1024) + return QString::number(value / (1024.0 * 1024), 'f', 2) + " MB"; + if (bytes >= 1024) + return QString::number(value / 1024.0, 'f', 1) + " KB"; + return QString::number(bytes) + " B"; + }; + QObject::connect(&logic, &UpdaterLogic::downloadProgress, + [&](qint64 received, qint64 total, const QString& path, double bytesPerSecond) { + const int value = total > 0 ? 30 + static_cast(30 * received / total) : 60; + const QString fileText = path.isEmpty() ? QString("正在准备下载...") + : QString("正在下载:%1").arg(path); + progress.setValue(value); + progress.setLabelText(QString("%1\n%2 / %3 · %4/s") + .arg(fileText, formatBytes(received), formatBytes(total), + formatBytes(static_cast(bytesPerSecond)))); + QApplication::processEvents(); + }); + const auto fail = [&](const QString& title, const QString& message, + const QString& errorCode = QString("update_failed")) { + transaction.markFailed(errorCode, message); + logic.reportResult(deviceId, fromVersion, targetVersion, false); + progress.close(); + QMessageBox::critical(nullptr, title, message); + return -1; + }; + const QString mainAppPath = QDir(targetDir).filePath("MainApp.exe"); + const QString updaterPath = QDir(targetDir).filePath("Updater.exe"); + const QString bootstrapPath = QDir(targetDir).filePath("Bootstrap.exe"); + const QString launchToken = config.getValue("App", "launch_token"); + const auto launchMainApp = [&](const QString& healthFile = QString()) { + QStringList args{QString("--launcher-token=%1").arg(launchToken)}; + if (!healthFile.isEmpty()) args.append(QString("--health-file=%1").arg(healthFile)); + return QProcess::startDetached(mainAppPath, args); + }; + const auto bootstrapPlanFile = [&]() { + return QDir(targetDir).filePath("update/bootstrap_plan_" + transaction.transactionId() + ".txt"); + }; + const auto launchBootstrap = [&](const QString& mode) { + const QStringList args{ + bootstrapPlanFile(), targetDir, transaction.stagingDir(), transaction.backupDir(), updaterPath, + QString::number(QCoreApplication::applicationPid()), appId, channel, + targetVersion, QString::number(targetVersionId), mode + }; + return QFile::exists(bootstrapPath) && QProcess::startDetached(bootstrapPath, args); + }; + const auto delegateRollback = [&](const QString& title, const QString& reason) { + FileHelper::killProcess("MainApp.exe"); + transaction.markRollbackRequired(reason); + progress.setLabelText("正在将回滚工作移交给 Bootstrap..."); + QApplication::processEvents(); + if (launchBootstrap("rollback")) { + progress.close(); + return 0; + } + logic.reportResult(deviceId, fromVersion, targetVersion, false); + progress.close(); + QMessageBox::critical(nullptr, title, + reason + "\n\n无法启动 Bootstrap 执行回滚。请不要继续运行软件,并联系管理员。"); + return -1; + }; + + if (resumingFromBootstrap) { + QString resumeError; + if (!transaction.resumeExisting(&resumeError)) { + logic.reportResult(deviceId, fromVersion, targetVersion, false); + progress.close(); + QMessageBox::critical(nullptr, "事务续办失败", + QString("无法读取 Bootstrap 更新事务:%1").arg(resumeError)); + return -1; + } + fromVersion = transaction.fromVersion(); + if (bootstrapResult == "rolledback") { + const bool stateOk = config.setValue("App", "current_version", fromVersion); + transaction.markRolledBack(); + logic.reportResult(deviceId, fromVersion, targetVersion, false); + if (stateOk) launchMainApp(); + progress.close(); + QMessageBox::warning(nullptr, "更新已回滚", + stateOk ? "新版本安装或启动失败,已自动恢复并启动旧版本。" + : "旧文件已经恢复,但旧版本号写回失败,请检查配置目录权限。"); + return stateOk ? 0 : -1; + } + if (bootstrapResult != "success") { + logic.reportResult(deviceId, fromVersion, targetVersion, false); + progress.close(); + QMessageBox::critical(nullptr, "自动回滚失败", + "Bootstrap 无法完整恢复旧版本。请不要继续运行软件,并联系管理员。"); + return -1; + } + } else if (!transaction.initialize()) { + return fail("更新准备失败", "无法创建更新事务目录或保存事务状态。", "transaction_init_failed"); + } + + setProgress(resumingFromBootstrap ? 72 : 10, "正在获取并验证版本清单..."); + logic.getManifest(appId, channel, targetVersion, targetVersionId); + if (!logic.verifyManifestSignature()) { + if (resumingFromBootstrap) + return delegateRollback("安全验证失败", "Bootstrap 安装后无法重新验证版本清单签名。"); + return fail("安全验证失败", "版本清单签名无效,更新已停止。请联系管理员。", "manifest_signature_invalid"); + } + const QString manifestCacheDir = QDir(targetDir).filePath("update/manifest_cache"); + QStringList obsoletePaths; + if (!resumingFromBootstrap && fromVersion != targetVersion) { + UpdaterLogic oldManifestLogic; + if (oldManifestLogic.loadManifestCache(manifestCacheDir, fromVersion) + && oldManifestLogic.getManifest().value("version").toString() == fromVersion + && oldManifestLogic.verifyManifestSignature()) { + obsoletePaths = logic.obsoleteFilesComparedTo(oldManifestLogic.getManifest()); + qDebug() << "Obsolete files from signed previous manifest:" << obsoletePaths; + } else { + qDebug() << "No valid signed previous manifest cache; obsolete deletion skipped for safety"; + } + } + if (!logic.saveManifestCache(manifestCacheDir)) { + if (resumingFromBootstrap) + return delegateRollback("清单缓存失败", "无法保存新版本 Manifest 缓存。"); + return fail("清单缓存失败", "无法保存新版本 Manifest 缓存,更新已停止。", "manifest_cache_failed"); + } + + if (!resumingFromBootstrap) { + setProgress(25, "正在获取安全下载地址..."); + logic.getDownloadUrl(appId, channel, targetVersion, targetVersionId); + if (logic.getFileList().isEmpty()) + return fail("没有可更新文件", "服务器没有返回任何版本文件,更新已停止。", "empty_file_list"); + + QStorageInfo storage(targetDir); + storage.refresh(); + const qint64 requiredBytes = logic.estimateAdditionalDiskBytes(targetDir, obsoletePaths); + const qint64 availableBytes = storage.bytesAvailable(); + if (!storage.isValid() || !storage.isReady() || availableBytes < requiredBytes) { + return fail("磁盘空间不足", + QString("更新至少需要 %1 可用空间,安装盘当前仅剩 %2。\n" + "所需空间已包含下载文件、旧版本备份和安全余量。") + .arg(formatBytes(requiredBytes), formatBytes(qMax(0, availableBytes))), + "disk_space_insufficient"); + } + + const QString stagingDir = transaction.stagingDir(); + setProgress(30, QString("正在下载并校验 %1 个版本文件...").arg(logic.getFileList().size())); + if (!logic.downloadAllFiles(stagingDir, targetDir)) + return fail("下载失败", "部分文件下载失败或 SHA-256 校验未通过,请检查网络后重试。", "download_failed"); + + setProgress(58, "正在校验完整版本文件..."); + if (!logic.validateLocalFiles(stagingDir, targetDir)) + return fail("文件校验失败", "暂存文件与版本清单不一致,更新已停止。", "staging_verify_failed"); + + QStringList changedPaths; + QDir stagingRoot(stagingDir); + QDirIterator stagingFiles(stagingDir, QDir::Files, QDirIterator::Subdirectories); + while (stagingFiles.hasNext()) + changedPaths.append(QDir::fromNativeSeparators(stagingRoot.relativeFilePath(stagingFiles.next()))); + for (const QString& path : changedPaths) { + if (path.compare("Bootstrap.exe", Qt::CaseInsensitive) == 0) + return fail("Bootstrap 无法自更新", "本次版本包含新的 Bootstrap.exe。请使用安装包升级 Bootstrap,再重新发布业务版本。", "bootstrap_self_update_blocked"); + } + if (!transaction.recordVerifiedFiles(changedPaths, obsoletePaths)) + return fail("事务记录失败", "无法保存已校验或待删除文件列表,更新已停止。", "transaction_record_failed"); + + setProgress(66, "正在关闭主程序..."); + if (!FileHelper::killProcess("MainApp.exe")) + return fail("无法关闭主程序", "MainApp.exe 仍在运行,请手动关闭后重试。", "mainapp_close_failed"); + + setProgress(72, QString("正在备份 %1 个待变更文件(其中删除 %2 个)...") + .arg(changedPaths.size() + obsoletePaths.size()).arg(obsoletePaths.size())); + if (!transaction.backupCurrentFiles()) + return fail("备份失败", "无法备份当前版本文件,尚未安装新版本。请检查磁盘空间和目录权限。", "backup_failed"); + + const QString planFile = bootstrapPlanFile(); + QSaveFile plan(planFile); + if (!plan.open(QIODevice::WriteOnly)) + return fail("接管准备失败", "无法创建 Bootstrap 文件计划。", "bootstrap_plan_failed"); + const auto writePlanItem = [&](char operation, const QString& path) { + const QByteArray line = QByteArray(1, operation) + '\t' + path.toUtf8() + '\n'; + return plan.write(line) == line.size(); + }; + for (const QString& path : changedPaths) { + if (!writePlanItem('C', path)) { + plan.cancelWriting(); + return fail("接管准备失败", "无法写入 Bootstrap 复制计划。", "bootstrap_plan_failed"); + } + } + for (const QString& path : obsoletePaths) { + if (!writePlanItem('D', path)) { + plan.cancelWriting(); + return fail("接管准备失败", "无法写入 Bootstrap 删除计划。", "bootstrap_plan_failed"); + } + } + if (!plan.commit() || !transaction.markAwaitingBootstrap()) + return fail("接管准备失败", "无法提交 Bootstrap 文件计划或事务状态。", "bootstrap_plan_failed"); + + setProgress(78, "正在将安装工作移交给 Bootstrap..."); + if (!launchBootstrap("install")) + return fail("Bootstrap 启动失败", QString("无法启动独立更新接管程序:%1").arg(bootstrapPath), "bootstrap_start_failed"); + progress.close(); + return 0; + } + + setProgress(82, "正在校验 Bootstrap 安装结果..."); + if (!transaction.markPostVerify() || !logic.validateLocalFiles(targetDir)) + return delegateRollback("安装校验失败", "新版本文件安装后校验未通过。"); + for (const QString& path : transaction.obsoletePaths()) { + if (QFile::exists(QDir(targetDir).filePath(path))) + return delegateRollback("废弃文件清理失败", QString("废弃文件仍然存在:%1").arg(path)); + } + + setProgress(89, "正在保存新版本状态..."); + if (!config.setValue("App", "current_version", targetVersion) + || config.getValue("App", "current_version") != targetVersion) + return delegateRollback("状态保存失败", "无法保存当前版本号。"); + + const QString healthFile = transaction.healthFile(); + QFile::remove(healthFile); + setProgress(94, "正在启动新版本并等待健康确认..."); + if (!launchMainApp(healthFile)) + return delegateRollback("启动失败", "MainApp.exe 无法启动。"); + + QElapsedTimer healthTimer; + healthTimer.start(); + while (healthTimer.elapsed() < 15000 && !QFile::exists(healthFile)) { + QApplication::processEvents(); + QThread::msleep(100); + } + if (!QFile::exists(healthFile)) + return delegateRollback("启动确认失败", "新版本在 15 秒内没有完成启动健康确认。"); + + setProgress(99, "正在提交更新事务..."); + if (!transaction.commit()) + return delegateRollback("事务提交失败", "新版本已经启动,但无法提交更新事务。"); + + QFile::remove(healthFile); + QFile::remove(bootstrapPlanFile()); + logic.reportResult(deviceId, fromVersion, targetVersion, true); + progress.setValue(100); + progress.close(); + QMessageBox::information(nullptr, "更新完成", QString("软件已成功更新到 %1,并通过启动健康检查。").arg(targetVersion)); + return 0; +} diff --git a/client/admin.html b/client/admin.html new file mode 100644 index 0000000..6f9191e --- /dev/null +++ b/client/admin.html @@ -0,0 +1,622 @@ + + + + + + Marsco 发布控制台 + + +
+

软件发布控制台

+
+

管理员令牌

+
+ + + + + +
+
令牌默认隐藏,仅保存在当前浏览器;服务端只保存令牌哈希。
+ +
+ +
+

应用管理

+
+ + + +
+
+ + + + + +
+
+ +
+

发布新版本

+
+ + + + + + +
+
+ + + 请选择包含 MainApp.exe 的发布目录 + +
+
尚未选择发布目录
+
+ +
+

版本列表

+
+ + 当前应用:未选择 + 将历史版本设为最新时,仅在该渠道策略勾选“允许降级”后客户端才会回退。 +
+ + + + + + + + + + + + +
ID版本渠道最新创建时间操作
+
+ +
+

版本运行策略

+
+ + + + +
+
+ + + +
+
+ + + 当前 policy_seq:- +
+
+ +
+

升级日志

+
+ +
+ + + + + + + + + + + +
设备旧版本新版本结果时间
+
+ +
+

调试输出

+
准备就绪...
+
+ + + + diff --git a/client/client.ini b/client/client.ini new file mode 100644 index 0000000..a9ea8f0 --- /dev/null +++ b/client/client.ini @@ -0,0 +1,14 @@ +[Server] +api_base_url=http://192.168.229.128:8000 +client_token=AuthKey202606Demo + +[App] +app_id=testadmin +current_version=1.0.0 +channel=stable +launch_token=UpdateSecret2026Demo + +[Update] +request_timeout_ms=5000 +temp_folder=update_temp +device_id=test_device_001 \ No newline at end of file diff --git a/client/config/app_config.example.json b/client/config/app_config.example.json new file mode 100644 index 0000000..b13e4b3 --- /dev/null +++ b/client/config/app_config.example.json @@ -0,0 +1,14 @@ +{ + "app_id": "your_app_id", + "app_name": "Your Application", + "channel": "stable", + "api_base_url": "http://127.0.0.1:8000", + "platform": "windows", + "arch": "x64", + "current_version": "1.0.0", + "client_token": "replace_me", + "launch_token": "replace_me", + "request_timeout_ms": 5000, + "temp_folder": "update_temp", + "device_id": "" +} diff --git a/client/config/local_state.json b/client/config/local_state.json new file mode 100644 index 0000000..daa85ab --- /dev/null +++ b/client/config/local_state.json @@ -0,0 +1,6 @@ +{ + "max_policy_seq": 0, + "last_success_run_at": "", + "last_online_verified_at": "", + "last_success_version": "" +} diff --git a/client/config/manifest_public_key.pem b/client/config/manifest_public_key.pem new file mode 100644 index 0000000..781682f --- /dev/null +++ b/client/config/manifest_public_key.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuMROESbT36XU4d3YjuwU +WAC2h5p3btFu/IAeF3bVtHMovIA4ZXXKYsiq5FycDnDzyD86ou3B7PP7uHhVhn2l +Uru7QElYRfEfQAFSU5dErc+SZo+oT170cgq1ePPD/YleKPRqFAL221Tbh5pusHcZ +Ocujit2qrfg5f4rIEzWu7kBKVSJ6WChkjetEL6OZ43ClkDyUGebUuaQ9dv39YVlv +Fp2pfARi7/7djMMncLVaFU2AAIuSy3jgQg65DOFRVPSr1P/rRfuqU55ZmqAmmZIs +F/KVpne6zLFBXrxf5rNTBch+nxX+hcE7M+K0PJA5Ie669qRQFRwxoJlGpSOvMefQ +TwIDAQAB +-----END PUBLIC KEY----- diff --git a/client/config/version_policy.dat b/client/config/version_policy.dat new file mode 100644 index 0000000..da9b067 --- /dev/null +++ b/client/config/version_policy.dat @@ -0,0 +1 @@ +{"disabled_versions":[],"force_update":false,"offline_allowed":true,"policy_seq":1,"valid_until":"2099-12-31T23:59:59Z","signature":"d6982cb02d9a0c6fb6b7176961a7736dbee0decfbd5e422bd189521c72664205"} \ No newline at end of file diff --git a/client/pdf_requirements.txt b/client/pdf_requirements.txt new file mode 100644 index 0000000..05dcc33 --- /dev/null +++ b/client/pdf_requirements.txt @@ -0,0 +1,2943 @@ +MARSCO_内部 + +软件自动升级与版本控制系统开发设计文档 + +v0.1 + +角色 + +编写 + +校对 + +校正 + +姓名 + +待填写 + +待填写 + +待填写 + +日期 + +待填写 + +待填写 + +待填写 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + + + + + + MARSCO_内部 + +修订记录 + +版本 + +日期 + +修订章节 + +修订内容 + +v0.1 + +2026-06- + +技术选型 + +明确客户端与服务端技术栈边界。 + +修订人 + +待填写 + +23 + +v0.1 + +2026-06- + +总体架构 + +梳理客户端、服务端和对象存储交互关 + +待填写 + +23 + +系。 + +v0.1 + +2026-06- + +客户端目录结 + +将目录树整理为正式表格。 + +待填写 + +23 + +构 + +v0.1 + +2026-06- + +本地配置文件 + +补充 app_config、client_identity、 + +待填写 + +23 + +设计 + +version_policy、local_state 字段说 + +明。 + +v0.1 + +2026-06- + +Manifest 设计 补充全量清单、签名和文件完整性规则。 待填写 + +23 + +v0.1 + +2026-06- + +启动票据设计 明确票据用途、校验规则和安全边界。 + +待填写 + +23 + +v0.1 + +2026-06- + +客户端启动逻 + +新增 Visio 流程图和步骤表。 + +待填写 + +23 + +辑 + +v0.1 + +2026-06- + +REST API 设计 明确设备身份接口非用户登录,补充管理 + +待填写 + +23 + +员登录仅用于后台。 + +v0.1 + +2026-06- + +数据库设计 + +补充应用、通道、版本、策略、设备、授 + +待填写 + +23 + +权和审计日志表。 + +v0.1 + +2026-06- + +对象存储目录 + +将对象存储目录整理为正式表格。 + +待填写 + +23 + +设计 + +v0.1 + +2026-06- + +Hash 校验策略 明确更新可增量、校验必须全量。 + +待填写 + +23 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +v0.1 + +2026-06- + +签名策略 + +补充签名算法、key_id 和稳定序列化要 + +待填写 + +23 + +求。 + +v0.1 + +2026-06- + +限流策略 + +将限流规则整理为表格。 + +待填写 + +23 + +v0.1 + +2026-06- + +回滚机制 + +补充事务状态机和失败恢复规则。 + +待填写 + +23 + +v0.1 + +2026-06- + +Demo 开发里程 + +按阶段整理开发计划。 + +待填写 + +23 + +碑 + +v0.1 + +2026-06- + +Demo 验收用例 补充升级、回滚、禁用、预览版、离线等 + +待填写 + +23 + +验收用例。 + +v0.1 + +2026-06- + +后续扩展方向 补充 License、灰度、多平台、日志上传 + +待填写 + +23 + +等扩展方向。 + +v0.1 + +2026-06- + +设计范围与登 + +明确本期默认可用且不做普通用户登录校 + +待填写 + +23 + +录边界 + +验;管理员登录仅用于后台。 + +v0.1 + +2026-06- + +本期范围 + +明确普通用户登录本期不做,默认可用; + +待填写 + +23 + +后续可扩展权限和授权校验。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + + MARSCO_内部 + +目录 + +1 设计范围与登录边界 ............................................................................................................. 6 + +2 技术选型 ............................................................................................................................. 6 + +2.1 客户端技术栈 ..................................................................................................................... 6 + +2.2 服务端技术栈 ..................................................................................................................... 7 + +2.3 文件存储 ............................................................................................................................ 8 + +3 总体架构 .............................................................................................................................. 8 + +4 客户端目录结构 .................................................................................................................... 9 + +5 本地配置文件设计 .............................................................................................................. 11 + +5.1 app_config.json ................................................................................................................ 11 + +5.2 client_identity.dat ............................................................................................................. 11 + +5.3 version_policy.dat ............................................................................................................ 11 + +5.4 local_state.json ................................................................................................................ 12 + +6 Manifest 设计 .................................................................................................................... 13 + +7 启动票据设计 ..................................................................................................................... 14 + +8 客户端启动逻辑 .................................................................................................................. 15 + +8.1 Launcher 启动逻辑 ........................................................................................................... 16 + +8.2 MainApp 启动逻辑 ............................................................................................................ 18 + +8.3 Updater 升级逻辑 ............................................................................................................. 20 + +9 REST API 设计 .................................................................................................................... 21 + +9.1 检查更新接口 ................................................................................................................... 21 + +9.2 获取下载链接接口 ............................................................................................................ 24 + +9.3 升级结果上报接口 ............................................................................................................ 25 + +9.4 设备身份签发接口(非用户登录) .................................................................................... 26 + +9.5 管理后台管理员登录接口(非本期普通客户端用户登录) ................................................. 27 + +9.6 管理后台接口摘要 ............................................................................................................ 28 + +10 数据库设计 ....................................................................................................................... 29 + +10.1 应用表 apps ................................................................................................................... 29 + +10.2 版本通道表 channels ...................................................................................................... 29 + +10.3 版本表 versions .............................................................................................................. 30 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +10.4 版本文件表 version_files ................................................................................................. 31 + +10.5 版本策略表 version_policies ............................................................................................ 32 + +10.6 设备表 devices ............................................................................................................... 33 + +10.7 授权表 licenses .............................................................................................................. 33 + +10.8 下载日志表 download_logs ............................................................................................. 34 + +10.9 升级日志表 upgrade_logs ................................................................................................ 35 + +10.10 管理员表 admin_users .................................................................................................. 35 + +10.11 管理员操作日志表 admin_audit_logs ............................................................................. 36 + +11 对象存储目录设计 ............................................................................................................. 37 + +12 Hash 校验策略 ................................................................................................................. 38 + +13 签名策略 .......................................................................................................................... 38 + +14 限流策略 .......................................................................................................................... 41 + +15 回滚机制 .......................................................................................................................... 42 + +16 Demo 开发里程碑 ............................................................................................................. 45 + +16.1 第一阶段:基础框架 ....................................................................................................... 45 + +16.2 第二阶段:服务端基础能力 ............................................................................................ 45 + +16.3 第三阶段:在线更新 ....................................................................................................... 45 + +16.4 第四阶段:版本策略 ....................................................................................................... 46 + +16.5 第五阶段:离线能力 ....................................................................................................... 46 + +16.6 第六阶段:可靠性与安全 ................................................................................................ 46 + +17 Demo 验收用例 ................................................................................................................ 46 + +18 后续扩展方向 ................................................................................................................... 47 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + + + MARSCO_内部 + +1 设计范围与登录边界 + +本设计文档用于说明软件自动升级与版本控制系统第一版 Demo + +的技术方案。设计范围包括客户端启动器、主程序启动校验、独立升 + +级器、版本策略、manifest、签名校验、下载授权、离线运行、回滚机 + +制、管理后台和基础服务端接口。 + +本 期 普 通 客 户 端 用 户 默 认 可 以 使 用 软 件 , 不 需 要 登 录 账 号 。 + +Launcher 启动检查、MainApp 启动校验、Updater 下载与替换、离线 + +启动、离线更新包导入、版本禁用和降级控制均不做普通用户登录校 + +验,只使用设备身份、版本策略、manifest、启动票据和签名校验。 + +本期客户端侧不实现普通用户登录。所有客户端请求使用设备身 + +份凭证进行识别,设备身份凭证不代表用户账号,也不产生用户会话。 + +后续版本可以增加普通用户登录能力,用于用户权限校验、用户 + +授权状态判断,以及判断该用户是否可以使用该软件。该能力属于后 + +续扩展,不纳入本期 Demo 必做范围。 + +后续如增加普通用户登录,建议放在 Launcher 启动检查阶段或 + +MainApp 首次进入业务前,用于用户级授权状态判断。该能力不替代 + +设备身份、版本策略、manifest、启动票据和签名校验。 + +管理后台管理员登录属于本期范围,仅用于保护后台版本发布、 + +策略修改、设备管理、离线包生成和日志查看等管理操作。该登录不 + +是普通客户端用户登录,普通客户端用户不调用管理后台管理员登录 + +接口,也不持有后台访问令牌。 +2 技术选型 +2.1 客户端技术栈 + +客户端采用 Qt + C++ 开发。 + +客户端程序包括: + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +a) Launcher.exe + +软件启动器。 + +b) MainApp.exe + +主业务程序,用于 Demo 演示主软件启动、版本显示和 DLL 加载。 + +c) Updater.exe + +独立升级器,负责下载、校验、替换、回滚和重启。 + +d) demo_plugin.dll + +Demo 插件 DLL,用于验证 DLL 替换能力。 + +e) UpdateHelper.exe + +可选辅助程序,用于后续处理 Updater 自身更新。 + +客户端推荐使用 Qt 模块: + +a) QNetworkAccessManager:HTTP API 请求和文件下载。 + +b) QJsonDocument:JSON 解析。 + +c) QFile、QDir:文件操作。 + +d) QCryptographicHash:SHA-256 hash 计算。 + +e) QProcess:启动和关闭外部进程。 + +f) QTimer:定时检查版本。 + +g) QLockFile:防止重复启动升级器。 + +h) QSaveFile:安全写入本地配置文件。 + +i) QSettings:本地配置管理。 + +j) QTemporaryDir:临时目录管理。 + +2.2 服务端技术栈 + +Demo 阶段建议使用: + +a) Python FastAPI。 + +b) SQLite。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +c) MinIO。 + +d) Redis 可选,用于限流。 + +正式阶段可选: + +a) Python FastAPI + PostgreSQL + Redis + MinIO / OSS。 + +b) Go + PostgreSQL + Redis + MinIO / OSS。 + +接口采用 HTTP REST JSON 方式约定。 + +2.3 文件存储 + +Demo 阶段使用 MinIO。 + +正式阶段可使用: + +a) 阿里云 OSS。 + +b) 腾讯云 COS。 + +c) 华为云 OBS。 + +d) AWS S3。 + +e) 私有化 MinIO。 + +f) 企业内网对象存储。 + +版本文件不建议直接存入数据库。数据库只存文件元数据、hash、 + +大小、存储路径和版本关系。 +3 总体架构 + +系统总体架构如下: + +客户端: + +a) Launcher.exe + +b) MainApp.exe + +c) Updater.exe + +d) 本地身份凭证 + +e) 本地版本策略缓存 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +f) 本地 manifest 缓存 + +g) staging 下载目录 + +h) backup 备份目录 + +i) + +logs 日志目录 + +服务端: + +a) API 服务。 + +b) 管理后台。 + +c) 数据库。 + +d) 对象存储。 + +e) Redis 限流模块。 + +f) 签名服务模块。 + +交互流程: + +a) 客户端请求服务端 API。 + +b) 服务端验证设备身份。 + +c) 服务端返回版本策略。 + +d) 客户端根据策略判断是否允许运行或升级。 + +e) 需要升级时,客户端请求下载链接。 + +f) 服务端生成短期对象存储下载 URL。 + +g) 客户端下载文件并校验。 + +h) 客户端替换文件并上报结果。 + +4 客户端目录结构 + +建议客户端目录如下: + +目录或文件 + +DemoApp/ + +Launcher.exe + +MainApp.exe + +用途 + +客户端安装根目录 + +默认启动入口,负责版本准入检查和启动票据生成 + +主业务程序 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +Updater.exe + +UpdateHelper.exe + +独立升级程序 + +可选辅助程序,用于处理 Updater 自身更新 + +plugins/demo_plugin.dll + +Demo 插件 DLL,用于验证 DLL 替换能力 + +bin/ + +config/app_config.json + +运行依赖目录 + +客户端基础配置 + +config/client_identity.dat + +本地设备身份凭证 + +config/version_policy.dat + +本地版本策略缓存 + +config/local_state.json + +本地运行状态和防回滚状态 + +update/manifest_cache/ + +manifest 缓存目录 + +update/staging/ + +update/backup/ + +update/logs/ + +data/ + +cache/ + +logs/ + +说明: + +更新文件下载临时目录 + +升级前备份目录 + +升级日志目录 + +用户数据目录,不纳入 hash 校验 + +缓存目录 + +运行日志目录 + +a) config/client_identity.dat:本地设备身份凭证。 + +b) config/version_policy.dat:本地版本策略。 + +c) update/manifest_cache:缓存 manifest。 + +d) update/staging:下载新文件的临时目录。 + +e) update/backup:升级前备份目录。 + +f) update/logs:升级日志。 + +g) plugins:插件 DLL 目录,需要进行白名单检查。 + +h) data:用户数据目录,不纳入 hash 校验。 + +i) + +logs:运行日志目录,不纳入 hash 校验。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +5 本地配置文件设计 +5.1 app_config.json + +字段 + +app_id + +app_name + +channel + +api_base_url + +platform + +arch + +current_version +5.2 client_identity.dat + +示例值 + +marsco_demo_app + +Marsco Demo App + +stable + +https://api.example.com/api/v1 + +windows + +x64 + +1.0.0 + +该文件由服务端签发,客户端只验证,不自行伪造。 + +字段 + +client_id + +device_id + +license_id + +app_id + +channel + +issued_at + +valid_until + +signature +5.3 version_policy.dat + +字段 + +app_id + +client_id + +示例值 + +client_xxx + +device_xxx + +license_xxx + +marsco_demo_app + +stable + +2026-06-23T00:00:00Z + +2026-12-31T00:00:00Z + +base64_signature + +示例值 + +marsco_demo_app + +client_xxx + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +1024 + +stable + +1.0.0 + +True + +False + +False + +True + +2026-06-23T00:00:00Z + +2026-07-23T00:00:00Z + +1.0.2 + +1.0.0 + +当前版本允许使用 + +base64_signature + +policy_seq + +channel + +current_version + +allow_run + +force_update + +allow_rollback + +offline_allowed + +issued_at + +valid_until + +latest_version + +min_supported_version + +message + +signature +5.4 local_state.json + +用于记录本地状态,防止策略回滚和系统时间回拨。 + +字段 + +max_policy_seq + +last_success_run_at + +last_online_verified_at + +last_success_version + +示例值 + +1024 + +2026-06-23T10:00:00Z + +2026-06-23T09:50:00Z + +1.0.0 + +离线时间和策略回滚判断规则: + +a) max_policy_seq 只能递增,不能被旧策略覆盖。 + +b) 新读取的 version_policy.policy_seq 小于 max_policy_seq 时,客户 + +端应拒绝启动。 + +c) 当前系统时间早于 last_success_run_at 时,视为疑似时间回拨。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +d) 当前系统时间早于 last_online_verified_at 时,视为疑似时间回拨。 + +e) 离线启动时必须同时满足:策略签名正确、policy_seq 未倒退、 + +offline_allowed 为 true、当前时间未超过 valid_until、未检测到 + +明显时间回拨。 + +f) 联网校验成功后更新 last_online_verified_at 和本地缓存策略。 + +g) 每次成功启动后更新 last_success_run_at。 + +6 Manifest 设计 + +manifest 必须是当前版本的全量受控文件清单。 + +字段 + +app_id + +version + +channel + +platform + +arch + +manifest_seq + +created_at + +files + +signature + +规则: + +示例值 + +marsco_demo_app + +1.0.2 + +stable + +windows + +x64 + +3001 + +2026-06-23T00:00:00Z + +[{"path": "Launcher.exe", "sha256": "aaa", "size": + +123456, "executable": true}, {"path": "MainApp.exe", + +"sha256": "bbb", "size": 223456, "executable": true}, + +{"path": "Updater.exe", "sha256": "ccc", "size": 323456, + +"executable": true}, {"path": "plugins/demo_plugin.dll", + +"sha256": "ddd", "size": 423456, "executable": false}] + +base64_signature + +a) manifest 中列出的文件必须存在。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +b) manifest 中列出的文件 hash 必须一致。 + +c) 受控目录下未在 manifest 中出现的 exe、dll 文件应视为异常。 + +d) manifest 必须由服务端私钥签名。 + +e) 客户端使用内置公钥验证 manifest。 + +f) manifest 应支持版本号、通道、平台、架构。 + +7 启动票据设计 + +Launcher 启动 MainApp 时生成短期启动票据。 + +推荐方式: + +a) Launcher 生成 ticket 文件。 + +b) ticket 文件存放到系统临时目录。 + +c) Launcher 启动 MainApp,并传入 ticket 文件路径。 + +d) MainApp 读取并验证 ticket。 + +e) MainApp 验证成功后删除 ticket 文件。 + +启动参数示例: + +项目 + +启动参数 + +示例 + +MainApp.exe --ticket- + +ticket 内容: + +字段 + +payload + +file=C:\Users\xxx\AppData\Local\Temp\marsco_ticket_xxx.json + +示例值 + +{"app_id": "marsco_demo_app", "client_id": + +"client_xxx", "device_id": "device_xxx", "version": + +"1.0.0", "nonce": "uuid_xxx", "issued_at": "2026-06- + +23T10:00:00Z", "expires_at": "2026-06-23T10:01:00Z"} + +signature + +base64_signature + +校验规则: + +a) 签名正确。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +b) 未过期。 + +c) app_id 一致。 + +d) client_id 一致。 + +e) device_id 一致。 + +f) version 一致。 + +g) nonce 未重复使用。 + +Demo 阶段可由 Launcher 生成本地签名票据。正式阶段需要区分 + +启动票据和服务端版本策略,真正的版本准入仍以服务端签名策略为 + +准。 + +启动票据安全边界: + +a) 启动票据只用于防止普通用户直接双击 MainApp 绕过 Launcher。 + +b) 启动票据不能替代 version_policy、manifest 和 client_identity 的 + +服务端签名校验。 + +c) 客户端不得保存服务端私钥。 + +d) Demo 阶段的本地票据签名密钥只用于本机进程间启动校验,不 + +用于签发版本策略、manifest 或设备身份。 + +e) 即使启动票据校验通过,MainApp 仍必须验证本地版本策略签名、 + +有效期、版本号和核心文件 hash。 + +8 客户端启动逻辑 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 8.1 Launcher 启动逻辑 + +MARSCO_内部 + +图 1 Launcher 启动准入流程 + +流程步骤: + +步骤 + +1 + +2 + +判断或处理 + +结果 + +启动 Launcher,读取 + +获得本地配置和设备身份 + +app_config 和 client_identity + +验证 client_identity 签名 + +身份无效时拒绝继续 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + 3 + +4 + +5 + +6 + +7 + +8 + +9 + +MARSCO_内部 + +尝试请求 /update/check + +联网成功时进入在线策略校验 + +验证服务端返回策略签名,更新 + +获得最新运行策略 + +version_policy + +联网失败时读取本地 + +进入离线策略校验 + +version_policy + +验证本地策略签名、 + +离线策略无效时拒绝启动 + +valid_until、offline_allowed + +检查本地核心文件 hash + +核心文件异常时进入更新或提示 + +判断是否允许运行 + +允许时生成启动票据并启动 + +MainApp + +不允许运行或强制升级 + +启动 Updater 或提示用户更新 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 8.2 MainApp 启动逻辑 + +MARSCO_内部 + +图 2 MainApp 启动校验流程 + +流程步骤: + +步骤 + +判断或处理 + +结果 + +1 + +2 + +3 + +启动 MainApp,检查启动参数中 + +无票据时提示通过启动器启动并 + +是否存在 ticket-file + +退出 + +读取 ticket + +获得启动票据内容 + +验证 ticket 签名和有效期 + +票据无效时拒绝启动 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + 4 + +5 + +6 + +7 + +8 + +MARSCO_内部 + +验证 version_policy + +策略无效时拒绝启动 + +验证当前版本是否允许运行 + +禁用版本或过期策略进入拦截 + +验证核心 DLL hash + +核心文件异常时拒绝启动 + +校验通过 + +进入主界面 + +主界面运行期间 + +启动定时器,定期检查更新 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +8.3 Updater 升级逻辑 + +图 3 Updater 升级与回滚流程 + +流程步骤: + +步骤 + +1 + +判断或处理 + +结果 + +启动 Updater,读取升级参数 + +获得目标版本和升级上下文 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + + 2 + +3 + +4 + +5 + +6 + +7 + +8 + +9 + +10 + +11 +9 REST API 设计 +9.1 检查更新接口 + +方法 + +POST + +接口: + +请求: + +字段 + +app_id + +client_id + +device_id + +MARSCO_内部 + +请求 /update/check,获取目标 + +获得版本清单 + +版本 manifest + +验证 manifest 签名 + +签名无效时停止升级 + +扫描本地文件并对比 manifest + +生成待下载文件列表 + +全量 hash + +请求临时下载 URL + +获得短期下载地址 + +下载文件到 staging 并校验 + +下载文件可用于替换 + +hash + +通知 MainApp 退出并等待完全退 + +进入文件替换窗口 + +出 + +备份旧文件到 backup + +形成可回滚状态 + +替换新文件并执行安装后全量校 + +校验通过后启动 MainApp + +验 + +上报升级成功 + +任一步骤失败 + +服务端记录升级结果 + +执行回滚并上报失败原因 + +路径 + +/api/v1/update/check + +示例值 + +marsco_demo_app + +client_xxx + +device_xxx + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 license_id + +current_version + +target_version + +channel + +platform + +arch + +operation + +返回: + +字段 + +allow_run + +action + +message + +current_version + +latest_version + +channel + +force_update + +allow_rollback + +policy_seq + +MARSCO_内部 + +license_xxx + +1.0.0 + +stable + +windows + +x64 + +check + +示例值 + +True + +optional_update + +发现新版本 + +1.0.0 + +1.0.2 + +stable + +False + +False + +1025 + +policy_valid_until + +2026-07-23T00:00:00Z + +manifest_xxx + +https://download.example.com/xxx + +base64_signature + +manifest_id + +manifest_url + +signature + +action 可选值: + +字段/取值 + +allow + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + MARSCO_内部 + +optional_update + +force_update + +blocked + +rollback_allowed + +rollback_denied + +license_invalid + +device_invalid + +policy_expired + +operation 可选值: + +字段/取值 + +check + +upgrade + +downgrade + +当 operation 为 downgrade 时,客户端必须传入 target_version。服务 + +端需要判断目标版本是否存在、是否属于当前通道、是否允许降级、 + +是否满足最低支持版本和数据兼容规则。 + +降级检查返回示例: + +字段 + +allow_run + +action + +message + +current_version + +latest_version + +target_version + +channel + +示例值 + +True + +rollback_allowed + +允许降级到 1.0.0 + +1.0.2 + +1.0.2 + +1.0.0 + +stable + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 force_update + +allow_rollback + +policy_seq + +MARSCO_内部 + +False + +True + +1030 + +policy_valid_until + +2026-07-23T00:00:00Z + +manifest_id + +manifest_url + +manifest_1_0_0 + +https://download.example.com/manifest-1.0.0.json + +signature +9.2 获取下载链接接口 + +base64_signature + +方法 + +POST + +接口: + +请求: + +字段 + +app_id + +client_id + +device_id + +license_id + +version + +channel + +files + +返回: + +字段 + +expires_in + +files + +路径 + +/api/v1/update/download-url + +示例值 + +marsco_demo_app + +client_xxx + +device_xxx + +license_xxx + +1.0.2 + +stable + +["MainApp.exe", "plugins/demo_plugin.dll"] + +示例值 + +600 + +[{"path": "MainApp.exe", "url": + +"https://oss.example.com/temp-url-1", "sha256": + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +"bbb", "size": 223456}, {"path": + +"plugins/demo_plugin.dll", "url": + +"https://oss.example.com/temp-url-2", "sha256": + +"ddd", "size": 423456}] + +9.3 升级结果上报接口 + +方法 + +POST + +接口: + +请求: + +字段 + +app_id + +client_id + +device_id + +license_id + +from_version + +to_version + +channel + +result + +error_code + +message + +started_at + +finished_at + +result 可选: + +字段/取值 + +success + +路径 + +/api/v1/update/report + +示例值 + +marsco_demo_app + +client_xxx + +device_xxx + +license_xxx + +1.0.0 + +1.0.2 + +stable + +success + +upgrade success + +2026-06-23T10:00:00Z + +2026-06-23T10:05:00Z + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + MARSCO_内部 + +download_failed + +hash_failed + +signature_failed + +replace_failed + +rollback_success + +rollback_failed + +permission_failed + +disk_space_not_enough + +mainapp_restart_failed +9.4 设备身份签发接口(非用户登录) + +该接口用于首次签发或刷新设备身份凭证,不是客户端用户登录 + +接口。 + +Demo 阶 段 可 不 暴 露 该 接 口 , 由 测 试 数 据 或 预 置 文 件 生 成 + +client_identity.dat。正式阶段如需启用,也应定位为设备激活/身份签 + +发能力,而不是用户名密码登录。 + +接口: + +方法 + +POST + +请求: + +字段 + +app_id + +activation_code + +device_fingerprint + +platform + +arch + +路径 + +/api/v1/device/activate + +示例值 + +marsco_demo_app + +XXXX-XXXX-XXXX + +device_hash_xxx + +windows + +x64 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 返回: + +字段 + +client_id + +device_id + +license_id + +channel + +identity_token + +MARSCO_内部 + +示例值 + +client_xxx + +device_xxx + +license_xxx + +stable + +{"valid_until": "2026-12-31T00:00:00Z", "signature": + +"base64_signature"} + +Demo 阶段可以简化为预置 client_id,不做复杂激活流程。 + +9.5 管理后台管理员登录接口(非本期普通客户端用户登录) + +该接口仅用于管理后台管理员登录,与本期普通客户端用户无关。 + +普通客户端用户在本期客户端不登录,不调用该接口,也不持有该接 + +口返回的后台访问令牌。 + +后续如增加普通用户登录,应单独设计客户端用户登录接口、用 + +户授权模型和用户权限校验逻辑,不复用管理后台管理员登录接口。 + +Demo 阶段可使用单管理员账号。正式阶段可扩展为多管理员、角 + +色权限、双因素认证或企业单点登录。 + +方法 + +POST + +接口: + +请求: + +字段 + +username + +password + +返回: + +路径 + +/api/v1/admin/login + +示例值 + +admin + +password + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +示例值 + +jwt_or_session_token + +Bearer + +7200 + +字段 + +access_token + +token_type + +expires_in + +要求: + +a) 密码不得明文存储。 + +b) 登录失败应记录审计日志。 + +c) 管理后台接口必须校验管理员 token。 + +d) Demo 阶段可不实现复杂角色权限,但必须区分未登录和已登录 + +管理员;该状态只存在于管理后台,不存在于本期普通客户端。 + +9.6 管理后台接口摘要 + +第一版 Demo 至少需要以下后台接口: + +方法 + +POST + +POST + +POST + +POST + +POST + +POST + +POST + +POST + +POST + +GET + +GET + +GET + +路径 + +/api/v1/admin/apps + +/api/v1/admin/channels + +/api/v1/admin/versions + +/api/v1/admin/versions/{version_id}/files + +/api/v1/admin/versions/{version_id}/publish + +/api/v1/admin/policies + +/api/v1/admin/policies/{policy_id}/force-update + +/api/v1/admin/policies/{policy_id}/block + +/api/v1/admin/policies/{policy_id}/rollback + +/api/v1/admin/download-logs + +/api/v1/admin/upgrade-logs + +/api/v1/admin/audit-logs + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +后台接口规则: + +a) 所有后台接口都需要管理员 token。 + +b) 发布版本时生成 manifest、计算文件 hash 并写入版本文件表。 + +c) 修改强制升级、禁用、降级策略时必须生成新的 policy_seq。 + +d) 每次关键操作必须写入管理员操作记录。 + +e) Demo 阶段可使用简化管理页面或 API 调试页面完成后台操作。 + +10 数据库设计 +10.1 应用表 apps + +字段: + +字段/取值 + +id + +app_id + +app_name + +description + +created_at + +updated_at +10.2 版本通道表 channels + +字段: + +字段/取值 + +id + +app_id + +channel_code + +channel_name + +enabled + +created_at + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +updated_at + +示例: + +字段/取值 + +stable / 正式版 + +preview / 预览版 + +internal / 内测版 + +customer_a / 客户专版 +10.3 版本表 versions + +字段: + +字段/取值 + +id + +app_id + +channel_code + +version + +version_name + +status + +is_latest + +release_notes + +offline_allowed + +offline_valid_days + +allow_rollback + +rollback_targets + +force_update + +created_at + +published_at + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +updated_at + +status 可选: + +字段/取值 + +draft + +published + +deprecated + +force_update + +blocked + +archived + +说明: + +a) allow_rollback 表示该版本是否允许作为降级目标。 + +b) rollback_targets 可为空;为空时表示不允许主动降级到其他版本。 + +c) 如果需要精确控制降级目标,rollback_targets 记录允许降级到的 + +版本列表,或拆分为独立版本关系表。 + +10.4 版本文件表 version_files + +字段: + +字段/取值 + +id + +version_id + +relative_path + +storage_key + +sha256 + +size + +file_type + +is_required + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +created_at +10.5 版本策略表 version_policies + +字段: + +字段/取值 + +id + +app_id + +channel_code + +version + +policy_seq + +allow_run + +force_update + +allow_rollback + +rollback_targets + +offline_allowed + +valid_until + +min_supported_version + +latest_version + +message + +created_at + +updated_at + +说明: + +a) 每次策略变更必须递增 policy_seq。 + +b) 客户端记录已见过的最大 policy_seq,检测到倒退时拒绝使用。 + +c) allow_rollback 表示当前策略是否允许降级。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +d) rollback_targets 用于限制允许降级的目标版本;未命中目标版本 + +时返回 rollback_denied。 + +10.6 设备表 devices + +字段: + +字段/取值 + +id + +client_id + +device_id + +license_id + +app_id + +channel_code + +status + +first_seen_at + +last_seen_at + +created_at + +updated_at + +status 可选: + +字段/取值 + +active + +disabled + +suspicious + +expired +10.7 授权表 licenses + +字段: + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +字段/取值 + +id + +license_id + +customer_name + +app_id + +channel_code + +max_devices + +valid_until + +status + +created_at + +updated_at +10.8 下载日志表 download_logs + +字段: + +字段/取值 + +id + +client_id + +device_id + +license_id + +app_id + +version + +channel_code + +file_path + +file_size + +ip + +user_agent + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +result + +created_at +10.9 升级日志表 upgrade_logs + +字段: + +字段/取值 + +id + +client_id + +device_id + +license_id + +app_id + +channel_code + +from_version + +to_version + +result + +error_code + +message + +started_at + +finished_at + +created_at +10.10 管理员表 admin_users + +字段: + +字段/取值 + +id + +username + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +password_hash + +status + +last_login_at + +created_at + +updated_at + +status 可选: + +字段/取值 + +active + +disabled + +规则: + +a) 密码只保存 hash,不保存明文。 + +b) Demo 阶段可预置一个管理员账号。 + +c) 正式阶段可扩展角色、权限、双因素认证和单点登录。 + +10.11 管理员操作日志表 admin_audit_logs + +字段: + +字段/取值 + +id + +admin_user_id + +action + +target_type + +target_id + +before_data + +after_data + +ip + +user_agent + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +created_at + +需要记录的关键操作: + +a) 登录成功和登录失败。 + +b) 创建或发布版本。 + +c) 上传版本文件。 + +d) 修改强制升级策略。 + +e) 禁用或恢复版本。 + +f) 修改降级策略。 + +g) 生成离线更新包。 + +h) 禁用或恢复设备。 + +11 对象存储目录设计 + +建议对象存储目录如下: + +对象路径 + +updates/{app_id}/ + +内容 + +应用根目录 + +updates/{app_id}/{channel}/ + +版本通道目录,例如 stable、 + +updates/{app_id}/{channel}/{version}/ + +preview + +单个版本目录 + +updates/{app_id}/{channel}/{version}/manifest.json + +当前版本 manifest + +updates/{app_id}/{channel}/{version}/manifest.sig + +manifest 签名 + +updates/{app_id}/{channel}/{version}/files/ + +版本文件目录 + +updates/{app_id}/{channel}/{version}/files/Launcher.exe + +Launcher 可执行文件 + +updates/{app_id}/{channel}/{version}/files/MainApp.exe + +主程序可执行文件 + +updates/{app_id}/{channel}/{version}/files/Updater.exe + +升级器可执行文件 + +updates/{app_id}/{channel}/{version}/files/plugins/demo_plugin.dll Demo 插件 DLL + +updates/{app_id}/{channel}/{version}/offline/ + +离线更新包目录 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +updates/{app_id}/{channel}/{version}/offline/{package}.upd + +离线更新包 + +规则: + +a) 已发布版本目录不可覆盖。 + +b) 如果要修复,应发布新版本号。 + +c) manifest 与 files 必须保持一致。 + +d) 离线包由同一套 manifest 生成。 + +e) 对象存储 bucket 正式环境应设置为私有。 + +12 Hash 校验策略 + +系统采用 SHA-256 作为文件 hash 算法。 + +规则: + +a) 服务端发布时计算所有受控文件 hash。 + +b) manifest 包含全量受控文件 hash。 + +c) 客户端升级前扫描本地文件。 + +d) 客户端只下载缺失或 hash 不一致的文件。 + +e) 下载完成后校验下载文件 hash。 + +f) 文件替换完成后执行全量 hash 校验。 + +g) 启动时执行核心文件 hash 校验。 + +h) 插件目录执行白名单检查。 + +结论: + +更新可以增量,校验必须全量。 + +13 签名策略 + +签名采用非对称签名机制。Demo 阶段建议使用 Ed25519;如果现 + +有技术栈不方便支持 Ed25519,可使用 RSA-2048 / SHA-256,但同一 + +套 Demo 中必须固定一种算法。 + +规则: + +a) 服务端保存私钥。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +b) 客户端内置公钥。 + +c) version_policy 必须签名。 + +d) manifest 必须签名。 + +e) client_identity 必须签名。 + +f) 离线更新包必须签名。 + +g) 客户端验证签名失败时拒绝启动或拒绝安装。 + +客户端不得保存服务端私钥。 + +签名数据规则: + +a) 被签名对象必须包含 signature_alg 和 key_id。 + +b) 计算签名前必须移除 signature 字段。 + +c) JSON 签名载荷必须使用稳定序列化规则:字段按字典序排序、无 + +多余空白、UTF-8 编码。 + +d) 时间字段统一使用 UTC ISO-8601 格式。 + +e) 客户端根据 key_id 选择内置公钥进行验签。 + +f) 公钥轮换时,客户端可同时内置当前公钥和上一个公钥。 + +g) 签名失败返回或记录 signature_failed。 + +version_policy 签名字段至少包括: + +字段/取值 + +app_id + +client_id + +policy_seq + +channel + +current_version + +allow_run + +force_update + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +allow_rollback + +rollback_targets + +offline_allowed + +issued_at + +valid_until + +latest_version + +min_supported_version + +message + +signature_alg + +key_id + +manifest 签名字段至少包括: + +字段/取值 + +app_id + +version + +channel + +platform + +arch + +manifest_seq + +created_at + +files + +signature_alg + +key_id + +client_identity 签名字段至少包括: + +字段/取值 + +client_id + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +device_id + +license_id + +app_id + +channel + +issued_at + +valid_until + +signature_alg + +key_id +14 限流策略 + +服务端需要支持多维度限流。 + +建议限流维度: + +a) client_id。 + +b) device_id。 + +c) license_id。 + +d) IP。 + +e) app_id。 + +f) version。 + +g) file_path。 + +建议限流规则: + +维度 + +client_id + +device_id + +license_id + +IP + +超限后返回: + +限制 + +10 分钟内最多请求 10 次下载链接 + +1 小时内最多下载 3 次完整包 + +24 小时内最多下载指定额度 + +10 分钟内最多请求 200 次 API + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +示例值 + +RATE_LIMITED + +请求过于频繁,请稍后再试。 + +字段 + +code + +message +15 回滚机制 + +升级失败时必须支持回滚。 + +流程: + +a) 下载文件到 staging。 + +b) 校验 hash。 + +c) 备份当前版本到 backup。 + +d) 替换文件。 + +e) 替换完成后执行全量校验。 + +f) 启动 MainApp 验证。 + +g) 如果失败,使用 backup 回滚。 + +h) 回滚后再次校验旧版本文件。 + +i) 上报回滚结果。 + +升级事务状态文件: + +Updater 应 在 update/ 目 录 下 维 护 事 务 状 态 文 件 , 例 如 + +update/upgrade_state.json。 + +字段: + +字段 + +transaction_id + +from_version + +to_version + +status + +manifest_id + +示例值 + +uuid_xxx + +1.0.0 + +1.0.1 + +prepared + +manifest_xxx + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +2026-06-23T10:00:00Z + +2026-06-23T10:01:00Z + +update/staging/uuid_xxx + +update/backup/uuid_xxx + +started_at + +updated_at + +staging_dir + +backup_dir + +error_code + +message + +事务状态: + +字段/取值 + +idle + +prepared + +downloading + +downloaded + +verified + +waiting_mainapp_exit + +backed_up + +replacing + +replaced + +post_verify + +committed + +rollback_required + +rolling_back + +rolled_back + +failed + +状态规则: + +a) 下载前进入 prepared。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 + + MARSCO_内部 + +b) 下载过程中进入 downloading。 + +c) 下载完成且 hash 校验通过后进入 verified。 + +d) MainApp 完全退出后才能进入 backed_up。 + +e) 备份完成后才能进入 replacing。 + +f) 替换完成后进入 post_verify 并执行全量 hash 校验。 + +g) 全量校验成功、MainApp 可启动后进入 committed。 + +h) 替换后校验失败、启动失败或异常中断时进入 rollback_required。 + +i) 回滚完成并校验旧版本成功后进入 rolled_back。 + +j) 回滚失败进入 failed,并提示用户重新安装或联系管理员。 + +异常恢复规则: + +a) Updater 启动时先读取 upgrade_state.json。 + +b) 如果状态为 downloading、downloaded 或 verified,可以清理 staging + +后重新下载。 + +c) 如果状态为 backed_up、replacing、replaced 或 post_verify,必须 + +优先尝试回滚。 + +d) 如果状态为 rollback_required 或 rolling_back,继续执行回滚。 + +e) 如果状态为 committed 或 rolled_back,可清理旧事务状态。 + +f) 清理 staging 和 backup 前必须确认事务已提交或已成功回滚。 + +需要处理的失败类型: + +a) 下载失败。 + +b) hash 失败。 + +c) 签名失败。 + +d) 文件占用。 + +e) 权限不足。 + +f) 磁盘空间不足。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +g) 替换失败。 + +h) 启动失败。 + +i) 回滚失败。 +16 Demo 开发里程碑 +16.1 第一阶段:基础框架 + +目标: + +a) 完成 Launcher、MainApp、Updater 三个 Qt 程序。 + +b) MainApp 能显示当前版本。 + +c) MainApp 能加载 demo_plugin.dll。 + +d) Launcher 能启动 MainApp。 + +e) MainApp 直接启动时能拒绝进入。 + +16.2 第二阶段:服务端基础能力 + +目标: + +a) 搭建 FastAPI 或 Go API。 + +b) 搭建 SQLite 数据库。 + +c) 搭建 MinIO。 + +d) 实现应用、版本、通道基础数据。 + +e) 实现 /update/check。 + +f) 实现 manifest 返回。 +16.3 第三阶段:在线更新 + +目标: + +a) Updater 下载 manifest。 + +b) Updater 校验 manifest 签名。 + +c) Updater 对比本地 hash。 + +d) Updater 下载差异文件。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +e) Updater 替换 MainApp 和 DLL。 + +f) Updater 自动重启 MainApp。 + +16.4 第四阶段:版本策略 + +目标: + +a) 支持强制升级。 + +b) 支持版本禁用。 + +c) 支持正式版和预览版。 + +d) 支持动态新增通道。 + +e) 支持允许降级和禁止降级。 + +16.5 第五阶段:离线能力 + +目标: + +a) 本地缓存 version_policy。 + +b) 支持离线有效期。 + +c) 离线凭证未过期时允许启动。 + +d) 离线凭证过期时禁止启动。 + +e) 支持离线更新包导入。 +16.6 第六阶段:可靠性与安全 + +目标: + +a) 支持升级失败回滚。 + +b) 支持 policy_seq 防回滚。 + +c) 支持系统时间回拨检测。 + +d) 支持插件白名单检查。 + +e) 支持下载限流。 + +f) 支持升级日志和下载日志。 + +17 Demo 验收用例 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +a) 通过 Launcher 正常启动 MainApp。 + +b) 直接启动 MainApp 被拒绝。 + +c) MainApp 显示主程序版本和 DLL 版本。 + +d) 后台发布 1.0.1。 + +e) 客户端从 1.0.0 升级到 1.0.1。 + +f) 升级后 DLL 版本变化。 + +g) 升级后 MainApp 自动重启。 + +h) 手动篡改 DLL 后启动失败。 + +i) 手动篡改 version_policy 后启动失败。 + +j) 后台设置 1.0.0 强制升级后客户端无法继续使用。 + +k) 后台禁用 1.0.0 后客户端拒绝启动。 + +l) 后台开放预览版后 preview 客户端获取 preview 更新。 + +m) 后台关闭降级通道后客户端无法降级。 + +n) 离线凭证未过期时可以启动。 + +o) 离线凭证过期后拒绝启动。 + +p) 模拟升级失败后成功回滚。 + +18 后续扩展方向 + +后续可扩展: + +a) 完整 License 系统。 + +b) 客户专版分发。 + +c) 灰度发布。 + +d) 多平台支持。 + +e) Windows 服务模式更新。 + +f) 管理员权限提权。 + +g) 代码签名证书。 + +h) 自动错误收集。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 MARSCO_内部 + +i) 客户端日志上传。 + +j) 增量二进制差分更新。 + +k) 多语言界面。 + +l) 企业内网镜像站点。 + +MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄MARSCO内部资料请勿外泄 \ No newline at end of file diff --git a/client/软件自动升级与版本控制系统开发设计文档 v0.1.pdf b/client/软件自动升级与版本控制系统开发设计文档 v0.1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..489b6f8d9c8950ec1f59dfd012cadd1927df1ab5 GIT binary patch literal 721334 zcmdqJbyQXB7dA?FO7|wDYXf`J-60Lq-QC@-bc3LTfPj>AOLvP(3W$n;(g+B`w}In1 z@>9?8j_=-ou46dX+Ut$=tam=|Gw0fyId3aVNU;D}xzSN>=hgJSMn?ex*a40vHs~k< z0&L30mgcSi4#*W%HZ?aFcT+cY7jtt}M@KgR2Rr-KWld{yPjeS#7jp}97jp+wNOx`! z_jQw!xU!3*levqVHRLK}HYIUsS6xW!)qMJF5|`IR)pUPuk@PTkaAUiinN8f-&D_$_ z#as94qrQ;PFDAO~uIyqB8T3#8tIz*7K+?;}(dEYx*B2l|^x0I!q+J}{om_SG*_2$& z%v~;zivM62g8XAs_jWSByq~e1qb1uNV;5Ul2Mfnbc$eqqW&p@~nM1lM7&} z&U=jo$bQ`jWWOE>WWR0(vj5c%yoLY-{?!h=o&^ZJz6B6?eGeeVH4Y%hU;R1$n)k0I z19JZLnfI!{KHx`#Tu%MnAPVLVmTp!6AQw9qo0PSko4E^{lpTba66U6kW)K^@y1AGe z+oPj+Wf$tqJFJ4S{I~D!Od0?^~_5nP$1w@pQ4=yfS3?RP9iS%*eA3@x2c#a`l9sn4|^ImFViWGQJUB|@aNyb?k z-fB=fxZ(NEK+mkNhY(|6!m+wFGkNm!rq8BZb7tUkfZM^U&nef8U1dNM8C5Toa^@rr zH!UX!H!9}7B2Oa}tL0V&0ci_V+~CN8`0CnY*>Yc72D!!yVZ+hDuC7Ui5Tl4Qd6DWE z9ELpnRGbNnl*E^D3$fu`ualqpDcl}j6nxEI=#v+{7NgqhYLZvHEPs??tK1uxDa5Z-GibfvO8y2WMq9@z?!#eI?Sn#FU9Ab^`y5nI|o{t zQxrN(BU264&b(erC$-}(l%40`;6}T;-wx&|Kvd$PXip~00KVVbg}QrVp8}^*EC!Op zp<1}>8s;35P`hFW8Yzzq??0&aU0Diw3SvVrluf}8j1 z`!?o|lRNymwGVNyx0*jRBT8r>eGV!mR}ACnED!LCVHAg!$}GmA?3%hoS&l2U9mGiV z`78aa`lqWh^W@m6s)AIdrfyOarQ)|wtsLky*LBnGNWZCy*#c=mpI|)o63pEZhmQU1 z>{|MPR->D5R*RnqN@S9V7%l1c0z!N|aXUfEaytPWF(tnDeT{uS%3A}O1@fGmSoeGB zumsR8QioO)3JGaQM8XZU?Q?NW5|36(x%G_+^NfRij4L=@__1F z+{HS~c!4I;#83Ws>p2TrOv_PH=|sJP#W23Vl#)z%{0?Hj^s%X%q(p`GBQD!c&I*ie zwvKja0gug|{Emw7F*u10TLx%C`B!N&bMD;m+Yo0ds7Egp@in?xLU?4$K9l_^OutYe z&Q#>vRclQ0H`U`fOm8my-8FX(-4^gsYZ%!-qxRk(hxYeUuZYEa+FfUle)M2)9-98O zlsMM|zwu1c_(`jHLCZY@RlK>hS+q#)G>GkW$S00_fYX z*BJ09p#AhUKdxW4Ic=h*-j9bCv{JW-)hO*Q3t#Lz0B&kR4V6t|xd%ETERPV!sxzkAqQjZJaR`8DZ~uCF9jE;-c5l4-59p24We=?Bd(h<3U8L! zDI><_(HsbhTFu^XGp-4oTJX0qv(y9QXpP7u7;8Rx6%N&v*n>U*Z}^Au))xsi=dcojHJ=P1MyC5VMFYk8ux+fPqJDb*Dqc}k9kRZ_9UK29ps*jkMqn9p#1q6u%FK+;V z_+5_6+v)?ZnjxOjoa6Fwue|n;k9+CPZ#=G~mz%Vj8^oisiQQpSbab&dwqr9j1^|B? zbh&8%IY?ae=Ag@4-xzdd-oFU|VFCLMt4l$wE&=iOTGqx6{}^7@46=yUZr&_1f32vQ zv4h*?Os)Xnb*QWEsNrCJ84N(4m+R`%kI=6=UBS?WED{8gsy^VK(C_NXcaT3)@CKOg zn8jr!F7JHFTaN1x^y-lym(?AmWhL$yJF$I-%O-Ibf)8RrNTZs!E5vkH5i0O1>bWw} zKNJH1ui`njyO$4e)#1hiTweJO@hTvO><9Yq_hA6AshV3_LpGl`y(lD{HHTbKb9ZvG zGq=AaAN!4&E^qUFroXr3KRB*neW&`31^9Qi^8nd@U^`?_{KNLkroY+F#l`&t+c|ju zfbCq6pbxU*f3Y3N1%$925;+2aka!w0_y4dR()>T6{Z*9u(*}8vF?9MA%ucgN_B&RKMK%~6#N0o|BD2?3g>?!;FT&~6Y%PZZovOh zGXC!f_>+!Y8uvE@{NeHcgMOeN#1=x4AL$2a`kQ_bt^9$0?Cd;OtMD7KRWLWc^gEFE z4&Zm;W&e?iJOGwUHePOV01xPYW%v3O@WvwkhZ^2=hg>&=QRWw%{11P4{r2@I4w37M zkUv7b8vE0p`Hhu+!1n(GD_y;;{`Bbo$i+=7fo@ny7GkA4YAn)@ZdTT&|M;)}GSpuV z;g^vML`we-T)3__?hQNr=otP>&Tpdo|H4$f+?@Zmq5g_qZfqi6$X6Fv+lZGJ{HtB` zQ>@1Ei*E)%KoG={{QEZp`nHZ_4cOn_7(SzT4`Z;~Gzu`k-}!sBaUdCU`8>Fa%bc6NMzzUb=d?(Xds&>ncS+KuU% z-asMj@9BLy{3LSNaZ6Z0Xi-==z^~bFe|tM;RM`K}>7u)PZFAE>h^!^hy@2k+^AhSs z5p8b8veUDPZ=YW;s&OxQ*pd2*wW!1h;w*l~TzrrIxoGQ)zo+N!Aya_!@jjFL?uVC7 z&S$Ihcb68=D|8)Ngf()8)+d-U1yY-y7y$FbTDAK&=buyO^hyff;l*TYzPmy>{JMW@ zZ}iD29nO==_~(M|@Ai(4lqguwk5)HVDGVq>MSVo+@fHL5!IK7e7TNE7dnf8GEvXa+ zZL#=yZENd3nj7{(51jtMp{=`QVbW{c7=vbshw_+8l^1&mo3{u`pOjD^d>R15*xF|v z8cOIYEFz+d9@gADFOjH3m_&E^)H~63`sABsr;m`E0-`s2$95nY`IpfR9^Hp`a;kuJ zLOGMP-z@B+`?Qs6tYizkz~1goS>m+PS>pLig2(J1yBOb1YLZWF8ZEWEHnp1As2|Y8 zzkZK$yLz_!q(CrFf{x=*f-dR6Wrl_$eaKarfyB2LESg$PLB|vBa>(N!0@mn7Q+>z+ zvfGSCFnx)JF^i`8%#en?QCS`!s4A=U7C~k?;|^fx_G;AhXIX#mbGLBg`7?$$n5neI zV;FQwRYm#PqM$>&tj@$NVH=|CJ)*M5&qwk+-0w>?{@?y zPA(&`J~qp~T{sM9kz&bt-%YWlXK)&GFPf9_AS-rWRDPpj)WcgvtaropYgFuK+8h)0 zZ?&I|nuvCv&Zf-Tz3Mcid2t#vQmBPtL>_5J?(AS~NkeoH)y5gyoKe5XPF}%PVbX?6 z+40~5!x44Z(J&e_v@6on;wc#u==ZDUB;GJ#X1?M@fTZSPK3s=SfrY{mRe4WCg?9&gPunu z>=Tp3f6A~SKXFeWC4lqu{bDYJrY5}Qdm<2NGul*4hiIO&m}9m0x4WrAvt)4`dd#r-B8fg1%M(d&Rjiwy0|2{#XRIx3MM@W^o(&4 zS{m+lL66^B#c1r_PV7?NP4k;adCO>KSEV^D)=t8#uD1@vrzG);#?oz-MA8_gdQra* zH^@y^Vp`d6oS+SBu4=)O$}%%l=KV-0Z&I)(ZgSV33y~oOF*3uwNoJ^8uCs*Q7GtlB zuhI0?ZKo(bmy_^;G$Fi%#E}OCJUFiqhs!+M1R6bp#!f^=8)y0;)70eVk=4ZIk?6oS zA}l{Mwm`>|%XH69Pq~fJtx)jxpcXCd@S#P*dt@hPsFeiESEoK$qLdb&C;#fmYcbq4 z8;q%KQEu%Sr=8sGR}iCpNHtS%s!}-Mq#75S1BWer%FIE2>|TqPySQ1*(RYyI3f4uz zWbXQa7>PhIqJz9NOD++hKd1I^0-q8AGewrrkMfxo0^43U+#K@w@+3=c*D~nNtOArK zp`S^R$&OW&l^m6}NF}G2K#z8}<7+P_G;(xo*;fRp@puUFeNhK*JQ&KlmUZ{+8KWu_ z(9zm^#d=fQgFCskj%UDH$I2Qk9QOQ5Jut$wQ=igY&a^V_i1VUg;?6mFRb=+gjI2mL zDqdNEy%)bs(rlek&g&+hX#iJjU?IMavRg9Y1)bc?*Sxk1?-n(L;`A8`_VbJmIkD`! z+l?YYPF=tgvP!m2co@Gopg9SWl2$kZ1gx1y!_qUyQk44(x2sGLx3qVMErRLmjQ3R> zR4q!0tVg6~@3DHU7MzdVmd$vNF+&eVcI0>fJ)j_}$-S(UJiFV>$$f$s(_ur_O0j78 z4nfVP`+0Pev0v1_aec$o3Bc}A?E`=b&&;^n+h)}2lhxsZj~uxlmdpdRth`_=x&>nR z`{6SU50J`c8ieJY3?ztD=x^_w5Sk*lj$mSWvB8A)BcNF9OkurC`^;Vf9nrZ;`Kly- z2C93R1kj}?Y8Pa@;}xY*-G@Mr5Z|wLXmE=GF4S?Tp&U>l)rU}T0CVC{rR-eZuN7vu z%pzvDi%+QzidI-1Q)6FpgQF9~{N$CwHtSm=GPDq$B$z%r;y=L2Nm^_98OYV{NiJgX zA(4e&E(GS{BBd_XMAdi`c3_@yAg&}mfwGh@$QB!Gq1e6U)vKeNh;Pv}L0B0|LaRybpOi`q^GDt(Tj=fzJG`39xSC5F0C zPuRnBlAKc}WYhfUVtaGKW*H1^vL^DHflJblgAY3f^RmlB2M{8@3N(KUE+GdKL}v z!DoX)hcf)=GcKBDmpG|)eAC@z{|nC};Wp6o!1|Z(&QJ1SALq3fTd?u>%fmktx+2?qK271(&cuGCGk6J%-fTWYePbX>ng1@n<>VXDZ-N* zy~SIeyZ4QI3|6=>$l@rK0lqwo#y(S322EKF1+ocIzSsplQ0)-UUb{7pP|N_&CBYT% z0q(fNkPFNwDyCP>U_;Yb|N~-0#|=OgT9lg z%8?pdO{Ny$#iQGzsZZps4%i#8^0?hbbCV92H;3d&AKE0w?lHqX;pom48P!ERN=Acs zlCft}KBP)`I5A93y+(xFXrO!4c?a~#+uMlr5!!1`i0iexAnTY&o5Iiz zY8~$24&Ba~|KdH7y=N*Rvh7C6>p43#!k~@>KLLr1!8>T|G|!>Cl$2-@2$SL?k>tQY zkwiZMsfkeQ0xX*63`<2J$0$wug0M0H(c$-*1pB%yA9r^3*LQYBmf9p*&o7sFRhY7w znXgf((-)rTaq^F4S)ao_ik9y1eMHgC?e>EGsmsUZG2z^ih(o-$YQ|qvf^?U#cH%bE zmnoa&ksEvNch;v=1jU-2rUVU_Ah9toEfGLD$>QbsvMNw4^c^z~P3fgQK|Z(ac0IH10hE=JXU-@t)qKr#tMG0K z(W*{k6wsf&G|7pFdr@D5@*g^>`@P-_O+KG#H@l$>0s z853{L>D14n;$tgTH7NnR;xdC*45kCBQOSy!E|m33S`)rg3wjk)famVrmi|%41DLxJ z^so)hlzuDO4+_7Sa2op+XbNBpCFAIZc$v6Wqf#VgOYp#J;3=XlkVfukD$mw9ZySy5 z`K|~wp|z2_`9dqxYTPMoj#abxW7ZWQZq+kr2SDsstG=K@-zf}?2>$R|p>eJ63dxes21ZxX=ryMN5JV#J?KSQGQI z$uDt=Bqd(FS9FW7m>4C!dnJ!dcvRd}630(gZxNa4!Iw56=DW|l*94xs!QZDnhH2!h zC%A*{A)f_BcP{89$psw_-n*Uipe0(E&C#JHG_P>!44<}$RNzIpQ}4F+eSPbN8VPys z{uO_xth6s4rprJ^OhXklkv#P~cyHYd7?9-^-bKWVWm`O_UYB^1Jm2Xy5xZGnM^uw! zQv2+ipTNimKDe&9Asl~CzTqu5J{4CMu@AZ8p=&CkGt4OrcoU0wcHA6gyI8<1K}~}= zcGXn!aQ@w$H!k`~Q*EOSP7DTsgZ6ExLg^+2DnU7P1SUZgf|0zoohjHw3!`=8+fcHuW?)Drut|IFlF*U_Q@(U#GLZuV+ zfQMQzi5wHuD06Jf3+{T|M_Kg{;a(L9aRgjErPofBA|??!Oxj#j0zEIo3;PaW;uQ)nGD+^whGE!fjg z^^@w;L0fC!nsPi)0%7hn6tT&}qkHJeHc*(@7K|paDa0b;WiUM8juL3DzEZMe8RKaY z`Sv^TyP#_0BTa}{+xmBJl_Q{1%tQW{mP%H*hxRkPT9xb&gHxt`2}3-LYxfE!+!ipo zV}R1L!=evTIP7YReIFj>l88>k9QK434ki6%-sD3J`n*ss!uE0uXnR=$XksSV<>>Vd zMJ>Fl?ZeL7SZ;4lPILoy8KK(KD&js%ii9mr&?4**h9gE2Q00o1AVjIvG!>`cSz+R1 zUMEo;(p#_{%*|vAX!3mu4Z5$e`9OUAmS8RB`G@+pS?F;~xH#AfUXgIHLR&VOP#D^5 zjD%r9l3t|%MVP*D73bIPPQ9m}I0hVbDm041hxc|I-#vfrw8o>-$j&xlwgkwV_0Lrh z`-n;@jq|mu*V~FsAV<0%`NMuh?M|8_SOJ~gj~o;GPX11jBiJs8XB>Qa(jzXxnAYH5 zLrG4Z6xh0+g`Tx%&lDwZ(*5bm-}yt1p^{N7Z>YjbEfQ@PmaSu)tNNdI@FxUukO(Ou zywG}Za)$J%uecjgh@$gSGDw*GhmSr^u*kfpA~Cp&q!c?I52$(i*jLC<1QFSO<*l4R z?PEo6E9M-E&hXe~oVf9AAAcup*ep*;dqIbH`_zpYD*YaQLVXU_IPkHX5sa7^OW|;M zbL^X9Hto$9C(=&i{wp@Jt*|k2HK}wSM*IH3lcL7L{phM=U3Zeu$(u$c`CB;P4bC=K zR+tiV#YplEV|0$s_i$YA5@*(sAO_}I@UnimU*K*oB0ckvFe6_5O{1=AdbeGik@S0` ze8WZw%nPaDkJ~Xm=Z)cX5_yGU4FG6!)%+Yx-UlBESf|B(v7>~*ig@|s5uZPqg@2?& zpwEww&{~r zA>E$3j+3lmPNorO^XUQ}iV+tGwvwB^IXgXFGZYfkJO6xsva&C{Eqt-M_v-9q^jl>A zlT%2vs}#@yq()v3c#IhDNHFJrtSz1#Ktp}|@g&^&i($-4hQ~$qOvxY<{#)Oo9IZXS z&U{l!4Gfj+64l= zj&?qHH@3CS3J43go}BD{-po2x$_Z?3y7;!gI=V#hCeX{r>wIT@{liPg3!g{AUtg?t z&-b%=dUks}CpqVYytH4;2BY1t7S#p&d6TwZSa=cFAHlxxp>dlKi&sE9a*WJ^CHv%b z;o#+exc9)&{@mHV!a)D&)5WEL=JVZiwr)3Jzt?A)iZ89qzLeXYywa75Nr;qPTD%}R z(btQ4l}6P{T(O$2z~ROXO-Z+gl`#DGQK#w8G`z~DYX#BnD zhKk+Xhl?3Tp7+6iZLR%>86MYoCs|*s8BgM(`By!$!O2j`#}~-_A^qUc7sa2&sHNJ+pig>>MR+3iW4G3~6HIx~kS{vUV}!?t)*1a-)b z6DOUy=aqFfwJIwEywAQpv6ZV7Y9*`41I+Z^%MNuaw++Hg9QELS5{lEyuxMXAL+)1^ zGtq-$Xm(ar=sDQBILjw%D4**{^kM`Q)Cf!4xTh7@+h7vAq|%#`tIvKAyatZ>Iy)4O@<5BfF7D`&Msx2%G~S z@Q#~IOpiG^3Vn?y3(-Dz>ez1IJ=_OjaMlfyk#?8(jwHiu2P4(UY%SB`^wZgr_pLR< znh^QBA_^nD7RZ=#y|+p!hB-(kCSB4va(mT+TtKS$nMRRciH1PIuswl9gLrYV@=-}> z<+)GrfmcSYqp^V4zPndg-^U%K5*r`fhy;%4XpWF(6*(G?d>WSxutN%^LqZgvv{$#o zLp54ItAk?qTL*FXI)dz6p@pkQlU|iP=-Gk6tDt#8>1h@I*0?kDT}hDmr<~OHKyvTA zW^=QGPsZjE5pl+eLg@kmWx>zv$NavWzQYW~bHL$~$%ShcKS{S%!No=OprV(%g~WcJ z@JyLiOb6}|`^NFx*fy(f$-6m9Hfs!gDf4^FF__sceUHqi%$rzj_XYyR4SDvKZpl~9 zhe5%ru+ibmPiuQ;NFic3@qy)u?y_OgaC!y^ydNWDPa(l{)@zi7oV37Fv3eC?5Dvvg z^4y=AhL&vFC6v}qH%Ad|YMGlS7*I{HC1(iwvbDo*J!vXnV!JG8;;>5&)L@D4y3g6D z1km4F^h4#a>Y%lpnDXg1Kp5>T4*~laO)&5U#C!l~pe$pBR%E@iD^1IO6#+f)WNsNX zv?5rXCMmQ90m)1$nQ=e{GUQ>X2ihZ1!-JjWE$HS^ePK3-TcT(WLiv&GKZc7wnILO} zUXVnZVGoUnaY1-kFW>&Dg$^g#O#H~EhWUsQ{+R%V0}TKM1?_7!wnUIGGBlaRM1sm# z?o;0A7Gw##2KlisDVc*c7JQYD`t=;@`CXJBnWM56Zc>c|1}vYZxHn|fL3vVOVbbW0 zk=3-buf4aA6cII{2+jZ*B?C9*x}J^bq(nNpVFhbHu9-G^6(>}Nzf3&B=PClU<&vnT zadLs22=vH`=a4Fo5Thr`3?{?IX+H+uB1~B6b;?=0_5hw81F!-;&TZ809Rr~lQH>%Ad`9n} z$=?=7sv)KbbeNL%nx!#>34FA1Gz7?t7GbnA2mgwrVoR+1Pbb{NqV+$9`PP_W+04It zE25QdH(QQ@+X$MF!h8#m?8lr!F*AWa8|az(#C6Bzk(RuoI4Ql8X)b!ZRVXo!mlK)Z zo;1K$QC(E(J}f-zd4uWB+;V;-;@z`J`wIP+X>gPU=(xpq=O?1MWb*iZ#3k>ua;kSI z7F)fdn3Lkwuc(ukC!%-qgbJnz6TP3Kq9R+*->k7R6T>Cp(110nzT72D3n+OFy)v&5 zih2PpNZDkaMH%Dr#b9*Sd1cAwVgri6_p>2chPBU(406iDnv*iW5&J6a7n(cWo$QZC z2OZ{Emq27ZFYBG!+o|^o#Bp_fuZE0MI? zClB72b2W7jM`$3M6NS?b-XcKPUl~X)5NxJ$6_Pct4LcOk;yX~*y86}I5v6{ZdnMDZtC@W4`!)$Bs_ zfyzp)z%3TUcgc`9K&ftK2k1zQgXue(q%}#|5fu~5MdBm^AMc~^NR)#b z*Mme1226>FN|?AB*C*nPC-DdbTA{hgChW&PTDd)`V6U387emxf6j}8RW#CL3NFcB~ z7Qr;Dox+oCDSNZ}4kz7h`%@bA;)qQ1!?aLZ5>d)NOGX<)GSXx_p#|4jE0dv0T#5Fk z-0nzUz+*f$*0pV!UFa^$A#n$3B+VE(%@%wbRP@G~_%099l-E^;hW?v|5&`?iTo)Iw zr9b+csTq9j@9%0NPDPO89iS}&huv?xpLCBjEL~gOj%Swr*5{9La-~rQZw!`6sBSY1 zGWaFZtafaC_O)Nb0DD%LQ&?8FyHb9!Rq(d?D4&&*j-iU5qG22qrsxU{ZYnE1U@s`E zelH70CXu2slZTY1Ay#tufQ$L53t~)JmpJL&K~>1fMo`o+UkR*~<_cxpCQ=EkoaPEJ zj!Iw{S4`8ru7NF~5a4U35g92P-7c-U^0!=zEg>w4EwdhlbXTKP4VvRMyxA$c;5JKT z*_O$jWZ2!Fot{_$&V^*%f+kJUa8J%Qx!bjW*Gl_6o|L$;w$pY#S>!2Qe}k=ch(rWD zHyhS~$E!BHciP4(^J!Z6xE-GXwcRCmk&lmaYb6PSiV7wB%b);F=AxPNabieINbl)& z+6qR@x<>G-jGN$z-n%f_=bxdQ@!i?CCUfwfK``oaRtg-(nzxsWEay{B?sRAQ28PR9?dGuRUoX5& zk9X?En>{~`Bnwh2>R(l19KFJ0G#^NK z4IA7ML-rEIfe|iELJ6=fj$l}W!F=-tWv0x_nzswX_$~Qim(|^=f+VJ>EH#*|R--Bc zXVt#G`#5r){)7^QqL1{FLWW{97sHp4itXvuWpb5K$XO(MuxaFY<22LrmQTr`+nm*y zt?H&wW#!+K&Nwe+9u+adw{PS6>BHivdX1lUJ&Oq0wuL+ED}0vw@_xu&9D?3Z9B2b} z5itNZVNKA^JrAmos)r>g7}DGFZ}X@R3OJ%kg0WfWE1mL9+F=>n3l%@V>KSi)b0CN z7hy2zzEMqG+yhI1JC(=PnPQFz9Y`%#DzEQ5!Hzg=EM)SECsvG!`*}S!k!P)rMO1A_ z#`)BPV_oa^K(Bzaz1@{zw#_A79I*__fgS0ia$yBGuZySgvN)f)J~8KXDXj^&=I-aA zfHRsn?mZvv_V2}Xn+YUtKkX(RyMSJAd584t_rxFnr0x5AA}{d2a#iXc+B+_Q@xz~Q zS5EY2!ZYtbq%wj_;N)!4=W4NE&4&-6%HT_$UYs7}d%@cLJV5rIOF>5SW8M@PnksY4 zF>Faezn1jYGKx4)$D@Y+w;LPPLgYsc&q?33Hn*Pa>^>RJ5*8+BeLnlVrDcg?TWG%w6z4h%1h2WntLn{KtA^6V z@VFiC50kO!Iq%nd)%iS2d-}D-z0Riz{B-TYr|o?G14ZwbqT?^`p2#^2$zcj<)aLly z)+#)3u+3RKci(_}KbJ1nnL1HcX;4YU|X1WV7eZKxL5 zDCG9Xr``#oij195oVtKC)2cN%!|#GcKXqLwXr2$xoAfdmBjeWB6sp4-pVFUg$i05e zum4&Mwdj$)Q^4&5#eMX72K$@_g8I3SpWPSz9;eI+_?A6VLTAi1^D>t=pSmqBgn)jJ z_kwiFMJ4wHQ$CX322g*QZPd`ZWj*evds_JY(JLT>bAnOBWYVFPna>6wHhm z=BBrc@LaY@ySNMc6|yx66q^-l-oun?(VdWbECj}tYI~J7Cfrogl0FzQb2wL>II0>E z<=Mn0I&QpC7~|WP`QGx98gs>W{kJ%Mz)w@zK7l%^f<=-}hszF9-(W(YeV$bn);TUG zn-%cTmDJxyh)I%vyx_sqWG~AQJ0myDEGY+_IOQogqLnu>4n`Ko_iRcv-sGOa>Y*WBT`G)4go|%%hR+rA3p*M9GgEsvjHB@$hz*y?N z(cT$f8KgC>CPfc}*4IT1Si-?x!gQCIGelO_M0GT5aI6bQp>(Kc_lsh*j&A!?Sq{di zm^lRX!r@?6kEobt#+O>p#`lYuqGBGTMzC$7Qa!#^=sx^4WPtFMx!WT)n_Ggg2_hP= zh=NEHpVBv>iF|oq1fxnF6vLS}M=xATn-)P+62s0>fqs~BYAbF+m$P54Ii)v0V_n7- zE{SfeG8ds%((+`OI6uGaK_7h~csS-k-vlq~I^_in=C0bR=@S^1zXT7#_m*KXRjpn~I8MPa-L*XCZB{Sc`m_N}dg3^A5kN~++h)2yx>a>V-JMNF2hHpQFrNmi-QEETv^oXuPwz_(O9|8nzN|6#b+N#OLx;pfQH zozeN0LwL)lp6@GjUirMQ#4awal965_EXB5T6E%7k2d<5cxtTf+o0&DmC=awBsGIS^C6ZN_v4SW> z)94+R5Oo&Gw&EYDxg35SGYr6CB_sAD+l~vYV0%}3@Os21uwdsspo&l5h5v05D{fSp zL4^yo%YJJdMrUbp>BLK&X@U@qb>AW})=kvT(mj6>kY-cAp9(EjgvTeC4OV>GH`PoG z+?o2>q6;xQ8`eq~?<|m5_ulX#xbqlp(4m7ts z9ARTa#_mm-iX#+MVJBpNiUpVSDr+tF9h&G0@;35t_ncR1D+Qw%6Q>$F>(o-6?Xm8$w=mcik`4_Z0|#8nXg(%Is=B~r z3NpNac)=6pjkt-?IMnE`T{5$F%~i#0Q7J=R?J}G^jCp+7!9y<&mhVrGiI^Muaxmrz zWMiZT%;XOG+c5gXhmop(sU3uBjeF=rH_y!7=FY{LcaTjOoX(nrqbq6DHcSi0R?dwH zn=9~$FthBxgoBZ~wH-(*kiHaOS_tck3jUJgHy)N*;VE3I%4n{6q>+u#ZFHC z$7YKLYo*mFG)%BgiI^*MI0|j0>IkLGs2?ZJAW9|zd3I=&+ox_&=8Sgm*$BnV?U<;q z(Al%1I=}7ih$O!l6H&w)Ao3Tae4;F6Z-bLNi~h#iMT|&vp`_|Ola=hNwFrYK&>RyDM6Lg>3a6xl_mjfL;Vc7T$;0k3$oB9M^A>Tg z=L}0l^3-exM7jjLeN{v4^X{9dwy?7lsQk$0P~QrrekCW}nB#3x@oR#Y8(EdFzDP7Q z55w~D^K@XeW)qPFnZsIFqTuu5*1hRNC^-C(85@=qY+?stY;N%(7;L0ss66dMLK1XL z)s`EaLHe|dsB_c0O%z9@&)-B=*dAx%^`iwikrJV2r_2Jhs*9GMK9#y#0AhTldb&-> z-}pQlG4RX+JER_vS(I#eiB8K!v9x^*fB&_1o~J1KeUE8S)$G=4#;dFnf++LTTF8F2 zMT4vp`B$Ecv z9$Mr>rwqKr#*Gf?jWu~TY1H=a?7d`8V!-c=T?OBSP~k0 z3N_|(53KYuQ|z|O9(G%12JCHW2263pW2#tydR%MpBP3$BZSUk)Bs&p&*^)-HQY?;N z=U#Y+cGRujX>rK>5X;+1!j0pYAGzMTjxS=?Pol5Ebt@M(_$@t`zSIF{r)u1sij|Hd zEsaQ%tTQg;A(8Sw)4OS#Vo7AFeAI52!Q?%YD0RdTPWFKfP~A<3kr%pu_Q_i516_(U zu4$Ct5>57|f;m4>hcu)((z9{?(Xo-PgZYW6X44E0UYFflj|DfMrl2wSw*e_8PZO(i zhsoub-|B$v@2WbcEn^4Y1~3qW*yA68O=C-L!0H)T06GwjDn58T^?&3xj&Sw8Ug*JzV8;zZqEle7nf`2`CK`Xcn)^buGr z8>m^I?5Lvf55q^@!O#*xY*TW53UsQWoV0w&E-y%6=wpj*k%Z)x91wFugH8CC5nm0_ z=Tq`vi{;meB1-QP9a2xcNFVxX|3JyeV?(g)}p*W#LkG^ywwK}E>pZG4%*v1(wL zS>pD^Cw)`N*2p_4C9*CY@-)F3Z4p!(Hm=)X&_Py_E~-4@zMJ`$6vC( zwX~dmo7}(6XVlAoapZU&8o03ccJWDHl6e{@i34lE;XyR&R=Ib+24zl0=3DT@X+MSc zvlC^%({!V?iw3FF`Cq@2|Cnp_J#|jO+QAl*DrxGb3*g~q(oTbk(*3%u2b-3*4rC;N`!YQW()GF|i?T7K@Cu|z$d7qB zSCuXPIEe^+BZ){3l0wob5 zdmhmrXF>D)m>0^!bDi_~S7ILbud|@9llQ)7K|``;ud|>zA!k2lL4$tE3g-MVk?8N- zsecl^e##4#hZyF2ax%+J+k8*O{Y8c{=g;Y(*M(qi@a2c}P|mAtydTp;udaMI&yVS$ zKO_21_5b@cWzJt_iC*Wk8ID-ruM z<>Fw6q(}d+a)EwCaFsp(edWKi=?CHD<-L+h4lY(+uD=mn;rTNJKpqHf{ucrG27=2B z?(Ycxw*5c*@@4`i&kgNV_**-#Ycl+?dS2(;|4uzQfd8l`=u$Rr)Q-9u`xD^bko6~o zzvLzwKDZWef1o$7z7!hM4(f6FGsXa5!ehzG>V1Nxh+mvDXy;7WVH1Gp-r_P+pl zZUFc(Fa8$*uEPuvh>H~xLHreFT*LV@1RR&;y8agd?+pY${`l~F1ROl9kWyja5nSQ< zErP4?;QJbI{3_M~-l!>Yayt~a>AaYGj&vBbabhwD|~0D)QA|K1SSfc_A|WxuU!NBErhFR{QD|E z9O^F&aYGy-f#9D&0P*}I&)0Zmjf{1(AY zGX6@QIc{hp&mWNy2!sS|f6MbVokU=lyrGSkT={P%@N%+3!k)i$=^D?U zA>h2MvGo&z8`5}5mH$S-%>@zXzuz6M@ca(JbxGatRQ#nTaNbZx-XC|v_rDtg@<3k7 z{N+>|vgK)GC;XTSURHu*9@czQVR$_HG=?rtqT9(NGCwi4 zEohqNnGgGy3j@dLjSt3c*iYF4w7(v0z6GvgvYlU}BSU@c86 zQbLr{CgfHL!t`0COHpa`rj4Z3xtX1HN7@dPYK^2lQAgSZJr<{%!-r?)(7N|+-hP@$ z8Z6i(-wa4lYZzsSZxji8F_d2x2b^HRIZQCM`nvqEqBkWOe7-VMOJYKi|aD z`AywG7l-PTAWG(UQ{vJ9XAvxdX}{a4>RFLaXrkFz?RKO{T?+MB_;OoFu9Ec}X*@l{ z_~UGbtfXRQ@@oZi$l2bCM8W1^u1emFS-k43QeYCPjFAp)%axJ$3Qlog#dW`mjn9vC zOG(HrVW6N@olQQ8K<({H75AsueH6yp_PhiC#^~gWPn$FK@_Qtd%(^gR=@>xVN$Lo~ z^aoK=X{>%0x&@XEc|bOfkgL{ztEu%oiM zROvkK<ncXobC%<3lnZcJZ6j}|F0ub2kgq}_p~hKOUr?bm2w&zpoAFO(XM zU(iI*sx26{p%S2_QySI^A1BGp5(v5V9bV!FZBHay=(hU;tsP}s1ck_GSd;bXP+53#W=3H~H zHRhaapbksZ@4@8cd`^Q@+o3jt_BRz_sWc@}5)&ielp~;Z9EW7(mbl6S&!!$N;R*_NqWRj>=paG^uw%kSW@P$^ zjKtY~CZLK;AY7ELAm)kj!C9o@0st5wTEZqTV9Yl~uKO6WH7Vx1-qIAq(Ly*oPBfgI z?Vp(GPFz+MWrxF<^itRmSX*L`zu=;nb2O;z#h&NiD%vJ^om#=?PI5MNu(UZt|A2OX z$-?5gkI3ZZCx+>?uhASuI0)N6JZa(oT7dyQ>y~a0hA`)x#_k6urjqvM6eDW#NY)jW z5@5{=g)7-~tZ|2U<$$0pnud}bdR|smjZl9^Rt!Poa_(wLIBObK4L)_tP;W8i0K{h9 z1qOG81%>&L(zcsUjqyrEjuKKGxIk(j7XrKLExx|dIVj11fhqDg4CQTYR#?V(^!J>W zN6j)6N3@fl%$;|zMT~&zwlt)76#C8fAVdr(%J|uhH1#2=3)*iJgx~BC>T{xi-$!&{ z*#rKxXhbpilHnxyXr%8!Rf(%4-ed=TpCcu#LtPXvKB%FFWodBUNQATJYBAB?u7v;P zd5iY2`#T)&>2i}gE}R=d3su{ggGa>~o)A-rI;Q!pR0}4Cn+YJ^?0Q*$xzd}J^LB;n zIafsLC@YP|4C>GXF(k_*ry%>dAfrq0LI?O!CdZCWi3nFH;=T?-8MUUs*p&kE2Db@h zF$X+6VII!u`r^%;gnPqQ#BBLA%LZzm2#y0v;-en?WqfY?4ZE zX)(ib5Auv!%>!h)%UbdPWUSz@>;yTKyy_|A^7uf;vbpr&<`s*B*cU-uEem^f6=rgW zG%58QoBnuYV;Iy*mY@@FOa!s2I1 zWQGQe!NiF4x(4!>dER)M^Av7;j%$z6bj6pm-aB^MtftchQo z<&gPoEbqxgp5vDi9j_FXSV2V(xIXK8;6S0y_KRfIitWAVauRdwo0Z;YCR%c2#0*wF1EgMwcF32Bj$p&j1Ayuk zIU!;uTyjoXlAufPV)!fJD_Pf_qOZp>clQcVNXiWBayl76X95ddac8_UP7TS?^)Z(P zK5yU<=CggCrP%VXl&i)V6b>jbXFJfVkV6$$nJ;6B_Pv|<0>}oh7O`A4cEemZg04g zqpnmhofIdUUqK>YsO=G7&9wJj&n|`LF(^T`s%pLx+F;QO?J2z2 zvS=_It&Pg2io~Y@6tNUDi&O10qoOpT6h4Q2PoQ_cVOR5nn& zAD&?~M(oB8&m8ESNAfA1f40=;&oi41Yq%F&jAq~OPA?$m*q#_?#srL_lF&&0vJ8!H zuossHon={IRs(~xCt}M4d5fc-n`f6&o^&-wRswcnO(bV>~R`LnB8{y zdAK`=GCMjeVcTjXcB#8+>5sq1$3v+ z*#6mJIq!Xxx$KC^p}%@(n1UA7F7r68j(${F?6lB)G3)x7MVo`xs>~n{-h3Bze=>GD z9iGKni2~#uzzxku-4v`hpjHm2kaPS9&CU-q+CP2cn8e9nN+h zR!4RfhQPvTvlqQ!ME2Z|a7gRzt6ip9qQFTbUoW(Hr33JLxg{1pz^jC)Xe+RFR&DxO z_duZ^gjOqfip&?;J`y&HNu%ltUd;H>VucXNp3q@AJEnB>kkwh2psODFG#v0KgxIT) z0E77%Zz*w|msWHd^<%LwR!TRLTQI}>B<`yG9H+9GO4vul@v$gR!JPsI0Wq;yrBHAa z5EE6XfNux2C_6~2{iW?Vr4UmWr~_V{34JSf*hn9 z2xYg&1t%|x4IkobZZ7w3BH+$W>RYN+kfoiSabLo;cny`_dtGeU`U867qoM{6|FXUU zko@~EyC(*QU+OCWtli)4ou1Hp%-{4+{e;8T9?VSfPnTL|Cw zzakl#pKvOS0PgU=fM5Wm!G5xgKOp@*h$qw%+cy=SKaIo_T7{9}KXFT}9Gr9jw(d7p zgY7${{|JJK=`UD5mM6ptBg2218LR-x7r@g02I2>#zX$PTYB2v5&&TqFTVZ7QMoIm{ z-1sdo3aA_SIXizK`g;sd<_60*ZvB6)!SaM%Vf^FN|G!QS|Av8)iH`Lr!2{5Spkw@7 z3_r93es@dOZ`tZUVR#ay7{8zO|F7e~0)X;MUh+Gl{|JH!Ku-M`#1rZnz?=OSW3aF> z{t~NyK>B+SPe@O|@ymY!;z_V%Wc*L8Ckrzx9e_vs%`JaG`g;&hcu%%()d+tw$J226 zjU@kfw`5^t_$6fjfb_Q@erQ_#?h|Y*e>D(hAo?-;zWr3W^NFA}Qu z%5tW5#)vZ;>WZiujtlj5^+^B(PRXT|mc%A2Ea%u3*iF#{SmTs;=~*?eZ;xRkP*8ZOp|; zIzReSp_`9`DtP_5X?1DjTRq9Ox?OJ9)|;7BD@xs9JL{0QM!YoRtybYf2nY+F;}gwW z@-~EY?JLVZdIyK}-q)3U%9z0Vd9dU%m~q7lzH~vR_LT(i4&8H1*CiZ?#O~64@ruij zZ8|JIoa%Uxg8pQutCGvZiNShS=9$n`p=xR~Yf|R#Oq4+}^fxNzop>K!*Co$D*t#`x zC+5IWD&oFWyOACotXJPpIxr|YRA8+4JhK4 zAxk{4e8QNLwcTH=014%mqfcT8VNe)N{M8rtYDl{BGN&)&{^#2yUCk8hm5h)daBL_1 zrKWi_F_BCtCF1RIPijB;@5%)4viOINqv&>}7S?dCw@|*zKyj_HbPd(iZ+|D4yAzbx z1lu5qXc$GC>Al95t5QF^nETb>qxo^2fYpV9D=^nKI7?a!C0AT~7lSf}sTPubxU_5$9*DT&VK~DRXV=9LrJG_L!F&V{mX7itH@n&(daR_9e|WF6^kl3(n}} zdX_n?{qI6_6xQTSaABi#M;2zb3H)9cIK(f>?0cI8HE-xv<(xx1J?p~KU&U5*xTzudg9C*UQQE&4;4=7TC z5IwZh7>4+$H!vtbH;A@~KP7gAlYp6)V>r=5rtDRBZ08eX&3CBV~ zIg12|p=lreQb*cJasU(5{tFIpKxG?|?;0m06KEx@Kquevo-$z^7e}tB3#orTG?hP< z+#J$7h8x6IhlKtwNvH1JLMLsx+E`%xoHYP%fi#OlNmF=m%Ka#E#ufZ@q&&Fe>_hyD;RC zJ<;1wAW4Ed84@8jL(#n+A5K}$rx?mfQ##kO8C7z%vd(zSdfh`>Qi(Ask@_T@^H~M_ z@`>0!TgeyPDdx5t+5+K&l)s!M$uJ;LcMa#rT;)B*7hXV)HZv(O2)pWS=H`}g;9}C~ zNDv$z@U)CA-mF!hFYB61#@eCs1TBlO-nDB+6`G?}I_>e3*J4Qq*Q@ztv|W^BUdNk(ae731o=+n{4_YDQ9% zk_Bl74_bUg=$8t7E2lDvU|v2kRXb=oi=Dtf*VE0{WNU402Z}_-r(lHEycc*RB9a!G z@$41MZfD(zpXBZ6KoJtz?uSr$oC9U6EbE9n4E&VZ#)jn{UPN6oU@~1$0>M)}u|Ra~ ziwuV2Niv({2@^f_OM5Wowi#x^lV1?A;6`H}UGP#G7bSlWmJQstDrgl= zkro3Qc&tdFX;rq$MlqE!4|Z_Vm& z_g$j&!<-h1AaddrIGCYH6GiDy_9)RfYPD$)8zADCM2e-*Mf2P3UxZ^RsVoyVhvuAs z!L4VZMfXe8m#VFH*?|J7;&=942h-5sI8`1qK7yZfrt-o??F zZUhrrWAB}G(+Z0>hiYxE88Kg!JAc{NTjem!L;l6^d}Qt^cwgwPUf~vlHGHM)6OSc< zkZf6ZS`RfxWF&`E)?He!M#kmy#?b7QV|y?+^`_*RGY823sAIx*mo}&um6lT9) zZM*M$ZU|GyyR(pV&I?;2R3C9sGtf)~e_k->rVV3>;p4~o%IIdprQP$c$?NXwEQVnM zUgQMx@e!2nP8p(STi;C@KAw3kJmSN|PzcQHJ6RM{%z{3S#(OF0J226&@7x}_=K+Vv z;EScv{UxEw_;2k-I_;iq&a2Pfk%VuAn|e~1aPaWem*=ElPCi*zOv z+qV;U09tbYqUOfJ1lWLlQ_*C3qC>?B;P+?&X( zDyHmA9KV&yfiSQffr)r7-U_WX!zv+s8uS|dX4Bs#M9pnF1$KH=G z`u$cvt@2l%2N2QyWeEP+{{Xs*fA}BZ8GrG=Z~yiGkFXD}SUB2Q8@m6Wb^bE`);9Im0fX_^=CvQa1W&PlOLP2J zyZtTJf41U(?gD0e+6DX{Ixhc53mMQk^jjA&fKvN&7x4Gii2s=azmkyuZad~bZ1+8a zes2W+KZ)*ux6Ai=`mbt_Y~N`6|H1leZs#Y~znWuDu>Fg1{%eS5=lnIq1ET*gZ`=QE z(f(aK^^XwG{{7>>b!!7sZ~qwLzbjq-$tnMsP=5;X@_UY8PZ`B9?Gx5GRB>w*Fzq7II-+FBSnT^%4v0V^De(-Mh#~%QdIr>Tm`~gT* zD*2gYT83(^Z#jjEcGXmOwY*w+^4AOYnp~anak^c@Q57R&dl%C;UR$Y|1tUWTFYn#m zTczpfJ`F9sboXj#(##ma$MfNR7%n;&OWqsYv|~Gad3tEFp)lWYFgLYB17h! zc*kwX`GH@w3;Bbn5lpPL`oM^fJllYA7NnJ9FUnhMIu)jN$xmiHlyNuP#<6W9###@| zj=QR+<9mH8)%x4E@w+@Xlb-4WvWHIFb{65(LQ6h8+khjq@FDeG*?XYxD z>T7nhkM`9O?kFqPo`*{kBh!E=nT@5%oMCc#@$v9eDMAHYFnE4rE9V?^Z_s#8q=lhI ziP^`g!|L}2s%sb(lP2AcvZsrmk2O6hgn8MC5i3?N`mtWAN^YDyc%mL9g}NSB+PG6J zFG04vaY8MTD;TWbAN+K7m?weaZa+3+Ea18Pu+WYT!QYxQ8>s?jdl_>u%Ew z=`I{d?ayK%+XChV-5(S9W=$Ok@LH_jLr922o7r=@y`$Dk-Ccv(%n$z*O(Y_XnWZh7 zjtl)r`9jaXmYe&C31&d@;$sxy$0(|fNXX$~aIiO&y3<(~#Cpp83exe8MhTSGv!iX7 z734wDTUl2X8(bmX9s+mc&Nc{YT&Suu$9f%eq5#Q=VJ7NvT%a!+OOTk`UV`Hup|z`_ z>qv-BTQd|?a@5Y|CredMyrR}8MFT2EBWJ-f_yUHaRRVD*ioxvE=5>rYg%iveqzn?YZg?>Ne9`nSI}p?4 zlV!WBeufe#!epK8@DSnUL6-4wEaIb5NqwzY)V+AQ?XK}$Il@Y^3JN#pOJhAhTO&P9 z(X()p*whuDy%fAOH4@2ZhXc&3R_cks5p9~dr_f2;6@cn<)M%8rO{L&ojFsSZr_4fy z-eYBJ<!*9(=dO6FJ0~qlTvhnD{z5~ShbeylP=hULVPX<6hgWCf>M+! z6+AM411f~F)8+)XOY?GIMd4_L{%5=vv4IUr6M8jFX6jj+8C8vU9y?DI^idWGeiYl_`sVJ%q-q=p>O6VIgv*9N zwp}Xfb4i{ZGpM?A@r-Ny+u8<~{DfWy-9S?p`<%eaYy89AR@S% z>Eph%f4-RaX@1`*lqEkn?Dcz~g*;F284RTZYTCUp1A%3b8J+uU!ab_64cG)s9%FXC z6I5J?FB~&$7+O8=KRfq$+~Nj{I2vpP?RJ(&@3=~MR=>tyJYpce#l>9^Mz6&kJA&j` z2o1xO3cZ*qD{3{AG$~7J`~sg{W9m*y>|0HO%>0_&Q>T1Jkv&?i})k||c&JD(RE}{xnS0$-SJwy~7&5ygD{XLA4q-+?ObiECNo=W}()o?D? zfptKoWqPK4yf;Mbr5gnZK7su$TR$6$X*>BEe{(>0qu9ZN=?xgvCLOeFcoIt5&Br;c z6KbZS0))p${Ejy_? z9*o`ao*2`C)x$Epc8$y^M|Xb&48(WoLARF3zE+kk78_HfYMr$>Vem2(ReX&dYQj3S z3eWzzyiua#EyHs5l8-oVR8eyw#G791F)q04`O#f*4WTU7H`Gy6C~cnMxsj7H&L63h zrtPA~-M$`gKS+QA4*5kptfbDP>61?|L|KeGl0F6x+CC;>nQZsV79}sir~)THR?Siw zHhQzlFAl8v8VuKwbFuY>Ck0UilC~YNSvr$j+o$mJ<%Zl`t!jYa5F6QcCNPd6A}L9Q zlpfTFBIe*^c9#^h5t~J?4>5|XVbpP(UwD?FKJ;kZ zBB5Rrxd3eUIkGzp4o{nyv%KOa-=O|DY)&o6hqBg8xPN|7E3kO7r&cxe>O)*UM$YGI z9@K`cFsu&=ZUUPrsVB`+2Y!u*z+_?6sl$moTKMoE8Li#tS3numxhaZWzYN=`P&kMY zOJohb?2ZAR6Bt4H%zR6dK;;IRhwhP~1}aSh3mO|H558L!^~~cMc4(L69=4T#eUzBD zdrY9>g%`v5HKZKuwdZI^D)a8%@*5=(lJ(^g?*$0CGI5YMQ4kc{r7Hu z(BM-{Z=gw%*4`SIO zzKV8IhVl=K?z!yC6Wf!J*OD?I50=?y3FG`EnLyR5@W5n zdh0*R-0)P+9mS+MZOQMfChe974sEfBqk`lg(!B=Hlnh)eG?<`toBBo(r%m`tDSbt3vQQB-axynYj1x@@r0! z?avhANY2UxL0~xUn7R&D678=|F!|VB}1^SKT`rnxiNsVv8_-0t}FhQ@aCNT+gaym;T^_*O;bNPY2){mFo3N4 zx0SHAh3$qI@_k!-E`J<$%HCcxa3>I@6emMGXTAZ5c|een6^|T4{Y)M~U&V@Lc(r7N z^+f_KMlMBojB_hj6DuXYYXd&JIyYOU+~Cqn#|sP3)~vEaeDBn<2k%+A<(DsC9)%_>C&#RIpiNTyx$MpT|~+zA*45F7tPchS@n`vu(`6&T^_C%nPe5i9>E-;GOt}g zL92AC`ZjmaTN%8iPSU+6j}ZU`#sY%gy&b*78{_&p_@`6EVkKd0gR1 z{+D8M%v^FpQv|N5_&)uoy6~Zc8DqUnq6=8si%z>?6I0WgjXM+Lj`6t1!GK+QS zK#=n67O*ky`gNIr%)R+?xIrQ&n_tskp)6Nkxz+YOez_B3v46LKaJ)D)>8Bnzf%06A)i!wu1HqRp&={mcUBGCp_u3#}`qgJhGRsJm5WBi42E zfP2UcoTMp_o+ZG$pJ)gj*Y&oLBz6`*B2vkxAdo^ySR#o`28utvAGzkz9@Css zOX59IKk9X?XBPy*Q;Vw+;HXQ76&Jw^8ng-4-?hUC-i;=g)2Og-#aVt_h}C`PnOqc! zED>2KnqwgIr3kqwzcQJj@O7S0U!wJHn6kTOAe4$_$kk`#>r0V5a!OS4%AL#lD~$om zY}6nd@Uqt`wS0LK$|O`)T&;L6mf&T+MrU5&i{SfBtZ5#8iQ|!PF}uY~^4GEz4Y}BJ zx8E1%55j&Jh?#fJRC1seRb=F%i?qC+M2urXM_mjagOsd6&E*n-tuF-?NnB*68aJ?8 zVZN-4Ck|$TwI(hEovkaX-P93m(#@Y(uR>XRN`o#%8N39wRY2 zrTVDTH~EUlnkDG9NO1wFY%8h|S0LQhm0x#K3u3;c*M>J~aY!Z>TbdF-ZWrLTHAM}M znBo*0kJ%E#7oRi)agkgy6FF1%h3RTYwFfbvu*X5D)DX*K9?+JJ zCAvS0tllH}Z9wzAfKyHDB%^ji@n&|LU^|qZ6jfOYk#iwa3Yg)F$2>IbF#=YQ9%*G_ ztclxF@r1`ybktGNDlyg%=VD@zn0sYFndj1J;`b)X;;YE9#(bK2%}8*riDz$aF)Z4| zi7%@PgOPj>eqQGb$paiUE4M2=ms5B!CHxsNd5Fq(7y;>3sl-J!ElUW)O4>m6t``~2 zraVS_Tbtd*3vnKNn^?BkY@#~Y!F)7vgkOe;ZH|rJ1k5O}l?7;xWS7#+bQ!pm3q~M& z<~J4xL2I4X!DFpYTNO*eFOLWg8;>fxt>}zrQRToU^DPZ)%{79x6XvBABsdO+@bc;k zddiHK`LcgmdXtMPRI%SnWM6;+FRkgxrO>cqz3uxaI|_U|RsXc9T77^<^R92%R32 zALn=%@OBRUF0cy=S5F3%4tGo}XFwAb@!UWxhBic)I2ul3vdFAwI5O6pxp@u=N5$kT zzk979hamx?i^c4naC)k-{q;E2E{%mTNbMkBJ*^pHYlJ`=@o;ITj47k5AXEXbg z60b9qP!pd^^?>BClhvuA;mn*o!c6+2S@R;i$otpiA7zPnDv0ErjOb4>g#|jC96nME zFbk}j!2&nW4m6{3me^Sx+{4bU$fAXxU~yBczQ85kQ>Zcs!h^orDYufFzv-0SVGcp_ z5pscU#f8On=wnDGAKtF4B;7v2b7?A&6xFiYgrm84VlLg1tYABup z#FBhy>Oo>Px02AqkpcL2^skk3Hu(Iucs@Qi5!IJa9L=4NwkN&(BYsP-Ebs;#_9d*d zk1ltvS3$r6b@ij)cIE7q^Mz>N!Irg|9X+7oZ9igJ)%X6*V&~V~$nT3CKx@#yEp`C3 zA2$0p+Ruo;9NKMoZ72=~q@8% z6lIC6lgt_JTWhe%gC_TPr^oh=S8=+!y3_RZ>CN&B2o1^X`dQx1EjLFKm#4#94{P>k zr^lNor%Mf2^yhEeU$W!ZkIc+yPSDl(n3Wlv>nB!~fo1K6n~f~&Cm&V!l{F5$p9T+* zk=C_KU3%3|H}hI`Zn$rs&8HR7{ocj!)HQ-h|Ka|s$Clk^NR53?o}6D*Koev071a^{ zML09@lt)2@?E~hGrqFZM%^HT0=Nlnqdh|6zuJY;PrxRZ`5o~(t^lk8t&JH$uMvk7x zekv}_Wn!Yx6=xLtV6aa1Z$Gt)tU_2TadL=exO3 z0h8KJ!!lp};%gNnRp*ApUG8{19=a4X&bN`lpuJNu|2Ek&q*G>Ul(%v>>;AHhK;v{R+*qe=eb)+Qx)p$ z*^_UcU%K#RFT9}=#AMRBKN$69UFSJYVGEKI-!Udn{PkX*CM9>07xWjWxIkdkdC}+s zOcIOP4(21kt*^REhL?mkeP{%>SL_D7xnyfl@BORe5r+_yO{{WK*T-n2k(tY(m1VDq z_HQ|jf)_8%$)gghx95aY%p@Ipod_FY@MLQ_{kPs6*gVjyRML}}Wk!0zAxDz$YM`rO zuMlF;2nr6cRKZBPgd6Zk_NL@EId?&<5z&-DgUWi8a24K^GK?`zfINR@)w{r?fPG9t zE8N(7+aDa0^)fsO4ywRB@i=KF+bvl>-GI+Nv3Oz7FPg4GIp4CM>`}$`>=sTnlixrp z=uCoqQ?UV3d-Nq9Tz(ghQDs6WjubLoKNK~7;9kDF|&!h`F+ zKI#&bqv~Mj?|MHw2KcQum_Xb2Q|{;_Y^f!<17*|dv(@+n>2#1n9o(#gNFwR=w_`bX z_lWQ|T0^s&6#=-o^HjXGY}s#zGt}eM1+an3tYt+W21(ZT&Rn~8*St~^nk-?N-a)Ox zF-7MS*aiqDNoq~e-oZOrN17-pvUbn%&n(;>B!%xF%vSLRMwnA7V-(8dL#fLrEXlnw6_X{J~uGv;t94yMalxE4Wn~f;-K~G&oYj7s5m! zYN*}(oswEV#zyxEDIb>Li}OH|n}qC#RB6REoAAHut0-sAJX= z&uJ}q>GVb8lQ}N#{;U&~S#301wyU;poLH4<*bT8E9I_hq{Cq(}^+AHl$>k)KQeiPR zJtuE?7NqzrF>{)f-`k|rF_k31ZxGyEcYq(*c1(BG#&IA^)oASVqcy8?va*s`3o3iY z*YSZbA=~+J3}Zf;^MKPXFPll&N11Wvoj6tIec;bKsRbrSSJp^Gv#C^{3OAAiCTGJC z&G#*|F)W!bQzM1v8gL!{Hq60sR7+tk4MEyOcN2XY-tD z{HuEAay!>(mC6`VCKX%uf?&OdQUx{!s0^Y0Y1~Nx;d5tLiVFpAMMJU231;)$@KWu$ zV>Fd_;X6Fe;kD43$n0cBXqW0zf*cN@$?w8UNJ`HpB|V+Jws#H0>M!H zqI9l2IvCbxBQI?^$(^fQ8)+QC=3eL4`b%2MlINnhC`idtYPe>-1UX`RbXVN6)ekCl zjvq&Y0d|sjNkmr!_)Bh>5Ea#gGLMxhOMAv1=%WX&Yc0jQtAZL)fG4JZ=Ik_nE#@R7{ z_HlN-2Dk{OKB?lXe-u75(5_;DMWTX?K(me*O*5J7wK4gthtT zhaU&_1;9%ncX}tI!xm=IgQ8ZD*1ly#2@ZF3y@qvfd+GKDc(~+Xg-Y@!LT4m1CJY9v94jLzivJysBhaj%%s7Hu6U(5MV_m55b46dVRtO3 z!Uzgo@=8&aJTKgT1I{WCSln=F&K^}wP2egt7v>1f7ByHUI9%DlyD^$2B63YNr?lH( z-6oQ|#IjUqLkdXaK6I?7>~-NI<1PFBLu|q2J*Yal7-XDrs5pkMYhZSf7zMmjF*VlO z;#YBe&X$8iXH8F@?Q5hw*&?xPiXB^xUWqj~8y63Ma0QD3({5Q%d2w1)YaRK|*Q#YM z_KI8DwUgKV86O^MOteWvt?im-UFMVrKL_Y=u)b^xIHb16)G=KFnUGNd)}1a{=srsLP}$arqBMB zE~baSPAQFPdhF@{{A&I+R-TrQ2?UZ6y@c;Ju*s!!N7j1vlLAi$M$mH_9X5J zu~@oX)Ug-ZNINr=o8Hi;Yr7?+rhzH+s5XOB0e!ur^G(A^^rB-5v7DQlc1Z84QT_ft zY_3-|oowf@Ho%W`9|f4Oy{qA&mOfiX*lZNj$|S+XS0CcNW*GCeo+i{yx%OVitT*Tj z=n=1N@9I)mi{L4`wSy3m6z1t&1xM(mv=8mWAmel6DomPe6WMPuQe2}V!sFM6-H!>o00&s(zb1xu(4TBr&gdGlI?PSdD7O5Thy`r zK|(TtG7JlT6QnLx_tPgkj#t-q9Mo^h@ZQ8Ee?8k?KUj#LIy-x~yR|#n{k;FM)(~HF zgb)(%b5IfO`gMEbercf3RzGV=njh~HJ*3a|DEz`j`L2P0)c#QwoD$U}s9fX3jl%mT z=RNhb8TdpKN$sdmvJ9#jdd~nQZRz@c^>yua<>!d0_GHr&`;zDBKHho{E|*tEu4;D) zcPetK7RE=)nr9`pn2bVMhv&^T75yXYxn-p(K@mo~{Ki*?${DX-&8~3rd(Gb2XupoX z`r7=qXYFu!1V1^GnM#R?6k0V5pna*RDW%AusYJw;`Cf0jT57&Qx1kiZv`WTp<-X-r z-gAV*z8)p|%kmRzY={}R+Ng0>`1%vGi5(qoJg7`wWGiB{Y0pA4Vpf?RAlxtaX&w1{_GffXehZ`#tcoba5{ zrcq6{l{a*!Xou_WlMlo+>`m$vv3t88SX4`*C|KS}4TPU9+?pssPux|8)B6;E@TnKT z2J!M^Lnag9h%Ly$8?1*@)Oh=a*%AkIGf**(?q=zh4v@DVt62I}diu)dc61Ph1DJ>U{0T z9(}m>?&`9e;TUGnm%`k>lK}iLAK~}`)!Nj_$G^60hWYeXTK0H>9T!AVjNt&D@vII zkOL1E;7~cx)fm~1deGWWjRd8Nz+G5f7@o&DUN3mc$IuK#n9L(`PIS41Ta8)gW4wT0 zGO4s`RZy9*vO;*AEW1DO?zrD;jaV^l-q__O8@D2zCkWL59W`1g-({t9!%V%sP)pI2 z*x!$AaUcVm5oT^;tu!fmu7ojTE&b6H?juM%AJ4=ZL|p*M*%J7b+s2QB?aW8BLnmqgdHz zb4V(tVa%~%@92KK{XDX*@RFR*@oe>`nfUab$j~i4Z*2Ri$irJ3p4M}}N|G$U4unWH z_bNLBOamhV2B@d>J7W?n8qCP}a+0xn0V+DzpU)qS|E#%>x1vU`@1M5?Y+x z?A9b-RO|~)9-{piP}H(uAQfhJFg0QBt?2-UM z%N1o`USHvnAzO88tv}+kmOvrcc%+T$*fqfE7|&XQq3h&PFaSPo1cDNR@gb6}e3&-f z@QaiKWmy6vVy|zqJVuRHWTyumFp~@J=hrEEJ~-V5tY8f3;zpxbcPZH9+pjTN0vjj+ zC?ege$GMk1a^u#@ZHQQz4Jv@U7?iLw!x-4{ct7zXHJ)^wejbo|99*bMs=$k$mk;(O z{dB?{JhSW=_~8R_1Q2s!jt6fRs7wWLJ(yVZwRF0Jp=nX^dP3PWc9mkJ^+Bv;T%r$d z2Np1y9-~VWPc0~R88eCju>@J(F4XGkvv+v`i?PuptJ&YCb2(l$oH>RYl&y*s5i-8P zt?KMbixdMEzzb{xzYasVoxxEg*}FM@G2HqjJXWyHfxA2jQS3;6h&9uOkTQy9AcW3X z$p(c2PXlVPZe0yGsPL5}#EybOY@)zL(sW)y`W^_dY6;z$A<_5=VBg9CzIV z3F!jFR8!z(ccYICy-TM#9)0*@e|hBpky^ zOb88xNU=tff~628;RFNtMMi0F8C8&j*WTn?M2l4PT1dh9(8>&|t@^OhQ&cW`i1E-Dt;Y)W^_Jn60Vzs0gBGx zD4a5>Bb)=6OE9FTJ7W4k5a@tMH#Z%J`|+imPN4K_QGn3W1u7E-J&5E4y2IiNV|ltO zmfYRwQKA>50Mb$_J}V`vnkQml^-RilDlq5L!XMZPD_g{19g%b=7@*qTO8}W+t~ zx#|HA*n3N3&*fQ%stpl!M3Q2Tsjl>yEJmUUC^aJLV=3$c^~OaBmdJA6qcVibnGy$M z@aK$1)`q4#0f!jx<0sJqg_VJxlNe1lQ?o}QtbD@+r!&@#4$G`VGT@1bc2fy^pX7*zPZ zUOcTopp9H~+TA`PkN0;wASG_A=1X_t3atf>zK4&sK3iyG~eF91~W0ing-xi?DV zN94FMWsq@tPuD1?$P5SpAc4BBPC&ryOK^9ID;k}f6`lL2T^RDiATN&J>Id|A1B_t# z%n7UPzN32$9fe8G469HC(lKoUbN&Ssq=NH1lV@P(V0MVU(?|q4{cpQEzZ`?w@HgrPPc-xeMqnVfi*P@yUHcgc;V7%Fb0CWr*Dimp%Wi<%` zghq-42gyLT6MO`@;2+}^iVuXiXTqu?uRj^EO^<7qXpyO^T7#gb2v{ux6v9D^jeF+Y zt7ad~pfC}OLNMM;C|zEl>}PM>&8!TsCXDrcpzQ=a{j@gU}9h=3ubw7a>g1(E`ef;^wux%*QilUM_uS zEi%#bu-JQ7_XU^_f9Ru_6*f`isnyqeFn+`E6R`iI*o<}Kp`Ne~W zPjX9R@=%)$(JCj*gkA8YI;HMikG58UK*9XziH&TesW^Q5r*4!$cm&1aHjSN^uD~E7 ztm$L*3;MK-PeXBi?o&`tyc1)#m zW|65cRNj3&Fio#Jo-#Xpquu1#{HB>+YTtfJXJ<1wAwkaldDgI-7%Fbpq*pWjr`57r zm^Dz0u7r<4gIm7i6ESdxLk0TiA5ijwUtABJMp?5}tt6{7=;lCB#x_a}mWk%>X>!7^ zN;L=cRsxkqX~?`+V#0O+r=$fF1qGb7So z_F9ajDAF{MKeAe2f=&z}l zkrf-w;vJwuI+ctVI2WT7l+%i#(D5CwEYDta`0ui8dJKoFszLrixMz$An9o?Q6Yw}rJ^#V!AEhVCG5!vXG*?KOl3^`ur zoY++5777fV9@*>Zr;F9|P3h^A7t`yVZRN`d2?BZge?EWkeYoHGw{3Tw<3E-=@PFPL z|9l;HcWLwU{^;N~Fi`!eUPAQvvyM2msK%N{ozJfN>SxvC;)~nRS}Rerwb(kNlHRsj zxkmG8)tSfQ`fD~?{q$$c+(UM16~m|37fJlpVe!!ILGQ6Dr%HVMxT@yoDUEpZca8Lm zvonM5%X>v99Vwx1Ew>o$??*-4es@1sb$I+-ZkFA|pIHjh>CdTD~1{99~ROHG{+*82b2_H14uL1<}b>Bh96OfIu#NLmCw%0XWYcaKG z$h0Thc~R;+HSXViuyd)ngvZDy%j^7}i*` z?RQxJctP2LKNQEnRO)6-@a*Lg^`bPVn7D_bRV@QS72Mr`&7|$Km6Y}28om!2tz4xe z&Twc0lsE?!`P+Uo4e-4a7nX)}MQ)G1z;I4tL_OxJSE zhB@~m<}$#O#vd!_ZYa{waSR;U25Jh{({o(TlM|HwyQH}^oLX;jMz0R_tx_BN<4pUO zCk%sXJn?SGN%N`4_)2^O5|^onD`Hrrm=L`AuV_q--0YE&?8T@m4-ZA+q7%_r69qXh z>4#80L{g^TuF{YGM_f-x+zs%?iPd>Nh*Da={qLHKn*G_a-j_-)A@4@C&g?t6ksdyt zS2dAX4Y(6Y4(I2DzAgE}W)eYx=m(?kdgE#ua)D8fj~5gPLYBKY>`+p6r((GFs(5BP zqe9ouC@PN0gFGM`DD8qg?H_fS0 zK#U1qQNSF~JT0l7#-G$i1k!x%jYd^&5?5}9X1Q^A ztgO+EgmQ!mJYpgyq@u@=z6V4jh|`aLf}@5gYDI@yFf#toPMZFlDFTHWRiC=cma`Vn z0b99>OXg|&1bTJq&>w~tzUZlnBDAEH)R5v2=C!DR4@AcU5L!{d0yCf^`o9_m0fow> z)unzHc3f4AZbQO7Um}o6@@vLNJGF!dUPvW-L&nRQ>JEZU@&gV_r;UQuk$^wxr z0HB0=4(+2QU-N7Wz|XJk?qP>=v^M$Uy2xxZV?GqcWTq3awISdSkZGk6x4vT|n1*@s zzd4C+eV~BB=GHUYRYl5S%PE4(6@pt#O@(3thUb{!?E)s}WgJy1icsm|aF&V+EWZ{$ zq(s*92eeRHEzi(PcBDjtxeHcg;Y@L| zsFB2_b-s3$I>Z}m`r7Aj#V}V3#G~^0Xl;t9>V$-a{K*$04zix0g%#>5l)$D;ei~DCN1AGMu70*FCvl6X9EW!~Z*M6Z! z(=lS}(-i21eg%2ry1c{=Ec;qwgkuF6mrEoSxcL}y6Z&o;KNaYbz!@-`zHi-=i0hCd z%d4{4+)P?P0-`Hg>=pYR{jPV=H40z-rtcTHR#%`gBDGASBOG9zA|)Qh__P3l4kozc z@Gi%6;AKBK%62yW&s$-y+en}S`_AUFeGuRICH@4+^%g5+XE2shC96GOA}Y=&$T>`W zY@s|*GbPlY6e24VY5zTc!6hWa0fv!$92L|INC=R#>KZzr;0z#eFi(77)No!zLB*1< zUT6UAf6msl^Ghp3DrkrCiSj{OZSPR1wT5M>&j zOJhB9x8y5#pXDrFKOrGMO+Wc(6ss^)&r*6h)_SpHdxpkYe43Q&r=yFnM%o5Fad3Tm znZ73S8K? zJ#vA60}8w#)I|K1qQ!;;hV#d|5^te1!6K(d_sd-#ORP~5+*?<2g(iu2$VRZMlOLhk zttGAVGXc{d&GL$`#CRDR_lP2tdpaB@y(j#`@aur%L*Vi}M~kC)1bVXwk1ix1n_E^b znATx1bq1&XslNpQ!Q{Y&3>DQh{qE4DWd)&)3xAk8z)Ij!CHwNfsD!;r>LNRRbAy=D z>{K{gyK?D$p!vcQ*_KT7St3n_$GlvXmN_-e0) zgRc2z&Tyodl?sXm!uqi$AiYaEQ7INhsQCh%g{Tw-nV?cjC3)XrTahw}SCxS@Q9^r? z?n>0TF}8x|^#Qm8nx3?f=wNH5TJ`+?ye5=SA~7I{l9`pJv|ZrqFA+X8J?Lc-uDp%-oL*@ZMYA7CV*rc|cSaetCBrL9MHU_7`?nR?`AKcQY|v*}xEYRs@G2XoPRg>BnD#tX5ZfaQ7cW z%qH*ySG>a)sjZ7V(4G2dajZPB3H01Pc@0$GmnJ742)y$fq}LL%ya!id>6mm{&F)x&K5YfQd@^Q?M2v9v&09j^udpDmzPY(lBcX5e zTo3X)KMu{^pVYipf%a3#q4R=P560Oo;W>z2OXj0By3Ko8(wIB;#iyX7`6B_tW6bc1 zn=TB68T>sjOk_|rf_z0l>RKWNB@j?Y+v*gE3kD@qJ4#YVyB7;q1%gog<&@nGuJNU- zItJD`_o*D<7l<}7x+0m4qjGOA;{#9*lcJ9V4TBs!OXG4M^xYmp_~15p`F&S5*RBE# zTDnZ|(3z-5cJ961mkEkKsY` zI5J}G5h#$W*asg)dZ_jfN#}hqX5j(^+?lmzR@0E)kWC!NDWfEk5il~9Da4cMOs5`Y zZ{KY?MsIDM#RCo5SDo`6upik{P21-LqkG**I`_Z$+gY+^R>*Wjj+d0>C((fk(r#UW z5p6j+oq=WayL^-&Xw35+&>(TVyGcs z4~vHXVN5{0llWPgMEhh>Q|-0n_nn+uBU5akeHcXQ7k|J)HT9TtHY8DjI=ndmB6OPd zQ9N;h>^l20KK#gCgZ+%60ULU8)&nuYerM zu$4HFN?venYEq%|H}d=UpR{)$M`mxPbFTsAe;y|gBU2E-5mk<^`0vh+;3BC;taw`d|4l{}iTw9m4+K z4>EV_Svla2AbsQ+FcEmbIj%e*L4o|}G=ZoQ< zPX)A^cQyW65>`uhsGf(_e>uI?dl)!f)UKQQY;dn$wrN`X{ILGmKQySm8$Vq?Z2K;N?WQ$$|hrOJ%o^jrMp&~ zp(H*u0rj}5Iw4O8*RQj@7##s1PX9^}!BU1&U0V)W!O%NNGt)1U)OgLJ3xA?&)?VLI zQ716mrd6wZM?&fQq$YdGfD{PJk8WB278_~W@z^LRfzwnOkJ*8RL??`w1%fvOVpp;T z%Y_Q1!BQ|-vki`1tE3gRf1qONhOObVtYHB}pB#v0Is>FuQ}Y3)TDR=|pdy(3v8fk9 zO29}uD`N*v2z?a+f|V&WgcO2qS>8r9BNYo30zsJ+iDY=LVyXMaK>+0J0C-+0br;8- zZ8cFatfsO`F;&Js-n8-RJ{2!1!czycG$N-#+Ch$6j>|rs9$fVo$TK0t1m!8IZut=W;%3P ze0~_X{Cu5OqkXn$9`(vXpO4)oQuH_e*8XcgrDD85o@wneQ7D93A@tOl&M)%Y+L2cl zB$6Af2CPiHY*}wA<@p^6uy$0k+dU#h^qX%K!R!tBD4Aa#{VY~$vZSeaR%L77vi<=M zAN#T5;oAB>#Do2XuwPp)ZioN*S;M42fOltvJc1v=^aX1~Db|QuMRkp&Q+&md7tWi_J4wXk}G3&RIEyzG{WuW2ecygNWZ!taEio=rc)W&ePWI|R{Vn#Uge z5(c1%LsAbr@$f6^a2FhdKhyZLZE zakd`1OKcub?`eExJhlFCP?wpo05+i8I0c0;1S0TzG`Sfy;SAZ&oLh5h!FV|c7~$45 z$DmnHY(z!2Z-IbV*pz2PKYI|}e(+=DTsf{NQT2i|zbr_Zdq7CXpg9q@bs#9BI?vd~ z`Unu%%#iSHxOM=}s^HEa-s=F`%vrbY93jR-1S?+lNbM73z11_dC%i?nR+w3(5N(04 z6Fb$4j7ET3VOJ*x8=)qR41l3qFx8Nkl6qwg-}H}3#d4>PTK@>#WlE@c&* z%sO}?2CO%e44MH29RE*P8ki{hN7IYz9`pGe9r&AQw8rj4Ah?4u?pN}W=vDo{hsT5p zd3d`}`f=AQZnynmqGq$+F`feox8|yEGPonyNx29 zc4WQZW12%@2m|EmiG}!j$0uwiCGa?|K(C@RFoF1b2V+<>JHGuusJEzVU`^a46Z`Tk zF_jWNI`V!Yw?p*BwRF`i!M=^0zXbIQ@#rnYLv9YNM-6=giOgge{YeD}JR9SMvT;re z48O+kjwj9`2)zN}*A{20WC;X!v4*&uq?5580uJjJMl_*aTJ$NcecZfi3r|w3$FF|o z#dlb{PIa<;Nx8wG5am^$rL{i-4%;w*IwJzkHz*u3cmDT12hQ`s^^Rdd4y0mvNS|gP z7=$aH9vC?{l%e8*glkunbKk9g&|gl2I1&4JP+v-c(08-|7&DZb=hTY8;i@k1b|~|s z+>`iu*J`tNXGrRknOE@l2UbY?eoGFv>=0-iOP)N-FYrVmP+rNQWX}SL{VvMlpF^P5 zp3I(z%B_*OvEY`Tf=f(-gTl`LQ6n_hmunFJat)P1d8bOc$fLl_mVuBPcu!3UPHqU+ zxSyBX_3gt?wXEJH6eiFSh8a<02f_|o3jqP#tDhG?!nr3c_rJUvjGtkitpn2Tn$*#` zJm=Z7yhCP-?v2aH{c6~X<&(3&f6?q>evTCVL=-Qdapqcj-FMhnFv}K&rP<*GJwt*mZGSOMi6T~I(xBLLt-O@KPClN%yo zK@S3Kk+48#!t(W5md+c5AiqgMoKJo>@F1C~?ns})3P;w#9oo7Y!Bm|PO#}*$t}_cW zenshnXpI1&%RmeL{WqIQ`&^OPVqKy_vksZa0JrtV=?7b@l2xc9fg^JO zm;Q!%p3K7w)duHSW?dwwuCp#PZa=~9WSS|-6sSvL(O8d?=2DE>G_{`dWiI|6vo_U% zx%_?b^b^}W{0%`P;Re$Z)`K1h@2MKwJXJtotGG!tnLHtLJt(s_GcQ2^JC@aA0-OYY zEj7qga&@*>gi#-8+r-)h|Cs=`OY!GD12NeK7Wqbd&>!rv0RdUt+_fylA$`fq9h8Qf ztc#WQne%VrId-kP1XM%f*6w|6{S~!}*HV~+d>*k5i!!t&R_;+gQ1hr)68N_-k@0Jg z=N&Jnejx4rX3oU}guGlYFGq$QTt)Dc9`#7&_Xi={lmfA zxwndpQwm2=8(MwSY|I#p$9o7ue1xDVBo8v$0y`aP63elR>gIKs1Wu^~U*%9Nf3r-z ziLycOkh#p#V&}OTKXwRNqEgUhaWb09*s{%F(mCi@eR;qsf-YR3HSpYAY2G4k`3~ak z1&l$36nVmlY}tfN1Oqf@il=u>&TS0FVwYc2tXUAVKqZRF2~wSvLF$(&!pT3`BFS{ z$eNc)Z-(gcF+w8Xjz$a&loXU*HXebWD)c^uEV;h{2#$7?8-kO@4ofrT892U8sjL=N zj01*LySNcKYC%vVI+PvCf%qHtLeFjpJlmSEKkn8&9>;eepx5ld4zYu0rVY%hHPHQ4 zkz#Z`g$sRkQ*lXnY+#k@H#NECT8=zy|TT zni}JP)wO>5x&zLml%7w4?FHJHFU1qi%iTc}>hWE(X01TJ9tuu*mkgij?s-p0JYbZ| z=wx@S7qmHzc#9Lcpbu0_0^xg221nZS-&FvLzag7JsS?kiiBsLrZDLBM1U(E=|5_~2 zVf$X7C59@gn)`L4byROAZOx#Ib6e7le+`az-PQ;asTE;;QfNhX;XIbB_Sw8G83V(q zKqW6Kx3Be^Ul#ijem<>@Lj*esPq>Mj)o{kD>(dRpq&;TNx4cu(*3p(oSEoN$Y-PNY z7%t0@c|xpnlaW)-tp}077$6<UesGnOL99OH1Eiepq z12Nm#<*dCg_MTIgo7~{2q49yGXF7VvGozP8E)-jOVfWQZ(*Fe^Ql# za~-CQ&T^@s9r`G4ecN_*?00`g#Cdu(Fd2`?+9%{Tk^M$j1wt{w2&bClv}7Y;Gh9_Q z`mWZPY1Azw6W&B70aIWOG#~!!M63x)Y`qA}64!JHwuj3?I#MoBlB5+U?EKQX6%47} zjV(XMeR!Mf`>4oQGDsYwK?_O`PuX!1NT4=6@eMb?OhGvKFZ%tFlJ-{M3GcVjX8Tk# zT zM(SMSJW4amrH?w3TulxS>K6FqouxFet#S3PF2$2BM+tJ!ZN2;nDe>tA3gEm~(}8Nf z7y7KUj|V~;AGL>ah25+iN$x_~1F1aX#q#21#p>~SNV;sg<&4yQ=(>GeaCIH8ukrhX zqBmtiBAX+sz-rd%qc@R>YFL9K_+=>Mp@;UHPBWTK5hrXy^qaR{BVBJd&KLV0F@^rf z#Ez%nvDOX$Nni2iC%Ao)Z;#La7dYT^xL^r{^Jch8AdKPjGe_f!pjawxwRZuCc}-)4 zL4HR=lv4@((x6i@+=!f@XV2#=!$7seAE2Xmgu)Wt&i_GO|0gi+3kdh0e7=8S>;4-D zlI`E1af)9EI}rza7YAD-mw$0eHLUD~>|LzH>`fd@t?VuS29^DbxkkwJ4;tl{e0O$n z6|ppOCS+x2kTv>`>wjlI{*9IWH}>P-KmI4y>_4CPU&a4jo4k>o8N(OS?cbj7f2X=} zu(B}xRf?It>lfyajpM&iJO8@%FKQsMlp zzbYVP=ingxD*C^Z-2TS={acg&hM@kl$^TpcVP*TjcIHcU-yHV8BH%whVTc5@#A>hQ zs-Qpy>pSr~JTB~_(bH+r*H%_v>CZ~M?xQ}hMhZoBl1`9@^bAo}cP+!WCwy5-@PBJ4 zFsyf;K9Y6*;QZxRKhBAXclA}95o6{YACGqU(BfL?rAV2<+dgWlsG@<~G&Dbc z)j2ecy$Wy@Wsz5urD$*JEglr$!Sf9iaM(4pKwy9T!}EOI^k#^Vw~_yF0MBpx(PqO@$8{wWPe_SU zHfYC>lNVYb4Mk$F*~f}3&TdYqzOr$>D2-HDcP_!6twOxm^+E%NruChSt}>|4l^)PL z2Mv&{gXvE)WXcyL)fQBah#Zs#NwifYrb3Alb!Qv7g(Ca9K^K+_WmtW9?)>Wj9AkX( zFy#)`nM~sn#~6JW?+2$Nq%+xOkf#2k@TO4*HLzL zslas6CkmYnRV!_J3!m#$gJ&_7@01LVW5-zpd|H0c{^E zks8rq<<1~UD1~UGV$sZ=Yv@c^SCwB0ST$cYXXQ^UXE~U&w@5U0DUm!U{r0;qzwPfo zNZ$EIG#+=hKH3Nh@Zb0TbcuhY3ZKL_79HUEm~8%anHYT5+L6{qj~haQtul&L)l(pa zB1>ek-iP{1n#Z6}k0Wc62~w#HUQ9vQ?W6?%fxf`M?)<_Jt4*Jc9Xw5nD%C!xNexH| zPq$H-VFvd~6O9%}kItX!%3rT+;bWC~+*vF&oDa3zMEn+;lBOxSKJK_7BdE4SH;!hc zI~}QX!0fGb;1v<2(v55|*RI|Ae$`o2m=;OKw$46Fb+v+W@qxN!mqmQyPjHg0ZKPgb zcR5oQS?WkhRtB)RI*!-ZF9lfcpSSkMH?=bd%ZQvPD@&QXL{gJLG2Nxwsio0B*}!Db zL7%>o4x^O;0(f>|aN|gSrIt{-X%Mu|SSR(g&75NF=4Y!dC;txRQNVE{vQM)~-vI3;oiHYtGl)sFVII|?*#@MEvo}+ zut$h^E9vYwNsl3LVIQDT=aez}2(Nb+8S3mmvS51r9`COYBF>9A%zwyB8Il=Uke^R@ z&w~chhPk!V!_p=5ru0V&Mot`+ro8zV*`BDZ9O=#3*H(EIlrnJRiOu2D5fz*af;o^o zRO!*5g1EMg$>AB-8BGE#k)__+lu^4lUhFx{%xGctp*oO*=~`>oJ z)OZ#Z^-0@e+V(AbGJTtO6oCCq)`6tSvn|eGcYtwyGK0J2DEqm~?jNT#=Ijjn^4fJ< z(%dI3LD8}%E$X_L*#jSbx%-L^>^SfGPnu^*n!h>IOIeu?rd3E9sRF0t9#e_F;cpm3 zX00lGhctWat15WhU_W6t@c}a1Pn-#!KYuKK!&b+fGX?Z27Q9@t1hm#8l$~|AZ@S!v z<*q`8<=J(>*!i{E`3o9h(4*XYhx)_fG~8{`XaJ0Di3@sq%&HsATdPNI=_cxKPL0?= zfmf6r_$)@M^L`8W@Cc4Zg~pZkOrKN4zsV+b&;C`Y5C6Vm{WwX!(hm@>0~VaAi0tuwX{r8XN~` zy28V|10q;sZ7)owUXt zr`BcNa!Z8VNTJIm2niA)SAKN`uF}>k757>q3WUd>A~xMYO9%U(O=3u447!sf7c4NG z}N5Ci!ikGHk5!}3SNXT(YA;>{9P*;yH z6OA?p^SLU61?rFMJ)erj(mw?huxbiQ^;lJQ_k7A#4d{w`7E#>eMfCc>3yfzS)8&`nsLHSSET z?W^$m5w%R2P;pN}+NC7&ckN1^*R{`%r4kS=&bg^0E#F{P64=|SH>b+lWxVf`vSBzz zoWd2)Gzz`L2anoeJVf~eyUd%9NJ6x|@cW@9ugQKVpMLo9hkb~BD|R$MwF2|d!jGF3 zY>aW%HM)WsB=c#8PY_g)kZnxJjL7zkyUpmw{|Z>gPJ#**|KViU``e65ccnq7)|6uJ zhbG^ah`+{6moV-2;V@gh0>P{$d|Rc{lHxF)GM-Hl3;zZ1)jRv6z-v}Mw`1BivnXzRu{LXpyjhx|=a#4)nhx-xpAMj87{4QPQ zHDx9t@L2eP7Pr;Nql>U{mmu&~El!1|yp*2GcXP2cdtaSg62II~&c@OjnUM8&OCyQ- zh5K>XNdKzLAs$u*(5Q!WAsgR>jk73iGq#)7|M@v@58JZtcGkn>#v?!76CvS1v2@(C z`Q1#F(Q>adO^kxK!>LW9n;{kN*jT(p`4f}-$4l&jN1UTDW!lH_)Ii zPGPaNw+12oN3mNol%uH}0UH9x4fc_L_fQ$qKe~GmqJwJ$D`Y($(wdvOBK3Vqv=$WB zy^XHz>Xq>4PljYX zi^EAl3WMyI6(?bac~4bAYzSQVxK9NiW7ES<8FnrMr`smui)|hOoZ=kT;S&X-eYxg( zEXG!w1w3p%i}cR%j?q|)#P0p^JbT#!Q}{GL@V-eC*;?cus<6NGyAQ0cYP_VRC7+`8 z1mWTR+~3sQVRltM=;}#-U(S*Ca5R^x$n(8Ca8Z9+v`^2G@?qy!vM@LRZF|FVRk5^e z6#gPMU7K!hRKe7-X&6=z6SHwH(b)k9m3?H0XQD3wm-d6_IM&kP zVbpoDJlSI~Q;^=}Z^!J_M|dYO;=6~H6j1DVDRhSL;1hF$iwRftRd`sGIs5~fvhZX!nR)k{OKqb19yT)J$50Kr0`>;)oAQZsNgKFhgI z)gxkO(eyQ>$TQ`yar%1S8lOS$HoClq&RP>kvba)nr@s-a{*?Vz!Dgu^^7! z^?7&UWGSAIqFL~STc+?C6*9+6CcuMSLDn!10g=B$>jY6L2G3UJjWr~|C}RIIS2*Vh zv%$2%jA}xY;kPaQqAUl*>c*6&@dD{M_Qk^RsyWLkKA^*E%orWtf5P%|eSmm9Ep(a@6mO)})6~yRW&D zc!xJvqSD@+b^eY|gRUwB>cyldM8=*Y5+f;>F8jjtwmDW$q1c_)d9ruY1uX<-#lzpj zaD6er$)v96_P^Qd2n4N+MamuIDAxz6Zxt2zYtiN3OG^&IVafz7xJAT!r_`Tr~JzY`h!cNzD0 z+L8Yg$h|TAS9(OD=XpIvC7!pbUN*;ixtJev*5J^mV8deEJkfSqsRyc7vwyZS$-IcK z(#E^FK>2S-=`9{JGc7F4rShgP@$0tj=?S8LPfuGQAY_jlv})8(Gw^SIy87R|T|B;L zPj;SVPYyhkXWwb$2ly8l__b{6+Fj{)Q67zp-P8-G1b?c9QPPg~t2O>uN8b)m+CaUF z5$4u_q0DhFT^JftbLt5%qNd+Mucu%rw`P7DSy0fIyD+_Z;+W5;|J1Ibk9Lr#uj)

!-cz@q#CBnum0tPaB5{sc&9jla%=cSS{ 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%0DS_)43Tp7oRfGV;%q_8u)!q5ea_`%&qbf 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%0Dq{Zj0tGPvc6k{^eN0IVHsT zk6w(}^mi_+h7++T$&>1@9k8ZlFp^1!i${C<=3_RM!~iywlcjX$cP*ZGOiyqMWaH0g-M3qSX)3PS0* z63O=iA8+0>?V`j$Pqbct_P;)Y+dIo1B{;iTG8KwpBb4aOtaK?-!!NU-M!yfSzdNR6 zxZM9WF(seV$n1N5NUvEUrFY?mSHb+SWCe;Bq6j{rT*T8COpi~<`OM5pRM%@Y_X>{$+NZqF7H$`P2&+9XTx~QaW`FlaUvxs`&)v6QA5<1}M zzOQmH{SjK>C0|jVOzxpt!MTXZ?{vR{vYw&P4-oPhedmR5rsPsvN&cB#^GcU-G0&aW%Z@p>1yB44}*Cn6;WfTF-x0}r2t2DbVZ>E$h zV(Rc`B~NgPxn1xcJm1&}vaYERDHqU0PJkv7JoQf!6m#6h@wUh!*-VnEfL8%(EZb6i z)Kh=W3Y7jAg@ISFuw0}+47MNkB*3d&7rgqX{)rzi*w*s(55|yT-dK!puaC5#gjRAt zWkVGJ^u?TTc^>b+DCcY>W2!KA+VBxS#XL6UOGE{}#RfApE)f8h3_cq&GmTB|^E9I0 z9&h=R;O-Z9_eC=HG+@3m6nvPNE^#K{*zV4NP5GgZn9;gbXfh~&%O+kxde;Nn(Ubh( z(+?@ZHI8UX_$XdkKB=2Bl;!7;@Rd=QR>!+J$`c<*p zp*6SDw^1B#b(x96!0bxTRN+_eL7efk4wnQtt6G&_LwJ)5#?o$u7Ht1i$bIE#)_Zmc z5!vcn!fRpqUl3kS8C4~u;J98%eh|0O@RmnutcZet85Yp>-c5-`XQBMfaa>c(4TUD{ z#+dTyB9-{ljs^ll#l=+>Fh?pQ0Zy007jT5x?;lsdWB&HlKH*`4+EsaRfpP6Ksca2l zdvE89=Cgth)3oD!yM*7l*J0#ah?kNkz_8i;XRyTkK+MeB!7ssQ$4@vqNUR_K%k|}d zn$pC?@qe`r|KlJ8&Yt~GrK1O^=;g&5STHDoK{lq`uMrwlA%x%<*XFH}W}7L?1gyQwdK zuDq|0=ab8ioBhkTx4X510RO^{K7nrz@`MIICK1)LK6uf(3ImAIvLLg%h*}aVF5ViN z-!2@pq)wedvz8b#czSw&&f-moxO?U3UG{C%=-q7ZT%n6~eBRX1xp-<6()%AmoJLIG7oXjcD*K1;VZLheU*wCT>e6mlhSJ$G>h z{?WbBvz-J$;^JD^LqnXk`upo|1rnE~;5!=P4x+|~e25GFyLgBV@cy|M8RCPxg~a*( zuo3a~yhZ3g5CL_~TG~nrDJ-GgS

9Kd@6KJA`!JrV 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 ?yPnB*CE<^Ri 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

S?`ai#j7r4n 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 literal 0 HcmV?d00001 diff --git a/client/项目进度.txt b/client/项目进度.txt new file mode 100644 index 0000000..61e1da3 --- /dev/null +++ b/client/项目进度.txt @@ -0,0 +1,538 @@ +软件自动升级与版本控制系统——项目进度 +更新时间:2026-07-01 +依据:《软件自动升级与版本控制系统开发设计文档 v0.1》及当前 server/client 源码 + +============================================================ +一、项目进度概述 +============================================================ + +目前项目已经完成一套可实际运行的 Windows 在线自动更新主链路。 + +客户端已经具备 Launcher、Updater、MainApp、Bootstrap 四个程序;服务端已经具备 FastAPI、SQLite、MinIO、版本发布、Manifest、下载授权、升级结果上报、版本策略管理和管理网页。客户端可以检查版本、验证 RSA 签名、差异下载、断点续传、备份旧文件、通过 Bootstrap 替换被占用文件、删除废弃文件、启动新版本并等待健康确认;失败时可以进入自动回滚流程。 + +目前 1.1.3 的正常升级流程已经实际运行成功,说明在线更新的成功路径已经基本打通。 + +按需求文档的 Demo 里程碑判断: + +1. 第一阶段“基础框架”:基本完成。 +2. 第二阶段“服务端基础能力”:基本完成。 +3. 第三阶段“在线更新”:基本完成,正常升级已实测。 +4. 第四阶段“版本策略”:大部分完成。 +5. 第五阶段“离线能力”:完成离线运行基础,离线更新包尚未实现。 +6. 第六阶段“可靠性与安全”:完成事务、回滚、策略防回退和时间检测;插件白名单、限流、完整日志等尚未实现。 + +如果只计算“在线更新 Demo”,当前完成度约为 80%。 +如果按照整份设计文档计算,当前完成度约为 60%~65%。 + +当前最主要的剩余工作不是普通在线更新,而是进一步补齐安全准入和管理能力,包括:一次性启动票据、MainApp 启动时核心文件完整性检查、设备身份、插件白名单、下载与审计日志、动态渠道、限流、离线更新包等。 + +============================================================ +二、已经实现的功能 +============================================================ + +2.1 客户端基础框架 + +已实现: + +1. Launcher.exe。 +2. Updater.exe。 +3. MainApp.exe。 +4. 独立原生 Bootstrap.exe。 +5. Qt 图形提示和更新进度界面。 +6. MainApp 显示当前版本。 +7. MainApp 显示 Demo DLL 的简化 Hash 标识。 +8. Launcher 启动 MainApp。 +9. 直接双击 MainApp 时拒绝运行。 +10. Windows x64 CMake 工程。 +11. Qt 5.15、MSVC、OpenSSL 构建配置。 + +说明:MainApp 当前读取 Demo DLL 内容并显示 Hash 标识,但还没有通过 QLibrary 真正加载并调用插件接口,因此“插件实际加载”只算部分完成。 + +2.2 本地 JSON 配置 + +已实现: + +1. 使用 config/app_config.json 保存客户端配置。 +2. 支持旧 client.ini 自动迁移。 +3. 保存 API 地址、App ID、当前版本、渠道、设备 ID、客户端 Token、启动 Token、平台和架构。 +4. 更新成功后写入 current_version。 +5. 使用 QSaveFile 原子写入主要配置。 +6. 运行时配置不进入发布包。 +7. 已配置项目 .gitignore。 + +2.3 服务端基础能力 + +已实现: + +1. FastAPI HTTP 服务。 +2. SQLite 数据库。 +3. MinIO 对象存储。 +4. 应用创建与查询。 +5. 版本发布、查询、设置最新和删除。 +6. stable、preview、dev 三个固定渠道。 +7. 删除版本时同步删除 MinIO 文件。 +8. 发布失败时清理 MinIO 和本地回退目录中的半成品。 +9. 大文件上传前检查磁盘空间。 +10. multipart 临时文件存放到 /dev/shm,避免与 MinIO 双重占用根分区。 +11. MinIO 不可用时支持本地存储回退。 +12. 管理员 Token 鉴权和令牌修改。 +13. 管理页面和跨域配置。 + +当前主要接口: + +1. /api/v1/update/check +2. /api/v1/update/manifest +3. /api/v1/update/download-url +4. /api/v1/update/report +5. /admin/publish +6. /admin/version/list +7. /admin/version/set-latest +8. /admin/version/delete +9. /admin/policy +10. /admin/policy/save +11. /admin/report/list + +2.4 软件根目录和多层目录发布 + +已实现: + +1. 浏览器一次选择软件根目录。 +2. 保留所有文件的相对路径。 +3. 支持多层 DLL、插件和资源目录。 +4. 服务端阻止绝对路径、..、盘符路径和重复路径。 +5. Manifest、MinIO 和客户端安装过程都保留相对路径。 +6. 检查 MainApp.exe 是否位于发布根级。 +7. 排除 Bootstrap、运行时配置、状态文件、策略缓存、PDB、ILK 和更新临时目录。 + +2.5 Manifest + +已实现: + +1. 服务端动态生成全量 Manifest。 +2. 包含 App ID、版本、渠道、平台、架构、Manifest 序列和创建时间。 +3. 包含文件相对路径、大小、SHA-256 和 executable 标记。 +4. 使用稳定 JSON 序列化。 +5. 使用 RSA-2048/SHA-256 签名。 +6. 客户端使用内置公钥验签。 +7. 签名失败时拒绝安装。 +8. Manifest 本地缓存。 +9. 新旧 Manifest 对比。 +10. 根据新旧 Manifest 差集删除废弃文件。 + +2.6 在线升级完整流程 + +已实现流程: + +1. Launcher 请求更新检查。 +2. 服务端返回目标版本和签名策略。 +3. Launcher 验证版本策略 RSA 签名。 +4. Launcher 根据策略决定升级、降级、继续运行或禁止运行。 +5. 启动 Updater。 +6. Updater 获取并验证 Manifest。 +7. 获取 MinIO 预签名下载地址。 +8. 比较本地文件 SHA-256。 +9. 只下载新增或变化的文件。 +10. 校验文件大小和 SHA-256。 +11. 备份旧文件。 +12. Updater 退出并移交 Bootstrap。 +13. Bootstrap 替换文件或删除废弃文件。 +14. Bootstrap 重新启动 Updater 续办事务。 +15. Updater 完整校验安装结果。 +16. 保存新版本号。 +17. 启动 MainApp 并等待健康确认。 +18. 健康确认成功后提交事务。 +19. 上报升级成功结果。 + +2.7 差异下载、断点续传和下载体验 + +已实现: + +1. SHA 相同的文件跳过下载。 +2. HTTP Range 断点续传。 +3. 使用 update/download_cache/.part 保存片段。 +4. Updater 重启后仍可继续未完成文件。 +5. 单文件最多自动重试四次。 +6. 使用递增等待时间重试。 +7. 服务端不支持 Range 时安全地完整重下。 +8. 下载后验证大小和 SHA-256。 +9. 显示当前文件、已下载量、总下载量、速度和总进度。 +10. 清理不属于当前 Manifest 的旧片段。 + +2.8 客户端磁盘空间预检 + +下载前会计算: + +1. 尚未下载的字节数。 +2. 已存在的断点片段大小。 +3. 被覆盖文件需要的备份空间。 +4. 废弃文件需要的备份空间。 +5. 至少 128MB 的安全余量。 + +空间不足时会在开始下载前阻止更新,并显示所需空间和当前可用空间。 + +2.9 升级事务状态机 + +已实现 update/upgrade_state.json,包含: + +1. transaction_id。 +2. from_version。 +3. to_version。 +4. status。 +5. manifest_id。 +6. staging_dir。 +7. backup_dir。 +8. changed_paths。 +9. obsolete_paths。 +10. error_code 和 message。 + +已经实现的主要状态: + +prepared、verified、waiting_mainapp_exit、backed_up、awaiting_bootstrap、replacing、replaced、post_verify、rollback_required、rolling_back、rolled_back、committed、failed。 + +Updater 启动时会读取旧事务,并根据状态尝试恢复或回滚。 + +2.10 Bootstrap 自更新机制 + +已实现: + +1. Bootstrap 不依赖 Qt。 +2. Updater 退出后由 Bootstrap 接管安装。 +3. 可以替换 Updater.exe、Launcher.exe、MainApp.exe、Qt DLL、OpenSSL DLL、Qt 插件和业务文件。 +4. 完成后重新启动 Updater 续办事务。 +5. 回滚也由 Bootstrap 执行,避免运行中的 Updater 锁住自己。 +6. Bootstrap 自身属于不可由普通更新事务替换的根组件。 +7. 旧 Manifest 即使包含 Bootstrap,也会由客户端作为受保护文件忽略。 + +2.11 自动回滚和健康检查 + +已实现: + +1. 安装前备份旧文件。 +2. 替换失败时回滚。 +3. 安装后 Hash 校验失败时回滚。 +4. MainApp 无法启动时回滚。 +5. MainApp 15 秒内未写入健康标记时回滚。 +6. 版本状态保存失败时回滚。 +7. 回滚后恢复旧版本号。 +8. 回滚后重新启动旧 MainApp。 +9. 被删除的废弃文件也会在回滚时恢复。 +10. Updater 自身发生变化时由 Bootstrap 执行回滚。 + +2.12 版本运行策略 + +已实现: + +1. version_policies 数据表。 +2. 每个应用和渠道分别保存策略。 +3. 每次修改自动递增 policy_seq。 +4. RSA 签名策略在线下发。 +5. Launcher 验证策略签名。 +6. 签名失败时拒绝使用。 +7. 策略原子缓存到本地。 +8. policy_seq 防回滚。 +9. 强制升级。 +10. 禁用指定版本。 +11. 最低支持版本。 +12. 允许或禁止降级。 +13. 允许或禁止离线启动。 +14. 策略有效期。 +15. 自定义客户端提示。 +16. 管理页面策略编辑区。 +17. 上次在线验证时间和系统时间回拨检测。 + +2.13 受控降级和用户选择 + +已实现: + +1. 管理员可以将历史版本设置为渠道最新。 +2. 允许降级时服务端返回 rollback_allowed。 +3. 禁止降级时返回 rollback_denied。 +4. 用户可以选择是否执行降级。 +5. 用户拒绝降级后继续运行当前版本。 +6. 普通可选升级也允许用户选择稍后更新。 +7. 强制升级不能跳过。 +8. 降级复用完整事务、Bootstrap、校验、健康确认和失败回滚机制。 + +2.14 离线运行基础 + +已实现: + +1. 在线策略本地缓存。 +2. 本地策略 RSA 验签。 +3. offline_allowed。 +4. valid_until。 +5. 策略过期时拒绝启动。 +6. policy_seq 防回滚。 +7. 记录上次成功启动时间。 +8. 记录上次在线验证时间。 +9. 检测系统时间是否回拨。 + +说明:目前实现的是“离线运行”,不是“离线升级”。 + +2.15 管理页面 + +已实现: + +1. 管理员令牌输入、隐藏、显示和保存。 +2. 修改管理员令牌。 +3. 创建和选择应用。 +4. 选择软件根目录发布。 +5. stable、preview、dev 渠道选择。 +6. 版本列表。 +7. 设置最新版本。 +8. 删除版本和云端文件。 +9. 版本策略读取和保存。 +10. 升级日志。 +11. 调试输出。 +12. 发布文件预览、大小和状态提示。 +13. 页面美化和响应式布局。 + +============================================================ +三、部分实现的功能 +============================================================ + +3.1 启动票据 + +当前实现:Launcher 或 Updater 通过 --launcher-token 参数启动 MainApp,直接双击 MainApp 会被拒绝。 + +与需求差距: + +1. 不是临时 ticket 文件。 +2. 没有 app_id、client_id、device_id、version、nonce、issued_at、expires_at。 +3. 没有一次性使用后删除。 +4. 没有防重放。 +5. 使用的是配置中的长期固定 Token。 + +结论:只能防止普通用户直接双击,不能算完整安全启动票据。 + +3.2 MainApp 启动完整性检查 + +当前 MainApp 会检查启动 Token、版本策略签名、策略有效期、policy_seq 和时间回拨。 + +尚缺少: + +1. 启动时重新验证当前 Manifest。 +2. 核心 EXE/DLL 全量 Hash。 +3. 检测受控目录中未被 Manifest 声明的额外 EXE/DLL。 +4. 插件白名单。 +5. MainApp 自身 Hash 验证。 + +因此需求中的“手动篡改 DLL 后启动失败”目前不能保证通过。 + +3.3 回滚完整性 + +文件恢复和版本号恢复已经实现,但仍缺少: + +1. 回滚完成后加载旧 Manifest 并进行完整 Hash 校验。 +2. 更详细的逐文件回滚错误。 +3. 回滚失败后的修复安装入口。 +4. 完整断电、杀进程、文件占用测试。 + +3.4 Manifest 安全字段 + +RSA 签名已经实现,但仍缺少: + +1. signature_alg 字段。 +2. key_id 字段。 +3. 当前和上一公钥同时内置。 +4. 公钥轮换流程。 +5. 密钥吊销机制。 + +3.5 升级日志 + +当前只记录 device_id、旧版本、新版本、success/fail 和时间。 + +尚缺少: + +1. app_id 和 channel。 +2. transaction_id。 +3. error_code。 +4. 失败阶段和失败文件。 +5. 下载字节数和耗时。 +6. 回滚结果。 +7. 操作系统、架构和客户端 IP。 + +3.6 REST API 契约 + +当前更新检查主要接收 app_id、current_version 和 channel。 + +需求文档中的以下字段尚未进入完整闭环: + +1. client_id。 +2. device_id。 +3. license_id。 +4. platform。 +5. arch。 +6. operation。 +7. target_version。 + +3.7 管理员登录 + +当前采用单管理员 Token,服务端只保存 Token Hash。 + +尚缺少: + +1. admin_users 表。 +2. 正式登录接口。 +3. Token 过期时间。 +4. 多管理员和角色权限。 +5. 登录失败审计。 +6. 管理员操作审计。 + +3.8 数据库结构 + +已有 apps、versions、version_files、version_policies、upgrade_logs、update_report。 + +部分字段仍未达到文档设计,例如: + +1. versions 缺少 status、allow_rollback、rollback_targets、描述和发布时间等字段。 +2. version_files 缺少 storage_key、file_type、is_required。 +3. apps 字段较少。 +4. 缺少较完整的外键、索引和约束。 + +3.9 精确降级控制 + +已有允许/禁止降级,但仍缺少: + +1. rollback_targets 目标白名单。 +2. 数据格式兼容性规则。 +3. 主动输入目标版本。 +4. 不同版本间的允许降级关系。 +5. “允许用户降级”和“管理员强制回退”的独立策略。 + +============================================================ +四、尚未实现的核心功能 +============================================================ + +4.1 一次性短期启动票据 + +需要实现临时 ticket 文件、有效期、nonce、签名、版本绑定、设备绑定、一次使用后删除和防重放。 + +4.2 MainApp 核心文件完整性准入 + +需要在每次启动时验证当前已安装 Manifest、MainApp、核心 DLL、插件目录和额外可执行文件。 + +4.3 设备身份和激活 + +尚未实现: + +1. client_identity.dat 正式签发。 +2. 设备身份 RSA 签名。 +3. /api/v1/device/issue。 +4. 首次设备激活和刷新。 +5. 设备禁用。 +6. devices 表。 +7. 每次请求验证设备身份。 + +当前 device_id 只是普通配置字符串,客户端请求使用共享 client_token。 + +4.4 License 授权系统 + +尚未实现 licenses 表、授权有效期、设备绑定、最大设备数、授权禁用、许可证签名和授权渠道控制。 + +4.5 动态渠道管理 + +目前 stable、preview、dev 写死在客户端和后台。 + +尚未实现 channels 表、渠道新增、启用、禁用、渠道名称和按应用配置渠道。 + +4.6 离线更新包 + +尚未实现: + +1. .upd 离线包。 +2. 离线包生成。 +3. 离线包 Manifest 和 RSA 签名。 +4. 本地导入和校验。 +5. 解包到 staging。 +6. 离线事务安装。 + +4.7 插件白名单 + +尚未实现插件目录扫描、未知 DLL 检测、插件签名/Hash 准入和插件接口版本检查。 + +4.8 服务端限流 + +尚未实现更新检查限流、下载链接限流、完整包下载次数限制、每日字节额度、管理 API 限流以及 HTTP 429/RATE_LIMITED。 + +4.9 下载日志 + +尚未实现 download_logs 表,以及设备、版本、文件、下载字节、结果、IP 和时间等业务下载记录。 + +4.10 管理员审计日志 + +尚未实现 admin_audit_logs,包括发布、删除、设置最新、修改策略、修改令牌、登录失败等操作记录。 + +4.11 代码签名 + +尚未实现 Windows Authenticode、发布者验证和 EXE/DLL 代码签名检查。 + +4.12 灰度发布 + +尚未实现按设备、客户、地区、百分比或批次灰度,以及失败率自动停止。 + +4.13 多平台 + +目前只支持 Windows x64,尚未支持 Windows ARM64、Linux、macOS 和多平台 Manifest 分流。 + +============================================================ +五、需求文档 Demo 里程碑状态 +============================================================ + +第一阶段:基础框架——基本完成。 +缺口:Demo 插件尚未真正通过接口加载。 + +第二阶段:服务端基础能力——基本完成。 +缺口:动态 channels 表和设备身份未完成。 + +第三阶段:在线更新——基本完成。 +正常升级 1.1.3 已实际测试成功。 + +第四阶段:版本策略——大部分完成。 +缺口:动态渠道、rollback_targets 和强制回退独立策略。 + +第五阶段:离线能力——部分完成。 +已经支持离线运行和策略有效期;尚未实现离线更新包。 + +第六阶段:可靠性与安全——部分完成。 +已经支持事务回滚、policy_seq 和时间回拨检测;尚未实现插件白名单、限流、完整下载日志和启动完整性准入。 + +============================================================ +六、需求文档验收用例状态 +============================================================ + +1. 通过 Launcher 正常启动 MainApp:已实现。 +2. 直接启动 MainApp 被拒绝:已实现,但启动票据较弱。 +3. MainApp 显示主程序和 DLL 版本:已实现简化版。 +4. 后台发布版本:已实现。 +5. 客户端在线升级:已实现并实测。 +6. 升级后 DLL 变化:支持。 +7. 升级后 MainApp 自动重启:已实现。 +8. 手动篡改 DLL 后启动失败:未完整实现。 +9. 手动篡改 version_policy 后启动失败:已实现 RSA 验签。 +10. 强制升级:已实现,待最终客户端测试。 +11. 禁用版本:已实现,待最终客户端测试。 +12. preview 客户端获取 preview 更新:基础支持,待测试。 +13. 禁止降级:已实现并进行过 API 测试。 +14. 离线凭证未过期时启动:已实现,待测试。 +15. 离线凭证过期后拒绝启动:已实现,待测试。 +16. 模拟升级失败后成功回滚:代码已实现,待完整故障测试。 + +============================================================ +七、推荐后续开发顺序 +============================================================ + +建议依次实现: + +1. 一次性、短期、防重放的启动票据。 +2. MainApp 启动时核心文件完整性检查和插件白名单。 +3. 设备身份签发与服务端验证。 +4. 升级日志错误码、失败阶段、回滚结果和下载日志。 +5. 管理员审计日志。 +6. 动态渠道管理。 +7. rollback_targets 精确降级目标。 +8. 服务端限流。 +9. 离线更新包。 +10. 最后统一进行成功升级、强制升级、版本禁用、离线、断点续传、文件占用、进程中断、回滚和策略篡改测试。 + +当前下一项最值得实现的是:一次性启动票据,以及 MainApp 启动时的核心文件完整性检查。这两项是目前客户端启动准入中最大的安全缺口。 diff --git a/server/db.py b/server/db.py new file mode 100644 index 0000000..fa004f3 --- /dev/null +++ b/server/db.py @@ -0,0 +1,30 @@ +import sqlite3 +from pathlib import Path +import os +from dotenv import load_dotenv + +load_dotenv() + +DB_FILE = os.getenv("DB_FILE") +SQL_FILE = os.getenv("SQL_FILE") + +# 初始化数据库 +def init_db(): + conn = sqlite3.connect(DB_FILE, timeout=30, check_same_thread=False) + conn.execute("PRAGMA journal_mode=WAL") + cur = conn.cursor() + sql = Path(SQL_FILE).read_text("utf-8") + cur.executescript(sql) + conn.commit() + conn.close() + print(f"数据库 {DB_FILE} 创建完成") + +# 获取连接 +def get_conn(): + conn = sqlite3.connect(DB_FILE, timeout=30, check_same_thread=False) + conn.row_factory = sqlite3.Row + conn.execute("PRAGMA foreign_keys=ON") + return conn + +if __name__ == "__main__": + init_db() \ No newline at end of file diff --git a/server/keys/manifest_public_key.pem b/server/keys/manifest_public_key.pem new file mode 100644 index 0000000..781682f --- /dev/null +++ b/server/keys/manifest_public_key.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuMROESbT36XU4d3YjuwU +WAC2h5p3btFu/IAeF3bVtHMovIA4ZXXKYsiq5FycDnDzyD86ou3B7PP7uHhVhn2l +Uru7QElYRfEfQAFSU5dErc+SZo+oT170cgq1ePPD/YleKPRqFAL221Tbh5pusHcZ +Ocujit2qrfg5f4rIEzWu7kBKVSJ6WChkjetEL6OZ43ClkDyUGebUuaQ9dv39YVlv +Fp2pfARi7/7djMMncLVaFU2AAIuSy3jgQg65DOFRVPSr1P/rRfuqU55ZmqAmmZIs +F/KVpne6zLFBXrxf5rNTBch+nxX+hcE7M+K0PJA5Ie669qRQFRwxoJlGpSOvMefQ +TwIDAQAB +-----END PUBLIC KEY----- diff --git a/server/main.py b/server/main.py new file mode 100644 index 0000000..28ec09f --- /dev/null +++ b/server/main.py @@ -0,0 +1,780 @@ +from fastapi import FastAPI, Body, Request, HTTPException, UploadFile, File, Form, Header, Depends +from fastapi.staticfiles import StaticFiles +from pydantic import BaseModel +import os +import sqlite3 +from pathlib import Path, PurePosixPath +from dotenv import load_dotenv +from contextlib import asynccontextmanager +import db +import minio_tool +import hashlib +import secrets +import base64 +import json +from datetime import datetime, timezone, timedelta +from fastapi.middleware.cors import CORSMiddleware +import socket +import subprocess +import time +import shutil +import tempfile +import urllib.request +from cryptography.hazmat.primitives.serialization import load_pem_private_key +from cryptography.hazmat.primitives.asymmetric import padding +from cryptography.hazmat.primitives import hashes + +# 加载环境变量 +load_dotenv() +SERVER_HOST = os.getenv("SERVER_HOST") +SERVER_PORT = int(os.getenv("SERVER_PORT")) +VALID_CLIENT_TOKEN = os.getenv("CLIENT_API_TOKEN") + +# 大型 multipart 上传使用内存文件系统暂存,避免与 MinIO 对象双重占用根分区。 +UPLOAD_SPOOL_DIR = Path(os.getenv("UPLOAD_SPOOL_DIR", "/dev/shm/marsco-upload")) +UPLOAD_SPOOL_DIR.mkdir(parents=True, exist_ok=True) +tempfile.tempdir = str(UPLOAD_SPOOL_DIR) +MINIO_DATA_DIR = Path(os.getenv("MINIO_DATA_DIR", "minio_data")) +UPLOAD_SPACE_RESERVE = 256 * 1024 * 1024 + +# 后台管理令牌:仅持久化 SHA-256 哈希,不保存明文 +ADMIN_TOKEN_HASH_PATH = Path(os.getenv("ADMIN_TOKEN_HASH_PATH", "admin_token.sha256")) +DEFAULT_ADMIN_TOKEN = os.getenv("ADMIN_TOKEN", "AdminSecret2026") + +def token_digest(token: str) -> str: + return hashlib.sha256(token.encode("utf-8")).hexdigest() + +def load_admin_token_hash() -> str: + if ADMIN_TOKEN_HASH_PATH.exists(): + stored = ADMIN_TOKEN_HASH_PATH.read_text(encoding="utf-8").strip() + if len(stored) == 64: + return stored + return token_digest(DEFAULT_ADMIN_TOKEN) + +ADMIN_TOKEN_HASH = load_admin_token_hash() + +print("读取到的CLIENT_API_TOKEN:", repr(VALID_CLIENT_TOKEN)) + +# ========== 生命周期初始化 ========== +@asynccontextmanager +async def lifespan(app: FastAPI): + print("===== 进程启动,开始初始化数据库 =====") + db_file = "mini.db" + sql_file_path = Path("./tables.sql") + conn = sqlite3.connect(db_file, check_same_thread=False) + conn.row_factory = sqlite3.Row + cur = conn.cursor() + + if sql_file_path.exists(): + with open(sql_file_path, "r", encoding="utf-8") as f: + full_sql = f.read() + cur.executescript(full_sql) + conn.commit() + print(f"✅ 成功执行tables.sql,创建数据表与测试数据") + else: + print(f"❌ 错误:当前目录找不到 tables.sql 文件!") + conn.close() + print("===== 数据库初始化完成 =====") + + start_minio_if_needed() + + yield + print("服务进程正常退出") + +def is_minio_running(endpoint: str) -> bool: + try: + if endpoint.startswith("http://") or endpoint.startswith("https://"): + base_url = endpoint.rstrip("/") + else: + base_url = f"http://{endpoint.rstrip('/')}" + health_url = base_url + "/minio/health/live" + with urllib.request.urlopen(health_url, timeout=2) as resp: + return resp.status == 200 + except Exception: + return False + + +def download_minio_binary(target_path: Path) -> str | None: + url = "https://dl.min.io/server/minio/release/linux-amd64/minio" + try: + print(f"MinIO 二进制未找到,尝试下载到 {target_path}") + target_path.parent.mkdir(parents=True, exist_ok=True) + with urllib.request.urlopen(url, timeout=30) as response, open(target_path, 'wb') as out_file: + out_file.write(response.read()) + target_path.chmod(0o755) + abs_path = str(target_path.resolve()) + print(f"已下载 MinIO 二进制到 {abs_path}") + return abs_path + except Exception as err: + print(f"自动下载 MinIO 失败:{err}") + return None + + +def start_minio_if_needed(): + endpoint = os.getenv('MINIO_ENDPOINT') + if not endpoint: + return + + if is_minio_running(endpoint): + print(f"MinIO 已在 {endpoint} 运行,跳过启动") + return + + minio_cmd = shutil.which('minio') + if not minio_cmd: + minio_bin = Path(os.getenv('MINIO_BIN_PATH', 'minio')) + minio_cmd = download_minio_binary(minio_bin) + if not minio_cmd: + print("MinIO 二进制未找到且自动下载失败,无法启动 MinIO") + return + + data_dir = Path(os.getenv('MINIO_DATA_DIR', 'minio_data')) + data_dir.mkdir(parents=True, exist_ok=True) + print(f"尝试自动启动 MinIO:{minio_cmd} server {data_dir} --address ':9000'") + try: + subprocess.Popen([minio_cmd, 'server', str(data_dir), '--address', ':9000'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + time.sleep(5) + if is_minio_running(endpoint): + print("MinIO 已启动成功") + else: + print("MinIO 启动失败,仍然无法连接") + except Exception as err: + print(f"启动 MinIO 失败:{err}") + + +# Manifest signing key path +MANIFEST_PRIVATE_KEY_PATH = os.getenv("MANIFEST_PRIVATE_KEY_PATH", str(Path(__file__).resolve().parent / "keys" / "manifest_private_key.pem")) + +# 创建APP绑定生命周期 +app = FastAPI(title="最小自动更新服务", lifespan=lifespan) + +# 本地上传备份文件目录(MinIO 不通时会保存到这里) +app.mount("/static", StaticFiles(directory="local_uploads"), name="static") + +# 跨域配置(给admin前端页面用) +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# ===================== 全局客户端鉴权中间件 ===================== +@app.middleware("http") +async def auth_middleware(request: Request, call_next): + path = request.url.path + # 后台接口、文档接口、静态回退链接全部跳过客户端token校验 + skip_paths = ("/admin", "/docs", "/openapi.json", "/redoc", "/static") + if path.startswith(skip_paths): + response = await call_next(request) + return response + + client_token = request.headers.get("X-Client-Token") + print("本次请求携带token:", repr(client_token)) + if client_token != VALID_CLIENT_TOKEN: + raise HTTPException(status_code=401, detail="非法客户端,令牌校验失败") + response = await call_next(request) + return response + +# ========== 请求体模型 ========== +class CheckUpdateReq(BaseModel): + app_id: str + current_version: str + channel: str + +class DownloadUrlReq(BaseModel): + app_id: str + channel: str + version: str + version_id: int + files: list[str] + +class ManifestReq(BaseModel): + app_id: str + channel: str + version: str + version_id: int + +class ReportReq(BaseModel): + device_id: str + from_version: str + to_version: str + result: str + +class ChangeAdminTokenReq(BaseModel): + new_token: str + +# 统一后台鉴权:全部接口从Header读取token,不再区分表单/头 +def admin_auth(X_Admin_Token: str = Header("")): + if not secrets.compare_digest(token_digest(X_Admin_Token), ADMIN_TOKEN_HASH): + raise HTTPException(status_code=403, detail="后台密钥错误,禁止访问") + return True + +# Manifest signing helpers + +def load_manifest_private_key(): + key_path = Path(MANIFEST_PRIVATE_KEY_PATH) + if not key_path.exists(): + raise FileNotFoundError(f"Manifest private key not found: {key_path}") + key_data = key_path.read_bytes() + return load_pem_private_key(key_data, password=None) + + +def canonical_manifest_bytes(manifest_obj: dict) -> bytes: + copy = {k: manifest_obj[k] for k in manifest_obj if k != "signature"} + return json.dumps(copy, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + + +def sign_manifest(manifest_obj: dict) -> str: + json_text = canonical_manifest_bytes(manifest_obj) + private_key = load_manifest_private_key() + signature = private_key.sign( + json_text, + padding.PKCS1v15(), + hashes.SHA256() + ) + return base64.b64encode(signature).decode("ascii") + + +def canonical_signed_bytes(obj: dict) -> bytes: + copy = {k: obj[k] for k in obj if k != "signature"} + return json.dumps(copy, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8") + + +def sign_policy(policy_obj: dict) -> tuple[str, str]: + payload = canonical_signed_bytes(policy_obj) + signature = load_manifest_private_key().sign(payload, padding.PKCS1v15(), hashes.SHA256()) + return payload.decode("utf-8"), base64.b64encode(signature).decode("ascii") + + +def policy_row_to_dict(row) -> dict: + if not row: + return { + "policy_seq": 1, "force_update": False, "allow_rollback": False, + "offline_allowed": True, "valid_until": "2099-12-31T23:59:59Z", + "min_supported_version": "", "disabled_versions": [], "message": "" + } + try: + disabled = json.loads(row["disabled_versions"] or "[]") + except (TypeError, json.JSONDecodeError): + disabled = [] + return { + "policy_seq": int(row["policy_seq"]), "force_update": bool(row["force_update"]), + "allow_rollback": bool(row["allow_rollback"]), "offline_allowed": bool(row["offline_allowed"]), + "valid_until": row["valid_until"], "min_supported_version": row["min_supported_version"] or "", + "disabled_versions": disabled if isinstance(disabled, list) else [], "message": row["message"] or "" + } + + +def is_executable_path(path: str) -> bool: + return path.lower().endswith((".exe", ".dll")) + +def version_key(version: str): + parts = [] + for part in version.split("."): + digits = "".join(ch for ch in part if ch.isdigit()) + parts.append(int(digits) if digits else 0) + return tuple(parts) + +def normalize_relative_path(raw_path: str) -> str: + if not isinstance(raw_path, str): + raise HTTPException(status_code=400, detail="文件相对路径无效") + normalized = raw_path.replace(chr(92), "/") + if normalized.startswith("/"): + raise HTTPException(status_code=400, detail=f"文件路径必须是相对路径: {raw_path}") + normalized = normalized.strip("/") + if not normalized or chr(0) in normalized: + raise HTTPException(status_code=400, detail="文件相对路径为空或包含非法字符") + path = PurePosixPath(normalized) + if path.is_absolute() or any(part in ("", ".", "..") for part in path.parts): + raise HTTPException(status_code=400, detail=f"不安全的文件路径: {raw_path}") + if path.parts and ":" in path.parts[0]: + raise HTTPException(status_code=400, detail=f"文件路径不能包含盘符: {raw_path}") + return path.as_posix() + +# 文件sha256工具 +def calc_sha256(data: bytes): + sha = hashlib.sha256() + sha.update(data) + return sha.hexdigest() + +# ==================== 原有客户端接口 完整保留 ==================== +# 1. 查询更新接口 +@app.post("/api/v1/update/check") +async def check_update(body: CheckUpdateReq = Body(...)): + print("收到客户端版本检测请求,参数:", body.model_dump()) + app_id, cur_ver, channel = body.app_id, body.current_version, body.channel + conn = db.get_conn() + ver = conn.execute( + "SELECT * FROM versions WHERE app_id=? AND channel=? AND latest=1", (app_id, channel) + ).fetchone() + policy_row = conn.execute( + "SELECT * FROM version_policies WHERE app_id=? AND channel=?", (app_id, channel) + ).fetchone() + conn.close() + + settings = policy_row_to_dict(policy_row) + latest_ver = ver["version"] if ver else "" + version_id = int(ver["id"]) if ver else 0 + upgrade_available = bool(latest_ver) and version_key(latest_ver) > version_key(cur_ver) + rollback_candidate = bool(latest_ver) and version_key(latest_ver) < version_key(cur_ver) + rollback_allowed = rollback_candidate and bool(settings["allow_rollback"]) + need_update = upgrade_available or rollback_allowed + disabled = cur_ver in settings["disabled_versions"] + below_min = bool(settings["min_supported_version"]) and version_key(cur_ver) < version_key(settings["min_supported_version"]) + allow_run = not disabled and not below_min + force_update = bool(settings["force_update"] and upgrade_available) or disabled or below_min + if disabled: + action, message = "blocked", settings["message"] or f"当前版本 {cur_ver} 已被管理员禁用" + elif below_min: + action, message = "force_update", settings["message"] or f"当前版本低于最低支持版本 {settings['min_supported_version']}" + elif force_update: + action, message = "force_update", settings["message"] or "必须升级到最新版本后才能继续使用" + elif rollback_allowed: + action, message = "rollback_allowed", settings["message"] or f"管理员要求回退到版本 {latest_ver}" + elif rollback_candidate: + action, message = "rollback_denied", settings["message"] or f"渠道目标版本 {latest_ver} 低于当前版本,策略禁止降级" + elif upgrade_available: + action, message = "optional_update", settings["message"] or "发现可用新版本" + else: + action, message = "allow", settings["message"] or "当前版本允许使用" + + issued_at = datetime.now(timezone.utc).replace(microsecond=0).isoformat().replace("+00:00", "Z") + policy = { + "app_id": app_id, "channel": channel, "current_version": cur_ver, + "policy_seq": settings["policy_seq"], "allow_run": allow_run, + "force_update": force_update, "allow_rollback": settings["allow_rollback"], + "rollback_targets": [], "offline_allowed": settings["offline_allowed"], + "issued_at": issued_at, "valid_until": settings["valid_until"], + "latest_version": latest_ver, "min_supported_version": settings["min_supported_version"], + "disabled_versions": settings["disabled_versions"], "message": message, + "signature_alg": "RSA-2048-SHA256", "key_id": "manifest-key-v1" + } + policy_text, policy_signature = sign_policy(policy) + policy["signature"] = policy_signature + return { + "allow_run": allow_run, "action": action, "message": message, + "need_update": need_update, "release_available": bool(ver), + "current_version": cur_ver, "latest_version": latest_ver, "version_id": version_id, + "force_update": force_update, "allow_rollback": settings["allow_rollback"], + "rollback": rollback_allowed, + "policy_seq": settings["policy_seq"], "policy_valid_until": settings["valid_until"], + "policy": policy, "policy_text": policy_text, "policy_signature": policy_signature + } + +# 2. 获取文件下载链接 +@app.post("/api/v1/update/download-url") +async def get_download_url(body: DownloadUrlReq = Body(...)): + ver_id = body.version_id + conn = db.get_conn() + rows = conn.execute( + "SELECT path, sha256, size FROM version_files WHERE version_id=?", + (ver_id,) + ).fetchall() + conn.close() + res = [] + base_path = f"{body.app_id}/{body.channel}/{body.version}/files/" + for r in rows: + full_path = base_path + r["path"] + url = minio_tool.get_url(full_path) + res.append({ + "path": r["path"], + "url": url, + "sha256": r["sha256"], + "size": r["size"] + }) + return {"files": res} + +# 2b. 获取版本 manifest +@app.post("/api/v1/update/manifest") +async def get_manifest(body: ManifestReq = Body(...)): + ver_id = body.version_id + conn = db.get_conn() + ver = conn.execute( + "SELECT app_id, channel, version, create_time FROM versions WHERE id=?", + (ver_id,) + ).fetchone() + if not ver: + conn.close() + raise HTTPException(status_code=404, detail="Version not found") + + rows = conn.execute( + "SELECT path, sha256, size FROM version_files WHERE version_id=?", + (ver_id,) + ).fetchall() + conn.close() + + files = [] + for r in rows: + files.append({ + "path": r["path"], + "sha256": r["sha256"], + "size": r["size"], + "executable": is_executable_path(r["path"]) + }) + + manifest = { + "app_id": ver["app_id"], + "version": ver["version"], + "channel": ver["channel"], + "platform": "windows", + "arch": "x64", + "manifest_seq": int(ver_id), + "created_at": ver["create_time"], + "files": files + } + manifest_text = canonical_manifest_bytes(manifest).decode("utf-8") + signature = sign_manifest(manifest) + manifest["signature"] = signature + return { + "manifest": manifest, + "manifest_text": manifest_text, + "signature": signature + } + +# 3. 升级结果上报 +@app.post("/api/v1/update/report") +async def report(body: ReportReq = Body(...)): + conn = db.get_conn() + insert_sql = """ + INSERT INTO upgrade_logs(device_id,from_ver,to_ver,result,create_time) + VALUES (?,?,?,?,datetime('now')) + """ + conn.execute(insert_sql, (body.device_id, body.from_version, body.to_version, body.result)) + conn.commit() + conn.close() + return {"code": 0, "msg": "上报成功"} + +# ==================== 管理后台 Admin 全套接口(统一Header鉴权) ==================== +@app.post("/admin/token/change") +def admin_change_token(body: ChangeAdminTokenReq, auth=Depends(admin_auth)): + global ADMIN_TOKEN_HASH + new_token = body.new_token.strip() + if len(new_token) < 8: + raise HTTPException(status_code=400, detail="新令牌至少需要 8 个字符") + if len(new_token) > 128: + raise HTTPException(status_code=400, detail="新令牌不能超过 128 个字符") + new_hash = token_digest(new_token) + ADMIN_TOKEN_HASH_PATH.write_text(new_hash, encoding="utf-8") + ADMIN_TOKEN_HASH = new_hash + return {"code": 0, "msg": "管理员令牌已更新"} + +# 应用列表 GET +@app.get("/admin/app/list") +def admin_get_app_list(auth=Depends(admin_auth)): + conn = db.get_conn() + rows = conn.execute("SELECT app_id, app_name FROM apps").fetchall() + conn.close() + return {"list": [{"app_id": r["app_id"], "app_name": r["app_name"]} for r in rows]} + +# 新增应用 POST json +@app.post("/admin/app/add") +def admin_add_app(body: dict, auth=Depends(admin_auth)): + aid = body["app_id"] + aname = body["app_name"] + conn = db.get_conn() + try: + conn.execute("INSERT INTO apps(app_id, app_name) VALUES (?, ?)", (aid, aname)) + conn.commit() + except Exception as e: + return {"msg": f"创建失败:{str(e)}"} + conn.close() + return {"msg": "应用创建成功"} + +# 查询和保存应用渠道策略 +@app.get("/admin/policy") +def admin_get_policy(app_id: str, channel: str = "stable", auth=Depends(admin_auth)): + conn = db.get_conn() + row = conn.execute("SELECT * FROM version_policies WHERE app_id=? AND channel=?", (app_id, channel)).fetchone() + conn.close() + result = policy_row_to_dict(row) + result.update({"app_id": app_id, "channel": channel}) + return result + + +@app.post("/admin/policy/save") +def admin_save_policy(body: dict, auth=Depends(admin_auth)): + app_id = str(body.get("app_id") or "").strip() + channel = str(body.get("channel") or "stable").strip() + if not app_id or channel not in ("stable", "preview", "dev"): + raise HTTPException(status_code=400, detail="App ID 或渠道无效") + disabled = body.get("disabled_versions") or [] + if not isinstance(disabled, list) or any(not isinstance(v, str) for v in disabled): + raise HTTPException(status_code=400, detail="disabled_versions 必须是版本字符串数组") + valid_until = str(body.get("valid_until") or "").strip() + try: + datetime.fromisoformat(valid_until.replace("Z", "+00:00")) + except ValueError: + raise HTTPException(status_code=400, detail="valid_until 必须是 ISO-8601 时间") + conn = db.get_conn() + row = conn.execute("SELECT policy_seq FROM version_policies WHERE app_id=? AND channel=?", (app_id, channel)).fetchone() + next_seq = (int(row["policy_seq"]) + 1) if row else 1 + values = (next_seq, int(bool(body.get("force_update"))), int(bool(body.get("allow_rollback"))), + int(bool(body.get("offline_allowed"))), valid_until, + str(body.get("min_supported_version") or "").strip(), + json.dumps(disabled, ensure_ascii=False), str(body.get("message") or "").strip(), app_id, channel) + conn.execute(""" + INSERT INTO version_policies(policy_seq,force_update,allow_rollback,offline_allowed,valid_until, + min_supported_version,disabled_versions,message,app_id,channel) + VALUES(?,?,?,?,?,?,?,?,?,?) + ON CONFLICT(app_id,channel) DO UPDATE SET policy_seq=excluded.policy_seq, + force_update=excluded.force_update,allow_rollback=excluded.allow_rollback, + offline_allowed=excluded.offline_allowed,valid_until=excluded.valid_until, + min_supported_version=excluded.min_supported_version,disabled_versions=excluded.disabled_versions, + message=excluded.message,updated_at=datetime('now') + """, values) + conn.commit(); conn.close() + return {"msg": "策略已保存并递增 policy_seq", "policy_seq": next_seq} + + +# 发布新版本(文件上传) +@app.post("/admin/publish") +async def admin_publish_version(request: Request, auth=Depends(admin_auth)): + # 在 Starlette 解析 multipart 前检查空间;否则大文件 rollover 会直接抛出 Errno 28。 + content_length_header = request.headers.get("content-length") + try: + content_length = int(content_length_header or 0) + except ValueError: + raise HTTPException(status_code=400, detail="无效的 Content-Length") + if content_length <= 0: + raise HTTPException(status_code=411, detail="发布请求必须提供 Content-Length") + + spool_free = shutil.disk_usage(UPLOAD_SPOOL_DIR).free + storage_free = shutil.disk_usage(MINIO_DATA_DIR).free + if spool_free < content_length + 64 * 1024 * 1024: + raise HTTPException(status_code=507, detail={ + "error": "upload_temp_space_insufficient", + "msg": "上传临时空间不足,请减小发布包或扩容 /dev/shm", + "required_bytes": content_length + 64 * 1024 * 1024, + "available_bytes": spool_free, + }) + if storage_free < content_length + UPLOAD_SPACE_RESERVE: + raise HTTPException(status_code=507, detail={ + "error": "storage_space_insufficient", + "msg": "版本存储空间不足,请扩容服务器根卷或删除不再需要的历史版本", + "required_bytes": content_length + UPLOAD_SPACE_RESERVE, + "available_bytes": storage_free, + }) + + # 手动解析表单,增加兼容性并便于调试前端上传问题 + try: + form = await request.form() + except OSError as err: + if getattr(err, "errno", None) == 28: + raise HTTPException(status_code=507, detail="上传临时空间已满,请扩容后重试") + raise + # 尝试从 form 中获取字段 + app_id = form.get("app_id") + channel = form.get("channel") or "stable" + version = form.get("version") + + # 收集 files(可能是多个同名字段) + files = [] + if hasattr(form, "getlist"): + files = form.getlist("files") + else: + # 兼容性降级:遍历所有表单项 + for k, v in form.multi_items(): + if k == "files": + files.append(v) + + # 如果关键信息缺失,返回详细调试信息,方便前端定位问题 + if not app_id or not version: + headers = {k: v for k, v in request.headers.items()} + detail = { + "error": "missing form fields", + "have_app_id": bool(app_id), + "have_version": bool(version), + "content_type": request.headers.get("content-type"), + "headers": headers, + "form_keys": list(form.keys()), + "app_id_value": app_id, + "version_value": version, + "app_id_len": len(app_id or ""), + "version_len": len(version or "") + } + raise HTTPException(status_code=422, detail=detail) + + if not files: + raise HTTPException(status_code=400, detail="未选择任何文件,请选择程序文件夹") + + relative_paths = form.getlist("relative_paths") if hasattr(form, "getlist") else [] + if relative_paths and len(relative_paths) != len(files): + raise HTTPException(status_code=400, detail="文件数量与相对路径数量不一致") + + upload_items = [] + seen_paths = set() + for index, file in enumerate(files): + if not hasattr(file, "filename"): + raise HTTPException(status_code=400, detail="上传内容中包含无效文件") + raw_path = relative_paths[index] if relative_paths else file.filename + rel_path = normalize_relative_path(str(raw_path)) + path_key = rel_path.lower() + if path_key in seen_paths: + raise HTTPException(status_code=400, detail=f"存在重复文件路径: {rel_path}") + seen_paths.add(path_key) + upload_items.append((file, rel_path)) + + if "mainapp.exe" not in seen_paths: + nested_main = next((path for path in seen_paths if path.endswith("/mainapp.exe")), None) + if nested_main: + raise HTTPException(status_code=400, detail=f"MainApp.exe 不在发布根级,请改为选择其所在目录: {nested_main}") + raise HTTPException(status_code=400, detail="发布根目录中缺少 MainApp.exe") + + + conn = db.get_conn() + publish_started = False + publish_prefix = f"{app_id}/{channel}/{version}/" + try: + cur = conn.cursor() + exists = cur.execute( + "SELECT 1 FROM versions WHERE app_id=? AND channel=? AND version=?", + (app_id, channel, version) + ).fetchone() + if exists: + raise HTTPException(status_code=400, detail="该版本已存在,请更换版本号或先删除旧版本") + + cur.execute("UPDATE versions SET latest=0 WHERE app_id=? AND channel=?", (app_id, channel)) + cur.execute( + "INSERT INTO versions(app_id, channel, version, latest) VALUES (?,?,?,1)", + (app_id, channel, version) + ) + new_vid = cur.lastrowid + publish_started = True + + for file, rel_path in upload_items: + content = await file.read() + + f_size = len(content) + f_sha = calc_sha256(content) + obj_path = f"{app_id}/{channel}/{version}/files/{rel_path}" + put_result = minio_tool.put_file(obj_path, content, f_size) + if put_result.get('storage') == 'local': + print(f"MinIO 不可用,已保存到本地回退:{put_result.get('path')}") + cur.execute( + "INSERT INTO version_files(version_id, path, sha256, size) VALUES (?,?,?,?)", + (new_vid, rel_path, f_sha, f_size) + ) + + conn.commit() + except sqlite3.IntegrityError as err: + conn.rollback() + if publish_started: + minio_tool.remove_prefix(publish_prefix) + if 'UNIQUE constraint failed: versions.app_id, versions.channel, versions.version' in str(err): + raise HTTPException(status_code=400, detail="该版本已存在,请更换版本号或先删除旧版本") + raise HTTPException(status_code=500, detail=str(err)) + except sqlite3.OperationalError as err: + conn.rollback() + if publish_started: + minio_tool.remove_prefix(publish_prefix) + raise HTTPException(status_code=500, detail={"error": "database locked", "msg": str(err)}) + except HTTPException: + conn.rollback() + if publish_started: + minio_tool.remove_prefix(publish_prefix) + raise + except Exception as err: + conn.rollback() + if publish_started: + minio_tool.remove_prefix(publish_prefix) + if isinstance(err, OSError) and getattr(err, "errno", None) == 28: + raise HTTPException(status_code=507, detail="发布过程中存储空间耗尽,已清理未完成版本") + raise HTTPException(status_code=500, detail={"error": "publish_failed", "msg": str(err)}) + finally: + conn.close() + + return {"msg": f"版本 {version} 发布完成,共上传 {len(upload_items)} 个文件"} + +# 获取版本列表 GET +@app.get("/admin/version/list") +def admin_get_version_list(app_id: str, auth=Depends(admin_auth)): + conn = db.get_conn() + rows = conn.execute(""" + SELECT id, version, channel, latest, create_time + FROM versions WHERE app_id=? ORDER BY create_time DESC + """, (app_id,)).fetchall() + conn.close() + out = [] + for r in rows: + out.append({ + "id": r["id"], + "version": r["version"], + "channel": r["channel"], + "latest": bool(r["latest"]), + "create_time": r["create_time"] + }) + return {"list": out} + +# 设置指定版本为渠道最新 POST json +@app.post("/admin/version/set-latest") +def admin_set_latest(body: dict, auth=Depends(admin_auth)): + vid = body["version_id"] + conn = db.get_conn() + cur = conn.cursor() + v_info = cur.execute("SELECT app_id, channel FROM versions WHERE id=?", (vid,)).fetchone() + aid, ch = v_info["app_id"], v_info["channel"] + cur.execute("UPDATE versions SET latest=0 WHERE app_id=? AND channel=?", (aid, ch)) + cur.execute("UPDATE versions SET latest=1 WHERE id=?", (vid,)) + conn.commit() + conn.close() + return {"msg": "已切换为渠道最新版本"} + +# 删除版本 POST json +@app.post("/admin/version/delete") +def admin_delete_version(body: dict, auth=Depends(admin_auth)): + vid = body["version_id"] + conn = db.get_conn() + cur = conn.cursor() + v_info = cur.execute("SELECT app_id, channel, version, latest FROM versions WHERE id=?", (vid,)).fetchone() + if not v_info: + conn.close() + raise HTTPException(status_code=404, detail="版本不存在") + aid, ch, ver = v_info["app_id"], v_info["channel"], v_info["version"] + was_latest = bool(v_info["latest"]) + # 删除minio下该版本全部文件 + prefix = f"{aid}/{ch}/{ver}/files/" + minio_tool.remove_prefix(prefix) + # 删除数据库记录 + cur.execute("DELETE FROM version_files WHERE version_id=?", (vid,)) + cur.execute("DELETE FROM versions WHERE id=?", (vid,)) + promoted_version = None + if was_latest: + replacement = cur.execute( + "SELECT id, version FROM versions WHERE app_id=? AND channel=? ORDER BY create_time DESC, id DESC LIMIT 1", + (aid, ch) + ).fetchone() + if replacement: + cur.execute("UPDATE versions SET latest=1 WHERE id=?", (replacement["id"],)) + promoted_version = replacement["version"] + conn.commit() + conn.close() + return { + "msg": "版本、云端文件、数据库记录全部删除完成", + "promoted_latest": promoted_version + } + +# 获取升级日志 GET +@app.get("/admin/report/list") +def admin_get_report_log(auth=Depends(admin_auth)): + conn = db.get_conn() + rows = conn.execute(""" + SELECT device_id,from_ver,to_ver,result,create_time + FROM upgrade_logs ORDER BY create_time DESC LIMIT 200 + """).fetchall() + conn.close() + res = [] + for r in rows: + res.append({ + "device_id": r["device_id"], + "app_id": "", + "from_version": r["from_ver"], + "to_version": r["to_ver"], + "result": r["result"], + "create_time": r["create_time"] + }) + return {"list": res} + +if __name__ == "__main__": + import uvicorn + uvicorn.run(app, host=SERVER_HOST, port=SERVER_PORT, workers=1) \ No newline at end of file diff --git a/server/minio_tool.py b/server/minio_tool.py new file mode 100644 index 0000000..eacc0f5 --- /dev/null +++ b/server/minio_tool.py @@ -0,0 +1,93 @@ +from minio import Minio +from datetime import timedelta +import os +from dotenv import load_dotenv +import io +import socket +import shutil +from pathlib import Path +import urllib3 +from urllib3.util import Retry, Timeout + +load_dotenv() + +MINIO_ENDPOINT = os.getenv("MINIO_ENDPOINT") +MINIO_ACCESS_KEY = os.getenv("MINIO_ACCESS_KEY") +MINIO_SECRET_KEY = os.getenv("MINIO_SECRET_KEY") +MINIO_BUCKET = os.getenv("MINIO_BUCKET") +SIGN_EXPIRE_MIN = int(os.getenv("SIGN_EXPIRE_MIN") or 60) +LOCAL_UPLOAD_ROOT = Path(os.getenv("LOCAL_UPLOAD_ROOT", "local_uploads")) +LOCAL_FILE_URL_BASE = os.getenv("LOCAL_FILE_URL_BASE") +LOCAL_UPLOAD_ROOT.mkdir(parents=True, exist_ok=True) + +http_client = urllib3.PoolManager( + timeout=Timeout(connect=2.0, read=5.0), + retries=Retry(total=1, connect=1, read=1, status=1, backoff_factor=0.2), +) + +mc = Minio( + MINIO_ENDPOINT, + access_key=MINIO_ACCESS_KEY, + secret_key=MINIO_SECRET_KEY, + secure=False, + http_client=http_client, +) + + +def get_url(file_path: str) -> str: + bucket = MINIO_BUCKET + full_object_path = file_path + try: + mc.stat_object(bucket, full_object_path) + url = mc.presigned_get_object(bucket, full_object_path, expires=timedelta(minutes=SIGN_EXPIRE_MIN)) + return url + except Exception as err: + print(f"generate url error: {err}") + local_path = LOCAL_UPLOAD_ROOT / file_path + if local_path.exists(): + if LOCAL_FILE_URL_BASE: + return LOCAL_FILE_URL_BASE.rstrip('/') + '/' + file_path + host = os.getenv('SERVER_HOST') or '127.0.0.1' + if host == '0.0.0.0': + try: + host = socket.gethostbyname(socket.gethostname()) + except Exception: + host = '127.0.0.1' + port = os.getenv('SERVER_PORT') or '8000' + return f"http://{host}:{port}/static/{file_path}" + return f"http://{MINIO_ENDPOINT}/{bucket}/{full_object_path}" + + +def put_file(object_path: str, data: bytes, size: int): + bucket = MINIO_BUCKET + try: + bio = io.BytesIO(data) + mc.put_object(bucket, object_path, bio, length=size) + return {'storage': 'minio', 'path': object_path} + except Exception as e: + print(f"minio put_file error: {e}") + local_path = LOCAL_UPLOAD_ROOT / object_path + local_path.parent.mkdir(parents=True, exist_ok=True) + with open(local_path, 'wb') as f: + f.write(data) + print(f"local fallback stored {local_path}") + return {'storage': 'local', 'path': str(local_path)} + + +def remove_prefix(prefix: str): + bucket = MINIO_BUCKET + try: + objects = mc.list_objects(bucket, prefix=prefix, recursive=True) + for obj in objects: + try: + mc.remove_object(bucket, obj.object_name) + except Exception as e: + print(f"failed remove object {obj.object_name}: {e}") + except Exception as e: + print(f"minio remove_prefix error: {e}") + local_prefix = LOCAL_UPLOAD_ROOT / prefix + if local_prefix.exists(): + try: + shutil.rmtree(local_prefix) + except Exception as e: + print(f"local remove_prefix error: {e}") diff --git a/server/tables.sql b/server/tables.sql new file mode 100644 index 0000000..1cdbde7 --- /dev/null +++ b/server/tables.sql @@ -0,0 +1,65 @@ +-- 1.软件应用表:管理所有接入自动更新系统的软件 +CREATE TABLE IF NOT EXISTS apps ( + id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自增主键ID + app_id TEXT NOT NULL UNIQUE, -- 软件唯一标识(客户端用来区分不同软件) + app_name TEXT NOT NULL -- 软件展示名称 +); + +-- 2.软件版本表:存储每个软件各个渠道下的所有版本号 +CREATE TABLE IF NOT EXISTS versions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, -- 版本自增主键version_id,关联文件表 + app_id TEXT NOT NULL, -- 关联apps表的软件唯一标识 + channel TEXT DEFAULT 'stable', -- 更新渠道:stable正式稳定版 / beta测试版 + version TEXT NOT NULL, -- 版本号,如1.0.0、1.0.2 + latest INTEGER DEFAULT 0, -- 是否为当前渠道最新版本:1=是最新,0=历史旧版 + create_time TEXT DEFAULT (datetime('now')), -- 新增:版本创建时间 + UNIQUE(app_id, channel, version) -- 联合唯一约束:同一个软件+渠道不能重复存在相同版本 +); + +-- 3.版本关联文件表:记录每个版本需要更新的全部文件信息(exe、dll、资源文件) +CREATE TABLE IF NOT EXISTS version_files ( + id INTEGER PRIMARY KEY AUTOINCREMENT, -- 文件记录自增ID + version_id INTEGER NOT NULL, -- 关联versions表的版本主键id + path TEXT NOT NULL, -- 文件在MinIO存储桶内的完整路径 + sha256 TEXT NOT NULL, -- 文件哈希值,客户端下载后做完整性/防篡改校验 + size INTEGER -- 文件字节大小,用于计算下载进度、校验磁盘空间 +); + +-- 4.升级日志记录表:存储所有客户端上报的升级结果,用于后台统计排查问题 +CREATE TABLE IF NOT EXISTS upgrade_logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, -- 日志自增主键 + device_id TEXT, -- 用户设备唯一标识,区分不同电脑客户端 + from_ver TEXT, -- 升级前本地旧版本号 + to_ver TEXT, -- 升级目标新版本号 + result TEXT, -- 升级结果:success成功 / fail失败 + create_time TEXT -- 升级上报时间 +); + +--5.日志数据表 +CREATE TABLE IF NOT EXISTS update_report ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + device_id TEXT NOT NULL, + app_id TEXT NOT NULL, + from_version TEXT NOT NULL, + to_version TEXT NOT NULL, + result TEXT NOT NULL, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- 6. 每个应用/渠道的运行与升级策略;每次保存必须递增 policy_seq +CREATE TABLE IF NOT EXISTS version_policies ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + app_id TEXT NOT NULL, + channel TEXT NOT NULL DEFAULT 'stable', + policy_seq INTEGER NOT NULL DEFAULT 1, + force_update INTEGER NOT NULL DEFAULT 0, + allow_rollback INTEGER NOT NULL DEFAULT 0, + offline_allowed INTEGER NOT NULL DEFAULT 1, + valid_until TEXT NOT NULL, + min_supported_version TEXT NOT NULL DEFAULT '', + disabled_versions TEXT NOT NULL DEFAULT '[]', + message TEXT NOT NULL DEFAULT '', + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')), + UNIQUE(app_id, channel) +);