fix(login): RSA 公钥内嵌二进制(qrc),修复他机登录 invalid public key pem

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
This commit is contained in:
gaozheng 2026-06-19 17:28:26 +08:00
parent 579bd46616
commit 5beb13c5e2
3 changed files with 19 additions and 14 deletions

View File

@ -44,6 +44,7 @@ add_executable(geopro_desktop WIN32
panels/chart/TrajectoryMapView.cpp panels/chart/TrajectoryMapView.cpp
panels/chart/DetailViewFactory.cpp panels/chart/DetailViewFactory.cpp
resources/map/map.qrc resources/map/map.qrc
resources/keys.qrc
panels/chart/ChartTheme.cpp panels/chart/ChartTheme.cpp
panels/chart/ColorMapService.cpp panels/chart/ColorMapService.cpp
panels/chart/ColorBarWidget.cpp panels/chart/ColorBarWidget.cpp

View File

@ -16,10 +16,8 @@
// - 右 属性:选中数据集属性文本。 // - 右 属性:选中数据集属性文本。
// 世界系:启动 loadGrid("grid1") 取一次,用其 lat/lon 中位/均值作 GeoLocalFrame全项目共享保证多视图配准 // 世界系:启动 loadGrid("grid1") 取一次,用其 lat/lon 中位/均值作 GeoLocalFrame全项目共享保证多视图配准
#include <fstream>
#include <initializer_list> #include <initializer_list>
#include <memory> #include <memory>
#include <sstream>
#include <string> #include <string>
#include <typeinfo> #include <typeinfo>
#include <vector> #include <vector>
@ -207,16 +205,6 @@ private:
QWidget* host_; 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。 // 取 vector 中位数(用于由测线 lat/lon 推世界系原点)。空则返回 0。
double median(std::vector<double> v) double median(std::vector<double> v)
{ {
@ -1757,9 +1745,17 @@ int main(int argc, char* argv[])
} }
} }
// 网络层:共享会话 ApiClient + 登录编排 AuthServiceRSA 公钥从 resources 读取)。 // 网络层:共享会话 ApiClient + 登录编排 AuthService。
// RSA 登录公钥内嵌于二进制qrc :/keys不依赖外部文件路径——部署到任意机器均可用。
geopro::net::ApiClient api(QStringLiteral("http://tenant.geomative.cn/pop-api")); 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<size_t>(bytes.size()));
}
}
geopro::net::AuthService auth(api, pem); geopro::net::AuthService auth(api, pem);
// 记住登录:若上次勾选「记住」且未超 30 天,凭证库里有有效 token → 免登录直接进。 // 记住登录:若上次勾选「记住」且未超 30 天,凭证库里有有效 token → 免登录直接进。

View File

@ -0,0 +1,8 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<!-- RSA 登录公钥公钥可安全内嵌进二进制。alias 指向仓库根 resources/ 下的单一来源,
避免复制。运行时经 :/keys/rsa_public_key.pem 读取,不依赖任何外部文件路径。 -->
<qresource prefix="/keys">
<file alias="rsa_public_key.pem">../../../resources/rsa_public_key.pem</file>
</qresource>
</RCC>