mirror of
https://github.com/itdoginfo/podkop.git
synced 2026-06-10 05:18:13 +03:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
847895598d | ||
|
|
4146804e5a | ||
|
|
daef80b7b8 | ||
|
|
6e7b8a6be2 | ||
|
|
1365febaa4 | ||
|
|
1543d974cc | ||
|
|
4b03c28c41 | ||
|
|
c3281773d5 | ||
|
|
c9e0b54f2c | ||
|
|
7f33cfcb98 | ||
|
|
177469e212 | ||
|
|
1802818044 | ||
|
|
c62cb2de14 | ||
|
|
f253e4e36f | ||
|
|
41e696c9b2 | ||
|
|
835b455915 |
29
.github/workflows/close-invalid-issues.yml
vendored
Normal file
29
.github/workflows/close-invalid-issues.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
name: Close Invalid Issues
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [labeled]
|
||||
|
||||
jobs:
|
||||
close-invalid:
|
||||
if: github.event.label.name == 'Close as invalid'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- name: Close issue
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
body: 'This issue has been marked as invalid and is being closed automatically.'
|
||||
});
|
||||
await github.rest.issues.update({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
state: 'closed'
|
||||
});
|
||||
83
README.md
83
README.md
@@ -1,61 +1,54 @@
|
||||
# Вещи, которые вам нужно знать перед установкой
|
||||
# Podkop
|
||||
|
||||
Маршрутизация трафика для OpenWrt.
|
||||
|
||||
Направляйте нужные ресурсы в туннель, а остальное — напрямую. Открытое программное обеспечение на базе [sing-box](https://github.com/SagerNet/sing-box).
|
||||
|
||||
> [!WARNING]
|
||||
> Проект находится в стадии бета-версии. Возможны ошибки, нестабильная работа и существенные изменения функциональности.
|
||||
|
||||
# Вещи, которые необходимо знать перед установкой
|
||||
|
||||
### Обновления и конфигурация
|
||||
- При обновлении **обязательно** [очищайте кэш LuCI](https://podkop.net/docs/clear-browser-cache/).
|
||||
- После обновления проверяйте конфигурацию — она может изменяться между версиями.
|
||||
- При старте Podkop модифицируется конфигурация Dnsmasq.
|
||||
- Podkop изменяет конфигурацию sing-box. Если вы используете собственную конфигурацию, заранее сохраните её.
|
||||
|
||||
### Системные требования
|
||||
- Требуется OpenWrt 24.10 или выше.
|
||||
- Необходимо минимум 25 МБ свободного места на устройстве. Устройства с флеш-памятью 16 МБ не поддерживаются.
|
||||
|
||||
### Важные ограничения и особенности
|
||||
- Если установлен Getdomains, его [необходимо удалить](https://github.com/itdoginfo/domain-routing-openwrt?tab=readme-ov-file#скрипт-для-удаления)
|
||||
- Dashboard доступен только при подключении по HTTP (из-за особенностей Clash API). При использовании HTTPS или домена работа может быть недоступна.
|
||||
|
||||
### Поддержка и диагностика
|
||||
- [Руководство по диагностике](https://podkop.net/docs/diagnostics/)
|
||||
- Актуальные изменения публикуются в [Telegram-чате](https://t.me/itdogchat/81758/420321). Пожалуйста, ознакомьтесь с закрепленными сообщениями.
|
||||
- При возникновении проблем оставляйте технически грамотный фидбэк в GitHub Issues и Telegram-чате.
|
||||
|
||||
- Это бета-версия, которая находится в активной разработке. Из версии в версию что-то может меняться.
|
||||
- При возникновении проблем, нужен технически грамотный фидбэк в чат. Ознакомьтесь с закрепом в топике.
|
||||
- При обновлении **обязательно** [сбрасывайте кэш LuCI](https://podkop.net/docs/clear-browser-cache/).
|
||||
- Также при обновлении всегда заходите в конфигурацию и проверяйте свои настройки. Конфигурация может измениться.
|
||||
- Необходимо минимум 25МБ свободного места на роутере. Роутеры с флешками на 16МБ сразу мимо.
|
||||
- При старте программы редактируется конфиг Dnsmasq.
|
||||
- Podkop редактирует конфиг sing-box. Обязательно сохраните ваш конфиг sing-box перед установкой, если он вам нужен.
|
||||
- Информация здесь может быть устаревшей. Все изменения фиксируются в [телеграм-чате](https://t.me/itdogchat/81758/420321).
|
||||
- [Если у вас что-то не работает.](https://podkop.net/docs/diagnostics/)
|
||||
- Если у вас установлен Getdomains, [его следует удалить](https://github.com/itdoginfo/domain-routing-openwrt?tab=readme-ov-file#%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82-%D0%B4%D0%BB%D1%8F-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F).
|
||||
- Требуется версия OpenWrt 24.10.
|
||||
- Dashboard доступен, если вы заходите по http (из-за особенностей clash api). И не будет работать, если вы заходите по https и/или домену.
|
||||
|
||||
# Документация
|
||||
https://podkop.net/
|
||||
|
||||
# Установка Podkop
|
||||
Полная информация в [документации](https://podkop.net/docs/install/)
|
||||
Полное руководство доступно в [документации](https://podkop.net/docs/install/)
|
||||
|
||||
Вкратце, достаточно одного скрипта для установки и обновления:
|
||||
Для установки и обновления достаточно выполнить один скрипт:
|
||||
```
|
||||
sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/install.sh)
|
||||
```
|
||||
|
||||
## Изменения 0.7.0
|
||||
Начиная с версии 0.7.0 изменена структура конфига `/etc/config/podkop`. Старые значения несовместимы с новыми. Нужно заново настроить Podkop.
|
||||
|
||||
Скрипт установки обнаружит старую версию и предупредит вас об этом. Если вы согласитесь, то он сделает автоматически написанное ниже.
|
||||
|
||||
При обновлении вручную нужно:
|
||||
|
||||
0. Не ныть в issue и чатик.
|
||||
1. Забэкапить старый конфиг:
|
||||
```
|
||||
mv /etc/config/podkop /etc/config/podkop-070
|
||||
```
|
||||
2. Стянуть новый дефолтный конфиг:
|
||||
```
|
||||
wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/podkop/files/etc/config/podkop
|
||||
```
|
||||
3. Настроить заново ваш Podkop через Luci или UCI.
|
||||
|
||||
# ToDo
|
||||
## Будущее
|
||||
Планы развития проекта в настоящее время не публикуются в виде открытого roadmap. Обсуждение направлений и задач разработки ведётся авторами и контрибьюторами.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> PR принимаются только по согласованию с авторами в ТГ-чате. Остальные PR на данный момент не рассматриваются. Не тратьте зря своё время.
|
||||
> Pull Request принимаются только после согласования с авторами в Telegram-чате. На данный момент PR без предварительного обсуждения не рассматриваются.
|
||||
|
||||
## Будущее
|
||||
- [ ] [Подписка](https://github.com/itdoginfo/podkop/issues/118). Здесь нужна реализация, чтоб для каждой секции помимо ручного выбора, был выбор фильтрации по тегу. Например, для main выбираем ключевые слова NL, DE, FI. А для extra секции фильтруем по RU. И создаётся outbound c urltest в которых перечислены outbound из фильтров.
|
||||
- [ ] Весь трафик в sing-box и маршрутизация полностью на его уровне.
|
||||
- [ ] При успешном запуске переходит в фоновый режим и следит за состоянием sing-box. Если вдруг идёт exit 1, выполняется dnsmasq restore и снова следит за состоянием. Вопрос в том, как это искусственно провернуть. Попробовать положить прокси и посмотреть, останется ли работать DNS в этом случае. И здесь, вероятно, можно обойтись триггером в init.d. [Issue](https://github.com/itdoginfo/podkop/issues/111)
|
||||
- [ ] Галочка, которая режет доступ к doh серверам.
|
||||
- [ ] IPv6. Только после наполнения Wiki.
|
||||
|
||||
## Тесты
|
||||
- [ ] Unit тесты (BATS)
|
||||
- [ ] Интеграционные тесты бекенда (OpenWrt rootfs + BATS)
|
||||
> [!WARNING]
|
||||
> Данное программное обеспечение предоставляется «как есть», без каких-либо явных или подразумеваемых гарантий, включая гарантии коммерческой пригодности и соответствия определённой цели.
|
||||
>
|
||||
> Правообладатели и участники проекта не несут ответственности за любые прямые, косвенные, случайные, специальные или иные убытки, возникшие в результате использования программного обеспечения, включая потерю данных, прибыли или прерывание деятельности, даже если они были предупреждены о возможности таких последствий.
|
||||
|
||||
[](https://deepwiki.com/itdoginfo/podkop)
|
||||
63
TRADEMARK.md
Normal file
63
TRADEMARK.md
Normal file
@@ -0,0 +1,63 @@
|
||||
Trademark Guidelines
|
||||
|
||||
Version 1.0 dated May 28, 2026
|
||||
|
||||
This trademark policy was prepared to help you understand how to use the Podkop trademarks, service marks, and logos in connection with the Podkop open source project and related software.
|
||||
|
||||
While the Podkop software is available under an open source license, that license does not grant permission to use the Podkop trademarks, service marks, or logos. This policy explains acceptable use of the Podkop brand and related marks.
|
||||
|
||||
This Policy covers:
|
||||
1. Our word trademarks and service marks: Podkop
|
||||
2. Our logos, icons, and other Podkop brand assets
|
||||
|
||||
This policy encompasses all trademarks and service marks, whether they are registered or not.
|
||||
|
||||
## 1. General Guidelines
|
||||
|
||||
Whenever you use one of our marks, you must always do so in a way that does not mislead anyone about what they are getting and from whom. For example, you cannot say you are distributing Podkop software when you are distributing a modified version of it, because recipients may not understand the differences between your modified versions and our own.
|
||||
|
||||
You also cannot use our logo on your website in a way that suggests that your website is an official website or that we endorse your website.
|
||||
|
||||
You can, however, say that you like the Podkop project, that you participate in the Podkop community, or that you are providing an unmodified version of the Podkop software.
|
||||
|
||||
You may not use or register our marks, or variations of them as part of your own trademark, service mark, domain name, company name, trade name, product name or service name.
|
||||
|
||||
Trademark law does not allow your use of names or trademarks that are too similar to ours. You therefore may not use an obvious variation of any of our marks or any phonetic equivalent, foreign language equivalent, takeoff, or abbreviation for a similar or compatible product or service. For example, we would consider the following too similar to one of our Marks:
|
||||
|
||||
- MyPodkop
|
||||
- Open-Podkop
|
||||
- PodkopX
|
||||
- Podkop Lite
|
||||
- Podkop Pro
|
||||
|
||||
## 2. Acceptable Uses
|
||||
### Unmodified Code
|
||||
|
||||
When you redistribute an unmodified copy of Podkop software, you must not remove any Podkop trademarks, notices, or branding included in the original distribution.
|
||||
|
||||
### Modified Code
|
||||
|
||||
If you distribute a modified version of Podkop software, you may not use the Podkop name, trademarks, or logos in connection with your modified version, except to accurately describe the origin of the software in factual statements.
|
||||
|
||||
You must replace any Podkop branding, including names displayed in user interfaces, logs, documentation, and other user-facing elements, with your own distinct name and branding, so that your modified version is clearly distinguishable from the original Podkop software.
|
||||
|
||||
You must remove all Podkop logos and any other brand assets from the modified version.
|
||||
|
||||
You may not present your modified version as Podkop or as an official Podkop release, nor may you use the Podkop name in a way that suggests endorsement, affiliation, or official status.
|
||||
|
||||
You may only refer to Podkop in a factual and descriptive manner, for example: “This software is derived from Podkop open-source software.”
|
||||
|
||||
### Statements about Compatibility
|
||||
|
||||
You may use the word marks, exclusively for descriptive and factual purposes, to truthfully and accurately describe the relationship between your software and ours, including compatibility or origin. Any other use may imply that we have certified or approved your software.
|
||||
|
||||
### No Domain Names
|
||||
|
||||
You must not register any domain that includes our word marks or any variant or combination of them.
|
||||
|
||||
## 3. How to Display our Marks
|
||||
### Use of Trademarks in Text
|
||||
|
||||
Always use trademarks in their exact form with correct spelling. They must not be abbreviated, modified, hyphenated, or combined with other words in a way that creates a new product or service name.
|
||||
|
||||
Unacceptable: Podcop
|
||||
65
TRADEMARK_RU.md
Normal file
65
TRADEMARK_RU.md
Normal file
@@ -0,0 +1,65 @@
|
||||
Руководство по использованию товарных знаков
|
||||
|
||||
Версия 1.0 от 28 мая 2026 года
|
||||
|
||||
Настоящая политика в отношении товарных знаков подготовлена для того, чтобы помочь вам понять, как использовать товарные знаки, знаки обслуживания и логотипы Podkop в связи с открытым исходным кодом проекта Podkop и связанным программным обеспечением.
|
||||
|
||||
Хотя программное обеспечение Podkop распространяется под лицензией с открытым исходным кодом, эта лицензия не предоставляет разрешения на использование товарных знаков Podkop, знаков обслуживания или логотипов. Данная политика объясняет допустимое использование бренда Podkop и связанных обозначений.
|
||||
|
||||
Настоящая Политика охватывает:
|
||||
1. Наши словесные товарные знаки и знаки обслуживания: Podkop
|
||||
2. Наши логотипы, иконки и другие бренд-активы Podkop
|
||||
|
||||
Данная политика распространяется на все товарные знаки и знаки обслуживания, независимо от того, зарегистрированы они или нет.
|
||||
|
||||
## 1. Общие рекомендации
|
||||
|
||||
При использовании любого из наших знаков вы всегда должны делать это таким образом, чтобы никого не вводить в заблуждение относительно того, что именно они получают и от кого. Например, вы не можете утверждать, что распространяете программное обеспечение Podkop, если вы распространяете его модифицированную версию, поскольку получатели могут не понимать различий между вашей модифицированной версией и нашей оригинальной.
|
||||
|
||||
Вы также не можете использовать наш логотип на своём сайте таким образом, чтобы это создавало впечатление, что ваш сайт является официальным сайтом или что мы одобряем ваш сайт.
|
||||
|
||||
Однако вы можете указывать, что вам нравится проект Podkop, что вы участвуете в сообществе Podkop или что вы распространяете немодифицированную версию программного обеспечения Podkop.
|
||||
|
||||
Вы не имеете права использовать или регистрировать наши знаки, а также их вариации, как часть вашего собственного товарного знака, знака обслуживания, доменного имени, названия компании, коммерческого наименования, названия продукта или услуги.
|
||||
|
||||
Закон о товарных знаках не допускает использование названий или знаков, которые слишком похожи на наши. Поэтому вы не можете использовать очевидные вариации наших знаков или любые фонетически, иностранно-языковые эквиваленты, производные, аббревиатуры для похожего или совместимого продукта или услуги. Например, мы считаем слишком похожими на наши знаки следующие варианты:
|
||||
|
||||
- MyPodkop
|
||||
- Open-Podkop
|
||||
- PodkopX
|
||||
- Podkop Lite
|
||||
- Podkop Pro
|
||||
|
||||
## 2. Допустимое использование
|
||||
|
||||
### Немодифицированный код
|
||||
|
||||
При распространении немодифицированной копии программного обеспечения Podkop вы не должны удалять товарные знаки, уведомления или брендинг Podkop, включённые в исходное распространение.
|
||||
|
||||
### Модифицированный код
|
||||
|
||||
Если вы распространяете модифицированную версию программного обеспечения Podkop, вы не можете использовать название Podkop, товарные знаки или логотипы в связи с вашей модифицированной версией, за исключением точного описания происхождения программного обеспечения в фактических утверждениях.
|
||||
|
||||
Вы обязаны заменить все элементы брендинга Podkop, включая названия, отображаемые в пользовательском интерфейсе, логах, документации и других пользовательских элементах, на собственное отличительное название и брендинг, чтобы ваша модифицированная версия была явно отличима от оригинального программного обеспечения Podkop.
|
||||
|
||||
Вы должны удалить все логотипы Podkop и любые другие бренд-материалы из модифицированной версии.
|
||||
|
||||
Вы не можете представлять вашу модифицированную версию как Podkop или как официальную версию Podkop, а также использовать название Podkop таким образом, чтобы это подразумевало одобрение, аффилированность или официальный статус.
|
||||
|
||||
Вы можете ссылаться на Podkop только в фактическом и описательном контексте, например: «Это программное обеспечение основано на программном обеспечении Podkop с открытым исходным кодом».
|
||||
|
||||
### Упоминания о совместимости
|
||||
|
||||
Вы можете использовать словесные знаки исключительно в описательных и фактических целях для правдивого и точного описания связи вашего программного обеспечения с нашим, включая совместимость или происхождение. Любое другое использование может создавать впечатление, что мы сертифицировали или одобрили ваше программное обеспечение.
|
||||
|
||||
### Запрет на доменные имена
|
||||
|
||||
Вы не должны регистрировать доменные имена, содержащие наши словесные знаки или любые их варианты или комбинации.
|
||||
|
||||
## 3. Как отображать наши знаки
|
||||
|
||||
### Использование товарных знаков в тексте
|
||||
|
||||
Всегда используйте товарные знаки в их точной форме с корректным написанием. Их нельзя сокращать, изменять, соединять дефисами или объединять с другими словами таким образом, чтобы это создавало новое название продукта или услуги.
|
||||
|
||||
Недопустимо: Podcop
|
||||
@@ -648,56 +648,56 @@
|
||||
"call": "Invalid HY2 URL: insecure must be 0 or 1",
|
||||
"key": "Invalid HY2 URL: insecure must be 0 or 1",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:76"
|
||||
"src/validators/validateHysteriaUrl.ts:90"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: invalid port number",
|
||||
"key": "Invalid HY2 URL: invalid port number",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:62"
|
||||
"src/validators/validateHysteriaUrl.ts:77"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: missing credentials/server",
|
||||
"key": "Invalid HY2 URL: missing credentials/server",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:32"
|
||||
"src/validators/validateHysteriaUrl.ts:30"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: missing host",
|
||||
"key": "Invalid HY2 URL: missing host",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:49"
|
||||
"src/validators/validateHysteriaUrl.ts:47"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: missing host & port",
|
||||
"key": "Invalid HY2 URL: missing host & port",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:43"
|
||||
"src/validators/validateHysteriaUrl.ts:41"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: missing password",
|
||||
"key": "Invalid HY2 URL: missing password",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:38"
|
||||
"src/validators/validateHysteriaUrl.ts:36"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: missing port",
|
||||
"key": "Invalid HY2 URL: missing port",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:53"
|
||||
"src/validators/validateHysteriaUrl.ts:50"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: must not contain spaces",
|
||||
"key": "Invalid HY2 URL: must not contain spaces",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:19"
|
||||
"src/validators/validateHysteriaUrl.ts:18"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -711,28 +711,28 @@
|
||||
"call": "Invalid HY2 URL: obfs-password required when obfs is set",
|
||||
"key": "Invalid HY2 URL: obfs-password required when obfs is set",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:99"
|
||||
"src/validators/validateHysteriaUrl.ts:108"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: parsing failed",
|
||||
"key": "Invalid HY2 URL: parsing failed",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:115"
|
||||
"src/validators/validateHysteriaUrl.ts:122"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: sni cannot be empty",
|
||||
"key": "Invalid HY2 URL: sni cannot be empty",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:108"
|
||||
"src/validators/validateHysteriaUrl.ts:116"
|
||||
]
|
||||
},
|
||||
{
|
||||
"call": "Invalid HY2 URL: unsupported obfs type",
|
||||
"key": "Invalid HY2 URL: unsupported obfs type",
|
||||
"places": [
|
||||
"src/validators/validateHysteriaUrl.ts:88"
|
||||
"src/validators/validateHysteriaUrl.ts:98"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -943,7 +943,7 @@
|
||||
"call": "Latest",
|
||||
"key": "Latest",
|
||||
"places": [
|
||||
"src/podkop/tabs/diagnostic/initController.ts:456"
|
||||
"src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:48"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1075,7 +1075,7 @@
|
||||
"call": "Outdated",
|
||||
"key": "Outdated",
|
||||
"places": [
|
||||
"src/podkop/tabs/diagnostic/initController.ts:446"
|
||||
"src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:38"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1685,7 +1685,7 @@
|
||||
"src/podkop/tabs/diagnostic/initController.ts:41",
|
||||
"src/podkop/tabs/diagnostic/initController.ts:42",
|
||||
"src/podkop/tabs/diagnostic/initController.ts:43",
|
||||
"src/podkop/tabs/diagnostic/initController.ts:420"
|
||||
"src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:7"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1802,7 +1802,7 @@
|
||||
"src/validators/validateDns.ts:18",
|
||||
"src/validators/validateDomain.ts:13",
|
||||
"src/validators/validateDomain.ts:30",
|
||||
"src/validators/validateHysteriaUrl.ts:113",
|
||||
"src/validators/validateHysteriaUrl.ts:120",
|
||||
"src/validators/validateIp.ts:8",
|
||||
"src/validators/validateOutboundJson.ts:7",
|
||||
"src/validators/validatePath.ts:16",
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PODKOP package.
|
||||
# romanvht <romanvht@gmail.com>, 2026.
|
||||
# divocatt <210179590+divocatt@users.noreply.github.com>, 2026.
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PODKOP\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-05-09 02:49+1000\n"
|
||||
"PO-Revision-Date: 2026-05-09 02:49+1000\n"
|
||||
"Last-Translator: romanvht <romanvht@gmail.com>\n"
|
||||
"POT-Creation-Date: 2026-05-29 13:40+0300\n"
|
||||
"PO-Revision-Date: 2026-05-29 13:40+0300\n"
|
||||
"Last-Translator: divocatt <210179590+divocatt@users.noreply.github.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -394,35 +394,35 @@ msgstr ""
|
||||
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:76
|
||||
#: src/validators/validateHysteriaUrl.ts:90
|
||||
msgid "Invalid HY2 URL: insecure must be 0 or 1"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:62
|
||||
#: src/validators/validateHysteriaUrl.ts:77
|
||||
msgid "Invalid HY2 URL: invalid port number"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:32
|
||||
#: src/validators/validateHysteriaUrl.ts:30
|
||||
msgid "Invalid HY2 URL: missing credentials/server"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:49
|
||||
#: src/validators/validateHysteriaUrl.ts:47
|
||||
msgid "Invalid HY2 URL: missing host"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:43
|
||||
#: src/validators/validateHysteriaUrl.ts:41
|
||||
msgid "Invalid HY2 URL: missing host & port"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:38
|
||||
#: src/validators/validateHysteriaUrl.ts:36
|
||||
msgid "Invalid HY2 URL: missing password"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:53
|
||||
#: src/validators/validateHysteriaUrl.ts:50
|
||||
msgid "Invalid HY2 URL: missing port"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:19
|
||||
#: src/validators/validateHysteriaUrl.ts:18
|
||||
msgid "Invalid HY2 URL: must not contain spaces"
|
||||
msgstr ""
|
||||
|
||||
@@ -430,19 +430,19 @@ msgstr ""
|
||||
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:99
|
||||
#: src/validators/validateHysteriaUrl.ts:108
|
||||
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:115
|
||||
#: src/validators/validateHysteriaUrl.ts:122
|
||||
msgid "Invalid HY2 URL: parsing failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:108
|
||||
#: src/validators/validateHysteriaUrl.ts:116
|
||||
msgid "Invalid HY2 URL: sni cannot be empty"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:88
|
||||
#: src/validators/validateHysteriaUrl.ts:98
|
||||
msgid "Invalid HY2 URL: unsupported obfs type"
|
||||
msgstr ""
|
||||
|
||||
@@ -563,7 +563,7 @@ msgstr ""
|
||||
msgid "Issues detected"
|
||||
msgstr ""
|
||||
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:456
|
||||
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:48
|
||||
msgid "Latest"
|
||||
msgstr ""
|
||||
|
||||
@@ -641,7 +641,7 @@ msgstr ""
|
||||
msgid "Outbound Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:446
|
||||
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:38
|
||||
msgid "Outdated"
|
||||
msgstr ""
|
||||
|
||||
@@ -996,7 +996,7 @@ msgstr ""
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:41
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:42
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:43
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:420
|
||||
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:7
|
||||
msgid "unknown"
|
||||
msgstr ""
|
||||
|
||||
@@ -1065,7 +1065,7 @@ msgstr ""
|
||||
#: src/validators/validateDns.ts:18
|
||||
#: src/validators/validateDomain.ts:13
|
||||
#: src/validators/validateDomain.ts:30
|
||||
#: src/validators/validateHysteriaUrl.ts:113
|
||||
#: src/validators/validateHysteriaUrl.ts:120
|
||||
#: src/validators/validateIp.ts:8
|
||||
#: src/validators/validateOutboundJson.ts:7
|
||||
#: src/validators/validatePath.ts:16
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# RU translations for PODKOP package.
|
||||
# Copyright (C) 2026 THE PODKOP'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PODKOP package.
|
||||
# romanvht, 2026.
|
||||
# divocatt, 2026.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PODKOP\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-05-09 12:50+1000\n"
|
||||
"PO-Revision-Date: 2026-05-09 12:50+1000\n"
|
||||
"Last-Translator: romanvht\n"
|
||||
"POT-Creation-Date: 2026-05-29 16:40+0300\n"
|
||||
"PO-Revision-Date: 2026-05-29 16:40+0300\n"
|
||||
"Last-Translator: divocatt\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -29,7 +29,9 @@ export async function getDashboardSections(): Promise<IGetDashboardSectionsRespo
|
||||
const data = configSections
|
||||
.filter(
|
||||
(section) =>
|
||||
section.connection_type !== 'block' && section['.type'] !== 'settings',
|
||||
section.connection_type !== 'block' &&
|
||||
section.connection_type !== 'exclusion' &&
|
||||
section['.type'] !== 'settings',
|
||||
)
|
||||
.map((section) => {
|
||||
if (section.connection_type === 'proxy') {
|
||||
|
||||
@@ -122,13 +122,18 @@ export namespace Podkop {
|
||||
connection_type: 'block';
|
||||
}
|
||||
|
||||
export interface ConfigExclusionSection {
|
||||
connection_type: 'exclusion';
|
||||
}
|
||||
|
||||
export type ConfigBaseSection =
|
||||
| ConfigProxyUrlTestSection
|
||||
| ConfigProxySelectorSection
|
||||
| ConfigProxyUrlSection
|
||||
| ConfigProxyOutboundSection
|
||||
| ConfigVpnSection
|
||||
| ConfigBlockSection;
|
||||
| ConfigBlockSection
|
||||
| ConfigExclusionSection;
|
||||
|
||||
export type ConfigSection = ConfigBaseSection & {
|
||||
'.name': string;
|
||||
|
||||
@@ -28,6 +28,11 @@ const validUrls = [
|
||||
|
||||
// Explicit obfs=none (valid)
|
||||
['obfs none = ok', 'hysteria2://pw@example.com:443/?obfs=none#hy2-none'],
|
||||
|
||||
[
|
||||
'port range 5000-6000',
|
||||
'hysteria2://letmein@example.com:123,5000-6000/?insecure=1&obfs=salamander&obfs-password=gawrgura&pinSHA256=deadbeef&sni=real.example.com',
|
||||
],
|
||||
];
|
||||
|
||||
const invalidUrls = [
|
||||
|
||||
@@ -6,19 +6,17 @@ export function validateHysteria2Url(url: string): ValidationResult {
|
||||
const isHY2 = url.startsWith('hysteria2://');
|
||||
const isHY2Short = url.startsWith('hy2://');
|
||||
|
||||
if (!isHY2 && !isHY2Short) {
|
||||
if (!isHY2 && !isHY2Short)
|
||||
return {
|
||||
valid: false,
|
||||
message: _('Invalid HY2 URL: must start with hysteria2:// or hy2://'),
|
||||
};
|
||||
}
|
||||
|
||||
if (/\s/.test(url)) {
|
||||
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);
|
||||
@@ -45,23 +43,39 @@ export function validateHysteria2Url(url: string): ValidationResult {
|
||||
|
||||
const [host, port] = hostPortPart.split(':');
|
||||
|
||||
if (!host) {
|
||||
if (!host)
|
||||
return { valid: false, message: _('Invalid HY2 URL: missing host') };
|
||||
}
|
||||
|
||||
if (!port) {
|
||||
if (!port)
|
||||
return { valid: false, message: _('Invalid HY2 URL: missing port') };
|
||||
}
|
||||
|
||||
const cleanedPort = port.replace('/', '');
|
||||
const portNum = Number(cleanedPort);
|
||||
const portEntries = cleanedPort.split(',');
|
||||
|
||||
if (!Number.isInteger(portNum) || portNum < 1 || portNum > 65535) {
|
||||
const isValidPortNumber = (value: string) => {
|
||||
if (!/^\d+$/.test(value)) return false;
|
||||
const num = Number(value);
|
||||
return num >= 1 && num <= 65535;
|
||||
};
|
||||
|
||||
const isValidPortEntry = (entry: string) => {
|
||||
if (!entry) return false;
|
||||
if (!entry.includes('-')) return isValidPortNumber(entry);
|
||||
|
||||
const rangeParts = entry.split('-');
|
||||
if (rangeParts.length !== 2) return false;
|
||||
|
||||
const [start, end] = rangeParts;
|
||||
if (!isValidPortNumber(start) || !isValidPortNumber(end)) return false;
|
||||
|
||||
return Number(start) <= Number(end);
|
||||
};
|
||||
|
||||
if (!portEntries.every(isValidPortEntry))
|
||||
return {
|
||||
valid: false,
|
||||
message: _('Invalid HY2 URL: invalid port number'),
|
||||
};
|
||||
}
|
||||
|
||||
if (queryString) {
|
||||
const params = parseQueryString(queryString);
|
||||
@@ -70,44 +84,37 @@ export function validateHysteria2Url(url: string): ValidationResult {
|
||||
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)
|
||||
) {
|
||||
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) {
|
||||
if (paramsKeys.includes('sni') && !params.sni)
|
||||
return {
|
||||
valid: false,
|
||||
message: _('Invalid HY2 URL: sni cannot be empty'),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return { valid: true, message: _('Valid') };
|
||||
|
||||
@@ -453,18 +453,16 @@ function validateHysteria2Url(url) {
|
||||
try {
|
||||
const isHY2 = url.startsWith("hysteria2://");
|
||||
const isHY2Short = url.startsWith("hy2://");
|
||||
if (!isHY2 && !isHY2Short) {
|
||||
if (!isHY2 && !isHY2Short)
|
||||
return {
|
||||
valid: false,
|
||||
message: _("Invalid HY2 URL: must start with hysteria2:// or hy2://")
|
||||
};
|
||||
}
|
||||
if (/\s/.test(url)) {
|
||||
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("#");
|
||||
@@ -483,50 +481,57 @@ function validateHysteria2Url(url) {
|
||||
message: _("Invalid HY2 URL: missing host & port")
|
||||
};
|
||||
const [host, port] = hostPortPart.split(":");
|
||||
if (!host) {
|
||||
if (!host)
|
||||
return { valid: false, message: _("Invalid HY2 URL: missing host") };
|
||||
}
|
||||
if (!port) {
|
||||
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) {
|
||||
const portEntries = cleanedPort.split(",");
|
||||
const isValidPortNumber = (value) => {
|
||||
if (!/^\d+$/.test(value)) return false;
|
||||
const num = Number(value);
|
||||
return num >= 1 && num <= 65535;
|
||||
};
|
||||
const isValidPortEntry = (entry) => {
|
||||
if (!entry) return false;
|
||||
if (!entry.includes("-")) return isValidPortNumber(entry);
|
||||
const rangeParts = entry.split("-");
|
||||
if (rangeParts.length !== 2) return false;
|
||||
const [start, end] = rangeParts;
|
||||
if (!isValidPortNumber(start) || !isValidPortNumber(end)) return false;
|
||||
return Number(start) <= Number(end);
|
||||
};
|
||||
if (!portEntries.every(isValidPortEntry))
|
||||
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)) {
|
||||
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)) {
|
||||
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"]) {
|
||||
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) {
|
||||
if (paramsKeys.includes("sni") && !params.sni)
|
||||
return {
|
||||
valid: false,
|
||||
message: _("Invalid HY2 URL: sni cannot be empty")
|
||||
};
|
||||
}
|
||||
}
|
||||
return { valid: true, message: _("Valid") };
|
||||
} catch (_e) {
|
||||
@@ -711,7 +716,7 @@ async function getDashboardSections() {
|
||||
})
|
||||
);
|
||||
const data = configSections.filter(
|
||||
(section) => section.connection_type !== "block" && section[".type"] !== "settings"
|
||||
(section) => section.connection_type !== "block" && section.connection_type !== "exclusion" && section[".type"] !== "settings"
|
||||
).map((section) => {
|
||||
if (section.connection_type === "proxy") {
|
||||
if (section.proxy_config_type === "url") {
|
||||
|
||||
@@ -311,7 +311,7 @@ function createSettingsContent(section) {
|
||||
|
||||
for (const secName in sections) {
|
||||
const sec = sections[secName];
|
||||
if (sec[".type"] === "section") {
|
||||
if (sec[".type"] === "section" && sec['connection_type'] !== 'block' && sec['connection_type'] !== 'exclusion') {
|
||||
this.keylist.push(secName);
|
||||
this.vallist.push(secName);
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# RU translations for PODKOP package.
|
||||
# Copyright (C) 2026 THE PODKOP'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PODKOP package.
|
||||
# romanvht, 2026.
|
||||
# divocatt, 2026.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PODKOP\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-05-09 12:50+1000\n"
|
||||
"PO-Revision-Date: 2026-05-09 12:50+1000\n"
|
||||
"Last-Translator: romanvht\n"
|
||||
"POT-Creation-Date: 2026-05-29 16:40+0300\n"
|
||||
"PO-Revision-Date: 2026-05-29 16:40+0300\n"
|
||||
"Last-Translator: divocatt\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PODKOP package.
|
||||
# romanvht <romanvht@gmail.com>, 2026.
|
||||
# divocatt <210179590+divocatt@users.noreply.github.com>, 2026.
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PODKOP\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-05-09 02:49+1000\n"
|
||||
"PO-Revision-Date: 2026-05-09 02:49+1000\n"
|
||||
"Last-Translator: romanvht <romanvht@gmail.com>\n"
|
||||
"POT-Creation-Date: 2026-05-29 13:40+0300\n"
|
||||
"PO-Revision-Date: 2026-05-29 13:40+0300\n"
|
||||
"Last-Translator: divocatt <210179590+divocatt@users.noreply.github.com>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -394,35 +394,35 @@ msgstr ""
|
||||
msgid "Invalid format. Use X.X.X.X or X.X.X.X/Y"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:76
|
||||
#: src/validators/validateHysteriaUrl.ts:90
|
||||
msgid "Invalid HY2 URL: insecure must be 0 or 1"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:62
|
||||
#: src/validators/validateHysteriaUrl.ts:77
|
||||
msgid "Invalid HY2 URL: invalid port number"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:32
|
||||
#: src/validators/validateHysteriaUrl.ts:30
|
||||
msgid "Invalid HY2 URL: missing credentials/server"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:49
|
||||
#: src/validators/validateHysteriaUrl.ts:47
|
||||
msgid "Invalid HY2 URL: missing host"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:43
|
||||
#: src/validators/validateHysteriaUrl.ts:41
|
||||
msgid "Invalid HY2 URL: missing host & port"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:38
|
||||
#: src/validators/validateHysteriaUrl.ts:36
|
||||
msgid "Invalid HY2 URL: missing password"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:53
|
||||
#: src/validators/validateHysteriaUrl.ts:50
|
||||
msgid "Invalid HY2 URL: missing port"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:19
|
||||
#: src/validators/validateHysteriaUrl.ts:18
|
||||
msgid "Invalid HY2 URL: must not contain spaces"
|
||||
msgstr ""
|
||||
|
||||
@@ -430,19 +430,19 @@ msgstr ""
|
||||
msgid "Invalid HY2 URL: must start with hysteria2:// or hy2://"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:99
|
||||
#: src/validators/validateHysteriaUrl.ts:108
|
||||
msgid "Invalid HY2 URL: obfs-password required when obfs is set"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:115
|
||||
#: src/validators/validateHysteriaUrl.ts:122
|
||||
msgid "Invalid HY2 URL: parsing failed"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:108
|
||||
#: src/validators/validateHysteriaUrl.ts:116
|
||||
msgid "Invalid HY2 URL: sni cannot be empty"
|
||||
msgstr ""
|
||||
|
||||
#: src/validators/validateHysteriaUrl.ts:88
|
||||
#: src/validators/validateHysteriaUrl.ts:98
|
||||
msgid "Invalid HY2 URL: unsupported obfs type"
|
||||
msgstr ""
|
||||
|
||||
@@ -563,7 +563,7 @@ msgstr ""
|
||||
msgid "Issues detected"
|
||||
msgstr ""
|
||||
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:456
|
||||
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:48
|
||||
msgid "Latest"
|
||||
msgstr ""
|
||||
|
||||
@@ -641,7 +641,7 @@ msgstr ""
|
||||
msgid "Outbound Configuration"
|
||||
msgstr ""
|
||||
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:446
|
||||
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:38
|
||||
msgid "Outdated"
|
||||
msgstr ""
|
||||
|
||||
@@ -996,7 +996,7 @@ msgstr ""
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:41
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:42
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:43
|
||||
#: src/podkop/tabs/diagnostic/initController.ts:420
|
||||
#: src/podkop/tabs/diagnostic/helpers/getPodkopVersionRow.ts:7
|
||||
msgid "unknown"
|
||||
msgstr ""
|
||||
|
||||
@@ -1065,7 +1065,7 @@ msgstr ""
|
||||
#: src/validators/validateDns.ts:18
|
||||
#: src/validators/validateDomain.ts:13
|
||||
#: src/validators/validateDomain.ts:30
|
||||
#: src/validators/validateHysteriaUrl.ts:113
|
||||
#: src/validators/validateHysteriaUrl.ts:120
|
||||
#: src/validators/validateIp.ts:8
|
||||
#: src/validators/validateOutboundJson.ts:7
|
||||
#: src/validators/validatePath.ts:16
|
||||
|
||||
@@ -1316,7 +1316,7 @@ import_community_service_subnet_list_handler() {
|
||||
URL=$SUBNETS_DISCORD
|
||||
nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME"
|
||||
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr \
|
||||
"@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter
|
||||
"@$NFT_DISCORD_SET_NAME" udp dport '{ 19000-20000, 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter
|
||||
;;
|
||||
"roblox")
|
||||
URL=$SUBNETS_ROBLOX
|
||||
|
||||
@@ -178,8 +178,9 @@ _add_outbound_security() {
|
||||
|
||||
local security scheme
|
||||
security=$(url_get_query_param "$url" "security")
|
||||
scheme="$(url_get_scheme "$url")"
|
||||
|
||||
if [ -z "$security" ]; then
|
||||
scheme="$(url_get_scheme "$url")"
|
||||
if [ "$scheme" = "hysteria2" ] || [ "$scheme" = "hy2" ]; then
|
||||
security="tls"
|
||||
fi
|
||||
@@ -195,6 +196,10 @@ _add_outbound_security() {
|
||||
public_key=$(url_get_query_param "$url" "pbk")
|
||||
short_id=$(url_get_query_param "$url" "sid")
|
||||
|
||||
if [ "$scheme" = "hysteria2" ] || [ "$scheme" = "hy2" ]; then
|
||||
fingerprint=""
|
||||
fi
|
||||
|
||||
config=$(
|
||||
sing_box_cm_set_tls_for_outbound \
|
||||
"$config" \
|
||||
|
||||
@@ -692,6 +692,11 @@ sing_box_cm_add_hysteria2_outbound() {
|
||||
local download_mbps="$9"
|
||||
local network="${10}"
|
||||
|
||||
local is_multi_port="false"
|
||||
case "$server_port" in
|
||||
*","*|*"-"*) is_multi_port="true" ;;
|
||||
esac
|
||||
|
||||
echo "$config" | jq \
|
||||
--arg tag "$tag" \
|
||||
--arg server_address "$server_address" \
|
||||
@@ -702,14 +707,25 @@ sing_box_cm_add_hysteria2_outbound() {
|
||||
--arg upload_mbps "$upload_mbps" \
|
||||
--arg download_mbps "$download_mbps" \
|
||||
--arg network "$network" \
|
||||
'.outbounds += [(
|
||||
--argjson is_multi_port "$is_multi_port" \
|
||||
'
|
||||
def parse_port_entry:
|
||||
if index("-") then split("-") | join(":")
|
||||
else . + ":" + .
|
||||
end;
|
||||
|
||||
.outbounds += [(
|
||||
{
|
||||
type: "hysteria2",
|
||||
tag: $tag,
|
||||
server: $server_address,
|
||||
server_port: ($server_port | tonumber),
|
||||
password: $password
|
||||
}
|
||||
+ (if $is_multi_port then {
|
||||
server_ports: ($server_port | split(",") | map(ltrimstr(" ") | rtrimstr(" ") | parse_port_entry))
|
||||
} else {
|
||||
server_port: ($server_port | tonumber)
|
||||
} end)
|
||||
+ (if $obfuscator_type != "" and $obfuscator_password != "" then {
|
||||
obfs: {
|
||||
type: $obfuscator_type,
|
||||
|
||||
Reference in New Issue
Block a user