From 5beb13c5e27a0082c079f4512bf48cd0973e264d Mon Sep 17 00:00:00 2001 From: gaozheng Date: Fri, 19 Jun 2026 17:28:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(login):=20RSA=20=E5=85=AC=E9=92=A5=E5=86=85?= =?UTF-8?q?=E5=B5=8C=E4=BA=8C=E8=BF=9B=E5=88=B6(qrc),=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BB=96=E6=9C=BA=E7=99=BB=E5=BD=95=20invalid=20public=20key?= =?UTF-8?q?=20pem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit main.cpp 原先从写死的开发机绝对路径 D:/Git/lanbingtech/geopro/resources/ rsa_public_key.pem 读公钥;readPem 读不到时静默返回空串,RsaEncryptor 解析 失败抛 invalid public key PEM。安装包从未打包该 pem,故仅本机可登录。 改为经 Qt 资源 :/keys/rsa_public_key.pem 读取(公钥可安全内嵌),运行时零 外部文件依赖,任意机器一致,安装包脚本无需改动。 - 新增 src/app/resources/keys.qrc(alias 指向仓库根 pem 单一来源) - CMakeLists 把 keys.qrc 加入 geopro_desktop 源 - main.cpp 改 QFile 读 qrc;删除孤儿 readPem 及其专用 fstream/sstream --- src/app/CMakeLists.txt | 1 + src/app/main.cpp | 24 ++++++++++-------------- src/app/resources/keys.qrc | 8 ++++++++ 3 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 src/app/resources/keys.qrc diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index b117a56..9f76d0e 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -44,6 +44,7 @@ add_executable(geopro_desktop WIN32 panels/chart/TrajectoryMapView.cpp panels/chart/DetailViewFactory.cpp resources/map/map.qrc + resources/keys.qrc panels/chart/ChartTheme.cpp panels/chart/ColorMapService.cpp panels/chart/ColorBarWidget.cpp diff --git a/src/app/main.cpp b/src/app/main.cpp index 41c125e..2a3fef8 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -16,10 +16,8 @@ // - 右 属性:选中数据集属性文本。 // 世界系:启动 loadGrid("grid1") 取一次,用其 lat/lon 中位/均值作 GeoLocalFrame(全项目共享,保证多视图配准)。 -#include #include #include -#include #include #include #include @@ -207,16 +205,6 @@ private: QWidget* host_; }; -// 读取 RSA 公钥 PEM 全文(登录时密码加密用)。读不到返回空串,登录将报错。 -std::string readPem(const std::string& path) -{ - std::ifstream in(path, std::ios::binary); - if (!in) return {}; - std::ostringstream ss; - ss << in.rdbuf(); - return ss.str(); -} - // 取 vector 中位数(用于由测线 lat/lon 推世界系原点)。空则返回 0。 double median(std::vector v) { @@ -1757,9 +1745,17 @@ int main(int argc, char* argv[]) } } - // 网络层:共享会话 ApiClient + 登录编排 AuthService(RSA 公钥从 resources 读取)。 + // 网络层:共享会话 ApiClient + 登录编排 AuthService。 + // RSA 登录公钥内嵌于二进制(qrc :/keys),不依赖外部文件路径——部署到任意机器均可用。 geopro::net::ApiClient api(QStringLiteral("http://tenant.geomative.cn/pop-api")); - const std::string pem = readPem("D:/Git/lanbingtech/geopro/resources/rsa_public_key.pem"); + std::string pem; + { + QFile pemFile(QStringLiteral(":/keys/rsa_public_key.pem")); + if (pemFile.open(QIODevice::ReadOnly)) { + const QByteArray bytes = pemFile.readAll(); + pem.assign(bytes.constData(), static_cast(bytes.size())); + } + } geopro::net::AuthService auth(api, pem); // 记住登录:若上次勾选「记住」且未超 30 天,凭证库里有有效 token → 免登录直接进。 diff --git a/src/app/resources/keys.qrc b/src/app/resources/keys.qrc new file mode 100644 index 0000000..512d98b --- /dev/null +++ b/src/app/resources/keys.qrc @@ -0,0 +1,8 @@ + + + + + ../../../resources/rsa_public_key.pem + +