From 2ddd10a1afb759b236931f92126adf0b1d7731bd Mon Sep 17 00:00:00 2001 From: "kenneth.skovhede@gmail.com" Date: Tue, 10 Feb 2009 23:29:01 +0000 Subject: [PATCH] Added a standalone decryption app, in case something breaks later on. Updated the wizard to allow GPGEncryption. Settings now reflect the actual paths required. Completely reworked the way differential updates are read and written, which gives a much cleaner code, a heavy performance boost and a highly reduced number of temporary files. Removed duplicated code for streamwrapping. Updated SharpZipLib to the latest release. Removed unused compression code. git-svn-id: https://duplicati.googlecode.com/svn/trunk@84 59da171f-624f-0410-aa54-27559c288bec --- Duplicati Console.sln | 96 ----- Duplicati.sln | 16 + .../CommandLine/Checkout DSMCBE Data.bat | 10 + .../Duplicati.CommandLine.Decrypter.csproj | 53 +++ Duplicati/CommandLine/Decrypter/Program.cs | 22 ++ .../Decrypter/Properties/AssemblyInfo.cs | 33 ++ .../Run Unittest on DSMCBE data.bat | 2 +- Duplicati/CommandLine/UnitTest.cs | 33 +- Duplicati/GUI/ApplicationSetup.Designer.cs | 323 ++++++---------- Duplicati/GUI/ApplicationSetup.cs | 91 ++--- Duplicati/GUI/ApplicationSetup.resx | 16 +- Duplicati/GUI/Database schema/Schema.sql | 3 +- .../GUI/Datamodel/ApplicationSettings.cs | 80 ++-- Duplicati/GUI/Datamodel/Backends/SSH.cs | 3 + Duplicati/GUI/Datamodel/Duplicati.sqlite | Bin 13312 -> 13312 bytes .../GUI/Datamodel/LightDataModel.Mapping.xml | 11 + Duplicati/GUI/Datamodel/Task.Extension.cs | 5 + Duplicati/GUI/Datamodel/Task.cs | 8 + .../Add backup/PasswordSettings.Designer.cs | 14 + .../Add backup/PasswordSettings.cs | 35 +- .../Wizard pages/Backends/SSH/SSHOptions.cs | 48 +++ .../GUI/Wizard pages/WizardSettingsWrapper.cs | 14 +- Duplicati/Library/Compression/Compression.cs | 117 +----- .../Duplicati.Library.Compression.csproj | 3 +- .../Library/Compression/FileArchiveZip.cs | 366 ++++++++++++++++++ .../Core/Duplicati.Library.Core.csproj | 3 + .../Library/Core/FileArchiveDirectory.cs | 120 ++++++ Duplicati/Library/Core/IFileArchive.cs | 113 ++++++ Duplicati/Library/Core/OverrideableStream.cs | 90 +++++ Duplicati/Library/Core/ThrottledStream.cs | 57 +-- .../Library/Encryption/CryptoStreamWrapper.cs | 68 +--- .../Encryption/EncryptedBackendWrapper.cs | 4 + .../Library/Encryption/GPGStreamWrapper.cs | 63 +-- Duplicati/Library/Main/Interface.cs | 273 +++++-------- Duplicati/Library/Main/RSyncDir.cs | 326 ++++++++-------- .../SharpZipLib/ICSharpCode.SharpZipLib.dll | Bin 188416 -> 192512 bytes 36 files changed, 1477 insertions(+), 1042 deletions(-) delete mode 100644 Duplicati Console.sln create mode 100644 Duplicati/CommandLine/Decrypter/Duplicati.CommandLine.Decrypter.csproj create mode 100644 Duplicati/CommandLine/Decrypter/Program.cs create mode 100644 Duplicati/CommandLine/Decrypter/Properties/AssemblyInfo.cs create mode 100644 Duplicati/Library/Compression/FileArchiveZip.cs create mode 100644 Duplicati/Library/Core/FileArchiveDirectory.cs create mode 100644 Duplicati/Library/Core/IFileArchive.cs create mode 100644 Duplicati/Library/Core/OverrideableStream.cs diff --git a/Duplicati Console.sln b/Duplicati Console.sln deleted file mode 100644 index ad3489288..000000000 --- a/Duplicati Console.sln +++ /dev/null @@ -1,96 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Main", "Duplicati\Library\Main\Duplicati.Library.Main.csproj", "{10D2D1B7-C664-41D8-9B3A-00040C3D421B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Duplicati\CommandLine\Duplicati.CommandLine.csproj", "{81765A64-3661-4E3E-B850-2F6F87A51F74}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.BackendInterface", "Duplicati\Library\Backend\BackendInterface\Duplicati.Library.Backend.BackendInterface.csproj", "{994F3D0A-E91E-4EEE-80EE-064485E09909}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.BackendLoader", "Duplicati\Library\Backend\BackendLoader\Duplicati.Library.Backend.BackendLoader.csproj", "{0CA86ECF-5BEC-4909-B4F6-110A03B30B92}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.File", "Duplicati\Library\Backend\File\Duplicati.Library.Backend.File.csproj", "{FC9B7611-836F-4127-8B44-A7C31F506807}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Core", "Duplicati\Library\Core\Duplicati.Library.Core.csproj", "{DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Compression", "Duplicati\Library\Compression\Duplicati.Library.Compression.csproj", "{19ECCE09-B5EB-406C-8C57-BAC66997D469}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.SharpRSync", "Duplicati\Library\SharpRSync\Duplicati.Library.SharpRSync.csproj", "{47FE73E1-0832-44F7-96B9-2580273206C3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Logging", "Duplicati\Library\Logging\Duplicati.Library.Logging.csproj", "{D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Encryption", "Duplicati\Library\Encryption\Duplicati.Library.Encryption.csproj", "{94484FDB-2EFA-4CF0-9BE6-A561157B4F87}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.FTP", "Duplicati\Library\Backend\FTP\Duplicati.Library.Backend.FTP.csproj", "{F61679A9-E5DE-468A-B5A4-05F92D0143D2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.SSH", "Duplicati\Library\Backend\SSH\Duplicati.Library.Backend.SSH.csproj", "{6BA21DCB-1701-4936-B177-3B6D4DE3474E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.S3", "Duplicati\Library\Backend\S3\Duplicati.Library.Backend.S3.csproj", "{C03F6DFD-805A-4BE0-9338-64870ADDB4A2}" -EndProject -Global - GlobalSection(SubversionScc) = preSolution - Svn-Managed = True - Manager = AnkhSVN - Subversion Support for Visual Studio - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {10D2D1B7-C664-41D8-9B3A-00040C3D421B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {10D2D1B7-C664-41D8-9B3A-00040C3D421B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {10D2D1B7-C664-41D8-9B3A-00040C3D421B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {10D2D1B7-C664-41D8-9B3A-00040C3D421B}.Release|Any CPU.Build.0 = Release|Any CPU - {81765A64-3661-4E3E-B850-2F6F87A51F74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {81765A64-3661-4E3E-B850-2F6F87A51F74}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81765A64-3661-4E3E-B850-2F6F87A51F74}.Release|Any CPU.ActiveCfg = Release|Any CPU - {81765A64-3661-4E3E-B850-2F6F87A51F74}.Release|Any CPU.Build.0 = Release|Any CPU - {994F3D0A-E91E-4EEE-80EE-064485E09909}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {994F3D0A-E91E-4EEE-80EE-064485E09909}.Debug|Any CPU.Build.0 = Debug|Any CPU - {994F3D0A-E91E-4EEE-80EE-064485E09909}.Release|Any CPU.ActiveCfg = Release|Any CPU - {994F3D0A-E91E-4EEE-80EE-064485E09909}.Release|Any CPU.Build.0 = Release|Any CPU - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92}.Release|Any CPU.Build.0 = Release|Any CPU - {FC9B7611-836F-4127-8B44-A7C31F506807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC9B7611-836F-4127-8B44-A7C31F506807}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC9B7611-836F-4127-8B44-A7C31F506807}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC9B7611-836F-4127-8B44-A7C31F506807}.Release|Any CPU.Build.0 = Release|Any CPU - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}.Release|Any CPU.Build.0 = Release|Any CPU - {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Debug|Any CPU.Build.0 = Debug|Any CPU - {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Release|Any CPU.ActiveCfg = Release|Any CPU - {19ECCE09-B5EB-406C-8C57-BAC66997D469}.Release|Any CPU.Build.0 = Release|Any CPU - {47FE73E1-0832-44F7-96B9-2580273206C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {47FE73E1-0832-44F7-96B9-2580273206C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {47FE73E1-0832-44F7-96B9-2580273206C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {47FE73E1-0832-44F7-96B9-2580273206C3}.Release|Any CPU.Build.0 = Release|Any CPU - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}.Release|Any CPU.Build.0 = Release|Any CPU - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87}.Debug|Any CPU.Build.0 = Debug|Any CPU - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87}.Release|Any CPU.ActiveCfg = Release|Any CPU - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87}.Release|Any CPU.Build.0 = Release|Any CPU - {F61679A9-E5DE-468A-B5A4-05F92D0143D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F61679A9-E5DE-468A-B5A4-05F92D0143D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F61679A9-E5DE-468A-B5A4-05F92D0143D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F61679A9-E5DE-468A-B5A4-05F92D0143D2}.Release|Any CPU.Build.0 = Release|Any CPU - {6BA21DCB-1701-4936-B177-3B6D4DE3474E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6BA21DCB-1701-4936-B177-3B6D4DE3474E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6BA21DCB-1701-4936-B177-3B6D4DE3474E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6BA21DCB-1701-4936-B177-3B6D4DE3474E}.Release|Any CPU.Build.0 = Release|Any CPU - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Duplicati.sln b/Duplicati.sln index 13f14c3cb..f31a7a4c6 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -33,6 +33,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.S EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LightDatamodel", "..\LightDatamodel\LightDatamodel\LightDatamodel.csproj", "{CAE8433B-F013-474E-B7FC-4DE0D5933AD1}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Duplicati\CommandLine\Duplicati.CommandLine.csproj", "{81765A64-3661-4E3E-B850-2F6F87A51F74}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.Decrypter", "Duplicati\CommandLine\Decrypter\Duplicati.CommandLine.Decrypter.csproj", "{E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F}" +EndProject Global GlobalSection(SubversionScc) = preSolution Svn-Managed = True @@ -140,6 +144,18 @@ Global {CAE8433B-F013-474E-B7FC-4DE0D5933AD1}.Release|Any CPU.Build.0 = Release|Any CPU {CAE8433B-F013-474E-B7FC-4DE0D5933AD1}.Test|Any CPU.ActiveCfg = Test|Any CPU {CAE8433B-F013-474E-B7FC-4DE0D5933AD1}.Test|Any CPU.Build.0 = Test|Any CPU + {81765A64-3661-4E3E-B850-2F6F87A51F74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81765A64-3661-4E3E-B850-2F6F87A51F74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81765A64-3661-4E3E-B850-2F6F87A51F74}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81765A64-3661-4E3E-B850-2F6F87A51F74}.Release|Any CPU.Build.0 = Release|Any CPU + {81765A64-3661-4E3E-B850-2F6F87A51F74}.Test|Any CPU.ActiveCfg = Release|Any CPU + {81765A64-3661-4E3E-B850-2F6F87A51F74}.Test|Any CPU.Build.0 = Release|Any CPU + {E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F}.Release|Any CPU.Build.0 = Release|Any CPU + {E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F}.Test|Any CPU.ActiveCfg = Release|Any CPU + {E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F}.Test|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Duplicati/CommandLine/Checkout DSMCBE Data.bat b/Duplicati/CommandLine/Checkout DSMCBE Data.bat index 136a3c2c4..c00adac08 100644 --- a/Duplicati/CommandLine/Checkout DSMCBE Data.bat +++ b/Duplicati/CommandLine/Checkout DSMCBE Data.bat @@ -3,4 +3,14 @@ "%ProgramFiles%\CollabNet Subversion\svn" checkout -r 150 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r150 "%ProgramFiles%\CollabNet Subversion\svn" checkout -r 200 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r200 "%ProgramFiles%\CollabNet Subversion\svn" checkout -r 250 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 251 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 252 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 253 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 254 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 255 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 256 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 257 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 258 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 259 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 +"%ProgramFiles%\CollabNet Subversion\svn" checkout -r 260 http://dsmcbe.googlecode.com/svn/trunk/ bin\Debug\DSMCBE\r250 pause \ No newline at end of file diff --git a/Duplicati/CommandLine/Decrypter/Duplicati.CommandLine.Decrypter.csproj b/Duplicati/CommandLine/Decrypter/Duplicati.CommandLine.Decrypter.csproj new file mode 100644 index 000000000..3788fa45c --- /dev/null +++ b/Duplicati/CommandLine/Decrypter/Duplicati.CommandLine.Decrypter.csproj @@ -0,0 +1,53 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {E2AF781D-D1E1-4512-BF2C-D6DA8D0F797F} + Exe + Properties + Duplicati.CommandLine.Decrypter + Duplicati.CommandLine.Decrypter + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + {94484FDB-2EFA-4CF0-9BE6-A561157B4F87} + Duplicati.Library.Encryption + + + + + \ No newline at end of file diff --git a/Duplicati/CommandLine/Decrypter/Program.cs b/Duplicati/CommandLine/Decrypter/Program.cs new file mode 100644 index 000000000..568166cce --- /dev/null +++ b/Duplicati/CommandLine/Decrypter/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Duplicati.Library.Encryption; + +namespace Duplicati.CommandLine.Decrypter +{ + class Program + { + static void Main(string[] args) + { + if (args.Length == 3) + { + Console.WriteLine("Usage: Duplicati.CommandLine.Decrypter.exe "); + return; + } + + AESEncryption c = new AESEncryption(args[0]); + c.Decrypt(args[1], args[2]); + } + } +} diff --git a/Duplicati/CommandLine/Decrypter/Properties/AssemblyInfo.cs b/Duplicati/CommandLine/Decrypter/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..1d564d412 --- /dev/null +++ b/Duplicati/CommandLine/Decrypter/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Duplicati.CommandLine.Decrypter")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("GEOGRAF A/S")] +[assembly: AssemblyProduct("Duplicati.CommandLine.Decrypter")] +[assembly: AssemblyCopyright("Copyright © GEOGRAF A/S 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("31de2d8c-9bab-4357-99c6-6a99058928a2")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Duplicati/CommandLine/Run Unittest on DSMCBE data.bat b/Duplicati/CommandLine/Run Unittest on DSMCBE data.bat index 422a53754..2c574ee24 100644 --- a/Duplicati/CommandLine/Run Unittest on DSMCBE data.bat +++ b/Duplicati/CommandLine/Run Unittest on DSMCBE data.bat @@ -1,3 +1,3 @@ cd bin\Debug -Duplicati.CommandLine.exe UNITTEST DSMCBE\r50 DSMCBE\r100 DSMCBE\r150 DSMCBE\r200 DSMCBE\r250 +Duplicati.CommandLine.exe UNITTEST DSMCBE\r50 DSMCBE\r100 DSMCBE\r150 DSMCBE\r200 DSMCBE\r250 DSMCBE\r251 DSMCBE\r252 DSMCBE\r253 DSMCBE\r254 DSMCBE\r255 DSMCBE\r256 DSMCBE\r257 DSMCBE\r258 DSMCBE\r259 DSMCBE\r260 pause \ No newline at end of file diff --git a/Duplicati/CommandLine/UnitTest.cs b/Duplicati/CommandLine/UnitTest.cs index c344ea383..febce3a86 100644 --- a/Duplicati/CommandLine/UnitTest.cs +++ b/Duplicati/CommandLine/UnitTest.cs @@ -63,10 +63,18 @@ namespace Duplicati.CommandLine Log.LogLevel = Duplicati.Library.Logging.LogMessageType.Profiling; string tempdir = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "tempdir"); - if (System.IO.Directory.Exists(tempdir)) - System.IO.Directory.Delete(tempdir, true); - System.IO.Directory.CreateDirectory(tempdir); + try + { + if (System.IO.Directory.Exists(tempdir)) + System.IO.Directory.Delete(tempdir, true); + + System.IO.Directory.CreateDirectory(tempdir); + } + catch(Exception ex) + { + Log.WriteMessage("Failed to clean tempdir", LogMessageType.Error, ex); + } Duplicati.Library.Core.TempFolder.SystemTempPath = tempdir; @@ -167,13 +175,19 @@ namespace Duplicati.CommandLine string relpath = s.Substring(f1.Length); string target = System.IO.Path.Combine(f2, relpath); if (!folders2.Contains(target)) + { + Log.WriteMessage("Missing folder: " + relpath, LogMessageType.Error); Console.WriteLine("Missing folder: " + relpath); + } else folders2.Remove(target); } - foreach(string s in folders2) + foreach (string s in folders2) + { + Log.WriteMessage("Extra folder: " + s.Substring(f2.Length), LogMessageType.Error); Console.WriteLine("Extra folder: " + s.Substring(f2.Length)); + } List files1 = Utility.EnumerateFiles(f1); List files2 = Utility.EnumerateFiles(f2); @@ -182,17 +196,26 @@ namespace Duplicati.CommandLine string relpath = s.Substring(f1.Length); string target = System.IO.Path.Combine(f2, relpath); if (!files2.Contains(target)) + { + Log.WriteMessage("Missing file: " + relpath, LogMessageType.Error); Console.WriteLine("Missing file: " + relpath); + } else { files2.Remove(target); if (!CompareFiles(s, target, relpath)) + { + Log.WriteMessage("File differs: " + relpath, LogMessageType.Error); Console.WriteLine("File differs: " + relpath); + } } } foreach (string s in files2) + { + Log.WriteMessage("Extra file: " + s.Substring(f2.Length), LogMessageType.Error); Console.WriteLine("Extra file: " + s.Substring(f2.Length)); + } } /// @@ -208,6 +231,7 @@ namespace Duplicati.CommandLine using (System.IO.FileStream fs2 = System.IO.File.OpenRead(f2)) if (fs1.Length != fs2.Length) { + Log.WriteMessage("Lengths differ: " + display + ", " + fs1.Length.ToString() + " vs. " + fs2.Length.ToString(), LogMessageType.Error); Console.WriteLine("Lengths differ: " + display + ", " + fs1.Length.ToString() + " vs. " + fs2.Length.ToString()); return false; } @@ -215,6 +239,7 @@ namespace Duplicati.CommandLine for (long l = 0; l < fs1.Length; l++) if (fs1.ReadByte() != fs2.ReadByte()) { + Log.WriteMessage("Mismatch in byte " + l.ToString() + " in file " + display, LogMessageType.Error); Console.WriteLine("Mismatch in byte " + l.ToString() + " in file " + display); return false; } diff --git a/Duplicati/GUI/ApplicationSetup.Designer.cs b/Duplicati/GUI/ApplicationSetup.Designer.cs index 141d0402c..7fa2a302d 100644 --- a/Duplicati/GUI/ApplicationSetup.Designer.cs +++ b/Duplicati/GUI/ApplicationSetup.Designer.cs @@ -30,31 +30,23 @@ namespace Duplicati.GUI { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ApplicationSetup)); this.label1 = new System.Windows.Forms.Label(); - this.RecentDuration = new System.Windows.Forms.TextBox(); - this.PGPPath = new System.Windows.Forms.TextBox(); + this.GPGPath = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.RecentDuration = new Duplicati.GUI.HelperControls.DurationEditor(); this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.BrowseNcFTP = new System.Windows.Forms.Button(); - this.NcFTPPath = new System.Windows.Forms.TextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.BrowseDuplicity = new System.Windows.Forms.Button(); - this.BrowsePython = new System.Windows.Forms.Button(); - this.BrowsePGP = new System.Windows.Forms.Button(); - this.DuplicityPath = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.PythonPath = new System.Windows.Forms.TextBox(); + this.BrowseSCP = new System.Windows.Forms.Button(); + this.SCPPath = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); + this.BrowseSFTP = new System.Windows.Forms.Button(); + this.SFTPPath = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.BrowsePGP = new System.Windows.Forms.Button(); this.OKBtn = new System.Windows.Forms.Button(); this.CancelBtn = new System.Windows.Forms.Button(); - this.PGPBrowser = new System.Windows.Forms.FolderBrowserDialog(); - this.PythonFileDialog = new System.Windows.Forms.OpenFileDialog(); - this.DuplicityFileDialog = new System.Windows.Forms.OpenFileDialog(); - this.NcFTPBrowser = new System.Windows.Forms.FolderBrowserDialog(); - this.BrowsePutty = new System.Windows.Forms.Button(); - this.PuttyPath = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.PuttyBrowser = new System.Windows.Forms.FolderBrowserDialog(); + this.BrowseGPGDialog = new System.Windows.Forms.OpenFileDialog(); + this.BrowseSFTPDialog = new System.Windows.Forms.OpenFileDialog(); + this.BrowseSCPDialog = new System.Windows.Forms.OpenFileDialog(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); this.SuspendLayout(); @@ -68,162 +60,142 @@ namespace Duplicati.GUI this.label1.TabIndex = 0; this.label1.Text = "Time a log is shown in recent backups"; // - // RecentDuration + // GPGPath // - this.RecentDuration.Location = new System.Drawing.Point(232, 24); - this.RecentDuration.Name = "RecentDuration"; - this.RecentDuration.Size = new System.Drawing.Size(168, 20); - this.RecentDuration.TabIndex = 1; - this.RecentDuration.TextChanged += new System.EventHandler(this.RecentDuration_TextChanged); - // - // PGPPath - // - this.PGPPath.Location = new System.Drawing.Point(128, 24); - this.PGPPath.Name = "PGPPath"; - this.PGPPath.Size = new System.Drawing.Size(248, 20); - this.PGPPath.TabIndex = 3; - this.PGPPath.TextChanged += new System.EventHandler(this.PGPPath_TextChanged); + this.GPGPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GPGPath.Location = new System.Drawing.Point(128, 24); + this.GPGPath.Name = "GPGPath"; + this.GPGPath.Size = new System.Drawing.Size(272, 20); + this.GPGPath.TabIndex = 3; + this.GPGPath.TextChanged += new System.EventHandler(this.GPGPath_TextChanged); // // label2 // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(8, 24); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(58, 13); + this.label2.Size = new System.Drawing.Size(54, 13); this.label2.TabIndex = 2; - this.label2.Text = "PGP folder"; + this.label2.Text = "GPG path"; // // groupBox1 // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.groupBox1.Controls.Add(this.RecentDuration); this.groupBox1.Controls.Add(this.label1); this.groupBox1.Location = new System.Drawing.Point(8, 8); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(408, 56); + this.groupBox1.Size = new System.Drawing.Size(437, 56); this.groupBox1.TabIndex = 4; this.groupBox1.TabStop = false; this.groupBox1.Text = "User interface settings"; // + // RecentDuration + // + this.RecentDuration.Location = new System.Drawing.Point(208, 24); + this.RecentDuration.Name = "RecentDuration"; + this.RecentDuration.Size = new System.Drawing.Size(221, 21); + this.RecentDuration.TabIndex = 1; + this.RecentDuration.Value = ""; + this.RecentDuration.ValueChanged += new System.EventHandler(this.RecentDuration_ValueChanged); + // // groupBox2 // - this.groupBox2.Controls.Add(this.BrowsePutty); - this.groupBox2.Controls.Add(this.PuttyPath); - this.groupBox2.Controls.Add(this.label6); - this.groupBox2.Controls.Add(this.BrowseNcFTP); - this.groupBox2.Controls.Add(this.NcFTPPath); - this.groupBox2.Controls.Add(this.label5); - this.groupBox2.Controls.Add(this.BrowseDuplicity); - this.groupBox2.Controls.Add(this.BrowsePython); - this.groupBox2.Controls.Add(this.BrowsePGP); - this.groupBox2.Controls.Add(this.DuplicityPath); - this.groupBox2.Controls.Add(this.label4); - this.groupBox2.Controls.Add(this.PythonPath); + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.BrowseSCP); + this.groupBox2.Controls.Add(this.SCPPath); this.groupBox2.Controls.Add(this.label3); - this.groupBox2.Controls.Add(this.PGPPath); + this.groupBox2.Controls.Add(this.BrowseSFTP); + this.groupBox2.Controls.Add(this.SFTPPath); + this.groupBox2.Controls.Add(this.label6); + this.groupBox2.Controls.Add(this.BrowsePGP); + this.groupBox2.Controls.Add(this.GPGPath); this.groupBox2.Controls.Add(this.label2); this.groupBox2.Location = new System.Drawing.Point(8, 72); this.groupBox2.Name = "groupBox2"; - this.groupBox2.Size = new System.Drawing.Size(408, 160); + this.groupBox2.Size = new System.Drawing.Size(437, 104); this.groupBox2.TabIndex = 5; this.groupBox2.TabStop = false; - this.groupBox2.Text = "Path settings (VERY ADVANCED)"; + this.groupBox2.Text = "Path settings (Advanced)"; // - // BrowseNcFTP + // BrowseSCP // - this.BrowseNcFTP.Location = new System.Drawing.Point(376, 96); - this.BrowseNcFTP.Name = "BrowseNcFTP"; - this.BrowseNcFTP.Size = new System.Drawing.Size(24, 20); - this.BrowseNcFTP.TabIndex = 13; - this.BrowseNcFTP.Text = "..."; - this.BrowseNcFTP.UseVisualStyleBackColor = true; - this.BrowseNcFTP.Click += new System.EventHandler(this.BrowseNcFTP_Click); + this.BrowseSCP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BrowseSCP.Location = new System.Drawing.Point(400, 72); + this.BrowseSCP.Name = "BrowseSCP"; + this.BrowseSCP.Size = new System.Drawing.Size(24, 20); + this.BrowseSCP.TabIndex = 19; + this.BrowseSCP.Text = "..."; + this.BrowseSCP.UseVisualStyleBackColor = true; + this.BrowseSCP.Click += new System.EventHandler(this.BrowseSCP_Click); // - // NcFTPPath + // SCPPath // - this.NcFTPPath.Location = new System.Drawing.Point(128, 96); - this.NcFTPPath.Name = "NcFTPPath"; - this.NcFTPPath.Size = new System.Drawing.Size(248, 20); - this.NcFTPPath.TabIndex = 12; - this.NcFTPPath.TextChanged += new System.EventHandler(this.NcFTPPath_TextChanged); + this.SCPPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SCPPath.Location = new System.Drawing.Point(128, 72); + this.SCPPath.Name = "SCPPath"; + this.SCPPath.Size = new System.Drawing.Size(272, 20); + this.SCPPath.TabIndex = 18; + this.SCPPath.TextChanged += new System.EventHandler(this.SCPPath_TextChanged); // - // label5 + // label3 // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(8, 96); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(70, 13); - this.label5.TabIndex = 11; - this.label5.Text = "NcFTP folder"; + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(8, 72); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(48, 13); + this.label3.TabIndex = 17; + this.label3.Text = "scp path"; // - // BrowseDuplicity + // BrowseSFTP // - this.BrowseDuplicity.Location = new System.Drawing.Point(376, 72); - this.BrowseDuplicity.Name = "BrowseDuplicity"; - this.BrowseDuplicity.Size = new System.Drawing.Size(24, 20); - this.BrowseDuplicity.TabIndex = 10; - this.BrowseDuplicity.Text = "..."; - this.BrowseDuplicity.UseVisualStyleBackColor = true; - this.BrowseDuplicity.Click += new System.EventHandler(this.BrowseDuplicity_Click); + this.BrowseSFTP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BrowseSFTP.Location = new System.Drawing.Point(400, 48); + this.BrowseSFTP.Name = "BrowseSFTP"; + this.BrowseSFTP.Size = new System.Drawing.Size(24, 20); + this.BrowseSFTP.TabIndex = 16; + this.BrowseSFTP.Text = "..."; + this.BrowseSFTP.UseVisualStyleBackColor = true; + this.BrowseSFTP.Click += new System.EventHandler(this.BrowseSFTP_Click); // - // BrowsePython + // SFTPPath // - this.BrowsePython.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.BrowsePython.Location = new System.Drawing.Point(376, 48); - this.BrowsePython.Name = "BrowsePython"; - this.BrowsePython.Size = new System.Drawing.Size(24, 20); - this.BrowsePython.TabIndex = 9; - this.BrowsePython.Text = "..."; - this.BrowsePython.UseVisualStyleBackColor = true; - this.BrowsePython.Click += new System.EventHandler(this.BrowsePython_Click); + this.SFTPPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SFTPPath.Location = new System.Drawing.Point(128, 48); + this.SFTPPath.Name = "SFTPPath"; + this.SFTPPath.Size = new System.Drawing.Size(272, 20); + this.SFTPPath.TabIndex = 15; + this.SFTPPath.TextChanged += new System.EventHandler(this.SFTPPath_TextChanged); + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(8, 48); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(48, 13); + this.label6.TabIndex = 14; + this.label6.Text = "sftp path"; // // BrowsePGP // - this.BrowsePGP.Location = new System.Drawing.Point(376, 24); + this.BrowsePGP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BrowsePGP.Location = new System.Drawing.Point(400, 24); this.BrowsePGP.Name = "BrowsePGP"; this.BrowsePGP.Size = new System.Drawing.Size(24, 20); this.BrowsePGP.TabIndex = 8; this.BrowsePGP.Text = "..."; this.BrowsePGP.UseVisualStyleBackColor = true; - this.BrowsePGP.Click += new System.EventHandler(this.BrowsePGP_Click); - // - // DuplicityPath - // - this.DuplicityPath.Location = new System.Drawing.Point(128, 72); - this.DuplicityPath.Name = "DuplicityPath"; - this.DuplicityPath.Size = new System.Drawing.Size(248, 20); - this.DuplicityPath.TabIndex = 7; - this.DuplicityPath.TextChanged += new System.EventHandler(this.DuplicityPath_TextChanged); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(8, 72); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(91, 13); - this.label4.TabIndex = 6; - this.label4.Text = "Duplicity script file"; - // - // PythonPath - // - this.PythonPath.Location = new System.Drawing.Point(128, 48); - this.PythonPath.Name = "PythonPath"; - this.PythonPath.Size = new System.Drawing.Size(248, 20); - this.PythonPath.TabIndex = 5; - this.PythonPath.TextChanged += new System.EventHandler(this.PythonPath_TextChanged); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(8, 48); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(101, 13); - this.label3.TabIndex = 4; - this.label3.Text = "Python executeable"; + this.BrowsePGP.Click += new System.EventHandler(this.BrowseGPG_Click); // // OKBtn // this.OKBtn.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.OKBtn.Location = new System.Drawing.Point(120, 251); + this.OKBtn.Location = new System.Drawing.Point(135, 186); this.OKBtn.Name = "OKBtn"; this.OKBtn.Size = new System.Drawing.Size(80, 24); this.OKBtn.TabIndex = 6; @@ -235,77 +207,40 @@ namespace Duplicati.GUI // this.CancelBtn.Anchor = System.Windows.Forms.AnchorStyles.Bottom; this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelBtn.Location = new System.Drawing.Point(216, 251); + this.CancelBtn.Location = new System.Drawing.Point(231, 186); this.CancelBtn.Name = "CancelBtn"; this.CancelBtn.Size = new System.Drawing.Size(72, 24); this.CancelBtn.TabIndex = 7; this.CancelBtn.Text = "Cancel"; this.CancelBtn.UseVisualStyleBackColor = true; // - // PGPBrowser + // BrowseGPGDialog // - this.PGPBrowser.Description = "Select the folder where the PGP files are located"; - this.PGPBrowser.ShowNewFolderButton = false; + this.BrowseGPGDialog.AddExtension = false; + this.BrowseGPGDialog.FileName = "gpg.exe"; + this.BrowseGPGDialog.Filter = "Executables (*.exe)|*.exe|All files (*.*)|*.*"; + this.BrowseGPGDialog.Title = "Select the GNU Privacy Guard executable"; // - // PythonFileDialog + // BrowseSFTPDialog // - this.PythonFileDialog.DefaultExt = "exe"; - this.PythonFileDialog.FileName = "Python.exe"; - this.PythonFileDialog.Filter = "Executeables (*.exe)|*.exe|All files (*.*)|*.*"; - this.PythonFileDialog.SupportMultiDottedExtensions = true; - this.PythonFileDialog.Title = "Select the Python executeable to use"; + this.BrowseSFTPDialog.AddExtension = false; + this.BrowseSFTPDialog.FileName = "psftp.exe"; + this.BrowseSFTPDialog.Filter = "Executables (*.exe)|*.exe|All files (*.*)|*.*"; + this.BrowseSFTPDialog.Title = "Select the SFTP executable"; // - // DuplicityFileDialog + // BrowseSCPDialog // - this.DuplicityFileDialog.DefaultExt = "py"; - this.DuplicityFileDialog.FileName = "Duplicity.py"; - this.DuplicityFileDialog.Filter = "Python files (*.py)|*.py|All files (*.*)|*.*"; - this.DuplicityFileDialog.SupportMultiDottedExtensions = true; - this.DuplicityFileDialog.Title = "Select the main Duplicity script file"; - // - // NcFTPBrowser - // - this.NcFTPBrowser.Description = "Select the folder where the NcFTP files are located"; - this.NcFTPBrowser.ShowNewFolderButton = false; - // - // BrowsePutty - // - this.BrowsePutty.Location = new System.Drawing.Point(376, 120); - this.BrowsePutty.Name = "BrowsePutty"; - this.BrowsePutty.Size = new System.Drawing.Size(24, 20); - this.BrowsePutty.TabIndex = 16; - this.BrowsePutty.Text = "..."; - this.BrowsePutty.UseVisualStyleBackColor = true; - this.BrowsePutty.Click += new System.EventHandler(this.BrowsePutty_Click); - // - // PuttyPath - // - this.PuttyPath.Location = new System.Drawing.Point(128, 120); - this.PuttyPath.Name = "PuttyPath"; - this.PuttyPath.Size = new System.Drawing.Size(248, 20); - this.PuttyPath.TabIndex = 15; - this.PuttyPath.TextChanged += new System.EventHandler(this.PuttyPath_TextChanged); - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(8, 120); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(60, 13); - this.label6.TabIndex = 14; - this.label6.Text = "Putty folder"; - // - // PuttyBrowser - // - this.PuttyBrowser.Description = "Select the folder where the putty files are located"; - this.PuttyBrowser.ShowNewFolderButton = false; + this.BrowseSCPDialog.AddExtension = false; + this.BrowseSCPDialog.FileName = "pscp.exe"; + this.BrowseSCPDialog.Filter = "Executables (*.exe)|*.exe|All files (*.*)|*.*"; + this.BrowseSCPDialog.Title = "Select the SCP executable"; // // ApplicationSetup // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.CancelBtn; - this.ClientSize = new System.Drawing.Size(423, 286); + this.ClientSize = new System.Drawing.Size(453, 224); this.Controls.Add(this.CancelBtn); this.Controls.Add(this.OKBtn); this.Controls.Add(this.groupBox2); @@ -328,30 +263,22 @@ namespace Duplicati.GUI #endregion private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox RecentDuration; - private System.Windows.Forms.TextBox PGPPath; + private System.Windows.Forms.TextBox GPGPath; private System.Windows.Forms.Label label2; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.Button BrowseDuplicity; - private System.Windows.Forms.Button BrowsePython; private System.Windows.Forms.Button BrowsePGP; - private System.Windows.Forms.TextBox DuplicityPath; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox PythonPath; - private System.Windows.Forms.Label label3; private System.Windows.Forms.Button OKBtn; private System.Windows.Forms.Button CancelBtn; - private System.Windows.Forms.FolderBrowserDialog PGPBrowser; - private System.Windows.Forms.OpenFileDialog PythonFileDialog; - private System.Windows.Forms.OpenFileDialog DuplicityFileDialog; - private System.Windows.Forms.Button BrowseNcFTP; - private System.Windows.Forms.TextBox NcFTPPath; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.FolderBrowserDialog NcFTPBrowser; - private System.Windows.Forms.Button BrowsePutty; - private System.Windows.Forms.TextBox PuttyPath; + private System.Windows.Forms.Button BrowseSFTP; + private System.Windows.Forms.TextBox SFTPPath; private System.Windows.Forms.Label label6; - private System.Windows.Forms.FolderBrowserDialog PuttyBrowser; + private Duplicati.GUI.HelperControls.DurationEditor RecentDuration; + private System.Windows.Forms.Button BrowseSCP; + private System.Windows.Forms.TextBox SCPPath; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.OpenFileDialog BrowseGPGDialog; + private System.Windows.Forms.OpenFileDialog BrowseSFTPDialog; + private System.Windows.Forms.OpenFileDialog BrowseSCPDialog; } } \ No newline at end of file diff --git a/Duplicati/GUI/ApplicationSetup.cs b/Duplicati/GUI/ApplicationSetup.cs index 47327f413..249d5330a 100644 --- a/Duplicati/GUI/ApplicationSetup.cs +++ b/Duplicati/GUI/ApplicationSetup.cs @@ -44,11 +44,10 @@ namespace Duplicati.GUI try { m_isUpdating = true; - RecentDuration.Text = m_settings.RecentBackupDuration; - PGPPath.Text = m_settings.PGPPath; - PythonPath.Text = m_settings.PythonPath; - DuplicityPath.Text = m_settings.DuplicityPath; - NcFTPPath.Text = m_settings.NcFTPPath; + RecentDuration.Value = m_settings.RecentBackupDuration; + GPGPath.Text = m_settings.GPGPath; + SFTPPath.Text = m_settings.SFtpPath; + SCPPath.Text = m_settings.ScpPath; } finally { @@ -74,91 +73,65 @@ namespace Duplicati.GUI return true; } - private void BrowsePGP_Click(object sender, EventArgs e) + private void BrowseGPG_Click(object sender, EventArgs e) { - if (PGPBrowser.ShowDialog(this) == DialogResult.OK) - if (TestForFiles(PGPBrowser.SelectedPath, "pgp.exe")) - PGPPath.Text = PGPBrowser.SelectedPath; - } - - private void BrowsePython_Click(object sender, EventArgs e) - { - if (PythonFileDialog.ShowDialog(this) == DialogResult.OK) - if (TestForFiles(System.IO.Path.GetDirectoryName(PythonFileDialog.FileName), "python.exe")) - PythonPath.Text = PythonFileDialog.FileName; - } - - private void BrowseDuplicity_Click(object sender, EventArgs e) - { - if (DuplicityFileDialog.ShowDialog(this) == DialogResult.OK) - if (TestForFiles(System.IO.Path.GetDirectoryName(DuplicityFileDialog.FileName), "duplicity.py")) - DuplicityPath.Text = DuplicityFileDialog.FileName; + if (BrowseGPGDialog.ShowDialog(this) == DialogResult.OK) + GPGPath.Text = BrowseGPGDialog.FileName; } private void RecentDuration_TextChanged(object sender, EventArgs e) { if (m_isUpdating) return; - m_settings.RecentBackupDuration = RecentDuration.Text; + m_settings.RecentBackupDuration = RecentDuration.Value; } - private void PGPPath_TextChanged(object sender, EventArgs e) + private void GPGPath_TextChanged(object sender, EventArgs e) { if (m_isUpdating) return; - m_settings.PGPPath = PGPPath.Text; - } - - private void PythonPath_TextChanged(object sender, EventArgs e) - { - if (m_isUpdating) - return; - m_settings.PythonPath = PythonPath.Text; - } - - private void DuplicityPath_TextChanged(object sender, EventArgs e) - { - if (m_isUpdating) - return; - m_settings.DuplicityPath = DuplicityPath.Text; + m_settings.GPGPath = GPGPath.Text; } private void OKBtn_Click(object sender, EventArgs e) { - //TODO: Fix once CommitRecursive is done - m_connection.CommitAll(); - Program.DataConnection.CommitAll(); + m_connection.CommitRecursive(m_connection.GetObjects()); this.DialogResult = DialogResult.OK; this.Close(); } - private void BrowseNcFTP_Click(object sender, EventArgs e) + private void BrowseSFTP_Click(object sender, EventArgs e) { - if (NcFTPBrowser.ShowDialog(this) == DialogResult.OK) - if (TestForFiles(NcFTPBrowser.SelectedPath, "ncftp.exe", "ncftpbatch.exe", "ncftpget.exe", "ncftpls.exe", "ncftpput.exe")) - NcFTPPath.Text = NcFTPBrowser.SelectedPath; - } + if (BrowseSFTPDialog.ShowDialog(this) == DialogResult.OK) + SFTPPath.Text = BrowseSFTPDialog.FileName; + } - private void NcFTPPath_TextChanged(object sender, EventArgs e) + private void SFTPPath_TextChanged(object sender, EventArgs e) { if (m_isUpdating) return; - m_settings.NcFTPPath = NcFTPPath.Text; + m_settings.SFtpPath = SFTPPath.Text; } - private void BrowsePutty_Click(object sender, EventArgs e) - { - if (PuttyBrowser.ShowDialog(this) == DialogResult.OK) - if (TestForFiles(PuttyBrowser.SelectedPath, "pscp.exe", "psftp.exe")) - PuttyPath.Text = PuttyBrowser.SelectedPath; - } - - private void PuttyPath_TextChanged(object sender, EventArgs e) + private void SCPPath_TextChanged(object sender, EventArgs e) { if (m_isUpdating) return; - m_settings.PuttyPath = PuttyPath.Text; + m_settings.ScpPath = SCPPath.Text; + } + + private void BrowseSCP_Click(object sender, EventArgs e) + { + if (BrowseSCPDialog.ShowDialog(this) == DialogResult.OK) + SCPPath.Text = BrowseSCPDialog.FileName; + } + + private void RecentDuration_ValueChanged(object sender, EventArgs e) + { + RecentDuration_TextChanged(sender, e); + } + } } \ No newline at end of file diff --git a/Duplicati/GUI/ApplicationSetup.resx b/Duplicati/GUI/ApplicationSetup.resx index c9988311d..0df775dba 100644 --- a/Duplicati/GUI/ApplicationSetup.resx +++ b/Duplicati/GUI/ApplicationSetup.resx @@ -117,20 +117,14 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - - 129, 17 + + 147, 17 - - 263, 17 - - - 405, 17 - - - 528, 17 + + 277, 17 diff --git a/Duplicati/GUI/Database schema/Schema.sql b/Duplicati/GUI/Database schema/Schema.sql index c1a7eb5ed..188abbe8b 100644 --- a/Duplicati/GUI/Database schema/Schema.sql +++ b/Duplicati/GUI/Database schema/Schema.sql @@ -13,7 +13,8 @@ CREATE TABLE "Task" ( "VolumeSize" TEXT NULL, "FullAfter" TEXT NULL, "ThreadPriority" TEXT NULL, - "AsyncTransfer" BOOLEAN NULL + "AsyncTransfer" BOOLEAN NULL, + "GPGEncryption" BOOLEAN NULL ); CREATE TABLE "Schedule" ( diff --git a/Duplicati/GUI/Datamodel/ApplicationSettings.cs b/Duplicati/GUI/Datamodel/ApplicationSettings.cs index e86481b64..3916f7d58 100644 --- a/Duplicati/GUI/Datamodel/ApplicationSettings.cs +++ b/Duplicati/GUI/Datamodel/ApplicationSettings.cs @@ -30,12 +30,11 @@ namespace Duplicati.Datamodel private const string RECENT_DURATION = "Recent duration"; private const string PGP_PATH = "PGP path"; - private const string PYTHON_PATH = "Python path"; - private const string DUPLICITY_PATH = "Duplicity path"; - private const string NCFTP_PATH = "NcFTP Path"; - private const string PUTTY_PATH = "Putty Path"; + private const string SFTP_PATH = "SFTP Path"; + private const string SCP_PATH = "SCP Path"; - public const string APP_PATH_ENV = "%APP_PATH%"; + //TODO: Deal with this on Linux + public const string PROGRAM_FILES = "%PROGRAMFILES%"; public ApplicationSettings(IDataFetcher dataparent) { @@ -54,47 +53,60 @@ namespace Duplicati.Datamodel /// /// Gets or sets the path to PGP. May contain environment variables /// - public string PGPPath + public string GPGPath { - get { return string.IsNullOrEmpty(m_appset[PGP_PATH]) ? APP_PATH_ENV + "gpg" : m_appset[PGP_PATH]; } + get + { + if (string.IsNullOrEmpty(m_appset[PGP_PATH])) + { + if (System.Environment.OSVersion.Platform == PlatformID.Unix || System.Environment.OSVersion.Platform == PlatformID.MacOSX) + return "gpg"; + else + return PROGRAM_FILES + "GNU\\GnuPG\\gpg.exe"; + } + + return m_appset[PGP_PATH]; + } set { m_appset[PGP_PATH] = value; } } /// - /// Gets or sets the path to NcFTP. May contain environment variables + /// Gets or sets the path to SFtp. May contain environment variables /// - public string NcFTPPath + public string SFtpPath { - get { return string.IsNullOrEmpty(m_appset[NCFTP_PATH]) ? APP_PATH_ENV + "ncftp" : m_appset[NCFTP_PATH]; } - set { m_appset[NCFTP_PATH] = value; } + get + { + if (string.IsNullOrEmpty(m_appset[SFTP_PATH])) + { + if (System.Environment.OSVersion.Platform == PlatformID.Unix || System.Environment.OSVersion.Platform == PlatformID.MacOSX) + return "sftp"; + else + return PROGRAM_FILES + "\\putty\\psftp.exe"; + } + return m_appset[SFTP_PATH]; + } + set { m_appset[SFTP_PATH] = value; } } + /// - /// Gets or sets the path to Putty. May contain environment variables + /// Gets or sets the path to SFtp. May contain environment variables /// - public string PuttyPath + public string ScpPath { - get { return string.IsNullOrEmpty(m_appset[PUTTY_PATH]) ? APP_PATH_ENV + "putty" : m_appset[PUTTY_PATH]; } - set { m_appset[PUTTY_PATH] = value; } + get + { + if (string.IsNullOrEmpty(m_appset[SCP_PATH])) + { + if (System.Environment.OSVersion.Platform == PlatformID.Unix || System.Environment.OSVersion.Platform == PlatformID.MacOSX) + return "scp"; + else + return PROGRAM_FILES + "\\putty\\pscp.exe"; + } + return m_appset[SCP_PATH]; + } + set { m_appset[SCP_PATH] = value; } } - - /// - /// Gets or sets the path to the pyhon executeable. May contain environment variables - /// - public string PythonPath - { - get { return string.IsNullOrEmpty(m_appset[PYTHON_PATH]) ? APP_PATH_ENV + "python25\\python.exe" : m_appset[PYTHON_PATH]; } - set { m_appset[PYTHON_PATH] = value; } - } - - /// - /// Gets or sets the path to the duplicity main script. May contain environment variables - /// - public string DuplicityPath - { - get { return string.IsNullOrEmpty(m_appset[DUPLICITY_PATH]) ? APP_PATH_ENV + "duplicity\\duplicity.py" : m_appset[DUPLICITY_PATH]; } - set { m_appset[DUPLICITY_PATH] = value; } - } - } } diff --git a/Duplicati/GUI/Datamodel/Backends/SSH.cs b/Duplicati/GUI/Datamodel/Backends/SSH.cs index 80c26436d..43122af2a 100644 --- a/Duplicati/GUI/Datamodel/Backends/SSH.cs +++ b/Duplicati/GUI/Datamodel/Backends/SSH.cs @@ -110,6 +110,9 @@ namespace Duplicati.Datamodel.Backends if (this.Port != 22) options["ssh-options"] += "-P " + this.Port; + + options["scp-command"] = new ApplicationSettings(m_owner.DataParent).ScpPath; + options["sftp-command"] = new ApplicationSettings(m_owner.DataParent).SFtpPath; } public string FriendlyName { get { return "SSH host"; } } diff --git a/Duplicati/GUI/Datamodel/Duplicati.sqlite b/Duplicati/GUI/Datamodel/Duplicati.sqlite index ac76670df21764b1efaa89ee3ad85811ee60b6a2..b80b20d75743a292b8ecc6528701061c5e0a79dd 100644 GIT binary patch delta 99 zcmZq3Xvml#Ey~M)3V0Y87??I1T+^2nWnhwG>R{Gq5CyAfVd7#J7Zqh}Pv2~7aEDP& nM?uLwz}+=3xu~+BBr`uxNx{kA-^bO_Pr)zL$7i#o(Q`%sEzA^& delta 67 zcmZq3Xvml#Ey}}y3b+{<7#KGiT+`<=W?+(H>R{GqFrMhB%+;L2#V#%?%Gj>GS>E6d K<7P>t=ZpYk6by#| diff --git a/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml b/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml index 38bee9490..51a43e1ac 100644 --- a/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml +++ b/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml @@ -171,6 +171,17 @@ false false + + System.Boolean + GPGEncryption + GPGEncryption + false + false + false + false + false + false + false diff --git a/Duplicati/GUI/Datamodel/Task.Extension.cs b/Duplicati/GUI/Datamodel/Task.Extension.cs index 992c04ed8..d547a6b9d 100644 --- a/Duplicati/GUI/Datamodel/Task.Extension.cs +++ b/Duplicati/GUI/Datamodel/Task.Extension.cs @@ -84,6 +84,11 @@ namespace Duplicati.Datamodel options["thread-priority"] = this.ThreadPriority; if (this.AsyncTransfer) options["asynchronous-upload"] = ""; + if (this.GPGEncryption) + { + options["gpg-encryption"] = ""; + options["gpg-program-path"] = new ApplicationSettings(this.DataParent).GPGPath; + } } public string EncodedFilter diff --git a/Duplicati/GUI/Datamodel/Task.cs b/Duplicati/GUI/Datamodel/Task.cs index 82e81b45e..be2ad8dd0 100644 --- a/Duplicati/GUI/Datamodel/Task.cs +++ b/Duplicati/GUI/Datamodel/Task.cs @@ -49,6 +49,8 @@ namespace Duplicati.Datamodel private System.String m_ThreadPriority = ""; [DatabaseField("AsyncTransfer")] private System.Boolean m_AsyncTransfer = false; + [DatabaseField("GPGEncryption")] + private System.Boolean m_GPGEncryption = false; #endregion #region " properties " @@ -143,6 +145,12 @@ namespace Duplicati.Datamodel set{object oldvalue = m_AsyncTransfer;OnBeforeDataChange(this, "AsyncTransfer", oldvalue, value);m_AsyncTransfer = value;OnAfterDataChange(this, "AsyncTransfer", oldvalue, value);} } + public System.Boolean GPGEncryption + { + get{return m_GPGEncryption;} + set{object oldvalue = m_GPGEncryption;OnBeforeDataChange(this, "GPGEncryption", oldvalue, value);m_GPGEncryption = value;OnAfterDataChange(this, "GPGEncryption", oldvalue, value);} + } + #endregion #region " referenced properties " diff --git a/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.Designer.cs b/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.Designer.cs index 9f64f0d5f..1ab9b111e 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.Designer.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.Designer.cs @@ -38,6 +38,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup this.GeneratePassword = new System.Windows.Forms.Button(); this.PassphraseLength = new System.Windows.Forms.NumericUpDown(); this.label2 = new System.Windows.Forms.Label(); + this.UseGPG = new System.Windows.Forms.CheckBox(); this.PasswordGeneratorSettings.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.PassphraseLength)).BeginInit(); this.SuspendLayout(); @@ -155,10 +156,22 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup this.label2.TabIndex = 5; this.label2.Text = "Characters"; // + // UseGPG + // + this.UseGPG.AutoSize = true; + this.UseGPG.Location = new System.Drawing.Point(24, 176); + this.UseGPG.Name = "UseGPG"; + this.UseGPG.Size = new System.Drawing.Size(365, 17); + this.UseGPG.TabIndex = 5; + this.UseGPG.Text = "Use GNU Privacy Guard for encryption (requires that GnuPG is installed)"; + this.UseGPG.UseVisualStyleBackColor = true; + this.UseGPG.CheckedChanged += new System.EventHandler(this.UseGPG_CheckedChanged); + // // PasswordSettings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.UseGPG); this.Controls.Add(this.PasswordGeneratorSettings); this.Controls.Add(this.PasswordHelptext); this.Controls.Add(this.Password); @@ -184,5 +197,6 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup private System.Windows.Forms.Label label2; private System.Windows.Forms.ComboBox PasswordCharacterSet; private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox UseGPG; } } diff --git a/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.cs b/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.cs index 2823f02da..0e58f0051 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/PasswordSettings.cs @@ -32,6 +32,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup public partial class PasswordSettings : WizardControl { private bool m_warnedNoPassword = false; + private bool m_warnedNoGPG = false; private WizardSettingsWrapper m_wrapper; public PasswordSettings() @@ -46,6 +47,8 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup void PasswordSettings_PageLeave(object sender, PageChangedArgs args) { m_settings["Password:WarnedNoPassword"] = m_warnedNoPassword; + m_settings["Password:WarnedNoGPG"] = m_warnedNoGPG; + if (args.Direction == PageChangedDirection.Back) return; @@ -67,8 +70,29 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup m_warnedNoPassword = true; } + if (!m_warnedNoGPG && UseGPG.Checked) + { + ApplicationSettings apps = new ApplicationSettings(Program.DataConnection); + System.IO.FileInfo fi = null; + try { fi = new System.IO.FileInfo(System.Environment.ExpandEnvironmentVariables(apps.GPGPath)); } + catch { } + + if (fi == null || !fi.Exists) + { + if (MessageBox.Show(this, "Duplicati was unable to verify the existence of GNU Privacy Guard.\nGPG may work regardless, if it is located in the system search path.\nIf the encryption fails, no files will be backed up\nDo you want to continue anyway?", Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning) != DialogResult.Yes) + { + args.Cancel = true; + return; + } + + m_warnedNoGPG = true; + } + } + m_settings["Password:WarnedNoPassword"] = m_warnedNoPassword; + m_settings["Password:WarnedNoGPG"] = m_warnedNoGPG; m_wrapper.BackupPassword = EnablePassword.Checked ? Password.Text : ""; + m_wrapper.GPGEncryption = UseGPG.Checked; args.NextPage = new SelectBackend(); } @@ -81,10 +105,13 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup { EnablePassword.Checked = !string.IsNullOrEmpty(m_wrapper.BackupPassword) || m_wrapper.PrimayAction == WizardSettingsWrapper.MainAction.Add; Password.Text = m_wrapper.BackupPassword; + UseGPG.Checked = m_wrapper.GPGEncryption; } if (m_settings.ContainsKey("Password:WarnedNoPassword")) m_warnedNoPassword = (bool)m_settings["Password:WarnedNoPassword"]; + if (m_settings.ContainsKey("Password:WarnedNoGPG")) + m_warnedNoPassword = (bool)m_settings["Password:WarnedNoGPG"]; } private void GeneratePassword_Click(object sender, EventArgs e) @@ -94,8 +121,9 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup private void EnablePassword_CheckedChanged(object sender, EventArgs e) { - Password.Enabled = PasswordGeneratorSettings.Enabled = EnablePassword.Checked; + Password.Enabled = UseGPG.Enabled = PasswordGeneratorSettings.Enabled = EnablePassword.Checked; m_warnedNoPassword = false; + } private void Password_TextChanged(object sender, EventArgs e) @@ -103,5 +131,10 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup m_warnedNoPassword = false; } + private void UseGPG_CheckedChanged(object sender, EventArgs e) + { + m_warnedNoGPG = false; + } + } } diff --git a/Duplicati/GUI/Wizard pages/Backends/SSH/SSHOptions.cs b/Duplicati/GUI/Wizard pages/Backends/SSH/SSHOptions.cs index 7708af226..309538bf0 100644 --- a/Duplicati/GUI/Wizard pages/Backends/SSH/SSHOptions.cs +++ b/Duplicati/GUI/Wizard pages/Backends/SSH/SSHOptions.cs @@ -33,6 +33,8 @@ namespace Duplicati.GUI.Wizard_pages.Backends.SSH { private bool m_warnedPath = false; private bool m_hasTested = false; + private bool m_warnedNoSCP = false; + private bool m_warnedNoSFTP = false; private SSHSettings m_wrapper; @@ -49,6 +51,8 @@ namespace Duplicati.GUI.Wizard_pages.Backends.SSH { m_settings["SSH:HasWarned"] = m_hasTested; m_settings["SSH:WarnedPath"] = m_warnedPath; + m_settings["SSH:WarnedNoSCP"] = m_warnedNoSCP; ; + m_settings["SSH:WarnedNoSFTP"] = m_warnedNoSFTP; if (args.Direction == PageChangedDirection.Back) return; @@ -69,6 +73,8 @@ namespace Duplicati.GUI.Wizard_pages.Backends.SSH m_settings["SSH:HasWarned"] = m_hasTested; m_settings["SSH:WarnedPath"] = m_warnedPath; + m_settings["SSH:WarnedNoSCP"] = m_warnedNoSCP; ; + m_settings["SSH:WarnedNoSFTP"] = m_warnedNoSFTP; m_wrapper.Passwordless = !UsePassword.Checked; m_wrapper.Password = m_wrapper.Passwordless ? "" : Password.Text; @@ -99,6 +105,12 @@ namespace Duplicati.GUI.Wizard_pages.Backends.SSH if (m_settings.ContainsKey("SSH:WarnedPath")) m_warnedPath = (bool)m_settings["SSH:WarnedPath"]; + + if (m_settings.ContainsKey("SSH:WarnedNoSCP")) + m_warnedNoSCP = (bool)m_settings["SSH:WarnedNoSCP"]; + + if (m_settings.ContainsKey("SSH:WarnedNoSFTP")) + m_warnedNoSFTP = (bool)m_settings["SSH:WarnedNoSFTP"]; } private void TestConnection_Click(object sender, EventArgs e) @@ -172,6 +184,42 @@ namespace Duplicati.GUI.Wizard_pages.Backends.SSH m_warnedPath = true; } + if (!m_warnedNoSCP) + { + ApplicationSettings appset = new ApplicationSettings(Program.DataConnection); + System.IO.FileInfo fi = null; + try { fi = new System.IO.FileInfo(System.Environment.ExpandEnvironmentVariables(appset.ScpPath)); } + catch { } + + if (fi == null || !fi.Exists) + { + if (MessageBox.Show(this, "Duplicati was unable to verify the existence of the scp program.\nscp may work regardless, if it is located in the system search path.\n\nDo you want to continue anyway?", Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning) != DialogResult.Yes) + { + return false; + } + + m_warnedNoSCP = true; + } + } + + if (!m_warnedNoSFTP) + { + ApplicationSettings appset = new ApplicationSettings(Program.DataConnection); + System.IO.FileInfo fi = null; + try { fi = new System.IO.FileInfo(System.Environment.ExpandEnvironmentVariables(appset.SFtpPath)); } + catch { } + + if (fi == null || !fi.Exists) + { + if (MessageBox.Show(this, "Duplicati was unable to verify the existence of the sftp program.\nscp may work regardless, if it is located in the system search path.\n\nDo you want to continue anyway?", Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning) != DialogResult.Yes) + { + return false; + } + + m_warnedNoSFTP = true; + } + } + return true; } diff --git a/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs b/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs index 7a477657a..318a769e5 100644 --- a/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs +++ b/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs @@ -109,7 +109,8 @@ namespace Duplicati.GUI.Wizard_pages this.ThreadPriority = schedule.Task.ThreadPriority; this.AsyncTransfer = schedule.Task.AsyncTransfer; this.EncodedFilters = schedule.Task.EncodedFilter; - + this.GPGEncryption = schedule.Task.GPGEncryption; + this.PrimayAction = action; } @@ -192,6 +193,7 @@ namespace Duplicati.GUI.Wizard_pages schedule.Task.ThreadPriority = this.ThreadPriority; schedule.Task.AsyncTransfer = this.AsyncTransfer; schedule.Task.EncodedFilter = this.EncodedFilters; + schedule.Task.GPGEncryption = this.GPGEncryption; } /// @@ -386,7 +388,7 @@ namespace Duplicati.GUI.Wizard_pages } /// - /// The size of each volume in the backup set + /// Allow async transfer of files /// public bool AsyncTransfer { @@ -457,6 +459,14 @@ namespace Duplicati.GUI.Wizard_pages set { SetItem("RestoreFileList:" + this.RestoreTime.ToString(), value); } } + /// + /// True if the GPG encryption method is enabled + /// + public bool GPGEncryption + { + get { return GetItem("GPGEncryption", false); } + set { SetItem("GPGEncryption", value); } + } } /// diff --git a/Duplicati/Library/Compression/Compression.cs b/Duplicati/Library/Compression/Compression.cs index dfc2ab275..378a793e3 100644 --- a/Duplicati/Library/Compression/Compression.cs +++ b/Duplicati/Library/Compression/Compression.cs @@ -23,87 +23,8 @@ using System.Text; namespace Duplicati.Library.Compression { - public class Compression : IDisposable + public class Compression { - private bool m_writing; - private ICSharpCode.SharpZipLib.Zip.ZipOutputStream m_zipfile; - private ICSharpCode.SharpZipLib.Zip.ZipEntryFactory m_zef; - private System.IO.FileStream m_filestream; - private string m_filename; - private string m_basename; - - public Compression(string basefolder, string zipfile) - { - m_basename = basefolder; - m_writing = true; - m_filename = zipfile; - m_filestream = System.IO.File.Create(zipfile); - m_zipfile = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(m_filestream); - m_zef = new ICSharpCode.SharpZipLib.Zip.ZipEntryFactory(); - m_zef.NameTransform = new ICSharpCode.SharpZipLib.Zip.ZipNameTransform(m_basename); - } - - public void AddFolder(string folder) - { - ICSharpCode.SharpZipLib.Zip.ZipEntry ze = m_zef.MakeDirectoryEntry(folder, true); - m_zipfile.PutNextEntry(ze); - } - - public long AddFile(string file) - { - if (!m_writing) - throw new InvalidOperationException("Cannot write to a file while reading it"); - - ICSharpCode.SharpZipLib.Zip.ZipEntry ze = m_zef.MakeFileEntry(file, true); - m_zipfile.PutNextEntry(ze); - - using(System.IO.FileStream fs = System.IO.File.OpenRead(file)) - Core.Utility.CopyStream(fs, m_zipfile); - - return new System.IO.FileInfo(m_filename).Length; - } - - public long Size - { - get - { - m_zipfile.Flush(); - return m_zipfile.Length; - } - } - - - public System.IO.Stream AddStream(string filename) - { - if (!m_writing) - throw new InvalidOperationException("Cannot write to a file while reading it"); - - - ICSharpCode.SharpZipLib.Zip.ZipEntry ze; - try - { - //This call breaks on long filenames... - ze = m_zef.MakeFileEntry(filename, true); - ze.DateTime = System.IO.File.GetLastWriteTime(filename); - } - catch(System.IO.PathTooLongException) - { - ze = new ICSharpCode.SharpZipLib.Zip.ZipEntry(m_zef.NameTransform.TransformFile(filename)); - //Does not work when the path is too long - //ze.DateTime = System.IO.File.GetLastWriteTime(filename); - } - - m_zipfile.PutNextEntry(ze); - return m_zipfile; - } - - public Compression(string zipfile) - { - m_writing = false; - m_filename = zipfile; - ICSharpCode.SharpZipLib.Zip.ZipFile zip = new ICSharpCode.SharpZipLib.Zip.ZipFile(zipfile); - } - /// /// Compresses a list of files into a single archive /// @@ -209,41 +130,5 @@ namespace Duplicati.Library.Compression return results; } - - public static List GetAllLines(string file, string path) - { - List res = new List(); - using (new Logging.Timer("GetAllLines " + file + ", path " + path + " (" + new System.IO.FileInfo(file).Length.ToString() + ")")) - { - ICSharpCode.SharpZipLib.Zip.ZipFile zip = new ICSharpCode.SharpZipLib.Zip.ZipFile(file); - ICSharpCode.SharpZipLib.Zip.ZipEntry ze = zip.GetEntry(path); - if (ze != null) - - using (System.IO.StreamReader sr = new System.IO.StreamReader(zip.GetInputStream(ze))) - while(!sr.EndOfStream) - res.Add(sr.ReadLine()); - - zip.Close(); - } - - return res; - } - - #region IDisposable Members - - public void Dispose() - { - try - { - if (m_zipfile != null) - m_zipfile.Close(); - m_zipfile = null; - } - catch - { - } - } - - #endregion } } diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 3250ac747..a5af2c1d7 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -17,7 +17,7 @@ full false bin\Debug\ - DEBUG;TRACE + TRACE;DEBUG prompt 4 @@ -40,6 +40,7 @@ + diff --git a/Duplicati/Library/Compression/FileArchiveZip.cs b/Duplicati/Library/Compression/FileArchiveZip.cs new file mode 100644 index 000000000..62828653b --- /dev/null +++ b/Duplicati/Library/Compression/FileArchiveZip.cs @@ -0,0 +1,366 @@ +using System; +using System.Collections.Generic; +using System.Text; + +//The compile flag SHARPZIPLIBWORKS can be set if #ZipLib is able to update archives without corrupting them + +namespace Duplicati.Library.Compression +{ + /// + /// An abstraction of a zip archive as a FileArchive. + /// Due to a very unfortunate Zip implementation, the archive is either read or write, never both + /// + public class FileArchiveZip : Core.IFileArchive + { + /// + /// The archive used for read access + /// + private ICSharpCode.SharpZipLib.Zip.ZipFile m_zip; +#if !SHARPZIPLIBWORKS + private ICSharpCode.SharpZipLib.Zip.ZipOutputStream m_stream; + private FileArchiveZip(ICSharpCode.SharpZipLib.Zip.ZipOutputStream stream) + { + m_stream = stream; + } +#endif + + + public static FileArchiveZip CreateArchive(string filename) + { +#if SHARPZIPLIBWORKS + FileArchiveZip z = new FileArchiveZip(ICSharpCode.SharpZipLib.Zip.ZipFile.Create(filename)); + z.m_zip.BeginUpdate(); + return z; +#else + return new FileArchiveZip(new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(System.IO.File.Create(filename))); +#endif + } + + private FileArchiveZip(ICSharpCode.SharpZipLib.Zip.ZipFile zip) + { + m_zip = zip; + } + + public FileArchiveZip(string file) + : this(new ICSharpCode.SharpZipLib.Zip.ZipFile(file)) + { + } + + private string PathToFilesystem(string path) + { + if (System.IO.Path.DirectorySeparatorChar != '/') + return path.Replace('/', System.IO.Path.DirectorySeparatorChar); + else + return path; + } + + private string PathFromFilesystem(string path) + { + if (System.IO.Path.DirectorySeparatorChar != '/') + return path.Replace(System.IO.Path.DirectorySeparatorChar, '/'); + else + return path; + } + + #region IFileArchive Members + + public string[] ListFiles(string prefix) + { +#if !SHARPZIPLIBWORKS + if (m_zip == null) + throw new Exception("Cannot read data while writing"); +#endif + List results = new List(); + foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry ze in m_zip) + { + string name = PathToFilesystem(ze.Name); + if (prefix == null || name.StartsWith(prefix)) + { + if (!ze.IsDirectory) + results.Add(name); + } + } + + return results.ToArray(); + } + + public string[] ListDirectories(string prefix) + { +#if !SHARPZIPLIBWORKS + if (m_zip == null) + throw new Exception("Cannot read data while writing"); +#endif + + List results = new List(); + foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry ze in m_zip) + { + string name = PathToFilesystem(ze.Name); + if (prefix == null || name.StartsWith(prefix)) + { + if (ze.IsDirectory) + results.Add(Core.Utility.AppendDirSeperator(name)); + } + } + + return results.ToArray(); + } + + public string[] ListEntries(string prefix) + { +#if !SHARPZIPLIBWORKS + if (m_zip == null) + throw new Exception("Cannot read data while writing"); +#endif + + List results = new List(); + foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry ze in m_zip) + { + string name = PathToFilesystem(ze.Name); + if (prefix == null || name.StartsWith(prefix)) + { + if (ze.IsDirectory) + results.Add(Core.Utility.AppendDirSeperator(name)); + else + results.Add(name); + } + } + + return results.ToArray(); + } + + public byte[] ReadAllBytes(string file) + { + using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) + using(System.IO.Stream s = OpenRead(file)) + { + Core.Utility.CopyStream(s, ms); + return ms.ToArray(); + } + } + + public string[] ReadAllLines(string file) + { + List lines = new List(); + using (System.IO.StreamReader sr = new System.IO.StreamReader(OpenRead(file))) + while (!sr.EndOfStream) + lines.Add(sr.ReadLine()); + return lines.ToArray(); + } + + public System.IO.Stream OpenRead(string file) + { +#if !SHARPZIPLIBWORKS + if (m_zip == null) + throw new Exception("Cannot read data while writing"); +#endif + + ICSharpCode.SharpZipLib.Zip.ZipEntry ze = GetEntry(file); + + if (ze == null) + return null; + else + return m_zip.GetInputStream(ze); + } + + public System.IO.Stream OpenWrite(string file) + { + return CreateFile(file); + } + + public void WriteAllBytes(string file, byte[] data) + { + using (System.IO.Stream s = CreateFile(file)) + s.Write(data, 0, data.Length); + } + + public void WriteAllLines(string file, string[] data) + { + using (System.IO.StreamWriter sw = new System.IO.StreamWriter(CreateFile(file))) + foreach (string s in data) + sw.WriteLine(s); + } + + private ICSharpCode.SharpZipLib.Zip.ZipEntry GetEntry(string file) + { + ICSharpCode.SharpZipLib.Zip.ZipEntry ze = m_zip.GetEntry(PathFromFilesystem(file)); + + if (ze == null) //Grrr... The zip library has a pretty relaxed take on seperators + ze = m_zip.GetEntry(PathToFilesystem(file)); + + return ze; + } + + public void DeleteFile(string file) + { +#if !SHARPZIPLIBWORKS + throw new MissingMethodException("Zip does not support deleting"); +#else + if (FileExists(file)) + m_zip.Delete(GetEntry(file)); +#endif + + } + + public System.IO.Stream CreateFile(string file) + { +#if !SHARPZIPLIBWORKS + if (m_stream == null) + throw new Exception("Cannot write while reading"); +#endif + +#if SHARPZIPLIBWORKS + if (FileExists(file)) + DeleteFile(file); + + return new StreamWrapper(new Duplicati.Library.Core.TempFile(), PathFromFilesystem(file), m_zip); +#else + m_stream.PutNextEntry(new ICSharpCode.SharpZipLib.Zip.ZipEntry(PathFromFilesystem(file))); + return new StreamWrapper2(m_stream); +#endif + } + + public void DeleteDirectory(string file) + { +#if SHARPZIPLIBWORKS + if (DirectoryExists(file)) + m_zip.Delete(GetEntry(file)); +#else + throw new MissingMethodException("Zip does not support deleting"); +#endif + } + + public void AddDirectory(string file) + { +#if !SHARPZIPLIBWORKS + if (m_stream == null) + throw new Exception("Cannot write while reading"); +#endif + m_zip.AddDirectory(PathFromFilesystem(file)); + } + + public bool FileExists(string file) + { +#if !SHARPZIPLIBWORKS + if (m_zip == null) + throw new Exception("Cannot read data while writing"); +#endif + return GetEntry(file) != null && GetEntry(file).IsFile; + } + + public bool DirectoryExists(string file) + { +#if !SHARPZIPLIBWORKS + if (m_zip == null) + throw new Exception("Cannot read data while writing"); +#endif + return GetEntry(file) != null && GetEntry(file).IsDirectory; + } + + public long Size + { + get + { +#if !SHARPZIPLIBWORKS + if (m_zip == null) + { + m_stream.Flush(); + return m_stream.Length; + } + else +#endif + return new System.IO.FileInfo(m_zip.Name).Length; + } + } + + #endregion + + #region IDisposable Members + + public void Dispose() + { + if (m_zip != null) + { + if (m_zip.IsUpdating) + m_zip.CommitUpdate(); + m_zip.Close(); + +#if SHARPZIPLIBWORKS + //This breaks, because the updates are not flushed correctly + m_zip = new ICSharpCode.SharpZipLib.Zip.ZipFile(m_zip.Name); + m_zip.Close(); +#endif + } + m_zip = null; + +#if !SHARPZIPLIBWORKS + if (m_stream != null) + { + m_stream.Flush(); + m_stream.Finish(); + m_stream.Close(); + } +#endif + } + + #endregion + +#if !SHARPZIPLIBWORKS + + private class StreamWrapper2 : Core.OverrideableStream + { + public StreamWrapper2(System.IO.Stream stream) + : base(stream) + { + } + + protected override void Dispose(bool disposing) + { + ((ICSharpCode.SharpZipLib.Zip.ZipOutputStream)m_basestream).CloseEntry(); + //Don't dispose the stream! + //base.Dispose(disposing); + } + } +#else + + private class StreamWrapper : Core.OverrideableStream, ICSharpCode.SharpZipLib.Zip.IStaticDataSource + { + private ICSharpCode.SharpZipLib.Zip.ZipFile m_zip; + private string m_filename; + private Core.TempFile m_file; + + public StreamWrapper(Core.TempFile file, string filename, ICSharpCode.SharpZipLib.Zip.ZipFile zip) + : base(System.IO.File.Create(file)) + { + m_file = file; + m_zip = zip; + m_filename = filename; + } + + protected override void Dispose(bool disposing) + { + if (m_zip != null) + { + m_basestream.Flush(); + m_basestream.Position = 0; + + if (!m_zip.IsUpdating) + m_zip.BeginUpdate(); + m_zip.Add(this, m_filename); + m_file.Dispose(); + } + m_zip = null; + base.Dispose(disposing); + } + + #region IStaticDataSource Members + + public System.IO.Stream GetSource() + { + return m_basestream; + } + + #endregion + } +#endif + } +} diff --git a/Duplicati/Library/Core/Duplicati.Library.Core.csproj b/Duplicati/Library/Core/Duplicati.Library.Core.csproj index 8a87a8901..77b4f7d95 100644 --- a/Duplicati/Library/Core/Duplicati.Library.Core.csproj +++ b/Duplicati/Library/Core/Duplicati.Library.Core.csproj @@ -35,8 +35,11 @@ + + + diff --git a/Duplicati/Library/Core/FileArchiveDirectory.cs b/Duplicati/Library/Core/FileArchiveDirectory.cs new file mode 100644 index 000000000..9f4c6a5e1 --- /dev/null +++ b/Duplicati/Library/Core/FileArchiveDirectory.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Duplicati.Library.Core +{ + public class FileArchiveDirectory : IFileArchive + { + string m_folder; + + public FileArchiveDirectory(string basefolder) + { + m_folder = Utility.AppendDirSeperator(basefolder); + } + + #region IFileArchive Members + + public string[] ListFiles(string prefix) + { + if (prefix == null) prefix = ""; + return Utility.EnumerateFiles(System.IO.Path.Combine(m_folder, prefix)).ToArray(); + } + + public string[] ListDirectories(string prefix) + { + if (prefix == null) prefix = ""; + return Utility.EnumerateFolders(System.IO.Path.Combine(m_folder, prefix)).ToArray(); + } + + public string[] ListEntries(string prefix) + { + if (prefix == null) prefix = ""; + return Utility.EnumerateFileSystemEntries(System.IO.Path.Combine(m_folder, prefix)).ToArray(); + } + + public byte[] ReadAllBytes(string file) + { + return System.IO.File.ReadAllBytes(System.IO.Path.Combine(m_folder, file)); + } + + public string[] ReadAllLines(string file) + { + return System.IO.File.ReadAllLines(System.IO.Path.Combine(m_folder, file)); + } + + public System.IO.Stream OpenRead(string file) + { + return System.IO.File.OpenRead(System.IO.Path.Combine(m_folder, file)); + } + + public System.IO.Stream OpenWrite(string file) + { + return System.IO.File.OpenWrite(System.IO.Path.Combine(m_folder, file)); + } + + public void WriteAllBytes(string file, byte[] data) + { + System.IO.File.WriteAllBytes(System.IO.Path.Combine(m_folder, file), data); + } + + public void WriteAllLines(string file, string[] data) + { + System.IO.File.WriteAllLines(System.IO.Path.Combine(m_folder, file), data); + } + + public void DeleteFile(string file) + { + System.IO.File.Delete(System.IO.Path.Combine(m_folder, file)); + } + + public System.IO.Stream CreateFile(string file) + { + return System.IO.File.Create(System.IO.Path.Combine(m_folder, file)); + } + + public void DeleteDirectory(string file) + { + System.IO.Directory.Delete(System.IO.Path.Combine(m_folder, file), false); + } + + public void AddDirectory(string file) + { + System.IO.Directory.CreateDirectory(System.IO.Path.Combine(m_folder, file)); + } + + public bool FileExists(string file) + { + return System.IO.File.Exists(System.IO.Path.Combine(m_folder, file)); + } + + public bool DirectoryExists(string file) + { + return System.IO.Directory.Exists(System.IO.Path.Combine(m_folder, file)); + } + + public long Size + { + get + { + //TODO: Much faster with a callback + long size = 0; + foreach (string s in Core.Utility.EnumerateFiles(m_folder)) + size += new System.IO.FileInfo(s).Length; + + return size; + } + } + + #endregion + + #region IDisposable Members + + public void Dispose() + { + m_folder = null; + } + + #endregion + } +} diff --git a/Duplicati/Library/Core/IFileArchive.cs b/Duplicati/Library/Core/IFileArchive.cs new file mode 100644 index 000000000..19748ad40 --- /dev/null +++ b/Duplicati/Library/Core/IFileArchive.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Duplicati.Library.Core +{ + /// + /// An interface for accessing files in an archive, such as a folder or compressed file + /// + public interface IFileArchive : IDisposable + { + /// + /// Returns all files in the archive, matching the prefix, if any. + /// + /// An optional prefix for limiting the files returned + /// All files in the archive, matching the prefix, if any + string[] ListFiles(string prefix); + /// + /// Returns all directories in the archive, matching the prefix, if any. + /// + /// An optional prefix for limiting the directories returned + /// All directories in the archive, matching the prefix, if any + string[] ListDirectories(string prefix); + /// + /// Returns all files and directories in the archive, matching the prefix, if any. + /// + /// An optional prefix for limiting the files and directories returned + /// All files and directories in the archive, matching the prefix, if any + string[] ListEntries(string prefix); + + /// + /// Returns all the bytes from a given file + /// + /// The file to read data from + /// All bytes from the given file + byte[] ReadAllBytes(string file); + /// + /// Returns all lines in the given file + /// + /// The file to read the data from + /// All lines in the given file + string[] ReadAllLines(string file); + /// + /// Returns a stream with data from the given file + /// + /// The file to read the data from + /// A stream with data from the given file + System.IO.Stream OpenRead(string file); + + /// + /// Returns a stream with data from the given file + /// + /// The file to write the data to + /// A stream with data from the given file + System.IO.Stream OpenWrite(string file); + + /// + /// Writes data to a file + /// + /// The file to write to + /// The data to write + void WriteAllBytes(string file, byte[] data); + /// + /// Writes the given lines to the files + /// + /// The file to write to + /// The data to write + void WriteAllLines(string file, string[] data); + + /// + /// Removes a file from the archive + /// + /// The file to remove + void DeleteFile(string file); + /// + /// Creates a file in the archive + /// + /// The file to create + /// A stream with the data to write into the file + System.IO.Stream CreateFile(string file); + + /// + /// Deletes the named directory, if it is empty + /// + /// The directory to remove + void DeleteDirectory(string file); + + /// + /// Adds a directory to the archive + /// + /// The name of the archive to create + void AddDirectory(string file); + + /// + /// Returns a value indicating if the specified file exists + /// + /// The name of the file to examine + /// True if the file exists, false otherwise + bool FileExists(string file); + + /// + /// Returns a value indicating if the specified directory exists + /// + /// The name of the directory to examine + /// True if the directory exists, false otherwise + bool DirectoryExists(string file); + + /// + /// The total size of the archive + /// + long Size { get; } + } +} diff --git a/Duplicati/Library/Core/OverrideableStream.cs b/Duplicati/Library/Core/OverrideableStream.cs new file mode 100644 index 000000000..ce92c4a67 --- /dev/null +++ b/Duplicati/Library/Core/OverrideableStream.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace Duplicati.Library.Core +{ + /// + /// This class is a wrapper for a stream. + /// It's only purpose is to free other wrappers from implementing the boilerplate functions, + /// and allow the derived classes to override single functions. + /// + public class OverrideableStream : Stream + { + protected System.IO.Stream m_basestream; + + public OverrideableStream(Stream basestream) + { + if (basestream == null) + throw new ArgumentNullException("basestream"); + m_basestream = basestream; + } + + public override bool CanRead + { + get { return m_basestream.CanRead; } + } + + public override bool CanSeek + { + get { return m_basestream.CanSeek; } + } + + public override bool CanWrite + { + get { return m_basestream.CanWrite; } + } + + public override void Flush() + { + m_basestream.Flush(); + } + + public override long Length + { + get { return m_basestream.Length; } + } + + public override long Position + { + get + { + return m_basestream.Position; + } + set + { + m_basestream.Position = value; + } + } + + public override int Read(byte[] buffer, int offset, int count) + { + return m_basestream.Read(buffer, offset, count); + } + + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + return m_basestream.Seek(offset, origin); + } + + public override void SetLength(long value) + { + m_basestream.SetLength(value); + } + + public override void Write(byte[] buffer, int offset, int count) + { + m_basestream.Write(buffer, offset, count); + } + + protected override void Dispose(bool disposing) + { + if (m_basestream != null) + m_basestream.Dispose(); + m_basestream = null; + base.Dispose(disposing); + } + + } +} diff --git a/Duplicati/Library/Core/ThrottledStream.cs b/Duplicati/Library/Core/ThrottledStream.cs index 673942c5d..82c930ffe 100644 --- a/Duplicati/Library/Core/ThrottledStream.cs +++ b/Duplicati/Library/Core/ThrottledStream.cs @@ -12,12 +12,8 @@ namespace Duplicati.Library.Core /// This class throttles the rate data can be read or written to the underlying stream. /// This creates a bandwith throttle option for any stream, including a network stream. /// - public class ThrottledStream : Stream + public class ThrottledStream : OverrideableStream { - /// - /// The stream being throttled - /// - private Stream m_basestream; /// /// The max number of bytes pr. second to write /// @@ -64,10 +60,8 @@ namespace Duplicati.Library.Core /// The maximum number of bytes pr. second to read. Specify a number less than 1 to allow unlimited speed. /// The maximum number of bytes pr. second to write. Specify a number less than 1 to allow unlimited speed. public ThrottledStream(Stream basestream, long readspeed, long writespeed) + : base(basestream) { - if (basestream == null) - throw new NullReferenceException("basestream"); - m_basestream = basestream; m_readspeed = readspeed; m_writespeed = writespeed; @@ -77,43 +71,6 @@ namespace Duplicati.Library.Core m_datawritten = new List>(); } - public override bool CanRead - { - get { return m_basestream.CanRead; } - } - - public override bool CanSeek - { - get { return m_basestream.CanSeek; } - } - - public override bool CanWrite - { - get { return m_basestream.CanWrite; } - } - - public override void Flush() - { - m_basestream.Flush(); - } - - public override long Length - { - get { return m_basestream.Length; } - } - - public override long Position - { - get - { - return m_basestream.Position; - } - set - { - m_basestream.Position = value; - } - } - public override int Read(byte[] buffer, int offset, int count) { int bytesRead = DelayIfRequired(true, buffer, ref offset, ref count); @@ -123,16 +80,6 @@ namespace Duplicati.Library.Core return m_basestream.Read(buffer, offset, count) + bytesRead; } - public override long Seek(long offset, System.IO.SeekOrigin origin) - { - return m_basestream.Seek(offset, origin); - } - - public override void SetLength(long value) - { - m_basestream.SetLength(value); - } - public override void Write(byte[] buffer, int offset, int count) { DelayIfRequired(true, buffer, ref offset, ref count); diff --git a/Duplicati/Library/Encryption/CryptoStreamWrapper.cs b/Duplicati/Library/Encryption/CryptoStreamWrapper.cs index a0a5d5024..4c4df5fe9 100644 --- a/Duplicati/Library/Encryption/CryptoStreamWrapper.cs +++ b/Duplicati/Library/Encryption/CryptoStreamWrapper.cs @@ -5,85 +5,23 @@ using System.IO; namespace Duplicati.Library.Encryption { - internal class CryptoStreamWrapper : Stream + internal class CryptoStreamWrapper : Core.OverrideableStream { private bool m_hasFlushed = false; - private System.Security.Cryptography.CryptoStream m_basestream; /// /// Wraps a crypto stream, ensuring that it is correctly disposed /// /// The stream to wrape public CryptoStreamWrapper(System.Security.Cryptography.CryptoStream basestream) + : base(basestream) { - if (basestream == null) - throw new NullReferenceException("basestream"); - m_basestream = basestream; } - - public override bool CanRead - { - get { return m_basestream.CanRead; } - } - - public override bool CanSeek - { - get { return m_basestream.CanSeek; } - } - - public override bool CanWrite - { - get { return m_basestream.CanWrite; } - } - - public override void Flush() - { - m_basestream.Flush(); - } - - public override long Length - { - get { return m_basestream.Length; } - } - - public override long Position - { - get - { - return m_basestream.Position; - } - set - { - m_basestream.Position = value; - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - return m_basestream.Read(buffer, offset, count); - } - - public override long Seek(long offset, System.IO.SeekOrigin origin) - { - return m_basestream.Seek(offset, origin); - } - - public override void SetLength(long value) - { - m_basestream.SetLength(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - m_basestream.Write(buffer, offset, count); - } - protected override void Dispose(bool disposing) { - //This is actually the only thing we want to wrap :( if (!m_hasFlushed && m_basestream.CanWrite) { - m_basestream.FlushFinalBlock(); + ((System.Security.Cryptography.CryptoStream)m_basestream).FlushFinalBlock(); m_hasFlushed = true; } diff --git a/Duplicati/Library/Encryption/EncryptedBackendWrapper.cs b/Duplicati/Library/Encryption/EncryptedBackendWrapper.cs index f8b54a9aa..71e8259c9 100644 --- a/Duplicati/Library/Encryption/EncryptedBackendWrapper.cs +++ b/Duplicati/Library/Encryption/EncryptedBackendWrapper.cs @@ -45,7 +45,11 @@ namespace Duplicati.Library.Encryption m_realbackend = backend; if (options.ContainsKey("gpg-encryption")) + { + if (options.ContainsKey("gpg-program-path")) + GPGEncryption.PGP_PROGRAM = options["gpg-program-path"]; m_encryptionEngine = new GPGEncryption(passphrase, options.ContainsKey("sign-key") ? options["sign-key"] : null); + } else m_encryptionEngine = new AESEncryption(passphrase); } diff --git a/Duplicati/Library/Encryption/GPGStreamWrapper.cs b/Duplicati/Library/Encryption/GPGStreamWrapper.cs index 44099ea50..f150d1c5f 100644 --- a/Duplicati/Library/Encryption/GPGStreamWrapper.cs +++ b/Duplicati/Library/Encryption/GPGStreamWrapper.cs @@ -5,17 +5,17 @@ using System.IO; namespace Duplicati.Library.Encryption { - internal class GPGStreamWrapper : Stream + internal class GPGStreamWrapper : Core.OverrideableStream { private System.Diagnostics.Process m_p; private System.Threading.Thread m_t; - private Stream m_basestream; /// /// Wraps a crypto stream, ensuring that it is correctly disposed /// /// The stream to wrape public GPGStreamWrapper(System.Diagnostics.Process p, System.Threading.Thread t, Stream basestream) + : base(basestream) { if (p == null) throw new NullReferenceException("p"); @@ -24,69 +24,10 @@ namespace Duplicati.Library.Encryption m_p = p; m_t = t; - m_basestream = basestream; - } - - public override bool CanRead - { - get { return m_basestream.CanRead; } - } - - public override bool CanSeek - { - get { return m_basestream.CanSeek; } - } - - public override bool CanWrite - { - get { return m_basestream.CanWrite; } - } - - public override void Flush() - { - m_basestream.Flush(); - } - - public override long Length - { - get { return m_basestream.Length; } - } - - public override long Position - { - get - { - return m_basestream.Position; - } - set - { - m_basestream.Position = value; - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - return m_basestream.Read(buffer, offset, count); - } - - public override long Seek(long offset, System.IO.SeekOrigin origin) - { - return m_basestream.Seek(offset, origin); - } - - public override void SetLength(long value) - { - m_basestream.SetLength(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - m_basestream.Write(buffer, offset, count); } protected override void Dispose(bool disposing) { - //This is actually the only thing we want to wrap :( if (m_p != null) { m_basestream.Close(); diff --git a/Duplicati/Library/Main/Interface.cs b/Duplicati/Library/Main/Interface.cs index 1a009d534..49e098996 100644 --- a/Duplicati/Library/Main/Interface.cs +++ b/Duplicati/Library/Main/Interface.cs @@ -40,6 +40,12 @@ namespace Duplicati.Library.Main Core.FilenameFilter filter = new Duplicati.Library.Core.FilenameFilter(options); bool full = options.ContainsKey("full"); + int volumesize = (int)Core.Sizeparser.ParseSize(options.ContainsKey("volsize") ? options["volsize"] : "5", "mb"); + volumesize = Math.Max(1024 * 1024, volumesize); + + long totalmax = options.ContainsKey("totalsize") ? Core.Sizeparser.ParseSize(options["totalsize"], "mb") : long.MaxValue; + totalmax = Math.Max(volumesize, totalmax); + backend = Backend.BackendLoader.GetBackend(target, options); if (backend == null) throw new Exception("Unable to find backend for target: " + target); @@ -54,50 +60,34 @@ namespace Duplicati.Library.Main if (!full && options.ContainsKey("full-if-older-than")) full = DateTime.Now > Core.Timeparser.ParseTimeInterval(options["full-if-older-than"], prev[prev.Count - 1].Time); - //TODO: Empty folder creation takes up too much of the processing time - using (Core.TempFolder basefolder = new Duplicati.Library.Core.TempFolder()) + using (Core.TempFolder tempfolder = new Duplicati.Library.Core.TempFolder()) { + List patches = new List(); if (!full) { using (new Logging.Timer("Reading incremental data")) { - foreach (BackupEntry be in prev[prev.Count - 1].SignatureFile) - using (Core.TempFile t = new Duplicati.Library.Core.TempFile()) - { - using (new Logging.Timer("Get " + be.Filename)) - backend.Get(be.Filename, t); - Compression.Compression.Decompress(t, basefolder); - } + List entries = new List(); + entries.Add(prev[prev.Count - 1]); + entries.AddRange(prev[prev.Count - 1].Incrementals); - foreach (BackupEntry be in prev[prev.Count - 1].Incrementals) + foreach (BackupEntry be in entries) foreach (BackupEntry bes in be.SignatureFile) - using (Core.TempFile t = new Duplicati.Library.Core.TempFile()) - { - using (new Logging.Timer("Get " + bes.Filename)) - backend.Get(bes.Filename, t); - - using (Core.TempFolder tf = new Duplicati.Library.Core.TempFolder()) - { - Compression.Compression.Decompress(t, tf); - using (new Logging.Timer("Full signature merge")) - Main.RSync.RSyncDir.MergeSignatures(basefolder, tf); - } - } + { + string filename = System.IO.Path.Combine(tempfolder, "patch-" + patches.Count.ToString() + ".zip"); + using (new Logging.Timer("Get " + bes.Filename)) + backend.Get(bes.Filename, filename); + patches.Add(new Compression.FileArchiveZip(filename)); + } } } DateTime backuptime = DateTime.Now; - using (RSync.RSyncDir dir = new Duplicati.Library.Main.RSync.RSyncDir(source, basefolder, bs)) + using (RSync.RSyncDir dir = new Duplicati.Library.Main.RSync.RSyncDir(source, bs, patches)) { using (new Logging.Timer("Initiating multipass")) dir.InitiateMultiPassDiff(full, filter); - int volumesize = (int)Core.Sizeparser.ParseSize(options.ContainsKey("volsize") ? options["volsize"] : "5", "mb"); - volumesize = Math.Max(1024 * 1024, volumesize); - - long totalmax = options.ContainsKey("totalsize") ? Core.Sizeparser.ParseSize(options["totalsize"], "mb") : long.MaxValue; - totalmax = Math.Max(volumesize, totalmax); - int vol = 0; long totalsize = 0; @@ -109,65 +99,61 @@ namespace Duplicati.Library.Main { using (new Logging.Timer("Multipass " + (vol + 1).ToString())) { - using (Core.TempFile sigzip = new Duplicati.Library.Core.TempFile()) + //The backendwrapper will remove these + Core.TempFile signaturefile = new Duplicati.Library.Core.TempFile(); + Core.TempFile contentfile = new Duplicati.Library.Core.TempFile(); + + signaturefile.Protected = true; + contentfile.Protected = true; + + using (Compression.FileArchiveZip signaturearchive = Duplicati.Library.Compression.FileArchiveZip.CreateArchive(signaturefile)) + using (Compression.FileArchiveZip contentarchive = Duplicati.Library.Compression.FileArchiveZip.CreateArchive(contentfile)) { - using (Compression.Compression signature = new Duplicati.Library.Compression.Compression(dir.m_targetfolder, sigzip)) - { - using (Core.TempFile zf = new Duplicati.Library.Core.TempFile()) - { - done = dir.MakeMultiPassDiff(signature, zf, volumesize); - totalsize += new System.IO.FileInfo(zf).Length; - contenthashes.Add(Core.Utility.CalculateHash(zf)); - using (new Logging.Timer("Writing delta file " + (vol + 1).ToString())) - backend.Put(fns.GenerateFilename(BackupEntry.EntryType.Content, full, backuptime, vol + 1) + ".zip", zf); - - //The backendwrapper will remove it - zf.Protected = true; - } + done = dir.MakeMultiPassDiff(signaturearchive, contentarchive, Math.Min(volumesize, totalmax - totalsize)); + totalsize += new System.IO.FileInfo(contentfile).Length; - totalsize += signature.Size; + totalsize += signaturearchive.Size; - if (totalsize >= totalmax) - dir.FinalizeMultiPass(signature); - } - - signaturehashes.Add(Core.Utility.CalculateHash(sigzip)); - - - using (new Logging.Timer("Writing remote signatures")) - backend.Put(fns.GenerateFilename(BackupEntry.EntryType.Signature, full, backuptime, vol + 1) + ".zip", sigzip); - - //The backendwrapper will remove it - sigzip.Protected = true; + if (totalsize >= totalmax) + dir.FinalizeMultiPass(signaturearchive, contentarchive); } + - using (Core.TempFile mf = new Duplicati.Library.Core.TempFile()) - using (new Logging.Timer("Writing manifest")) - { - System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); - System.Xml.XmlNode root = doc.AppendChild(doc.CreateElement("Manifest")); - root.Attributes.Append(doc.CreateAttribute("version")).Value = "1"; - root.AppendChild(doc.CreateElement("VolumeCount")).InnerText = (vol + 1).ToString(); - System.Xml.XmlNode contentroot = root.AppendChild(doc.CreateElement("ContentFiles")); - System.Xml.XmlNode signatureroot = root.AppendChild(doc.CreateElement("SignatureFiles")); - - foreach (string s in contenthashes) - contentroot.AppendChild(doc.CreateElement("Hash")).InnerText = s; - foreach (string s in signaturehashes) - signatureroot.AppendChild(doc.CreateElement("Hash")).InnerText = s; - - //TODO: Actually read the manifest on restore - doc.Save(mf); - - backend.Put(fns.GenerateFilename(BackupEntry.EntryType.Manifest, full, backuptime) + ".manifest", mf); - - //The backendwrapper will remove it - mf.Protected = true; - } - - vol++; + contenthashes.Add(Core.Utility.CalculateHash(contentfile)); + using (new Logging.Timer("Writing delta file " + (vol + 1).ToString())) + backend.Put(fns.GenerateFilename(BackupEntry.EntryType.Content, full, backuptime, vol + 1) + ".zip", contentfile); + signaturehashes.Add(Core.Utility.CalculateHash(signaturefile)); + using (new Logging.Timer("Writing remote signatures")) + backend.Put(fns.GenerateFilename(BackupEntry.EntryType.Signature, full, backuptime, vol + 1) + ".zip", signaturefile); } + + //The backend wrapper will remove this + Core.TempFile mf = new Duplicati.Library.Core.TempFile(); + mf.Protected = true; + + using (new Logging.Timer("Writing manifest")) + { + System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); + System.Xml.XmlNode root = doc.AppendChild(doc.CreateElement("Manifest")); + root.Attributes.Append(doc.CreateAttribute("version")).Value = "1"; + root.AppendChild(doc.CreateElement("VolumeCount")).InnerText = (vol + 1).ToString(); + System.Xml.XmlNode contentroot = root.AppendChild(doc.CreateElement("ContentFiles")); + System.Xml.XmlNode signatureroot = root.AppendChild(doc.CreateElement("SignatureFiles")); + + foreach (string s in contenthashes) + contentroot.AppendChild(doc.CreateElement("Hash")).InnerText = s; + foreach (string s in signaturehashes) + signatureroot.AppendChild(doc.CreateElement("Hash")).InnerText = s; + + //TODO: Actually read the manifest on restore + doc.Save(mf); + + backend.Put(fns.GenerateFilename(BackupEntry.EntryType.Manifest, full, backuptime) + ".manifest", mf); + } + + vol++; + } } } @@ -207,76 +193,33 @@ namespace Duplicati.Library.Main if (bestFit.EncryptionMode != null) backend = Encryption.EncryptedBackendWrapper.WrapWithEncryption(backend, bestFit.EncryptionMode, options); - using (Core.TempFolder basefolder = new Duplicati.Library.Core.TempFolder()) + List entries = new List(); + entries.Add(bestFit); + entries.AddRange(bestFit.Incrementals); + int patchno = 0; + + using (RSync.RSyncDir sync = new Duplicati.Library.Main.RSync.RSyncDir(target, rs)) { - foreach (BackupEntry be in bestFit.SignatureFile) - using (Core.TempFile basezip = new Duplicati.Library.Core.TempFile()) - { - if (be.CompressionMode != "zip") - throw new Exception("Unexpected compression mode"); - - using (new Logging.Timer("Get " + be.Filename)) - backend.Get(be.Filename, basezip); - - Compression.Compression.Decompress(basezip, basefolder); - } - - foreach (BackupEntry vol in bestFit.ContentVolumes) - using (Core.TempFile basezip = new Duplicati.Library.Core.TempFile()) + foreach (BackupEntry be in entries) + { + //Patch with last volume first, as that has the file/folder lists + be.ContentVolumes.Reverse(); + foreach (BackupEntry vol in be.ContentVolumes) { if (vol.CompressionMode != "zip") throw new Exception("Unexpected compression mode"); - using (new Logging.Timer("Get " + vol.Filename)) - backend.Get(vol.Filename, basezip); - - Compression.Compression.Decompress(basezip, basefolder); - } - - using (RSync.RSyncDir sync = new Duplicati.Library.Main.RSync.RSyncDir(target, basefolder, rs)) - { - - using (new Logging.Timer("Full restore to " + target)) - sync.Restore(target, new List()); - - foreach (BackupEntry p in bestFit.Incrementals) - { - if (p.SignatureFile.Count == 0 || p.ContentVolumes.Count == 0) - throw new Exception("Unable to parse filenames for the volume: " + p.Filename); - - using (Core.TempFolder t = new Duplicati.Library.Core.TempFolder()) + using (Core.TempFile patchzip = new Duplicati.Library.Core.TempFile()) { - foreach (BackupEntry be in p.SignatureFile) - using (Core.TempFile patchzip = new Duplicati.Library.Core.TempFile()) - { - if (be.CompressionMode != "zip") - throw new Exception("Unexpected compression mode"); - - using (new Logging.Timer("Get " + be.Filename)) - backend.Get(be.Filename, patchzip); - - Compression.Compression.Decompress(patchzip, t); - } - - foreach (BackupEntry vol in p.ContentVolumes) - using (Core.TempFile patchzip = new Duplicati.Library.Core.TempFile()) - { - if (vol.CompressionMode != "zip") - throw new Exception("Unexpected compression mode"); - - using (new Logging.Timer("Get " + vol.Filename)) - backend.Get(vol.Filename, patchzip); - - Compression.Compression.Decompress(patchzip, t); - } - - using (new Logging.Timer("Incremental patch " + p.Time.ToString())) - sync.Patch(target, t); + using (new Logging.Timer("Get " + vol.Filename)) + backend.Get(vol.Filename, patchzip); + using (new Logging.Timer((patchno == 0 ? "Full restore to: " : "Incremental restore " + patchno.ToString() + " to: ") + target)) + sync.Patch(target, new Compression.FileArchiveZip(patchzip)); } + patchno++; } } - } } finally @@ -554,26 +497,11 @@ namespace Duplicati.Library.Main using (backend) using (Core.TempFolder basefolder = new Duplicati.Library.Core.TempFolder()) { - foreach (BackupEntry be in bestFit.SignatureFile) - using (Core.TempFile basezip = new Duplicati.Library.Core.TempFile()) - { - if (be.CompressionMode != "zip") - throw new Exception("Unexpected compression mode"); + List entries = new List(); + entries.Add(bestFit); + entries.AddRange(bestFit.Incrementals); - using (new Logging.Timer("Get " + be.Filename)) - backend.Get(be.Filename, basezip); - - foreach (string s in Compression.Compression.ListFiles(basezip)) - if (s.StartsWith(RSync.RSyncDir.SIGNATURE_ROOT)) - res[s.Substring(RSync.RSyncDir.SIGNATURE_ROOT.Length + 1)] = null; - - foreach (string s in Compression.Compression.GetAllLines(basezip, RSync.RSyncDir.ADDED_FOLDERS)) - res[NormalizeZipDirName(s)] = null; - - //No deleted files or folders are possible here - } - - foreach (BackupEntry p in bestFit.Incrementals) + foreach (BackupEntry p in entries) { if (p.SignatureFile.Count == 0) throw new Exception("Unable to parse filenames for the volume: " + p.Filename); @@ -589,21 +517,24 @@ namespace Duplicati.Library.Main using (new Logging.Timer("Get " + be.Filename)) backend.Get(be.Filename, patchzip); + Core.IFileArchive archive = new Compression.FileArchiveZip(patchzip); - foreach (string s in Compression.Compression.GetAllLines(patchzip, RSync.RSyncDir.DELETED_FOLDERS)) - if (res.ContainsKey(NormalizeZipDirName(s))) - res.Remove(NormalizeZipDirName(s)); + if (archive.FileExists(RSync.RSyncDir.DELETED_FOLDERS)) + foreach (string s in archive.ReadAllLines(RSync.RSyncDir.DELETED_FOLDERS)) + if (res.ContainsKey(NormalizeZipDirName(s))) + res.Remove(NormalizeZipDirName(s)); - foreach (string s in Compression.Compression.GetAllLines(patchzip, RSync.RSyncDir.DELETED_FILES)) - if (res.ContainsKey(NormalizeZipFileName(s))) - res.Remove(NormalizeZipFileName(s)); + if (archive.FileExists(RSync.RSyncDir.DELETED_FILES)) + foreach (string s in archive.ReadAllLines(RSync.RSyncDir.DELETED_FILES)) + if (res.ContainsKey(NormalizeZipFileName(s))) + res.Remove(NormalizeZipFileName(s)); - foreach (string s in Compression.Compression.ListFiles(patchzip)) - if (s.StartsWith(RSync.RSyncDir.SIGNATURE_ROOT)) - res[s.Substring(RSync.RSyncDir.SIGNATURE_ROOT.Length + 1)] = null; + foreach (string s in archive.ListFiles(RSync.RSyncDir.SIGNATURE_ROOT)) + res[s.Substring(RSync.RSyncDir.SIGNATURE_ROOT.Length + 1)] = null; - foreach (string s in Compression.Compression.GetAllLines(patchzip, RSync.RSyncDir.ADDED_FOLDERS)) - res[NormalizeZipDirName(s)] = null; + if (archive.FileExists(RSync.RSyncDir.ADDED_FOLDERS)) + foreach (string s in archive.ReadAllLines(RSync.RSyncDir.ADDED_FOLDERS)) + res[NormalizeZipDirName(s)] = null; } } } diff --git a/Duplicati/Library/Main/RSyncDir.cs b/Duplicati/Library/Main/RSyncDir.cs index 294707d2b..2154fee41 100644 --- a/Duplicati/Library/Main/RSyncDir.cs +++ b/Duplicati/Library/Main/RSyncDir.cs @@ -43,21 +43,13 @@ namespace Duplicati.Library.Main.RSync /// This is the folder being backed up /// public string m_sourcefolder; - /// - /// This is the folder containing signatures for the previous backup - /// - public string m_basefolder; - /// - /// This is the folder that gets filled with the next backup - /// - public Core.TempFolder m_targetfolder; /// /// This is a list of existing file signatures. /// Key is path to the file. /// value is path to the signature file. /// - private Dictionary m_oldSignatures; + private Dictionary m_oldSignatures; /// /// This is a list of existing folders. /// @@ -126,58 +118,52 @@ namespace Duplicati.Library.Main.RSync /// private bool m_finalized = false; - - - /// /// This is a list of unprocessed files, used in multipass runs /// private List m_unproccesed; - public RSyncDir(string sourcefolder, string basefolder, CommunicationStatistics stat) + public RSyncDir(string sourcefolder, CommunicationStatistics stat, List patches) + : this(sourcefolder, stat) + { + string prefix = Core.Utility.AppendDirSeperator(SIGNATURE_ROOT); + + foreach (Core.IFileArchive z in patches) + { + if (z.FileExists(DELETED_FILES)) + foreach (string s in FilenamesFromPlatformIndependant(z.ReadAllLines(DELETED_FILES))) + if (m_oldSignatures.ContainsKey(s)) + m_oldSignatures.Remove(s); + + foreach (string f in FilenamesFromPlatformIndependant(z.ListFiles(prefix))) + m_oldSignatures[f.Substring(prefix.Length)] = z; + + if (z.FileExists(DELETED_FOLDERS)) + foreach (string s in FilenamesFromPlatformIndependant(z.ReadAllLines(DELETED_FOLDERS))) + if (m_oldFolders.ContainsKey(s)) + m_oldFolders.Remove(s); + + if (z.FileExists(ADDED_FOLDERS)) + foreach (string s in FilenamesFromPlatformIndependant(z.ReadAllLines(ADDED_FOLDERS))) + m_oldFolders.Add(s, s); + } + } + + public RSyncDir(string sourcefolder, CommunicationStatistics stat) { if (!System.IO.Path.IsPathRooted(sourcefolder)) sourcefolder = System.IO.Path.GetFullPath(sourcefolder); - if (!System.IO.Path.IsPathRooted(basefolder)) - sourcefolder = System.IO.Path.GetFullPath(basefolder); - m_sourcefolder = Core.Utility.AppendDirSeperator(sourcefolder); - m_basefolder = Core.Utility.AppendDirSeperator(basefolder); - m_targetfolder = new Duplicati.Library.Core.TempFolder(); - m_stat = stat; - - PrepareTargetFolder(); - BuildIndex(); - } - - private void PrepareTargetFolder() - { - System.IO.Directory.CreateDirectory(System.IO.Path.Combine(m_targetfolder, SIGNATURE_ROOT)); - System.IO.Directory.CreateDirectory(System.IO.Path.Combine(m_targetfolder, CONTENT_ROOT)); - System.IO.Directory.CreateDirectory(System.IO.Path.Combine(m_targetfolder, DELTA_ROOT)); - } - - private void BuildIndex() - { - if (m_basefolder == null || !System.IO.Directory.Exists(m_basefolder)) - { - m_oldSignatures = new Dictionary(); - m_oldFolders = new Dictionary(); - return; - } - m_basefolder = Core.Utility.AppendDirSeperator(m_basefolder); - - m_oldSignatures = new Dictionary(); - string sigfolder = Core.Utility.AppendDirSeperator(System.IO.Path.Combine(m_basefolder, SIGNATURE_ROOT)); - - foreach (string s in Core.Utility.EnumerateFiles(sigfolder)) - m_oldSignatures.Add(s.Substring(sigfolder.Length), s); - + m_oldSignatures = new Dictionary(); m_oldFolders = new Dictionary(); - if (System.IO.File.Exists(System.IO.Path.Combine(m_basefolder, ADDED_FOLDERS))) - foreach (string s in FilenamesFromPlatformIndependant(System.IO.File.ReadAllLines(System.IO.Path.Combine(m_basefolder, ADDED_FOLDERS)))) - m_oldFolders.Add(s, s); + m_sourcefolder = Core.Utility.AppendDirSeperator(sourcefolder); + m_stat = stat; + } - + public void CreatePatch(Core.IFileArchive signatures, Core.IFileArchive content) + { + InitiateMultiPassDiff(false, null); + MakeMultiPassDiff(signatures, content, long.MaxValue); + FinalizeMultiPass(signatures, content); } public void InitiateMultiPassDiff(bool full, Core.FilenameFilter filter) @@ -185,7 +171,7 @@ namespace Duplicati.Library.Main.RSync if (full) { m_oldFolders = new Dictionary(); - m_oldSignatures = new Dictionary(); + m_oldSignatures = new Dictionary(); } m_newfiles = new Dictionary(); @@ -195,9 +181,12 @@ namespace Duplicati.Library.Main.RSync m_deletedfolders = new List(); //TODO: Figure out how to make this faster, but still random + //Perhaps use itterative callbacks, with random recurse or itterate on each folder m_unproccesed = Core.Utility.EnumerateFileSystemEntries(m_sourcefolder, filter); m_totalfiles = m_unproccesed.Count; + + //Build folder diffs string dirmarker = System.IO.Path.DirectorySeparatorChar.ToString(); for(int i = 0; i < m_unproccesed.Count; i++) { @@ -213,44 +202,35 @@ namespace Duplicati.Library.Main.RSync m_unproccesed.RemoveAt(i); i--; } - } m_deletedfolders = new List(); m_deletedfolders.AddRange(m_oldFolders.Keys); } - public void FinalizeMultiPass(Compression.Compression sigfile) + public void FinalizeMultiPass(Core.IFileArchive signaturefile, Core.IFileArchive contentfile) { if (!m_finalized) { if (m_unproccesed.Count == 0) m_deletedfiles.AddRange(m_oldSignatures.Keys); + if (m_deletedfiles.Count > 0) { - System.IO.StreamWriter sw = new StreamWriter(sigfile.AddStream(DELETED_FILES)); - foreach (string s in FilenamesToPlatformIndependant(m_deletedfiles.ToArray())) - sw.WriteLine(s); - - sw.Flush(); + signaturefile.WriteAllLines(DELETED_FILES, m_deletedfiles.ToArray()); + contentfile.WriteAllLines(DELETED_FILES, m_deletedfiles.ToArray()); } if (m_deletedfolders.Count > 0) { - System.IO.StreamWriter sw = new StreamWriter(sigfile.AddStream(DELETED_FOLDERS)); - foreach (string s in FilenamesToPlatformIndependant(m_deletedfolders.ToArray())) - sw.WriteLine(s); - - sw.Flush(); + signaturefile.WriteAllLines(DELETED_FOLDERS, m_deletedfolders.ToArray()); + contentfile.WriteAllLines(DELETED_FOLDERS, m_deletedfolders.ToArray()); } if (m_newfolders.Count > 0) { - System.IO.StreamWriter sw = new StreamWriter(sigfile.AddStream(ADDED_FOLDERS)); - foreach (string s in FilenamesToPlatformIndependant(m_newfolders.ToArray())) - sw.WriteLine(s); - - sw.Flush(); + signaturefile.WriteAllLines(ADDED_FOLDERS, m_newfolders.ToArray()); + contentfile.WriteAllLines(ADDED_FOLDERS, m_newfolders.ToArray()); } if (m_stat is BackupStatistics) @@ -273,7 +253,7 @@ namespace Duplicati.Library.Main.RSync } } - public bool MakeMultiPassDiff(Compression.Compression sigfile, string zipfile, long volumesize) + public bool MakeMultiPassDiff(Core.IFileArchive signaturefile, Core.IFileArchive contentfile, long volumesize) { if (m_unproccesed == null) throw new Exception("Multi pass is not initialized"); @@ -281,39 +261,37 @@ namespace Duplicati.Library.Main.RSync Random r = new Random(); long totalSize = 0; - using (Compression.Compression c = new Duplicati.Library.Compression.Compression(m_targetfolder, zipfile)) + while (m_unproccesed.Count > 0 && totalSize < volumesize) { - while (m_unproccesed.Count > 0 && totalSize < volumesize) + int next = r.Next(0, m_unproccesed.Count); + string s = m_unproccesed[next]; + m_unproccesed.RemoveAt(next); + + try { - int next = r.Next(0, m_unproccesed.Count); - string s = m_unproccesed[next]; - m_unproccesed.RemoveAt(next); - - try - { - using (System.IO.FileStream fs = System.IO.File.Open(s, FileMode.Open, FileAccess.Read, FileShare.Read)) - if (ProccessDiff(fs, s, sigfile)) - totalSize = AddFileToCompression(fs, s, c); - } - catch (Exception ex) - { - if (m_stat != null) - m_stat.LogError("Failed to process file: \"" + s + "\", Error message: " + ex.Message); - Logging.Log.WriteMessage("Failed to process file: \"" + s + "\"", Duplicati.Library.Logging.LogMessageType.Error, ex); - } + using (System.IO.FileStream fs = System.IO.File.Open(s, FileMode.Open, FileAccess.Read, FileShare.Read)) + if (ProccessDiff(fs, s, signaturefile)) + totalSize = AddFileToCompression(fs, s, contentfile); + } + catch (Exception ex) + { + if (m_stat != null) + m_stat.LogError("Failed to process file: \"" + s + "\", Error message: " + ex.Message); + Logging.Log.WriteMessage("Failed to process file: \"" + s + "\"", Duplicati.Library.Logging.LogMessageType.Error, ex); } - - if (m_unproccesed.Count == 0) - FinalizeMultiPass(sigfile); } + if (m_unproccesed.Count == 0) + FinalizeMultiPass(signaturefile, contentfile); + + return m_unproccesed.Count == 0; } - private bool ProccessDiff(System.IO.FileStream fs, string s, Compression.Compression sigfile) + private bool ProccessDiff(System.IO.FileStream fs, string s, Core.IFileArchive signaturefile) { string relpath = s.Substring(m_sourcefolder.Length); - string target = System.IO.Path.Combine(System.IO.Path.Combine(m_targetfolder, SIGNATURE_ROOT), relpath); + string target = System.IO.Path.Combine(SIGNATURE_ROOT, relpath); using (System.IO.MemoryStream ms = new MemoryStream()) { @@ -323,7 +301,8 @@ namespace Duplicati.Library.Main.RSync if (!m_oldSignatures.ContainsKey(relpath)) { - Core.Utility.CopyStream(ms, sigfile.AddStream(target), true); + using(System.IO.Stream s2 = signaturefile.CreateFile(target)) + Core.Utility.CopyStream(ms, s2, true); m_newfiles.Add(s, null); return true; } @@ -332,14 +311,17 @@ namespace Duplicati.Library.Main.RSync ms.Position = 0; bool equals; - using (System.IO.FileStream fs2 = System.IO.File.OpenRead(m_oldSignatures[relpath])) - equals = Core.Utility.CompareStreams(fs2, ms, true); + + //File in archive + using (System.IO.Stream s2 = m_oldSignatures[relpath].OpenRead(target)) + equals = Core.Utility.CompareStreams(s2, ms, false); if (!equals) { - Core.Utility.CopyStream(ms, sigfile.AddStream(target), true); + //TODO: It's really bad if the signature is present, but not the content + using(System.IO.Stream s3 = signaturefile.CreateFile(target)) + Core.Utility.CopyStream(ms, s3, true); m_modifiedFiles.Add(s, null); - m_oldSignatures.Remove(relpath); return true; } else @@ -352,73 +334,78 @@ namespace Duplicati.Library.Main.RSync } - private long AddFileToCompression(System.IO.FileStream fs, string s, Compression.Compression c) + private long AddFileToCompression(System.IO.FileStream fs, string s, Core.IFileArchive contentfile) { fs.Position = 0; if (m_modifiedFiles.ContainsKey(s)) { string relpath = s.Substring(m_sourcefolder.Length); - string target = System.IO.Path.Combine(System.IO.Path.Combine(m_targetfolder, DELTA_ROOT), relpath); - string signature = System.IO.Path.Combine(System.IO.Path.Combine(m_basefolder, SIGNATURE_ROOT), relpath); + string target = System.IO.Path.Combine(DELTA_ROOT, relpath); + string signature = System.IO.Path.Combine(SIGNATURE_ROOT, relpath); - using (System.IO.FileStream sigfs = System.IO.File.OpenRead(signature)) + using (System.IO.Stream sigfs = m_oldSignatures[relpath].OpenRead(signature)) { - System.IO.Stream s3 = c.AddStream(target); - SharpRSync.Interface.GenerateDelta(sigfs, fs, s3); - //TODO: s3.Length the size of the archive + using(System.IO.Stream s3 = contentfile.CreateFile(target)) + SharpRSync.Interface.GenerateDelta(sigfs, fs, s3); + + //TODO: s3.Length is the size of the archive //m_diffsize += s3.Length; m_diffedfilessize += fs.Length; m_diffedfiles++; } m_modifiedFiles.Remove(s); + m_oldSignatures.Remove(relpath); } else { string relpath = s.Substring(m_sourcefolder.Length); - string target = System.IO.Path.Combine(System.IO.Path.Combine(m_targetfolder, CONTENT_ROOT), relpath); + string target = System.IO.Path.Combine(CONTENT_ROOT, relpath); - Core.Utility.CopyStream(fs, c.AddStream(target)); + using(System.IO.Stream s3 = contentfile.CreateFile(target)) + Core.Utility.CopyStream(fs, s3); + m_addedfiles++; m_addedfilessize += fs.Length; m_newfiles.Remove(s); } - return c.Size; + + return contentfile.Size; } public bool HasChanges { get { return m_newfiles.Count > 0 || m_modifiedFiles.Count > 0; } } - public List EnumerateSourceFolders() + /*public List EnumerateSourceFolders() { List folders = Core.Utility.EnumerateFolders(m_sourcefolder); for (int i = 0; i < folders.Count; i++) folders[i] = System.IO.Path.Combine(System.IO.Path.Combine(m_targetfolder, SIGNATURE_ROOT), folders[i].Substring(m_sourcefolder.Length)); return folders; - } + }*/ - public void Restore(string destination, List patchfolders) + public void Restore(string destination, List patches) { - Patch(destination, m_basefolder); - - if (patchfolders != null) - foreach (string s in patchfolders) + if (patches != null) + foreach (Core.IFileArchive s in patches) Patch(destination, s); } - public void Patch(string destination, string patch) + public void Patch(string destination, Core.IFileArchive patch) { - string deletedfiles = System.IO.Path.Combine(patch, DELETED_FILES); - if (System.IO.File.Exists(deletedfiles)) - foreach (string s in FilenamesFromPlatformIndependant(System.IO.File.ReadAllLines(deletedfiles))) + destination = Core.Utility.AppendDirSeperator(destination); + + if (patch.FileExists(DELETED_FILES)) + foreach (string s in FilenamesFromPlatformIndependant(patch.ReadAllLines(DELETED_FILES))) { string target = System.IO.Path.Combine(destination, s.Trim()); if (System.IO.File.Exists(target)) { try { + //TODO: Perhaps read ahead in patches to prevent creation System.IO.File.Delete(target); } catch (Exception ex) @@ -434,20 +421,20 @@ namespace Duplicati.Library.Main.RSync } } - string deletedfolders = System.IO.Path.Combine(patch, DELETED_FOLDERS); - if (System.IO.File.Exists(deletedfolders)) + if (patch.FileExists(DELETED_FOLDERS)) { + string[] deletedfolders = FilenamesFromPlatformIndependant(patch.ReadAllLines(DELETED_FOLDERS)); //Make sure subfolders are deleted first - string[] folderlist = FilenamesFromPlatformIndependant(System.IO.File.ReadAllLines(deletedfolders)); - Array.Sort(folderlist); - Array.Reverse(folderlist); + Array.Sort(deletedfolders); + Array.Reverse(deletedfolders); - foreach (string s in folderlist) + foreach (string s in deletedfolders) { string target = System.IO.Path.Combine(destination, s.Trim()); if (System.IO.Directory.Exists(target)) try { + //TODO: Perhaps read ahead in patches to prevent creation System.IO.Directory.Delete(target, false); } catch (Exception ex) @@ -456,19 +443,18 @@ namespace Duplicati.Library.Main.RSync m_stat.LogError("Failed to remove folder: \"" + target + "\", Error message: " + ex.Message); Logging.Log.WriteMessage("Failed to remove folder: " + target, Duplicati.Library.Logging.LogMessageType.Warning, ex); } - } } - string addedfolders = System.IO.Path.Combine(patch, ADDED_FOLDERS); - if (System.IO.File.Exists(addedfolders)) - { - //Make sure subfolders are deleted first - string[] folderlist = FilenamesFromPlatformIndependant(System.IO.File.ReadAllLines(addedfolders)); - Array.Sort(folderlist); - Array.Reverse(folderlist); - foreach (string s in folderlist) + if (patch.FileExists(ADDED_FOLDERS)) + { + string[] addedfolders = FilenamesFromPlatformIndependant(patch.ReadAllLines(ADDED_FOLDERS)); + + //Make sure topfolders are created first + Array.Sort(addedfolders); + + foreach (string s in addedfolders) { string target = System.IO.Path.Combine(destination, s.Trim()); if (!System.IO.Directory.Exists(target)) @@ -485,50 +471,63 @@ namespace Duplicati.Library.Main.RSync } } + string prefix = Core.Utility.AppendDirSeperator(CONTENT_ROOT); - string sourcefolder = Core.Utility.AppendDirSeperator(System.IO.Path.Combine(patch, CONTENT_ROOT)); - destination = Core.Utility.AppendDirSeperator(destination); - - //TODO: Handle file access exceptions - foreach (string s in Core.Utility.EnumerateFiles(sourcefolder)) + foreach (string s in patch.ListFiles(prefix)) { - string relpath = s.Substring(sourcefolder.Length); - string target = System.IO.Path.Combine(destination, relpath); + string target = System.IO.Path.Combine(destination, s.Substring(prefix.Length)); try { - System.IO.File.Copy(s, target); + if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(target))) + { + Logging.Log.WriteMessage("Folder did not exist on restore " + target, Duplicati.Library.Logging.LogMessageType.Warning); + System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(target)); + } + + using (System.IO.Stream s1 = patch.OpenRead(s)) + using (System.IO.FileStream s2 = System.IO.File.Create(target)) + Core.Utility.CopyStream(s1, s2); } catch (Exception ex) { - if (m_stat != null) - m_stat.LogError("Failed to restore file: \"" + relpath + "\", Error message: " + ex.Message); - Logging.Log.WriteMessage("Failed to restore file " + relpath, Duplicati.Library.Logging.LogMessageType.Error, ex); + if (m_stat != null) + m_stat.LogError("Failed to restore file: \"" + s + "\", Error message: " + ex.Message); + Logging.Log.WriteMessage("Failed to restore file " + s, Duplicati.Library.Logging.LogMessageType.Error, ex); } } - sourcefolder = Core.Utility.AppendDirSeperator(System.IO.Path.Combine(patch, DELTA_ROOT)); - - foreach (string s in Core.Utility.EnumerateFiles(sourcefolder)) + prefix = Core.Utility.AppendDirSeperator(DELTA_ROOT); + foreach (string s in patch.ListFiles(prefix)) { - string relpath = s.Substring(sourcefolder.Length); - string target = System.IO.Path.Combine(destination, relpath); - //string source = System.IO.Path.Combine(sourcefolder, relpath) - - string tempfile = System.IO.Path.GetTempFileName(); + string target = System.IO.Path.Combine(destination, s.Substring(prefix.Length)); try { - SharpRSync.Interface.PatchFile(target, s, tempfile); - System.IO.File.Delete(target); - System.IO.File.Move(tempfile, target); + if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(target))) + { + Logging.Log.WriteMessage("Folder did not exist on restore by delta " + target, Duplicati.Library.Logging.LogMessageType.Warning); + System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(target)); + } + + using (Core.TempFile tempfile = new Core.TempFile()) + { + using (System.IO.FileStream s1 = System.IO.File.OpenRead(target)) + using (System.IO.Stream s2 = patch.OpenRead(s)) + using (System.IO.FileStream s3 = System.IO.File.Create(tempfile)) + SharpRSync.Interface.PatchFile(s1, s2, s3); + + System.IO.File.Delete(target); + System.IO.File.Move(tempfile, target); + } } catch (Exception ex) { - if (m_stat != null) - m_stat.LogError("Failed to restore file: \"" + relpath + "\", Error message: " + ex.Message); - Logging.Log.WriteMessage("Failed to restore file " + relpath, Duplicati.Library.Logging.LogMessageType.Error, ex); - System.IO.File.Delete(target); - System.IO.File.Delete(tempfile); + if (m_stat != null) + m_stat.LogError("Failed to restore file: \"" + s + "\", Error message: " + ex.Message); + Logging.Log.WriteMessage("Failed to restore file " + s, Duplicati.Library.Logging.LogMessageType.Error, ex); + + try { System.IO.File.Delete(target); } + catch { } } } @@ -539,11 +538,6 @@ namespace Duplicati.Library.Main.RSync public void Dispose() { - if (m_targetfolder != null) - { - m_targetfolder.Dispose(); - m_targetfolder = null; - } } #endregion diff --git a/thirdparty/SharpZipLib/ICSharpCode.SharpZipLib.dll b/thirdparty/SharpZipLib/ICSharpCode.SharpZipLib.dll index bcdb00ea382aca18696459b3f09777b0c49e906e..e829ebf4baa5601ed650a56b821e266ef0c0d9cc 100644 GIT binary patch literal 192512 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 literal 188416 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�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 F005o};lcm_