diff --git a/README.md b/README.md index a951928..4713ae5 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,13 @@ https://evilfox.win/ Некоторые AV (Bkav, Microsoft Wacapew/Wacatac, Ikarus Trojan.WinGo.Agent, Google, Trapmine) часто помечают **любые** неподписанные Go-бинарники с сетью и сменой системного прокси. +В 2.7.2: +- убран вечный цикл обновления (проверка больше не устанавливает сама; только кнопка «Обновить»); +- номер сборки в версии (`2.7.2+N` / FileVersion `2.7.2.N`); сравнение обновлений только по product semver. + +В 2.7.1: +- обновление только по кнопке «Обновить»; можно «Пропустить эту версию» (следующую всё равно предложит). + В 2.7.0: - GUI на macOS (тот же интерфейс, что на Windows): DMG → Navis.app открывает окно клиента; CLI лежит как `Navis-cli`. diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 2f0f5e1..8654969 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -12,8 +12,9 @@ android { applicationId = "win.evilfox.navis" minSdk = 26 targetSdk = 35 - versionCode = 270 - versionName = "2.7.0" + // versionCode = major*1_000_000 + minor*10_000 + patch*100 + build + versionCode = 2_070_201 + versionName = "2.7.2+1" vectorDrawables.useSupportLibrary = true ndk { abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86_64") diff --git a/build-macos.bat b/build-macos.bat index b5ca5e0..cc9f692 100644 --- a/build-macos.bat +++ b/build-macos.bat @@ -34,11 +34,11 @@ if errorlevel 1 exit /b 1 go build -o "tools\packmac\packmac.exe" .\tools\packmac if errorlevel 1 exit /b 1 -tools\packmac\packmac.exe -bin "dist\navis-release\darwin-arm64\Navis" -out "dist\navis-release\darwin-arm64" -version 2.7.1 -arch arm64 +tools\packmac\packmac.exe -bin "dist\navis-release\darwin-arm64\Navis" -out "dist\navis-release\darwin-arm64" -version 2.7.2 -build 2.7.2.1 -arch arm64 if errorlevel 1 exit /b 1 -tools\packmac\packmac.exe -bin "dist\navis-release\darwin-amd64\Navis" -out "dist\navis-release\darwin-amd64" -version 2.7.1 -arch amd64 +tools\packmac\packmac.exe -bin "dist\navis-release\darwin-amd64\Navis" -out "dist\navis-release\darwin-amd64" -version 2.7.2 -build 2.7.2.1 -arch amd64 if errorlevel 1 exit /b 1 -tools\packmac\packmac.exe -bin "dist\navis-release\darwin-universal\Navis" -out "dist\navis-release\darwin-universal" -version 2.7.1 -arch universal +tools\packmac\packmac.exe -bin "dist\navis-release\darwin-universal\Navis" -out "dist\navis-release\darwin-universal" -version 2.7.2 -build 2.7.2.1 -arch universal if errorlevel 1 exit /b 1 echo Built Mac GUI + CLI: diff --git a/cmd/vpnapp/main_windows.go b/cmd/vpnapp/main_windows.go index ad3de2e..6c9a933 100644 --- a/cmd/vpnapp/main_windows.go +++ b/cmd/vpnapp/main_windows.go @@ -1,4 +1,4 @@ -//go:build windows +//go:build windows package main @@ -92,7 +92,7 @@ func main() { cfgPath: cfgPath, logBuf: logBuf, updateStatus: update.Status{ - Current: update.CurrentVersion, + Current: update.DisplayVersion(), ManifestURL: update.DefaultManifestURL, }, } @@ -204,7 +204,7 @@ func (a *app) getState() (uiState, error) { CorePath: corePath, ConfigPath: a.cfgPath, Profiles: cfg.ListProfiles(), - Version: update.CurrentVersion, + Version: update.DisplayVersion(), Update: a.updateStatus, Pings: append([]netcheck.Result(nil), a.pings...), Subscription: cfg.SubscriptionURL, @@ -418,7 +418,7 @@ func (a *app) checkUpdate() (update.Status, error) { st, err := update.Check(ctx, update.DefaultManifestURL) a.mu.Lock() if err != nil { - st.Current = update.CurrentVersion + st.Current = update.DisplayVersion() st.ManifestURL = update.DefaultManifestURL st.Error = err.Error() } @@ -428,6 +428,14 @@ func (a *app) checkUpdate() (update.Status, error) { } func (a *app) applyUpdate() (string, error) { + // Explicit user action only — never called from autoCheckUpdate. + st, err := a.checkUpdate() + if err != nil { + return "", err + } + if !st.Available { + return "", fmt.Errorf("обновление не требуется (текущая %s)", update.DisplayVersion()) + } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) defer cancel() latest, err := update.Apply(ctx, update.DefaultManifestURL) @@ -444,14 +452,11 @@ func (a *app) applyUpdate() (string, error) { } func (a *app) autoCheckUpdate() { + // Only refresh update status for the UI banner — never auto-install. + // (Previously auto-apply caused an infinite update loop when the feed version + // stayed ahead of the shipped CurrentVersion in the downloaded binary.) time.Sleep(3 * time.Second) - st, err := a.checkUpdate() - if err != nil || !st.Available { - return - } - // Auto-apply + relaunch when a newer build is published. - time.Sleep(1500 * time.Millisecond) - _, _ = a.applyUpdate() + _, _ = a.checkUpdate() } func openURL(raw string) error { diff --git a/dist/navis-release/Navis.exe b/dist/navis-release/Navis.exe index 5bd4c20..b72117e 100644 Binary files a/dist/navis-release/Navis.exe and b/dist/navis-release/Navis.exe differ diff --git a/dist/navis-release/android/Navis.apk b/dist/navis-release/android/Navis.apk index 4961a89..6678d44 100644 Binary files a/dist/navis-release/android/Navis.apk and b/dist/navis-release/android/Navis.apk differ diff --git a/dist/navis-release/darwin-amd64/Navis b/dist/navis-release/darwin-amd64/Navis index 418572f..e6f5ab6 100644 Binary files a/dist/navis-release/darwin-amd64/Navis and b/dist/navis-release/darwin-amd64/Navis differ diff --git a/dist/navis-release/darwin-amd64/Navis-cli b/dist/navis-release/darwin-amd64/Navis-cli index 814ba3a..d58ace4 100644 Binary files a/dist/navis-release/darwin-amd64/Navis-cli and b/dist/navis-release/darwin-amd64/Navis-cli differ diff --git a/dist/navis-release/darwin-amd64/Navis.app.zip b/dist/navis-release/darwin-amd64/Navis.app.zip index d221f2f..ea28e45 100644 Binary files a/dist/navis-release/darwin-amd64/Navis.app.zip and b/dist/navis-release/darwin-amd64/Navis.app.zip differ diff --git a/dist/navis-release/darwin-amd64/Navis.dmg b/dist/navis-release/darwin-amd64/Navis.dmg index ef9d960..18c6661 100644 Binary files a/dist/navis-release/darwin-amd64/Navis.dmg and b/dist/navis-release/darwin-amd64/Navis.dmg differ diff --git a/dist/navis-release/darwin-arm64/Navis b/dist/navis-release/darwin-arm64/Navis index 57cd02a..2cf521f 100755 Binary files a/dist/navis-release/darwin-arm64/Navis and b/dist/navis-release/darwin-arm64/Navis differ diff --git a/dist/navis-release/darwin-arm64/Navis-cli b/dist/navis-release/darwin-arm64/Navis-cli index 67ee051..3c1031c 100755 Binary files a/dist/navis-release/darwin-arm64/Navis-cli and b/dist/navis-release/darwin-arm64/Navis-cli differ diff --git a/dist/navis-release/darwin-arm64/Navis.app.zip b/dist/navis-release/darwin-arm64/Navis.app.zip index 5ad25a4..ae69c21 100644 Binary files a/dist/navis-release/darwin-arm64/Navis.app.zip and b/dist/navis-release/darwin-arm64/Navis.app.zip differ diff --git a/dist/navis-release/darwin-arm64/Navis.dmg b/dist/navis-release/darwin-arm64/Navis.dmg index 8e0bce2..b5ac76f 100644 Binary files a/dist/navis-release/darwin-arm64/Navis.dmg and b/dist/navis-release/darwin-arm64/Navis.dmg differ diff --git a/dist/navis-release/darwin-universal/Navis b/dist/navis-release/darwin-universal/Navis index 0191cda..aa31ff9 100644 Binary files a/dist/navis-release/darwin-universal/Navis and b/dist/navis-release/darwin-universal/Navis differ diff --git a/dist/navis-release/darwin-universal/Navis-cli b/dist/navis-release/darwin-universal/Navis-cli index 4a6be2b..ea041e8 100644 Binary files a/dist/navis-release/darwin-universal/Navis-cli and b/dist/navis-release/darwin-universal/Navis-cli differ diff --git a/dist/navis-release/darwin-universal/Navis.app.zip b/dist/navis-release/darwin-universal/Navis.app.zip index d16bbac..7466656 100644 Binary files a/dist/navis-release/darwin-universal/Navis.app.zip and b/dist/navis-release/darwin-universal/Navis.app.zip differ diff --git a/dist/navis-release/darwin-universal/Navis.dmg b/dist/navis-release/darwin-universal/Navis.dmg index eb2e2f5..4f7d492 100644 Binary files a/dist/navis-release/darwin-universal/Navis.dmg and b/dist/navis-release/darwin-universal/Navis.dmg differ diff --git a/dist/navis-release/update.json b/dist/navis-release/update.json index 38c187e..5dd969b 100644 --- a/dist/navis-release/update.json +++ b/dist/navis-release/update.json @@ -1,22 +1,22 @@ { - "version": "2.7.1", - "notes": "macOS: UDZO DMG, Application Support cores path, naiveproxy asset name fix", + "version": "2.7.2", + "notes": "2.7.2: исправлен вечный цикл обновления (только кнопка «Обновить», без автоустановки); номер сборки 2.7.2+N; можно «Пропустить эту версию».", "platform": "windows-amd64", "os": "windows", "arch": "amd64", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "60392f389c9ed48b11124ce440d787ab7b051e7593833f15172e1c09434245dd", + "sha256": "9a64a3b059c53eb818ff696d5f446c39f52e243508f92d05365dd06a05c57a1e", "mandatory": false, "platforms": { "windows-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "60392f389c9ed48b11124ce440d787ab7b051e7593833f15172e1c09434245dd", + "sha256": "9a64a3b059c53eb818ff696d5f446c39f52e243508f92d05365dd06a05c57a1e", "os": "windows", "arch": "amd64" }, "darwin-arm64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", - "sha256": "8951c351b224d8a13e2772b6ee080d7bee3285ac162dd20c0855a8653a569ec5", + "sha256": "8fa7fcb40d4165d20d3f81840c84f729af034b54dd4698ea144c7145c85872eb", "os": "darwin", "arch": "arm64", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg", @@ -24,7 +24,7 @@ }, "darwin-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", - "sha256": "e71d7c0080e9acdcaa2355e4dd8fa3ccec8d4ed24646e27dbc1a814b0a4019cc", + "sha256": "8072cacd79fa95da3f3230b88b8e09e380ed2e9f634703f579950952b94f774d", "os": "darwin", "arch": "amd64", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg", @@ -32,11 +32,11 @@ }, "darwin-universal": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-universal/Navis", - "sha256": "6b58907bb81583cf1730b34012cce97e7f758cf3eb12e630c971d0232cce5262", + "sha256": "f50642373f615fa55117d1bbe7b2f86f2a19ab03a9ae53cc7e7d137b432ebbe5", "os": "darwin", "arch": "universal", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-universal/Navis.dmg", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-universal/Navis.app.zip" } } -} +} \ No newline at end of file diff --git a/dist/navis-release/vpnclient.exe b/dist/navis-release/vpnclient.exe new file mode 100644 index 0000000..00eb4d6 Binary files /dev/null and b/dist/navis-release/vpnclient.exe differ diff --git a/dist/update.json b/dist/update.json index 38c187e..5dd969b 100644 --- a/dist/update.json +++ b/dist/update.json @@ -1,22 +1,22 @@ { - "version": "2.7.1", - "notes": "macOS: UDZO DMG, Application Support cores path, naiveproxy asset name fix", + "version": "2.7.2", + "notes": "2.7.2: исправлен вечный цикл обновления (только кнопка «Обновить», без автоустановки); номер сборки 2.7.2+N; можно «Пропустить эту версию».", "platform": "windows-amd64", "os": "windows", "arch": "amd64", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "60392f389c9ed48b11124ce440d787ab7b051e7593833f15172e1c09434245dd", + "sha256": "9a64a3b059c53eb818ff696d5f446c39f52e243508f92d05365dd06a05c57a1e", "mandatory": false, "platforms": { "windows-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "60392f389c9ed48b11124ce440d787ab7b051e7593833f15172e1c09434245dd", + "sha256": "9a64a3b059c53eb818ff696d5f446c39f52e243508f92d05365dd06a05c57a1e", "os": "windows", "arch": "amd64" }, "darwin-arm64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", - "sha256": "8951c351b224d8a13e2772b6ee080d7bee3285ac162dd20c0855a8653a569ec5", + "sha256": "8fa7fcb40d4165d20d3f81840c84f729af034b54dd4698ea144c7145c85872eb", "os": "darwin", "arch": "arm64", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis.dmg", @@ -24,7 +24,7 @@ }, "darwin-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", - "sha256": "e71d7c0080e9acdcaa2355e4dd8fa3ccec8d4ed24646e27dbc1a814b0a4019cc", + "sha256": "8072cacd79fa95da3f3230b88b8e09e380ed2e9f634703f579950952b94f774d", "os": "darwin", "arch": "amd64", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis.dmg", @@ -32,11 +32,11 @@ }, "darwin-universal": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-universal/Navis", - "sha256": "6b58907bb81583cf1730b34012cce97e7f758cf3eb12e630c971d0232cce5262", + "sha256": "f50642373f615fa55117d1bbe7b2f86f2a19ab03a9ae53cc7e7d137b432ebbe5", "os": "darwin", "arch": "universal", "dmg_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-universal/Navis.dmg", "zip_url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-universal/Navis.app.zip" } } -} +} \ No newline at end of file diff --git a/internal/apphost/app.go b/internal/apphost/app.go index 94be36e..f33dcb9 100644 --- a/internal/apphost/app.go +++ b/internal/apphost/app.go @@ -70,7 +70,7 @@ func New(mgr *core.Manager, cfgPath string, logBuf *bytes.Buffer) *App { CfgPath: cfgPath, LogBuf: logBuf, UpdateStatus: update.Status{ - Current: update.CurrentVersion, + Current: update.DisplayVersion(), ManifestURL: update.DefaultManifestURL, }, } @@ -125,7 +125,7 @@ func (a *App) GetState() (UIState, error) { CorePath: corePath, ConfigPath: a.CfgPath, Profiles: cfg.ListProfiles(), - Version: update.CurrentVersion, + Version: update.DisplayVersion(), Update: a.UpdateStatus, Pings: append([]netcheck.Result(nil), a.Pings...), Subscription: cfg.SubscriptionURL, @@ -322,7 +322,7 @@ func (a *App) CheckUpdate() (update.Status, error) { st, err := update.Check(ctx, update.DefaultManifestURL) a.mu.Lock() if err != nil { - st.Current = update.CurrentVersion + st.Current = update.DisplayVersion() st.ManifestURL = update.DefaultManifestURL st.Error = err.Error() } @@ -332,6 +332,14 @@ func (a *App) CheckUpdate() (update.Status, error) { } func (a *App) ApplyUpdate() (string, error) { + // Explicit user action only — never called from AutoCheckUpdate. + st, err := a.CheckUpdate() + if err != nil { + return "", err + } + if !st.Available { + return "", fmt.Errorf("обновление не требуется (текущая %s)", update.DisplayVersion()) + } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) defer cancel() latest, err := update.Apply(ctx, update.DefaultManifestURL) @@ -351,13 +359,10 @@ func (a *App) ApplyUpdate() (string, error) { } func (a *App) AutoCheckUpdate() { + // Only check and populate status for the banner — never auto-apply. + // Auto-apply previously caused endless download→relaunch loops on Mac/Windows. time.Sleep(3 * time.Second) - st, err := a.CheckUpdate() - if err != nil || !st.Available { - return - } - time.Sleep(1500 * time.Millisecond) - _, _ = a.ApplyUpdate() + _, _ = a.CheckUpdate() } func (a *App) OpenShopURL(raw string) error { diff --git a/internal/appui/index.html b/internal/appui/index.html index e0ceb54..bbf8723 100644 --- a/internal/appui/index.html +++ b/internal/appui/index.html @@ -76,6 +76,15 @@ color: var(--muted); font-size: .84rem; } + .update-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + } + .update-actions .action { + flex: 1 1 auto; + min-width: 140px; + } .top { display: flex; @@ -712,7 +721,10 @@
Быстрый клиент · Naive · Hy2 · AWG · Xray