Переименование проекта: 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:
@@ -44,7 +44,7 @@ export async function showFirstRunSupportDialog(window: BrowserWindow): Promise<
|
||||
defaultId: 0,
|
||||
cancelId: 1,
|
||||
noLink: true,
|
||||
title: 'Поддержите RKNboost',
|
||||
title: 'Поддержите SenBoost',
|
||||
message: 'Поддержите проект',
|
||||
detail: 'Поддержите проект звездочкой на GitHub, и расскажите друзьям :З'
|
||||
})
|
||||
|
||||
+1
-1
@@ -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 как «повышенный помощник» — тогда
|
||||
// оно не открывает окно и не занимает единственный экземпляр (иначе отдало бы фокус уже
|
||||
|
||||
@@ -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`).
|
||||
|
||||
@@ -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<UninstallCommand | null> {
|
||||
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<void>
|
||||
defaultId: 0,
|
||||
cancelId: 0,
|
||||
noLink: true,
|
||||
title: 'Удалить RKNboost',
|
||||
message: 'Удалить RKNboost с этого компьютера?',
|
||||
title: 'Удалить SenBoost',
|
||||
message: 'Удалить SenBoost с этого компьютера?',
|
||||
detail:
|
||||
'Приложение закроется и запустится стандартный деинсталлятор Windows. ' +
|
||||
'Вместе с ним будут удалены списки сайтов и служба обхода блокировок. ' +
|
||||
|
||||
@@ -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 встречается достаточно часто,
|
||||
* чтобы не полагаться на переменную окружения при поиске самого пути к элевации.
|
||||
*/
|
||||
|
||||
@@ -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 осталась ровно та же,
|
||||
* поменялось только то, кого повышают.
|
||||
|
||||
@@ -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<typeof setInterval> | null = null
|
||||
|
||||
@@ -30,7 +30,7 @@ import {
|
||||
|
||||
const run = promisify(execFile)
|
||||
|
||||
/** Первая строка `strategy.cfg` — из `winwsConfigFile()`, формат: `--comment=rknboost:<id>:<hash>`. */
|
||||
/** Первая строка `strategy.cfg` — из `winwsConfigFile()`, формат: `--comment=senboost:<id>:<hash>`. */
|
||||
async function readInstalledMarkerLine(): Promise<string | null> {
|
||||
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<void> {
|
||||
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')
|
||||
|
||||
@@ -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` ниже: сам
|
||||
* помощник получает его не отсюда, а как захардкоженное значение в своём коде.
|
||||
*/
|
||||
@@ -97,7 +97,7 @@ const NFQUEUE_NUM = 220
|
||||
* рассинхронизированы, но сам факт валидности остальных аргументов dry-run проверяет верно.
|
||||
*/
|
||||
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')
|
||||
try {
|
||||
await writeFile(configPath, configBody, 'utf8')
|
||||
@@ -198,8 +198,8 @@ export async function isProcessAlive(pid: number): Promise<boolean> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Не требует 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<NfqwsState> {
|
||||
|
||||
+11
-11
@@ -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` — пишется только повышенным скриптом службы. */
|
||||
|
||||
@@ -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<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 outerPath = join(dir, 'outer.ps1')
|
||||
const payloadPath = join(dir, TASK_FILES.payload)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -43,7 +43,7 @@ export function assertMacosVersion(): void {
|
||||
* Linux-`nfqws` здесь не нужен `--qnum` — этот путь специфичен для `#ifdef __linux__`.
|
||||
*/
|
||||
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')
|
||||
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<void> {
|
||||
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')
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>RKNboost</title>
|
||||
<title>SenBoost</title>
|
||||
<!-- Жёсткий CSP: никаких внешних скриптов, стилей и запросов.
|
||||
https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
|
||||
<meta
|
||||
|
||||
@@ -20,7 +20,7 @@ export default function App(): React.JSX.Element {
|
||||
) : (
|
||||
<>
|
||||
<div className="app-header">
|
||||
<span className="app-header__name">RKNboost</span>
|
||||
<span className="app-header__name">SenBoost</span>
|
||||
<button
|
||||
type="button"
|
||||
className="app-header__settings"
|
||||
|
||||
+1
-1
@@ -3,4 +3,4 @@
|
||||
* в настройках (`SettingsView.tsx`), и приветственное окно при первом запуске
|
||||
* (`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