1 Commits

Author SHA1 Message Date
schalli 41d00a3623 fix(desktop): Update-Klick prueft frisch statt veralteten Stand zu installieren
Tessera CI/CD / Lint & Type Check (push) Successful in 53s
Tessera CI/CD / Tests (push) Successful in 1m17s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 6m6s
Tessera CI/CD / Build & Publish Images (push) Successful in 4m32s
Der Tray-Eintrag installierte das beim letzten Check abgelegte Update. Die
Download-Adresse liefert aber immer den aktuellen Installer; nach einem
Server-Update passte die alte Signatur nicht zur neuen Datei ("signature
verification failed", danach Browser-Rueckfall; Nutzer 29.09.). Jetzt
prueft der Klick erst frisch (install_after) und installiert das Ergebnis.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 12:31:49 +02:00
2 changed files with 34 additions and 21 deletions
+4
View File
@@ -4,6 +4,10 @@ Diese Liste beschreibt in einfachen Worten, was sich von Version zu Version an T
## Unveröffentlicht ## 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 ## 1.7.0 – 2026-09-29
### Neu ### Neu
+30 -21
View File
@@ -461,7 +461,15 @@ fn clear_check_notice(app: &AppHandle) {
/// / kein Update / fehlgeschlagen mit Grund); nur der http-Fall bleibt /// / kein Update / fehlgeschlagen mit Grund); nur der http-Fall bleibt
/// gesperrt. Ein fehlgeschlagener Check war bisher vom Zustand "kein Update" /// gesperrt. Ein fehlgeschlagener Check war bisher vom Zustand "kein Update"
/// nicht unterscheidbar (quick-260922-frg). /// 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/<os>` 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::<TrayItems>().update.clone(); let update_item = app.state::<TrayItems>().update.clone();
let _ = update_item.set_text(UPDATE_ITEM_CHECKING); let _ = update_item.set_text(UPDATE_ITEM_CHECKING);
let _ = update_item.set_enabled(false); 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 // das Plugin wendet `Update.timeout` als Gesamt-Timeout des
// Downloads an (updater.rs Z. 698-700). // Downloads an (updater.rs Z. 698-700).
update.timeout = Some(Duration::from_secs(600)); 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 let _ = app
.notification() .notification()
.builder() .builder()
@@ -500,7 +513,6 @@ fn spawn_version_check(app: AppHandle, server_url: String) {
if let Ok(mut pending) = app.state::<PendingUpdate>().0.lock() { if let Ok(mut pending) = app.state::<PendingUpdate>().0.lock() {
*pending = Some((update, menu_text)); *pending = Some((update, menu_text));
} }
clear_check_notice(&app);
} }
Ok(None) => { Ok(None) => {
let _ = update_item.set_text(UPDATE_ITEM_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())?; store.save().map_err(|e| e.to_string())?;
apply_server(&app, Some(&normalized)); 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") { if let Some(window) = app.get_webview_window("main") {
let _ = window.navigate(with_desktop_marker(&parsed)); let _ = window.navigate(with_desktop_marker(&parsed));
@@ -868,27 +880,24 @@ pub fn run() {
} }
"update" => { "update" => {
// `take()` verhindert Doppelklick-Downloads, der // `take()` verhindert Doppelklick-Downloads, der
// gesperrte Eintrag ebenso. Ohne abgelegten Stand // gesperrte Eintrag ebenso. Liegt ein Update vor,
// ("Kein Update verfügbar" / "Update-Prüfung // wird es NICHT aus dem Speicher installiert, sondern
// fehlgeschlagen") prueft der Klick erneut -- der // frisch geprueft und das Ergebnis installiert
// Browser-Weg (`open_download_page`) ist nur noch // (`install_after`, siehe spawn_version_check). Ohne
// Rueckfall einer fehlgeschlagenen Installation. // 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. // Ohne gespeicherte Adresse gibt es nichts zu pruefen.
let pending = app let had_pending = app
.state::<PendingUpdate>() .state::<PendingUpdate>()
.0 .0
.lock() .lock()
.ok() .ok()
.and_then(|mut guard| guard.take()); .and_then(|mut guard| guard.take())
match pending { .is_some();
Some((update, menu_text)) => { if let Some(url) = stored_server_url(app) {
spawn_update_install(app.clone(), update, menu_text) spawn_version_check(app.clone(), url, had_pending);
}
None => {
if let Some(url) = stored_server_url(app) {
spawn_version_check(app.clone(), url);
}
}
} }
} }
"autostart" => { "autostart" => {
@@ -928,7 +937,7 @@ pub fn run() {
apply_server(app.handle(), server_url.as_deref()); apply_server(app.handle(), server_url.as_deref());
if let Some(url) = server_url { 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 // Wiederholte Pruefung alle UPDATE_CHECK_INTERVAL. Bewusst ein
@@ -955,7 +964,7 @@ pub fn run() {
continue; continue;
} }
if let Some(url) = stored_server_url(&handle) { if let Some(url) = stored_server_url(&handle) {
spawn_version_check(handle.clone(), url); spawn_version_check(handle.clone(), url, false);
} }
}); });