Files
Mimante/Mimante/Documentation/FIX_COOKIE_PERSISTENCE.md
T
Alby96 62d5cebf9c Refactoring gestione sessione e persistenza impostazioni
Introdotto `SessionService` per centralizzare la gestione della
sessione utente, migliorando la separazione delle responsabilità
e la testabilità. Risolto il problema del caricamento del cookie
di autenticazione all'avvio e garantita la persistenza delle
checkbox di esportazione (`IncludeMetadata`, `RemoveAfterExport`,
`OverwriteExisting`).

Ottimizzata la gestione della barra degli indirizzi del browser
con aggiornamenti locali immediati. Applicato il pattern "Load ?
Modify ? Save" per il salvataggio delle impostazioni, migliorando
la simmetria e la leggibilità del codice. Logging centralizzato
e semplificato per eventi rilevanti.

Aggiornata la documentazione per riflettere i cambiamenti e
verificati i test per garantire il corretto funzionamento.
2025-11-24 12:00:13 +01:00

11 KiB

?? Fix: Cookie Non Salvato nelle Impostazioni

?? Problema Rilevato

Il cookie di autenticazione non persisteva tra le sessioni dell'applicazione. Ogni volta che si chiudeva e riapriva l'applicazione, il cookie doveva essere reinserito manualmente, nonostante fosse stato salvato correttamente.

Sintomi

  • ? Cookie salvato correttamente (log: [OK] Cookie valido per utente: Username)
  • ? Sessione funzionante durante l'esecuzione
  • ? Cookie NON visualizzato nella TextBox quando si riapre l'applicazione
  • ? Cookie NON visualizzato quando si apre il tab Impostazioni
  • ? Cookie NON visualizzato dopo aver cliccato "Annulla"

Altre Impostazioni Funzionanti

  • ? Anticipo puntata
  • ? Prezzo min/max
  • ? Max clicks
  • ? Stati iniziali aste
  • ? Limiti log
  • ? Impostazioni export

?? Causa del Problema

Il cookie viene salvato e caricato da due sistemi separati:

  1. SessionManager (file: session.dat crittografato)

    • Salva la sessione completa incluso il cookie
    • File location: %AppData%\AutoBidder\session.dat
    • Crittografia DPAPI di Windows
  2. SettingsManager (file: settings.json)

    • Salva le altre impostazioni (defaults, export, ecc.)
    • File location: %LocalAppData%\AutoBidder\settings.json
    • Formato JSON in chiaro

Il Problema Specifico

// ? PROBLEMA 1: Cookie NON caricato all'avvio
private void LoadDefaultSettings()
{
    var settings = SettingsManager.Load();
    // Carica tutte le impostazioni TRANNE il cookie
    DefaultBidBeforeDeadlineMs.Text = settings.DefaultBidBeforeDeadlineMs.ToString();
    // ...
    // ? MANCAVA: Caricamento del cookie da SessionManager
}

// ? PROBLEMA 2: Cookie NON caricato quando si apre tab Impostazioni
private void TabImpostazioni_Checked(object sender, RoutedEventArgs e)
{
    ShowPanel(Settings);
    // ? MANCAVA: Caricamento del cookie
}

// ? PROBLEMA 3: "Annulla" svuotava il cookie invece di ripristinarlo
private void CancelCookieButton_Click(object sender, RoutedEventArgs e)
{
    SettingsCookieTextBox.Text = string.Empty; // ? SBAGLIATO
}

? Soluzione Implementata

File: Core\EventHandlers\MainWindow.EventHandlers.Settings.cs

private void LoadDefaultSettings()
{
    try
    {
        var settings = SettingsManager.Load();
        
        // Carica tutte le altre impostazioni...
        DefaultBidBeforeDeadlineMs.Text = settings.DefaultBidBeforeDeadlineMs.ToString();
        // ...
        
        // ? NUOVO: Carica il cookie salvato nella TextBox
        var session = Services.SessionManager.LoadSession();
        if (session != null && !string.IsNullOrEmpty(session.CookieString))
        {
            SettingsCookieTextBox.Text = session.CookieString;
        }
    }
    catch (Exception ex)
    {
        Log($"[ERRORE] Caricamento impostazioni: {ex.Message}", LogLevel.Error);
    }
}

Quando viene chiamato: All'avvio dell'applicazione (nel costruttore MainWindow())

