文件导入走两步:内容先经新端点 POST /api/provider-files 写进内核工作 目录的 providers/ 下(路径白名单校验,只认两个路径助手生成的形状), 成了再写 file 类型的声明——顺序反了内核重载会去读不存在的文件。 file 类型没有地址和自动更新(内核靠文件监视跟进),详情页照此展示, 编辑按钮禁用。ini 导入的取文件按钮换成同一个拖放模块。 订阅的更新间隔改成开关语义:内核只在 interval > 0 时才起定时拉取 (component/resource/fetcher.go:226-228),关掉开关就是不写这个键。 配置页加「更新所有订阅」,详情的「立刻更新」改叫「更新订阅」。 规则表从零开始写入时自动垫上内网直连——保留地址不直连的话第一条 代理规则一生效,访问局域网的流量就全进了代理;按钮改成「补全内网 直连」,只在有缺口时出现。 所有表单对话框点遮罩关闭;失败横幅右侧加关闭按钮。
12 lines
588 B
TypeScript
12 lines
588 B
TypeScript
/**
|
|
* 上传的线路/规则清单文件允许写到哪。
|
|
*
|
|
* 服务端的写文件端点只认这两种形状——它们正是 providerCachePath()(订阅缓存)
|
|
* 和 ruleProviderPath()(规则组清单)生成的路径。白名单式校验:文件名只许
|
|
* 字母数字下划线连字符,杜绝 ../、绝对路径和多余的目录层级。
|
|
* mrs 不在扩展名里:那是二进制格式,文本上传通道传不了。
|
|
*/
|
|
export function isProviderFilePath(path: string): boolean {
|
|
return /^\.\/providers\/(rules\/)?[\p{L}\p{N}_-]+\.(yaml|txt)$/u.test(path)
|
|
}
|