Files
mihomo-patchbay/shared/provider-files.test.ts
im0o 013f537eaa 订阅和规则组支持从文件导入,配置页与表单一批打磨
文件导入走两步:内容先经新端点 POST /api/provider-files 写进内核工作
目录的 providers/ 下(路径白名单校验,只认两个路径助手生成的形状),
成了再写 file 类型的声明——顺序反了内核重载会去读不存在的文件。
file 类型没有地址和自动更新(内核靠文件监视跟进),详情页照此展示,
编辑按钮禁用。ini 导入的取文件按钮换成同一个拖放模块。

订阅的更新间隔改成开关语义:内核只在 interval > 0 时才起定时拉取
(component/resource/fetcher.go:226-228),关掉开关就是不写这个键。
配置页加「更新所有订阅」,详情的「立刻更新」改叫「更新订阅」。

规则表从零开始写入时自动垫上内网直连——保留地址不直连的话第一条
代理规则一生效,访问局域网的流量就全进了代理;按钮改成「补全内网
直连」,只在有缺口时出现。

所有表单对话框点遮罩关闭;失败横幅右侧加关闭按钮。
2026-08-12 00:46:17 +08:00

23 lines
992 B
TypeScript

import { describe, expect, test } from 'bun:test'
import { isProviderFilePath } from './provider-files.ts'
describe('isProviderFilePath', () => {
test('订阅缓存和规则清单的标准形状放行', () => {
expect(isProviderFilePath('./providers/subs.yaml')).toBe(true)
expect(isProviderFilePath('./providers/rules/ads.txt')).toBe(true)
expect(isProviderFilePath('./providers/rules/直连清单.yaml')).toBe(true)
})
test('目录逃逸和绝对路径全拦', () => {
expect(isProviderFilePath('./providers/../config.yaml')).toBe(false)
expect(isProviderFilePath('providers/subs.yaml')).toBe(false)
expect(isProviderFilePath('/etc/mihomo/config.yaml')).toBe(false)
expect(isProviderFilePath('./providers/rules/../../x.yaml')).toBe(false)
expect(isProviderFilePath('./providers/a/b.yaml')).toBe(false)
})
test('mrs 是二进制格式,不走文本上传', () => {
expect(isProviderFilePath('./providers/rules/geo.mrs')).toBe(false)
})
})