File: Core\MainWindow.ControlEvents.cs

private void TabImpostazioni_Checked(object sender, RoutedEventArgs e)
{
    ShowPanel(Settings);
    
    // ? NUOVO: Carica il cookie salvato quando si apre il tab Impostazioni
    try
    {
        var session = Services.SessionManager.LoadSession();
        if (session != null && !string.IsNullOrEmpty(session.CookieString))
        {
            SettingsCookieTextBox.Text = session.CookieString;
        }
    }
    catch { }
}

Quando viene chiamato: Ogni volta che l'utente clicca sul tab "Impostazioni"

File: Core\EventHandlers\MainWindow.EventHandlers.Settings.cs

// ? PRIMA (SBAGLIATO)
private void CancelCookieButton_Click(object sender, RoutedEventArgs e)
{
    SettingsCookieTextBox.Text = string.Empty; // Svuota il cookie
}

// ? DOPO (CORRETTO)
private void CancelCookieButton_Click(object sender, RoutedEventArgs e)
{
    // Ricarica il cookie salvato invece di svuotarlo
    var session = Services.SessionManager.LoadSession();
    if (session != null && !string.IsNullOrEmpty(session.CookieString))
    {
        SettingsCookieTextBox.Text = session.CookieString;
    }
    else
    {
        SettingsCookieTextBox.Text = string.Empty;
    }
}

Quando viene chiamato: Quando l'utente clicca "Annulla" nella sezione cookie


?? Flusso Completo

Avvio Applicazione

1. MainWindow()
   ?
2. LoadDefaultSettings()
   ?
3. SettingsManager.Load() ? Carica settings.json
4. SessionManager.LoadSession() ? Carica session.dat
   ?
5. SettingsCookieTextBox.Text = session.CookieString
   ?
? Cookie visualizzato all'avvio

Apertura Tab Impostazioni

1. Utente clicca tab "Impostazioni"
   ?
2. TabImpostazioni_Checked()
   ?
3. SessionManager.LoadSession() ? Carica session.dat
   ?
4. SettingsCookieTextBox.Text = session.CookieString
   ?
? Cookie sempre visualizzato
1. Utente inserisce cookie
2. Clicca "Salva"
   ?
3. SaveCookieButton_Click()
   ?
4. _auctionMonitor.InitializeSessionWithCookie(cookie)
5. UpdateUserInfoAsync() ? Valida cookie
   ?
6. SessionManager.SaveSession(session) ? Salva su session.dat
   ?
? Cookie salvato e persistente

Annulla Modifiche

1. Utente modifica cookie (ma non salva)
2. Clicca "Annulla"
   ?
3. CancelCookieButton_Click()
   ?
4. SessionManager.LoadSession() ? Ricarica session.dat
   ?
5. SettingsCookieTextBox.Text = session.CookieString
   ?
? Cookie ripristinato al valore salvato

?? Confronto Prima/Dopo

Scenario Prima ? Dopo ?
Avvio app Cookie vuoto Cookie caricato da session.dat
Apertura tab Impostazioni Cookie vuoto Cookie caricato da session.dat
Salvataggio Cookie salvato Cookie salvato (invariato)
Annulla Cookie svuotato Cookie ripristinato da session.dat
Chiusura app Cookie perso Cookie mantenuto in session.dat
Riapertura app Devi reinserire Cookie già presente

?? Test di Verifica

  1. ? Apri applicazione
  2. ? Vai su Impostazioni
  3. ? Inserisci cookie valido
  4. ? Clicca Salva
  5. ? Verifica: Log [OK] Cookie valido per utente: Username
  6. ? Chiudi applicazione
  7. ? Riapri applicazione
  8. ? Vai su Impostazioni
  9. ? Verifica: Cookie è presente nella TextBox

Test 2: Apertura Tab

  1. ? Hai già salvato un cookie
  2. ? Apri applicazione
  3. ? Vai su tab Aste Attive (non Impostazioni)
  4. ? Vai su tab Impostazioni
  5. ? Verifica: Cookie è visualizzato

Test 3: Annulla Modifiche

  1. ? Vai su Impostazioni (cookie presente)
  2. ? Modifica il cookie (aggiungi caratteri a caso)
  3. ? Clicca Annulla
  4. ? Verifica: Cookie torna al valore salvato (non vuoto)

