mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-25 19:38:37 +08:00
108 lines
3.8 KiB
C#
108 lines
3.8 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using mRemoteNG.Config.Connections;
|
|
using mRemoteNG.Config.DataProviders;
|
|
using mRemoteNG.Config.Serializers;
|
|
using mRemoteNG.Config.Serializers.Csv;
|
|
using mRemoteNG.Config.Serializers.Xml;
|
|
using mRemoteNG.Connection;
|
|
using mRemoteNG.Container;
|
|
using mRemoteNG.Security;
|
|
using mRemoteNG.Security.Factories;
|
|
using mRemoteNG.Tree;
|
|
using mRemoteNG.Tree.Root;
|
|
using mRemoteNG.UI.Forms;
|
|
|
|
|
|
namespace mRemoteNG.App
|
|
{
|
|
public static class Export
|
|
{
|
|
public static void ExportToFile(ConnectionInfo selectedNode, ConnectionTreeModel connectionTreeModel)
|
|
{
|
|
try
|
|
{
|
|
var saveFilter = new SaveFilter();
|
|
|
|
using (var exportForm = new ExportForm())
|
|
{
|
|
if (selectedNode?.GetTreeNodeType() == TreeNodeType.Container)
|
|
exportForm.SelectedFolder = selectedNode as ContainerInfo;
|
|
else if (selectedNode?.GetTreeNodeType() == TreeNodeType.Connection)
|
|
{
|
|
if (selectedNode.Parent.GetTreeNodeType() == TreeNodeType.Container)
|
|
exportForm.SelectedFolder = selectedNode.Parent;
|
|
exportForm.SelectedConnection = selectedNode;
|
|
}
|
|
|
|
if (exportForm.ShowDialog(FrmMain.Default) != DialogResult.OK)
|
|
return;
|
|
|
|
ConnectionInfo exportTarget;
|
|
switch (exportForm.Scope)
|
|
{
|
|
case ExportForm.ExportScope.SelectedFolder:
|
|
exportTarget = exportForm.SelectedFolder;
|
|
break;
|
|
case ExportForm.ExportScope.SelectedConnection:
|
|
exportTarget = exportForm.SelectedConnection;
|
|
break;
|
|
default:
|
|
exportTarget = connectionTreeModel.RootNodes.First(node => node is RootNodeInfo);
|
|
break;
|
|
}
|
|
|
|
saveFilter.SaveUsername = exportForm.IncludeUsername;
|
|
saveFilter.SavePassword = exportForm.IncludePassword;
|
|
saveFilter.SaveDomain = exportForm.IncludeDomain;
|
|
saveFilter.SaveInheritance = exportForm.IncludeInheritance;
|
|
saveFilter.SaveCredentialId = exportForm.IncludeAssignedCredential;
|
|
|
|
SaveExportFile(exportForm.FileName, exportForm.SaveFormat, saveFilter, exportTarget);
|
|
}
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Runtime.MessageCollector.AddExceptionMessage("App.Export.ExportToFile() failed.", ex);
|
|
}
|
|
}
|
|
|
|
private static void SaveExportFile(string fileName, SaveFormat saveFormat, SaveFilter saveFilter, ConnectionInfo exportTarget)
|
|
{
|
|
try
|
|
{
|
|
ISerializer<ConnectionInfo, string> serializer;
|
|
switch (saveFormat)
|
|
{
|
|
case SaveFormat.mRXML:
|
|
var cryptographyProvider = new CryptoProviderFactoryFromSettings().Build();
|
|
var rootNode = exportTarget.GetRootParent() as RootNodeInfo;
|
|
var connectionNodeSerializer = new XmlConnectionNodeSerializer26(
|
|
cryptographyProvider,
|
|
rootNode?.PasswordString.ConvertToSecureString() ?? new RootNodeInfo(RootNodeType.Connection).PasswordString.ConvertToSecureString(),
|
|
saveFilter);
|
|
serializer = new XmlConnectionsSerializer(cryptographyProvider, connectionNodeSerializer);
|
|
break;
|
|
case SaveFormat.mRCSV:
|
|
serializer = new CsvConnectionsSerializerMremotengFormat(saveFilter, Runtime.CredentialProviderCatalog);
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException(nameof(saveFormat), saveFormat, null);
|
|
}
|
|
var serializedData = serializer.Serialize(exportTarget);
|
|
var fileDataProvider = new FileDataProvider(fileName);
|
|
fileDataProvider.Save(serializedData);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Runtime.MessageCollector.AddExceptionStackTrace($"Export.SaveExportFile(\"{fileName}\") failed.", ex);
|
|
}
|
|
finally
|
|
{
|
|
Runtime.ConnectionsService.RemoteConnectionsSyncronizer?.Enable();
|
|
}
|
|
}
|
|
}
|
|
} |