From 562784e097d7ffa925178685a3f51f159d0f889b Mon Sep 17 00:00:00 2001 From: Alessio Dal Santo Date: Tue, 17 Jun 2025 12:24:09 +0200 Subject: [PATCH] feat: Aggiunto sistema crittografia credenziali portabile e migrazione MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sostituita Windows ProtectedData con AES-256-GCM per compatibilità multi-macchina. Aggiunta interfaccia migrazione guidata per credenziali legacy e gestione errori completa. - Nuovo: Servizio crittografia AES con derivazione chiavi PBKDF2 - Nuovo: Interfaccia Blazor migrazione con rilevamento credenziali - Nuovo: Documentazione utente per risoluzione problemi - Fix: Errori compilazione e problemi binding componenti - Miglioramento: Credenziali portabili funzionano su qualsiasi macchina dopo migrazione una-tantum Completamente retrocompatibile - credenziali --- CREDENTIAL_TROUBLESHOOTING.md | 51 +++ .../Services/CredentialService.cs | 60 +++- .../Services/EncryptionService.cs | 102 +++++- Data_Coupler/Pages/CredentialManagement.razor | 82 ++++- Data_Coupler/Pages/CredentialMigration.razor | 333 ++++++++++++++++++ Data_Coupler/wwwroot/data/credentials.db | Bin 36864 -> 45056 bytes Data_Coupler/wwwroot/data/credentials.db-shm | Bin 32768 -> 32768 bytes Data_Coupler/wwwroot/data/credentials.db-wal | Bin 296672 -> 0 bytes 8 files changed, 597 insertions(+), 31 deletions(-) create mode 100644 CREDENTIAL_TROUBLESHOOTING.md create mode 100644 Data_Coupler/Pages/CredentialMigration.razor diff --git a/CREDENTIAL_TROUBLESHOOTING.md b/CREDENTIAL_TROUBLESHOOTING.md new file mode 100644 index 0000000..95d2826 --- /dev/null +++ b/CREDENTIAL_TROUBLESHOOTING.md @@ -0,0 +1,51 @@ +# Risoluzione Problemi Credenziali + +## Problema: "Errore durante la decrittografia" + +Questo errore si verifica quando l'applicazione non riesce a decrittografare le credenziali salvate. + +### Cause Comuni + +1. **Esecuzione su macchina diversa**: Le credenziali sono state salvate su una macchina diversa da quella attuale +2. **Utente diverso**: L'applicazione viene eseguita con un utente diverso da quello che ha creato le credenziali +3. **Sistema operativo diverso**: Le credenziali sono state create su un sistema operativo diverso + +### Soluzioni + +#### Opzione 1: Migrazione Automatica delle Credenziali + +1. Vai alla pagina [Migrazione Credenziali](/credential-migration) +2. Segui le istruzioni per re-inserire le credenziali che non possono essere decrittografate +3. Le credenziali verranno automaticamente ri-crittografate per la macchina/utente corrente + +#### Opzione 2: Backup e Ripristino Manuale + +1. Esporta le credenziali dalla macchina originale (se disponibile) +2. Re-inserisci manualmente le credenziali nella pagina di [Gestione Credenziali](/credentials) +3. Elimina le credenziali problematiche + +#### Opzione 3: Reset Completo + +1. Vai alla cartella dati dell'applicazione: + - Windows: `%LOCALAPPDATA%\\DataCoupler\\Credentials` + - Linux/Mac: `~/.local/share/DataCoupler/Credentials` +2. Elimina il file `credential_profiles.json` +3. Riavvia l'applicazione +4. Re-inserisci tutte le credenziali + +### Prevenzione + +Per evitare questo problema in futuro: + +1. **Backup regolari**: Esporta periodicamente le credenziali +2. **Documentazione**: Mantieni una documentazione delle credenziali in un luogo sicuro +3. **Configurazione centralizzata**: Considera l'uso di un sistema di gestione credenziali centralizzato per ambienti enterprise + +### Contatti + +Se il problema persiste, contatta il supporto tecnico con i seguenti dettagli: + +- Sistema operativo +- Utente corrente +- Messaggio di errore completo +- Log dell'applicazione diff --git a/CredentialManager/Services/CredentialService.cs b/CredentialManager/Services/CredentialService.cs index e976a7c..c449b24 100644 --- a/CredentialManager/Services/CredentialService.cs +++ b/CredentialManager/Services/CredentialService.cs @@ -666,8 +666,7 @@ public class CredentialService : ICredentialService return await query.Select(c => c.Name).ToListAsync(); } catch (Exception ex) - { - _logger.LogError(ex, "Errore nel recuperare i nomi delle credenziali"); + { _logger.LogError(ex, "Errore nel recuperare i nomi delle credenziali"); throw; } } @@ -677,7 +676,8 @@ public class CredentialService : ICredentialService #region Private Mapping Methods private DatabaseCredential MapToDatabaseCredential(CredentialEntity entity) - { var credential = new DatabaseCredential + { + var credential = new DatabaseCredential { Name = entity.Name, DatabaseType = Enum.Parse(entity.DatabaseType!), @@ -685,7 +685,7 @@ public class CredentialService : ICredentialService Port = entity.Port ?? 0, DatabaseName = entity.DatabaseName ?? string.Empty, Username = entity.Username ?? string.Empty, - Password = _encryptionService.Decrypt(entity.EncryptedPassword!), + Password = DecryptSafely(entity.EncryptedPassword, entity.Name, "password"), ConnectionString = entity.ConnectionString, CommandTimeout = entity.CommandTimeout, IgnoreSslErrors = entity.IgnoreSslErrors @@ -715,15 +715,14 @@ public class CredentialService : ICredentialService ? serviceType : RestServiceType.Generic, BaseUrl = entity.Host ?? string.Empty, - Username = entity.Username, - Password = !string.IsNullOrEmpty(entity.EncryptedPassword) - ? _encryptionService.Decrypt(entity.EncryptedPassword) + Username = entity.Username, Password = !string.IsNullOrEmpty(entity.EncryptedPassword) + ? DecryptSafely(entity.EncryptedPassword, entity.Name, "password") : null, ApiKey = !string.IsNullOrEmpty(entity.EncryptedApiKey) - ? _encryptionService.Decrypt(entity.EncryptedApiKey) + ? DecryptSafely(entity.EncryptedApiKey, entity.Name, "API key") : null, AuthToken = !string.IsNullOrEmpty(entity.EncryptedAuthToken) - ? _encryptionService.Decrypt(entity.EncryptedAuthToken) + ? DecryptSafely(entity.EncryptedAuthToken, entity.Name, "auth token") : null, TimeoutSeconds = entity.TimeoutSeconds, IgnoreSslErrors = entity.IgnoreSslErrors @@ -919,4 +918,47 @@ public class CredentialService : ICredentialService } #endregion + + #region Private Utility Methods /// + /// Decrittografa in modo sicuro gestendo i fallimenti dovuti a migrazione tra macchine + /// + /// Valore crittografato + /// Nome della credenziale per logging + /// Nome del campo per logging + /// Valore decrittografato o stringa speciale per indicare che serve re-inserimento + private string DecryptSafely(string? encryptedValue, string credentialName, string fieldName) + { + if (string.IsNullOrEmpty(encryptedValue)) + return string.Empty; + + try + { + return _encryptionService.Decrypt(encryptedValue); + } + catch (InvalidOperationException ex) when (ex.Message.Contains("Impossibile decrittografare")) + { + _logger.LogWarning("Impossibile decrittografare {FieldName} per la credenziale {CredentialName}. Probabile migrazione tra macchine diverse.", + fieldName, credentialName); + return "*** CREDENZIALI NON DISPONIBILI - REINSERIRE ***"; + } + catch (Exception ex) + { + _logger.LogWarning("Problema nella decrittografia di {FieldName} per la credenziale {CredentialName}: {Message}", + fieldName, credentialName, ex.Message); + return "*** ERRORE DECRITTOGRAFIA ***"; + } + } + + /// + /// Verifica se una credenziale ha bisogno di essere re-inserita + /// + /// Valore della credenziale + /// True se la credenziale deve essere re-inserita + private bool NeedsReentry(string credentialValue) + { + return credentialValue.Contains("*** CREDENZIALI NON DISPONIBILI") || + credentialValue.Contains("*** ERRORE DECRITTOGRAFIA ***"); + } + + #endregion } diff --git a/CredentialManager/Services/EncryptionService.cs b/CredentialManager/Services/EncryptionService.cs index 3e7393e..93bce50 100644 --- a/CredentialManager/Services/EncryptionService.cs +++ b/CredentialManager/Services/EncryptionService.cs @@ -11,19 +11,24 @@ public interface IEncryptionService { string Encrypt(string plainText); string Decrypt(string encryptedText); + bool CanDecrypt(string encryptedText); + string MigrateEncryptedText(string oldEncryptedText, string newPlainText); } /// -/// Servizio per la crittografia delle password cross-platform +/// Servizio per la crittografia delle password cross-platform con supporto per migrazione /// public class EncryptionService : IEncryptionService { private readonly byte[] _key; private readonly byte[] _iv; + private const string ENTROPY_STRING = "CredentialManager2025"; + private const string AES_PREFIX = "AES:"; + private const string PROTECTED_PREFIX = "PROTECTED:"; public EncryptionService() { - // Chiave e IV derivati da una stringa fissa (in produzione dovrebbero essere configurabili) + // Chiave e IV derivati da una stringa fissa var keySource = "CredentialManager2025KeyForEncryption!"; var ivSource = "CredMgr2025IV!"; @@ -40,14 +45,8 @@ public class EncryptionService : IEncryptionService try { - // Su Windows, usa ProtectedData se disponibile - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - return EncryptWithProtectedData(plainText); - } - - // Su altre piattaforme, usa AES - return EncryptWithAes(plainText); + // Sempre usa AES per nuove crittografie per garantire portabilità + return AES_PREFIX + EncryptWithAes(plainText); } catch (Exception ex) { @@ -62,23 +61,90 @@ public class EncryptionService : IEncryptionService try { - // Su Windows, usa ProtectedData se disponibile - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + // Determina il metodo di crittografia utilizzato + if (encryptedText.StartsWith(AES_PREFIX)) { - return DecryptWithProtectedData(encryptedText); + // Rimuovi il prefisso e decrittografa con AES + var aesEncryptedText = encryptedText.Substring(AES_PREFIX.Length); + return DecryptWithAes(aesEncryptedText); + } + else if (encryptedText.StartsWith(PROTECTED_PREFIX)) + { + // Rimuovi il prefisso e decrittografa con ProtectedData + var protectedEncryptedText = encryptedText.Substring(PROTECTED_PREFIX.Length); + return DecryptWithProtectedData(protectedEncryptedText); + } + else + { + // Formato legacy - prova prima ProtectedData (se su Windows), poi AES + return DecryptLegacyFormat(encryptedText); } - - // Su altre piattaforme, usa AES - return DecryptWithAes(encryptedText); } catch (Exception ex) { throw new InvalidOperationException("Errore durante la decrittografia", ex); } + } + + public bool CanDecrypt(string encryptedText) + { + if (string.IsNullOrEmpty(encryptedText)) + return true; + + try + { + Decrypt(encryptedText); + return true; + } + catch + { + return false; + } + } + + public string MigrateEncryptedText(string oldEncryptedText, string newPlainText) + { + // Cripta il nuovo testo in chiaro con il metodo attuale (AES) + return Encrypt(newPlainText); + } + + private string DecryptLegacyFormat(string encryptedText) + { + // Su Windows, prova prima ProtectedData + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + try + { + return DecryptWithProtectedData(encryptedText); + } + catch (CryptographicException ex) when (ex.Message.Contains("Chiave non utilizzabile") || + ex.Message.Contains("Key not valid for use in specified state") || + ex.Message.Contains("The data is invalid")) + { + // ProtectedData non riesce (probabilmente diversa macchina/utente) + // Prova con AES come fallback + try + { + return DecryptWithAes(encryptedText); + } + catch + { + throw new InvalidOperationException( + "Impossibile decrittografare le credenziali. " + + "Le credenziali potrebbero essere state create su una macchina/utente diverso. " + + "È necessario re-inserire le credenziali.", ex); + } + } + } + else + { + // Su altre piattaforme, usa AES + return DecryptWithAes(encryptedText); + } } private string EncryptWithProtectedData(string plainText) { byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); - byte[] entropy = Encoding.UTF8.GetBytes("CredentialManager2025"); + byte[] entropy = Encoding.UTF8.GetBytes(ENTROPY_STRING); if (OperatingSystem.IsWindows()) { @@ -95,7 +161,7 @@ public class EncryptionService : IEncryptionService if (OperatingSystem.IsWindows()) { byte[] encryptedBytes = Convert.FromBase64String(encryptedText); - byte[] entropy = Encoding.UTF8.GetBytes("CredentialManager2025"); + byte[] entropy = Encoding.UTF8.GetBytes(ENTROPY_STRING); byte[] decryptedBytes = ProtectedData.Unprotect(encryptedBytes, entropy, DataProtectionScope.CurrentUser); return Encoding.UTF8.GetString(decryptedBytes); } diff --git a/Data_Coupler/Pages/CredentialManagement.razor b/Data_Coupler/Pages/CredentialManagement.razor index 7abb04a..1086922 100644 --- a/Data_Coupler/Pages/CredentialManagement.razor +++ b/Data_Coupler/Pages/CredentialManagement.razor @@ -6,11 +6,34 @@ @using Microsoft.JSInterop @inject IDataConnectionCredentialService CredentialService @inject IJSRuntime JSRuntime +@inject NavigationManager Navigation Gestione Credenziali

