feat: add hy2 validator

This commit is contained in:
divocat
2025-11-30 18:35:06 +02:00
parent 82345047cb
commit 622e092317
10 changed files with 581 additions and 81 deletions

View File

@@ -448,6 +448,90 @@ function validateSocksUrl(url) {
return { valid: true, message: _("Valid") };
}
// src/validators/validateHysteriaUrl.ts
function validateHysteria2Url(url) {
try {
const isHY2 = url.startsWith("hysteria2://");
const isHY2Short = url.startsWith("hy2://");
if (!isHY2 && !isHY2Short) {
return {
valid: false,
message: _("Invalid HY2 URL: must start with hysteria2:// or hy2://")
};
}
if (/\s/.test(url)) {
return {
valid: false,
message: _("Invalid HY2 URL: must not contain spaces")
};
}
const prefix = isHY2 ? "hysteria2://" : "hy2://";
const body = url.slice(prefix.length);
const [mainPart] = body.split("#");
const [authHostPort, queryString] = mainPart.split("?");
if (!authHostPort)
return {
valid: false,
message: _("Invalid HY2 URL: missing credentials/server")
};
const [passwordPart, hostPortPart] = authHostPort.split("@");
if (!passwordPart)
return { valid: false, message: _("Invalid HY2 URL: missing password") };
if (!hostPortPart)
return {
valid: false,
message: _("Invalid HY2 URL: missing host & port")
};
const [host, port] = hostPortPart.split(":");
if (!host) {
return { valid: false, message: _("Invalid HY2 URL: missing host") };
}
if (!port) {
return { valid: false, message: _("Invalid HY2 URL: missing port") };
}
const cleanedPort = port.replace("/", "");
const portNum = Number(cleanedPort);
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
return {
valid: false,
message: _("Invalid HY2 URL: invalid port number")
};
}
if (queryString) {
const params = parseQueryString(queryString);
const paramsKeys = Object.keys(params);
if (paramsKeys.includes("insecure") && !["0", "1"].includes(params.insecure)) {
return {
valid: false,
message: _("Invalid HY2 URL: insecure must be 0 or 1")
};
}
const validObfsTypes = ["none", "salamander"];
if (paramsKeys.includes("obfs") && !validObfsTypes.includes(params.obfs)) {
return {
valid: false,
message: _("Invalid HY2 URL: unsupported obfs type")
};
}
if (paramsKeys.includes("obfs") && params.obfs !== "none" && !params["obfs-password"]) {
return {
valid: false,
message: "Invalid HY2 URL: obfs-password required when obfs is set"
};
}
if (paramsKeys.includes("sni") && !params.sni) {
return {
valid: false,
message: "Invalid HY2 URL: sni cannot be empty"
};
}
}
return { valid: true, message: _("Valid") };
} catch (_e) {
return { valid: false, message: _("Invalid HY2 URL: parsing failed") };
}
}
// src/validators/validateProxyUrl.ts
function validateProxyUrl(url) {
const trimmedUrl = url.trim();
@@ -463,6 +547,9 @@ function validateProxyUrl(url) {
if (/^socks(4|4a|5):\/\//.test(trimmedUrl)) {
return validateSocksUrl(trimmedUrl);
}
if (trimmedUrl.startsWith("hysteria2://") || trimmedUrl.startsWith("hy2://")) {
return validateHysteria2Url(trimmedUrl);
}
return {
valid: false,
message: _(

View File

@@ -87,7 +87,7 @@ function createSectionContent(section) {
_("URLTest Proxy Links"),
);
o.depends("proxy_config_type", "urltest");
o.placeholder = "vless://, ss://, trojan://, socks4/5:// links";
o.placeholder = "vless://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links";
o.rmempty = false;
o.validate = function (section_id, value) {
// Optional

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-06 16:19+0200\n"
"PO-Revision-Date: 2025-11-06 16:19+0200\n"
"POT-Creation-Date: 2025-11-30 18:34+0200\n"
"PO-Revision-Date: 2025-11-30 18:34+0200\n"
"Last-Translator: divocat\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -281,6 +281,39 @@ msgstr "Неверный домен"
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
msgstr "Неверный формат. Используйте X.X.X.X или X.X.X.X/Y"
msgid "Invalid HY2 URL: insecure must be 0 or 1"
msgstr "Неверный URL Hysteria2: параметр insecure должен быть 0 или 1"
msgid "Invalid HY2 URL: invalid port number"
msgstr "Неверный URL Hysteria2: неверный номер порта"
msgid "Invalid HY2 URL: missing credentials/server"
msgstr "Неверный URL Hysteria2: отсутствуют учетные данные/сервер"
msgid "Invalid HY2 URL: missing host"
msgstr "Неверный URL Hysteria2: отсутствует хост"
msgid "Invalid HY2 URL: missing host & port"
msgstr "Неверный URL Hysteria2: отсутствуют хост и порт"
msgid "Invalid HY2 URL: missing password"
msgstr "Неверный URL Hysteria2: отсутствует пароль"
msgid "Invalid HY2 URL: missing port"
msgstr "Неверный URL Hysteria2: отсутствует порт"
msgid "Invalid HY2 URL: must not contain spaces"
msgstr "Неверный URL Hysteria2: не должен содержать пробелов"
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
msgstr "Неверный URL Hysteria2: должен начинаться с hysteria2:// или hy2://"
msgid "Invalid HY2 URL: parsing failed"
msgstr "Неверный URL Hysteria2: ошибка разбора"
msgid "Invalid HY2 URL: unsupported obfs type"
msgstr "Неверный URL Hysteria2: неподдерживаемый тип obfs"
msgid "Invalid IP address"
msgstr "Неверный IP-адрес"
@@ -626,9 +659,6 @@ msgstr "Тестирование задержки"
msgid "Text List"
msgstr "Текстовый список"
msgid "Text List (comma/space/newline separated)"
msgstr "Текстовый список (через запятую, пробел или новую строку)"
msgid "The DNS server used to look up the IP address of an upstream DNS server"
msgstr "DNS-сервер, используемый для поиска IP-адреса вышестоящего DNS-сервера"

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-06 14:19+0200\n"
"PO-Revision-Date: 2025-11-06 14:19+0200\n"
"POT-Creation-Date: 2025-11-30 16:34+0200\n"
"PO-Revision-Date: 2025-11-30 16:34+0200\n"
"Last-Translator: divocat <divocatt@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -16,23 +16,23 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: src/podkop/tabs/dashboard/initController.ts:342
#: src/podkop/tabs/dashboard/initController.ts:345
msgid "✔ Enabled"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:353
#: src/podkop/tabs/dashboard/initController.ts:356
msgid "✔ Running"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:343
#: src/podkop/tabs/dashboard/initController.ts:346
msgid "✘ Disabled"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:354
#: src/podkop/tabs/dashboard/initController.ts:357
msgid "✘ Stopped"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:304
#: src/podkop/tabs/dashboard/initController.ts:307
msgid "Active Connections"
msgstr ""
@@ -236,8 +236,8 @@ msgstr ""
msgid "Dont Touch My DHCP!"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:238
#: src/podkop/tabs/dashboard/initController.ts:272
#: src/podkop/tabs/dashboard/initController.ts:241
#: src/podkop/tabs/dashboard/initController.ts:275
msgid "Downlink"
msgstr ""
@@ -390,6 +390,50 @@ msgstr ""
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:73
msgid "Invalid HY2 URL: insecure must be 0 or 1"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:62
msgid "Invalid HY2 URL: invalid port number"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:32
msgid "Invalid HY2 URL: missing credentials/server"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:49
msgid "Invalid HY2 URL: missing host"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:43
msgid "Invalid HY2 URL: missing host & port"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:38
msgid "Invalid HY2 URL: missing password"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:53
msgid "Invalid HY2 URL: missing port"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:19
msgid "Invalid HY2 URL: must not contain spaces"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:12
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:103
msgid "Invalid HY2 URL: parsing failed"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:82
msgid "Invalid HY2 URL: unsupported obfs type"
msgstr ""
#: src/validators/validateIp.ts:11
msgid "Invalid IP address"
msgstr ""
@@ -527,7 +571,7 @@ msgstr ""
msgid "Main DNS"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:308
#: src/podkop/tabs/dashboard/initController.ts:311
msgid "Memory Usage"
msgstr ""
@@ -613,7 +657,7 @@ msgstr ""
msgid "Pending"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:340
#: src/podkop/tabs/dashboard/initController.ts:343
msgid "Podkop"
msgstr ""
@@ -766,7 +810,7 @@ msgstr ""
msgid "Select the WAN interfaces to be monitored"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:337
#: src/podkop/tabs/dashboard/initController.ts:340
msgid "Services info"
msgstr ""
@@ -779,7 +823,7 @@ msgstr ""
msgid "Show sing-box config"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:351
#: src/podkop/tabs/dashboard/initController.ts:354
msgid "Sing-box"
msgstr ""
@@ -844,7 +888,7 @@ msgstr ""
msgid "Successfully copied!"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:301
#: src/podkop/tabs/dashboard/initController.ts:304
msgid "System info"
msgstr ""
@@ -861,11 +905,8 @@ msgid "Test latency"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:368
msgid "Text List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/section.js:448
msgid "Text List (comma/space/newline separated)"
msgid "Text List"
msgstr ""
#: ../luci-app-podkop/htdocs/luci-static/resources/view/podkop/settings.js:46
@@ -888,11 +929,11 @@ msgstr ""
msgid "Time in seconds for DNS record caching (default: 60)"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:235
#: src/podkop/tabs/dashboard/initController.ts:238
msgid "Traffic"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:265
#: src/podkop/tabs/dashboard/initController.ts:268
msgid "Traffic Total"
msgstr ""
@@ -931,12 +972,12 @@ msgstr ""
msgid "Unknown error"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:237
#: src/podkop/tabs/dashboard/initController.ts:268
#: src/podkop/tabs/dashboard/initController.ts:240
#: src/podkop/tabs/dashboard/initController.ts:271
msgid "Uplink"
msgstr ""
#: src/validators/validateProxyUrl.ts:29
#: src/validators/validateProxyUrl.ts:37
msgid "URL must start with vless://, ss://, trojan://, or socks4/5://"
msgstr ""
@@ -992,6 +1033,7 @@ msgstr ""
#: src/validators/validateDns.ts:18
#: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30
#: src/validators/validateHysteriaUrl.ts:101
#: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:7
#: src/validators/validatePath.ts:16