- 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.
144 lines
4.9 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|