Repository navigation
v1.2.0
Breaking Changes
- Action/Form 类名签名校验 —
_action和_form_参数现在必须携带 HMAC 签名,未签名请求默认拒绝。新增admin.allow_unsigned_dispatch(env:ADMIN_ALLOW_UNSIGNED_DISPATCH)作为升级期临时开关,默认 false。前端 JS 无需修改,直接构造请求的外部系统需适配(参见docs/advanced/class-signing.md) - 导入预览接口移除 —
POST /dcat-api/import/preview路由及 Importerpreview()方法已删除,前端从未使用 - 全局搜索最短关键词 — 从 1 字符提升到 2 字符
- 导入配置签名格式变更 —
_import_config由base64(json|sig)改为base64(json({p,s}))envelope,避免 payload 含|时被截断;老缓存页面提交会因校验失败回退空配置,刷新页面即恢复
Added
- Octane 静态状态清理 —
Resettable接口 +FlushAdminState集成,6 个核心类实现resetState()(参见docs/advanced/octane.md) - 导入器签名负载 — Grid 渲染时把 importer / repository 类名一同 HMAC 签名传输,服务端反序列化时校验类型归属(
AbstractImporter/Repository) AbstractImporter::setRepository()/repository()— 允许在没有 Grid 的场景显式注入 repository- 全局搜索增强 — limit 参数限制 1~50,搜索提供者异常隔离
- Feature 测试基础设施 —
FeatureTestCase基类支持 HTTP 级测试 HasRequestCache::resetRequestCache()— 请求级缓存显式清理方法- Larastan 替代原生 PHPStan — 收窄忽略规则
Changed
- 菜单权限匹配 — 支持 UUID/ULID/slug 路径,RESTful 结构化位置匹配
- 上传控制器 — 公共逻辑抽到
UploadsFilestrait,新增文件校验,命名改用Str::random(32) - 路由注册 — 全部改用
[Controller::class, 'method']数组语法 - PHP 8.2+ 语法现代化 —
is_null→=== null、first-class callable、消除call_user_func、清理死代码
Fixed
ClassSigner::verify()默认拒绝未签名输入(high)— 此前b8b9420把校验失败降级为 warn+放行,等同于回退到无签名状态;攻击者只要不带签名即可绕过 HMAC 派发任意 Action(如Extensions\Uninstall)ExcelImporter::import()不再依赖 grid(high)— 此前resolveImporter()创建的 importer 从未调用setGrid(),$this->grid->model()->repository()必空指针,generic/dcat-api/import/execute真实上传时 500- 导入配置签名 pipe 截断(medium)—
decodeConfig用explode('|', ..., 2)切首个|,含required|email这类规则的 JSON 必被截断,校验失败后静默落入空配置 - 导入链路 —
ImportController::resolveImporter()缺少 Grid 上下文导致 NPE
Build
- 生产 sourcemap 关闭 —
webpack.mix.js增加mix.options({ sourceMaps: false }),配合清理 57 个孤儿.map文件,仓库瘦身约 19 MB(保留被sourceMappingURL显式引用的 4 个 colorpicker map)
Full Changelog: v1.1.31...v1.2.0