Files
Mimante/Mimante/Services/SessionManager.cs
Alberto Balbo 4e16f50aeb Aggiunta infrastruttura avanzata per gestione aste
- Introdotta la classe `BidooApiClient` per interagire con le API Bidoo.
- Aggiunto `SessionManager` per la gestione sicura delle sessioni.
- Creato `TestBidooApi` per test manuali delle API.
- Implementato `CsvExporter` per esportare dati e statistiche in CSV.
- Aggiunto `PersistenceManager` per salvare e caricare aste in JSON.
- Introdotto `AuctionViewModel` per supportare il pattern MVVM.
- Migliorata l'interfaccia utente con layout moderno e stili dinamici.
- Aggiornata la documentazione in `README.md` per riflettere le nuove funzionalità.
- Aggiunte classi per rappresentare informazioni, stato e storico delle aste.
- Ottimizzate le richieste HTTP per simulare un browser reale.
2025-10-23 23:10:46 +02:00

144 lines
4.9 KiB
C#

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using AutoBidder.Models;
namespace AutoBidder.Services
{
/// <summary>
/// Gestore persistenza sessione Bidoo
/// Salva in modo sicuro il cookie di autenticazione per riutilizzo
/// </summary>
public class SessionManager
{
private static readonly string SessionFilePath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"AutoBidder",
"session.dat"
);
private static readonly byte[] Entropy = Encoding.UTF8.GetBytes("AutoBidder_V1_2025");
/// <summary>
/// Salva la sessione in modo sicuro (crittografata con DPAPI)
/// </summary>
public static bool SaveSession(BidooSession session)
{
try
{
// Crea directory se non esiste
var directory = Path.GetDirectoryName(SessionFilePath);
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
// Serializza sessione in JSON
var json = JsonSerializer.Serialize(session, new JsonSerializerOptions
{
WriteIndented = true
});
// Cripta usando DPAPI (Windows Data Protection API)
var plainBytes = Encoding.UTF8.GetBytes(json);
var encryptedBytes = ProtectedData.Protect(plainBytes, Entropy, DataProtectionScope.CurrentUser);
// Salva su file
File.WriteAllBytes(SessionFilePath, encryptedBytes);
Console.WriteLine($"[SESSION] Saved to: {SessionFilePath}");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[SESSION ERROR] Failed to save: {ex.Message}");
return false;
}
}
/// <summary>
/// Carica la sessione salvata (decripta con DPAPI)
/// </summary>
public static BidooSession? LoadSession()
{
try
{
if (!File.Exists(SessionFilePath))
{
Console.WriteLine($"[SESSION] No saved session found");
return null;
}
// Leggi file crittografato
var encryptedBytes = File.ReadAllBytes(SessionFilePath);
// Decripta usando DPAPI
var plainBytes = ProtectedData.Unprotect(encryptedBytes, Entropy, DataProtectionScope.CurrentUser);
var json = Encoding.UTF8.GetString(plainBytes);
// Deserializza JSON
var session = JsonSerializer.Deserialize<BidooSession>(json);
if (session != null && session.IsValid)
{
Console.WriteLine($"[SESSION] Loaded from: {SessionFilePath}");
Console.WriteLine($"[SESSION] Username: {session.Username}");
return session;
}
Console.WriteLine($"[SESSION] Loaded session is invalid");
return null;
}
catch (Exception ex)
{
Console.WriteLine($"[SESSION ERROR] Failed to load: {ex.Message}");
return null;
}
}
/// <summary>
/// Elimina la sessione salvata
/// </summary>
public static bool ClearSession()
{
try
{
if (File.Exists(SessionFilePath))
{
File.Delete(SessionFilePath);
Console.WriteLine($"[SESSION] Cleared: {SessionFilePath}");
}
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[SESSION ERROR] Failed to clear: {ex.Message}");
return false;
}
}
/// <summary>
/// Verifica se esiste una sessione salvata
/// </summary>
public static bool HasSavedSession()
{
return File.Exists(SessionFilePath);
}
/// <summary>
/// Ottiene informazioni sulla sessione salvata senza caricarla
/// </summary>
public static (bool exists, DateTime? lastModified) GetSessionInfo()
{
if (File.Exists(SessionFilePath))
{
var fileInfo = new FileInfo(SessionFilePath);
return (true, fileInfo.LastWriteTime);
}
return (false, null);
}
}
}