diff --git a/CHANGELOG.md b/CHANGELOG.md index 8efdfcb..daaca9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T ## Unveröffentlicht +### Behoben + +- Desktop-App: „Auf Version … aktualisieren“ im Menü des Tessera-Symbols scheiterte mit „Signaturprüfung fehlgeschlagen“ und öffnete stattdessen die Download-Seite, wenn der Server seit der letzten Update-Prüfung der App eine neuere Version bekommen hatte. Die App fragt jetzt beim Klick zuerst frisch nach und installiert genau die Version, die der Server in diesem Moment anbietet. + ## 1.7.0 – 2026-09-29 ### Neu diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index c165044..a115a2b 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -461,7 +461,15 @@ fn clear_check_notice(app: &AppHandle) { /// / kein Update / fehlgeschlagen mit Grund); nur der http-Fall bleibt /// gesperrt. Ein fehlgeschlagener Check war bisher vom Zustand "kein Update" /// nicht unterscheidbar (quick-260922-frg). -fn spawn_version_check(app: AppHandle, server_url: String) { +/// +/// `install_after`: der Klick auf "Auf Version … aktualisieren" installiert +/// NICHT den abgelegten Stand, sondern prueft zuerst frisch und installiert +/// genau, was diese Pruefung liefert. Grund (Nutzer, 29.09.2026: "Signatur- +/// verifikation failed", danach Browser): die Download-Adresse +/// `/desktop/download/` liefert immer den AKTUELLEN Installer; ein +/// Stunden alter Stand trug noch die Signatur der Vorversion, nach dem +/// Server-Update passten Datei und Signatur nicht mehr zusammen. +fn spawn_version_check(app: AppHandle, server_url: String, install_after: bool) { let update_item = app.state::().update.clone(); let _ = update_item.set_text(UPDATE_ITEM_CHECKING); let _ = update_item.set_enabled(false); @@ -489,6 +497,11 @@ fn spawn_version_check(app: AppHandle, server_url: String) { // das Plugin wendet `Update.timeout` als Gesamt-Timeout des // Downloads an (updater.rs Z. 698-700). update.timeout = Some(Duration::from_secs(600)); + clear_check_notice(&app); + if install_after { + spawn_update_install(app.clone(), update, menu_text); + return; + } let _ = app .notification() .builder() @@ -500,7 +513,6 @@ fn spawn_version_check(app: AppHandle, server_url: String) { if let Ok(mut pending) = app.state::().0.lock() { *pending = Some((update, menu_text)); } - clear_check_notice(&app); } Ok(None) => { let _ = update_item.set_text(UPDATE_ITEM_NONE); @@ -655,7 +667,7 @@ fn save_server_url(app: AppHandle, url: String) -> Result<(), String> { store.save().map_err(|e| e.to_string())?; apply_server(&app, Some(&normalized)); - spawn_version_check(app.clone(), normalized.clone()); + spawn_version_check(app.clone(), normalized.clone(), false); if let Some(window) = app.get_webview_window("main") { let _ = window.navigate(with_desktop_marker(&parsed)); @@ -868,27 +880,24 @@ pub fn run() { } "update" => { // `take()` verhindert Doppelklick-Downloads, der - // gesperrte Eintrag ebenso. Ohne abgelegten Stand - // ("Kein Update verfügbar" / "Update-Prüfung - // fehlgeschlagen") prueft der Klick erneut -- der - // Browser-Weg (`open_download_page`) ist nur noch - // Rueckfall einer fehlgeschlagenen Installation. + // gesperrte Eintrag ebenso. Liegt ein Update vor, + // wird es NICHT aus dem Speicher installiert, sondern + // frisch geprueft und das Ergebnis installiert + // (`install_after`, siehe spawn_version_check). Ohne + // abgelegten Stand ("Kein Update verfügbar" / + // "Update-Prüfung fehlgeschlagen") prueft der Klick + // nur erneut. Der Browser-Weg (`open_download_page`) + // bleibt Rueckfall einer fehlgeschlagenen Installation. // Ohne gespeicherte Adresse gibt es nichts zu pruefen. - let pending = app + let had_pending = app .state::() .0 .lock() .ok() - .and_then(|mut guard| guard.take()); - match pending { - Some((update, menu_text)) => { - spawn_update_install(app.clone(), update, menu_text) - } - None => { - if let Some(url) = stored_server_url(app) { - spawn_version_check(app.clone(), url); - } - } + .and_then(|mut guard| guard.take()) + .is_some(); + if let Some(url) = stored_server_url(app) { + spawn_version_check(app.clone(), url, had_pending); } } "autostart" => { @@ -928,7 +937,7 @@ pub fn run() { apply_server(app.handle(), server_url.as_deref()); if let Some(url) = server_url { - spawn_version_check(app.handle().clone(), url); + spawn_version_check(app.handle().clone(), url, false); } // Wiederholte Pruefung alle UPDATE_CHECK_INTERVAL. Bewusst ein @@ -955,7 +964,7 @@ pub fn run() { continue; } if let Some(url) = stored_server_url(&handle) { - spawn_version_check(handle.clone(), url); + spawn_version_check(handle.clone(), url, false); } });