mole404
|
8137ee1e04
|
fix(install): 安装向导默认数据库类型改为 SQLite;README 挂载路径改用 $PWD
两件事:
1) 安装向导(src/resources/views/install.blade.php)
· 数据库类型的选项顺序:SQLite 提到第一个(= 浏览器默认选中),MySQL/PostgreSQL/SQL Server 保持原序。
镜像自带 pdo_sqlite,开箱即用;README 第 55 行本来就写着「默认 SQLite」,这次把代码对齐文档。
· 页面加载时主动触发一次 change:那个 change 处理器同时负责「按类型显示/隐藏连接字段」,
不触发的话默认选中的 SQLite 旁边还挂着 MySQL 那套字段(127.0.0.1 / 3306 / root)与端口,
看着像选错了,SQLite 的说明文字也不会出现。
· tools/diff-vs-upstream.sh 的 KNOWN_DEVIATIONS 里该文件的理由补上这一条(文件本来就在清单里)。
2) README(只改文档,不动任何 compose 文件)
· 挂载卷路径 /root/lsky-pro/data → $PWD/data(compose 片段)与 "$PWD/data:/var/www/html"(docker run 片段);
仓库自带的 docker-compose.yaml 本来就用 $PWD/web 这套写法,风格统一。
· 补一句提醒:compose 文件里别写 ~(不经过 shell 不会展开)。
|
2026-10-02 19:18:56 +08:00 |
|
mole404
|
c242bfb12c
|
fix(tags): 代码审查发现的 6 条问题全修 + 补真机/静态断言
审查(含新加的打标部分)发现并修掉:
1. 改名/删除标签会清空选中 ✗ —— refreshAfterTagChange() 走 setTags() → resetImages(),
会清空图片墙并 ds.clearSelection(),把用户正在打标的这批图连同弹窗勾选态一起丢掉
(老师问过的「编辑/删除会整页刷新」)。改为 patchCardsTag() 就地同步(卡片角标 + data-json
+ 详情卡 chip);只有「被删的标签正用作筛选项」这种结果集真的变了的情况才调 setTags()。
2. 删图片/删用户不清 image_tag / tags ✗ —— 两个迁移的注释都写着「关联行由应用代码显式删除」,
图片这条路径没落实,残留行会无声累积。UserService::deleteImages() 补 detach();
后台删用户时一并清标签与关联行。(本机 SQLite 未启用 PRAGMA foreign_keys,不能指望级联。)
附带 tools/check-tag-integrity.php:只读自检残留行,退出码非 0 即为异常。
3. 标签名进 data-json(单引号属性)未转义 ✗ —— 名字里带 ' 就能提前闭合属性(自伤型 XSS 面)。
三处注入(列表渲染 / 弹窗行 / syncCardTags)统一先 escapeHtml 再写。
4. 弹窗里几个 axios 调用没有 catch ✗ —— 网络错误或 422(名字超 64 字)会静默无反应。
统一走 apiErrMsg() 取后端 message;三个标签名输入框补 maxlength=64。
5. 后端 trim() 在校验之后 ✗ —— 只输入空格会建出空名标签。TagRequest 加 prepareForValidation()。
6. 两处硬编码路径 ✗(action="/user/tags/__id__"、axios.delete('/user/tags/'+id))→ 改用 route()。
测试:
- jsdom 118/118(新增 7 条:改名的局部同步、data-json 转义、maxlength+catch、
deleteImages/删用户的清理、TagRequest trim;测试台补 renderTagRoutes 渲染带 id 的路由)。
- 真机 70/70(新增 #2c:改标签名后选中不丢 / 图片墙不重载 / 角标就地换名,
6 项断言,在整轮末尾单开 context 跑,避免本机 1vCPU/965MB 下的页面 OOM)。
- 真机实证:图片挂 1 条关联 → deleteImages → 残留 0;check-tag-integrity.php 干净 ✓。
- tools/diff-vs-upstream.sh:已知偏离清单补登 UserService.php / Admin\UserController.php,
校验通过(103 项,恰好等于实际偏差)。
- patches/ios-longpress.patch 按原范围(3 个文件)重新生成。
|
2026-10-02 14:59:40 +08:00 |
|
mole404
|
51b6658007
|
feat(tags): 图库标签适配(筛选/详情/角标/批量修改/标签管理)+ 下线「图片权限」界面口径
界面侧
- 图库页:原「设置权限」按钮、权限筛选下拉、详情卡「权限」行全部下线,换成标签:
顶部标签多选筛选(后端 AND,带「清除筛选」)、详情卡标签行(可增/可删/现场新建)、
卡片左下角标签角标(pointer-events-none,不抢选中与预览)、批量「修改标签」
(桌面工具栏 + 手机 ⋯ 菜单两套入口,行内 44px,添加/移除三态循环)
- 新增「标签管理」弹窗:新建 / 重命名 / 删除(删除二次确认,文案说明会从所有图片上移除);
入口两处:标签筛选下拉底部「管理标签」、图片右键菜单「管理标签」
- 用户设置页删掉「图片默认权限」整块;后台图片页删详情「权限」行与搜索语法
is:public/is:private 帮助行;接口文档删 permission 参数行
- 连带:UserSettingRequest 的 configs.default_permission 由 required 放宽为 nullable
(表单不再提交该项,不放宽则保存设置直接 422;上传默认权限仍取库里已有值)
- 后台搜索后端也不再见识别 is:public / is:private(删除该 match 分支与 ImagePermission 引用)
后端
- permission 列与既有接口形状保持不动;仅 ImageController 的列表/详情序列化补 tags 字段
(卡片角标与详情卡需要),标签相关接口沿用上一步已就绪的 GET/POST/PUT/DELETE user/tags
与 PUT user/images/tags
测试与产物
- 新增 test/tag-feature.test.mjs(88 条:静态契约 + jsdom 行为,含筛选 AND/清除、详情增删新建、
批量三态与 payload、标签管理增删改、右键菜单注入、文案标准化、无「公开/私有」残留)
- images-modal / swal-theme 里钉住旧「权限」口径的断言随之更新
- 重建前端产物(public/css/app.css),重钉 Dockerfile 自证 md5(routes/web.php、
images.blade.php 与 .code-revision),重生成 patches/ios-longpress.patch
- tools/diff-vs-upstream.sh 的已知偏离清单补登记本批改动文件
|
2026-10-01 22:02:03 +08:00 |
|
mole404
|
9ca9d9aa57
|
fix(security): 收窄信任代理,堵住伪造 X-Forwarded-For 绕过按 IP 限流
上游默认 $proxies = '*'(信任所有转发头)。而外层 nginx 用的是
$proxy_add_x_forwarded_for —— 追加而不是覆盖 —— 客户端自己带的
X-Forwarded-For 会排在列表最前面,Laravel 取客户端 IP 时又会采信它。
于是所有按 IP 限流的地方(Breeze 登录失败计数、throttle 中间件)都能靠
伪造一个头无限重置:实测写 '*' 时应用解析出的客户端 IP 就是伪造进去的值
(1.2.3.4),改成下面这组之后解析出真实客户端(203.0.113.9)。
- $proxies 改为 ['127.0.0.1', '::1', '172.16.0.0/12', '10.0.0.0/8', '192.168.0.0/16']:
只列私有网段而不是写死某个网关 IP —— 容器网络重建后网关会变,写死会静默失效
(届时应用不再认转发头,所有人被当成同一个 IP)。公网攻击者不可能以私有地址
连进来,所以这样信任是安全的:从右往左找第一个不受信地址,得到的仍是真实客户端。
- 实测副作用检查:HTTPS 判定不受影响(X-Forwarded-Proto 仍被采信),
正常用户解析出的客户端 IP 与改动前完全一致(只是伪造的头不再生效)。
- 已登记进 tools/diff-vs-upstream.sh 的已知偏离清单(第 9 组),README 同步。
|
2026-09-30 08:34:42 +08:00 |
|
mole404
|
5020c4f01a
|
ci,ui,docs: 响应头断言 + 真升级用例基线动态化 + 钉 SHA 升级 + 顶栏对齐微调
CI:
- Verify published image 步骤新增两条断言:响应头不得出现 X-Powered-By、Server 不得带
具体版本号(沿用『先落文件再 grep』,不碰 SIGPIPE 那个坑);两条都双向验证过
(只注 PHP ini 或只注 Apache conf 都会红)。
- setup-node 换到 v7.0.0(node24)、upload-artifact 换到 v7.0.1(node24),
同时清掉第三个 workflow update-composer-lock.yaml 里那个 node20 的 upload-artifact;
其余 docker/* 与 checkout 本来就是 node24,不动。全部钉不可移动的 commit SHA。
- tools/upgrade-test.sh:真升级用例的基线从写死的 tag 改成动态解析(匿名读 GHCR
tags/list,逐个查镜像 config 的 created 时间取最新,并排除本次 commit 与自身),
不依赖 tags/list 的返回顺序;解析失败明确失败(不再静默变绿),仍可用仓库变量覆盖。
防漂移校验(tag 名里的 sha vs 镜像自带 .code-revision 的 fork_sha)原样保留。
顶栏(src/resources/views/layouts/header.blade.php):
- 折叠按钮 44×44 → 32×32(mt-3 保持 56px 顶栏内垂直居中)。
- 标题组的 pl-10 位置补偿改为 pl-4 md:pl-0:顶栏与页面内容共用同一个 x-container、
同断点内边距相同,所以 md 以上去掉补偿即等于内容左缘(实测 Δ=0.0);
窄屏内容左缘落在按钮底下,物理无法对齐,退回 pl-4(按钮右缘 +8px)。
- 已重建前端产物(public/css/app.css,新增 .pl-4/.pl-0/md:pl-0),钉住产物未变。
工具/文档:
- KNOWN_DEVIATIONS 同步到本轮全部有意偏离;README 补差异清单、CI 说明与验收清单。
|
2026-09-30 08:00:46 +08:00 |
|
mole404
|
5865d04816
|
docs(tools): diff-vs-upstream 改为已知偏离清单,README 同步
旧判据是『除三个补丁文件外不许有别处与上游不同』,而上游之后整个前端换过,
实际有意偏离已达 92 个文件 → 旧脚本会把它们全报成手滑改动。
改成按 7 组写明每个文件为什么偏离的已知偏离清单:内容不同的集合必须恰好落在清单内,
否则失败;并额外报告『登记了但已无差异』的过时条目。
|
2026-09-30 07:20:43 +08:00 |
|
mole404
|
7c3188e25a
|
refactor(源码): 应用源码 vendored 进 src/ + 上游 pin 升级到 38d52c46(2025-11-24)
上一版是「钉死上游 commit、构建时拉 archive、再用 overlay/ 叠加补丁」。但上游已明示停止维护
(README 里 2024-12-28 起挂着警告:「开源版本已停止维护,不再进行新特性更新和 bug 修复」),
所以把源码放进本仓库:构建不再依赖 github.com/lsky-org 长期可用,之后要改 PHP 代码直接改
src/ 提交即可,不必再维护叠加机制。
1) 上游 pin:911275c(2023-05-16)→ 38d52c4609eb85236b45ac75acac2ced55174953(2025-11-24)。
中间 32 个提交只动了 9 个文件,**数据库迁移 0 处**,所以升级不碰站点数据(SQLite 结构不变)。
吃进三个真实修复:图片格式转换时不同图片共用同一个临时文件(并发上传会变成同一张图,
默认配置即触发)、加水印后丢质量参数、SVG 支持;另有 laravel 9.52.4→9.52.17、
phpseclib 3.0.19→3.0.43、commonmark 2.3.9→2.6.0、aws-sdk-php 等一串依赖安全升级。
2) vendored 源码:src/ = 上游 38d52c46 的完整树(304 个文件、8.1MB,按 commit 精确复制,
文件数与上游 git 树一致)。我们的三个补丁文件就地打上补丁,取消 overlay/。
3) Dockerfile:去掉 curl 下载 archive 那一层,改成 COPY src/;自证拆成两组 ——
「自证 1 上游纯净性」ImageService.php / convention.php / public/index.php / routes/web.php /
composer.lock 必须等于上游 md5;「自证 2 补丁产物」三个补丁文件 md5 + 关键标记 grep。
快照被误改、补丁丢了,构建期就拦下。
4) 新增维护脚本:tools/diff-vs-upstream.sh(拉上游快照做全树对比 + 白名单校验:除三个补丁文件
外不许有别的改动,同时可重生成 patches/ios-longpress.patch)、tools/vendor-upstream.sh
(换 pin 时重新 vendor,自动保留补丁文件并打印上游侧差异)。
5) 测试与文档:jsdom 测试默认路径改指 src/public/js/context-js/context-js.js,新增两条结构自检
(两份 context-js.js 必须一致、blade 必须带 ?v= 版本串)→ 70/70 通过;README 重写
「代码在仓库哪里、怎么改、怎么升 pin」,并修正许可证说明(应用 GPL-3.0 / 打包 AGPL-3.0)。
数据安全逻辑一字未动:entrypoint.sh 仍是「版本标记不一致才同步」,排除
.env / storage / database / bootstrap/cache / public/i。换镜像后容器自动把新代码同步进卷。
|
2026-09-28 22:36:48 +08:00 |
|