diff --git a/.gitignore b/.gitignore index d31ddbe..51a1266 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ bin/ configs/config.json configs/remnawave-api.json configs/account.json +# Baked panel credentials (copied by build.bat; never commit) +internal/remnawave/embeddedcfg/remnawave-api.json dist/navis-release/windows/configs/ # Runtime-downloaded protocol cores + local packaging artifact (not release sources) dist/navis-release/windows/bin/ @@ -17,8 +19,11 @@ cmd/vpnapp/resource.syso navis-update.bat Navis.exe.new Navis-pending.exe +EvilFox.exe.new +EvilFox-pending.exe *.bak Navis.exe.bak +EvilFox.exe.bak # MSIX staging / local packages packaging/msix/_staging/ diff --git a/README.md b/README.md index 4a76555..683cdaa 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ -# Navis +# EvilFox -Клиент [NaiveProxy](https://github.com/klzgrad/naiveproxy) + [Hysteria 2](https://github.com/apernet/hysteria) + [AmneziaWG 2.0](https://docs.amnezia.org/documentation/amnezia-wg/) + [Xray](https://github.com/XTLS/Xray-core) (VLESS / VMess / Trojan) с профилями, пингом, URL-подпиской / **Remnawave API** и автообновлением. +Клиент [NaiveProxy](https://github.com/klzgrad/naiveproxy) + [Hysteria 2](https://github.com/apernet/hysteria) + [AmneziaWG 2.0](https://docs.amnezia.org/documentation/amnezia-wg/) + [Xray](https://github.com/XTLS/Xray-core) (VLESS / VMess / Trojan) с профилями, пингом, централизованной выдачей конфигов (Remnawave) и автообновлением. + +> Ранее приложение называлось **Navis**. С 4.0.0 бинарник — `EvilFox.exe`. Каталог релиза `dist/navis-release/` и URL-путь сохранены, чтобы клиенты 3.x продолжали обновляться; в той же папке лежит и `Navis.exe` (копия `EvilFox.exe`) как совместимый алиас. ## Платформы | OS | Артефакты | UI | |----|----------|----| -| Windows amd64 | `Navis.exe` | GUI (WebView2) | +| Windows amd64 | `EvilFox.exe` (+ `Navis.exe` alias) | GUI (WebView2) | | macOS universal | `Navis.dmg` · `Navis.app.zip` | **GUI** (как Windows) | | macOS arm64 / amd64 | `Navis` · DMG · `Navis-cli` | GUI + CLI | | Android | `Navis.apk` | GUI (VpnService) | diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 67ddd0c..f77521d 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -13,8 +13,8 @@ android { minSdk = 26 targetSdk = 35 // versionCode = major*1_000_000 + minor*10_000 + patch*100 + build - versionCode = 3_100_001 - versionName = "3.10.0+1" + versionCode = 4_000_001 + versionName = "4.0.0+1" vectorDrawables.useSupportLibrary = true ndk { abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64") diff --git a/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt b/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt index f41253a..38fb80f 100644 --- a/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt +++ b/android/app/src/main/java/win/evilfox/navis/ui/NavisScreen.kt @@ -94,7 +94,7 @@ fun NavisScreen( .padding(18.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { - Text("Navis", fontSize = 28.sp, fontWeight = FontWeight.Black, color = Ink) + Text("EvilFox", fontSize = 28.sp, fontWeight = FontWeight.Black, color = Ink) Spacer(Modifier.width(8.dp)) Surface(color = Soft, shape = RoundedCornerShape(999.dp)) { Text("2.6.1", Modifier.padding(horizontal = 8.dp, vertical = 2.dp), fontSize = 12.sp, fontWeight = FontWeight.Bold, color = AccentDeep) diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 9ad5410..4a4120a 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ - Navis - Navis VPN + EvilFox + EvilFox VPN Подключено VPN diff --git a/build.bat b/build.bat index 9af32e4..a5ee9c6 100644 --- a/build.bat +++ b/build.bat @@ -14,22 +14,37 @@ if errorlevel 1 ( goversioninfo -64 -icon assets\navis.ico -manifest assets\app.manifest -o cmd\vpnapp\resource.syso versioninfo.json if errorlevel 1 exit /b 1 -echo Building Navis GUI and CLI... -go build -ldflags="-H windowsgui -s -w" -trimpath -o Navis.exe ./cmd/vpnapp +REM Bake Remnawave panel credentials into the binary (NordVPN-style centralized provisioning). +REM Source of truth: configs\remnawave-api.json (gitignored). Never commit the embedded copy. +if exist "configs\remnawave-api.json" ( + mkdir "internal\remnawave\embeddedcfg" 2>nul + copy /Y "configs\remnawave-api.json" "internal\remnawave\embeddedcfg\remnawave-api.json" >nul + echo Embedded panel credentials from configs\remnawave-api.json +) else ( + echo WARNING: configs\remnawave-api.json missing — build will use external file / no auto-provision +) + +echo Building EvilFox GUI and CLI... +go build -ldflags="-H windowsgui -s -w" -trimpath -o EvilFox.exe ./cmd/vpnapp if errorlevel 1 exit /b 1 -go build -ldflags="-s -w" -trimpath -o vpnclient.exe ./cmd/vpnclient +go build -ldflags="-s -w" -trimpath -o evilfox-cli.exe ./cmd/vpnclient if errorlevel 1 exit /b 1 mkdir "dist\navis-release\windows" 2>nul -copy /Y Navis.exe "dist\navis-release\windows\Navis.exe" >nul -copy /Y vpnclient.exe "dist\navis-release\windows\vpnclient.exe" >nul +copy /Y EvilFox.exe "dist\navis-release\windows\EvilFox.exe" >nul +REM Keep Navis.exe path for existing 3.x clients that fetch the old feed URL. +copy /Y EvilFox.exe "dist\navis-release\windows\Navis.exe" >nul +copy /Y evilfox-cli.exe "dist\navis-release\windows\evilfox-cli.exe" >nul +copy /Y evilfox-cli.exe "dist\navis-release\windows\vpnclient.exe" >nul echo. echo Done: -echo Navis.exe -echo vpnclient.exe -echo dist\navis-release\windows\Navis.exe +echo EvilFox.exe +echo evilfox-cli.exe +echo dist\navis-release\windows\EvilFox.exe +echo dist\navis-release\windows\Navis.exe (compat alias for 3.x updater) +echo dist\navis-release\windows\evilfox-cli.exe echo dist\navis-release\windows\vpnclient.exe echo assets\navis.ico endlocal diff --git a/cmd/vpnapp/main_darwin.go b/cmd/vpnapp/main_darwin.go index 70e111f..41c7dbe 100644 --- a/cmd/vpnapp/main_darwin.go +++ b/cmd/vpnapp/main_darwin.go @@ -71,7 +71,7 @@ func main() { log.Printf("open UI: %v — откройте вручную: %s", err, uiURL) fmt.Println(uiURL) } else { - log.Printf("Navis UI: %s", uiURL) + log.Printf("EvilFox UI: %s", uiURL) } sig := make(chan os.Signal, 1) @@ -96,7 +96,7 @@ func openAppWindow(uiURL string) error { func fatalf(format string, args ...any) { msg := fmt.Sprintf(format, args...) log.Println(msg) - _ = exec.Command("osascript", "-e", fmt.Sprintf(`display alert "Navis" message %q`, msg)).Run() + _ = exec.Command("osascript", "-e", fmt.Sprintf(`display alert "EvilFox" message %q`, msg)).Run() os.Exit(1) } diff --git a/cmd/vpnapp/main_other.go b/cmd/vpnapp/main_other.go index 66ae7be..249dc2f 100644 --- a/cmd/vpnapp/main_other.go +++ b/cmd/vpnapp/main_other.go @@ -8,7 +8,7 @@ import ( ) func main() { - fmt.Fprintln(os.Stderr, "Navis GUI supports Windows (WebView2) and macOS.") - fmt.Fprintln(os.Stderr, "On this OS use the CLI: ./Navis connect | install-core | check-update") + fmt.Fprintln(os.Stderr, "EvilFox GUI supports Windows (WebView2) and macOS.") + fmt.Fprintln(os.Stderr, "On this OS use the CLI: ./evilfox-cli connect | install-core | check-update") os.Exit(1) } diff --git a/cmd/vpnapp/main_windows.go b/cmd/vpnapp/main_windows.go index cf49fd2..5c70b06 100644 --- a/cmd/vpnapp/main_windows.go +++ b/cmd/vpnapp/main_windows.go @@ -117,7 +117,7 @@ func main() { AutoFocus: true, DataPath: dataPath, WindowOptions: webview2.WindowOptions{ - Title: "Navis 2", + Title: "EvilFox", Width: 920, Height: 680, Center: true, @@ -160,12 +160,32 @@ func main() { mustBind(w, "getLogs", a.getLogs) go a.autoCheckUpdate() + go a.autoProvision() mgr.StartAutoRenew(6 * time.Hour) w.SetHtml(appui.IndexHTML) w.Run() } +// autoProvision quietly issues a panel account + imports configs on first run +// (NordVPN-style centralized provisioning — users never edit the panel). +func (a *app) autoProvision() { + if !a.mgr.ProvisionConfigured() { + return + } + time.Sleep(2 * time.Second) + out, err := a.mgr.EnsureAutoProvision() + if err != nil { + fmt.Fprintf(a.logBuf, "auto-provision: %v\n", err) + return + } + if out.Created { + fmt.Fprintf(a.logBuf, "auto-provision: создан %s · серверов %d\n", out.Username, out.Imported) + } else if out.Imported > 0 { + fmt.Fprintf(a.logBuf, "auto-provision: обновлены конфиги %s · серверов %d\n", out.Username, out.Imported) + } +} + func mustBind(w webview2.WebView, name string, fn interface{}) { if err := w.Bind(name, fn); err != nil { fatalDialog("bind %s: %v", name, err) @@ -503,12 +523,12 @@ func (a *app) applyUpdate() (string, error) { return "", err } _ = a.mgr.Disconnect() - // Hard-exit so Windows unlocks Navis.exe; do not wait on webview.Terminate (can hang). + // Hard-exit so Windows unlocks EvilFox.exe; do not wait on webview.Terminate (can hang). go func() { time.Sleep(300 * time.Millisecond) os.Exit(0) }() - return "Устанавливается v" + latest + "… Navis перезапустится.", nil + return "Устанавливается v" + latest + "… EvilFox перезапустится.", nil } func (a *app) autoCheckUpdate() { diff --git a/cmd/vpnapp/msgbox_windows.go b/cmd/vpnapp/msgbox_windows.go index 2a77543..dfc1bac 100644 --- a/cmd/vpnapp/msgbox_windows.go +++ b/cmd/vpnapp/msgbox_windows.go @@ -10,7 +10,7 @@ import ( func messageBox(text string) { user32 := syscall.NewLazyDLL("user32.dll") proc := user32.NewProc("MessageBoxW") - title, _ := syscall.UTF16PtrFromString("Navis") + title, _ := syscall.UTF16PtrFromString("EvilFox") body, _ := syscall.UTF16PtrFromString(text) proc.Call(0, uintptr(unsafe.Pointer(body)), uintptr(unsafe.Pointer(title)), 0x10) // MB_ICONERROR } diff --git a/cmd/vpnclient/main.go b/cmd/vpnclient/main.go index 8ff9b49..14f3db2 100644 --- a/cmd/vpnclient/main.go +++ b/cmd/vpnclient/main.go @@ -59,16 +59,16 @@ func main() { } func printUsage() { - fmt.Fprintf(os.Stderr, `Navis VPN client (Naive / Hy2 / AWG / VLESS / VMess / Trojan) — Windows / macOS + fmt.Fprintf(os.Stderr, `EvilFox VPN client (Naive / Hy2 / AWG / VLESS / VMess / Trojan) — Windows / macOS Usage: - navis init [-config configs/config.json] - navis install-core [-config configs/config.json] - navis set-proxy [-config configs/config.json] - navis connect [-config configs/config.json] [-profile name] [-no-sysproxy] [-probe] - navis probe [-config configs/config.json] [-profile name] [-url URL] - navis check-update - navis apply-update + evilfox-cli init [-config configs/config.json] + evilfox-cli install-core [-config configs/config.json] + evilfox-cli set-proxy [-config configs/config.json] + evilfox-cli connect [-config configs/config.json] [-profile name] [-no-sysproxy] [-probe] + evilfox-cli probe [-config configs/config.json] [-profile name] [-url URL] + evilfox-cli check-update + evilfox-cli apply-update Share links: naive+https://… hysteria2://… vless://… vmess://… trojan://… awg .conf diff --git a/dist/navis-release/update.json b/dist/navis-release/update.json index 30e0641..86f6375 100644 --- a/dist/navis-release/update.json +++ b/dist/navis-release/update.json @@ -1,16 +1,16 @@ { - "version": "3.10.0", - "notes": "3.10.0+2: новый интерфейс с боковым меню (Главная / Профили / Настройки / Логи / О программе), аккаунт с продлением 50 ГБ / +30 дней и автопродлением, режим VPN на Windows (TUN, весь трафик, нужны права администратора и wintun.dll). Обновления теперь с git.de4ima.uk. Windows 3.10.0.2.", + "version": "4.0.0", + "notes": "4.0.0+1: ребрендинг Navis → EvilFox; централизованная автовыдача конфигов (как NordVPN — панель вшита, пользователь только выбирает сервер и продлевает); из интерфейса убраны настройки Remnawave API. Windows 4.0.0.1. Клиенты 3.x обновляются по этому фиду; Navis.exe в релизе — совместимый алиас EvilFox.exe.", "platform": "windows-amd64", "os": "windows", "arch": "amd64", - "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe", - "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3", + "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe", + "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c", "mandatory": false, "platforms": { "windows-amd64": { - "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe", - "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3", + "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe", + "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c", "os": "windows", "arch": "amd64" }, diff --git a/dist/navis-release/windows/EvilFox.exe b/dist/navis-release/windows/EvilFox.exe new file mode 100644 index 0000000..53b8ade Binary files /dev/null and b/dist/navis-release/windows/EvilFox.exe differ diff --git a/dist/navis-release/windows/Navis.exe b/dist/navis-release/windows/Navis.exe index bf07c02..53b8ade 100644 Binary files a/dist/navis-release/windows/Navis.exe and b/dist/navis-release/windows/Navis.exe differ diff --git a/dist/navis-release/windows/evilfox-cli.exe b/dist/navis-release/windows/evilfox-cli.exe new file mode 100644 index 0000000..5ef29bc Binary files /dev/null and b/dist/navis-release/windows/evilfox-cli.exe differ diff --git a/dist/navis-release/windows/vpnclient.exe b/dist/navis-release/windows/vpnclient.exe index 7e545e0..5ef29bc 100644 Binary files a/dist/navis-release/windows/vpnclient.exe and b/dist/navis-release/windows/vpnclient.exe differ diff --git a/dist/update.json b/dist/update.json index 30e0641..86f6375 100644 --- a/dist/update.json +++ b/dist/update.json @@ -1,16 +1,16 @@ { - "version": "3.10.0", - "notes": "3.10.0+2: новый интерфейс с боковым меню (Главная / Профили / Настройки / Логи / О программе), аккаунт с продлением 50 ГБ / +30 дней и автопродлением, режим VPN на Windows (TUN, весь трафик, нужны права администратора и wintun.dll). Обновления теперь с git.de4ima.uk. Windows 3.10.0.2.", + "version": "4.0.0", + "notes": "4.0.0+1: ребрендинг Navis → EvilFox; централизованная автовыдача конфигов (как NordVPN — панель вшита, пользователь только выбирает сервер и продлевает); из интерфейса убраны настройки Remnawave API. Windows 4.0.0.1. Клиенты 3.x обновляются по этому фиду; Navis.exe в релизе — совместимый алиас EvilFox.exe.", "platform": "windows-amd64", "os": "windows", "arch": "amd64", - "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe", - "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3", + "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe", + "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c", "mandatory": false, "platforms": { "windows-amd64": { - "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/Navis.exe", - "sha256": "55ba57898ffc23ce1cb14172643513f70a2ae972c00181b2d3d889430bce1eb3", + "url": "https://git.de4ima.uk/Evilfox/navi/raw/branch/Windows/dist/navis-release/windows/EvilFox.exe", + "sha256": "869b37310526003143c5db8ea3ad6d4468173e9053cf585f06c162a861d5c49c", "os": "windows", "arch": "amd64" }, diff --git a/internal/apphost/app.go b/internal/apphost/app.go index 4d6748e..07f5c2c 100644 --- a/internal/apphost/app.go +++ b/internal/apphost/app.go @@ -76,6 +76,18 @@ type PingBestResult struct { func New(mgr *core.Manager, cfgPath string, logBuf *bytes.Buffer) *App { // Monthly plan upkeep: check at start and then periodically. mgr.StartAutoRenew(6 * time.Hour) + // NordVPN-style: silently issue a panel account + import configs. + go func() { + time.Sleep(2 * time.Second) + if !mgr.ProvisionConfigured() { + return + } + if out, err := mgr.EnsureAutoProvision(); err != nil { + fmt.Fprintf(logBuf, "auto-provision: %v\n", err) + } else if out.Created { + fmt.Fprintf(logBuf, "auto-provision: создан %s · серверов %d\n", out.Username, out.Imported) + } + }() return &App{ Mgr: mgr, CfgPath: cfgPath, @@ -410,7 +422,7 @@ func (a *App) ApplyUpdate() (string, error) { os.Exit(0) }() } - return "Устанавливается v" + latest + "… Navis перезапустится.", nil + return "Устанавливается v" + latest + "… EvilFox перезапустится.", nil } func (a *App) AutoCheckUpdate() { diff --git a/internal/appui/index.html b/internal/appui/index.html index 0094648..a48fbee 100644 --- a/internal/appui/index.html +++ b/internal/appui/index.html @@ -3,7 +3,7 @@ - Navis + EvilFox