Test 4: Workflow Completo

  1. ? Prima apertura ? Cookie vuoto
  2. ? Inserisci cookie ? Clicca Salva
  3. ? Chiudi e riapri ? Cookie presente
  4. ? Modifica cookie ? Clicca Annulla ? Cookie ripristinato
  5. ? Chiudi e riapri ? Cookie ancora presente
  6. ? Cambia tab ? Torna su Impostazioni ? Cookie ancora presente

??? File Modificati

1. Core\EventHandlers\MainWindow.EventHandlers.Settings.cs

Modifiche:

  • ? LoadDefaultSettings(): Aggiunto caricamento cookie da SessionManager
  • ? CancelCookieButton_Click(): Cambiato da svuotamento a ripristino

Righe modificate: ~15 righe

2. Core\MainWindow.ControlEvents.cs

Modifiche:

  • ? TabImpostazioni_Checked(): Aggiunto caricamento cookie all'apertura tab

Righe modificate: ~10 righe


?? Lezioni Apprese

1. Sistemi di Persistenza Separati

Quando si hanno due sistemi di storage separati (come SessionManager e SettingsManager), bisogna:

  • ? Documentare chiaramente cosa salva dove
  • ? Assicurarsi che il caricamento acceda al sistema corretto
  • ? Non confondere i due sistemi

2. UI Sync con Storage

L'UI deve essere sincronizzata con lo storage in tre momenti:

  1. Avvio applicazione (constructor o initialization)
  2. Apertura pannello (tab change, window load)
  3. Annulla modifiche (ripristino da storage)

3. Pattern Corretto

// ? PATTERN CORRETTO per caricare dati in UI
private void LoadUIFromStorage()
{
    try
    {
        // 1. Carica da storage appropriato
        var data = StorageSystem.Load();
        
        // 2. Verifica che i dati esistano
        if (data != null && !string.IsNullOrEmpty(data.Value))
        {
            // 3. Popola UI
            UIControl.Text = data.Value;
        }
        else
        {
            // 4. Fallback se dati non esistono
            UIControl.Text = string.Empty;
        }
    }
    catch (Exception ex)
    {
        // 5. Log errori
        Log($"[ERRORE] Caricamento: {ex.Message}", LogLevel.Error);
    }
}

4. "Annulla" = "Ripristina", NON "Svuota"

// ? SBAGLIATO: Annulla = Svuota
private void Cancel_Click()
{
    TextBox.Text = string.Empty;
}

// ? CORRETTO: Annulla = Ripristina da storage
private void Cancel_Click()
{
    var saved = Storage.Load();
    TextBox.Text = saved?.Value ?? string.Empty;
}

?? Struttura Storage

%AppData%\AutoBidder\
??? session.dat           ? SessionManager (crittografato DPAPI)
?   ??? Cookie, Username, RemainingBids
?
%LocalAppData%\AutoBidder\
??? settings.json         ? SettingsManager (JSON)
?   ??? DefaultBidBeforeDeadlineMs
?   ??? DefaultMinPrice
?   ??? DefaultMaxPrice
?   ??? ExportPath
?   ??? ...tutte le altre impostazioni
?
??? auctions.json         ? PersistenceManager (JSON)
    ??? Lista aste salvate

?? Note Importanti

  • ? Il cookie è crittografato con DPAPI (Windows Data Protection API)
  • ? Solo l'utente corrente può decrittare session.dat
  • ? Il cookie NON è salvato in settings.json (che è in chiaro)

Compatibilità

  • ? Se session.dat non esiste, il cookie sarà vuoto (primo avvio)
  • ? Se il file è corrotto, viene ignorato e l'utente deve reinserire il cookie
  • ? Nessun crash se i file non esistono

Performance

  • ? SessionManager.LoadSession() è veloce (legge file piccolo)
  • ? Viene chiamato solo quando necessario (avvio, apertura tab, annulla)
  • ? Non impatta le performance generali

Data Fix: 2025
Versione: 5.2+
Issue: Cookie non persisteva tra sessioni
Causa: Cookie mai caricato nella TextBox UI
Soluzione: Caricamento esplicito da SessionManager.LoadSession()
Status: ? RISOLTO

?? Riferimenti

  • Vedi anche: Services\SessionManager.cs per dettagli storage sessione
  • Vedi anche: Utilities\SettingsManager.cs per altre impostazioni
  • Vedi anche: Documentation\FIX_SETTINGS_SAVE_AND_LOGGING.md per logging