/** * 上传的线路/规则清单文件允许写到哪。 * * 服务端的写文件端点只认这两种形状——它们正是 providerCachePath()(订阅缓存) * 和 ruleProviderPath()(规则组清单)生成的路径。白名单式校验:文件名只许 * 字母数字下划线连字符,杜绝 ../、绝对路径和多余的目录层级。 * mrs 不在扩展名里:那是二进制格式,文本上传通道传不了。 */ export function isProviderFilePath(path: string): boolean { return /^\.\/providers\/(rules\/)?[\p{L}\p{N}_-]+\.(yaml|txt)$/u.test(path) }