fix csv serialization bug where some empty fields would not be included

related to #911
This commit is contained in:
David Sparer
2018-03-10 17:47:33 -06:00
parent 5076f1354c
commit 227f3b2924

View File

@@ -16,7 +16,6 @@ namespace mRemoteNG.Config.Serializers.Csv
private readonly SaveFilter _saveFilter;
private readonly ICredentialRepositoryList _credentialRepositoryList;
public CsvConnectionsSerializerMremotengFormat(SaveFilter saveFilter, ICredentialRepositoryList credentialRepositoryList)
{
saveFilter.ThrowIfNull(nameof(saveFilter));
@@ -79,142 +78,134 @@ namespace mRemoteNG.Config.Serializers.Csv
private void SerializeConnectionInfo(ConnectionInfo con, StringBuilder sb)
{
sb.AppendLine();
sb.Append(string.Join(";",
CleanStringForCsv(con.Name),
CleanStringForCsv(con.ConstantID),
CleanStringForCsv(con.Parent?.ConstantID ?? ""),
CleanStringForCsv(con.GetTreeNodeType()),
CleanStringForCsv(con.Description),
CleanStringForCsv(con.Icon),
CleanStringForCsv(con.Panel)))
.Append(";");
sb.Append(FormatForCsv(con.Name))
.Append(FormatForCsv(con.ConstantID))
.Append(FormatForCsv(con.Parent?.ConstantID ?? ""))
.Append(FormatForCsv(con.GetTreeNodeType()))
.Append(FormatForCsv(con.Description))
.Append(FormatForCsv(con.Icon))
.Append(FormatForCsv(con.Panel));
if (_saveFilter.SaveUsername)
sb.Append($"{CleanStringForCsv(con.Username)};");
sb.Append(FormatForCsv(con.Username));
if (_saveFilter.SavePassword)
sb.Append($"{CleanStringForCsv(con.Password)};");
sb.Append(FormatForCsv(con.Password));
if (_saveFilter.SaveDomain)
sb.Append($"{CleanStringForCsv(con.Domain)};");
sb.Append(FormatForCsv(con.Domain));
sb.Append(string.Join(";",
CleanStringForCsv(con.Hostname),
CleanStringForCsv(con.Protocol),
CleanStringForCsv(con.PuttySession),
CleanStringForCsv(con.Port),
CleanStringForCsv(con.UseConsoleSession),
CleanStringForCsv(con.UseCredSsp),
CleanStringForCsv(con.RenderingEngine),
CleanStringForCsv(con.ICAEncryptionStrength),
CleanStringForCsv(con.RDPAuthenticationLevel),
CleanStringForCsv(con.LoadBalanceInfo),
CleanStringForCsv(con.Colors),
CleanStringForCsv(con.Resolution),
CleanStringForCsv(con.AutomaticResize),
CleanStringForCsv(con.DisplayWallpaper),
CleanStringForCsv(con.DisplayThemes),
CleanStringForCsv(con.EnableFontSmoothing),
CleanStringForCsv(con.EnableDesktopComposition),
CleanStringForCsv(con.CacheBitmaps),
CleanStringForCsv(con.RedirectDiskDrives),
CleanStringForCsv(con.RedirectPorts),
CleanStringForCsv(con.RedirectPrinters),
CleanStringForCsv(con.RedirectSmartCards),
CleanStringForCsv(con.RedirectSound),
CleanStringForCsv(con.RedirectKeys),
CleanStringForCsv(con.PreExtApp),
CleanStringForCsv(con.PostExtApp),
CleanStringForCsv(con.MacAddress),
CleanStringForCsv(con.UserField),
CleanStringForCsv(con.ExtApp),
CleanStringForCsv(con.VNCCompression),
CleanStringForCsv(con.VNCEncoding),
CleanStringForCsv(con.VNCAuthMode),
CleanStringForCsv(con.VNCProxyType),
CleanStringForCsv(con.VNCProxyIP),
CleanStringForCsv(con.VNCProxyPort),
CleanStringForCsv(con.VNCProxyUsername),
CleanStringForCsv(con.VNCProxyPassword),
CleanStringForCsv(con.VNCColors),
CleanStringForCsv(con.VNCSmartSizeMode),
CleanStringForCsv(con.VNCViewOnly),
CleanStringForCsv(con.RDGatewayUsageMethod),
CleanStringForCsv(con.RDGatewayHostname),
CleanStringForCsv(con.RDGatewayUseConnectionCredentials),
CleanStringForCsv(con.RDGatewayUsername),
CleanStringForCsv(con.RDGatewayPassword),
CleanStringForCsv(con.RDGatewayDomain)))
.Append(";");
sb.Append(FormatForCsv(con.Hostname))
.Append(FormatForCsv(con.Protocol))
.Append(FormatForCsv(con.PuttySession))
.Append(FormatForCsv(con.Port))
.Append(FormatForCsv(con.UseConsoleSession))
.Append(FormatForCsv(con.UseCredSsp))
.Append(FormatForCsv(con.RenderingEngine))
.Append(FormatForCsv(con.ICAEncryptionStrength))
.Append(FormatForCsv(con.RDPAuthenticationLevel))
.Append(FormatForCsv(con.LoadBalanceInfo))
.Append(FormatForCsv(con.Colors))
.Append(FormatForCsv(con.Resolution))
.Append(FormatForCsv(con.AutomaticResize))
.Append(FormatForCsv(con.DisplayWallpaper))
.Append(FormatForCsv(con.DisplayThemes))
.Append(FormatForCsv(con.EnableFontSmoothing))
.Append(FormatForCsv(con.EnableDesktopComposition))
.Append(FormatForCsv(con.CacheBitmaps))
.Append(FormatForCsv(con.RedirectDiskDrives))
.Append(FormatForCsv(con.RedirectPorts))
.Append(FormatForCsv(con.RedirectPrinters))
.Append(FormatForCsv(con.RedirectSmartCards))
.Append(FormatForCsv(con.RedirectSound))
.Append(FormatForCsv(con.RedirectKeys))
.Append(FormatForCsv(con.PreExtApp))
.Append(FormatForCsv(con.PostExtApp))
.Append(FormatForCsv(con.MacAddress))
.Append(FormatForCsv(con.UserField))
.Append(FormatForCsv(con.ExtApp))
.Append(FormatForCsv(con.VNCCompression))
.Append(FormatForCsv(con.VNCEncoding))
.Append(FormatForCsv(con.VNCAuthMode))
.Append(FormatForCsv(con.VNCProxyType))
.Append(FormatForCsv(con.VNCProxyIP))
.Append(FormatForCsv(con.VNCProxyPort))
.Append(FormatForCsv(con.VNCProxyUsername))
.Append(FormatForCsv(con.VNCProxyPassword))
.Append(FormatForCsv(con.VNCColors))
.Append(FormatForCsv(con.VNCSmartSizeMode))
.Append(FormatForCsv(con.VNCViewOnly))
.Append(FormatForCsv(con.RDGatewayUsageMethod))
.Append(FormatForCsv(con.RDGatewayHostname))
.Append(FormatForCsv(con.RDGatewayUseConnectionCredentials))
.Append(FormatForCsv(con.RDGatewayUsername))
.Append(FormatForCsv(con.RDGatewayPassword))
.Append(FormatForCsv(con.RDGatewayDomain));
if (!_saveFilter.SaveInheritance)
return;
sb.Append(string.Join(";",
con.Inheritance.CacheBitmaps,
con.Inheritance.Colors,
con.Inheritance.Description,
con.Inheritance.DisplayThemes,
con.Inheritance.DisplayWallpaper,
con.Inheritance.EnableFontSmoothing,
con.Inheritance.EnableDesktopComposition,
con.Inheritance.Domain,
con.Inheritance.Icon,
con.Inheritance.Panel,
con.Inheritance.Password,
con.Inheritance.Port,
con.Inheritance.Protocol,
con.Inheritance.PuttySession,
con.Inheritance.RedirectDiskDrives,
con.Inheritance.RedirectKeys,
con.Inheritance.RedirectPorts,
con.Inheritance.RedirectPrinters,
con.Inheritance.RedirectSmartCards,
con.Inheritance.RedirectSound,
con.Inheritance.Resolution,
con.Inheritance.AutomaticResize,
con.Inheritance.UseConsoleSession,
con.Inheritance.UseCredSsp,
con.Inheritance.RenderingEngine,
con.Inheritance.Username,
con.Inheritance.ICAEncryptionStrength,
con.Inheritance.RDPAuthenticationLevel,
con.Inheritance.LoadBalanceInfo,
con.Inheritance.PreExtApp,
con.Inheritance.PostExtApp,
con.Inheritance.MacAddress,
con.Inheritance.UserField,
con.Inheritance.ExtApp,
con.Inheritance.VNCCompression,
con.Inheritance.VNCEncoding,
con.Inheritance.VNCAuthMode,
con.Inheritance.VNCProxyType,
con.Inheritance.VNCProxyIP,
con.Inheritance.VNCProxyPort,
con.Inheritance.VNCProxyUsername,
con.Inheritance.VNCProxyPassword,
con.Inheritance.VNCColors,
con.Inheritance.VNCSmartSizeMode,
con.Inheritance.VNCViewOnly,
con.Inheritance.RDGatewayUsageMethod,
con.Inheritance.RDGatewayHostname,
con.Inheritance.RDGatewayUseConnectionCredentials,
con.Inheritance.RDGatewayUsername,
con.Inheritance.RDGatewayPassword,
con.Inheritance.RDGatewayDomain,
con.Inheritance.RDPAlertIdleTimeout,
con.Inheritance.RDPMinutesToIdleTimeout,
con.Inheritance.SoundQuality));
sb.Append(FormatForCsv(con.Inheritance.CacheBitmaps))
.Append(FormatForCsv(con.Inheritance.Colors))
.Append(FormatForCsv(con.Inheritance.Description))
.Append(FormatForCsv(con.Inheritance.DisplayThemes))
.Append(FormatForCsv(con.Inheritance.DisplayWallpaper))
.Append(FormatForCsv(con.Inheritance.EnableFontSmoothing))
.Append(FormatForCsv(con.Inheritance.EnableDesktopComposition))
.Append(FormatForCsv(con.Inheritance.Domain))
.Append(FormatForCsv(con.Inheritance.Icon))
.Append(FormatForCsv(con.Inheritance.Panel))
.Append(FormatForCsv(con.Inheritance.Password))
.Append(FormatForCsv(con.Inheritance.Port))
.Append(FormatForCsv(con.Inheritance.Protocol))
.Append(FormatForCsv(con.Inheritance.PuttySession))
.Append(FormatForCsv(con.Inheritance.RedirectDiskDrives))
.Append(FormatForCsv(con.Inheritance.RedirectKeys))
.Append(FormatForCsv(con.Inheritance.RedirectPorts))
.Append(FormatForCsv(con.Inheritance.RedirectPrinters))
.Append(FormatForCsv(con.Inheritance.RedirectSmartCards))
.Append(FormatForCsv(con.Inheritance.RedirectSound))
.Append(FormatForCsv(con.Inheritance.Resolution))
.Append(FormatForCsv(con.Inheritance.AutomaticResize))
.Append(FormatForCsv(con.Inheritance.UseConsoleSession))
.Append(FormatForCsv(con.Inheritance.UseCredSsp))
.Append(FormatForCsv(con.Inheritance.RenderingEngine))
.Append(FormatForCsv(con.Inheritance.Username))
.Append(FormatForCsv(con.Inheritance.ICAEncryptionStrength))
.Append(FormatForCsv(con.Inheritance.RDPAuthenticationLevel))
.Append(FormatForCsv(con.Inheritance.LoadBalanceInfo))
.Append(FormatForCsv(con.Inheritance.PreExtApp))
.Append(FormatForCsv(con.Inheritance.PostExtApp))
.Append(FormatForCsv(con.Inheritance.MacAddress))
.Append(FormatForCsv(con.Inheritance.UserField))
.Append(FormatForCsv(con.Inheritance.ExtApp))
.Append(FormatForCsv(con.Inheritance.VNCCompression))
.Append(FormatForCsv(con.Inheritance.VNCEncoding))
.Append(FormatForCsv(con.Inheritance.VNCAuthMode))
.Append(FormatForCsv(con.Inheritance.VNCProxyType))
.Append(FormatForCsv(con.Inheritance.VNCProxyIP))
.Append(FormatForCsv(con.Inheritance.VNCProxyPort))
.Append(FormatForCsv(con.Inheritance.VNCProxyUsername))
.Append(FormatForCsv(con.Inheritance.VNCProxyPassword))
.Append(FormatForCsv(con.Inheritance.VNCColors))
.Append(FormatForCsv(con.Inheritance.VNCSmartSizeMode))
.Append(FormatForCsv(con.Inheritance.VNCViewOnly))
.Append(FormatForCsv(con.Inheritance.RDGatewayUsageMethod))
.Append(FormatForCsv(con.Inheritance.RDGatewayHostname))
.Append(FormatForCsv(con.Inheritance.RDGatewayUseConnectionCredentials))
.Append(FormatForCsv(con.Inheritance.RDGatewayUsername))
.Append(FormatForCsv(con.Inheritance.RDGatewayPassword))
.Append(FormatForCsv(con.Inheritance.RDGatewayDomain))
.Append(FormatForCsv(con.Inheritance.RDPAlertIdleTimeout))
.Append(FormatForCsv(con.Inheritance.RDPMinutesToIdleTimeout))
.Append(FormatForCsv(con.Inheritance.SoundQuality));
}
/// <summary>
/// Remove text that is unsafe for use in CSV files
/// </summary>
/// <param name="text"></param>
private string CleanStringForCsv(object text)
private string FormatForCsv(object value)
{
return text.ToString().Replace(";", "");
var cleanedString = value.ToString().Replace(";", "");
return cleanedString + ";";
}
}
}