Добавлена сборка под Linux: nfqws + правила nftables (NFQUEUE) вместо socks-прокси или службы Windows. Повышение прав — pkexec на каждое включение/выключение, без службы и без автозапуска. Стратегии переиспользуют существующий набор Flowseal (strategies.win32.generated.ts): --wf-tcp/--wf-udp уходят в правила nftables, остальное — в nfqws как есть. Все правила nftables держат bypass, поэтому упавший или выключенный демон не рвёт пользователю сеть. Помощник (resources/linux-helper/rknboost-helper.sh) и бинарник nfqws перед каждым запуском копируются в userData: root не может прочитать файлы внутри AppImage (FUSE-примонтирован без allow_other), а обычная файловая система на диске ему доступна независимо от прав. Заодно: - починен баг генератора стратегий (^! не разэкранировался в !, ломало fake-tls-auto и на Windows тоже); - карточка обхода теперь показывает текст ошибки независимо от state; - счётчик auto-hostlist в настройках больше не привязан к !isWindows; - CI: отдельная джоба сборки под Linux на ubuntu-latest.
164 lines
8.7 KiB
YAML
164 lines
8.7 KiB
YAML
appId: com.rknboost.app
|
||
productName: RKNboost
|
||
directories:
|
||
buildResources: build
|
||
output: release
|
||
|
||
# releaseType: release — публиковать релиз сразу, без черновика (draft — поведение по
|
||
# умолчанию у electron-builder). С черновиком параллельная загрузка нескольких файлов иногда
|
||
# создаёт два черновика с одним и тем же тегом вместо одного релиза.
|
||
#
|
||
# publishAutoUpdate: false — не заливать latest.yml. Это метаданные для electron-updater,
|
||
# которого в приложении нет (обновляется пользователь вручную, скачивая новый инсталлятор
|
||
# со страницы релиза) — файл был бы мёртвым грузом в ассетах.
|
||
publish:
|
||
provider: github
|
||
releaseType: release
|
||
publishAutoUpdate: false
|
||
|
||
files:
|
||
- '!**/.vscode/*'
|
||
- '!src/*'
|
||
- '!electron.vite.config.{js,ts,mjs,cjs}'
|
||
- '!{.eslintcache,eslint.config.mjs,.prettierignore,.prettierrc.yaml,README.md}'
|
||
- '!{.env,.env.*,.npmrc,pnpm-lock.yaml,yarn.lock}'
|
||
- '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'
|
||
- '!.github/*'
|
||
# zapret и linux-helper идут отдельно через extraResources ниже — не дублировать их в app.asar.
|
||
- '!resources/zapret/**'
|
||
- '!resources/linux-helper/**'
|
||
asarUnpack:
|
||
- 'resources/**'
|
||
|
||
# Бинарники zapret (npm run zapret:fetch) кладём рядом с приложением, а не в asar —
|
||
# это исполняемые файлы, которые main-процесс запускает через spawn.
|
||
#
|
||
# Общие для всех платформ куски (списки, fake-пакеты, лицензии zapret/Flowseal) — здесь;
|
||
# платформенные бинарники — в extraResources соответствующего раздела (win/mac/linux) ниже.
|
||
# extraResources платформы ДОБАВЛЯЕТСЯ к этому списку, а не заменяет его (проверено по
|
||
# исходникам electron-builder, app-builder-lib/fileMatcher.js) — так Windows-сборка не везёт
|
||
# nfqws и Mach-O tpws, а Linux-сборка не везёт WinDivert и winws.exe.
|
||
extraResources:
|
||
- from: resources/zapret/lists
|
||
to: zapret/lists
|
||
- from: resources/zapret/fakes
|
||
to: zapret/fakes
|
||
- from: resources/zapret
|
||
to: zapret
|
||
filter:
|
||
- 'LICENSE.zapret.txt'
|
||
- 'LICENSE.flowseal.txt'
|
||
|
||
win:
|
||
executableName: RKNboost
|
||
# Приложение запрашивает права администратора при КАЖДОМ запуске (манифест exe).
|
||
# Внимание на компромисс: установка при этом остаётся per-user, то есть exe лежит в
|
||
# %LocalAppData%\Programs\RKNboost — папке, доступной на запись обычному пользователю.
|
||
# Значит подмена этого exe даёт злоумышленнику администратора с подтверждения самого
|
||
# пользователя. Это осознанный выбор владельца проекта; безопасный вариант — вернуть
|
||
# perMachine: true, чтобы exe лежал в защищённом от записи Program Files.
|
||
requestedExecutionLevel: requireAdministrator
|
||
target:
|
||
# arm64 не собираем: WinDivert (драйвер для winws — src/main/zapret/engine.win32.ts)
|
||
# не имеет подписанной сборки под arm64, только x64 через эмуляцию (docs/windows.md
|
||
# в поставке zapret) — arm64-инсталлятор был бы заведомо нерабочим.
|
||
- target: nsis
|
||
arch: [x64]
|
||
extraResources:
|
||
- from: resources/zapret/win32
|
||
to: zapret/win32
|
||
- from: resources/zapret
|
||
to: zapret
|
||
filter:
|
||
- 'LICENSE.WinDivert.txt'
|
||
nsis:
|
||
# Быстрая установка per-user, без UAC и без мастера: ставится в %LocalAppData%, куда
|
||
# обычный пользователь и так пишет без повышения прав. Раньше здесь стоял perMachine —
|
||
# это была защита от того, что служба (LocalSystem) ссылалась бы на winws.exe прямо
|
||
# в папке установки. Теперь вместо этого при первом включении обхода приложение сама
|
||
# копирует winws.exe в защищённый ACL'ом каталог в %ProgramData% (см. applyServiceConfig
|
||
# в src/main/zapret/service.win32.ts) — сама установка приложения per-user безопасна.
|
||
oneClick: true
|
||
perMachine: false
|
||
# Без electron-updater (см. publishAutoUpdate выше) differential-обновления не нужны —
|
||
# differentialPackage: false отключает генерацию .blockmap, который иначе всегда
|
||
# заливался бы в ассеты релиза рядом с инсталлятором.
|
||
differentialPackage: false
|
||
# Удалять %APPDATA%\rknboost (списки сайтов, метка первого запуска) вместе с приложением.
|
||
# По умолчанию electron-builder этого НЕ делает, и данные оставались бы в системе после
|
||
# удаления. Обновление приложения под это не попадает — в шаблоне деинсталлятора стоит
|
||
# проверка `ifNot isUpdated`, так что отредактированные списки переживают обновление.
|
||
deleteAppDataOnUninstall: true
|
||
include: build/installer.nsh
|
||
artifactName: ${name}-${version}-setup-${arch}.${ext}
|
||
shortcutName: ${productName}
|
||
uninstallDisplayName: ${productName}
|
||
createDesktopShortcut: always
|
||
|
||
mac:
|
||
category: public.app-category.productivity
|
||
target:
|
||
- target: dmg
|
||
arch: [x64, arm64]
|
||
- target: zip
|
||
arch: [x64, arm64]
|
||
entitlements: build/entitlements.mac.plist
|
||
entitlementsInherit: build/entitlements.mac.plist
|
||
hardenedRuntime: true
|
||
# tpws — сторонний Mach-O внутри .app; hardened runtime требует, чтобы electron-builder
|
||
# подписал и его тем же Developer ID, иначе Gatekeeper убьёт процесс при первом spawn.
|
||
binaries:
|
||
- Contents/Resources/zapret/darwin/tpws
|
||
# Подпись и нотаризация выключены: без Apple Developer ID сборка иначе падает.
|
||
# Как включить — см. раздел «Подпись» в README.md.
|
||
notarize: false
|
||
extraResources:
|
||
- from: resources/zapret/darwin
|
||
to: zapret/darwin
|
||
dmg:
|
||
artifactName: ${name}-${version}-${arch}.${ext}
|
||
|
||
linux:
|
||
executableName: rknboost
|
||
# desktopName в package.json + syncDesktopName — иначе Electron не свяжет открытые окна
|
||
# с .desktop-записью (app_id/WM_CLASS), и часть окружений не покажет иконку в панели задач.
|
||
syncDesktopName: true
|
||
target:
|
||
- target: AppImage
|
||
arch: [x64]
|
||
- target: deb
|
||
arch: [x64]
|
||
maintainer: RKNboost
|
||
category: Network
|
||
synopsis: Обход блокировок через zapret
|
||
extraResources:
|
||
- from: resources/zapret/linux
|
||
to: zapret/linux
|
||
# rknboost-helper.sh — привилегированный помощник (nfqws.linux.ts зовёт его через
|
||
# pkexec). Не из resources/zapret: тот качает fetch-zapret.mjs, а этот файл — свой,
|
||
# лежит в репозитории (см. src/main/zapret/paths.ts:bundledHelperPath()).
|
||
- from: resources/linux-helper
|
||
to: linux-helper
|
||
appImage:
|
||
artifactName: ${name}-${version}-${arch}.${ext}
|
||
deb:
|
||
artifactName: ${name}-${version}-${arch}.${ext}
|
||
# electron-builder ЗАМЕНЯЕТ этим списком свои дефолтные зависимости Electron, а не
|
||
# дополняет их (проверено по исходникам, app-builder-lib/targets/FpmTarget.js) — потерять
|
||
# хотя бы одну из первых девяти значило бы получить .deb, который ставится и не запускается.
|
||
# nftables и polkit — уже наши, для nfqws/pkexec.
|
||
depends:
|
||
- libgtk-3-0
|
||
- libnotify4
|
||
- libnss3
|
||
- libxss1
|
||
- libxtst6
|
||
- xdg-utils
|
||
- libatspi2.0-0
|
||
- libuuid1
|
||
- libsecret-1-0
|
||
- nftables
|
||
- policykit-1
|
||
|
||
npmRebuild: false
|