From c71a27c9a3e8a0921216769862b343dd5af64a97 Mon Sep 17 00:00:00 2001 From: Ivan Vasilev Date: Fri, 4 Sep 2026 14:41:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0:=20RKNboost=20=E2=86=92=20SenBoost?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Затрагивает не только видимые строки, но и системные идентификаторы: 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::), а также каталог userData, который Electron выводит из имени приложения. --- .github/workflows/ci.yml | 4 ++-- README.md | 6 ++--- build/installer.nsh | 4 ++-- electron-builder.yml | 16 ++++++------- package-lock.json | 4 ++-- package.json | 8 +++---- resources/darwin-helper/autostart.sh | 2 +- ....plist.in => com.senboost.zapret.plist.in} | 0 resources/darwin-helper/daemon.sh | 12 +++++----- resources/darwin-helper/install.sh | 24 +++++++++---------- resources/darwin-helper/stop.sh | 12 +++++----- resources/darwin-helper/watchdog.sh | 4 ++-- ...{rknboost-helper.sh => senboost-helper.sh} | 10 ++++---- src/main/first-run.ts | 2 +- src/main/index.ts | 2 +- src/main/settings.ts | 2 +- src/main/uninstall.win32.ts | 8 +++---- src/main/zapret/deps.linux.ts | 2 +- src/main/zapret/elevated-task.win32.ts | 2 +- src/main/zapret/engine.linux.ts | 2 +- src/main/zapret/engine.win32.ts | 6 ++--- src/main/zapret/nfqws.linux.ts | 8 +++---- src/main/zapret/paths.ts | 22 ++++++++--------- src/main/zapret/service.win32.ts | 8 +++---- src/main/zapret/strategies.ts | 8 +++---- src/main/zapret/utunws.darwin.ts | 4 ++-- src/renderer/index.html | 2 +- src/renderer/src/App.tsx | 2 +- src/shared/links.ts | 2 +- 29 files changed, 94 insertions(+), 94 deletions(-) rename resources/darwin-helper/{com.rknboost.zapret.plist.in => com.senboost.zapret.plist.in} (100%) rename resources/linux-helper/{rknboost-helper.sh => senboost-helper.sh} (98%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 313445f..71513e2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -123,7 +123,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: rknboost-windows + name: senboost-windows path: release/*.exe if-no-files-found: error retention-days: 7 @@ -189,7 +189,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: rknboost-linux + name: senboost-linux path: | release/*.AppImage release/*.deb diff --git a/README.md b/README.md index d821c90..625a33a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# RKNboost +# SenBoost очередная обертка под 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 | пароль администратора при каждом включении/выключении | частично — движок портирован недавно | | Linux | `nfqws` + правила nftables (NFQUEUE) | пароль через `pkexec` при каждом включении/выключении | частично | @@ -44,7 +44,7 @@ VPN/туннель (маршрут по умолчанию уходит в св Принудительная остановка (если приложение недоступно): ```bash -sudo "/Library/Application Support/RKNboost/zapret/stop.sh" +sudo "/Library/Application Support/SenBoost/zapret/stop.sh" ``` На Linux дополнительно нужны пакеты `nftables` и `polkit` (в .deb — заявлены как зависимости diff --git a/build/installer.nsh b/build/installer.nsh index a1ddbef..2b90b04 100644 --- a/build/installer.nsh +++ b/build/installer.nsh @@ -1,4 +1,4 @@ -; Служба rknboost-zapret не ставится этим установщиком — её создаёт и настраивает само +; Служба senboost-zapret не ставится этим установщиком — её создаёт и настраивает само ; приложение при первом включении обхода (src/main/zapret/service.win32.ts), потому что ; аргументы winws зависят от выбранной пользователем стратегии. Но снять её при удалении ; приложения обязаны мы: иначе в системе остаётся служба, указывающая на удалённый winws.exe. @@ -11,6 +11,6 @@ !macro customUnInstall 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 !macroend diff --git a/electron-builder.yml b/electron-builder.yml index 0d12885..a99fc04 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -1,5 +1,5 @@ -appId: com.rknboost.app -productName: RKNboost +appId: com.senboost.app +productName: SenBoost directories: buildResources: build output: release @@ -52,10 +52,10 @@ extraResources: - 'LICENSE.flowseal.txt' win: - executableName: RKNboost + executableName: SenBoost # Приложение запрашивает права администратора при КАЖДОМ запуске (манифест exe). # Внимание на компромисс: установка при этом остаётся per-user, то есть exe лежит в - # %LocalAppData%\Programs\RKNboost — папке, доступной на запись обычному пользователю. + # %LocalAppData%\Programs\SenBoost — папке, доступной на запись обычному пользователю. # Значит подмена этого exe даёт злоумышленнику администратора с подтверждения самого # пользователя. Это осознанный выбор владельца проекта; безопасный вариант — вернуть # perMachine: true, чтобы exe лежал в защищённом от записи Program Files. @@ -86,7 +86,7 @@ nsis: # differentialPackage: false отключает генерацию .blockmap, который иначе всегда # заливался бы в ассеты релиза рядом с инсталлятором. differentialPackage: false - # Удалять %APPDATA%\rknboost (списки сайтов, метка первого запуска) вместе с приложением. + # Удалять %APPDATA%\senboost (списки сайтов, метка первого запуска) вместе с приложением. # По умолчанию electron-builder этого НЕ делает, и данные оставались бы в системе после # удаления. Обновление приложения под это не попадает — в шаблоне деинсталлятора стоит # проверка `ifNot isUpdated`, так что отредактированные списки переживают обновление. @@ -131,7 +131,7 @@ dmg: artifactName: ${name}-${version}-${arch}.${ext} linux: - executableName: rknboost + executableName: senboost # desktopName в package.json + syncDesktopName — иначе Electron не свяжет открытые окна # с .desktop-записью (app_id/WM_CLASS), и часть окружений не покажет иконку в панели задач. syncDesktopName: true @@ -140,13 +140,13 @@ linux: arch: [x64] - target: deb arch: [x64] - maintainer: RKNboost + maintainer: SenBoost category: Network synopsis: Обход блокировок через zapret extraResources: - from: resources/zapret/linux to: zapret/linux - # rknboost-helper.sh — привилегированный помощник (nfqws.linux.ts зовёт его через + # senboost-helper.sh — привилегированный помощник (nfqws.linux.ts зовёт его через # pkexec). Не из resources/zapret: тот качает fetch-zapret.mjs, а этот файл — свой, # лежит в репозитории (см. src/main/zapret/paths.ts:bundledHelperPath()). - from: resources/linux-helper diff --git a/package-lock.json b/package-lock.json index d2c3a0c..18ceb94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "rknboost", + "name": "senboost", "version": "0.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "rknboost", + "name": "senboost", "version": "0.6.0", "hasInstallScript": true, "license": "MIT", diff --git a/package.json b/package.json index faafb65..da9ccd1 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "rknboost", + "name": "senboost", "version": "0.6.0", "description": "Кроссплатформенное десктопное приложение на Electron + React + TypeScript", "main": "./out/main/index.js", - "desktopName": "rknboost.desktop", - "author": "RKNboost", + "desktopName": "senboost.desktop", + "author": "SenBoost", "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/maeneko/rknboost" + "url": "https://github.com/maeneko/senboost" }, "private": true, "engines": { diff --git a/resources/darwin-helper/autostart.sh b/resources/darwin-helper/autostart.sh index f35922f..f0c5e31 100755 --- a/resources/darwin-helper/autostart.sh +++ b/resources/darwin-helper/autostart.sh @@ -7,7 +7,7 @@ # на Windows (`sc config start=`, тоже не трогает работающую службу). set -eu -PLIST=/Library/LaunchDaemons/com.rknboost.zapret.plist +PLIST=/Library/LaunchDaemons/com.senboost.zapret.plist if [ "$#" -ne 1 ]; then echo 'autostart.sh: ожидается 1 аргумент (0 или 1)' >&2 diff --git a/resources/darwin-helper/com.rknboost.zapret.plist.in b/resources/darwin-helper/com.senboost.zapret.plist.in similarity index 100% rename from resources/darwin-helper/com.rknboost.zapret.plist.in rename to resources/darwin-helper/com.senboost.zapret.plist.in diff --git a/resources/darwin-helper/daemon.sh b/resources/darwin-helper/daemon.sh index b107185..6f52ffa 100755 --- a/resources/darwin-helper/daemon.sh +++ b/resources/darwin-helper/daemon.sh @@ -1,5 +1,5 @@ #!/bin/sh -# Супервизор обхода — то, что реально запускает launchd (com.rknboost.zapret.plist.in, +# Супервизор обхода — то, что реально запускает launchd (com.senboost.zapret.plist.in, # ProgramArguments). Живёт под root, пока LaunchDaemon загружен; KeepAlive/SuccessfulExit # в plist перезапускает этот скрипт заново при любом его завершении — поэтому определение # интерфейса/MAC шлюза выполняется здесь при каждом старте (в том числе после смены сети), @@ -7,15 +7,15 @@ # (MIT) — та же логика с utunws через utun+BPF, свои идентификаторы (см. install.sh). set -eu -DEST='/Library/Application Support/RKNboost/zapret' -ANCHOR=com.apple/rknboost +DEST='/Library/Application Support/SenBoost/zapret' +ANCHOR=com.apple/senboost UTUN_UNIT=61 UTUN_IFACE=utun60 UTUN_LOCAL=10.78.0.1 UTUN_REMOTE=10.78.0.2 -PIDFILE=/var/run/rknboost-zapret.pid -TOKEN_FILE=/var/run/rknboost-zapret.pf-token -ROUTE6_FILE=/var/run/rknboost-zapret.route6 +PIDFILE=/var/run/senboost-zapret.pid +TOKEN_FILE=/var/run/senboost-zapret.pf-token +ROUTE6_FILE=/var/run/senboost-zapret.route6 ENGINE_PID= WATCHDOG_PID= diff --git a/resources/darwin-helper/install.sh b/resources/darwin-helper/install.sh index 090a748..d5d5fff 100755 --- a/resources/darwin-helper/install.sh +++ b/resources/darwin-helper/install.sh @@ -1,5 +1,5 @@ #!/bin/sh -# Привилегированная установка обхода блокировок на macOS — единственное, что RKNboost +# Привилегированная установка обхода блокировок на macOS — единственное, что SenBoost # запускает через osascript "with administrator privileges" (см. elevate.darwin.ts) для # включения обхода. Не редактировать под bash-специфику: этот файл исполняется как # /bin/sh — на macOS это тот же путь, что и на Linux, но лучше не полагаться на bashisms. @@ -9,10 +9,10 @@ # # Аргументы (все уже подготовлены и провалидированы на стороне приложения — сюда попадают # только готовые пути и провалидированные строки портов, тот же принцип, что у Linux- -# помощника resources/linux-helper/rknboost-helper.sh): +# помощника resources/linux-helper/senboost-helper.sh): # 1: utunws_src — путь к бинарнику utunws в resources/zapret/darwin (ещё не установлен) # 2: fakes_src — каталог с fake-пакетами (resources/zapret/fakes) -# 3: config_src — уже отрендеренный strategy.cfg (маркер --comment=rknboost:: +# 3: config_src — уже отрендеренный strategy.cfg (маркер --comment=senboost:: # первой строкой, пути {LISTS}/{FAKES} уже резолвлены — см. strategies.ts) # 4: tcp_ports — список портов TCP для pf, формат "80,443,8443" (уже проверен регуляркой # в packetEngineConfig()) @@ -22,13 +22,13 @@ set -eu HELPER_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd) -DEST='/Library/Application Support/RKNboost/zapret' -LABEL=com.rknboost.zapret +DEST='/Library/Application Support/SenBoost/zapret' +LABEL=com.senboost.zapret PLIST=/Library/LaunchDaemons/$LABEL.plist -ANCHOR=com.apple/rknboost -PIDFILE=/var/run/rknboost-zapret.pid -TOKEN_FILE=/var/run/rknboost-zapret.pf-token -KEEPINIT_FILE=/var/db/rknboost-zapret.keepinit +ANCHOR=com.apple/senboost +PIDFILE=/var/run/senboost-zapret.pid +TOKEN_FILE=/var/run/senboost-zapret.pf-token +KEEPINIT_FILE=/var/db/senboost-zapret.keepinit if [ "$#" -ne 6 ]; then echo 'install.sh: ожидается 6 аргументов' >&2 @@ -45,7 +45,7 @@ RUN_AT_LOAD=$6 [ -d "$FAKES_SRC" ] || { echo 'install.sh: не найден каталог fake-пакетов' >&2; exit 1; } [ -f "$CONFIG_SRC" ] || { echo 'install.sh: не найден strategy.cfg' >&2; exit 1; } # Формат уже проверен регуляркой в packetEngineConfig()/utunwsConfig() — здесь просто не -# доверяем слепо тому, что дошло до root, тот же приём, что в rknboost-helper.sh на Linux. +# доверяем слепо тому, что дошло до root, тот же приём, что в senboost-helper.sh на Linux. # ':' — не опечатка: utunwsConfig() переводит диапазоны в синтаксис pf (19294-19344 → # 19294:19344, см. toPfPortRanges() в strategies.ts), дефисов в этих строках уже нет. case ",$TCP_PORTS," in *[!0-9,:]*) echo 'install.sh: странный формат tcp-портов' >&2; exit 1 ;; esac @@ -57,7 +57,7 @@ case "$RUN_AT_LOAD" in 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 /sbin/pfctl -a "$ANCHOR" -F all >/dev/null 2>&1 || true # Матчим процесс по полному пути НАШЕЙ установки, а не по имени: "utunws" называется так @@ -96,7 +96,7 @@ printf '%s\n%s\n' "$TCP_PORTS" "$UDP_PORTS" > "$DEST/ports.conf" -e "s|@LABEL@|$LABEL|g" \ -e "s|@DEST@|$DEST|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" /bin/chmod 644 "$PLIST" diff --git a/resources/darwin-helper/stop.sh b/resources/darwin-helper/stop.sh index 69eecb9..41217c5 100755 --- a/resources/darwin-helper/stop.sh +++ b/resources/darwin-helper/stop.sh @@ -11,13 +11,13 @@ # применяется заново при следующем включении (см. engine.darwin.ts). set -eu -LABEL=com.rknboost.zapret -ANCHOR=com.apple/rknboost -DEST='/Library/Application Support/RKNboost/zapret' +LABEL=com.senboost.zapret +ANCHOR=com.apple/senboost +DEST='/Library/Application Support/SenBoost/zapret' PLIST=/Library/LaunchDaemons/$LABEL.plist -PIDFILE=/var/run/rknboost-zapret.pid -TOKEN_FILE=/var/run/rknboost-zapret.pf-token -KEEPINIT_FILE=/var/db/rknboost-zapret.keepinit +PIDFILE=/var/run/senboost-zapret.pid +TOKEN_FILE=/var/run/senboost-zapret.pf-token +KEEPINIT_FILE=/var/db/senboost-zapret.keepinit /bin/launchctl disable system/"$LABEL" >/dev/null 2>&1 || true /bin/launchctl bootout system/"$LABEL" >/dev/null 2>&1 || true diff --git a/resources/darwin-helper/watchdog.sh b/resources/darwin-helper/watchdog.sh index 37b9ad5..f9fb7c8 100755 --- a/resources/darwin-helper/watchdog.sh +++ b/resources/darwin-helper/watchdog.sh @@ -6,8 +6,8 @@ # watchdog.sh форка Flowseal/zapret-mac-discord-youtube (MIT) без изменений логики. SUPERVISOR_PID=$1 ENGINE_PID=$2 -ANCHOR=com.apple/rknboost -TOKEN_FILE=/var/run/rknboost-zapret.pf-token +ANCHOR=com.apple/senboost +TOKEN_FILE=/var/run/senboost-zapret.pf-token while kill -0 "$SUPERVISOR_PID" 2>/dev/null && kill -0 "$ENGINE_PID" 2>/dev/null; do sleep 0.2 diff --git a/resources/linux-helper/rknboost-helper.sh b/resources/linux-helper/senboost-helper.sh similarity index 98% rename from resources/linux-helper/rknboost-helper.sh rename to resources/linux-helper/senboost-helper.sh index d4a62d5..16ae727 100755 --- a/resources/linux-helper/rknboost-helper.sh +++ b/resources/linux-helper/senboost-helper.sh @@ -1,5 +1,5 @@ #!/bin/sh -# Привилегированный помощник обхода блокировок на Linux — единственное, что RKNboost +# Привилегированный помощник обхода блокировок на Linux — единственное, что SenBoost # запускает через `pkexec`. Не редактировать под bash-специфику: /bin/sh на Debian/Ubuntu — # это dash, а не bash. # @@ -17,18 +17,18 @@ # команда не найдена) при разборе результата на стороне приложения. set -eu -RUN_DIR=/run/rknboost +RUN_DIR=/run/senboost PIDFILE="$RUN_DIR/nfqws.pid" CONFIG="$RUN_DIR/strategy.cfg" ERRLOG="$RUN_DIR/nfqws.err" TABLE_FAMILY=inet -TABLE_NAME=rknboost +TABLE_NAME=senboost # Держать в синхроне с NFQUEUE_NUM в nfqws.linux.ts (используется там же для --dry-run). QUEUE_NUM=220 FW_MARK=0x40000000 log() { - echo "rknboost-helper: $*" >&2 + echo "senboost-helper: $*" >&2 } # pkexec запускает с урезанным PATH (санирует окружение) — sbin, где обычно лежит nft, @@ -107,7 +107,7 @@ cmd_start() { chmod 0755 "$RUN_DIR" # strategy.cfg в /run — источник маркера стратегии для LinuxEngine.sync(): читается без - # root (0644), первая строка — тот же --comment=rknboost::, что и на Windows. + # root (0644), первая строка — тот же --comment=senboost::, что и на Windows. cp "$config_src" "$CONFIG" chmod 0644 "$CONFIG" diff --git a/src/main/first-run.ts b/src/main/first-run.ts index 8f6769c..93f6c96 100644 --- a/src/main/first-run.ts +++ b/src/main/first-run.ts @@ -44,7 +44,7 @@ export async function showFirstRunSupportDialog(window: BrowserWindow): Promise< defaultId: 0, cancelId: 1, noLink: true, - title: 'Поддержите RKNboost', + title: 'Поддержите SenBoost', message: 'Поддержите проект', detail: 'Поддержите проект звездочкой на GitHub, и расскажите друзьям :З' }) diff --git a/src/main/index.ts b/src/main/index.ts index 2466a12..8e702cf 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -6,7 +6,7 @@ import { registerIpcHandlers } from './ipc' import { disposeZapret, recoverZapret } from './zapret' import { elevatedTaskDir, runElevatedServiceTask } from './zapret/elevated-task.win32' -const APP_ID = 'com.rknboost.app' +const APP_ID = 'com.senboost.app' // Приложение может быть запущено само собой через UAC как «повышенный помощник» — тогда // оно не открывает окно и не занимает единственный экземпляр (иначе отдало бы фокус уже diff --git a/src/main/settings.ts b/src/main/settings.ts index af133dd..e12a570 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -5,7 +5,7 @@ import { app } from 'electron' /** * Выбор пользователя между запусками: `settings.json` в userData (на Windows — - * `%AppData%\RKNboost`), поэтому переживает обновление и переустановку. + * `%AppData%\SenBoost`), поэтому переживает обновление и переустановку. * * Списки сайтов сюда не входят: они лежат рядом, в `userData/zapret-lists/*.txt`, и * читаются прямо оттуда самими tpws и winws (см. `zapret/lists.ts`). diff --git a/src/main/uninstall.win32.ts b/src/main/uninstall.win32.ts index 16bb97e..f805516 100644 --- a/src/main/uninstall.win32.ts +++ b/src/main/uninstall.win32.ts @@ -35,7 +35,7 @@ interface UninstallCommand { * строкой `'"$2" $0'`, где `$2` — путь к деинсталлятору, а `$0` — `/currentuser` для * per-user установки (или `/allusers`). То есть путь в кавычках И аргумент после него: * - * "C:\Users\...\AppData\Local\Programs\RKNboost\Uninstall RKNboost.exe" /currentuser + * "C:\Users\...\AppData\Local\Programs\SenBoost\Uninstall SenBoost.exe" /currentuser * * Аргумент обязателен: без него деинсталлятор не знает, из какой ветки реестра сниматься. * Разбираем строку на команду и аргументы, а не пытаемся скормить её `spawn` целиком — @@ -66,7 +66,7 @@ async function findUninstallCommand(): Promise { const script = "Get-ChildItem 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall' " + '| Get-ItemProperty ' + - "| Where-Object { $_.DisplayName -eq 'RKNboost' } " + + "| Where-Object { $_.DisplayName -eq 'SenBoost' } " + '| Select-Object -First 1 -ExpandProperty UninstallString' let stdout: string @@ -110,8 +110,8 @@ export async function uninstallApp(window: BrowserWindow | null): Promise defaultId: 0, cancelId: 0, noLink: true, - title: 'Удалить RKNboost', - message: 'Удалить RKNboost с этого компьютера?', + title: 'Удалить SenBoost', + message: 'Удалить SenBoost с этого компьютера?', detail: 'Приложение закроется и запустится стандартный деинсталлятор Windows. ' + 'Вместе с ним будут удалены списки сайтов и служба обхода блокировок. ' + diff --git a/src/main/zapret/deps.linux.ts b/src/main/zapret/deps.linux.ts index d30f493..6326c9b 100644 --- a/src/main/zapret/deps.linux.ts +++ b/src/main/zapret/deps.linux.ts @@ -2,7 +2,7 @@ import { access, constants } from 'node:fs/promises' /** * `pkexec` из состава polkit — им поднимаем root для nftables/nfqws. Проверяем по конкретным - * путям, а не через `PATH`: тот же мотив, что у `find_nft()` в `rknboost-helper.sh` — санитайз + * путям, а не через `PATH`: тот же мотив, что у `find_nft()` в `senboost-helper.sh` — санитайз * окружения инструментами вроде pkexec/env-с-урезанным-PATH встречается достаточно часто, * чтобы не полагаться на переменную окружения при поиске самого пути к элевации. */ diff --git a/src/main/zapret/elevated-task.win32.ts b/src/main/zapret/elevated-task.win32.ts index 346aa45..f48517d 100644 --- a/src/main/zapret/elevated-task.win32.ts +++ b/src/main/zapret/elevated-task.win32.ts @@ -60,7 +60,7 @@ export function elevatedTaskDir(argv: readonly string[]): string | null { * Смысл всей этой конструкции в том, ЧТО пользователь видит в окне UAC. Раньше приложение * повышало powershell.exe, и Windows честно показывала «Windows PowerShell» с подписью * Microsoft — запрос выглядел так, будто права просит не то, что запросил пользователь. - * Теперь повышается сам RKNboost.exe, и в запросе стоит имя приложения. + * Теперь повышается сам SenBoost.exe, и в запросе стоит имя приложения. * * Сам worker.ps1 при этом не изменился — вся логика sc/icacls осталась ровно та же, * поменялось только то, кого повышают. diff --git a/src/main/zapret/engine.linux.ts b/src/main/zapret/engine.linux.ts index 21c5b40..c7ccd54 100644 --- a/src/main/zapret/engine.linux.ts +++ b/src/main/zapret/engine.linux.ts @@ -12,7 +12,7 @@ const WATCH_INTERVAL_MS = 3000 * NFQUEUE. Ни служба, ни автозапуск не заведены (см. README.md) — каждое включение просит * пароль через `pkexec` (см. `nfqws.linux.ts`), а сам демон и его правила переживают выход * из приложения: `bypass` на очереди означает, что их отсутствие не рвёт пользователю сеть - * (см. `rknboost-helper.sh`), поэтому `dispose()` намеренно пуст — как и на Windows. + * (см. `senboost-helper.sh`), поэтому `dispose()` намеренно пуст — как и на Windows. */ export class LinuxEngine extends ZapretEngine { private watchTimer: ReturnType | null = null diff --git a/src/main/zapret/engine.win32.ts b/src/main/zapret/engine.win32.ts index 8e92af6..6bd659d 100644 --- a/src/main/zapret/engine.win32.ts +++ b/src/main/zapret/engine.win32.ts @@ -30,7 +30,7 @@ import { const run = promisify(execFile) -/** Первая строка `strategy.cfg` — из `winwsConfigFile()`, формат: `--comment=rknboost::`. */ +/** Первая строка `strategy.cfg` — из `winwsConfigFile()`, формат: `--comment=senboost::`. */ async function readInstalledMarkerLine(): Promise { try { const content = await readFile(serviceConfigPath(), 'utf8') @@ -85,7 +85,7 @@ async function needsReconfigure(config: EngineConfig, info: ServiceInfo | null): /** * Windows: winws требует драйвер WinDivert и права администратора, поэтому работает как служба - * Windows (`rknboost-zapret`), а не как обычный дочерний процесс приложения. + * Windows (`senboost-zapret`), а не как обычный дочерний процесс приложения. * * UAC запрашивается только при первой установке службы и при смене аргументов (новая стратегия, * переключение автозапуска) — этим занимается `service.win32.ts`. Обычные включение/выключение @@ -207,7 +207,7 @@ export class Win32Engine extends ZapretEngine { * а не после него. */ private async dryRun(configBody: string): Promise { - const dir = await mkdtemp(join(tmpdir(), 'rknboost-dryrun-')) + const dir = await mkdtemp(join(tmpdir(), 'senboost-dryrun-')) const configPath = join(dir, 'dry-run.cfg') try { await writeFile(configPath, configBody, 'utf8') diff --git a/src/main/zapret/nfqws.linux.ts b/src/main/zapret/nfqws.linux.ts index fe99c92..84da109 100644 --- a/src/main/zapret/nfqws.linux.ts +++ b/src/main/zapret/nfqws.linux.ts @@ -78,7 +78,7 @@ export async function stageRuntime(): Promise { } /** - * Номер очереди NFQUEUE — держать в синхроне с `QUEUE_NUM` в `rknboost-helper.sh` + * Номер очереди NFQUEUE — держать в синхроне с `QUEUE_NUM` в `senboost-helper.sh` * (там же и объяснение выбора числа). В TS он нужен только для `--dry-run` ниже: сам * помощник получает его не отсюда, а как захардкоженное значение в своём коде. */ @@ -97,7 +97,7 @@ const NFQUEUE_NUM = 220 * рассинхронизированы, но сам факт валидности остальных аргументов dry-run проверяет верно. */ export async function dryRun(configBody: string): Promise { - const dir = await mkdtemp(join(tmpdir(), 'rknboost-dryrun-')) + const dir = await mkdtemp(join(tmpdir(), 'senboost-dryrun-')) const configPath = join(dir, 'dry-run.cfg') try { await writeFile(configPath, configBody, 'utf8') @@ -198,8 +198,8 @@ export async function isProcessAlive(pid: number): Promise { } /** - * Не требует root: `nfqws.pid` и `strategy.cfg` в `/run/rknboost` помощник кладёт с правами - * 0644 (см. rknboost-helper.sh) именно затем, чтобы это чтение — и восстановление состояния + * Не требует root: `nfqws.pid` и `strategy.cfg` в `/run/senboost` помощник кладёт с правами + * 0644 (см. senboost-helper.sh) именно затем, чтобы это чтение — и восстановление состояния * в `LinuxEngine.sync()` — обходилось без пароля. */ export async function readNfqwsState(): Promise { diff --git a/src/main/zapret/paths.ts b/src/main/zapret/paths.ts index 3e406a2..5767344 100644 --- a/src/main/zapret/paths.ts +++ b/src/main/zapret/paths.ts @@ -34,8 +34,8 @@ export function nfqwsPath(): string { */ export function bundledHelperPath(): string { return app.isPackaged - ? join(process.resourcesPath, 'linux-helper', 'rknboost-helper.sh') - : resolve(app.getAppPath(), 'resources', 'linux-helper', 'rknboost-helper.sh') + ? join(process.resourcesPath, 'linux-helper', 'senboost-helper.sh') + : resolve(app.getAppPath(), 'resources', 'linux-helper', 'senboost-helper.sh') } /** @@ -57,7 +57,7 @@ export function stagedNfqwsPath(): string { } export function stagedHelperPath(): string { - return join(linuxStagingDir(), 'rknboost-helper.sh') + return join(linuxStagingDir(), 'senboost-helper.sh') } /** Стейджинговая копия `fakesDir()` — то, что реально читает nfqws (см. её комментарий). */ @@ -73,11 +73,11 @@ export function bundledFakesDir(): string { /** * Рабочий каталог демона — pidfile и `strategy.cfg` (последний — источник маркера стратегии * для `LinuxEngine.sync()`, читается без root: помощник кладёт его с правами 0644). Создаёт - * и чистит сам `rknboost-helper.sh`. `/run` — стандартный FHS-путь для данных, не переживающих + * и чистит сам `senboost-helper.sh`. `/run` — стандартный FHS-путь для данных, не переживающих * перезагрузку: nfqws её тоже не переживает, автозапуска на Linux нет (см. README.md). */ export function linuxRuntimeDir(): string { - return '/run/rknboost' + return '/run/senboost' } export function linuxPidfilePath(): string { @@ -118,7 +118,7 @@ export function darwinAutostartScriptPath(): string { * обычному пользователю (то же рассуждение, что у `protectedWinwsPath()` на Windows). */ export function darwinInstallDir(): string { - return '/Library/Application Support/RKNboost/zapret' + return '/Library/Application Support/SenBoost/zapret' } /** Стейджинговая копия `fakesDir()` — то же назначение, что `stagedFakesDir()` на Linux. */ @@ -138,15 +138,15 @@ export function darwinPortsPath(): string { /** * `utunws --pidfile=...` пишет сюда свой pid до начала работы (см. `daemon.sh`) — читается - * без root, тот же принцип, что у `linuxPidfilePath()`. `/var/run` — не `/run/rknboost` + * без root, тот же принцип, что у `linuxPidfilePath()`. `/var/run` — не `/run/senboost` * (Linux-путь): на macOS это симлинк на `/private/var/run`, а не отдельная точка монтирования. */ export function darwinPidfilePath(): string { - return '/var/run/rknboost-zapret.pid' + return '/var/run/senboost-zapret.pid' } 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) — только для чтения. */ @@ -177,12 +177,12 @@ export function fakesDir(): string { } /** - * Windows: служба `rknboost-zapret` работает от LocalSystem, поэтому её конфиг не может + * Windows: служба `senboost-zapret` работает от LocalSystem, поэтому её конфиг не может * жить в userData обычного пользователя — нужен каталог машинного уровня. `%ProgramData%` * почти всегда задан; `C:\ProgramData` — тот же путь, на который он указывает по умолчанию. */ 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` — пишется только повышенным скриптом службы. */ diff --git a/src/main/zapret/service.win32.ts b/src/main/zapret/service.win32.ts index 1f1209c..9111637 100644 --- a/src/main/zapret/service.win32.ts +++ b/src/main/zapret/service.win32.ts @@ -14,7 +14,7 @@ import { SERVICE_BINARY_NAMES, serviceConfigPath, serviceDataDir, winwsPath } fr const run = promisify(execFile) -export const SERVICE_NAME = 'rknboost-zapret' +export const SERVICE_NAME = 'senboost-zapret' const POLL_INTERVAL_MS = 300 const POLL_TIMEOUT_MS = 10000 @@ -377,11 +377,11 @@ try { $result = Invoke-ScRaw $scArgs if ($result.ExitCode -ne 0) { throw "sc config завершился с кодом $($result.ExitCode) : $($result.Output)" } } else { - $scArgs = 'create ' + $ServiceName + ' binPath= ' + $binPath + ' start= ' + $startType + ' DisplayName= "RKNboost: обход блокировок"' + $scArgs = 'create ' + $ServiceName + ' binPath= ' + $binPath + ' start= ' + $startType + ' DisplayName= "SenBoost: обход блокировок"' $result = Invoke-ScRaw $scArgs 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`, а не из кода возврата процесса. */ async function runElevated(payload: Record): Promise { - const dir = await mkdtemp(join(tmpdir(), 'rknboost-svc-')) + const dir = await mkdtemp(join(tmpdir(), 'senboost-svc-')) const workerPath = join(dir, TASK_FILES.worker) const outerPath = join(dir, 'outer.ps1') const payloadPath = join(dir, TASK_FILES.payload) diff --git a/src/main/zapret/strategies.ts b/src/main/zapret/strategies.ts index b8d8683..2d8598f 100644 --- a/src/main/zapret/strategies.ts +++ b/src/main/zapret/strategies.ts @@ -86,10 +86,10 @@ function quoteConfigArg(arg: string): string { */ function configMarker(strategyId: string, body: string): string { 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 стратегии из первой строки уже @@ -140,7 +140,7 @@ export interface PacketEngineConfig extends EngineConfig { /** * На 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) * эти два аргумента не понимает: вырезаем их и отдаём отдельно вызывающей стороне. */ @@ -167,7 +167,7 @@ export function packetEngineConfig(strategyId: string): PacketEngineConfig { throw new Error(`Стратегия «${strategyId}»: не найден --wf-tcp/--wf-udp в аргументах.`) } - // Значение уходит прямо в правило nftables (rknboost-helper.sh) или pf (daemon.sh) без + // Значение уходит прямо в правило nftables (senboost-helper.sh) или pf (daemon.sh) без // дополнительного экранирования — только цифры, запятые и дефисы диапазонов. Если Flowseal // когда-нибудь передаст что-то ещё (например, `~` — отрицание порта), лучше явная ошибка // тут, чем нераспознанный текст в командной строке nft/pfctl, которую выполняет root. diff --git a/src/main/zapret/utunws.darwin.ts b/src/main/zapret/utunws.darwin.ts index 7484b62..b48cbab 100644 --- a/src/main/zapret/utunws.darwin.ts +++ b/src/main/zapret/utunws.darwin.ts @@ -43,7 +43,7 @@ export function assertMacosVersion(): void { * Linux-`nfqws` здесь не нужен `--qnum` — этот путь специфичен для `#ifdef __linux__`. */ export async function dryRun(configBody: string): Promise { - const dir = await mkdtemp(join(tmpdir(), 'rknboost-dryrun-')) + const dir = await mkdtemp(join(tmpdir(), 'senboost-dryrun-')) const configPath = join(dir, 'dry-run.cfg') try { await writeFile(configPath, configBody, 'utf8') @@ -71,7 +71,7 @@ export interface StartUtunwsOptions { * выключение обхода (см. `runPrivileged()`/`resources/darwin-helper/install.sh`). */ export async function startUtunws(options: StartUtunwsOptions): Promise { - const dir = await mkdtemp(join(tmpdir(), 'rknboost-strategy-')) + const dir = await mkdtemp(join(tmpdir(), 'senboost-strategy-')) const configPath = join(dir, 'strategy.cfg') try { await writeFile(configPath, options.configBody, 'utf8') diff --git a/src/renderer/index.html b/src/renderer/index.html index d240480..e11c813 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -2,7 +2,7 @@ - RKNboost + SenBoost
- RKNboost + SenBoost