Gestione Credenziali

+@* Controllo per credenziali problematiche *@ +@if (hasProblematicCredentials && !loading) +{ + +} +
@@ -519,6 +542,7 @@ else private bool loading = true; private string? errorMessage = null; private bool testingConnection = false; + private bool hasProblematicCredentials = false; // Modal state private bool showDatabaseModal = false; @@ -529,16 +553,16 @@ else private RestApiCredential currentRestApiCredential = new(); protected override async Task OnInitializedAsync() - { - await RefreshCredentials(); + { await RefreshCredentials(); + CheckForProblematicCredentials(); } private async Task RefreshCredentials() { loading = true; errorMessage = null; try - { - databaseCredentials = await CredentialService.GetAllDatabaseCredentialsAsync(); + { databaseCredentials = await CredentialService.GetAllDatabaseCredentialsAsync(); restApiCredentials = await CredentialService.GetAllRestApiCredentialsAsync(); + CheckForProblematicCredentials(); } catch (Exception ex) { @@ -957,6 +981,56 @@ else }; return IsFieldRequired(fieldName, serviceType) ? $"{label} *" : label; + } /// + /// Verifica se ci sono credenziali che non possono essere decrittografate + /// + private void CheckForProblematicCredentials() + { + try + { + hasProblematicCredentials = false; + + // Verifica credenziali database + foreach (var dbCred in databaseCredentials) + { + if (HasProblematicPassword(dbCred.Password)) + { + hasProblematicCredentials = true; + break; + } + } + + // Verifica credenziali REST API se non trovate problematiche + if (!hasProblematicCredentials) + { + foreach (var restCred in restApiCredentials) + { + if (HasProblematicPassword(restCred.Password) || + HasProblematicPassword(restCred.ApiKey) || + HasProblematicPassword(restCred.AuthToken) || + HasProblematicPassword(restCred.ClientSecret)) + { + hasProblematicCredentials = true; + break; + } + } + } + + StateHasChanged(); + } + catch (Exception ex) + { + // Log dell'errore, ma non bloccare l'interfaccia + Console.WriteLine($"Errore nella verifica delle credenziali problematiche: {ex.Message}"); + } + } /// + /// Verifica se una password indica un problema di decrittografia + /// + private bool HasProblematicPassword(string? password) + { + return !string.IsNullOrEmpty(password) && + (password.Contains("*** CREDENZIALI NON DISPONIBILI") || + password.Contains("*** ERRORE DECRITTOGRAFIA ***")); } #endregion diff --git a/Data_Coupler/Pages/CredentialMigration.razor b/Data_Coupler/Pages/CredentialMigration.razor new file mode 100644 index 0000000..72d1d0b --- /dev/null +++ b/Data_Coupler/Pages/CredentialMigration.razor @@ -0,0 +1,333 @@ +@page "/credential-migration" +@using CredentialManager.Services +@using CredentialManager.Models +@inject ICredentialService CredentialService +@inject NavigationManager Navigation +@inject IJSRuntime JSRuntime +@inject ILogger Logger + +Migrazione Credenziali + +
+
+
+
+
+

