Files
dqb-dev c1849f97d5 会员服务器:文档补齐 v1.5.1(README 版本/功能更新,补缺失的 CHANGELOG v1.5.1 条目)
README:产物名 1.4.0→1.5.1;开头补当前版本说明与 1.5.0/1.5.1 特性;
项目云管理页补「删除选中」批量删除(1.5.1 新增,此前未记录);
修正过期的「已知边界:传输为 HTTP」(1.4.0 起已全站 HTTPS,仅剩自签证书告警边界)。
CHANGELOG:补写缺失的 v1.5.1 条目(此前最高只到 v1.5.0)。
新增首次上传时因 root 000 权限漏掉的 客户端对接示例.cs;
示例注释中的真实手机号/密码替换为占位符(仓库公开可读)。
2026-10-02 00:31:27 +08:00

249 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 更新日志
## v1.5.1 (2026-09-24 01:05:00)
### 新增(用户要求:项目云批量删除)
- **项目云「删除选中」**:`app/www/xiangmu-cloud.html` 此前每行只有单个「删除」按钮,清理某会员名下的多个项目需逐个点击确认,操作繁琐。
已在工具栏新增红色「删除选中」按钮,表头加全选/全不选复选框,每行渲染时写入 `data-bh`(项目编号)供勾选行定位;
点按钮后 `删除选中()` 收集所有 `.云sel` 勾选行,二次 `confirm` 确认后**串行**逐条调用 `POST /api/proj/delete`(串行而非并发,避免同一会员目录下多个删除请求争用文件系统);
执行中显示 `正在删除 i/N ...` 进度,结束后提示成功/失败计数并自动调 `云查询()` 刷新列表。
- **配套客户端对接文档**:新增 `客户端-删除接口对接文档.txt`,说明 `/api/proj/delete` 的两种调用方式(信封加密通道 / HTTPS 明文 JSON)与鉴权要求。
### 打包
- `manifest` 与 `app/server/server.cjs` 的 `VERSION` 同步升至 `1.5.1`,产物 `fnnas.huiyuan_1.5.1_all.fpk`。
- 服务端仅版本号变更、无接口改动——客户端零改动即可继续使用。
### 说明
- 库备份管理页 `lib-cloud.html` 本次未加同款批量删除,需要时可照 `xiangmu-cloud.html` 的模式再做一份。
---
## v1.5.0 (2026-09-17 22:40:00)
### 新增(用户要求:正规 SSL 证书可直接导入使用)
- **SSL 证书导入**:设置页新增「SSL 证书」卡片——选择证书文件(fullchain 全链 .pem/.crt)+ 配对私钥(.key/.pem)→ 导入并立即生效(监听器整体热切换,毫秒级、无需重启;SNI 域名访问与 IP 直访全部覆盖)。导入前服务端校验:证书可解析、私钥与证书公钥匹配,不匹配拒绝并提示。卡片显示当前证书来源(自签/已导入)、域名(CN/SAN)、签发者、有效期、指纹。
- **恢复自签**:一键回到自动生成的自签证书。
- **证书/密钥跨升级保留**:`cmd/uninstall_init` 卸载前把 `tls.key/tls.crt/huiyuan_rsa.pem/app.env` 备份到数据目录 `.huiyuan-密钥备份/`,`cmd/install_init` 安装时自动恢复——升级重装不再丢失已导入的正规证书(此前每次重装 TLS/RSA 密钥都会重新生成、指纹变化)。
### 修复
- 导入/重置接口先响应本请求、再执行监听热切换(此前切换会掐断响应自身连接,客户端收不到结果)。
- 设置页加载时补调证书信息接口(此前显示"加载中…"不刷新)。
### 验证
- 本地:导入 CN=ss61.odn.cc 证书 → 热切换后 SNI/非 SNI(IP 直访)新连接均为新证书;不匹配私钥/垃圾文件/缺文件/无 token 全部拒绝;重启后证书持久;重置回自签正常;GUI 上传导入全流程通过。
- NAS 部署 1.5.0 验证通过,会员数据完好。
### 说明(签发 ss61.odn.cc 证书的前置条件)
- ss61.odn.cc 是 odn 分配的子域名,用户无法做 DNS 验证;签发正规证书需要 HTTP-01:在 odn 控制台把该域名 80 端口转发到 NAS 任一端口,然后 `acme.sh --issue -d ss61.odn.cc --standalone --httpport 该端口 --server letsencrypt`,把 `fullchain.cer` 与 `ss61.odn.cc.key` 在设置页导入。若 odn 不支持转发 80 端口,则只能信任自签(设置页下载证书安装)或让 odn 提供边缘证书。
---
## v1.4.2 (2026-09-17 22:10:00)
### 修复
- **静态页面无缓存策略导致升级后浏览器跑旧脚本**:`admin.html` 等页面此前无 `Cache-Control` 头,浏览器启发式缓存可能在应用升级后仍使用旧版页面(v1.4.1 的建号修复因此未在用户浏览器生效,表现为"点确定无反应")。静态资源统一加 `Cache-Control: no-cache`(每次使用前必须向服务器取新版),API 响应加 `Cache-Control: no-store`。
- 用户浏览器需强制刷新一次(Ctrl+F5)以甩掉历史缓存,此后升级即时生效。
### 验证
- 在真实 NAS 上以全新浏览器完整复现建号流程(v1.4.1 修复本身有效):登录→新增会员→确定→提示"已创建会员"→列表刷新,无 JS 错误;响应头确认 `Cache-Control: no-cache` 生效。
---
## v1.4.1 (2026-09-17 22:00:00)
### 修复
- **管理页无法手动创建会员(点击确定无反应,用户报告)**:v1.4.0 将 `/api/register` 迁为客户端信封加密专用通道后,管理页"确定新增"仍在调用该已删除的直连接口——请求 404(text/plain)导致 `r.json()` 抛异常,且代码无错误捕获,表现为静默无反应。新增专用管理接口 `POST /api/admin/addmember`(管理密码保护,不受"关闭注册"开关影响,密码直接哈希入库,支持一次指定会员类型/有效期),管理页改用该接口一次调用完成建号(同时去掉了旧的"先注册再整表保存补类型"两步流程);`保存修改` 等请求补充失败提示,不再静默。
- 验证:本地 GUI 完整建号流程(弹窗→确定→列表刷新→新会员信封登录,类型/有效期/哈希全部正确)、重复/坏手机号/短密码/无 token 拒绝、关闭注册不影响管理员建号。
---
## v1.4.0 (2026-09-17 21:50:00)
### 新增(用户要求:所有端口强制 HTTPS + 更高级加密通讯)
- **全站强制 HTTPS,HTTP 彻底停用**:唯一监听为 HTTPS 端口(默认 12701,向导可改);自签证书首次启动由 OpenSSL 自动生成(存配置目录,升级保留);TLS 证书初始化失败服务拒绝启动。桌面入口 `app/ui/config` protocol 改为 https。HTTP 明文通道不存在——浏览器/客户端必须使用 https。
- **安全响应头**:HSTS(max-age 1 年)、`X-Content-Type-Options: nosniff`、`X-Frame-Options: SAMEORIGIN`。
- **应用层信封加密 `/api/enc`(第 2 层,凭据类通讯双保险)**:客户端随机 AES-256 密钥加密业务 JSON,AES 密钥用 RSA-2048 公钥封装(OAEP-SHA1)——私钥永不出服务器;HMAC-SHA256 验签防篡改;时间戳 ±5 分钟窗口 + nonce 缓存防重放。覆盖 登录/注册/查会员/改密/项目云列表/删除;项目 zip 上传/下载走 TLS 直连(大文件)。服务端 RSA 密钥对首次启动生成(PKCS8 私钥 600 权限存配置目录)。
- **`/api/pubkey`**(下发公钥+指纹)、**`/api/cert`**(下载 TLS 证书供安装信任)、`GET /api/settings` 增加 `tlsfp`/`keyfp` 指纹。
- **设置页「加密通道」卡片**:加密地址(自动取当前域名)、TLS/RSA 指纹、下载证书按钮。
- **客户端对接参考实现**:项目内新增 `客户端对接示例.cs`(.NET 3.5+ 零依赖:证书信任、TLS1.2、RSA-OAEP、AES-CBC、HMAC、信封打包解包、上传/下载,含调用示例)。
### 变更(破坏性)
- **客户端必须升级**:登录/注册/查会员/改密/项目云列表/删除 只能通过 `/api/enc` 信封加密调用;上传/下载改为 https 直连(带 `密码` 参数);不再有任何明文 HTTP 回退。业务字段与响应格式不变。
- 浏览器首次访问出现自签证书警告(下载证书安装到受信任根后消除)。
### 验证
- 本地 python 模拟客户端:信封注册/登录/改密/查会员/项目云列表删除全流程通过;重放 nonce 拒绝、篡改密文拒绝、过期时间戳拒绝;`http://` 直连失败;证书下载正常;GUI 四页 https 回归无 JS 错误。
- NAS 部署实测:证书/RSA 自动生成(新指纹)、真实会员 envelope 登录成功、项目云 7 条、磁盘无明文、http 连接被拒。
---
## v1.3.1 (2026-09-17 21:20:00)
### 修复
- **飞牛 ACL 下备份覆盖失败(EACCES)**:`备份库()` 原用 `copyFileSync` 直接覆盖已有 `.bak`,但飞牛 ACL 环境下已存在文件权限显示为 000,打开即 `EACCES`——v1.3.0 部署时迁移备份两次失败,导致 `.bak` 残留了升级前的明文密码。改为与 `写库` 一致的 tmp+rename 原子写(只需目录可写)。部署后已触发保存刷新备份,残留明文已清除(实测主库与 .bak 均无明文)。
---
## v1.3.0 (2026-09-17 21:11:00)
### 新增
- **会员密码哈希存储(客户端零改动)**:存储格式 `盐(32hex)$哈希(64hex)`,每会员独立随机盐,`sha256(盐+密码)`。传输协议完全不变——客户端仍发明文,服务端哈希后比对/存储;客户端的修改密码(/api/changepwd)、登录、项目云带密码鉴权全部照常。
- **启动自动迁移**:服务启动扫描会员库,明文密码一次性升级为哈希(先备份,成功后用哈希版刷新 `.bak`,磁盘不残留明文);NAS 真实数据已自动迁移并验证原密码可登录。
- **`/api/save` 密码语义升级**:空=保持现有密码;明文=管理员重置该会员密码(哈希入库);符合哈希格式=原样保留。
- **管理页密码列改重置式**:`type="password"` 空输入框(占位"留空不变"),不再显示任何密码内容;表头加说明提示。
### 验证
- 磁盘主库与备份全库无明文;注册/登录/改密/项目云鉴权/管理页重置密码全流程本地+NAS 实测通过;客户端协议零改动实测(原密码登录、changepwd、项目云带密码)。
---
## v1.2.0 (2026-09-17 21:00:00)
### 新增(安全加固)
- **管理密码登录(核心)**:安装向导必填 `wizard_admin_pwd`(≥6 位,sha256+盐存 `app.env`,不存明文)。`POST /api/admin/login` 换随机 token(内存 Map,24h 过期),后续请求带 `X-Admin-Token` 头。**受保护接口**:`/api/list`(会员明文密码表)、`/api/save`、`/api/settings`(GET+POST)、`/api/admin/changepwd`——查看会员密码、改库、迁移目录都必须先登录。自定义头跨站请求带不了,同时天然防 CSRF。
- **共享登录门 `www/auth.js`**:四页引入,无有效 token 时全屏遮罩要求输入管理密码;包装 fetch 对同源 `/api/` 请求自动附加 token(页面业务代码零改动);登录态存 localStorage,退出登录/改密后可重新登录。
- **项目云接口会员鉴权(需客户端配合升级)**:`/api/proj/upload`(JSON 头加 `密码`)、`/api/proj/list`、`/api/proj/download`(URL 加 `密码=`)、`/api/proj/delete`(body 加 `密码`)——会员密码匹配或管理 token 二选一通过,失败统一返回"手机号或密码错误"。管理页走 token 查任意会员数据不受影响。
- **设置页"安全"卡片**:修改管理密码、开放注册开关(`HY_REG_OPEN` 持久化到 app.env)、退出登录。
- **`GET /api/version` 公开接口**:仅返回版本号,四页徽章用,避免登录前请求敏感接口。
### 加固
- **限速**:`/api/login`、`/api/register`、`/api/admin/login` 失败按 IP 计数(内存),1 分钟内失败 ≥10 次锁 60 秒。
- **注册校验**:手机号必须 11 位(^1\d{10}$)、密码 4-64 位;开放注册可关闭。
- **上传配额**:每会员项目云总容量上限 1GB(写入前估算目录大小),超限拒绝。
- **数据备份**:整表保存(/api/save)与目录迁移前滚动写 `huiyuan.json.bak`。
### 修改
- **`cmd/install_callback` 改合并式写 app.env**:原全量重写会抹掉设置页保存的 `HY_REG_OPEN` 等键;现只覆盖 `HY_PORT`/`HY_DB_DIR`/`ADMIN_*`,其余键保留。`cmd/config_callback` 支持更新管理密码。
- **向导**:install 增加管理密码(必填);config 增加管理密码(留空=不修改)。
### 决策记录
- 会员密码哈希存储:用户确认**本期保持明文**(管理页可查看),下次要求时再改造(登录协议不变、存量自动升级的方案已评估可行)。
- 传输保持 HTTP:客户端直连无法改 TLS;管理页可远期接飞牛统一网关获得系统级保护。
- 客户端升级前项目云四接口会返回"手机号或密码错误"(老协议不带密码),客户端需按 README 对照表同步加参数。
---
## v1.1.2 (2026-09-17 13:00:00)
### 优化
- **四页面视觉统一(用户反馈布局乱)**:新增共享样式 `www/style.css`(导航/徽章/卡片/工具条/表格/按钮/输入/弹窗/设置选项块全套),admin、xiangmu-cloud、lib-cloud、settings 四页统一为同一外壳——左标题+版本徽章、右侧胶囊导航(当前页蓝色高亮)。JS 业务逻辑未动。
- **导航补齐**:admin 原来缺"库备份管理"入口,现四页导航一致(会员管理|项目云管理|库备份管理|设置);每页标题旁自动显示版本号。
- **表格页统一卡片式容器**(圆角+内嵌工具条),admin 会员表补上缺失的"操作"列表头;新增会员弹窗改为圆角+阴影+主按钮样式。
---
## v1.1.1 (2026-09-17 12:00:00)
### 删除
- **安装包不再携带任何会员数据(用户要求)**:v1.1.0 及之前的包内 `app/server/huiyuan.json` 含 2 名真实会员(手机号/密码明文),会随 fpk 分发泄露。彻底移除种子机制——删除包内种子文件、`server.cjs` 懒加载种子逻辑、`cmd/install_init` 种子复制、`.huiyuan-seeded` 标记。改为服务首次启动时若数据库缺失则创建空会员库 `{"会员": []}`。
- 清理数据目录中已无用途的 `.huiyuan-seeded` 标记写入。
### 验证
- 全新环境启动 → 自动创建空会员库;注册/登录/项目云上传/列表/迁移(连项目云)/重启持久化全流程回归通过。
- fpk 解包核验:`app.tgz` 内 server/ 仅剩 `server.cjs`,无任何会员数据。
- NAS 已重装 v1.1.1:应用目录无会员文件,用户真实数据(2 名会员 + 7 条项目云)在数据目录中原样保留。
---
## v1.1.0 (2026-09-17 00:20:00)
### 新增
- **项目云(移植自源码 2026-09-16 更新)**:4 个新 API——`/api/proj/upload`(JSON 头+空行+zip 二进制,覆盖式)、`/api/proj/list`、`/api/proj/download`、`/api/proj/delete`;上传前校验会员已注册,手机号/编号文件名安全化+防路径穿越,元数据存各项目目录 `meta.json`。
- **两个管理页(移植)**:`xiangmu-cloud.html` 项目云管理(按会员查看/下载/删除项目,过滤 LIB_ 前缀)、`lib-cloud.html` 库备份管理(只显示 LIB_ 前缀条目,解析"库名|原始路径");admin 导航合并为 会员管理|项目云管理|⚙设置,新页面也加设置链接。
- **端口/主机环境变量对齐源码**:支持 `MEMBER_PORT`/`MEMBER_HOST`(优先级 HY_PORT → MEMBER_PORT → TRIM_SERVICE_PORT → 12701)。
- **设置页显示项目云目录**:`GET /api/settings` 新增 `projroot` 字段,服务信息卡片增加"项目云目录"行。
### 修改
- **项目云存储位置改为 `DB_DIR/项目云`**(跟随数据目录设置),不放源码目录——升级会覆盖 target 目录导致数据丢失;源码版本为 ROOT/项目云,仅本地 Windows 用。
- **切换数据目录时项目云整目录一并迁移**(rename 失败自动 cpSync+rmSync 跨卷兜底,失败不回滚仅提示)。
- **设置页措辞"数据库目录"→"数据目录"**:迁移确认框说明同时迁移数据库与项目云。
### 加固
- **上传 2GB 上限**:流式累计超限即断开连接,防磁盘打满(超出正常项目/库体积,不影响使用)。
- **下载响应加 `Content-Disposition`**:`filename*` UTF-8 百分号编码 + ASCII fallback,规避中文编号文件名在响应头崩溃/乱码的坑。
### 部署记录
- NAS 升级沿用 uninstall + `install-fpk -e env`(`wizard_dbdir` 直接带入数据目录,免配置恢复);用户真实项目云数据(1 项目 + 6 库备份)已迁至 `/vol2/1000/成套报价软件数据库/项目云/`,下载字节 md5 比对一致。
- 踩坑:root 复制 ACL 目录数据到目标后必须 `chown -R fnnas.huiyuan + chmod`,且要核对层级(曾因弄平手机号一层导致列表为空)。
---
## v1.0.1 (2026-09-09 23:35:00)
### 修复
- **设置页"保存并迁移/授权新目录"按钮点击无任何效果**:`settings.html` 因 import SDK 使用了 `<script type="module">`,但按钮沿用内联 `onclick="..."`。module 作用域内定义的函数不在全局 window 上,内联 onclick 解析即抛 `ReferenceError`,POST `/api/settings` 从未发出——表现为"迁移不过去、一刷新又变回默认目录"(NAS 上 `info.log` 证实服务端从未收到迁移请求)。已改为模块内 `$('#btn-save').onclick = ...` 绑定,SDK 改为动态 `import()` 加载失败不影响其余功能。
- **自定义路径行单选按钮被拉宽错位**:CSS `.custom input { width:420px }` 误伤行内 radio(实际渲染 420px 宽)。重写设置页布局:目录选项改为可点击整行的选项块(选中高亮、radio 固定 15px、徽章标签),服务信息两栏网格,按钮分主次,响应式适配。
- **在自定义输入框打字不勾选对应单选**:新增 focus/input 捕获监听,输入即自动选中"自定义路径"并高亮。
- **安装后会员数据丢失(NAS 实测 0 名会员)**:`cmd/install_init` 的种子复制在真实安装流程中未生效(生命周期阶段数据目录/路径时序不可靠)。改为服务启动时懒加载:数据库文件缺失且无 `.huiyuan-seeded` 标记时从安装包恢复初始数据,每目录仅一次;切换目录时若新目录无库文件则落空库+标记,防止已删会员"复活"。
### 优化
- **迁移顺序改为先写新文件→回读校验→再删旧文件**:任何一步失败都不丢数据;旧文件删不掉(ACL 异常)只提示不整体回滚。
- **迁移/权限错误带具体原因**:返回错误码+消息(如 `ENOTDIR ...`),不再是笼统提示。
- **配置目录回退可视化**:`GET /api/settings` 新增 `configuredDir` 字段;配置目录不可写回退默认时,设置页显示黄色警告条说明原因。
### 打包
- **`cmd/main` 引号笔误**:`printf ... > ${PID_FILE}"` 行尾多余引号导致 bash 语法错误(v1.0.0 已修,此处记录)。
- **升级安装发现**:`appcenter-cli install-fpk` 对已装应用不执行升级(只提示 already installed),`install-local` 会先卸载导致应用丢失;正确做法是 `uninstall` + `install-fpk -e env文件`(注意:卸载会回收目录授权,需用户重新授权一次)。
---
## v1.0.0 (2026-09-09 23:00:00)
### 新增
- **首个版本**:将 `会员服务器/`(成套报价软件会员系统)打包为飞牛 fnOS 原生应用 `fnnas.huiyuan`。
- **安装向导可改端口**:`wizard/install` 收集 `wizard_port`(默认 12701),`app/ui/config` 用 `${wizard_port}` 占位符使桌面入口跟随端口;`wizard/config` 支持装后在应用设置中修改(留空=不修改)。
- **数据库目录可设置**:向导可填 `wizard_dbdir`(可选);运行时解析顺序 `HY_DB_DIR` → `TRIM_DATA_SHARE_PATHS`(应用数据目录)→ `TRIM_PKGVAR/files`,目录不可写自动降级;配置持久化于 `TRIM_PKGETC/app.env`。
- **目录授权集成**:`config/resource` 声明 `api-scope: trim.file.sharedAccess` + `micro_app=true`,后端经 Unix Socket 调 `trim.file.getSharedAccessibleFolders` 查询管理员授权目录,网页设置页可调 SDK `pickSharedFile` 一键授权。
- **网页设置页**:新增 `www/settings.html`——显示端口/版本/会员数/数据库文件完整路径,支持在默认目录/授权目录/自定义路径间切换并自动迁移 `huiyuan.json`(跨卷 rename 失败自动 copy+unlink);`www/admin.html` 加"设置"入口。
### 修改
- **绑定地址改为 0.0.0.0**:原版只绑 127.0.0.1,装到飞牛后局域网内的成套报价软件客户端无法连接。
- **6 个客户端 API 完全兼容原版**(login/register/member/changepwd/list/save),中文 JSON 字段不变。
- **服务监听失败优雅退出**:新增 `server.on('error')`,端口占用等错误输出中文原因后 exit 1(配合 `cmd/main` 启动检测)。
### 打包
- **源文件权限位修复**:从 `会员服务器/` 复制的 `huiyuan.json`、`admin.html` 等文件权限为 000(fnOS ACL 目录特性),fnpack 原样保留会导致应用用户读不到文件;打包前统一 `chmod 644`。
- **`cmd/main` 引号笔误修复**:`printf ... > ${PID_FILE}"` 行尾多余引号导致 bash 语法错误。
---
## v1.0.0 设计决定记录
- 管理页暂不加密码(用户决定,后续可升级);`/api/list`、`/api/save` 与原版一致无鉴权,依赖内网可信。
- 种子数据库 `app/server/huiyuan.json` 含现有 2 名会员,仅当目标目录无 `huiyuan.json` 时由 `cmd/install_init` 复制。
- Windows 端成套报价软件需把服务器地址从 `127.0.0.1:12701` 改为 `飞牛主机IP:端口`。
- 目录授权功能需 fnOS ≥ 1.2.0401、App ≥ 1.34.0;旧系统优雅降级(授权列表查询失败时仍可用默认目录/自定义路径)。