Переименование проекта: RKNboost → SenBoost
Затрагивает не только видимые строки, но и системные идентификаторы: appId (com.senboost.app), служба Windows (senboost-zapret) и её каталог в %ProgramData%, LaunchDaemon и pf-якорь на macOS (com.senboost.zapret, com.apple/senboost), каталог /run/senboost и таблица nftables на Linux, маркер стратегии в strategy.cfg (--comment=senboost:<id>:<hash>), а также каталог userData, который Electron выводит из имени приложения.
This commit is contained in:
@@ -123,7 +123,7 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: rknboost-windows
|
name: senboost-windows
|
||||||
path: release/*.exe
|
path: release/*.exe
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 7
|
retention-days: 7
|
||||||
@@ -189,7 +189,7 @@ jobs:
|
|||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: rknboost-linux
|
name: senboost-linux
|
||||||
path: |
|
path: |
|
||||||
release/*.AppImage
|
release/*.AppImage
|
||||||
release/*.deb
|
release/*.deb
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# RKNboost
|
# SenBoost
|
||||||
|
|
||||||
очередная обертка под zapret
|
очередная обертка под zapret
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ npm run build:linux # AppImage + .deb (x64)
|
|||||||
|
|
||||||
| Платформа | Движок | Права | Статус |
|
| Платформа | Движок | Права | Статус |
|
||||||
| --------- | ------------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------ |
|
| --------- | ------------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------ |
|
||||||
| Windows | `winws` + драйвер WinDivert, служба `rknboost-zapret` | UAC при первой настройке | стабильно, гарантированно работает |
|
| Windows | `winws` + драйвер WinDivert, служба `senboost-zapret` | UAC при первой настройке | стабильно, гарантированно работает |
|
||||||
| macOS | `utunws` (форк nfqws под utun+BPF) + правила pf, LaunchDaemon | пароль администратора при каждом включении/выключении | частично — движок портирован недавно |
|
| macOS | `utunws` (форк nfqws под utun+BPF) + правила pf, LaunchDaemon | пароль администратора при каждом включении/выключении | частично — движок портирован недавно |
|
||||||
| Linux | `nfqws` + правила nftables (NFQUEUE) | пароль через `pkexec` при каждом включении/выключении | частично |
|
| Linux | `nfqws` + правила nftables (NFQUEUE) | пароль через `pkexec` при каждом включении/выключении | частично |
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ VPN/туннель (маршрут по умолчанию уходит в св
|
|||||||
Принудительная остановка (если приложение недоступно):
|
Принудительная остановка (если приложение недоступно):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo "/Library/Application Support/RKNboost/zapret/stop.sh"
|
sudo "/Library/Application Support/SenBoost/zapret/stop.sh"
|
||||||
```
|
```
|
||||||
|
|
||||||
На Linux дополнительно нужны пакеты `nftables` и `polkit` (в .deb — заявлены как зависимости
|
На Linux дополнительно нужны пакеты `nftables` и `polkit` (в .deb — заявлены как зависимости
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
; Служба rknboost-zapret не ставится этим установщиком — её создаёт и настраивает само
|
; Служба senboost-zapret не ставится этим установщиком — её создаёт и настраивает само
|
||||||
; приложение при первом включении обхода (src/main/zapret/service.win32.ts), потому что
|
; приложение при первом включении обхода (src/main/zapret/service.win32.ts), потому что
|
||||||
; аргументы winws зависят от выбранной пользователем стратегии. Но снять её при удалении
|
; аргументы winws зависят от выбранной пользователем стратегии. Но снять её при удалении
|
||||||
; приложения обязаны мы: иначе в системе остаётся служба, указывающая на удалённый winws.exe.
|
; приложения обязаны мы: иначе в системе остаётся служба, указывающая на удалённый winws.exe.
|
||||||
@@ -11,6 +11,6 @@
|
|||||||
|
|
||||||
!macro customUnInstall
|
!macro customUnInstall
|
||||||
DetailPrint "Останавливаю службу обхода блокировок..."
|
DetailPrint "Останавливаю службу обхода блокировок..."
|
||||||
nsExec::Exec `powershell.exe -NoProfile -Command "try { Start-Process powershell -Verb RunAs -Wait -ArgumentList @('-NoProfile','-Command','sc.exe stop rknboost-zapret; sc.exe delete rknboost-zapret; Remove-Item -Recurse -Force $$env:ProgramData\rknboost -ErrorAction SilentlyContinue') } catch {}"`
|
nsExec::Exec `powershell.exe -NoProfile -Command "try { Start-Process powershell -Verb RunAs -Wait -ArgumentList @('-NoProfile','-Command','sc.exe stop senboost-zapret; sc.exe delete senboost-zapret; Remove-Item -Recurse -Force $$env:ProgramData\senboost -ErrorAction SilentlyContinue') } catch {}"`
|
||||||
Pop $0
|
Pop $0
|
||||||
!macroend
|
!macroend
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
appId: com.rknboost.app
|
appId: com.senboost.app
|
||||||
productName: RKNboost
|
productName: SenBoost
|
||||||
directories:
|
directories:
|
||||||
buildResources: build
|
buildResources: build
|
||||||
output: release
|
output: release
|
||||||
@@ -52,10 +52,10 @@ extraResources:
|
|||||||
- 'LICENSE.flowseal.txt'
|
- 'LICENSE.flowseal.txt'
|
||||||
|
|
||||||
win:
|
win:
|
||||||
executableName: RKNboost
|
executableName: SenBoost
|
||||||
# Приложение запрашивает права администратора при КАЖДОМ запуске (манифест exe).
|
# Приложение запрашивает права администратора при КАЖДОМ запуске (манифест exe).
|
||||||
# Внимание на компромисс: установка при этом остаётся per-user, то есть exe лежит в
|
# Внимание на компромисс: установка при этом остаётся per-user, то есть exe лежит в
|
||||||
# %LocalAppData%\Programs\RKNboost — папке, доступной на запись обычному пользователю.
|
# %LocalAppData%\Programs\SenBoost — папке, доступной на запись обычному пользователю.
|
||||||
# Значит подмена этого exe даёт злоумышленнику администратора с подтверждения самого
|
# Значит подмена этого exe даёт злоумышленнику администратора с подтверждения самого
|
||||||
# пользователя. Это осознанный выбор владельца проекта; безопасный вариант — вернуть
|
# пользователя. Это осознанный выбор владельца проекта; безопасный вариант — вернуть
|
||||||
# perMachine: true, чтобы exe лежал в защищённом от записи Program Files.
|
# perMachine: true, чтобы exe лежал в защищённом от записи Program Files.
|
||||||
@@ -86,7 +86,7 @@ nsis:
|
|||||||
# differentialPackage: false отключает генерацию .blockmap, который иначе всегда
|
# differentialPackage: false отключает генерацию .blockmap, который иначе всегда
|
||||||
# заливался бы в ассеты релиза рядом с инсталлятором.
|
# заливался бы в ассеты релиза рядом с инсталлятором.
|
||||||
differentialPackage: false
|
differentialPackage: false
|
||||||
# Удалять %APPDATA%\rknboost (списки сайтов, метка первого запуска) вместе с приложением.
|
# Удалять %APPDATA%\senboost (списки сайтов, метка первого запуска) вместе с приложением.
|
||||||
# По умолчанию electron-builder этого НЕ делает, и данные оставались бы в системе после
|
# По умолчанию electron-builder этого НЕ делает, и данные оставались бы в системе после
|
||||||
# удаления. Обновление приложения под это не попадает — в шаблоне деинсталлятора стоит
|
# удаления. Обновление приложения под это не попадает — в шаблоне деинсталлятора стоит
|
||||||
# проверка `ifNot isUpdated`, так что отредактированные списки переживают обновление.
|
# проверка `ifNot isUpdated`, так что отредактированные списки переживают обновление.
|
||||||
@@ -131,7 +131,7 @@ dmg:
|
|||||||
artifactName: ${name}-${version}-${arch}.${ext}
|
artifactName: ${name}-${version}-${arch}.${ext}
|
||||||
|
|
||||||
linux:
|
linux:
|
||||||
executableName: rknboost
|
executableName: senboost
|
||||||
# desktopName в package.json + syncDesktopName — иначе Electron не свяжет открытые окна
|
# desktopName в package.json + syncDesktopName — иначе Electron не свяжет открытые окна
|
||||||
# с .desktop-записью (app_id/WM_CLASS), и часть окружений не покажет иконку в панели задач.
|
# с .desktop-записью (app_id/WM_CLASS), и часть окружений не покажет иконку в панели задач.
|
||||||
syncDesktopName: true
|
syncDesktopName: true
|
||||||
@@ -140,13 +140,13 @@ linux:
|
|||||||
arch: [x64]
|
arch: [x64]
|
||||||
- target: deb
|
- target: deb
|
||||||
arch: [x64]
|
arch: [x64]
|
||||||
maintainer: RKNboost
|
maintainer: SenBoost
|
||||||
category: Network
|
category: Network
|
||||||
synopsis: Обход блокировок через zapret
|
synopsis: Обход блокировок через zapret
|
||||||
extraResources:
|
extraResources:
|
||||||
- from: resources/zapret/linux
|
- from: resources/zapret/linux
|
||||||
to: zapret/linux
|
to: zapret/linux
|
||||||
# rknboost-helper.sh — привилегированный помощник (nfqws.linux.ts зовёт его через
|
# senboost-helper.sh — привилегированный помощник (nfqws.linux.ts зовёт его через
|
||||||
# pkexec). Не из resources/zapret: тот качает fetch-zapret.mjs, а этот файл — свой,
|
# pkexec). Не из resources/zapret: тот качает fetch-zapret.mjs, а этот файл — свой,
|
||||||
# лежит в репозитории (см. src/main/zapret/paths.ts:bundledHelperPath()).
|
# лежит в репозитории (см. src/main/zapret/paths.ts:bundledHelperPath()).
|
||||||
- from: resources/linux-helper
|
- from: resources/linux-helper
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "rknboost",
|
"name": "senboost",
|
||||||
"version": "0.6.0",
|
"version": "0.6.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "rknboost",
|
"name": "senboost",
|
||||||
"version": "0.6.0",
|
"version": "0.6.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
+4
-4
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"name": "rknboost",
|
"name": "senboost",
|
||||||
"version": "0.6.0",
|
"version": "0.6.0",
|
||||||
"description": "Кроссплатформенное десктопное приложение на Electron + React + TypeScript",
|
"description": "Кроссплатформенное десктопное приложение на Electron + React + TypeScript",
|
||||||
"main": "./out/main/index.js",
|
"main": "./out/main/index.js",
|
||||||
"desktopName": "rknboost.desktop",
|
"desktopName": "senboost.desktop",
|
||||||
"author": "RKNboost",
|
"author": "SenBoost",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/maeneko/rknboost"
|
"url": "https://github.com/maeneko/senboost"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
# на Windows (`sc config start=`, тоже не трогает работающую службу).
|
# на Windows (`sc config start=`, тоже не трогает работающую службу).
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
PLIST=/Library/LaunchDaemons/com.rknboost.zapret.plist
|
PLIST=/Library/LaunchDaemons/com.senboost.zapret.plist
|
||||||
|
|
||||||
if [ "$#" -ne 1 ]; then
|
if [ "$#" -ne 1 ]; then
|
||||||
echo 'autostart.sh: ожидается 1 аргумент (0 или 1)' >&2
|
echo 'autostart.sh: ожидается 1 аргумент (0 или 1)' >&2
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Супервизор обхода — то, что реально запускает launchd (com.rknboost.zapret.plist.in,
|
# Супервизор обхода — то, что реально запускает launchd (com.senboost.zapret.plist.in,
|
||||||
# ProgramArguments). Живёт под root, пока LaunchDaemon загружен; KeepAlive/SuccessfulExit
|
# ProgramArguments). Живёт под root, пока LaunchDaemon загружен; KeepAlive/SuccessfulExit
|
||||||
# в plist перезапускает этот скрипт заново при любом его завершении — поэтому определение
|
# в plist перезапускает этот скрипт заново при любом его завершении — поэтому определение
|
||||||
# интерфейса/MAC шлюза выполняется здесь при каждом старте (в том числе после смены сети),
|
# интерфейса/MAC шлюза выполняется здесь при каждом старте (в том числе после смены сети),
|
||||||
@@ -7,15 +7,15 @@
|
|||||||
# (MIT) — та же логика с utunws через utun+BPF, свои идентификаторы (см. install.sh).
|
# (MIT) — та же логика с utunws через utun+BPF, свои идентификаторы (см. install.sh).
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
DEST='/Library/Application Support/RKNboost/zapret'
|
DEST='/Library/Application Support/SenBoost/zapret'
|
||||||
ANCHOR=com.apple/rknboost
|
ANCHOR=com.apple/senboost
|
||||||
UTUN_UNIT=61
|
UTUN_UNIT=61
|
||||||
UTUN_IFACE=utun60
|
UTUN_IFACE=utun60
|
||||||
UTUN_LOCAL=10.78.0.1
|
UTUN_LOCAL=10.78.0.1
|
||||||
UTUN_REMOTE=10.78.0.2
|
UTUN_REMOTE=10.78.0.2
|
||||||
PIDFILE=/var/run/rknboost-zapret.pid
|
PIDFILE=/var/run/senboost-zapret.pid
|
||||||
TOKEN_FILE=/var/run/rknboost-zapret.pf-token
|
TOKEN_FILE=/var/run/senboost-zapret.pf-token
|
||||||
ROUTE6_FILE=/var/run/rknboost-zapret.route6
|
ROUTE6_FILE=/var/run/senboost-zapret.route6
|
||||||
ENGINE_PID=
|
ENGINE_PID=
|
||||||
WATCHDOG_PID=
|
WATCHDOG_PID=
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Привилегированная установка обхода блокировок на macOS — единственное, что RKNboost
|
# Привилегированная установка обхода блокировок на macOS — единственное, что SenBoost
|
||||||
# запускает через osascript "with administrator privileges" (см. elevate.darwin.ts) для
|
# запускает через osascript "with administrator privileges" (см. elevate.darwin.ts) для
|
||||||
# включения обхода. Не редактировать под bash-специфику: этот файл исполняется как
|
# включения обхода. Не редактировать под bash-специфику: этот файл исполняется как
|
||||||
# /bin/sh — на macOS это тот же путь, что и на Linux, но лучше не полагаться на bashisms.
|
# /bin/sh — на macOS это тот же путь, что и на Linux, но лучше не полагаться на bashisms.
|
||||||
@@ -9,10 +9,10 @@
|
|||||||
#
|
#
|
||||||
# Аргументы (все уже подготовлены и провалидированы на стороне приложения — сюда попадают
|
# Аргументы (все уже подготовлены и провалидированы на стороне приложения — сюда попадают
|
||||||
# только готовые пути и провалидированные строки портов, тот же принцип, что у Linux-
|
# только готовые пути и провалидированные строки портов, тот же принцип, что у Linux-
|
||||||
# помощника resources/linux-helper/rknboost-helper.sh):
|
# помощника resources/linux-helper/senboost-helper.sh):
|
||||||
# 1: utunws_src — путь к бинарнику utunws в resources/zapret/darwin (ещё не установлен)
|
# 1: utunws_src — путь к бинарнику utunws в resources/zapret/darwin (ещё не установлен)
|
||||||
# 2: fakes_src — каталог с fake-пакетами (resources/zapret/fakes)
|
# 2: fakes_src — каталог с fake-пакетами (resources/zapret/fakes)
|
||||||
# 3: config_src — уже отрендеренный strategy.cfg (маркер --comment=rknboost:<id>:<hash>
|
# 3: config_src — уже отрендеренный strategy.cfg (маркер --comment=senboost:<id>:<hash>
|
||||||
# первой строкой, пути {LISTS}/{FAKES} уже резолвлены — см. strategies.ts)
|
# первой строкой, пути {LISTS}/{FAKES} уже резолвлены — см. strategies.ts)
|
||||||
# 4: tcp_ports — список портов TCP для pf, формат "80,443,8443" (уже проверен регуляркой
|
# 4: tcp_ports — список портов TCP для pf, формат "80,443,8443" (уже проверен регуляркой
|
||||||
# в packetEngineConfig())
|
# в packetEngineConfig())
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
HELPER_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd)
|
HELPER_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd)
|
||||||
DEST='/Library/Application Support/RKNboost/zapret'
|
DEST='/Library/Application Support/SenBoost/zapret'
|
||||||
LABEL=com.rknboost.zapret
|
LABEL=com.senboost.zapret
|
||||||
PLIST=/Library/LaunchDaemons/$LABEL.plist
|
PLIST=/Library/LaunchDaemons/$LABEL.plist
|
||||||
ANCHOR=com.apple/rknboost
|
ANCHOR=com.apple/senboost
|
||||||
PIDFILE=/var/run/rknboost-zapret.pid
|
PIDFILE=/var/run/senboost-zapret.pid
|
||||||
TOKEN_FILE=/var/run/rknboost-zapret.pf-token
|
TOKEN_FILE=/var/run/senboost-zapret.pf-token
|
||||||
KEEPINIT_FILE=/var/db/rknboost-zapret.keepinit
|
KEEPINIT_FILE=/var/db/senboost-zapret.keepinit
|
||||||
|
|
||||||
if [ "$#" -ne 6 ]; then
|
if [ "$#" -ne 6 ]; then
|
||||||
echo 'install.sh: ожидается 6 аргументов' >&2
|
echo 'install.sh: ожидается 6 аргументов' >&2
|
||||||
@@ -45,7 +45,7 @@ RUN_AT_LOAD=$6
|
|||||||
[ -d "$FAKES_SRC" ] || { echo 'install.sh: не найден каталог fake-пакетов' >&2; exit 1; }
|
[ -d "$FAKES_SRC" ] || { echo 'install.sh: не найден каталог fake-пакетов' >&2; exit 1; }
|
||||||
[ -f "$CONFIG_SRC" ] || { echo 'install.sh: не найден strategy.cfg' >&2; exit 1; }
|
[ -f "$CONFIG_SRC" ] || { echo 'install.sh: не найден strategy.cfg' >&2; exit 1; }
|
||||||
# Формат уже проверен регуляркой в packetEngineConfig()/utunwsConfig() — здесь просто не
|
# Формат уже проверен регуляркой в packetEngineConfig()/utunwsConfig() — здесь просто не
|
||||||
# доверяем слепо тому, что дошло до root, тот же приём, что в rknboost-helper.sh на Linux.
|
# доверяем слепо тому, что дошло до root, тот же приём, что в senboost-helper.sh на Linux.
|
||||||
# ':' — не опечатка: utunwsConfig() переводит диапазоны в синтаксис pf (19294-19344 →
|
# ':' — не опечатка: utunwsConfig() переводит диапазоны в синтаксис pf (19294-19344 →
|
||||||
# 19294:19344, см. toPfPortRanges() в strategies.ts), дефисов в этих строках уже нет.
|
# 19294:19344, см. toPfPortRanges() в strategies.ts), дефисов в этих строках уже нет.
|
||||||
case ",$TCP_PORTS," in *[!0-9,:]*) echo 'install.sh: странный формат tcp-портов' >&2; exit 1 ;; esac
|
case ",$TCP_PORTS," in *[!0-9,:]*) echo 'install.sh: странный формат tcp-портов' >&2; exit 1 ;; esac
|
||||||
@@ -57,7 +57,7 @@ case "$RUN_AT_LOAD" in
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
# Сносим прошлую установку — самолечение на случай аварийно прерванной прошлой сессии,
|
# Сносим прошлую установку — самолечение на случай аварийно прерванной прошлой сессии,
|
||||||
# тот же приём, что cmd_stop() в rknboost-helper.sh на Linux делает первым шагом start.
|
# тот же приём, что cmd_stop() в senboost-helper.sh на Linux делает первым шагом start.
|
||||||
/bin/launchctl bootout system/"$LABEL" >/dev/null 2>&1 || true
|
/bin/launchctl bootout system/"$LABEL" >/dev/null 2>&1 || true
|
||||||
/sbin/pfctl -a "$ANCHOR" -F all >/dev/null 2>&1 || true
|
/sbin/pfctl -a "$ANCHOR" -F all >/dev/null 2>&1 || true
|
||||||
# Матчим процесс по полному пути НАШЕЙ установки, а не по имени: "utunws" называется так
|
# Матчим процесс по полному пути НАШЕЙ установки, а не по имени: "utunws" называется так
|
||||||
@@ -96,7 +96,7 @@ printf '%s\n%s\n' "$TCP_PORTS" "$UDP_PORTS" > "$DEST/ports.conf"
|
|||||||
-e "s|@LABEL@|$LABEL|g" \
|
-e "s|@LABEL@|$LABEL|g" \
|
||||||
-e "s|@DEST@|$DEST|g" \
|
-e "s|@DEST@|$DEST|g" \
|
||||||
-e "s|@RUNATLOAD@|$RUNATLOAD|g" \
|
-e "s|@RUNATLOAD@|$RUNATLOAD|g" \
|
||||||
"$HELPER_DIR/com.rknboost.zapret.plist.in" > "$PLIST"
|
"$HELPER_DIR/com.senboost.zapret.plist.in" > "$PLIST"
|
||||||
/usr/sbin/chown root:wheel "$PLIST"
|
/usr/sbin/chown root:wheel "$PLIST"
|
||||||
/bin/chmod 644 "$PLIST"
|
/bin/chmod 644 "$PLIST"
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,13 @@
|
|||||||
# применяется заново при следующем включении (см. engine.darwin.ts).
|
# применяется заново при следующем включении (см. engine.darwin.ts).
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
LABEL=com.rknboost.zapret
|
LABEL=com.senboost.zapret
|
||||||
ANCHOR=com.apple/rknboost
|
ANCHOR=com.apple/senboost
|
||||||
DEST='/Library/Application Support/RKNboost/zapret'
|
DEST='/Library/Application Support/SenBoost/zapret'
|
||||||
PLIST=/Library/LaunchDaemons/$LABEL.plist
|
PLIST=/Library/LaunchDaemons/$LABEL.plist
|
||||||
PIDFILE=/var/run/rknboost-zapret.pid
|
PIDFILE=/var/run/senboost-zapret.pid
|
||||||
TOKEN_FILE=/var/run/rknboost-zapret.pf-token
|
TOKEN_FILE=/var/run/senboost-zapret.pf-token
|
||||||
KEEPINIT_FILE=/var/db/rknboost-zapret.keepinit
|
KEEPINIT_FILE=/var/db/senboost-zapret.keepinit
|
||||||
|
|
||||||
/bin/launchctl disable system/"$LABEL" >/dev/null 2>&1 || true
|
/bin/launchctl disable system/"$LABEL" >/dev/null 2>&1 || true
|
||||||
/bin/launchctl bootout system/"$LABEL" >/dev/null 2>&1 || true
|
/bin/launchctl bootout system/"$LABEL" >/dev/null 2>&1 || true
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
# watchdog.sh форка Flowseal/zapret-mac-discord-youtube (MIT) без изменений логики.
|
# watchdog.sh форка Flowseal/zapret-mac-discord-youtube (MIT) без изменений логики.
|
||||||
SUPERVISOR_PID=$1
|
SUPERVISOR_PID=$1
|
||||||
ENGINE_PID=$2
|
ENGINE_PID=$2
|
||||||
ANCHOR=com.apple/rknboost
|
ANCHOR=com.apple/senboost
|
||||||
TOKEN_FILE=/var/run/rknboost-zapret.pf-token
|
TOKEN_FILE=/var/run/senboost-zapret.pf-token
|
||||||
|
|
||||||
while kill -0 "$SUPERVISOR_PID" 2>/dev/null && kill -0 "$ENGINE_PID" 2>/dev/null; do
|
while kill -0 "$SUPERVISOR_PID" 2>/dev/null && kill -0 "$ENGINE_PID" 2>/dev/null; do
|
||||||
sleep 0.2
|
sleep 0.2
|
||||||
|
|||||||
+5
-5
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Привилегированный помощник обхода блокировок на Linux — единственное, что RKNboost
|
# Привилегированный помощник обхода блокировок на Linux — единственное, что SenBoost
|
||||||
# запускает через `pkexec`. Не редактировать под bash-специфику: /bin/sh на Debian/Ubuntu —
|
# запускает через `pkexec`. Не редактировать под bash-специфику: /bin/sh на Debian/Ubuntu —
|
||||||
# это dash, а не bash.
|
# это dash, а не bash.
|
||||||
#
|
#
|
||||||
@@ -17,18 +17,18 @@
|
|||||||
# команда не найдена) при разборе результата на стороне приложения.
|
# команда не найдена) при разборе результата на стороне приложения.
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
RUN_DIR=/run/rknboost
|
RUN_DIR=/run/senboost
|
||||||
PIDFILE="$RUN_DIR/nfqws.pid"
|
PIDFILE="$RUN_DIR/nfqws.pid"
|
||||||
CONFIG="$RUN_DIR/strategy.cfg"
|
CONFIG="$RUN_DIR/strategy.cfg"
|
||||||
ERRLOG="$RUN_DIR/nfqws.err"
|
ERRLOG="$RUN_DIR/nfqws.err"
|
||||||
TABLE_FAMILY=inet
|
TABLE_FAMILY=inet
|
||||||
TABLE_NAME=rknboost
|
TABLE_NAME=senboost
|
||||||
# Держать в синхроне с NFQUEUE_NUM в nfqws.linux.ts (используется там же для --dry-run).
|
# Держать в синхроне с NFQUEUE_NUM в nfqws.linux.ts (используется там же для --dry-run).
|
||||||
QUEUE_NUM=220
|
QUEUE_NUM=220
|
||||||
FW_MARK=0x40000000
|
FW_MARK=0x40000000
|
||||||
|
|
||||||
log() {
|
log() {
|
||||||
echo "rknboost-helper: $*" >&2
|
echo "senboost-helper: $*" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
# pkexec запускает с урезанным PATH (санирует окружение) — sbin, где обычно лежит nft,
|
# pkexec запускает с урезанным PATH (санирует окружение) — sbin, где обычно лежит nft,
|
||||||
@@ -107,7 +107,7 @@ cmd_start() {
|
|||||||
chmod 0755 "$RUN_DIR"
|
chmod 0755 "$RUN_DIR"
|
||||||
|
|
||||||
# strategy.cfg в /run — источник маркера стратегии для LinuxEngine.sync(): читается без
|
# strategy.cfg в /run — источник маркера стратегии для LinuxEngine.sync(): читается без
|
||||||
# root (0644), первая строка — тот же --comment=rknboost:<id>:<hash>, что и на Windows.
|
# root (0644), первая строка — тот же --comment=senboost:<id>:<hash>, что и на Windows.
|
||||||
cp "$config_src" "$CONFIG"
|
cp "$config_src" "$CONFIG"
|
||||||
chmod 0644 "$CONFIG"
|
chmod 0644 "$CONFIG"
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ export async function showFirstRunSupportDialog(window: BrowserWindow): Promise<
|
|||||||
defaultId: 0,
|
defaultId: 0,
|
||||||
cancelId: 1,
|
cancelId: 1,
|
||||||
noLink: true,
|
noLink: true,
|
||||||
title: 'Поддержите RKNboost',
|
title: 'Поддержите SenBoost',
|
||||||
message: 'Поддержите проект',
|
message: 'Поддержите проект',
|
||||||
detail: 'Поддержите проект звездочкой на GitHub, и расскажите друзьям :З'
|
detail: 'Поддержите проект звездочкой на GitHub, и расскажите друзьям :З'
|
||||||
})
|
})
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ import { registerIpcHandlers } from './ipc'
|
|||||||
import { disposeZapret, recoverZapret } from './zapret'
|
import { disposeZapret, recoverZapret } from './zapret'
|
||||||
import { elevatedTaskDir, runElevatedServiceTask } from './zapret/elevated-task.win32'
|
import { elevatedTaskDir, runElevatedServiceTask } from './zapret/elevated-task.win32'
|
||||||
|
|
||||||
const APP_ID = 'com.rknboost.app'
|
const APP_ID = 'com.senboost.app'
|
||||||
|
|
||||||
// Приложение может быть запущено само собой через UAC как «повышенный помощник» — тогда
|
// Приложение может быть запущено само собой через UAC как «повышенный помощник» — тогда
|
||||||
// оно не открывает окно и не занимает единственный экземпляр (иначе отдало бы фокус уже
|
// оно не открывает окно и не занимает единственный экземпляр (иначе отдало бы фокус уже
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { app } from 'electron'
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Выбор пользователя между запусками: `settings.json` в userData (на Windows —
|
* Выбор пользователя между запусками: `settings.json` в userData (на Windows —
|
||||||
* `%AppData%\RKNboost`), поэтому переживает обновление и переустановку.
|
* `%AppData%\SenBoost`), поэтому переживает обновление и переустановку.
|
||||||
*
|
*
|
||||||
* Списки сайтов сюда не входят: они лежат рядом, в `userData/zapret-lists/*.txt`, и
|
* Списки сайтов сюда не входят: они лежат рядом, в `userData/zapret-lists/*.txt`, и
|
||||||
* читаются прямо оттуда самими tpws и winws (см. `zapret/lists.ts`).
|
* читаются прямо оттуда самими tpws и winws (см. `zapret/lists.ts`).
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ interface UninstallCommand {
|
|||||||
* строкой `'"$2" $0'`, где `$2` — путь к деинсталлятору, а `$0` — `/currentuser` для
|
* строкой `'"$2" $0'`, где `$2` — путь к деинсталлятору, а `$0` — `/currentuser` для
|
||||||
* per-user установки (или `/allusers`). То есть путь в кавычках И аргумент после него:
|
* per-user установки (или `/allusers`). То есть путь в кавычках И аргумент после него:
|
||||||
*
|
*
|
||||||
* "C:\Users\...\AppData\Local\Programs\RKNboost\Uninstall RKNboost.exe" /currentuser
|
* "C:\Users\...\AppData\Local\Programs\SenBoost\Uninstall SenBoost.exe" /currentuser
|
||||||
*
|
*
|
||||||
* Аргумент обязателен: без него деинсталлятор не знает, из какой ветки реестра сниматься.
|
* Аргумент обязателен: без него деинсталлятор не знает, из какой ветки реестра сниматься.
|
||||||
* Разбираем строку на команду и аргументы, а не пытаемся скормить её `spawn` целиком —
|
* Разбираем строку на команду и аргументы, а не пытаемся скормить её `spawn` целиком —
|
||||||
@@ -66,7 +66,7 @@ async function findUninstallCommand(): Promise<UninstallCommand | null> {
|
|||||||
const script =
|
const script =
|
||||||
"Get-ChildItem 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall' " +
|
"Get-ChildItem 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall' " +
|
||||||
'| Get-ItemProperty ' +
|
'| Get-ItemProperty ' +
|
||||||
"| Where-Object { $_.DisplayName -eq 'RKNboost' } " +
|
"| Where-Object { $_.DisplayName -eq 'SenBoost' } " +
|
||||||
'| Select-Object -First 1 -ExpandProperty UninstallString'
|
'| Select-Object -First 1 -ExpandProperty UninstallString'
|
||||||
|
|
||||||
let stdout: string
|
let stdout: string
|
||||||
@@ -110,8 +110,8 @@ export async function uninstallApp(window: BrowserWindow | null): Promise<void>
|
|||||||
defaultId: 0,
|
defaultId: 0,
|
||||||
cancelId: 0,
|
cancelId: 0,
|
||||||
noLink: true,
|
noLink: true,
|
||||||
title: 'Удалить RKNboost',
|
title: 'Удалить SenBoost',
|
||||||
message: 'Удалить RKNboost с этого компьютера?',
|
message: 'Удалить SenBoost с этого компьютера?',
|
||||||
detail:
|
detail:
|
||||||
'Приложение закроется и запустится стандартный деинсталлятор Windows. ' +
|
'Приложение закроется и запустится стандартный деинсталлятор Windows. ' +
|
||||||
'Вместе с ним будут удалены списки сайтов и служба обхода блокировок. ' +
|
'Вместе с ним будут удалены списки сайтов и служба обхода блокировок. ' +
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { access, constants } from 'node:fs/promises'
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* `pkexec` из состава polkit — им поднимаем root для nftables/nfqws. Проверяем по конкретным
|
* `pkexec` из состава polkit — им поднимаем root для nftables/nfqws. Проверяем по конкретным
|
||||||
* путям, а не через `PATH`: тот же мотив, что у `find_nft()` в `rknboost-helper.sh` — санитайз
|
* путям, а не через `PATH`: тот же мотив, что у `find_nft()` в `senboost-helper.sh` — санитайз
|
||||||
* окружения инструментами вроде pkexec/env-с-урезанным-PATH встречается достаточно часто,
|
* окружения инструментами вроде pkexec/env-с-урезанным-PATH встречается достаточно часто,
|
||||||
* чтобы не полагаться на переменную окружения при поиске самого пути к элевации.
|
* чтобы не полагаться на переменную окружения при поиске самого пути к элевации.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ export function elevatedTaskDir(argv: readonly string[]): string | null {
|
|||||||
* Смысл всей этой конструкции в том, ЧТО пользователь видит в окне UAC. Раньше приложение
|
* Смысл всей этой конструкции в том, ЧТО пользователь видит в окне UAC. Раньше приложение
|
||||||
* повышало powershell.exe, и Windows честно показывала «Windows PowerShell» с подписью
|
* повышало powershell.exe, и Windows честно показывала «Windows PowerShell» с подписью
|
||||||
* Microsoft — запрос выглядел так, будто права просит не то, что запросил пользователь.
|
* Microsoft — запрос выглядел так, будто права просит не то, что запросил пользователь.
|
||||||
* Теперь повышается сам RKNboost.exe, и в запросе стоит имя приложения.
|
* Теперь повышается сам SenBoost.exe, и в запросе стоит имя приложения.
|
||||||
*
|
*
|
||||||
* Сам worker.ps1 при этом не изменился — вся логика sc/icacls осталась ровно та же,
|
* Сам worker.ps1 при этом не изменился — вся логика sc/icacls осталась ровно та же,
|
||||||
* поменялось только то, кого повышают.
|
* поменялось только то, кого повышают.
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const WATCH_INTERVAL_MS = 3000
|
|||||||
* NFQUEUE. Ни служба, ни автозапуск не заведены (см. README.md) — каждое включение просит
|
* NFQUEUE. Ни служба, ни автозапуск не заведены (см. README.md) — каждое включение просит
|
||||||
* пароль через `pkexec` (см. `nfqws.linux.ts`), а сам демон и его правила переживают выход
|
* пароль через `pkexec` (см. `nfqws.linux.ts`), а сам демон и его правила переживают выход
|
||||||
* из приложения: `bypass` на очереди означает, что их отсутствие не рвёт пользователю сеть
|
* из приложения: `bypass` на очереди означает, что их отсутствие не рвёт пользователю сеть
|
||||||
* (см. `rknboost-helper.sh`), поэтому `dispose()` намеренно пуст — как и на Windows.
|
* (см. `senboost-helper.sh`), поэтому `dispose()` намеренно пуст — как и на Windows.
|
||||||
*/
|
*/
|
||||||
export class LinuxEngine extends ZapretEngine {
|
export class LinuxEngine extends ZapretEngine {
|
||||||
private watchTimer: ReturnType<typeof setInterval> | null = null
|
private watchTimer: ReturnType<typeof setInterval> | null = null
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import {
|
|||||||
|
|
||||||
const run = promisify(execFile)
|
const run = promisify(execFile)
|
||||||
|
|
||||||
/** Первая строка `strategy.cfg` — из `winwsConfigFile()`, формат: `--comment=rknboost:<id>:<hash>`. */
|
/** Первая строка `strategy.cfg` — из `winwsConfigFile()`, формат: `--comment=senboost:<id>:<hash>`. */
|
||||||
async function readInstalledMarkerLine(): Promise<string | null> {
|
async function readInstalledMarkerLine(): Promise<string | null> {
|
||||||
try {
|
try {
|
||||||
const content = await readFile(serviceConfigPath(), 'utf8')
|
const content = await readFile(serviceConfigPath(), 'utf8')
|
||||||
@@ -85,7 +85,7 @@ async function needsReconfigure(config: EngineConfig, info: ServiceInfo | null):
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Windows: winws требует драйвер WinDivert и права администратора, поэтому работает как служба
|
* Windows: winws требует драйвер WinDivert и права администратора, поэтому работает как служба
|
||||||
* Windows (`rknboost-zapret`), а не как обычный дочерний процесс приложения.
|
* Windows (`senboost-zapret`), а не как обычный дочерний процесс приложения.
|
||||||
*
|
*
|
||||||
* UAC запрашивается только при первой установке службы и при смене аргументов (новая стратегия,
|
* UAC запрашивается только при первой установке службы и при смене аргументов (новая стратегия,
|
||||||
* переключение автозапуска) — этим занимается `service.win32.ts`. Обычные включение/выключение
|
* переключение автозапуска) — этим занимается `service.win32.ts`. Обычные включение/выключение
|
||||||
@@ -207,7 +207,7 @@ export class Win32Engine extends ZapretEngine {
|
|||||||
* а не после него.
|
* а не после него.
|
||||||
*/
|
*/
|
||||||
private async dryRun(configBody: string): Promise<void> {
|
private async dryRun(configBody: string): Promise<void> {
|
||||||
const dir = await mkdtemp(join(tmpdir(), 'rknboost-dryrun-'))
|
const dir = await mkdtemp(join(tmpdir(), 'senboost-dryrun-'))
|
||||||
const configPath = join(dir, 'dry-run.cfg')
|
const configPath = join(dir, 'dry-run.cfg')
|
||||||
try {
|
try {
|
||||||
await writeFile(configPath, configBody, 'utf8')
|
await writeFile(configPath, configBody, 'utf8')
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export async function stageRuntime(): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Номер очереди NFQUEUE — держать в синхроне с `QUEUE_NUM` в `rknboost-helper.sh`
|
* Номер очереди NFQUEUE — держать в синхроне с `QUEUE_NUM` в `senboost-helper.sh`
|
||||||
* (там же и объяснение выбора числа). В TS он нужен только для `--dry-run` ниже: сам
|
* (там же и объяснение выбора числа). В TS он нужен только для `--dry-run` ниже: сам
|
||||||
* помощник получает его не отсюда, а как захардкоженное значение в своём коде.
|
* помощник получает его не отсюда, а как захардкоженное значение в своём коде.
|
||||||
*/
|
*/
|
||||||
@@ -97,7 +97,7 @@ const NFQUEUE_NUM = 220
|
|||||||
* рассинхронизированы, но сам факт валидности остальных аргументов dry-run проверяет верно.
|
* рассинхронизированы, но сам факт валидности остальных аргументов dry-run проверяет верно.
|
||||||
*/
|
*/
|
||||||
export async function dryRun(configBody: string): Promise<void> {
|
export async function dryRun(configBody: string): Promise<void> {
|
||||||
const dir = await mkdtemp(join(tmpdir(), 'rknboost-dryrun-'))
|
const dir = await mkdtemp(join(tmpdir(), 'senboost-dryrun-'))
|
||||||
const configPath = join(dir, 'dry-run.cfg')
|
const configPath = join(dir, 'dry-run.cfg')
|
||||||
try {
|
try {
|
||||||
await writeFile(configPath, configBody, 'utf8')
|
await writeFile(configPath, configBody, 'utf8')
|
||||||
@@ -198,8 +198,8 @@ export async function isProcessAlive(pid: number): Promise<boolean> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Не требует root: `nfqws.pid` и `strategy.cfg` в `/run/rknboost` помощник кладёт с правами
|
* Не требует root: `nfqws.pid` и `strategy.cfg` в `/run/senboost` помощник кладёт с правами
|
||||||
* 0644 (см. rknboost-helper.sh) именно затем, чтобы это чтение — и восстановление состояния
|
* 0644 (см. senboost-helper.sh) именно затем, чтобы это чтение — и восстановление состояния
|
||||||
* в `LinuxEngine.sync()` — обходилось без пароля.
|
* в `LinuxEngine.sync()` — обходилось без пароля.
|
||||||
*/
|
*/
|
||||||
export async function readNfqwsState(): Promise<NfqwsState> {
|
export async function readNfqwsState(): Promise<NfqwsState> {
|
||||||
|
|||||||
+11
-11
@@ -34,8 +34,8 @@ export function nfqwsPath(): string {
|
|||||||
*/
|
*/
|
||||||
export function bundledHelperPath(): string {
|
export function bundledHelperPath(): string {
|
||||||
return app.isPackaged
|
return app.isPackaged
|
||||||
? join(process.resourcesPath, 'linux-helper', 'rknboost-helper.sh')
|
? join(process.resourcesPath, 'linux-helper', 'senboost-helper.sh')
|
||||||
: resolve(app.getAppPath(), 'resources', 'linux-helper', 'rknboost-helper.sh')
|
: resolve(app.getAppPath(), 'resources', 'linux-helper', 'senboost-helper.sh')
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,7 +57,7 @@ export function stagedNfqwsPath(): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function stagedHelperPath(): string {
|
export function stagedHelperPath(): string {
|
||||||
return join(linuxStagingDir(), 'rknboost-helper.sh')
|
return join(linuxStagingDir(), 'senboost-helper.sh')
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Стейджинговая копия `fakesDir()` — то, что реально читает nfqws (см. её комментарий). */
|
/** Стейджинговая копия `fakesDir()` — то, что реально читает nfqws (см. её комментарий). */
|
||||||
@@ -73,11 +73,11 @@ export function bundledFakesDir(): string {
|
|||||||
/**
|
/**
|
||||||
* Рабочий каталог демона — pidfile и `strategy.cfg` (последний — источник маркера стратегии
|
* Рабочий каталог демона — pidfile и `strategy.cfg` (последний — источник маркера стратегии
|
||||||
* для `LinuxEngine.sync()`, читается без root: помощник кладёт его с правами 0644). Создаёт
|
* для `LinuxEngine.sync()`, читается без root: помощник кладёт его с правами 0644). Создаёт
|
||||||
* и чистит сам `rknboost-helper.sh`. `/run` — стандартный FHS-путь для данных, не переживающих
|
* и чистит сам `senboost-helper.sh`. `/run` — стандартный FHS-путь для данных, не переживающих
|
||||||
* перезагрузку: nfqws её тоже не переживает, автозапуска на Linux нет (см. README.md).
|
* перезагрузку: nfqws её тоже не переживает, автозапуска на Linux нет (см. README.md).
|
||||||
*/
|
*/
|
||||||
export function linuxRuntimeDir(): string {
|
export function linuxRuntimeDir(): string {
|
||||||
return '/run/rknboost'
|
return '/run/senboost'
|
||||||
}
|
}
|
||||||
|
|
||||||
export function linuxPidfilePath(): string {
|
export function linuxPidfilePath(): string {
|
||||||
@@ -118,7 +118,7 @@ export function darwinAutostartScriptPath(): string {
|
|||||||
* обычному пользователю (то же рассуждение, что у `protectedWinwsPath()` на Windows).
|
* обычному пользователю (то же рассуждение, что у `protectedWinwsPath()` на Windows).
|
||||||
*/
|
*/
|
||||||
export function darwinInstallDir(): string {
|
export function darwinInstallDir(): string {
|
||||||
return '/Library/Application Support/RKNboost/zapret'
|
return '/Library/Application Support/SenBoost/zapret'
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Стейджинговая копия `fakesDir()` — то же назначение, что `stagedFakesDir()` на Linux. */
|
/** Стейджинговая копия `fakesDir()` — то же назначение, что `stagedFakesDir()` на Linux. */
|
||||||
@@ -138,15 +138,15 @@ export function darwinPortsPath(): string {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* `utunws --pidfile=...` пишет сюда свой pid до начала работы (см. `daemon.sh`) — читается
|
* `utunws --pidfile=...` пишет сюда свой pid до начала работы (см. `daemon.sh`) — читается
|
||||||
* без root, тот же принцип, что у `linuxPidfilePath()`. `/var/run` — не `/run/rknboost`
|
* без root, тот же принцип, что у `linuxPidfilePath()`. `/var/run` — не `/run/senboost`
|
||||||
* (Linux-путь): на macOS это симлинк на `/private/var/run`, а не отдельная точка монтирования.
|
* (Linux-путь): на macOS это симлинк на `/private/var/run`, а не отдельная точка монтирования.
|
||||||
*/
|
*/
|
||||||
export function darwinPidfilePath(): string {
|
export function darwinPidfilePath(): string {
|
||||||
return '/var/run/rknboost-zapret.pid'
|
return '/var/run/senboost-zapret.pid'
|
||||||
}
|
}
|
||||||
|
|
||||||
export function darwinPlistPath(): string {
|
export function darwinPlistPath(): string {
|
||||||
return '/Library/LaunchDaemons/com.rknboost.zapret.plist'
|
return '/Library/LaunchDaemons/com.senboost.zapret.plist'
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Встроенные списки (из Flowseal/zapret-discord-youtube, см. scripts/fetch-zapret.mjs) — только для чтения. */
|
/** Встроенные списки (из Flowseal/zapret-discord-youtube, см. scripts/fetch-zapret.mjs) — только для чтения. */
|
||||||
@@ -177,12 +177,12 @@ export function fakesDir(): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Windows: служба `rknboost-zapret` работает от LocalSystem, поэтому её конфиг не может
|
* Windows: служба `senboost-zapret` работает от LocalSystem, поэтому её конфиг не может
|
||||||
* жить в userData обычного пользователя — нужен каталог машинного уровня. `%ProgramData%`
|
* жить в userData обычного пользователя — нужен каталог машинного уровня. `%ProgramData%`
|
||||||
* почти всегда задан; `C:\ProgramData` — тот же путь, на который он указывает по умолчанию.
|
* почти всегда задан; `C:\ProgramData` — тот же путь, на который он указывает по умолчанию.
|
||||||
*/
|
*/
|
||||||
export function serviceDataDir(): string {
|
export function serviceDataDir(): string {
|
||||||
return join(process.env.ProgramData ?? 'C:\\ProgramData', 'rknboost', 'zapret')
|
return join(process.env.ProgramData ?? 'C:\\ProgramData', 'senboost', 'zapret')
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Файл аргументов `winws.exe @strategy.cfg` — пишется только повышенным скриптом службы. */
|
/** Файл аргументов `winws.exe @strategy.cfg` — пишется только повышенным скриптом службы. */
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { SERVICE_BINARY_NAMES, serviceConfigPath, serviceDataDir, winwsPath } fr
|
|||||||
|
|
||||||
const run = promisify(execFile)
|
const run = promisify(execFile)
|
||||||
|
|
||||||
export const SERVICE_NAME = 'rknboost-zapret'
|
export const SERVICE_NAME = 'senboost-zapret'
|
||||||
|
|
||||||
const POLL_INTERVAL_MS = 300
|
const POLL_INTERVAL_MS = 300
|
||||||
const POLL_TIMEOUT_MS = 10000
|
const POLL_TIMEOUT_MS = 10000
|
||||||
@@ -377,11 +377,11 @@ try {
|
|||||||
$result = Invoke-ScRaw $scArgs
|
$result = Invoke-ScRaw $scArgs
|
||||||
if ($result.ExitCode -ne 0) { throw "sc config завершился с кодом $($result.ExitCode) : $($result.Output)" }
|
if ($result.ExitCode -ne 0) { throw "sc config завершился с кодом $($result.ExitCode) : $($result.Output)" }
|
||||||
} else {
|
} else {
|
||||||
$scArgs = 'create ' + $ServiceName + ' binPath= ' + $binPath + ' start= ' + $startType + ' DisplayName= "RKNboost: обход блокировок"'
|
$scArgs = 'create ' + $ServiceName + ' binPath= ' + $binPath + ' start= ' + $startType + ' DisplayName= "SenBoost: обход блокировок"'
|
||||||
$result = Invoke-ScRaw $scArgs
|
$result = Invoke-ScRaw $scArgs
|
||||||
if ($result.ExitCode -ne 0) { throw "sc create завершился с кодом $($result.ExitCode) : $($result.Output)" }
|
if ($result.ExitCode -ne 0) { throw "sc create завершился с кодом $($result.ExitCode) : $($result.Output)" }
|
||||||
}
|
}
|
||||||
& sc.exe description $ServiceName 'Служба RKNboost: обходит блокировки через winws/WinDivert.' | Out-Null
|
& sc.exe description $ServiceName 'Служба SenBoost: обходит блокировки через winws/WinDivert.' | Out-Null
|
||||||
|
|
||||||
# Разрешаем интерактивным пользователям запуск/остановку/чтение статуса службы, но не
|
# Разрешаем интерактивным пользователям запуск/остановку/чтение статуса службы, но не
|
||||||
# смену конфигурации и не смену прав — иначе любой пользователь на машине мог бы подменить
|
# смену конфигурации и не смену прав — иначе любой пользователь на машине мог бы подменить
|
||||||
@@ -451,7 +451,7 @@ async function readResult(path: string): Promise<{ ok: boolean; error: string |
|
|||||||
* Результат в обоих случаях читаем из `result.json`, а не из кода возврата процесса.
|
* Результат в обоих случаях читаем из `result.json`, а не из кода возврата процесса.
|
||||||
*/
|
*/
|
||||||
async function runElevated(payload: Record<string, unknown>): Promise<void> {
|
async function runElevated(payload: Record<string, unknown>): Promise<void> {
|
||||||
const dir = await mkdtemp(join(tmpdir(), 'rknboost-svc-'))
|
const dir = await mkdtemp(join(tmpdir(), 'senboost-svc-'))
|
||||||
const workerPath = join(dir, TASK_FILES.worker)
|
const workerPath = join(dir, TASK_FILES.worker)
|
||||||
const outerPath = join(dir, 'outer.ps1')
|
const outerPath = join(dir, 'outer.ps1')
|
||||||
const payloadPath = join(dir, TASK_FILES.payload)
|
const payloadPath = join(dir, TASK_FILES.payload)
|
||||||
|
|||||||
@@ -86,10 +86,10 @@ function quoteConfigArg(arg: string): string {
|
|||||||
*/
|
*/
|
||||||
function configMarker(strategyId: string, body: string): string {
|
function configMarker(strategyId: string, body: string): string {
|
||||||
const hash = createHash('sha256').update(body).digest('hex').slice(0, 12)
|
const hash = createHash('sha256').update(body).digest('hex').slice(0, 12)
|
||||||
return `--comment=rknboost:${strategyId}:${hash}`
|
return `--comment=senboost:${strategyId}:${hash}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const MARKER_PATTERN = /^--comment=rknboost:([^:]+):/
|
const MARKER_PATTERN = /^--comment=senboost:([^:]+):/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Обратная операция к `configMarker()` — достаёт id стратегии из первой строки уже
|
* Обратная операция к `configMarker()` — достаёт id стратегии из первой строки уже
|
||||||
@@ -140,7 +140,7 @@ export interface PacketEngineConfig extends EngineConfig {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* На Windows `--wf-tcp`/`--wf-udp` — это фильтр самого WinDivert, зашитый в те же аргументы
|
* На Windows `--wf-tcp`/`--wf-udp` — это фильтр самого WinDivert, зашитый в те же аргументы
|
||||||
* winws. На Linux и macOS фильтрацию делает внешний слой — nftables (`rknboost-helper.sh`)
|
* winws. На Linux и macOS фильтрацию делает внешний слой — nftables (`senboost-helper.sh`)
|
||||||
* и pf (`resources/darwin-helper/daemon.sh`) соответственно, — а сам движок (nfqws/utunws)
|
* и pf (`resources/darwin-helper/daemon.sh`) соответственно, — а сам движок (nfqws/utunws)
|
||||||
* эти два аргумента не понимает: вырезаем их и отдаём отдельно вызывающей стороне.
|
* эти два аргумента не понимает: вырезаем их и отдаём отдельно вызывающей стороне.
|
||||||
*/
|
*/
|
||||||
@@ -167,7 +167,7 @@ export function packetEngineConfig(strategyId: string): PacketEngineConfig {
|
|||||||
throw new Error(`Стратегия «${strategyId}»: не найден --wf-tcp/--wf-udp в аргументах.`)
|
throw new Error(`Стратегия «${strategyId}»: не найден --wf-tcp/--wf-udp в аргументах.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Значение уходит прямо в правило nftables (rknboost-helper.sh) или pf (daemon.sh) без
|
// Значение уходит прямо в правило nftables (senboost-helper.sh) или pf (daemon.sh) без
|
||||||
// дополнительного экранирования — только цифры, запятые и дефисы диапазонов. Если Flowseal
|
// дополнительного экранирования — только цифры, запятые и дефисы диапазонов. Если Flowseal
|
||||||
// когда-нибудь передаст что-то ещё (например, `~` — отрицание порта), лучше явная ошибка
|
// когда-нибудь передаст что-то ещё (например, `~` — отрицание порта), лучше явная ошибка
|
||||||
// тут, чем нераспознанный текст в командной строке nft/pfctl, которую выполняет root.
|
// тут, чем нераспознанный текст в командной строке nft/pfctl, которую выполняет root.
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ export function assertMacosVersion(): void {
|
|||||||
* Linux-`nfqws` здесь не нужен `--qnum` — этот путь специфичен для `#ifdef __linux__`.
|
* Linux-`nfqws` здесь не нужен `--qnum` — этот путь специфичен для `#ifdef __linux__`.
|
||||||
*/
|
*/
|
||||||
export async function dryRun(configBody: string): Promise<void> {
|
export async function dryRun(configBody: string): Promise<void> {
|
||||||
const dir = await mkdtemp(join(tmpdir(), 'rknboost-dryrun-'))
|
const dir = await mkdtemp(join(tmpdir(), 'senboost-dryrun-'))
|
||||||
const configPath = join(dir, 'dry-run.cfg')
|
const configPath = join(dir, 'dry-run.cfg')
|
||||||
try {
|
try {
|
||||||
await writeFile(configPath, configBody, 'utf8')
|
await writeFile(configPath, configBody, 'utf8')
|
||||||
@@ -71,7 +71,7 @@ export interface StartUtunwsOptions {
|
|||||||
* выключение обхода (см. `runPrivileged()`/`resources/darwin-helper/install.sh`).
|
* выключение обхода (см. `runPrivileged()`/`resources/darwin-helper/install.sh`).
|
||||||
*/
|
*/
|
||||||
export async function startUtunws(options: StartUtunwsOptions): Promise<void> {
|
export async function startUtunws(options: StartUtunwsOptions): Promise<void> {
|
||||||
const dir = await mkdtemp(join(tmpdir(), 'rknboost-strategy-'))
|
const dir = await mkdtemp(join(tmpdir(), 'senboost-strategy-'))
|
||||||
const configPath = join(dir, 'strategy.cfg')
|
const configPath = join(dir, 'strategy.cfg')
|
||||||
try {
|
try {
|
||||||
await writeFile(configPath, options.configBody, 'utf8')
|
await writeFile(configPath, options.configBody, 'utf8')
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<html lang="ru">
|
<html lang="ru">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<title>RKNboost</title>
|
<title>SenBoost</title>
|
||||||
<!-- Жёсткий CSP: никаких внешних скриптов, стилей и запросов.
|
<!-- Жёсткий CSP: никаких внешних скриптов, стилей и запросов.
|
||||||
https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
|
https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
|
||||||
<meta
|
<meta
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default function App(): React.JSX.Element {
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div className="app-header">
|
<div className="app-header">
|
||||||
<span className="app-header__name">RKNboost</span>
|
<span className="app-header__name">SenBoost</span>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="app-header__settings"
|
className="app-header__settings"
|
||||||
|
|||||||
+1
-1
@@ -3,4 +3,4 @@
|
|||||||
* в настройках (`SettingsView.tsx`), и приветственное окно при первом запуске
|
* в настройках (`SettingsView.tsx`), и приветственное окно при первом запуске
|
||||||
* (`src/main/first-run.ts`).
|
* (`src/main/first-run.ts`).
|
||||||
*/
|
*/
|
||||||
export const GITHUB_URL = 'https://github.com/maeneko/rknboost'
|
export const GITHUB_URL = 'https://github.com/maeneko/senboost'
|
||||||
|
|||||||
Reference in New Issue
Block a user