namespace CredentialManager.Models;
///
/// Tipi di credenziali supportate
///
public enum CredentialType
{
Database,
RestApi,
OAuth,
ApiKey,
BasicAuth
}
///
/// Tipi di servizi REST specifici
///
public enum RestServiceType
{
Generic,
SapB1ServiceLayer,
Salesforce
}
///
/// Tipi di database supportati (allineato con DataConnection.Enums.DatabaseType)
///
public enum DatabaseType
{
SqlServer,
MySql,
PostgreSql,
Oracle,
Sqlite,
DB2,
SapHana,
Odbc
}
///
/// Modalità di connessione ODBC
///
public enum OdbcConnectionMode
{
///
/// Utilizzo di un DSN (Data Source Name) configurato
///
Dsn,
///
/// Costruzione manuale della connection string
///
Custom
}
///
/// DTO per le credenziali database - completo per tutti i tipi di DB supportati
///
public class DatabaseCredential
{
public string Name { get; set; } = string.Empty;
public DatabaseType DatabaseType { get; set; }
public string Host { get; set; } = string.Empty;
public int Port { get; set; }
public string? DatabaseName { get; set; } = string.Empty; // Ora opzionale
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public string? ConnectionString { get; set; }
public int CommandTimeout { get; set; } = 30;
public bool IgnoreSslErrors { get; set; } = false;
public Dictionary? AdditionalParameters { get; set; }
// ODBC specific properties
public string? OdbcDsnName { get; set; } // Nome del DSN ODBC (se utilizzato)
public OdbcConnectionMode OdbcMode { get; set; } = OdbcConnectionMode.Dsn; // Modalità ODBC (DSN o Custom)
}
///
/// DTO per le credenziali REST API - allineato con RestServiceOptions e esteso per servizi specifici
///
public class RestApiCredential
{
public string Name { get; set; } = string.Empty;
public RestServiceType ServiceType { get; set; } = RestServiceType.Generic;
public string BaseUrl { get; set; } = string.Empty;
public string? ApiKey { get; set; }
public string? Username { get; set; }
public string? Password { get; set; }
public string? AuthToken { get; set; }
public string? BearerToken { get; set; }
public int TimeoutSeconds { get; set; } = 100;
public bool IgnoreSslErrors { get; set; } = false;
public Dictionary? Headers { get; set; }
public Dictionary? AdditionalParameters { get; set; }
// Campi specifici per SAP B1 Service Layer
public string? CompanyDatabase { get; set; }
public string? Language { get; set; } = "en-US";
public string? Version { get; set; } = "v1";
public bool UseTrustedConnection { get; set; } = false;
// Campi specifici per Salesforce
public string? SecurityToken { get; set; }
public string? ClientId { get; set; }
public string? ClientSecret { get; set; }
public string? ApiVersion { get; set; } = "59.0";
public bool IsSandbox { get; set; } = false;
public bool UseSoapApi { get; set; } = false;
public string? RefreshToken { get; set; }
public string? AccessToken { get; set; }
public DateTime? TokenExpiry { get; set; }
}
///
/// Credenziali specifiche per SAP Business One Service Layer
///
public class SapB1ServiceLayerCredential
{
public string Name { get; set; } = string.Empty;
public string ServerUrl { get; set; } = string.Empty; // es: https://server:50000/b1s/v1/
public string CompanyDatabase { get; set; } = string.Empty; // Database dell'azienda SAP
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public string? Language { get; set; } = "en-US"; // Lingua per la sessione
public int TimeoutSeconds { get; set; } = 300; // Timeout per le chiamate API
public bool IgnoreSslErrors { get; set; } = false;
public string? Version { get; set; } = "v1"; // Versione del Service Layer (v1, v2, etc.)
public bool UseTrustedConnection { get; set; } = false; // Per autenticazione Windows
public Dictionary? AdditionalHeaders { get; set; }
}
///
/// Credenziali specifiche per Salesforce
///
public class SalesforceCredential
{
public string Name { get; set; } = string.Empty;
public string LoginUrl { get; set; } = "https://login.salesforce.com"; // o https://test.salesforce.com per sandbox
public string Username { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public string SecurityToken { get; set; } = string.Empty; // Token di sicurezza Salesforce
public string? ClientId { get; set; } = string.Empty; // Consumer Key per Connected App
public string? ClientSecret { get; set; } = string.Empty; // Consumer Secret per Connected App
public string ApiVersion { get; set; } = "59.0"; // Versione API Salesforce
public bool IsSandbox { get; set; } = false; // Se è un ambiente sandbox
public int TimeoutSeconds { get; set; } = 120;
public bool UseSoapApi { get; set; } = false; // Se usare SOAP invece di REST
public string? RefreshToken { get; set; }
public string? AccessToken { get; set; }
public DateTime? TokenExpiry { get; set; }
}
///
/// Factory per creare connection string per i diversi tipi di database
///
public static class ConnectionStringBuilder
{
public static string BuildConnectionString(DatabaseCredential credential)
{
if (!string.IsNullOrEmpty(credential.ConnectionString))
return credential.ConnectionString;
return credential.DatabaseType switch
{
DatabaseType.SqlServer => BuildSqlServerConnectionString(credential),
DatabaseType.MySql => BuildMySqlConnectionString(credential),
DatabaseType.PostgreSql => BuildPostgreSqlConnectionString(credential),
DatabaseType.Oracle => BuildOracleConnectionString(credential),
DatabaseType.Sqlite => BuildSqliteConnectionString(credential),
DatabaseType.DB2 => BuildDb2ConnectionString(credential),
DatabaseType.SapHana => BuildSapHanaConnectionString(credential),
DatabaseType.Odbc => BuildOdbcConnectionString(credential),
_ => throw new NotSupportedException($"Database type {credential.DatabaseType} not supported")
};
} private static string BuildSqlServerConnectionString(DatabaseCredential credential)
{
var builder = new List
{
$"Server={credential.Host},{credential.Port}",
$"User Id={credential.Username}",
$"Password={credential.Password}",
$"Connection Timeout={credential.CommandTimeout}"
};
// Aggiungi Database solo se specificato
if (!string.IsNullOrEmpty(credential.DatabaseName))
builder.Add($"Database={credential.DatabaseName}");
if (credential.IgnoreSslErrors)
builder.Add("TrustServerCertificate=True");
AddAdditionalParameters(builder, credential.AdditionalParameters);
return string.Join(";", builder);
} private static string BuildMySqlConnectionString(DatabaseCredential credential)
{
var builder = new List
{
$"Server={credential.Host}",
$"Port={credential.Port}",
$"Uid={credential.Username}",
$"Pwd={credential.Password}",
$"Connection Timeout={credential.CommandTimeout}"
};
// Aggiungi Database solo se specificato
if (!string.IsNullOrEmpty(credential.DatabaseName))
builder.Add($"Database={credential.DatabaseName}");
if (credential.IgnoreSslErrors)
builder.Add("SslMode=None");
AddAdditionalParameters(builder, credential.AdditionalParameters);
return string.Join(";", builder);
} private static string BuildPostgreSqlConnectionString(DatabaseCredential credential)
{
var builder = new List
{
$"Host={credential.Host}",
$"Port={credential.Port}",
$"Username={credential.Username}",
$"Password={credential.Password}",
$"Timeout={credential.CommandTimeout}"
};
// Aggiungi Database solo se specificato
if (!string.IsNullOrEmpty(credential.DatabaseName))
builder.Add($"Database={credential.DatabaseName}");
if (credential.IgnoreSslErrors)
builder.Add("SSL Mode=Disable");
AddAdditionalParameters(builder, credential.AdditionalParameters);
return string.Join(";", builder);
} private static string BuildOracleConnectionString(DatabaseCredential credential)
{
var builder = new List();
// Per Oracle, il formato cambia se c'è o meno un database specificato
if (!string.IsNullOrEmpty(credential.DatabaseName))
{
builder.Add($"Data Source={credential.Host}:{credential.Port}/{credential.DatabaseName}");
}
else
{
builder.Add($"Data Source={credential.Host}:{credential.Port}");
}
builder.AddRange(new[]
{
$"User Id={credential.Username}",
$"Password={credential.Password}",
$"Connection Timeout={credential.CommandTimeout}"
});
AddAdditionalParameters(builder, credential.AdditionalParameters);
return string.Join(";", builder);
}
private static string BuildSqliteConnectionString(DatabaseCredential credential)
{
var builder = new List
{
$"Data Source={credential.DatabaseName}"
};
AddAdditionalParameters(builder, credential.AdditionalParameters);
return string.Join(";", builder);
}
private static string BuildDb2ConnectionString(DatabaseCredential credential)
{
var builder = new List
{
$"Server={credential.Host}:{credential.Port}",
$"Database={credential.DatabaseName}",
$"UID={credential.Username}",
$"PWD={credential.Password}",
$"Connection Timeout={credential.CommandTimeout}"
};
AddAdditionalParameters(builder, credential.AdditionalParameters);
return string.Join(";", builder);
}
private static string BuildSapHanaConnectionString(DatabaseCredential credential)
{
var builder = new List
{
$"Server={credential.Host}:{credential.Port}",
$"DatabaseName={credential.DatabaseName}",
$"UserID={credential.Username}",
$"Password={credential.Password}",
$"Connection Timeout={credential.CommandTimeout}"
};
AddAdditionalParameters(builder, credential.AdditionalParameters);
return string.Join(";", builder);
}
private static string BuildOdbcConnectionString(DatabaseCredential credential)
{
// Se è già presente una connection string personalizzata, utilizzala
if (!string.IsNullOrEmpty(credential.ConnectionString))
return credential.ConnectionString;
var builder = new List();
// Modalità DSN: usa il DSN configurato
if (credential.OdbcMode == OdbcConnectionMode.Dsn && !string.IsNullOrEmpty(credential.OdbcDsnName))
{
builder.Add($"DSN={credential.OdbcDsnName}");
// Aggiungi credenziali se fornite
if (!string.IsNullOrEmpty(credential.Username))
builder.Add($"UID={credential.Username}");
if (!string.IsNullOrEmpty(credential.Password))
builder.Add($"PWD={credential.Password}");
}
// Modalità Custom: costruisci manualmente la connection string
else
{
// Driver (se specificato nei parametri aggiuntivi)
if (credential.AdditionalParameters?.ContainsKey("Driver") == true)
{
builder.Add($"Driver={{{credential.AdditionalParameters["Driver"]}}}");
}
// Server/Host
if (!string.IsNullOrEmpty(credential.Host))
{
builder.Add($"Server={credential.Host}");
// Porta (se diversa da 0)
if (credential.Port > 0)
builder.Add($"Port={credential.Port}");
}
// Database
if (!string.IsNullOrEmpty(credential.DatabaseName))
builder.Add($"Database={credential.DatabaseName}");
// Credenziali
if (!string.IsNullOrEmpty(credential.Username))
builder.Add($"UID={credential.Username}");
if (!string.IsNullOrEmpty(credential.Password))
builder.Add($"PWD={credential.Password}");
}
// Timeout
if (credential.CommandTimeout > 0)
builder.Add($"Connection Timeout={credential.CommandTimeout}");
// Parametri aggiuntivi (escludendo Driver se già aggiunto)
if (credential.AdditionalParameters != null)
{
foreach (var param in credential.AdditionalParameters)
{
if (param.Key != "Driver") // Driver già gestito sopra
builder.Add($"{param.Key}={param.Value}");
}
}
return string.Join(";", builder);
}
private static void AddAdditionalParameters(List builder, Dictionary? additionalParams)
{
if (additionalParams != null)
{
foreach (var param in additionalParams)
{
builder.Add($"{param.Key}={param.Value}");
}
}
}
}