Support HTTP proxy outbounds

This commit is contained in:
ushan0v
2026-06-10 07:00:34 +03:00
parent 2135dce035
commit 8307adc1e0
18 changed files with 676 additions and 109 deletions
+112 -31
View File
@@ -11,16 +11,16 @@
"call": "✔ Running",
"key": "✔ Running",
"places": [
"src/podkop/tabs/dashboard/initController.ts:888",
"src/podkop/tabs/dashboard/initController.ts:899"
"src/podkop/tabs/dashboard/initController.ts:893",
"src/podkop/tabs/dashboard/initController.ts:904"
]
},
{
"call": "✘ Stopped",
"key": "✘ Stopped",
"places": [
"src/podkop/tabs/dashboard/initController.ts:889",
"src/podkop/tabs/dashboard/initController.ts:900"
"src/podkop/tabs/dashboard/initController.ts:894",
"src/podkop/tabs/dashboard/initController.ts:905"
]
},
{
@@ -57,7 +57,7 @@
"call": "Active Connections",
"key": "Active Connections",
"places": [
"src/podkop/tabs/dashboard/initController.ts:846"
"src/podkop/tabs/dashboard/initController.ts:851"
]
},
{
@@ -396,7 +396,7 @@
"src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27",
"src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:162",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:48",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:31",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25",
"src/podkop/tabs/diagnostic/checks/runZapret2Check.ts:27",
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:27"
@@ -440,7 +440,7 @@
"src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15",
"src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:150",
"src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:34",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:17",
"src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13",
"src/podkop/tabs/diagnostic/checks/runZapret2Check.ts:15",
"src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:15"
@@ -624,7 +624,7 @@
"call": "Connectivity probe failed",
"key": "Connectivity probe failed",
"places": [
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:137"
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:125"
]
},
{
@@ -895,8 +895,8 @@
"call": "Downlink",
"key": "Downlink",
"places": [
"src/podkop/tabs/dashboard/initController.ts:772",
"src/podkop/tabs/dashboard/initController.ts:810"
"src/podkop/tabs/dashboard/initController.ts:777",
"src/podkop/tabs/dashboard/initController.ts:815"
]
},
{
@@ -1149,12 +1149,12 @@
"call": "Failed to execute",
"key": "Failed to execute",
"places": [
"src/podkop/methods/shell/index.ts:171",
"src/podkop/methods/shell/index.ts:178",
"src/podkop/tabs/updates/initController.ts:466",
"src/podkop/tabs/updates/initController.ts:467",
"src/podkop/tabs/updates/initController.ts:527",
"src/podkop/tabs/updates/initController.ts:677"
"src/podkop/tabs/updates/initController.ts:677",
"src/podkop/methods/shell/index.ts:171",
"src/podkop/methods/shell/index.ts:178"
]
},
{
@@ -1210,7 +1210,9 @@
"key": "Fastest",
"places": [
"src/podkop/methods/custom/getDashboardSections.ts:313",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:93"
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:77",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:78",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:90"
]
},
{
@@ -1456,6 +1458,83 @@
"src/validators/validateSubnet.ts:11"
]
},
{
"call": "Invalid HTTP proxy URL: invalid host and port",
"key": "Invalid HTTP proxy URL: invalid host and port",
"places": [
"src/validators/validateHttpProxyUrl.ts:58"
]
},
{
"call": "Invalid HTTP proxy URL: invalid host format",
"key": "Invalid HTTP proxy URL: invalid host format",
"places": [
"src/validators/validateHttpProxyUrl.ts:90"
]
},
{
"call": "Invalid HTTP proxy URL: invalid port number",
"key": "Invalid HTTP proxy URL: invalid port number",
"places": [
"src/validators/validateHttpProxyUrl.ts:80"
]
},
{
"call": "Invalid HTTP proxy URL: missing host and port",
"key": "Invalid HTTP proxy URL: missing host and port",
"places": [
"src/validators/validateHttpProxyUrl.ts:50"
]
},
{
"call": "Invalid HTTP proxy URL: missing hostname or IP",
"key": "Invalid HTTP proxy URL: missing hostname or IP",
"places": [
"src/validators/validateHttpProxyUrl.ts:65"
]
},
{
"call": "Invalid HTTP proxy URL: missing port",
"key": "Invalid HTTP proxy URL: missing port",
"places": [
"src/validators/validateHttpProxyUrl.ts:72"
]
},
{
"call": "Invalid HTTP proxy URL: missing username",
"key": "Invalid HTTP proxy URL: missing username",
"places": [
"src/validators/validateHttpProxyUrl.ts:42"
]
},
{
"call": "Invalid HTTP proxy URL: must not contain spaces",
"key": "Invalid HTTP proxy URL: must not contain spaces",
"places": [
"src/validators/validateHttpProxyUrl.ts:19"
]
},
{
"call": "Invalid HTTP proxy URL: must start with http:// or https://",
"key": "Invalid HTTP proxy URL: must start with http:// or https://",
"places": [
"src/validators/validateHttpProxyUrl.ts:10"
]
},
{
"call": "Invalid HTTP proxy URL: parsing failed",
"key": "Invalid HTTP proxy URL: parsing failed",
"places": [
"src/validators/validateHttpProxyUrl.ts:96"
]
},
{
"call": "Invalid HTTP proxy URL: path, query, and fragment are not supported",
"key": "Invalid HTTP proxy URL: path, query, and fragment are not supported",
"places": [
"src/validators/validateHttpProxyUrl.ts:27"
]
},
{
"call": "Invalid HY2 URL: insecure must be 0 or 1",
"key": "Invalid HY2 URL: insecure must be 0 or 1",
@@ -1975,7 +2054,7 @@
"call": "Memory Usage",
"key": "Memory Usage",
"places": [
"src/podkop/tabs/dashboard/initController.ts:850"
"src/podkop/tabs/dashboard/initController.ts:855"
]
},
{
@@ -2202,9 +2281,10 @@
"call": "Not responding",
"key": "Not responding",
"places": [
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:109",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:115",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:143"
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:78",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:90",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:103",
"src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:131"
]
},
{
@@ -3063,9 +3143,9 @@
"call": "Service action failed",
"key": "Service action failed",
"places": [
"src/podkop/tabs/diagnostic/initController.ts:571",
"src/podkop/methods/shell/index.ts:380",
"src/podkop/methods/shell/index.ts:401",
"src/podkop/tabs/diagnostic/initController.ts:571"
"src/podkop/methods/shell/index.ts:401"
]
},
{
@@ -3079,7 +3159,7 @@
"call": "Services info",
"key": "Services info",
"places": [
"src/podkop/tabs/dashboard/initController.ts:883"
"src/podkop/tabs/dashboard/initController.ts:888"
]
},
{
@@ -3358,7 +3438,7 @@
"call": "System info",
"key": "System info",
"places": [
"src/podkop/tabs/dashboard/initController.ts:843"
"src/podkop/tabs/dashboard/initController.ts:848"
]
},
{
@@ -3550,7 +3630,7 @@
"call": "Traffic",
"key": "Traffic",
"places": [
"src/podkop/tabs/dashboard/initController.ts:769",
"src/podkop/tabs/dashboard/initController.ts:774",
"src/podkop/tabs/dashboard/partials/renderSections.ts:216"
]
},
@@ -3558,7 +3638,7 @@
"call": "Traffic Total",
"key": "Traffic Total",
"places": [
"src/podkop/tabs/dashboard/initController.ts:803"
"src/podkop/tabs/dashboard/initController.ts:808"
]
},
{
@@ -3796,8 +3876,8 @@
"call": "Uplink",
"key": "Uplink",
"places": [
"src/podkop/tabs/dashboard/initController.ts:771",
"src/podkop/tabs/dashboard/initController.ts:806"
"src/podkop/tabs/dashboard/initController.ts:776",
"src/podkop/tabs/dashboard/initController.ts:811"
]
},
{
@@ -3809,10 +3889,10 @@
]
},
{
"call": "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://",
"key": "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://",
"call": "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://",
"key": "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://",
"places": [
"src/validators/validateProxyUrl.ts:42"
"src/validators/validateProxyUrl.ts:47"
]
},
{
@@ -3975,6 +4055,7 @@
"src/validators/validateDns.ts:18",
"src/validators/validateDomain.ts:13",
"src/validators/validateDomain.ts:30",
"src/validators/validateHttpProxyUrl.ts:100",
"src/validators/validateHysteriaUrl.ts:154",
"src/validators/validateIp.ts:8",
"src/validators/validateOutboundJson.ts:7",
@@ -4041,8 +4122,8 @@
]
},
{
"call": "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links",
"key": "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links",
"call": "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links",
"key": "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links",
"places": [
"../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:3384"
]
+77 -29
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-08 23:39+0300\n"
"PO-Revision-Date: 2026-06-08 23:39+0300\n"
"POT-Creation-Date: 2026-06-10 03:49+0300\n"
"PO-Revision-Date: 2026-06-10 03:49+0300\n"
"Last-Translator: ushan0v <ushanov2204@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -21,13 +21,13 @@ msgstr ""
msgid "-- Select --"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:888
#: src/podkop/tabs/dashboard/initController.ts:899
#: src/podkop/tabs/dashboard/initController.ts:893
#: src/podkop/tabs/dashboard/initController.ts:904
msgid "✔ Running"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:889
#: src/podkop/tabs/dashboard/initController.ts:900
#: src/podkop/tabs/dashboard/initController.ts:894
#: src/podkop/tabs/dashboard/initController.ts:905
msgid "✘ Stopped"
msgstr ""
@@ -49,7 +49,7 @@ msgstr ""
msgid "Active"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:846
#: src/podkop/tabs/dashboard/initController.ts:851
msgid "Active Connections"
msgstr ""
@@ -247,7 +247,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:162
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:48
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:31
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25
#: src/podkop/tabs/diagnostic/checks/runZapret2Check.ts:27
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:27
@@ -276,7 +276,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:150
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:34
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:17
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runZapret2Check.ts:15
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:15
@@ -391,7 +391,7 @@ msgstr ""
msgid "Connections are unavailable"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:137
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:125
msgid "Connectivity probe failed"
msgstr ""
@@ -548,8 +548,8 @@ msgstr ""
msgid "Dont Touch My DHCP!"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:772
#: src/podkop/tabs/dashboard/initController.ts:810
#: src/podkop/tabs/dashboard/initController.ts:777
#: src/podkop/tabs/dashboard/initController.ts:815
msgid "Downlink"
msgstr ""
@@ -697,12 +697,12 @@ msgstr ""
msgid "Failed to copy!"
msgstr ""
#: src/podkop/methods/shell/index.ts:171
#: src/podkop/methods/shell/index.ts:178
#: src/podkop/tabs/updates/initController.ts:466
#: src/podkop/tabs/updates/initController.ts:467
#: src/podkop/tabs/updates/initController.ts:527
#: src/podkop/tabs/updates/initController.ts:677
#: src/podkop/methods/shell/index.ts:171
#: src/podkop/methods/shell/index.ts:178
msgid "Failed to execute"
msgstr ""
@@ -737,7 +737,9 @@ msgid "Fallback on unknown DC"
msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:313
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:93
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:77
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:78
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:90
msgid "Fastest"
msgstr ""
@@ -882,6 +884,50 @@ msgstr ""
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:58
msgid "Invalid HTTP proxy URL: invalid host and port"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:90
msgid "Invalid HTTP proxy URL: invalid host format"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:80
msgid "Invalid HTTP proxy URL: invalid port number"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:50
msgid "Invalid HTTP proxy URL: missing host and port"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:65
msgid "Invalid HTTP proxy URL: missing hostname or IP"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:72
msgid "Invalid HTTP proxy URL: missing port"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:42
msgid "Invalid HTTP proxy URL: missing username"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:19
msgid "Invalid HTTP proxy URL: must not contain spaces"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:10
msgid "Invalid HTTP proxy URL: must start with http:// or https://"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:96
msgid "Invalid HTTP proxy URL: parsing failed"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:27
msgid "Invalid HTTP proxy URL: path, query, and fragment are not supported"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:107
msgid "Invalid HY2 URL: insecure must be 0 or 1"
msgstr ""
@@ -1181,7 +1227,7 @@ msgstr ""
msgid "Maximum response time delta in milliseconds"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:850
#: src/podkop/tabs/dashboard/initController.ts:855
msgid "Memory Usage"
msgstr ""
@@ -1315,9 +1361,10 @@ msgstr ""
msgid "Not required for this listen address"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:109
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:115
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:143
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:78
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:90
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:103
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:131
msgid "Not responding"
msgstr ""
@@ -1816,9 +1863,9 @@ msgstr ""
msgid "Servers with names matching these regular expressions will not be tested by URLTest"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:571
#: src/podkop/methods/shell/index.ts:380
#: src/podkop/methods/shell/index.ts:401
#: src/podkop/tabs/diagnostic/initController.ts:571
msgid "Service action failed"
msgstr ""
@@ -1826,7 +1873,7 @@ msgstr ""
msgid "Service list"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:883
#: src/podkop/tabs/dashboard/initController.ts:888
msgid "Services info"
msgstr ""
@@ -1988,7 +2035,7 @@ msgstr ""
msgid "Successfully copied!"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:843
#: src/podkop/tabs/dashboard/initController.ts:848
msgid "System info"
msgstr ""
@@ -2102,12 +2149,12 @@ msgstr ""
msgid "tiny"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:769
#: src/podkop/tabs/dashboard/initController.ts:774
#: src/podkop/tabs/dashboard/partials/renderSections.ts:216
msgid "Traffic"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:803
#: src/podkop/tabs/dashboard/initController.ts:808
msgid "Traffic Total"
msgstr ""
@@ -2252,8 +2299,8 @@ msgstr ""
msgid "Update subscriptions"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:771
#: src/podkop/tabs/dashboard/initController.ts:806
#: src/podkop/tabs/dashboard/initController.ts:776
#: src/podkop/tabs/dashboard/initController.ts:811
msgid "Uplink"
msgstr ""
@@ -2262,8 +2309,8 @@ msgstr ""
msgid "Uploaded"
msgstr ""
#: src/validators/validateProxyUrl.ts:42
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://"
#: src/validators/validateProxyUrl.ts:47
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://"
msgstr ""
#: src/validators/validateUrl.ts:17
@@ -2362,6 +2409,7 @@ msgstr ""
#: src/validators/validateDns.ts:18
#: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30
#: src/validators/validateHttpProxyUrl.ts:100
#: src/validators/validateHysteriaUrl.ts:154
#: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:7
@@ -2408,7 +2456,7 @@ msgid "VLESS flow"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:3384
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:70
+39 -6
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-08 02:39+0300\n"
"PO-Revision-Date: 2026-06-08 02:39+0300\n"
"POT-Creation-Date: 2026-06-10 06:49+0300\n"
"PO-Revision-Date: 2026-06-10 06:49+0300\n"
"Last-Translator: ushan0v\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -608,6 +608,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 HTTP proxy URL: invalid host and port"
msgstr "Неверный URL HTTP proxy: неверный хост и порт"
msgid "Invalid HTTP proxy URL: invalid host format"
msgstr "Неверный URL HTTP proxy: неверный формат хоста"
msgid "Invalid HTTP proxy URL: invalid port number"
msgstr "Неверный URL HTTP proxy: неверный номер порта"
msgid "Invalid HTTP proxy URL: missing host and port"
msgstr "Неверный URL HTTP proxy: отсутствуют хост и порт"
msgid "Invalid HTTP proxy URL: missing hostname or IP"
msgstr "Неверный URL HTTP proxy: отсутствует имя хоста или IP-адрес"
msgid "Invalid HTTP proxy URL: missing port"
msgstr "Неверный URL HTTP proxy: отсутствует порт"
msgid "Invalid HTTP proxy URL: missing username"
msgstr "Неверный URL HTTP proxy: отсутствует имя пользователя"
msgid "Invalid HTTP proxy URL: must not contain spaces"
msgstr "Неверный URL HTTP proxy: не должен содержать пробелов"
msgid "Invalid HTTP proxy URL: must start with http:// or https://"
msgstr "Неверный URL HTTP proxy: должен начинаться с http:// или https://"
msgid "Invalid HTTP proxy URL: parsing failed"
msgstr "Неверный URL HTTP proxy: ошибка разбора"
msgid "Invalid HTTP proxy URL: path, query, and fragment are not supported"
msgstr "Неверный URL HTTP proxy: путь, query и fragment не поддерживаются"
msgid "Invalid HY2 URL: insecure must be 0 or 1"
msgstr "Неверный URL Hysteria2: параметр insecure должен быть 0 или 1"
@@ -1580,8 +1613,8 @@ msgstr "Исходящий"
msgid "Uploaded"
msgstr "Отдано"
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://"
msgstr "URL должен начинаться с vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2:// или hy2://"
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://"
msgstr "URL должен начинаться с vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2:// или hy2://"
msgid "URL must use one of the following protocols:"
msgstr "URL должен использовать один из следующих протоколов:"
@@ -1667,8 +1700,8 @@ msgstr "Видимое имя этой секции"
msgid "VLESS flow"
msgstr "VLESS flow"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links"
msgstr "ссылки vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2://"
msgid "WAN"
msgstr "WAN"
@@ -1,5 +1,7 @@
const COPYABLE_PROXY_URI_RE =
/^(vless|vmess|trojan|ss|ssr|hysteria2|hy2|tuic|socks4|socks4a|socks5):\/\//i;
const HTTP_PROXY_URI_RE =
/^https?:\/\/(?:[^/@\s]+(?::[^/@\s]*)?@)?[^:/?#@\s]+:(\d{1,5})$/i;
const COPYABLE_PROXY_OUTBOUND_TYPES = new Set([
'vless',
@@ -16,10 +18,22 @@ const COPYABLE_PROXY_OUTBOUND_TYPES = new Set([
'socks4',
'socks4a',
'socks5',
'http',
]);
export function isCopyableProxyLink(link?: string) {
return COPYABLE_PROXY_URI_RE.test((link || '').trim());
const value = (link || '').trim();
if (COPYABLE_PROXY_URI_RE.test(value)) {
return true;
}
const httpProxy = value.match(HTTP_PROXY_URI_RE);
if (!httpProxy) {
return false;
}
const port = Number(httpProxy[1]);
return Number.isInteger(port) && port >= 1 && port <= 65535;
}
export function isCopyableProxyOutboundType(type?: string) {
@@ -16,6 +16,8 @@ const copyableLinks = [
'socks4://example.com:1080',
'socks4a://example.com:1080',
'socks5://user:pass@example.com:1080',
'http://example.com:80',
'https://user:pass@example.com:443',
];
const nonCopyableLinks = [
@@ -24,6 +26,8 @@ const nonCopyableLinks = [
'block',
'urltest',
'https://example.com/subscription',
'https://example.com',
'http://example.com:99999',
'wireguard://example.com',
];
@@ -47,6 +51,7 @@ describe('isCopyableProxyOutboundType', () => {
expect(isCopyableProxyOutboundType('shadowsocks')).toBe(true);
expect(isCopyableProxyOutboundType('hysteria2')).toBe(true);
expect(isCopyableProxyOutboundType('socks')).toBe(true);
expect(isCopyableProxyOutboundType('http')).toBe(true);
});
it('rejects group, service and routing-only outbound types', () => {
@@ -0,0 +1,34 @@
import { describe, expect, it } from 'vitest';
import { validateHttpProxyUrl } from '../validateHttpProxyUrl';
const validUrls = [
['http ipv4', 'http://127.0.0.1:80'],
['http domain', 'http://proxy.example.com:8080'],
['https auth', 'https://user:pass@example.com:443'],
['uppercase auth and host', 'https://USER:PASSWORD@Example.COM:8443'],
];
const invalidUrls = [
['missing port', 'http://example.com'],
['missing host', 'http://:8080'],
['invalid port', 'http://example.com:99999'],
['path present', 'https://example.com:443/path'],
['query present', 'https://example.com:443?token=abc'],
['space present', 'http://exa mple.com:80'],
['empty username', 'http://:pass@example.com:80'],
['unsupported scheme', 'socks5://example.com:1080'],
];
describe('validateHttpProxyUrl', () => {
describe.each(validUrls)('valid URL: %s', (_desc, url) => {
it('returns valid=true', () => {
expect(validateHttpProxyUrl(url).valid).toBe(true);
});
});
describe.each(invalidUrls)('invalid URL: %s', (_desc, url) => {
it('returns valid=false', () => {
expect(validateHttpProxyUrl(url).valid).toBe(false);
});
});
});
@@ -31,6 +31,8 @@ const validUrls = [
['socks4', 'socks4://127.0.0.1:1080'],
['socks4a', 'socks4a://example.com:1080'],
['socks5', 'socks5://user:pass@example.com:1080'],
['http proxy', 'http://127.0.0.1:80'],
['https proxy', 'https://user:pass@example.com:443'],
['hysteria2', 'hysteria2://password@example.com:443'],
['hy2', 'hy2://password@example.com:443'],
];
@@ -50,11 +52,19 @@ describe('validateProxyUrl', () => {
});
it('returns a clear error for unsupported protocols', () => {
const res = validateProxyUrl('http://example.com');
const res = validateProxyUrl('wireguard://example.com');
expect(res.valid).toBe(false);
expect(res.message).toContain('vmess://');
expect(res.message).toContain('socks4a://');
expect(res.message).toContain('http://');
expect(res.message).toContain('hy2://');
});
it('rejects HTTP URLs that look like subscription URLs rather than proxy endpoints', () => {
const res = validateProxyUrl('https://example.com/subscription');
expect(res.valid).toBe(false);
expect(res.message).toContain('path');
});
});
@@ -0,0 +1,101 @@
import { ValidationResult } from './types';
import { validateDomain } from './validateDomain';
import { validateIPV4 } from './validateIp';
export function validateHttpProxyUrl(url: string): ValidationResult {
try {
if (!/^https?:\/\//.test(url)) {
return {
valid: false,
message: _(
'Invalid HTTP proxy URL: must start with http:// or https://',
),
};
}
if (!url || /\s/.test(url)) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: must not contain spaces'),
};
}
const body = url.replace(/^https?:\/\//, '');
if (/[/?#]/.test(body)) {
return {
valid: false,
message: _(
'Invalid HTTP proxy URL: path, query, and fragment are not supported',
),
};
}
const atIndex = body.lastIndexOf('@');
const credentials = atIndex >= 0 ? body.slice(0, atIndex) : '';
const hostPortPart = atIndex >= 0 ? body.slice(atIndex + 1) : body;
if (credentials) {
const [username] = credentials.split(':');
if (!username) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: missing username'),
};
}
}
if (!hostPortPart) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: missing host and port'),
};
}
const [host, port, extra] = hostPortPart.split(':');
if (extra !== undefined) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: invalid host and port'),
};
}
if (!host) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: missing hostname or IP'),
};
}
if (!port) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: missing port'),
};
}
const portNum = Number(port);
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: invalid port number'),
};
}
const ipv4Result = validateIPV4(host);
const domainResult = validateDomain(host);
if (!ipv4Result.valid && !domainResult.valid) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: invalid host format'),
};
}
} catch (_e) {
return {
valid: false,
message: _('Invalid HTTP proxy URL: parsing failed'),
};
}
return { valid: true, message: _('Valid') };
}
@@ -5,6 +5,7 @@ import { validateVmessUrl } from './validateVmessUrl';
import { validateTrojanUrl } from './validateTrojanUrl';
import { validateSocksUrl } from './validateSocksUrl';
import { validateHysteria2Url } from './validateHysteriaUrl';
import { validateHttpProxyUrl } from './validateHttpProxyUrl';
// TODO refactor current validation and add tests
export function validateProxyUrl(url: string): ValidationResult {
@@ -30,6 +31,10 @@ export function validateProxyUrl(url: string): ValidationResult {
return validateSocksUrl(trimmedUrl);
}
if (/^https?:\/\//.test(trimmedUrl)) {
return validateHttpProxyUrl(trimmedUrl);
}
if (
trimmedUrl.startsWith('hysteria2://') ||
trimmedUrl.startsWith('hy2://')
@@ -40,7 +45,7 @@ export function validateProxyUrl(url: string): ValidationResult {
return {
valid: false,
message: _(
'URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://',
'URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://',
),
};
}
@@ -621,6 +621,93 @@ function validateHysteria2Url(url) {
}
}
// src/validators/validateHttpProxyUrl.ts
function validateHttpProxyUrl(url) {
try {
if (!/^https?:\/\//.test(url)) {
return {
valid: false,
message: _(
"Invalid HTTP proxy URL: must start with http:// or https://"
)
};
}
if (!url || /\s/.test(url)) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: must not contain spaces")
};
}
const body = url.replace(/^https?:\/\//, "");
if (/[/?#]/.test(body)) {
return {
valid: false,
message: _(
"Invalid HTTP proxy URL: path, query, and fragment are not supported"
)
};
}
const atIndex = body.lastIndexOf("@");
const credentials = atIndex >= 0 ? body.slice(0, atIndex) : "";
const hostPortPart = atIndex >= 0 ? body.slice(atIndex + 1) : body;
if (credentials) {
const [username] = credentials.split(":");
if (!username) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: missing username")
};
}
}
if (!hostPortPart) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: missing host and port")
};
}
const [host, port, extra] = hostPortPart.split(":");
if (extra !== void 0) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: invalid host and port")
};
}
if (!host) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: missing hostname or IP")
};
}
if (!port) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: missing port")
};
}
const portNum = Number(port);
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: invalid port number")
};
}
const ipv4Result = validateIPV4(host);
const domainResult = validateDomain(host);
if (!ipv4Result.valid && !domainResult.valid) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: invalid host format")
};
}
} catch (_e) {
return {
valid: false,
message: _("Invalid HTTP proxy URL: parsing failed")
};
}
return { valid: true, message: _("Valid") };
}
// src/validators/validateProxyUrl.ts
function validateProxyUrl(url) {
const trimmedUrl = url.trim();
@@ -639,13 +726,16 @@ function validateProxyUrl(url) {
if (/^socks(4|4a|5):\/\//.test(trimmedUrl)) {
return validateSocksUrl(trimmedUrl);
}
if (/^https?:\/\//.test(trimmedUrl)) {
return validateHttpProxyUrl(trimmedUrl);
}
if (trimmedUrl.startsWith("hysteria2://") || trimmedUrl.startsWith("hy2://")) {
return validateHysteria2Url(trimmedUrl);
}
return {
valid: false,
message: _(
"URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://"
"URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://"
)
};
}
@@ -928,8 +1018,18 @@ function insertIf(condition, elements) {
// src/helpers/isCopyableProxyLink.ts
var COPYABLE_PROXY_URI_RE = /^(vless|vmess|trojan|ss|ssr|hysteria2|hy2|tuic|socks4|socks4a|socks5):\/\//i;
var HTTP_PROXY_URI_RE = /^https?:\/\/(?:[^/@\s]+(?::[^/@\s]*)?@)?[^:/?#@\s]+:(\d{1,5})$/i;
function isCopyableProxyLink(link) {
return COPYABLE_PROXY_URI_RE.test((link || "").trim());
const value = (link || "").trim();
if (COPYABLE_PROXY_URI_RE.test(value)) {
return true;
}
const httpProxy = value.match(HTTP_PROXY_URI_RE);
if (!httpProxy) {
return false;
}
const port = Number(httpProxy[1]);
return Number.isInteger(port) && port >= 1 && port <= 65535;
}
// src/icons/renderLoaderCircleIcon24.ts
@@ -3381,7 +3381,7 @@ function createSectionContent(section) {
form.DynamicList,
"selector_proxy_links",
_("Connection URL"),
_("vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"),
_("vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links"),
);
o.depends("action", "proxy");
o.modalonly = true;
+39 -6
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-08 02:39+0300\n"
"PO-Revision-Date: 2026-06-08 02:39+0300\n"
"POT-Creation-Date: 2026-06-10 06:49+0300\n"
"PO-Revision-Date: 2026-06-10 06:49+0300\n"
"Last-Translator: ushan0v\n"
"Language-Team: none\n"
"Language: ru\n"
@@ -608,6 +608,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 HTTP proxy URL: invalid host and port"
msgstr "Неверный URL HTTP proxy: неверный хост и порт"
msgid "Invalid HTTP proxy URL: invalid host format"
msgstr "Неверный URL HTTP proxy: неверный формат хоста"
msgid "Invalid HTTP proxy URL: invalid port number"
msgstr "Неверный URL HTTP proxy: неверный номер порта"
msgid "Invalid HTTP proxy URL: missing host and port"
msgstr "Неверный URL HTTP proxy: отсутствуют хост и порт"
msgid "Invalid HTTP proxy URL: missing hostname or IP"
msgstr "Неверный URL HTTP proxy: отсутствует имя хоста или IP-адрес"
msgid "Invalid HTTP proxy URL: missing port"
msgstr "Неверный URL HTTP proxy: отсутствует порт"
msgid "Invalid HTTP proxy URL: missing username"
msgstr "Неверный URL HTTP proxy: отсутствует имя пользователя"
msgid "Invalid HTTP proxy URL: must not contain spaces"
msgstr "Неверный URL HTTP proxy: не должен содержать пробелов"
msgid "Invalid HTTP proxy URL: must start with http:// or https://"
msgstr "Неверный URL HTTP proxy: должен начинаться с http:// или https://"
msgid "Invalid HTTP proxy URL: parsing failed"
msgstr "Неверный URL HTTP proxy: ошибка разбора"
msgid "Invalid HTTP proxy URL: path, query, and fragment are not supported"
msgstr "Неверный URL HTTP proxy: путь, query и fragment не поддерживаются"
msgid "Invalid HY2 URL: insecure must be 0 or 1"
msgstr "Неверный URL Hysteria2: параметр insecure должен быть 0 или 1"
@@ -1580,8 +1613,8 @@ msgstr "Исходящий"
msgid "Uploaded"
msgstr "Отдано"
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://"
msgstr "URL должен начинаться с vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2:// или hy2://"
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://"
msgstr "URL должен начинаться с vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2:// или hy2://"
msgid "URL must use one of the following protocols:"
msgstr "URL должен использовать один из следующих протоколов:"
@@ -1667,8 +1700,8 @@ msgstr "Видимое имя этой секции"
msgid "VLESS flow"
msgstr "VLESS flow"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links"
msgstr "ссылки vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2://"
msgid "WAN"
msgstr "WAN"
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PODKOP PLUS\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-06-08 23:39+0300\n"
"PO-Revision-Date: 2026-06-08 23:39+0300\n"
"POT-Creation-Date: 2026-06-10 03:49+0300\n"
"PO-Revision-Date: 2026-06-10 03:49+0300\n"
"Last-Translator: ushan0v <ushanov2204@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
@@ -21,13 +21,13 @@ msgstr ""
msgid "-- Select --"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:888
#: src/podkop/tabs/dashboard/initController.ts:899
#: src/podkop/tabs/dashboard/initController.ts:893
#: src/podkop/tabs/dashboard/initController.ts:904
msgid "✔ Running"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:889
#: src/podkop/tabs/dashboard/initController.ts:900
#: src/podkop/tabs/dashboard/initController.ts:894
#: src/podkop/tabs/dashboard/initController.ts:905
msgid "✘ Stopped"
msgstr ""
@@ -49,7 +49,7 @@ msgstr ""
msgid "Active"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:846
#: src/podkop/tabs/dashboard/initController.ts:851
msgid "Active Connections"
msgstr ""
@@ -247,7 +247,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runDnsCheck.ts:27
#: src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:162
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:28
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:48
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:31
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:25
#: src/podkop/tabs/diagnostic/checks/runZapret2Check.ts:27
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:27
@@ -276,7 +276,7 @@ msgstr ""
#: src/podkop/tabs/diagnostic/checks/runFakeIPCheck.ts:15
#: src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:150
#: src/podkop/tabs/diagnostic/checks/runNftCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:34
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:17
#: src/podkop/tabs/diagnostic/checks/runSingBoxCheck.ts:13
#: src/podkop/tabs/diagnostic/checks/runZapret2Check.ts:15
#: src/podkop/tabs/diagnostic/checks/runZapretCheck.ts:15
@@ -391,7 +391,7 @@ msgstr ""
msgid "Connections are unavailable"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:137
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:125
msgid "Connectivity probe failed"
msgstr ""
@@ -548,8 +548,8 @@ msgstr ""
msgid "Dont Touch My DHCP!"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:772
#: src/podkop/tabs/dashboard/initController.ts:810
#: src/podkop/tabs/dashboard/initController.ts:777
#: src/podkop/tabs/dashboard/initController.ts:815
msgid "Downlink"
msgstr ""
@@ -697,12 +697,12 @@ msgstr ""
msgid "Failed to copy!"
msgstr ""
#: src/podkop/methods/shell/index.ts:171
#: src/podkop/methods/shell/index.ts:178
#: src/podkop/tabs/updates/initController.ts:466
#: src/podkop/tabs/updates/initController.ts:467
#: src/podkop/tabs/updates/initController.ts:527
#: src/podkop/tabs/updates/initController.ts:677
#: src/podkop/methods/shell/index.ts:171
#: src/podkop/methods/shell/index.ts:178
msgid "Failed to execute"
msgstr ""
@@ -737,7 +737,9 @@ msgid "Fallback on unknown DC"
msgstr ""
#: src/podkop/methods/custom/getDashboardSections.ts:313
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:93
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:77
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:78
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:90
msgid "Fastest"
msgstr ""
@@ -882,6 +884,50 @@ msgstr ""
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:58
msgid "Invalid HTTP proxy URL: invalid host and port"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:90
msgid "Invalid HTTP proxy URL: invalid host format"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:80
msgid "Invalid HTTP proxy URL: invalid port number"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:50
msgid "Invalid HTTP proxy URL: missing host and port"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:65
msgid "Invalid HTTP proxy URL: missing hostname or IP"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:72
msgid "Invalid HTTP proxy URL: missing port"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:42
msgid "Invalid HTTP proxy URL: missing username"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:19
msgid "Invalid HTTP proxy URL: must not contain spaces"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:10
msgid "Invalid HTTP proxy URL: must start with http:// or https://"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:96
msgid "Invalid HTTP proxy URL: parsing failed"
msgstr ""
#: src/validators/validateHttpProxyUrl.ts:27
msgid "Invalid HTTP proxy URL: path, query, and fragment are not supported"
msgstr ""
#: src/validators/validateHysteriaUrl.ts:107
msgid "Invalid HY2 URL: insecure must be 0 or 1"
msgstr ""
@@ -1181,7 +1227,7 @@ msgstr ""
msgid "Maximum response time delta in milliseconds"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:850
#: src/podkop/tabs/dashboard/initController.ts:855
msgid "Memory Usage"
msgstr ""
@@ -1315,9 +1361,10 @@ msgstr ""
msgid "Not required for this listen address"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:109
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:115
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:143
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:78
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:90
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:103
#: src/podkop/tabs/diagnostic/checks/runSectionsCheck.ts:131
msgid "Not responding"
msgstr ""
@@ -1816,9 +1863,9 @@ msgstr ""
msgid "Servers with names matching these regular expressions will not be tested by URLTest"
msgstr ""
#: src/podkop/tabs/diagnostic/initController.ts:571
#: src/podkop/methods/shell/index.ts:380
#: src/podkop/methods/shell/index.ts:401
#: src/podkop/tabs/diagnostic/initController.ts:571
msgid "Service action failed"
msgstr ""
@@ -1826,7 +1873,7 @@ msgstr ""
msgid "Service list"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:883
#: src/podkop/tabs/dashboard/initController.ts:888
msgid "Services info"
msgstr ""
@@ -1988,7 +2035,7 @@ msgstr ""
msgid "Successfully copied!"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:843
#: src/podkop/tabs/dashboard/initController.ts:848
msgid "System info"
msgstr ""
@@ -2102,12 +2149,12 @@ msgstr ""
msgid "tiny"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:769
#: src/podkop/tabs/dashboard/initController.ts:774
#: src/podkop/tabs/dashboard/partials/renderSections.ts:216
msgid "Traffic"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:803
#: src/podkop/tabs/dashboard/initController.ts:808
msgid "Traffic Total"
msgstr ""
@@ -2252,8 +2299,8 @@ msgstr ""
msgid "Update subscriptions"
msgstr ""
#: src/podkop/tabs/dashboard/initController.ts:771
#: src/podkop/tabs/dashboard/initController.ts:806
#: src/podkop/tabs/dashboard/initController.ts:776
#: src/podkop/tabs/dashboard/initController.ts:811
msgid "Uplink"
msgstr ""
@@ -2262,8 +2309,8 @@ msgstr ""
msgid "Uploaded"
msgstr ""
#: src/validators/validateProxyUrl.ts:42
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, hysteria2://, or hy2://"
#: src/validators/validateProxyUrl.ts:47
msgid "URL must start with vless://, vmess://, ss://, trojan://, socks4://, socks4a://, socks5://, http://, https://, hysteria2://, or hy2://"
msgstr ""
#: src/validators/validateUrl.ts:17
@@ -2362,6 +2409,7 @@ msgstr ""
#: src/validators/validateDns.ts:18
#: src/validators/validateDomain.ts:13
#: src/validators/validateDomain.ts:30
#: src/validators/validateHttpProxyUrl.ts:100
#: src/validators/validateHysteriaUrl.ts:154
#: src/validators/validateIp.ts:8
#: src/validators/validateOutboundJson.ts:7
@@ -2408,7 +2456,7 @@ msgid "VLESS flow"
msgstr ""
#: ../luci-app-podkop-plus/htdocs/luci-static/resources/view/podkop/section.js:3384
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, http(s)://, hy2/hysteria2:// links"
msgstr ""
#: src/podkop/tabs/diagnostic/checks/runInboundsCheck.ts:70
@@ -108,6 +108,32 @@ sing_box_cf_add_proxy_outbound() {
local scheme
scheme="$(url_get_scheme "$url")"
case "$scheme" in
http | https)
local tag host port path userinfo username password tls_enabled
tag=$(get_outbound_tag_by_section "$section")
host=$(url_get_host "$url")
port=$(url_get_port "$url")
path=$(url_get_path "$url")
if [ -z "$host" ] || [ -z "$port" ] || { [ -n "$path" ] && [ "$path" != "/" ]; } || [ "${url#*\?}" != "$url" ]; then
log "Invalid HTTP proxy URL: host and explicit port are required; path and query are not supported. Aborted." "fatal"
exit 1
fi
userinfo=$(url_get_userinfo "$url")
if [ -n "$userinfo" ]; then
case "$userinfo" in
*:*)
username="${userinfo%%:*}"
password="${userinfo#*:}"
;;
*)
username="$userinfo"
;;
esac
fi
[ "$scheme" = "https" ] && tls_enabled=1 || tls_enabled=0
config=$(sing_box_cm_add_http_outbound "$config" "$tag" "$host" "$port" "$username" "$password" "$tls_enabled")
;;
socks4 | socks4a | socks5)
local tag host port version userinfo username password udp_over_tcp
@@ -389,7 +389,7 @@ function valid_hysteria2_server_ports(value) {
function type_requires_server(proxy_type) {
return proxy_type == "vless" || proxy_type == "vmess" || proxy_type == "trojan" ||
proxy_type == "shadowsocks" || proxy_type == "socks" || proxy_type == "hysteria2";
proxy_type == "shadowsocks" || proxy_type == "socks" || proxy_type == "http" || proxy_type == "hysteria2";
}
function supported_flow(flow) {
@@ -445,7 +445,7 @@ function prefilter_skip_reason(outbound, supports_xhttp, plugin_supports) {
proxy_type == "dns" || proxy_type == "block")
return "non-proxy outbound type: " + proxy_type;
if (proxy_type != "vless" && proxy_type != "vmess" && proxy_type != "trojan" &&
proxy_type != "shadowsocks" && proxy_type != "socks" && proxy_type != "hysteria2")
proxy_type != "shadowsocks" && proxy_type != "socks" && proxy_type != "http" && proxy_type != "hysteria2")
return "unsupported type: " + proxy_type;
if (type_requires_server(proxy_type) && !non_empty_string(outbound.server))
return "missing or empty server";
@@ -117,6 +117,10 @@ sing_box_cm_add_socks_outbound() {
sing_box_cm_ucode add-socks-outbound "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
}
sing_box_cm_add_http_outbound() {
sing_box_cm_ucode add-http-outbound "$1" "$2" "$3" "$4" "$5" "$6" "$7"
}
sing_box_cm_add_shadowsocks_outbound() {
sing_box_cm_ucode add-shadowsocks-outbound "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
}
@@ -616,6 +616,20 @@ function add_socks_outbound(config, args) {
add_outbound(config, outbound);
}
function add_http_outbound(config, args) {
let outbound = {
type: "http",
tag: as_string(args[0]),
server: as_string(args[1]),
server_port: number_arg(args[2])
};
optional_string(outbound, "username", args[3]);
optional_string(outbound, "password", args[4]);
if (bool_arg(args[5]))
outbound.tls = { enabled: true };
add_outbound(config, outbound);
}
function add_shadowsocks_outbound(config, args) {
let outbound = {
type: "shadowsocks",
@@ -1072,6 +1086,7 @@ let handlers = {
"set-inbound-transport": set_transport_for_inbound,
"add-direct-outbound": add_direct_outbound,
"add-socks-outbound": add_socks_outbound,
"add-http-outbound": add_http_outbound,
"add-shadowsocks-outbound": add_shadowsocks_outbound,
"add-vless-outbound": add_vless_outbound,
"add-trojan-outbound": add_trojan_outbound,
@@ -1433,6 +1433,16 @@ function parse_clash_record(record) {
outbound.password = as_string(record.password);
return outbound;
}
if (proxy_type == "http" || proxy_type == "https") {
let outbound = { type: "http", tag: name, server: server, server_port: port };
if (as_string(record.username) != "")
outbound.username = as_string(record.username);
if (as_string(record.password) != "")
outbound.password = as_string(record.password);
if (proxy_type == "https" || is_true(record.tls))
outbound.tls = { enabled: true };
return outbound;
}
return null;
}