feat: добавлены функции для работы с пользовательскими rule-sets

Добавлены новые API-методы для получения и сохранения пользовательских rule-sets. Обновлены компоненты для работы с этими данными, включая интерфейс для добавления и удаления rule-sets.

Refs: None
This commit is contained in:
2026-05-08 19:49:44 +03:00
parent 3e18b833c6
commit 27b71077b1
7 changed files with 283 additions and 21 deletions

View File

@@ -309,6 +309,9 @@ function normalizeCustomRules(input) {
networks: normalizeList(rule.networks).filter((network) =>
["tcp", "udp"].includes(network),
),
ruleSets: normalizeList(rule.ruleSets).filter((tag) =>
/^[a-z0-9][a-z0-9-]*$/i.test(tag),
),
}));
}
@@ -424,6 +427,28 @@ async function handleApi(req, res) {
});
}
if (req.method === "GET" && req.url === "/api/rule-sets") {
return sendJson(res, 200, {
success: true,
ruleSets: readJson(settings.customRuleSetsPath, []),
});
}
if (req.method === "PUT" && req.url === "/api/rule-sets") {
const body = await readBody(req);
const rawSets = Array.isArray(body.ruleSets) ? body.ruleSets : [];
const normalized = rawSets
.filter((rs) => rs && rs.tag && rs.url)
.map((rs) => ({
tag: String(rs.tag).trim(),
url: String(rs.url).trim(),
format: rs.format === "source" ? "source" : "binary",
}))
.filter((rs) => /^[a-z0-9][a-z0-9-]*$/i.test(rs.tag));
writeJson(settings.customRuleSetsPath, normalized);
return sendJson(res, 200, { success: true, ruleSets: normalized });
}
if (req.method === "POST" && req.url === "/api/route/check") {
const body = await readBody(req);
const host = String(body.host || "").trim();