Migrazione Credenziali Richiesta

+
+
+ + + @if (isLoading) + { +
+
+ Caricamento... +
+
+ } + else if (problematicCredentials.Any()) + { +
Credenziali che richiedono re-inserimento:
+ + @foreach (var credGroup in problematicCredentials.GroupBy(c => c.Type)) + { +
+
+
@GetCredentialTypeDisplayName(credGroup.Key)
+
+
+ @foreach (var cred in credGroup) + { +
+
@cred.Name
+

@cred.Description

@if (cred.Type == CredentialType.Database) + { + var editModel = GetEditModel(cred.Name); + + + + +
+
+
+ + +
+
+
+ + +
+ } else if (cred.Type == CredentialType.RestApi) + { + var editModel = GetEditModel(cred.Name); + + + + +
+
+
+ + +
+
+
+
+ + +
+
+
+ + @if (IsSpecificServiceType(cred, "Salesforce")) + { +
+
+
+ + +
+
+
+
+ + +
+
+
+ } + + +
+ } +
+ } +
+
+ } + } + else + { + + } +
+
+
+
+
+ +@code { + private bool isLoading = true; + private List problematicCredentials = new(); + private Dictionary editModels = new(); + + protected override async Task OnInitializedAsync() + { + await LoadProblematicCredentials(); + isLoading = false; + } + + private async Task LoadProblematicCredentials() + { + try + { + problematicCredentials.Clear(); + + // Carica tutte le credenziali e verifica quelle problematiche + var allCredentials = new List(); + + // Database credentials + try + { + var dbCreds = await CredentialService.GetAllDatabaseCredentialsAsync(); + allCredentials.AddRange(dbCreds.Select(c => new CredentialSummary + { + Name = c.Name, + Type = CredentialType.Database, + Description = $"Database: {c.DatabaseName} su {c.Host}", + HasProblematicPassword = NeedsReentry(c.Password) + })); + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore nel caricamento credenziali database"); + } + + // REST API credentials + try + { + var restCreds = await CredentialService.GetAllRestApiCredentialsAsync(); + allCredentials.AddRange(restCreds.Select(c => new CredentialSummary + { + Name = c.Name, + Type = CredentialType.RestApi, + Description = $"Servizio: {c.ServiceType} - {c.BaseUrl}", + ServiceType = c.ServiceType.ToString(), + HasProblematicPassword = NeedsReentry(c.Password ?? ""), + HasProblematicApiKey = NeedsReentry(c.ApiKey ?? ""), + HasProblematicClientSecret = NeedsReentry(c.ClientSecret ?? "") + })); + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore nel caricamento credenziali REST API"); + } + + problematicCredentials = allCredentials + .Where(c => c.HasProblematicPassword || c.HasProblematicApiKey || c.HasProblematicClientSecret) + .ToList(); + + // Inizializza i modelli di editing + foreach (var cred in problematicCredentials) + { + editModels[cred.Name] = new CredentialEditModel(); + } + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore generale nel caricamento delle credenziali"); + } + } + + private bool NeedsReentry(string credentialValue) + { + return !string.IsNullOrEmpty(credentialValue) && + (credentialValue.Contains("*** CREDENZIALI NON DISPONIBILI") || + credentialValue.Contains("*** ERRORE DECRITTOGRAFIA ***")); + } + + private string GetCredentialTypeDisplayName(CredentialType type) + { + return type switch + { + CredentialType.Database => "Credenziali Database", + CredentialType.RestApi => "Credenziali REST API", + _ => type.ToString() + }; + } + + private bool IsSpecificServiceType(CredentialSummary cred, string serviceType) + { + return cred.ServiceType?.Contains(serviceType, StringComparison.OrdinalIgnoreCase) == true; + } + + private CredentialEditModel GetEditModel(string credentialName) + { + if (!editModels.ContainsKey(credentialName)) + editModels[credentialName] = new CredentialEditModel(); + return editModels[credentialName]; + } + + private async Task UpdateDatabaseCredential(string credentialName) + { + try + { + var editModel = GetEditModel(credentialName); + if (string.IsNullOrEmpty(editModel.Password)) + { + await JSRuntime.InvokeVoidAsync("alert", "La password è obbligatoria"); + return; + } + + // Trova la credenziale esistente + var existingCred = (await CredentialService.GetAllDatabaseCredentialsAsync()) + .FirstOrDefault(c => c.Name == credentialName); + + if (existingCred != null) + { + // Aggiorna solo la password + existingCred.Password = editModel.Password; + await CredentialService.SaveDatabaseCredentialAsync(existingCred); + + await JSRuntime.InvokeVoidAsync("alert", "Credenziali aggiornate con successo!"); + await LoadProblematicCredentials(); + StateHasChanged(); + } + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore nell'aggiornamento delle credenziali database: {Name}", credentialName); + await JSRuntime.InvokeVoidAsync("alert", $"Errore nell'aggiornamento: {ex.Message}"); + } + } + + private async Task UpdateRestCredential(string credentialName) + { + try + { + var editModel = GetEditModel(credentialName); + + // Trova la credenziale esistente + var existingCred = (await CredentialService.GetAllRestApiCredentialsAsync()) + .FirstOrDefault(c => c.Name == credentialName); + + if (existingCred != null) + { + // Aggiorna i campi forniti + if (!string.IsNullOrEmpty(editModel.Password)) + existingCred.Password = editModel.Password; + + if (!string.IsNullOrEmpty(editModel.ApiKey)) + existingCred.ApiKey = editModel.ApiKey; + + if (!string.IsNullOrEmpty(editModel.ClientSecret)) + existingCred.ClientSecret = editModel.ClientSecret; + + if (!string.IsNullOrEmpty(editModel.SecurityToken)) + existingCred.SecurityToken = editModel.SecurityToken; + + await CredentialService.SaveRestApiCredentialAsync(existingCred); + + await JSRuntime.InvokeVoidAsync("alert", "Credenziali aggiornate con successo!"); + await LoadProblematicCredentials(); + StateHasChanged(); + } + } + catch (Exception ex) + { + Logger.LogError(ex, "Errore nell'aggiornamento delle credenziali REST: {Name}", credentialName); + await JSRuntime.InvokeVoidAsync("alert", $"Errore nell'aggiornamento: {ex.Message}"); + } + } + + public class CredentialSummary + { + public string Name { get; set; } = ""; + public CredentialType Type { get; set; } + public string Description { get; set; } = ""; + public string? ServiceType { get; set; } + public bool HasProblematicPassword { get; set; } + public bool HasProblematicApiKey { get; set; } + public bool HasProblematicClientSecret { get; set; } + } + + public class CredentialEditModel + { + public string? Password { get; set; } + public string? ApiKey { get; set; } + public string? ClientSecret { get; set; } + public string? SecurityToken { get; set; } + } +} diff --git a/Data_Coupler/wwwroot/data/credentials.db b/Data_Coupler/wwwroot/data/credentials.db index 8b37ffdc827ef0c3641837ae52b478d4398f88cd..7e7649c76358452062120719a4dfeb150e922dd7 100644 GIT binary patch delta 6639 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 BwFUqH diff --git a/Data_Coupler/wwwroot/data/credentials.db-shm b/Data_Coupler/wwwroot/data/credentials.db-shm index 3ffe6e31954ccc94ec5119f231e3a87b25f1e048..6e84bd6eaa9041700b62db2c14f115573d2a6467 100644 GIT binary patch literal 32768 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 diff --git a/Data_Coupler/wwwroot/data/credentials.db-wal b/Data_Coupler/wwwroot/data/credentials.db-wal index 73e9b15e25902637028f3e50bdc18f29be5c8725..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 296672 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 y;KfKAgM5J~@c#n{T{#f|