From d3d494b574c5a98d52c207f9ebbfc209b23d46b3 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 24 Mar 2018 17:48:26 +0100 Subject: [PATCH 001/253] backends ported --- .../Duplicati.Library.AutoUpdater.csproj | 3 +- Duplicati/Library/AutoUpdater/app.config | 3 - .../AlternativeFTP/AlternativeFTPBackend.cs | 2 +- ...cati.Library.Backend.AlternativeFTP.csproj | 95 +++----------- .../AlternativeFTP/Properties/AssemblyInfo.cs | 54 -------- .../Library/Backend/AlternativeFTP/app.config | 3 - ...ti.Library.Backend.AmazonCloudDrive.csproj | 77 +++-------- .../Properties/AssemblyInfo.cs | 43 ------- .../Backend/AzureBlob/AzureBlobWrapper.cs | 28 +++- ...Duplicati.Library.Backend.AzureBlob.csproj | 111 ++++------------ .../AzureBlob/Properties/AssemblyInfo.cs | 36 ------ ...Duplicati.Library.Backend.Backblaze.csproj | 77 +++-------- .../Backblaze/Properties/AssemblyInfo.cs | 43 ------- .../Box/Duplicati.Library.Backend.Box.csproj | 76 +++-------- .../Backend/Box/Properties/AssemblyInfo.cs | 43 ------- ...uplicati.Library.Backend.CloudFiles.csproj | 83 +++--------- .../CloudFiles/Properties/AssemblyInfo.cs | 54 -------- .../Duplicati.Library.Backend.Dropbox.csproj | 88 +++---------- .../Library/Backend/Dropbox/Duplicati.snk | Bin 0 -> 596 bytes .../Dropbox/Properties/AssemblyInfo.cs | 36 ------ .../FTP/Duplicati.Library.Backend.FTP.csproj | 90 +++---------- .../Backend/FTP/Properties/AssemblyInfo.cs | 54 -------- Duplicati/Library/Backend/FTP/app.config | 3 - .../Duplicati.Library.Backend.File.csproj | 83 +++--------- .../Backend/File/Properties/AssemblyInfo.cs | 54 -------- ...cati.Library.Backend.GoogleServices.csproj | 78 +++-------- .../GoogleServices/Properties/AssemblyInfo.cs | 43 ------- .../Duplicati.Library.Backend.HubiC.csproj | 75 +++-------- .../Backend/HubiC/Properties/AssemblyInfo.cs | 43 ------- ...uplicati.Library.Backend.Jottacloud.csproj | 87 +++---------- .../Jottacloud/Properties/AssemblyInfo.cs | 54 -------- .../Duplicati.Library.Backend.Mega.csproj | 77 +++-------- .../Backend/Mega/Properties/AssemblyInfo.cs | 43 ------- .../Duplicati.Library.OAuthHelper.csproj | 73 +++-------- .../OAuthHelper/Properties/AssemblyInfo.cs | 43 ------- .../Duplicati.Library.Backend.OneDrive.csproj | 92 +++---------- .../OneDrive/Properties/AssemblyInfo.cs | 36 ------ ...Duplicati.Library.Backend.OpenStack.csproj | 77 +++-------- .../OpenStack/Properties/AssemblyInfo.cs | 43 ------- .../Duplicati.Library.Backend.Rclone.csproj | 71 +++------- .../Library/Backend/Rclone/Duplicati.snk | Bin 0 -> 596 bytes .../Backend/Rclone/Properties/AssemblyInfo.cs | 43 ------- .../S3/Duplicati.Library.Backend.S3.csproj | 97 +++----------- .../Backend/S3/Properties/AssemblyInfo.cs | 54 -------- Duplicati/Library/Backend/S3/S3IAM.cs | 12 +- Duplicati/Library/Backend/S3/S3Wrapper.cs | 12 +- .../Duplicati.Library.Backend.SSHv2.csproj | 88 +++---------- .../Backend/SSHv2/Properties/AssemblyInfo.cs | 36 ------ ...uplicati.Library.Backend.SharePoint.csproj | 121 ++++++------------ .../SharePoint/Properties/AssemblyInfo.cs | 40 ------ .../Sia/Duplicati.Library.Backend.Sia.csproj | 76 +++-------- .../Backend/Sia/Properties/AssemblyInfo.cs | 43 ------- ...Duplicati.Library.Backend.TahoeLAFS.csproj | 91 +++---------- .../TahoeLAFS/Properties/AssemblyInfo.cs | 55 -------- .../Duplicati.Library.Backend.WEBDAV.csproj | 88 +++---------- .../Backend/WEBDAV/Properties/AssemblyInfo.cs | 54 -------- .../Duplicati.Library.Compression.csproj | 98 ++++---------- .../Compression/Properties/AssemblyInfo.cs | 54 -------- .../Compression/SevenZipCompression.cs | 3 + .../Library/Interface/CustomExceptions.cs | 2 - .../Duplicati.Library.Interface.csproj | 94 ++------------ Duplicati/Library/Interface/IBackendGUI.cs | 35 ----- .../Library/Interface/ICompressionGUI.cs | 33 ----- Duplicati/Library/Interface/IEncryptionGUI.cs | 35 ----- Duplicati/Library/Interface/IGUIControl.cs | 87 ------------- .../Library/Interface/IGUIMiniControl.cs | 37 ------ .../Library/Interface/ISettingsControl.cs | 59 --------- .../Interface/Properties/AssemblyInfo.cs | 55 -------- .../Duplicati.Library.Localization.csproj | 67 +++------- Duplicati/Library/Localization/Duplicati.snk | Bin 0 -> 596 bytes .../Localization/LocalizationContext.cs | 4 + .../Localization/LocalizationService.cs | 5 +- .../Localization/Properties/AssemblyInfo.cs | 44 ------- .../Library/Localization/packages.config | 4 - .../Utility/Duplicati.Library.Utility.csproj | 1 - Duplicati/Library/Utility/app.config | 4 - Duplicati/License/Duplicati.License.csproj | 12 +- thirdparty/FluentFTP/Homepage.txt | 1 + .../License.txt | 2 +- .../licensedata.json | 4 +- .../Microsoft.SharePoint.Client.Runtime.dll | Bin 305408 -> 0 bytes .../Microsoft.SharePoint.Client.dll | Bin 676576 -> 0 bytes thirdparty/System.Net.FtpClient/Homepage.txt | 1 - .../System.Net.FtpClient.dll | Bin 82432 -> 0 bytes 84 files changed, 560 insertions(+), 3265 deletions(-) delete mode 100644 Duplicati/Library/AutoUpdater/app.config delete mode 100644 Duplicati/Library/Backend/AlternativeFTP/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/AlternativeFTP/app.config delete mode 100644 Duplicati/Library/Backend/AmazonCloudDrive/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/AzureBlob/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/Backblaze/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/Box/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/CloudFiles/Properties/AssemblyInfo.cs create mode 100644 Duplicati/Library/Backend/Dropbox/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Dropbox/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/FTP/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/FTP/app.config delete mode 100644 Duplicati/Library/Backend/File/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/GoogleServices/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/HubiC/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/Jottacloud/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/Mega/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/OAuthHelper/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/OneDrive/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/OpenStack/Properties/AssemblyInfo.cs create mode 100644 Duplicati/Library/Backend/Rclone/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Rclone/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/S3/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/SSHv2/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/SharePoint/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/Sia/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/TahoeLAFS/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/WEBDAV/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Compression/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Interface/IBackendGUI.cs delete mode 100644 Duplicati/Library/Interface/ICompressionGUI.cs delete mode 100644 Duplicati/Library/Interface/IEncryptionGUI.cs delete mode 100644 Duplicati/Library/Interface/IGUIControl.cs delete mode 100644 Duplicati/Library/Interface/IGUIMiniControl.cs delete mode 100644 Duplicati/Library/Interface/ISettingsControl.cs delete mode 100644 Duplicati/Library/Interface/Properties/AssemblyInfo.cs create mode 100644 Duplicati/Library/Localization/Duplicati.snk delete mode 100644 Duplicati/Library/Localization/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Localization/packages.config delete mode 100644 Duplicati/Library/Utility/app.config create mode 100644 thirdparty/FluentFTP/Homepage.txt rename thirdparty/{System.Net.FtpClient => FluentFTP}/License.txt (98%) rename thirdparty/{System.Net.FtpClient => FluentFTP}/licensedata.json (58%) delete mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Runtime.dll delete mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.dll delete mode 100644 thirdparty/System.Net.FtpClient/Homepage.txt delete mode 100644 thirdparty/System.Net.FtpClient/System.Net.FtpClient.dll diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 99c1279a9..851c16443 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -5,7 +5,7 @@ AnyCPU {7E119745-1F62-43F0-936C-F312A1912C0B} Exe - False + False Duplicati.Library.AutoUpdater Duplicati.Library.AutoUpdater ..\..\GUI\Duplicati.GUI.TrayIcon\Duplicati.snk @@ -77,7 +77,6 @@ - \ No newline at end of file diff --git a/Duplicati/Library/AutoUpdater/app.config b/Duplicati/Library/AutoUpdater/app.config deleted file mode 100644 index b7a7ef166..000000000 --- a/Duplicati/Library/AutoUpdater/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Backend/AlternativeFTP/AlternativeFTPBackend.cs b/Duplicati/Library/Backend/AlternativeFTP/AlternativeFTPBackend.cs index 817462b05..9e51339f0 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/AlternativeFTPBackend.cs +++ b/Duplicati/Library/Backend/AlternativeFTP/AlternativeFTPBackend.cs @@ -21,7 +21,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Net.FtpClient; +using FluentFTP; using System.Net.Security; using System.Security.Authentication; using Duplicati.Library.Interface; diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 3acbabe71..2edbccc16 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -1,84 +1,27 @@ - - - - - Debug - AnyCPU - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F} - Library - Properties - Duplicati.Library.Backend.AlternativeFTP - Duplicati.Library.Backend.AlternativeFTP - v4.5 - 512 - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - + + + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Backend.AlternativeFTP + Duplicati Team + Duplicati Team + An alternative FTP backend for Duplicati + AlternativeFTP + - - - - - - - - - - ..\..\..\..\thirdparty\System.Net.FtpClient\System.Net.FtpClient.dll - + + - - - + + + + - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/AlternativeFTP/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/AlternativeFTP/Properties/AssemblyInfo.cs deleted file mode 100644 index b748b6e1a..000000000 --- a/Duplicati/Library/Backend/AlternativeFTP/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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("AlternativeFTP")] -[assembly: AssemblyDescription("An alternative FTP backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.AlternativeFTP")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2016")] -[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("3f47cb0c-cee1-447f-9c26-7f8e419e3e3f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/AlternativeFTP/app.config b/Duplicati/Library/Backend/AlternativeFTP/app.config deleted file mode 100644 index a80813afe..000000000 --- a/Duplicati/Library/Backend/AlternativeFTP/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj index 1acc64469..a26b54304 100644 --- a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj +++ b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj @@ -1,65 +1,28 @@ - - + + + - Debug - AnyCPU - {08D7E42D-285C-4010-9881-986125FE2F3E} - Library - Duplicati.Library.Backend.AmazonCloudDrive - Duplicati.Library.Backend.AmazonCloudDrive + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Backend.AmazonCloudDrive + Duplicati Team + Duplicati Team + AmazonCloudDrive backend for Duplicati + AmazonCloudDrive + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - - + + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/AmazonCloudDrive/Properties/AssemblyInfo.cs deleted file mode 100644 index 47db1d9a2..000000000 --- a/Duplicati/Library/Backend/AmazonCloudDrive/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.AmazonCloudDrive")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs index 24cf5cf5b..5e3e95b89 100644 --- a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs +++ b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs @@ -71,17 +71,18 @@ namespace Duplicati.Library.Backend.AzureBlob public void AddContainer() { - _container.Create(BlobContainerPublicAccessType.Off); + _container.CreateAsync().GetAwaiter().GetResult(); + _container.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Off }); } public virtual void GetFileStream(string keyName, Stream target) { - _container.GetBlockBlobReference(keyName).DownloadToStream(target); + _container.GetBlockBlobReference(keyName).DownloadToStreamAsync(target).GetAwaiter().GetResult(); } public void GetFileObject(string keyName, string localfile) { - _container.GetBlockBlobReference(keyName).DownloadToFile(localfile, FileMode.Create); + _container.GetBlockBlobReference(keyName).DownloadToFileAsync(localfile, FileMode.Create).GetAwaiter().GetResult(); } public void AddFileObject(string keyName, string localfile) @@ -94,17 +95,32 @@ namespace Duplicati.Library.Backend.AzureBlob public virtual void AddFileStream(string keyName, Stream source) { - _container.GetBlockBlobReference(keyName).UploadFromStream(source); + _container.GetBlockBlobReference(keyName).UploadFromStreamAsync(source).GetAwaiter().GetResult(); } public void DeleteObject(string keyName) { - _container.GetBlockBlobReference(keyName).DeleteIfExists(); + _container.GetBlockBlobReference(keyName).DeleteIfExistsAsync().GetAwaiter().GetResult(); } + private IEnumerable ListBlobs(){ + BlobContinuationToken continuationToken = null; + var results = new List(); + + do + { + var response = _container.ListBlobsSegmentedAsync("", true, BlobListingDetails.Metadata, null, continuationToken, null, null).GetAwaiter().GetResult(); + continuationToken = response.ContinuationToken; + results.AddRange(response.Results); + } + while (continuationToken != null); + + return results; + } + public virtual List ListContainerEntries() { - var listBlobItems = _container.ListBlobs(blobListingDetails: BlobListingDetails.Metadata); + var listBlobItems = ListBlobs(); try { return listBlobItems.Select(x => diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index e6a2c474c..f00ad22e7 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -1,95 +1,32 @@ - - + + + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - false - - - Debug - AnyCPU - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Library - Properties - Duplicati.Library.Backend.AzureBlob - Duplicati.Library.Backend.AzureBlob - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.AzureBlob + Duplicati Team + Duplicati Team + An Azure blob storage backend for Duplicati + AzureBlob + - - - - - ..\..\..\..\packages\Microsoft.Azure.KeyVault.Core.2.0.4\lib\net45\Microsoft.Azure.KeyVault.Core.dll - - - ..\..\..\..\packages\Microsoft.Data.Edm.5.8.3\lib\net40\Microsoft.Data.Edm.dll - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - ..\..\..\..\packages\System.Spatial.5.8.3\lib\net40\System.Spatial.dll - - - ..\..\..\..\packages\Microsoft.Data.OData.5.8.3\lib\net40\Microsoft.Data.OData.dll - - - ..\..\..\..\packages\Microsoft.Data.Services.Client.5.8.3\lib\net40\Microsoft.Data.Services.Client.dll - - - ..\..\..\..\packages\WindowsAzure.Storage.8.4.0\lib\net45\Microsoft.WindowsAzure.Storage.dll - + + + + + + + + - - - - + + + - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/AzureBlob/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/AzureBlob/Properties/AssemblyInfo.cs deleted file mode 100644 index 06cb70255..000000000 --- a/Duplicati/Library/Backend/AzureBlob/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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.Library.Backend.AzureBlob")] -[assembly: AssemblyDescription("An Azure blob storage backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.S3")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("732b2a5c-2402-408e-89c7-80a981b303de")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index a3addecf3..ec54bfd71 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -1,66 +1,27 @@ - - + + - Debug - AnyCPU - {61C43D61-4368-4942-84A3-1EB623F4EF2A} - Library - Duplicati.Library.Backend.Backblaze - Duplicati.Library.Backend.Backblaze + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.Backblaze + Duplicati Team + Duplicati Team + Backblaze backend for Duplicati + Backblaze + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - - + + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Backblaze/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/Backblaze/Properties/AssemblyInfo.cs deleted file mode 100644 index a862e60ac..000000000 --- a/Duplicati/Library/Backend/Backblaze/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.Backblaze")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 05fde10ca..15527a9d2 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -1,65 +1,27 @@ - - + + - Debug - AnyCPU - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} - Library - Duplicati.Library.Backend.Box - Duplicati.Library.Backend.Box + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.Box + Duplicati Team + Duplicati Team + Box backend for Duplicati + Box + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - - + + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Box/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/Box/Properties/AssemblyInfo.cs deleted file mode 100644 index d7767744b..000000000 --- a/Duplicati/Library/Backend/Box/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.Box")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index b1151e757..6d3845eb7 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,73 +1,22 @@ - - + + - Debug - AnyCPU - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.CloudFiles - - - 3.5 - v4.5 - - - + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.CloudFiles + Duplicati Team + Duplicati Team + CloudFiles backend for Duplicati + CloudFiles + - - + + + - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/CloudFiles/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/CloudFiles/Properties/AssemblyInfo.cs deleted file mode 100644 index b38b5867a..000000000 --- a/Duplicati/Library/Backend/CloudFiles/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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("CloudFiles")] -[assembly: AssemblyDescription("A CloudFiles backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.CloudFiles")] -[assembly: AssemblyCopyright("Copyright © Duplicati Team 2015")] -[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("3985bf98-9296-46f0-aad0-c051d3db53e4")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index 75e2c7264..b97f6a854 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -1,75 +1,27 @@ - - - + + - Debug - AnyCPU - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493} - Library - Properties - Duplicati.Library.Backend.Dropbox - Duplicati.Library.Backend.Dropbox - v4.5 - 512 - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + netstandard2.0;net45 + 2.0.0.7 + true + Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.Dropbox + Duplicati Team + Duplicati Team + Dropbox backend for Duplicati + Dropbox + - - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - + + + + - - - {c5899f45-b0ff-483c-9d38-24a9fcaab237} - Duplicati.Library.Interface - - - {de3e5d4c-51ab-4e5e-bee8-e636cebfba65} - Duplicati.Library.Utility - - - {d4c37c33-5e73-4b56-b2c3-dc4a6baa36bb} - Duplicati.Library.OAuthHelper - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.snk b/Duplicati/Library/Backend/Dropbox/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T - + + - Debug - AnyCPU - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.FTP + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - v4.5 - - - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Backend.FTP + Duplicati Team + Duplicati Team + A FTP backend for Duplicati + FTP + - - + + + + - - - - - - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - - \ No newline at end of file + + diff --git a/Duplicati/Library/Backend/FTP/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/FTP/Properties/AssemblyInfo.cs deleted file mode 100644 index 5dfe7ab9e..000000000 --- a/Duplicati/Library/Backend/FTP/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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("FTP")] -[assembly: AssemblyDescription("A FTP backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.FTP")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("afa68988-4d82-490e-8044-acbc7d52ef4f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/FTP/app.config b/Duplicati/Library/Backend/FTP/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Backend/FTP/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index 760a13579..6ed240c43 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,73 +1,22 @@ - - + + - Debug - AnyCPU - {FC9B7611-836F-4127-8B44-A7C31F506807} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.File + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - v4.5 - - - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.File + Duplicati Team + Duplicati Team + File backend for Duplicati + File + - + + + - - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/File/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/File/Properties/AssemblyInfo.cs deleted file mode 100644 index a3073a7b2..000000000 --- a/Duplicati/Library/Backend/File/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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("File")] -[assembly: AssemblyDescription("A file backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.File")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("5f35ade7-e6df-466b-915d-3cbf78b13717")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 817a57af5..c248fdadc 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -1,67 +1,27 @@ - - + + - Debug - AnyCPU - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Library - Duplicati.Library.Backend.GoogleServices - Duplicati.Library.Backend.GoogleServices + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.GoogleCloudStorage + Duplicati Team + Duplicati Team + GoogleCloudStorage backend for Duplicati + GoogleCloudStorage + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - - + + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/GoogleServices/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/GoogleServices/Properties/AssemblyInfo.cs deleted file mode 100644 index 3ca81bfa6..000000000 --- a/Duplicati/Library/Backend/GoogleServices/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.GoogleCloudStorage")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index e103c386b..4270c70b1 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -1,63 +1,24 @@ - - + + - Debug - AnyCPU - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} - Library - Duplicati.Library.Backend.HubiC - Duplicati.Library.Backend.HubiC + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.HubiC + Duplicati Team + Duplicati Team + HubiC backend for Duplicati + HubiC + - - - - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - {D9E4E686-423C-48EC-A392-404E7C00860C} - Duplicati.Library.Backend.OpenStack - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - + + + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/HubiC/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/HubiC/Properties/AssemblyInfo.cs deleted file mode 100644 index 8d40ead11..000000000 --- a/Duplicati/Library/Backend/HubiC/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.HubiC")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index e308a8103..53d69beb9 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -1,76 +1,23 @@ - - + + - Debug - AnyCPU - {2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.Jottacloud - - - 3.5 - v4.5 - - - + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.Jottacloud + Duplicati Team + Duplicati Team + Jottacloud backend for Duplicati + Jottacloud + - - + + + + - - - - - - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Jottacloud/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/Jottacloud/Properties/AssemblyInfo.cs deleted file mode 100644 index 3b65be92d..000000000 --- a/Duplicati/Library/Backend/Jottacloud/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2017, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Library.Backend.Jottacloud")] -[assembly: AssemblyDescription("A Jottacloud backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.Jottacloud")] -[assembly: AssemblyCopyright("Copyright © Duplicati Team 2017")] -[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("4fb0b20e-c5c6-4085-a8fa-e0e0722fb5a2")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 33e183279..3e7c8bc44 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -1,66 +1,27 @@ - - + + - Debug - AnyCPU - {6643A5AE-AB38-453F-ADCE-408E35A81A83} - Library - Duplicati.Library.Backend.Mega - Duplicati.Library.Backend.Mega + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright � Duplicati Team 2015 + Duplicati.Library.Backend.Mega + Duplicati Team + Duplicati Team + Mega backend for Duplicati + Mega + - - - - ..\..\..\..\packages\MegaApiClient.1.6.0\lib\net45\MegaApiClient.dll - - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + + - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - - + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Mega/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/Mega/Properties/AssemblyInfo.cs deleted file mode 100644 index 5ccf0c0a4..000000000 --- a/Duplicati/Library/Backend/Mega/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.Mega")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index f3005f88e..05ef5b870 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -1,63 +1,26 @@ - - + + - Debug - AnyCPU - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Library - Duplicati.Library.OAuthHelper - Duplicati.Library.OAuthHelper + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.OAuthHelper + Duplicati Team + Duplicati Team + OAuthHelper backend for Duplicati + OAuthHelper + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - - + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/OAuthHelper/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/OAuthHelper/Properties/AssemblyInfo.cs deleted file mode 100644 index b82f1cbf4..000000000 --- a/Duplicati/Library/Backend/OAuthHelper/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.OAuthHelper")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 03a475406..9a1cc01ef 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,81 +1,27 @@ - - + + - Debug - AnyCPU - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.OneDrive + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - 512 - - - 3.5 - - v4.5 - - false - - - True - full - False - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - True - bin\Release\ - TRACE - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.OneDrive + Duplicati Team + Duplicati Team + OneDrive backend for Duplicati + OneDrive + - - + + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + + + - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/OneDrive/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/OneDrive/Properties/AssemblyInfo.cs deleted file mode 100644 index 0d3a65f3c..000000000 --- a/Duplicati/Library/Backend/OneDrive/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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("OneDrive")] -[assembly: AssemblyDescription("A Duplicati Backend for OneDrive")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Library.Backend.OneDrive")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("9d40bf02-8855-49fd-842d-d6398e2fe8aa")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index fa7d2332f..33e8b8889 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -1,66 +1,27 @@ - - + + - Debug - AnyCPU - {D9E4E686-423C-48EC-A392-404E7C00860C} - Library - Duplicati.Library.Backend.OpenStack - Duplicati.Library.Backend.OpenStack + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.OpenStack + Duplicati Team + Duplicati Team + OpenStack backend for Duplicati + OpenStack + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - - + + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/OpenStack/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/OpenStack/Properties/AssemblyInfo.cs deleted file mode 100644 index a83cdd27d..000000000 --- a/Duplicati/Library/Backend/OpenStack/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.OpenStack")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 7ff48865b..c99d1d8fa 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -1,61 +1,26 @@ - - + + - Debug - AnyCPU - {851A1CB8-3CEB-41B4-956F-34D760D2A8E5} - Library - Duplicati.Library.Backend.Rclone - Duplicati.Library.Backend.Rclone + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.Rclone + Duplicati Team + Duplicati Team + Rclone backend for Duplicati + Rclone + - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - + + - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - - + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.snk b/Duplicati/Library/Backend/Rclone/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T - + + - Debug - AnyCPU - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.S3 + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - - - v4.5 - - 3.5 - - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright � Duplicati Team 2015 + Duplicati.Library.Backend.S3 + Duplicati Team + Duplicati Team + S3 backend for Duplicati + S3 + - - - ..\..\..\..\packages\AWSSDK.Core.3.3.17.10\lib\net45\AWSSDK.Core.dll - - - ..\..\..\..\packages\AWSSDK.IdentityManagement.3.3.5\lib\net45\AWSSDK.IdentityManagement.dll - - - ..\..\..\..\packages\AWSSDK.S3.3.3.11\lib\net45\AWSSDK.S3.dll - + + + + - - - - - - + + + - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/S3/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/S3/Properties/AssemblyInfo.cs deleted file mode 100644 index 8d225e502..000000000 --- a/Duplicati/Library/Backend/S3/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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("S3")] -[assembly: AssemblyDescription("An Amazon S3 backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.S3")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("afa68988-4d82-490e-8044-acbc7d52ef4f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/S3/S3IAM.cs b/Duplicati/Library/Backend/S3/S3IAM.cs index 184552d5b..2d5b50ff1 100644 --- a/Duplicati/Library/Backend/S3/S3IAM.cs +++ b/Duplicati/Library/Backend/S3/S3IAM.cs @@ -156,14 +156,14 @@ namespace Duplicati.Library.Backend var cl = new AmazonIdentityManagementServiceClient(awsid, awskey); try { - var user = cl.GetUser().User; + var user = cl.GetUserAsync().GetAwaiter().GetResult().User; dict["isroot"] = "False"; //user.Arn.EndsWith(":root", StringComparison.Ordinal).ToString(); dict["arn"] = user.Arn; dict["id"] = user.UserId; dict["name"] = user.UserName; - dict["isroot"] = (cl.SimulatePrincipalPolicy(new SimulatePrincipalPolicyRequest() { PolicySourceArn = user.Arn, ActionNames = new[] { "iam:CreateUser" }.ToList() }).EvaluationResults.First().EvalDecision == PolicyEvaluationDecisionType.Allowed).ToString(); + dict["isroot"] = (cl.SimulatePrincipalPolicyAsync(new SimulatePrincipalPolicyRequest() { PolicySourceArn = user.Arn, ActionNames = new[] { "iam:CreateUser" }.ToList() }).GetAwaiter().GetResult().EvaluationResults.First().EvalDecision == PolicyEvaluationDecisionType.Allowed).ToString(); } catch (Exception ex) { @@ -182,13 +182,13 @@ namespace Duplicati.Library.Backend var policydoc = GeneratePolicyDoc(path); var cl = new AmazonIdentityManagementServiceClient(awsid, awskey); - var user = cl.CreateUser(new CreateUserRequest(username)).User; - cl.PutUserPolicy(new PutUserPolicyRequest( + var user = cl.CreateUserAsync(new CreateUserRequest(username)).GetAwaiter().GetResult().User; + cl.PutUserPolicyAsync(new PutUserPolicyRequest( user.UserName, policyname, policydoc - )); - var key = cl.CreateAccessKey(new CreateAccessKeyRequest() { UserName = user.UserName }).AccessKey; + )).GetAwaiter().GetResult(); + var key = cl.CreateAccessKeyAsync(new CreateAccessKeyRequest() { UserName = user.UserName }).GetAwaiter().GetResult().AccessKey; var dict = new Dictionary(); dict["accessid"] = key.AccessKeyId; diff --git a/Duplicati/Library/Backend/S3/S3Wrapper.cs b/Duplicati/Library/Backend/S3/S3Wrapper.cs index 16dd42401..f92ff2f6a 100644 --- a/Duplicati/Library/Backend/S3/S3Wrapper.cs +++ b/Duplicati/Library/Backend/S3/S3Wrapper.cs @@ -86,7 +86,7 @@ namespace Duplicati.Library.Backend if (!string.IsNullOrEmpty(m_locationConstraint)) request.BucketRegionName = m_locationConstraint; - m_client.PutBucket(request); + m_client.PutBucketAsync(request).GetAwaiter().GetResult(); } public virtual void GetFileStream(string bucketName, string keyName, System.IO.Stream target) @@ -95,7 +95,7 @@ namespace Duplicati.Library.Backend objectGetRequest.BucketName = bucketName; objectGetRequest.Key = keyName; - using(GetObjectResponse objectGetResponse = m_client.GetObject(objectGetRequest)) + using(GetObjectResponse objectGetResponse = m_client.GetObjectAsync(objectGetRequest).GetAwaiter().GetResult()) using(System.IO.Stream s = objectGetResponse.ResponseStream) { try { s.ReadTimeout = (int)TimeSpan.FromMinutes(1).TotalMilliseconds; } @@ -126,7 +126,7 @@ namespace Duplicati.Library.Backend if (!string.IsNullOrWhiteSpace(m_storageClass)) objectAddRequest.StorageClass = new S3StorageClass(m_storageClass); - m_client.PutObject(objectAddRequest); + m_client.PutObjectAsync(objectAddRequest).GetAwaiter().GetResult(); } public void DeleteObject(string bucketName, string keyName) @@ -135,7 +135,7 @@ namespace Duplicati.Library.Backend objectDeleteRequest.BucketName = bucketName; objectDeleteRequest.Key = keyName; - m_client.DeleteObject(objectDeleteRequest); + m_client.DeleteObjectAsync(objectDeleteRequest).GetAwaiter().GetResult(); } public virtual IEnumerable ListBucket(string bucketName, string prefix) @@ -161,7 +161,7 @@ namespace Duplicati.Library.Backend if (!string.IsNullOrEmpty(prefix)) listRequest.Prefix = prefix; - ListObjectsResponse listResponse = m_client.ListObjects(listRequest); + ListObjectsResponse listResponse = m_client.ListObjectsAsync(listRequest).GetAwaiter().GetResult(); isTruncated = listResponse.IsTruncated; filename = listResponse.NextMarker; @@ -188,7 +188,7 @@ namespace Duplicati.Library.Backend copyObjectRequest.DestinationBucket = bucketName; copyObjectRequest.DestinationKey = target; - m_client.CopyObject(copyObjectRequest); + m_client.CopyObjectAsync(copyObjectRequest).GetAwaiter().GetResult(); DeleteObject(bucketName, source); } diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index 6974feb12..e0309e806 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,78 +1,26 @@ - - - - Debug - AnyCPU - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.SSHv2 - 512 - v4.5 - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - + + + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.SSHv2 + Duplicati Team + Duplicati Team + SSHv2 backend for Duplicati + SSHv2 + - - - - ..\..\..\..\packages\SSH.NET.2016.1.0-beta3\lib\net40\Renci.SshNet.dll - + + - - - - - + + + - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/SSHv2/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/SSHv2/Properties/AssemblyInfo.cs deleted file mode 100644 index a1daffba5..000000000 --- a/Duplicati/Library/Backend/SSHv2/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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("SSHv2")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Library.Backend.SSHv2")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("2664a6d7-4a72-481c-b753-f2bb63c2a0e8")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index bf6530f3f..ec96f439d 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,88 +1,47 @@ - - - - - Debug - AnyCPU - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.SharePoint - v4.5 - 512 - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - + + + net45 + 2.0.0.7 + true Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.SharePoint + Duplicati Team + Duplicati Team + A SharePoint Online Backend for Duplicati (includes OneDrive for Business support) + SharePoint + + + + + + + + + + + + ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.Portable.dll + + + ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.Runtime.Portable.dll + + + ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.Runtime.Windows.dll + + + + + + + + + + - - - - - - - - - ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.dll - - - ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.Runtime.dll - - - - - - - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/SharePoint/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/SharePoint/Properties/AssemblyInfo.cs deleted file mode 100644 index 50b4a6113..000000000 --- a/Duplicati/Library/Backend/SharePoint/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,40 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2016, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("Duplicati.Library.Backend.SharePoint")] -[assembly: AssemblyDescription("A SharePoint Online Backend for Duplicati (includes OneDrive for Business support)")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Library.Backend.SharePoint")] -[assembly: AssemblyCopyright("Copyright © Duplicati Team 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("ef2ffdff-aa60-477f-82a0-06d486c6dbbf")] - -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index 4c67ec09a..b44500ba6 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -1,65 +1,27 @@ - - + + - Debug - AnyCPU - {32A74526-3E5F-413A-8CB4-1EFDAD4C8B91} - Library - Duplicati.Library.Backend.Sia - Duplicati.Library.Backend.Sia + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - v4.5 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.Sia + Duplicati Team + Duplicati Team + Sia backend for Duplicati + Sia + - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - - + + + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Sia/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/Sia/Properties/AssemblyInfo.cs deleted file mode 100644 index 5c49552a7..000000000 --- a/Duplicati/Library/Backend/Sia/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Backend.Sia")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index ff93fd131..58f2a35f7 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,80 +1,27 @@ - - + + - Debug - AnyCPU - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.TahoeLAFS - 512 + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - - v4.5 - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.TahoeLAFS + Duplicati Team + Duplicati Team + TahoeLAFS backend for Duplicati + TahoeLAFS + - - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - + + + + - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/TahoeLAFS/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/TahoeLAFS/Properties/AssemblyInfo.cs deleted file mode 100644 index 34fdf31c5..000000000 --- a/Duplicati/Library/Backend/TahoeLAFS/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Library.Backend.TahoeLAFS")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Library.Backend.TahoeLAFS")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("ffe150ce-bbbb-436f-9aec-a7e87b8c5fb9")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index 287a66ce6..02091ed51 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,77 +1,23 @@ - - + + - Debug - AnyCPU - {BAE27510-8B5D-44B2-B33E-372A98908041} - Library - Properties - Duplicati.Library.Backend - Duplicati.Library.Backend.WEBDAV - - - 3.5 - v4.5 - - - + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.WEBDAV + Duplicati Team + Duplicati Team + WEBDAV backend for Duplicati + WEBDAV + - - + + + + - - - - - - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/WEBDAV/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/WEBDAV/Properties/AssemblyInfo.cs deleted file mode 100644 index 1c1bd0312..000000000 --- a/Duplicati/Library/Backend/WEBDAV/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Library.Backend.WEBDAV")] -[assembly: AssemblyDescription("A WEBDAV backend for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.WEBDAV")] -[assembly: AssemblyCopyright("Copyright © Duplicati Team 2015")] -[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("3985bf98-9296-46f0-aad0-c051d3db53e4")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 6b1e5e8b4..86ae3443e 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,87 +1,33 @@ - - + + - Debug - AnyCPU - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Library - Properties - Duplicati.Library.Compression - Duplicati.Library.Compression + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - v4.5 - - - - false - - - true - full - false - bin\Debug\ - TRACE;DEBUG - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Compression + Duplicati Team + Duplicati Team + Compression implementation for Duplicati + Compression + - - + + + + ..\..\..\thirdparty\ManagedLZMA\managed-lzma.dll - - ..\..\..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll - + - - - - - - + + + + - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Compression/Properties/AssemblyInfo.cs b/Duplicati/Library/Compression/Properties/AssemblyInfo.cs deleted file mode 100644 index 4813c95e0..000000000 --- a/Duplicati/Library/Compression/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Compression")] -[assembly: AssemblyDescription("Compression implementation for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Compression")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("cb416dfd-ae77-43cd-8948-b89c7a148e99")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Compression/SevenZipCompression.cs b/Duplicati/Library/Compression/SevenZipCompression.cs index 6d35b2311..e99857d55 100644 --- a/Duplicati/Library/Compression/SevenZipCompression.cs +++ b/Duplicati/Library/Compression/SevenZipCompression.cs @@ -7,6 +7,8 @@ using Duplicati.Library.Utility; namespace Duplicati.Library.Compression { +//TODO-DNC +#if !NETSTANDARD2_0 public class SevenZipCompression : ICompressionHinting { // next file starts a new stream if the previous stream is larger than this @@ -421,4 +423,5 @@ namespace Duplicati.Library.Compression #endregion } +#endif } diff --git a/Duplicati/Library/Interface/CustomExceptions.cs b/Duplicati/Library/Interface/CustomExceptions.cs index 066d8a5f2..e30296533 100644 --- a/Duplicati/Library/Interface/CustomExceptions.cs +++ b/Duplicati/Library/Interface/CustomExceptions.cs @@ -18,8 +18,6 @@ // #endregion using System; -using System.Collections.Generic; -using System.Text; using Duplicati.Library.Localization.Short; namespace Duplicati.Library.Interface diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 745e830ff..6a50ae3ef 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,86 +1,20 @@ - - + + - Debug - AnyCPU - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Library - Properties - Duplicati.Library.Interface - Duplicati.Library.Interface - 512 + netstandard2.0;net45 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - - v4.5 - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Interface + Duplicati Team + Duplicati Team + The Duplicati library with all publicly exposed interfaces + Interface + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - + + \ No newline at end of file diff --git a/Duplicati/Library/Interface/IBackendGUI.cs b/Duplicati/Library/Interface/IBackendGUI.cs deleted file mode 100644 index 2f70fba78..000000000 --- a/Duplicati/Library/Interface/IBackendGUI.cs +++ /dev/null @@ -1,35 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace Duplicati.Library.Interface -{ - /// - /// The interface used to display a GUI wizard page for the user. - /// If the backed should be available from the GUI, this interface must be implemented, - /// otherwise a generic interface is displayed, listing the commandline options. - /// - public interface IBackendGUI : IBackend, IGUIControl - { - } -} diff --git a/Duplicati/Library/Interface/ICompressionGUI.cs b/Duplicati/Library/Interface/ICompressionGUI.cs deleted file mode 100644 index adccf3301..000000000 --- a/Duplicati/Library/Interface/ICompressionGUI.cs +++ /dev/null @@ -1,33 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; - -namespace Duplicati.Library.Interface -{ - /// - /// An interface used to provide a custom usercontrol for a compression module. - /// This interface is not currently in use. - /// - public interface ICompressionGUI : ICompression, IGUIControl - { - } -} diff --git a/Duplicati/Library/Interface/IEncryptionGUI.cs b/Duplicati/Library/Interface/IEncryptionGUI.cs deleted file mode 100644 index f45bbb692..000000000 --- a/Duplicati/Library/Interface/IEncryptionGUI.cs +++ /dev/null @@ -1,35 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; - -namespace Duplicati.Library.Interface -{ - /// - /// An interface used to provide a custom usercontrol for an encryption module. - /// The control is displayed on the passphrase selection page, and thus has limited space available. - /// If this interface is not implemented, a default options grid will be displayed. - /// To prevent options from being displayed, implement this interface, and return an empty control in the method. - /// - public interface IEncryptionGUI : IEncryption, IGUIControl - { - } -} diff --git a/Duplicati/Library/Interface/IGUIControl.cs b/Duplicati/Library/Interface/IGUIControl.cs deleted file mode 100644 index 4f163d15e..000000000 --- a/Duplicati/Library/Interface/IGUIControl.cs +++ /dev/null @@ -1,87 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; -using System.Windows.Forms; - -namespace Duplicati.Library.Interface -{ - /// - /// The interface that defines a GUI for a plugable component, such as a backend or encryption module. - /// All options are stored in a dictionary, which is persisted to the database. - /// When creating a backup, the option dictionary will be empty, when editing, it will contain the contents from the last edit. - /// The options in the dictionary are free form, and should contain the state of the userinterface. - /// When the backup is invoked, the method is invoked with the options dictionary. - /// At this point the control should setup the Duplicati options, based on the saved userinterface state. - /// This enables the user interface to be decoupled from the actual options. - /// - public interface IGUIControl - { - /// - /// The title of the page, shown as the wizard title or the tab caption - /// - string PageTitle { get; } - - /// - /// The page description, shown as a helptext in the wizard or as a tooltip on a tab - /// - string PageDescription { get; } - - /// - /// A method to retrieve a user interface control. - /// The method should keep a reference to the dictionary. - /// The control will be resized to fit in the container. - /// - /// The set of settings defined by the calling application - /// A set of options, either empty or previously stored by the control - /// The control that represents the user interface - Control GetControl(IDictionary applicationSettings, IDictionary options); - - /// - /// Method that is called when the user leaves the form. - /// This method can be used to store data from the interface in the dictionary, - /// so the user interface can be reconstructed later. - /// Do not throw exceptions to interrupt this method as that will remove the "back" option in the wizard, - /// return false in the method instead. - /// - /// The UI object created by the GetControl call - void Leave(Control control); - - /// - /// A method that is called when the form should be validated. - /// The method should inform the user if the validation fails. - /// - /// The UI object created by the GetControl call - /// True if the data is valid, false otherwise - bool Validate(Control control); - - /// - /// This method sets up the Duplicati options, based on a previous setup. - /// The method should read the saved setup from , and set the appropriate . - /// If the UI represents a backend, the function should return the backend URL, otherwise the return value is ignored. - /// - /// The set of settings defined by the calling application - /// A set of previously saved options for the control - /// A set of commandline options passed to Duplicati - /// The destination path if the control is for a backend, otherwise null - string GetConfiguration(IDictionary applicationSettings, IDictionary guiOptions, IDictionary commandlineOptions); - } -} diff --git a/Duplicati/Library/Interface/IGUIMiniControl.cs b/Duplicati/Library/Interface/IGUIMiniControl.cs deleted file mode 100644 index 294eb18bd..000000000 --- a/Duplicati/Library/Interface/IGUIMiniControl.cs +++ /dev/null @@ -1,37 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; - -namespace Duplicati.Library.Interface -{ - /// - /// An interface that indicates that the control does not require a full page. - /// If the host application chooses to do so, it may display a collection of - /// mini controls on a single page, rather than display them on a page each. - /// This makes the UI less cluttered if there are many small custom controls. - /// A control should implement this interface if it requires only one or two - /// lines, eg. less than 40 pixels high. - /// - public interface IGUIMiniControl : IGUIControl - { - } -} diff --git a/Duplicati/Library/Interface/ISettingsControl.cs b/Duplicati/Library/Interface/ISettingsControl.cs deleted file mode 100644 index 4744b747c..000000000 --- a/Duplicati/Library/Interface/ISettingsControl.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; - -namespace Duplicati.Library.Interface -{ - /// - /// An interface for modules that register a control in the settings menu. - /// This control will be placed in a tab page. - /// The method is invoked for each custom control module when generating a backup. - /// When editing/creating a backup job, the and functions are invoked. - /// - public interface ISettingsControl : IGUIControl - { - /// - /// Gets a key that uniquely identifies the control - /// - string Key { get; } - - /// - /// Called when the user is editing or creating a backup. - /// This method can alter the applicationSettings environment and thus communicate with another UI plugin, - /// such as an or . - /// - /// The application settings - /// The options saved earlier when configuring the control - void BeginEdit(IDictionary applicationSettings, IDictionary guiOptions); - - /// - /// Called when the user has finished editing or creating a backup. - /// This method can be used to alter the collection, - /// and thus persist a change. - /// As the other elements can also modify the collection, - /// this can be used to communicate changes from another component. - /// - /// The application settings - /// The options saved earlier when configuring the control - void EndEdit(IDictionary applicationSettings, IDictionary guiOptions); - } -} diff --git a/Duplicati/Library/Interface/Properties/AssemblyInfo.cs b/Duplicati/Library/Interface/Properties/AssemblyInfo.cs deleted file mode 100644 index 27acf96f4..000000000 --- a/Duplicati/Library/Interface/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Library.Interfaces")] -[assembly: AssemblyDescription("The Duplicati library with all publicly exposed interfaces")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Library.Interfaces")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("7f103026-5a12-4f03-8bb7-d7979b16cf1f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 119be4efc..81d79a927 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,59 +1,24 @@ - - + + - Debug - AnyCPU - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Library - Duplicati.Library.Localization - Duplicati.Library.Localization - ..\Main\Duplicati.snk - v4.5 - - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - false - - - full - true - bin\Release - prompt - 4 - false - false + netstandard2.0;net45 + 2.0.0.7 + true + Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Localization + Duplicati Team + Duplicati Team + Localization implementation for Duplicati + Localization + - - - ..\..\..\packages\NGettext.0.6.3\lib\net45\NGettext.dll - - + - - - - - - - - - - + - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Localization/Duplicati.snk b/Duplicati/Library/Localization/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!TThe localization to use. public LocalizationContext(System.Globalization.CultureInfo ci) { + /* TODO-DNC m_prev = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData(LocalizationService.LOGICAL_CONTEXT_KEY); System.Runtime.Remoting.Messaging.CallContext.LogicalSetData(LocalizationService.LOGICAL_CONTEXT_KEY, ci.Name); + */ m_isDisposed = false; } @@ -56,7 +58,9 @@ namespace Duplicati.Library.Localization { if (!m_isDisposed) { + /* TODO-DNC System.Runtime.Remoting.Messaging.CallContext.LogicalSetData(LocalizationService.LOGICAL_CONTEXT_KEY, m_prev); + */ m_isDisposed = true; } } diff --git a/Duplicati/Library/Localization/LocalizationService.cs b/Duplicati/Library/Localization/LocalizationService.cs index 1e2750bd0..49efc28ed 100644 --- a/Duplicati/Library/Localization/LocalizationService.cs +++ b/Duplicati/Library/Localization/LocalizationService.cs @@ -34,10 +34,11 @@ namespace Duplicati.Library.Localization /// private static Dictionary Services = new Dictionary(); + /* TODO-DNC /// /// The key for accessing logical context /// - internal const string LOGICAL_CONTEXT_KEY = "DUPLICATI_LOCALIZATION_CULTURE_CONTEXT"; + internal const string LOGICAL_CONTEXT_KEY = "DUPLICATI_LOCALIZATION_CULTURE_CONTEXT"; */ /// /// Regular expression to match a locale @@ -93,9 +94,11 @@ namespace Duplicati.Library.Localization { get { + /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md var lc = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData(LOGICAL_CONTEXT_KEY) as string; if (!string.IsNullOrWhiteSpace(lc)) return Get(new CultureInfo(lc)); + */ return Get(CultureInfo.CurrentCulture); } } diff --git a/Duplicati/Library/Localization/Properties/AssemblyInfo.cs b/Duplicati/Library/Localization/Properties/AssemblyInfo.cs deleted file mode 100644 index e38dd3a1e..000000000 --- a/Duplicati/Library/Localization/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.Localization")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/Localization/packages.config b/Duplicati/Library/Localization/packages.config deleted file mode 100644 index dd9f8d80b..000000000 --- a/Duplicati/Library/Localization/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index dc22c3b0f..5ed6a76b1 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -84,7 +84,6 @@ - diff --git a/Duplicati/Library/Utility/app.config b/Duplicati/Library/Utility/app.config deleted file mode 100644 index 469464a22..000000000 --- a/Duplicati/Library/Utility/app.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 3aff3525b..58e85d010 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -296,16 +296,16 @@ licenses\rumps\licensedata.json PreserveNewest - - licenses\System.Net.FtpClient\Homepage.txt + + licenses\FluentFTP\Homepage.txt PreserveNewest - - licenses\System.Net.FtpClient\License.txt + + licenses\FluentFTP\License.txt PreserveNewest - - licenses\System.Net.FtpClient\licensedata.json + + licenses\FluentFTP\licensedata.json PreserveNewest diff --git a/thirdparty/FluentFTP/Homepage.txt b/thirdparty/FluentFTP/Homepage.txt new file mode 100644 index 000000000..a4f6e5d3e --- /dev/null +++ b/thirdparty/FluentFTP/Homepage.txt @@ -0,0 +1 @@ +https://github.com/robinrodricks/FluentFTP \ No newline at end of file diff --git a/thirdparty/System.Net.FtpClient/License.txt b/thirdparty/FluentFTP/License.txt similarity index 98% rename from thirdparty/System.Net.FtpClient/License.txt rename to thirdparty/FluentFTP/License.txt index 524a3e771..8290b4d91 100644 --- a/thirdparty/System.Net.FtpClient/License.txt +++ b/thirdparty/FluentFTP/License.txt @@ -4,4 +4,4 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/thirdparty/System.Net.FtpClient/licensedata.json b/thirdparty/FluentFTP/licensedata.json similarity index 58% rename from thirdparty/System.Net.FtpClient/licensedata.json rename to thirdparty/FluentFTP/licensedata.json index 1ace0c429..d14a4adda 100644 --- a/thirdparty/System.Net.FtpClient/licensedata.json +++ b/thirdparty/FluentFTP/licensedata.json @@ -1,7 +1,7 @@ { - "name": "System.Net.FtpClient", + "name": "FluentFTP", "description": "A .Net library for connecting with the FTP protocol", - "link": "https://netftp.codeplex.com", + "link": "https://github.com/robinrodricks/FluentFTP", "license": "MIT", "notes": "" } diff --git a/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Runtime.dll b/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Runtime.dll deleted file mode 100644 index a31a7a2e42ddaed177d7864451757e73dfddb1cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305408 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 diff --git a/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.dll b/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.dll deleted file mode 100644 index e3304da68847aef33bfb1681d585722be0aab241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676576 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

JD5hK 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 diff --git a/thirdparty/System.Net.FtpClient/Homepage.txt b/thirdparty/System.Net.FtpClient/Homepage.txt deleted file mode 100644 index 91f956647..000000000 --- a/thirdparty/System.Net.FtpClient/Homepage.txt +++ /dev/null @@ -1 +0,0 @@ -https://netftp.codeplex.com \ No newline at end of file diff --git a/thirdparty/System.Net.FtpClient/System.Net.FtpClient.dll b/thirdparty/System.Net.FtpClient/System.Net.FtpClient.dll deleted file mode 100644 index 4b14fae2f6bca9a2ce2c29fec086d0a45fb596f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82432 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 From cb3d830e8ef8989ddf0133c353b74dc335db71e1 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 24 Mar 2018 18:36:26 +0100 Subject: [PATCH 002/253] dependencies corrections --- ...plicati.Library.Backend.AmazonCloudDrive.csproj | 2 +- .../Backend/AmazonCloudDrive/packages.config | 4 ---- .../Duplicati.Library.Backend.AzureBlob.csproj | 4 ++-- .../Library/Backend/AzureBlob/packages.config | 14 -------------- .../Duplicati.Library.Backend.Backblaze.csproj | 2 +- .../Library/Backend/Backblaze/packages.config | 4 ---- .../Box/Duplicati.Library.Backend.Box.csproj | 2 +- Duplicati/Library/Backend/Box/packages.config | 4 ---- .../Duplicati.Library.Backend.Dropbox.csproj | 2 +- Duplicati/Library/Backend/Dropbox/packages.config | 4 ---- ...Duplicati.Library.Backend.GoogleServices.csproj | 2 +- .../Library/Backend/GoogleServices/packages.config | 4 ---- .../Mega/Duplicati.Library.Backend.Mega.csproj | 4 ++-- Duplicati/Library/Backend/Mega/packages.config | 6 ------ .../Duplicati.Library.OAuthHelper.csproj | 2 +- .../Library/Backend/OAuthHelper/packages.config | 4 ---- .../Duplicati.Library.Backend.OneDrive.csproj | 2 +- Duplicati/Library/Backend/OneDrive/packages.config | 4 ---- .../Duplicati.Library.Backend.OpenStack.csproj | 2 +- .../Library/Backend/OpenStack/packages.config | 4 ---- .../Rclone/Duplicati.Library.Backend.Rclone.csproj | 2 +- Duplicati/Library/Backend/Rclone/packages.config | 4 ---- Duplicati/Library/Backend/S3/packages.config | 6 ------ Duplicati/Library/Backend/SSHv2/packages.config | 4 ---- .../Duplicati.Library.Backend.SharePoint.csproj | 2 +- .../Sia/Duplicati.Library.Backend.Sia.csproj | 2 +- Duplicati/Library/Backend/Sia/packages.config | 4 ---- .../Duplicati.Library.Backend.TahoeLAFS.csproj | 2 +- .../Library/Backend/TahoeLAFS/packages.config | 4 ---- 29 files changed, 16 insertions(+), 90 deletions(-) delete mode 100644 Duplicati/Library/Backend/AmazonCloudDrive/packages.config delete mode 100644 Duplicati/Library/Backend/AzureBlob/packages.config delete mode 100644 Duplicati/Library/Backend/Backblaze/packages.config delete mode 100644 Duplicati/Library/Backend/Box/packages.config delete mode 100644 Duplicati/Library/Backend/Dropbox/packages.config delete mode 100644 Duplicati/Library/Backend/GoogleServices/packages.config delete mode 100644 Duplicati/Library/Backend/Mega/packages.config delete mode 100644 Duplicati/Library/Backend/OAuthHelper/packages.config delete mode 100644 Duplicati/Library/Backend/OneDrive/packages.config delete mode 100644 Duplicati/Library/Backend/OpenStack/packages.config delete mode 100644 Duplicati/Library/Backend/Rclone/packages.config delete mode 100644 Duplicati/Library/Backend/S3/packages.config delete mode 100644 Duplicati/Library/Backend/SSHv2/packages.config delete mode 100644 Duplicati/Library/Backend/Sia/packages.config delete mode 100644 Duplicati/Library/Backend/TahoeLAFS/packages.config diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj index a26b54304..002c8b4be 100644 --- a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj +++ b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/packages.config b/Duplicati/Library/Backend/AmazonCloudDrive/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/AmazonCloudDrive/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index f00ad22e7..4e7636344 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -18,9 +18,9 @@ - + - + diff --git a/Duplicati/Library/Backend/AzureBlob/packages.config b/Duplicati/Library/Backend/AzureBlob/packages.config deleted file mode 100644 index 720f12ed8..000000000 --- a/Duplicati/Library/Backend/AzureBlob/packages.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index ec54bfd71..7bb661a68 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/Backblaze/packages.config b/Duplicati/Library/Backend/Backblaze/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/Backblaze/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 15527a9d2..26033863d 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/Box/packages.config b/Duplicati/Library/Backend/Box/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/Box/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index b97f6a854..aec236659 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/Dropbox/packages.config b/Duplicati/Library/Backend/Dropbox/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/Dropbox/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index c248fdadc..80b56f904 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/GoogleServices/packages.config b/Duplicati/Library/Backend/GoogleServices/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/GoogleServices/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 3e7c8bc44..c76f1ba99 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/Duplicati/Library/Backend/Mega/packages.config b/Duplicati/Library/Backend/Mega/packages.config deleted file mode 100644 index d8d29881e..000000000 --- a/Duplicati/Library/Backend/Mega/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index 05ef5b870..4b06cb045 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/OAuthHelper/packages.config b/Duplicati/Library/Backend/OAuthHelper/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/OAuthHelper/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 9a1cc01ef..852753fad 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/OneDrive/packages.config b/Duplicati/Library/Backend/OneDrive/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/OneDrive/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index 33e8b8889..f1b936f00 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/OpenStack/packages.config b/Duplicati/Library/Backend/OpenStack/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/OpenStack/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index c99d1d8fa..3a471eb61 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/Rclone/packages.config b/Duplicati/Library/Backend/Rclone/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/Rclone/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/S3/packages.config b/Duplicati/Library/Backend/S3/packages.config deleted file mode 100644 index fc1424bcc..000000000 --- a/Duplicati/Library/Backend/S3/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/SSHv2/packages.config b/Duplicati/Library/Backend/SSHv2/packages.config deleted file mode 100644 index 5df54958b..000000000 --- a/Duplicati/Library/Backend/SSHv2/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index ec96f439d..3f7c8fc82 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index b44500ba6..73ee68db7 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/Sia/packages.config b/Duplicati/Library/Backend/Sia/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/Sia/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 58f2a35f7..8a90a381f 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/TahoeLAFS/packages.config b/Duplicati/Library/Backend/TahoeLAFS/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/Backend/TahoeLAFS/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From f5672f69d9e4840d2bdd803fdfc08e975808c16c Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 25 Mar 2018 22:00:45 +0200 Subject: [PATCH 003/253] upgrade .net to 4.6.2 --- .../AutoUpdateBuilder.csproj | 2 +- .../DependencyFinder/DependencyFinder.csproj | 2 +- .../UpdateVersionStamp.csproj | 2 +- ...Duplicati.CommandLine.BackendTester.csproj | 2 +- .../Duplicati.CommandLine.BackendTool.csproj | 2 +- .../CommandLine/Duplicati.CommandLine.csproj | 2 +- .../Duplicati.CommandLine.RecoveryTool.csproj | 2 +- .../Duplicati.GUI.TrayIcon.csproj | 2 +- .../Duplicati.Library.AutoUpdater.csproj | 88 ++--- Duplicati/Library/AutoUpdater/Duplicati.snk | Bin 0 -> 596 bytes .../AutoUpdater/Properties/AssemblyInfo.cs | 44 --- .../Library/AutoUpdater/UpdaterManager.cs | 341 ++++++------------ Duplicati/Library/AutoUpdater/packages.config | 4 - ...cati.Library.Backend.AlternativeFTP.csproj | 4 +- ...ti.Library.Backend.AmazonCloudDrive.csproj | 2 +- ...Duplicati.Library.Backend.AzureBlob.csproj | 2 +- ...Duplicati.Library.Backend.Backblaze.csproj | 2 +- .../Box/Duplicati.Library.Backend.Box.csproj | 2 +- ...uplicati.Library.Backend.CloudFiles.csproj | 2 +- .../Duplicati.Library.Backend.Dropbox.csproj | 2 +- .../FTP/Duplicati.Library.Backend.FTP.csproj | 2 +- .../Duplicati.Library.Backend.File.csproj | 2 +- ...cati.Library.Backend.GoogleServices.csproj | 2 +- .../Duplicati.Library.Backend.HubiC.csproj | 2 +- ...uplicati.Library.Backend.Jottacloud.csproj | 2 +- .../Duplicati.Library.Backend.Mega.csproj | 2 +- .../Duplicati.Library.OAuthHelper.csproj | 2 +- .../Duplicati.Library.Backend.OneDrive.csproj | 2 +- ...Duplicati.Library.Backend.OpenStack.csproj | 2 +- .../Duplicati.Library.Backend.Rclone.csproj | 2 +- .../S3/Duplicati.Library.Backend.S3.csproj | 2 +- .../Duplicati.Library.Backend.SSHv2.csproj | 2 +- ...uplicati.Library.Backend.SharePoint.csproj | 4 +- .../Sia/Duplicati.Library.Backend.Sia.csproj | 2 +- ...Duplicati.Library.Backend.TahoeLAFS.csproj | 2 +- .../Duplicati.Library.Backend.WEBDAV.csproj | 2 +- .../Duplicati.Library.Compression.csproj | 2 +- .../Duplicati.Library.DynamicLoader.csproj | 2 +- .../Duplicati.Library.Encryption.csproj | 2 +- .../Duplicati.Library.Interface.csproj | 2 +- .../Duplicati.Library.Localization.csproj | 2 +- .../Logging/Duplicati.Library.Logging.csproj | 2 +- .../Main/Duplicati.Library.Main.csproj | 2 +- .../Duplicati.Library.Modules.Builtin.csproj | 2 +- .../Duplicati.Library.SQLiteHelper.csproj | 2 +- .../Duplicati.Library.Snapshots.csproj | 2 +- .../Duplicati.Library.UsageReporter.csproj | 2 +- .../Utility/Duplicati.Library.Utility.csproj | 7 +- Duplicati/License/Duplicati.License.csproj | 23 +- .../Duplicati.Server.Serialization.csproj | 2 +- Duplicati/Server/Duplicati.Server.csproj | 2 +- Duplicati/Service/Duplicati.Service.csproj | 2 +- Duplicati/Tools/Duplicati.Tools.csproj | 2 +- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 2 +- .../WindowsService/WindowsService.csproj | 2 +- Tools/SQLiteTool/SQLiteTool.csproj | 2 +- thirdparty/TlsTest/TlsTest.csproj | 2 +- thirdparty/UnixSupport/UnixSupport.csproj | 2 +- thirdparty/mozroots/mozroots.csproj | 2 +- 59 files changed, 195 insertions(+), 420 deletions(-) create mode 100644 Duplicati/Library/AutoUpdater/Duplicati.snk delete mode 100644 Duplicati/Library/AutoUpdater/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/AutoUpdater/packages.config diff --git a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj index 1685273e7..1b2e07d19 100644 --- a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj +++ b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj @@ -8,7 +8,7 @@ False AutoUpdateBuilder AutoUpdateBuilder - v4.5 + v4.6.2 true diff --git a/BuildTools/DependencyFinder/DependencyFinder.csproj b/BuildTools/DependencyFinder/DependencyFinder.csproj index 42a948ebf..01266941a 100644 --- a/BuildTools/DependencyFinder/DependencyFinder.csproj +++ b/BuildTools/DependencyFinder/DependencyFinder.csproj @@ -8,7 +8,7 @@ False DependencyFinder DependencyFinder - v4.5 + v4.6.2 true diff --git a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj index e8524f649..f30a036ef 100644 --- a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj +++ b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj @@ -10,7 +10,7 @@ False UpdateVersionStamp UpdateVersionStamp - v4.5 + v4.6.2 diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index f5c9563ef..f518279ed 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -15,7 +15,7 @@ 3.5 Duplicati.snk - v4.5 + v4.6.2 false true diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index bb77bbadc..33bdffdb5 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -9,7 +9,7 @@ Duplicati.CommandLine.BackendTool Duplicati.CommandLine.BackendTool ..\Duplicati.snk - v4.5 + v4.6.2 false true diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index cb5e91dd1..60419c63a 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -16,7 +16,7 @@ 3.5 - v4.5 + v4.6.2 false true diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 6a21e8313..c838d0325 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -9,7 +9,7 @@ Duplicati.CommandLine.RecoveryTool Duplicati.CommandLine.RecoveryTool Duplicati.snk - v4.5 + v4.6.2 false true diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 4245a3399..4646f08ef 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -25,7 +25,7 @@ false true Duplicati.ico - v4.5 + v4.6.2 false true diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 851c16443..8fc0cc91d 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -1,73 +1,29 @@ - - + + - Debug - AnyCPU - {7E119745-1F62-43F0-936C-F312A1912C0B} - Exe - False - Duplicati.Library.AutoUpdater - Duplicati.Library.AutoUpdater - ..\..\GUI\Duplicati.GUI.TrayIcon\Duplicati.snk - Duplicati.Library.AutoUpdater.Program - v4.5 - - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - false - - - full - true - bin\Release - prompt - 4 - false - false + netstandard2.0 + 2.0.0.7 + true + Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.AutoUpdater + Duplicati Team + Duplicati Team + AutoUpdater for Duplicati + AutoUpdater + - - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + - - - - - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Duplicati.Library.Compression - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Duplicati.License - + + + + + @@ -76,7 +32,5 @@ - - - + \ No newline at end of file diff --git a/Duplicati/Library/AutoUpdater/Duplicati.snk b/Duplicati/Library/AutoUpdater/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T cb = null; - if (progress != null) - cb = (s) => { progress(Math.Min(1.0, Math.Max(0.0, (double)s / version.CompressedSize))); }; - - var wreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); - wreq.UserAgent = string.Format("{0} v{1}", APPNAME, SelfVersion.Version); - wreq.Headers.Add("X-Install-ID", InstallID); - - var areq = new Duplicati.Library.Utility.AsyncHttpRequest(wreq); - using (var resp = areq.GetResponse()) - using (var rss = areq.GetResponseStream()) - using (var pgs = new Duplicati.Library.Utility.ProgressReportingStream(rss, version.CompressedSize, cb)) - { - Duplicati.Library.Utility.Utility.CopyStream(pgs, tempfile); - } - - var sha256 = System.Security.Cryptography.SHA256.Create(); - var md5 = System.Security.Cryptography.MD5.Create(); - - if (tempfile.Length != version.CompressedSize) - throw new Exception(string.Format("Invalid file size {0}, expected {1} for {2}", tempfile.Length, version.CompressedSize, url)); - - tempfile.Position = 0; - var sha256hash = Convert.ToBase64String(sha256.ComputeHash(tempfile)); - if (sha256hash != version.SHA256) - throw new Exception(string.Format("Damaged or corrupted file, sha256 mismatch for {0}", url)); - - - tempfile.Position = 0; - var md5hash = Convert.ToBase64String(md5.ComputeHash(tempfile)); - if (md5hash != version.MD5) - throw new Exception(string.Format("Damaged or corrupted file, md5 mismatch for {0}", url)); - - tempfile.Position = 0; - using (var tempfolder = new Duplicati.Library.Utility.TempFolder()) - using (ICompression zip = new Duplicati.Library.Compression.FileArchiveZip(tempfile, ArchiveMode.Read, new Dictionary())) - { - foreach (var file in zip.ListFilesWithSize("")) - { - if (System.IO.Path.IsPathRooted(file.Key) || file.Key.Trim().StartsWith("..", StringComparison.OrdinalIgnoreCase)) - throw new Exception(string.Format("Out-of-place file path detected: {0}", file.Key)); - - var targetpath = System.IO.Path.Combine(tempfolder, file.Key); - var targetfolder = System.IO.Path.GetDirectoryName(targetpath); - if (!System.IO.Directory.Exists(targetfolder)) - System.IO.Directory.CreateDirectory(targetfolder); - - using (var zs = zip.OpenRead(file.Key)) - using (var fs = System.IO.File.Create(targetpath)) - zs.CopyTo(fs); - } - - if (VerifyUnpackedFolder(tempfolder, version)) - { - var versionstring = TryParseVersion(version.Version).ToString(); - var targetfolder = System.IO.Path.Combine(INSTALLDIR, versionstring); - if (System.IO.Directory.Exists(targetfolder)) - System.IO.Directory.Delete(targetfolder, true); - - System.IO.Directory.CreateDirectory(targetfolder); - - var tempfolderpath = Duplicati.Library.Utility.Utility.AppendDirSeparator(tempfolder); - var tempfolderlength = tempfolderpath.Length; - - // Would be nice, but does not work :( - //System.IO.Directory.Move(tempfolder, targetfolder); - - foreach (var e in Duplicati.Library.Utility.Utility.EnumerateFileSystemEntries(tempfolder)) - { - var relpath = e.Substring(tempfolderlength); - if (string.IsNullOrWhiteSpace(relpath)) - continue; - - var fullpath = System.IO.Path.Combine(targetfolder, relpath); - if (relpath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) - System.IO.Directory.CreateDirectory(fullpath); - else - System.IO.File.Copy(e, fullpath); - } - - // Verification will kick in when we list the installed updates - //VerifyUnpackedFolder(targetfolder, version); - System.IO.File.WriteAllText(System.IO.Path.Combine(INSTALLDIR, CURRENT_FILE), versionstring); - - m_hasUpdateInstalled = null; - - var obsolete = (from n in FindInstalledVersions() - where n.Value.Version != version.Version && n.Value.Version != SelfVersion.Version - let x = TryParseVersion(n.Value.Version) - orderby x descending - select n).Skip(1).ToArray(); - - foreach (var f in obsolete) - try { System.IO.Directory.Delete(f.Key, true); } - catch { } - - return true; - } - else - { - throw new Exception(string.Format("Unable to verify unpacked folder for url: {0}", url)); - } + { + Action cb = null; + if (progress != null) + cb = (s) => { progress(Math.Min(1.0, Math.Max(0.0, (double)s / version.CompressedSize))); }; + + var wreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); + wreq.UserAgent = string.Format("{0} v{1}", APPNAME, SelfVersion.Version); + wreq.Headers.Add("X-Install-ID", InstallID); + + var areq = new Duplicati.Library.Utility.AsyncHttpRequest(wreq); + using (var resp = areq.GetResponse()) + using (var rss = areq.GetResponseStream()) + using (var pgs = new Duplicati.Library.Utility.ProgressReportingStream(rss, version.CompressedSize, cb)) + { + Duplicati.Library.Utility.Utility.CopyStream(pgs, tempfile); + } + + var sha256 = System.Security.Cryptography.SHA256.Create(); + var md5 = System.Security.Cryptography.MD5.Create(); + + if (tempfile.Length != version.CompressedSize) + throw new Exception(string.Format("Invalid file size {0}, expected {1} for {2}", tempfile.Length, version.CompressedSize, url)); + + tempfile.Position = 0; + var sha256hash = Convert.ToBase64String(sha256.ComputeHash(tempfile)); + if (sha256hash != version.SHA256) + throw new Exception(string.Format("Damaged or corrupted file, sha256 mismatch for {0}", url)); + + + tempfile.Position = 0; + var md5hash = Convert.ToBase64String(md5.ComputeHash(tempfile)); + if (md5hash != version.MD5) + throw new Exception(string.Format("Damaged or corrupted file, md5 mismatch for {0}", url)); + + tempfile.Position = 0; + using (var tempfolder = new Duplicati.Library.Utility.TempFolder()) + using (ICompression zip = new Duplicati.Library.Compression.FileArchiveZip(tempfile, ArchiveMode.Read, new Dictionary())) + { + foreach (var file in zip.ListFilesWithSize("")) + { + if (System.IO.Path.IsPathRooted(file.Key) || file.Key.Trim().StartsWith("..", StringComparison.OrdinalIgnoreCase)) + throw new Exception(string.Format("Out-of-place file path detected: {0}", file.Key)); + + var targetpath = System.IO.Path.Combine(tempfolder, file.Key); + var targetfolder = System.IO.Path.GetDirectoryName(targetpath); + if (!System.IO.Directory.Exists(targetfolder)) + System.IO.Directory.CreateDirectory(targetfolder); + + using (var zs = zip.OpenRead(file.Key)) + using (var fs = System.IO.File.Create(targetpath)) + zs.CopyTo(fs); + } + + if (VerifyUnpackedFolder(tempfolder, version)) + { + var versionstring = TryParseVersion(version.Version).ToString(); + var targetfolder = System.IO.Path.Combine(INSTALLDIR, versionstring); + if (System.IO.Directory.Exists(targetfolder)) + System.IO.Directory.Delete(targetfolder, true); + + System.IO.Directory.CreateDirectory(targetfolder); + + var tempfolderpath = Duplicati.Library.Utility.Utility.AppendDirSeparator(tempfolder); + var tempfolderlength = tempfolderpath.Length; + + // Would be nice, but does not work :( + //System.IO.Directory.Move(tempfolder, targetfolder); + + foreach (var e in Duplicati.Library.Utility.Utility.EnumerateFileSystemEntries(tempfolder)) + { + var relpath = e.Substring(tempfolderlength); + if (string.IsNullOrWhiteSpace(relpath)) + continue; + + var fullpath = System.IO.Path.Combine(targetfolder, relpath); + if (relpath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)) + System.IO.Directory.CreateDirectory(fullpath); + else + System.IO.File.Copy(e, fullpath); + } + + // Verification will kick in when we list the installed updates + //VerifyUnpackedFolder(targetfolder, version); + System.IO.File.WriteAllText(System.IO.Path.Combine(INSTALLDIR, CURRENT_FILE), versionstring); + + m_hasUpdateInstalled = null; + + var obsolete = (from n in FindInstalledVersions() + where n.Value.Version != version.Version && n.Value.Version != SelfVersion.Version + let x = TryParseVersion(n.Value.Version) + orderby x descending + select n).Skip(1).ToArray(); + + foreach (var f in obsolete) + try { System.IO.Directory.Delete(f.Key, true); } + catch { } + + return true; + } + else + { + throw new Exception(string.Format("Unable to verify unpacked folder for url: {0}", url)); + } } } } @@ -1035,7 +1035,8 @@ namespace Duplicati.Library.AutoUpdater m_hasUpdateInstalled = null; // Check if there are updates installed, otherwise use current - KeyValuePair best = new KeyValuePair(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, SelfVersion); + KeyValuePair best = new KeyValuePair(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), SelfVersion); + if (HasUpdateInstalled) best = m_hasUpdateInstalled.Value; @@ -1066,9 +1067,6 @@ namespace Duplicati.Library.AutoUpdater public static int RunFromMostRecent(System.Reflection.MethodInfo method, string[] cmdargs, AutoUpdateStrategy defaultstrategy = AutoUpdateStrategy.CheckDuring) { - if (Library.Utility.Utility.ParseBool(Environment.GetEnvironmentVariable("AUTOUPDATER_USE_APPDOMAIN"), false)) - return RunFromMostRecentAppDomain(method, cmdargs, defaultstrategy); - else return RunFromMostRecentSpawn(method, cmdargs, defaultstrategy); } @@ -1136,133 +1134,6 @@ namespace Duplicati.Library.AutoUpdater } } - - public static int RunFromMostRecentAppDomain(System.Reflection.MethodInfo method, string[] cmdargs, AutoUpdateStrategy defaultstrategy = AutoUpdateStrategy.CheckDuring) - { - // If the update is disabled, go straight in - if (DISABLE_UPDATE_DOMAIN) - return RunMethod(method, cmdargs); - - // If we are not the primary domain, just execute - if (!AppDomain.CurrentDomain.IsDefaultAppDomain()) - { - int r = 0; - WrapWithUpdater(defaultstrategy, () => { - r = RunMethod(method, cmdargs); - }); - - return r; - } - - // If we are a re-launch, wait briefly for the other process to exit - var sleepmarker = System.Environment.GetEnvironmentVariable(string.Format(SLEEP_ENVNAME_TEMPLATE, APPNAME)); - if (!string.IsNullOrWhiteSpace(sleepmarker)) - { - System.Environment.SetEnvironmentVariable(string.Format(SLEEP_ENVNAME_TEMPLATE, APPNAME), null); - System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10)); - } - - // Check if there are updates installed, otherwise use current - KeyValuePair best = new KeyValuePair(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, SelfVersion); - if (HasUpdateInstalled) - best = m_hasUpdateInstalled.Value; - - if (INSTALLDIR != null && System.IO.File.Exists(System.IO.Path.Combine(INSTALLDIR, CURRENT_FILE))) - { - try - { - var current = System.IO.File.ReadAllText(System.IO.Path.Combine(INSTALLDIR, CURRENT_FILE)).Trim(); - if (!string.IsNullOrWhiteSpace(current)) - { - var targetfolder = System.IO.Path.Combine(INSTALLDIR, current); - var currentmanifest = ReadInstalledManifest(targetfolder); - if (currentmanifest != null && TryParseVersion(currentmanifest.Version) > TryParseVersion(best.Value.Version) && VerifyUnpackedFolder(targetfolder, currentmanifest)) - best = new KeyValuePair(targetfolder, currentmanifest); - } - } - catch (Exception ex) - { - if (OnError != null) - OnError(ex); - } - } - - Environment.SetEnvironmentVariable(string.Format(BASEINSTALLDIR_ENVNAME_TEMPLATE, APPNAME), InstalledBaseDir); - - var folder = best.Key; - - // Basic idea with the loop is that the running AppDomain can use - // RUN_UPDATED_ENVNAME_TEMPLATE to signal that a new version is ready - // when the caller exits, the new update is executed - // - // This allows more or less seamless updates - // - - int result = 0; - while (!string.IsNullOrWhiteSpace(folder) && System.IO.Directory.Exists(folder)) - { - var prevfolder = folder; - // Create the new domain - var domain = AppDomain.CreateDomain( - "UpdateDomain", - null, - folder, - "", - false - ); - - domain.SetData("LOCALIZATION_FOLDER", InstalledBaseDir); - - result = domain.ExecuteAssemblyByName(method.DeclaringType.Assembly.GetName().Name, cmdargs); - - folder = (string)domain.GetData(RUN_UPDATED_FOLDER_PATH); - - try { AppDomain.Unload(domain); } - catch (Exception ex) - { - Console.WriteLine("Appdomain unload error: {0}", ex); - } - - if (!string.IsNullOrWhiteSpace(folder)) - { - if (!VerifyUnpackedFolder(folder)) - folder = prevfolder; //Go back and run the previous version - else if (RequiresRespawn) - { - // We have a valid update, and the current instance is terminated. - // But due to external libraries, we need to re-spawn the original process - - try - { - var app = Environment.GetCommandLineArgs().First(); - var args = Library.Utility.Utility.WrapAsCommandLine(Environment.GetCommandLineArgs().Skip(1), false); - - if (!System.IO.Path.IsPathRooted(app)) - app = System.IO.Path.Combine(InstalledBaseDir, app); - - - // Re-launch but give the OS a little time to fully unload all open handles, etc. - var si = new System.Diagnostics.ProcessStartInfo(app, args); - si.UseShellExecute = false; - si.EnvironmentVariables.Add(string.Format(SLEEP_ENVNAME_TEMPLATE, APPNAME), "1"); - - System.Diagnostics.Process.Start(si); - - return 0; - } - catch (Exception ex) - { - if (OnError != null) - OnError(ex); - folder = prevfolder; - } - } - } - } - - return result; - } - } } diff --git a/Duplicati/Library/AutoUpdater/packages.config b/Duplicati/Library/AutoUpdater/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Library/AutoUpdater/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 2edbccc16..5f0bda4bd 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk @@ -11,6 +11,8 @@ Duplicati Team An alternative FTP backend for Duplicati AlternativeFTP + Duplicati.Backend.AlternativeFTP + Duplicati.Backend.AlternativeFTP diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj index 002c8b4be..56cecb784 100644 --- a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj +++ b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj @@ -2,7 +2,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 4e7636344..065c4ac44 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index 7bb661a68..5242801e0 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 26033863d..ea7d943b9 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index 6d3845eb7..b548fd3de 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index aec236659..f726e4a11 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index e8de7fca2..d76f61c3c 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index 6ed240c43..ad601dc49 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 80b56f904..3c3f9b4b3 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index 4270c70b1..9c559df4f 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index 53d69beb9..a6da09f96 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index c76f1ba99..096c0bc0f 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index 4b06cb045..857c371b0 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 852753fad..8bda9f48a 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index f1b936f00..6cee26059 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 3a471eb61..dd8bfe2d3 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index 7c2568eee..a64941325 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index e0309e806..d0bc97259 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index 3f7c8fc82..aa277f0a7 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,7 +1,7 @@  - net45 + net462 2.0.0.7 true Duplicati.snk @@ -17,7 +17,7 @@ - + diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index 73ee68db7..facffe5b9 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 8a90a381f..837b69fc8 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index 02091ed51..3a801b162 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,7 +1,7 @@ - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 86ae3443e..5272c206f 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 7624b1424..1253a98c5 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -12,7 +12,7 @@ 3.5 - v4.5 + v4.6.2 diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index 82439179a..bc60c1df1 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -12,7 +12,7 @@ 3.5 - v4.5 + v4.6.2 diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 6a50ae3ef..005bc81c7 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 81d79a927..43d12e342 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 2.0.0.7 true Duplicati.snk diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index 512a87951..04fc4bcb4 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -12,7 +12,7 @@ 3.5 - v4.5 + v4.6.2 diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 657f584aa..3b7deddb8 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -12,7 +12,7 @@ 3.5 - v4.5 + v4.6.2 diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index a23687eed..4ebcae093 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -14,7 +14,7 @@ 3.5 - v4.5 + v4.6.2 false diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index f6f01f7d9..a1824b73b 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -8,7 +8,7 @@ Duplicati.Library.SQLiteHelper SQLiteHelper ..\..\GUI\Duplicati.GUI.TrayIcon\Duplicati.snk - v4.5 + v4.6.2 false diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index c8aeceac0..b23fb672f 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -15,7 +15,7 @@ 3.5 - v4.5 + v4.6.2 false diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index b00614bad..b1ee90b19 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -7,7 +7,7 @@ Library Duplicati.Library.UsageReporter Duplicati.Library.UsageReporter - v4.5 + v4.6.2 Duplicati.snk false diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 5ed6a76b1..a9f019889 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -12,7 +12,7 @@ 3.5 - v4.5 + v4.6.2 @@ -35,6 +35,9 @@ prompt 4 + + true + diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 58e85d010..ed5b000f4 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -14,7 +14,7 @@ 3.5 - v4.5 + v4.6.2 false @@ -37,6 +37,9 @@ 4 false + + true + + \ No newline at end of file diff --git a/Duplicati/Library/Encryption/Properties/AssemblyInfo.cs b/Duplicati/Library/Encryption/Properties/AssemblyInfo.cs deleted file mode 100644 index 078cde85c..000000000 --- a/Duplicati/Library/Encryption/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Encryption")] -[assembly: AssemblyDescription("Encryption implementation for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Encryption")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("ea360f7d-b721-452e-8a7d-60da8ad1094f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Encryption/app.config b/Duplicati/Library/Encryption/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Encryption/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - From b6316bcc21a35d4e90461a653ac64db77ee22b65 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 24 Jun 2018 12:35:34 +0200 Subject: [PATCH 005/253] added libraries --- .../Microsoft.SharePoint.Client.Portable.dll | Bin 0 -> 823032 bytes ...soft.SharePoint.Client.Runtime.Portable.dll | Bin 0 -> 309008 bytes ...osoft.SharePoint.Client.Runtime.Windows.dll | Bin 0 -> 29968 bytes thirdparty/SharpAESCrypt/SharpAESCrypt.dll | Bin 0 -> 37376 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Portable.dll create mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Runtime.Portable.dll create mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Runtime.Windows.dll create mode 100644 thirdparty/SharpAESCrypt/SharpAESCrypt.dll diff --git a/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Portable.dll b/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Portable.dll new file mode 100644 index 0000000000000000000000000000000000000000..84f97332d7355b070ea0b21443539a36bdfbb8d0 GIT binary patch literal 823032 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

  • ABtDF~`}U?C4G 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 O`j{Aam@fckGeO)95&^j%L^CX4U|?WkVEE6# z$iU3t(8|Cd07hU!0IUKe0%0&PFyweLF!+Ob2@DJ#Y#;^{n=vp5*fTING%zsmFfcHf zcrY-?K&6PH6c`vdkQ8z#Ffe!^@%2hlD@qs`7>;N{{RQ$X6OsamaDrY@aZxe@)NLTY zgACO{Rp-FK;GkEOnvWX`}) zkT1o+z{Sn3zF+1BeXfZGffU*cDgPJ}hccGZgj@@jq zFn`fyxY-~96th7B1kC2ZZZ=q$zvwmGY>)to*&qQ-vxN;<8NwiCmmmudhj^qbC`!aBH*6aceWn3vjcsGxM?VvF0m5 z;#}H*nZccb0aQi`)^UQ|Z;uh~U||_>LKFGN#>v3IR;&z4HYyAZT;dHNS!B;3{9$YZ z34c(U6=q;yU}azsWX@M*VBpeF1Ep8Ce08uRgbkP&To@P_*g$d51xa?6kOarfh)8ha z>_yEWt_Cc3=C}I4ImDx7vO0~ zNgLt^keTlp7#P?=`Hl+|&TJZ5pajjR#a1+#k)c3C8|(xP9R>z2%M&2q6m0|v>oPEK z33G@Eb6TumU|87K_R85p?K?(qw=39@PMGBB{|F#VId#~{d+Zvo1F7w+*0 za_O)Oa^+isvc^3wP8~K*7@I?fjRVT&7iJe^N7m0N9wE#r$SKItmuc_&|Nnn221amY zSbo)%Jp(;s17kx=kPs_F4g&+j3w8zuV)U6hq2T#&Fq1oSdNg?3b!B zgBSzYc3Vh(W-tIH259vUstGSYz$Wz0~z=jzA(OI$1n~R|bOfCbHtGP?Lg&59oALQm@ zxW-+|EynPJ`vtcc13M3hlmwH?JTJJp7|eM<;Zwtt$-~7kkq2bjQZTs>Ox^^O@4zH0 zFUVeJUXZ;-yuZM)3JG^mDq>_5V6b8cWME|g@fsKf7;+hE7&sYtz-=!9hItHu44e!y z3<3;+4IGTZ41oVQdSFc}Oclfh&&m|O)WcY(>XVDcWA{0b&H z*}>+p3p1E87=uX{c43AKpf)eV5r*xI7Z?~Ben5H5Om`U=8FUmu!G458i0LTD45p>l{*XO!Q?=BIEWq8I*DQjv6H~;40cfcTL@}kFx0Sv>d9uX>>RKx zguR$OlL2H~Apze=+2eP zCdpXA<;bqc*vjR`uE;on%a>h~aU)kSyC&mKt{8Sj#sgepjFyb|xpLVZ!FE|PKIJN5 zcVzgBKHVF>0?M=Mo2yyB$bThDV=`lz%By#96C^Jmr&|}bMn8BgPV9cKC~)5&%mCN7AHhse-3n%a#USN7s@OqpkUXl`3$U0b zgEl)zj={z^KczG$)sDe8Gr1_gI6tjKFE}HyC^aBIGp|I?IVUqUuS74XG_NExH&rh@ zGcP5-yjU+KCx-#b4#-I?Ny{(F4Nfg8%S=wiXAFa9N^((-bADcNNn&0}F+QbwV5JQH zX=$0ssbQ%_#hLkeo_QsyMR|!ic=f?t8jxR9l9-f}%7E^^+~VZ?qMXbmhTzKLlGI!V z|D>$cqe_s$g%+UwTcJT~iaLq~0P0cIuOUzAmEG|yXP0FbRu^Ecv zbMlk38FJ$@LEduBE6Xg(&jYE18m$+SQIwjPl9`vT7m`?a&Velv^DF{zZ3Q8?3O)V~A@XX6BLE@&Tmc)ZY9~z@rJm!*_ zn4XtkT#}hw%n(wPn4B7%Us{x$%1|7iSXz>SDpCZo1ywK|`WI>R%j%d0;Vo+D2 zD+PxbstFKpgB3a_mZYZV7ga)o0xaf}T9%r_5S*Hq0_KJ!ri0uIjZmNb#1z-E)VvZ< zV5FunxaJj?7NvqXupo!4fJXvc#IY#7n8CTUs3qQv0GwEVh%z;59ByV9>o&%=y8K3Ua-W8hpVHDYf!wWi*t}q zyklsHN4%r6vui+zs|y2E%FRE>H#pwOG1%1wy8Vi8;lo zpxg?|xxT^vo++t$C7C6a&OtsPQBWSn;t^NBuy{|uka*ugwhdMhT$koj=f&r`|Br?D?9-=tu!a6GO#o;Co?TG zH3eMmgM?6G0xsZ`Se(j`3@vb>1s_96V!CGvLo%#HDgl+3kQf0~n~5b1iJ;;mAh9Sh z*RiN5vC^@mq$o3~v?P_GI5jUNwTL0L0`8iS%#xf`gaTN|yQCH;7iEI8HKwFN^?p|i?BEz z8rPUQK!qBHB(xfXR&ILWHbH&?D1Bunrxr6f=jVoH7H1|Qhmx~TFep3ZWG3bzIT_6$ zs70B1=?o!>Md_&}ZbgZ?spa{|UU5lHDosxZRn7>sSN%Fsd>SrNg#3e)RM5ooYGVV$hZ}h0*6OY zW^sNVD259Xi&7a}3riDoiW!`9@{3bp!47Y5G5F@^WtQX@F}Q--j0~<7nI({h3b>93 zwV9B(@Z1HeKfww-67y1WQi~W8Q&LcCa!??ER3WNu2FH{XXu|{1603x?!@?6YOBh^p z3rZ>(Jc~i0>0bolLDQb6KLfbvan8?80tEx2f#6z^SzJ;KiYHJeC}seWprA-i%neFS z1QiOPAPWIaPeIL!$jxDh$jyPuf@Gjf=c3fa5_kwj69Fy{kN)Up2$>8>oduoYm zMQUkp( z2Q&CHxG{tGB`5? zG59brs0K5nG88eCf%T;_xH9B{*&y5U7;>RH82CLI{1`$QbQydZKxQ%W2QUOMxFYz1 z&R}t021kZch7yJh1_p7MND!(|;NtFJvq5$zg2u1wLFN+nOE5zQLm~qxbW#`;7(y8G z8S)u&7>XHU7{VD+8Il+j7-0SZnXJIz3Jy<@zl))v22yLtV8)=wV89T=;LHFDr(6aG zei+MzA(Nqqfk8Hep^~A1A(g?Ap_rkVA(bJQA&DV}A(H_VBMgSlP&O#eu&bhk|qy2nb`R11~%CEP(w|FSWhys$?zyJhzjvCiV6ub3W>5S zFfj^A3du4nFz_+62`RELFbFAfE3h(h3aScf^2y3Du`w|-Ffg()Ffqyq=`u4g@Ub#5 zG6@+nD=;uJYcTM!a4-ldDnu~oGI%n$K+|?SgCm18gENCGLjXevgDZmzgBeJH8-qVX z5I7;nGdM9gG6aLAK#D^dLKr+4KrB>kIv{PR=E9T)fODQB)VMGPLk6Z22BtIyC*tA- zlAW+;O%+&52IXj6Ig<}HWAdTqOA&0vhKLhG0E0h6Fj7bQW$&~5*hLs z(iut_5*gCLC3zU>79w05!vLz>(it+r))X-$!mDNla|T0(R0d0iB!*;$R0cyZ1o2H6 zj2J8#k{KF0bQlyE!oYPetY)%>rv*@w2VsyJXNFRS9EK8xQgE$j%aF&A3a(>8*5xpO zR0J@Tg6kAeIpNKa%1{Ze7qh|jt1SZ|m#}~ap;;6d8Tmj26RQFvqhKM3$#NY3qrzyQ z^X-oKLrKBDON^4{yIy8Chp$z9vF-jAmePxP?XQ`SyDYt|F>}G~qtljcI=}EK=f3#8 zoWIV4s)<@w1qN9mQEmZ7Mo@hs#~{bR!3C{WIM|^KW(5Wg7B-=ViEIjtLJbr7SQVIL z_+&U3m^t|P1RG{@FfcQL8SL!Ld?0ynJtM%x!obKV!@|zQB*Ue^!YJ6Vkb_TFhMS#5 zNKvq1A*g0zRbXP2kzi9`WE5&x%A&v^B+AafDAdp>B+AMTqFEFeW%$_GnLviJFfcOl zu`)36@$s=SFv)@`MxlnSd>kMxJB1qdf*A*e8g{ZOFbFjqWdn(yB+t&x$0yXVSEym9P{To? zhND7;LWZ(@2;~e6LZV z2L=WeMh1C=6v9LWxBSw)6mSoifx(iI!Q{|N1tSAPBL#$FBy;o>6dZGM6u<)y#R^5K z#i>PQsVRC43=K_;47G4Aht?@%7AqtwAO=_!N??N$3i)Zc%!W>8kf)o0L70(&&(KWI zP|w`N&_vJB$iRSs!IP0eO3%+V1U`_U18w=+mYL|8GBSkliNK{m9i5y+@U(&uNRI+s zM!`hSl!FnxQjmdxgAux3Q4W;tLYTzDixLa`^7G)GmXM61{PJROgfK9`*K2~ZtPCRq zLx2YZLx2`2@45tA@XikUzsS{diM{L-_fF3bAUy?EF_5v3mn7q>T)RGu@Koc=bRFDE&Ndlf}8WO}5=vqsVW7mP$;Msf-4;91KWI{yao%4%a za&mkVGxHe06HKY8;5jmo?0;1T1@Mvz5Qhqw5p0+Q#!^pEl3)O>$pJ0-MY0DJvygSI z5eWl?Ouz1E~H2 z)z3Ld)h1X0!v+=~R*8`C7vx~mSbF3NVAmBf6o7k#h(-e_VnJ?)`PBv7LIL&WGZ_ltO$$&M z(aJ9l4Ezj?3^4mqTPGlU4Z;0pLk2wta|ROzNNe4Y!3Z1&Ao&Ic0|rKLy9+duQN)nP z0BU=|d$w4@f*Nt4$B@F11L|Wl^e~t(Ff#Zsq%x#~Z3d-+0)|R(DoSU_0F9(DtYlCC zyBOqd1uQPY6+3zi3JeMij$oSr5sRx!xlc&O*07$3Ji=40pKw+*!UVE#bUD`)Omr8LLtfx1qL^U zd~jKjf>NTnfb$fp`RF-|P`GSz|6$R#3XFYz`$_hN$F45e2?$zz&^TR zzzcU6BP%O|K{?n(%%Lo7!c3vThQbDdY|No79Ku}TiNzV2dFdtjd4>W8d>}z~VfLWZ zl-&Hh6hk=!8ITBG8)@P)9s@3r%eaM^9sQjR)eKZ1JlT+p#GKS(g^=K21=nCd zD{})E7hMx4Qzu;$Q!@)gRRd*^I%Z)Rtp0({8XGh*Dj|n2BP#=Q6C*!^K@%evQxhX2 z!;!L$|C+w*FHyX+`1%r!-KzQ1K0iKtv*k*l2jjj6L2*~OJn!DB%-UJrrcxpspSyWx zZ;eC!A0fj(`&!;T-|$LfitD76%s;-^ynk%bpEm9G7A85xtBi*1CFM)~9e4w^3Umpd8x$2+kyQ> z;{nYLr*)lgURk=Me6m^>Z-hbTo2-W8YCqS-t4hAeN!>Z`Sp3tC;;Ao=gyb3Z^+j!H zaj#H6{&oAJoa2^f>$!h1DxYxC5n=!I1KX|5RiU(7GDEz1J4ES3tZcr zGfGMdtn~Ghi*odG;fo}b^KTY@imDmzQI+AhoCjx5*_2!XWpmvVc+`)Cy(}uFY(6;+;;a1KVYL9etnuM zZ<(*{Eoh9XTjB`I*&AS=@ z9DW+?$o}V$U$S|}H4D#^7uwnN4exK;HAsFEMB*dVbUS#fQ5SWFpcUERScXwXCPxOeb`jQu6K^^BKXD(!DF`IqC@{$&> z{xgy7EYxZE=Xpet?B1Wv%CLed(V&Sj7F$MTMk=j-JgMuINv>g7b*7lX>++{ui&bYE z4T3?YjK#!u`pn{zHwXh+D$n9?;A`N$ zz;l6nn=7<{BCZ5<&QA%>Ob>8&j5n~*H8#{WGB7j%mw{2RGLMmw#m~UUzzfDVU~032 zT0x);#9?*`TGnL-Rg3xF*>!EaH@MXTvaLE!M6LX`>6O;ZON?4PVfHnMIHU(B&H+n8^fyhZ8$7>Kw7&a(q0-;32frTZ-jDxuuRP`ctqp7poU7d?EdKhhu}x>P zcIh!ejq6Xl9?7V$p58O-$Rl>i%b!xjH)`Mg%u!Vl(8^{cV;QjcYm6x>}G_me6XkuOhDe$-wjn$;UjWt8Gz%qyjx6imZ zC#iK#{-l$_C@IFAoS$nb32HVX339?KKSNyuZBW8v7FI!&VW3q*3eKrTC7EfNpw*5F zpcTXUMVTd);6|B&frYW5k&&ULu~C#buMw1M1mX^4K})D@wW%mFM$#Z zWx+Xi(%16Ooc{PK``>gifd}`kN}8p%>n|{R^Z(uy5WR@BL)9?DqO{WwsxKF2HR{Qf$=^sSGz?sez2-2YC$)HPhJe5NK~MuTGP8e4szU5i$P&3Rm~d&ia^m0LZF zzT3TWtUvXTM?CZN(m4vczqkXAgq_uW>~(2R!SfZoiQg0H2Y zQTiVvdv;OJUiD3t$zd*w0?+<@xi}*1?rbJk7ybAzx7J;0GRph2WUBC!*O|{(F4Ea| zLR)|@wQuI_uZw;Osd1)SO!-(P@3s5l!>|_@DyB)qoHP}SzdKphvrl*5S`!zUcLJhP z46%1jqZQB1IL`U5m9NJ?mrvNwwno!qPSM5BIj0W3DOemnDZF+{?*eHL=BV%I7pHTT zEH!(pt1o`yS&_NWm;8-3=}kX_HuV~drONSj-4(c(@+JSA+m*}WFDs9*Y`Oef=e~T` zyfs|Eh1DI_KKc1@Wxd;O_5}CT1P8wjPH+6)ZZ505!DYgkE7M>o|A;T-?$d?8pSlaI zO_}jOKuoV@KdWNZqp6PSnTIF$Pd(XtW47Wt-k3Qb7OiW`Xy(b%-CdT=AUkdCC$Z{p zV$CW$JI-gVa5vPSb?0%R?RAE_B=?KwI!^A8_{CS$dvLMsdM1ag|CzI=JrYSvfhDN?HUx8x4M5z1>+KUN zz2`5?*?9l9$0V(qY(2?`dmlYMIx|o?VC}iP5`HTD?=CLC=(D!OKtb>|`_+)CqMlQv zohGfD5o4fsiy`|(_1-s~?EK&PSY~|aJR^VFSfzdLr!VO;I)AF4cgVha?zed1LFM36 zy}w+~b6$vBe_?|Y%c7slawex=*SO;ryrJ#FQw=vg^)+q&p+P)Pn00<d`N*CT*xkNVq9&|#JC(^>5a7~j8b|FzzbnfMo@XqV9+=NRJJO!G)^#R z>}?RiR{SnZUXn=j=0%f0SeZ(x8 zhq8=qYj#(B>b~&Cn(^JEef?alCwe^|eFzr4>%V%^ljprzR~rsKoAQZGzm@srL@gDi zg5Tf%JgJze$NQcAQNbPwzqx(cTt!oNEVP`Hu6s0)?^RNaz1WOy1^Y+rQbs?|7#jd)svWm@|LZ-q+)mY3f{PU28JyZ(ks1@t zD9$Cqcj=bMjITC3(;_zO>OcS4+IA)|?8V%IDLHE_eXe|~+`meqDoOMGqS=}zY~@l( zCvD|&<(ocmAJ^G^-g)!WpKofnK3=k-#B_(>(L!Y*wK8s-pq|1gH)oMOn>TOpO+PW; z>3>6|V#7R9gR~b;LUB?j<|!#&aDJ)%a`zXHGdfpp7&Z8)X?du`N4*MrzwF-3xu>l1 z_cp4RunE2^Q`|qh>7aVZwvAb~oeRqnx8yApUbcUg`v;-?zg<56CR^S0k^MWKC_de~;Z*XLiV)T-j(P!WrfgVRv3m1@X{Ay(C$$TgD(M@o;K*AL z-J`mH!TXj|iq~Gt`JbHi&hx={#?<^y?%ETXC!XcKT0Z@pq2_Lu5*e|Lac4KZm}H&bZN5AFf+6v+A0n|C{Ec zYTg@Df0pe_{N^e;+x743W%F3|+C|STC{=Zes+d~v`5!ln!nL@YMwb4OZ!=c$?|dY` zk41M+Sk8s!w&~MzHwPSX?bG&`+UgLJ>vFE8QE}nIXHRCI7LwO`K5_C^v9r6^oAd7f zS}Gb)xJOGtYW2UP?T@l&wR!yVoA*_FgMqS>{TgQ<-&gw@8h&tpamm{KZ2!0VjgQ3d z2o@zTY*I@!Xkt=9#66o~6O*Vx6O$k~(e@b()RX`?$zse`ASKyY0||tynGLz&9Ck(n z890ZN)sSDD*U-Yi$k4>V!qmjjG72NX_6d3Vh-wS{i2A)QjmvA}+nY}sS0SerR!Cau zJ>s>m?Mt@5($U;q0{=wSMGq$5uE;;{Th(@X!u`FqEZqO=j@kstd~!@;trm7-eY5b8 z=^M8K6;`ACosXK|`(K@!`POuq=-RtXTHn7Py8SHmW2?5(54j_6B(3j@{xmKrulp~6}KOl*tfB1 zM$_w4O=_>3(>wSynRzB8S_X02hfNi@`>=6I;P<&)J1+U%PkP~{y}Yit!2QCBv>>LS zb0PQEZ^->9)VRc;NyQYAiCGv8n^aT{np70wVGWwwQV}v}QsD#5ZSjMGFrm$ZF_oEx ziIJ7TAO@kCk!1mBBnjvI7I>@!NiU0nS%HD3Sb1UA2_Y*l$FQnjGxGd+1M<}F$E{1= z$WWnrZ$T4pvq2LZqd^n%OGwKbJl}QXW#^Bo#(Z-4OpwNl!CZq9nz&C6GG9mb_;5$p4wb{~{j(Y> zMgOQJ{3+_t`SoS-^p0t6+ZUgX@6@+4){~o9@vCN~d=ul=s?$_#Z@l-?pE6Wte*+r2yG*CkEgf3#)e zgmu@}YhMoeZF=i$;iPAB|KAj5pRVU9D|sLg=yByE!wCT&DW zYqR*}`<6Xv5kGkC)O=aS<9|Jt3r{khuIOR(1#bLqtH)!PpX&mexR z*x10p&`3Mk!oVcSG&NDz#4^c5*Tl%!Lf69B%t$xI!qhM=(a6ZuBrO@@Cg^OLM_$U) z0M^S*tHjOCmA2-tI919t758iz)*+Dmf@1K5nQvw?d?Xh%!x0Z6bPddP4J^Q8EQv5* zGcvM-8Uz~z!uSSE@WE)@7QiOV@K{k|zys>MfQPb}3>eU|GjkIYBLkb5{O#~V0VkCG z7X?;afBWO_*}Yc}eEcaL_BQxLraSA^Bd6ay`ZF_nYP_I@#sOAW;RmxSJNBflzPgNGTjdJJ+;u-bGDJ<8*(Gy^bLxdzGA;%ymx>+V zwju{-h^#!&cIJK4!PTKE&JtTaS}WQv{Jb>RUh<|$=kwnA87dta)+>)U_^CbTQ1nUu zJ7=<}ukqHf1pn(^J1zSD>)qWLzr;EFWX1W7yR-Y7bJ~kmy;}Nv{#~hSmVZ)C=Gt*Q zt!du4cF*En)#s;$Evbq)E##hbN%8$3n)5=cliM`68i8TpQ32-IyO}GRu`lwL-6nn0ZevgEi%$O* zsZR^_BcDvL)?H^Dadf-gKcmZ=nQb?2T0hC6?$X=_ov(gj6BSKW4_oG?)CcdH!@pKi zx#jeiUCeF0-{U`A2-@E>rG3u<#S+zc35{)M)HN(rXIOffov+zAX`PJn@|9_C66LcV zYIx3#?|7sdds)%jF6hYCaC;Tz4;QPV^{*;FE{Nq1bSvNdgW=(xHB3$Mw-1PJ-Yb12 z)cd*RLjIS^o_i#AxYW2lIe56J>Os+SmHYeMW*&WiNGAMtbMG5pPlM&F`|iJqp1=Oj z-3@7v4o+{ZetYe$_j6Cp<-!`vme-~?JnKrTh~K2&ay@)b%>Hr>jgN104{P-6^gEdQ zAAH#A(s_i_=jfHC&iW-&zvum^P>9eGj!l?4%g*1p<<^D{@q6?9zD(P&$8AB*j7tx$ zb@af;tKJ$kF}^gw9CDHc724pn9at+PJQD>dV_6u}81f)zEkDjPY3qs=QP3lZ*8WiZXK(iz<@~iuE!|at$2d1~3_z$Qdcf zA}zg+2QP02Eu>FosAPx-?~ns6bq8&v25rYKVbD{MMJrIjwQu^Twxu&3gj7oDUA|G0 zt~8r_n&89aNi&_M)n2OPnQ$;QUQfsF$Kj%jxy}Ff*}vdAWxd~h<>Jqox0ClPnJ%3k zo7ys=w%aWr^ajtQnoCmNGM{anx`Qrk_?!LMj$Kc4_A^`QrB}AfmQS&K^fKk7i)}@f z@@L`NWfMx8d%v7kV{+3v)FrTc$x2q9*>5v`W#~;^pk=R>9pRZQ&zYGQHDlV7<}U~O zKf7t)`(u4!uj%_d)pbwTtG~T)_cP!6nHtk)`109uf8yx8CV$vS;?akry62+jZSl0^ zI>vSA*xGeZH{HA~+7aj)VPRCLE>*wri~5gyI#vpqGd4wbX5{5B-(GUqft76;qn3tU zlfAHS8ux+CzF!~q*URLK*19e)d+MN-y7+KxP*U4r*<`cnZTD||{_#m{;VkusXO~XD z@Gdsl@o_Z!oOV05a<+?X8%yOy_9Z56{cz`)G|RsGj>q{l-rY;pe>45t!kB3{7_KdJ z+Z*|L`ch7B4}qBt@)sC1k8Yg3)ZVpR&h*%&MT_QFRVn@Qm@2>ex4Uw~*LgqoXK(kO z{^)gSh18o@<})iLy#HU@tejE$Z2hl4-LJVDUS(RZ|6}l$#i#H7{nFgziMAK#hWYvL zZwOafSRrVnSoPkKYoq<|6=#;j9$eTlJG?N=&%^bA)5+Oo(OeB4*?%kNAKaUpn{_g% zSeUme;H+Vjn4m$E7%zD6VCq0uT#zvYEPX(vuH}LzMkWJ6HZEwlkW-SykQwB9vWLU; z*Eed3DiU_H2kX#S2Dd@{ z+tb(P+h^aHaZbGbghTG_Kd;M`i5d&B7(Q`l3_Poo73kmpNAo@7dU*b0BDr zerwN;9C52iuGMwxy8_r2Gt3UW@Gh6(xYH7Tt0T{*yVq%L>rA-yYj*1y+mH7Z+BVo8 z?Ki43VvCx)rDe;*rE8d0*4F!3r`MbR;&i$^=a*aitnG92D=I(k-j(LOZ>RHPj?(AF zr83L18NOQaCh%F!<$JCoGqHVwM&r_BizbUOuF!i?u6D*}N9wh6PjZsW)T6#nec1nq zsp6=YnfogjkErW8^-2C~9V^c8^_93CIeX{kr8GWvr#9ES4~$K<0{1fVF;+_KUNLn} z;;gqB+ZHwnyBRbIJHdN(%*>32O~OV7O~QKcC`GYc|OixgafUBOFeU5t#)bdAkj9CaK_z!oAI?MXn?< zePVoL$j0-NeI^||vMlyuqHvzZF{z(z4ZH6r{&72~E~}C*R3xR?wcb0WGazYW?B8;E z+YjNTYxZ_I`8ot%|9;rCVkX6BdRqw6f}^!0PI zB#uzJzz^Qq1hr%hbPddOjf}x9St=~>!(n!bLE{2&D;Bi&sBx-6<0ON|ew2o6qk%2F z9m*(Xh_fLZ;O(goZpAtW1nZ}yrX`lOHG%F9||jWoH~59B1E&5&s|aGfv!ehDw-s$$KY(6YKZaAFKalUK?dE z^J!+K*Tf)(^%nf%U-c^+Q*W-^n*HSXxo@Yc81lUhTvU{7&c9_|I;}rabI-QFEDsCj z8+ob!4PCGQZ`;#8X4-_F|5-`(caM5;PgHwk`9{*KFnMmZV(#HN zix=7as;`}vHKAfz?xlxwe#-u_xH09+v87zo+Lr8{C$)~nsd>lNhS^FM3R_j5ro8$7 zWq)0Aq$+=vo@IF1qQX^dUHqM5yAqcRo}P7s&wWA?N+rk{L=I ziMKWc$mQ?-_>kfLb3^teldZm|x>vmTvBG2Z_j^TkiP`z(D;rNQ=UijC`^~Y_H=4E- zot6Evqm@yv;kR_BR*2=M=vyavLuXdC7h7{Yo1y!v_kppVkmlC|`XTCy-%qUZyQQ&X z&z~F>Env)Be$-*<6<*Cpz!*_ zOGiT=XWk1xc=4XWfxl;-`TpkJAM5{euAHQW{+{y@ta|Tx7X+Bzde5mYb9Hl_sT{|y zTV}T}$M@eW>F^XXXkxi((8PQYQt5za64vou^PARro8c>XG-(}r?K7}NI%xZhnSrH& zxuLl!sD=U0cpd<{Z|$#*!x^^qGDpJUh19jHQ6FNBUsu&I4X6D;^w;4|VugAgAZ? zXpQEA&-;9?RogHJqs#jt8U(aU>yNF>^RY~@$iBTMBNoQUEQxg-H?oX8tJB}^5 zILBE|QFSBAi~!bZi^A38A(^?sC5fQb>c%q~Hj3?Q^Bha0-1#x~No z;=`916OM~p9TS*?d4BdR^L?r$x4@=jX|soy(==ZLhSPZ&|0b^fB01e~YvzYFQi4B! zIc|Ek;$Vis5g#WRDXUpJ)h^pR_uT1C3RrSuitwMbJr`9%&phCMawm0j@T)y$55zc} z3q_tSovhDb{_5cEo$d>LPjtu?HfNmNci;h6lkV5jXxZ~?{>+Nqwsw=JvCr`(!SuXv$W~y zq{Ej4q!bo5F_#!LF~xv-xs8t&HV)bD!6H>IMnUdolRX_4Ydt4L7gRL zVI|b|x&q`_b_L%=&{5+G&Y% zz@Wsy3enGGVKme+&@$kH8ojEwV4kkthCT6k62@7Ftxt0br_kuTeB+HBE8O6`k+<5oGV}o}mw_VV9WNbWt^&*zV z1*`cT1)IBPoLH+OUz)M&U!ZT>xzE3kYHHdYimlQTv#4XN-c|D0RV;$RrF1{*7o)UQ zQliz~(!Tsh4&Luzs+V~2l4)MB(dKu2=NG;%tYeb2|K1@Hw*G0|-q%MDXB)PPNq<2cDM$Ho&<;y>NN4D0_F6o!tyji@tQCoLEY}W1&4VrwJC4EJZ&2yW_L9cR~zN&Z&FZ(CBM5~G8^#QlN zc8^;&-^*EITZX3vzd#rLxam zHYex67K6q|NCq(R7&cxqXgqJwc*dY{BZ~;OtZUFX!=SNYN!?%!EHM_5u+S&|PkN?F zsQGb;e%n!HxQlUpHFC=5hAbQkz4vjwkBQoyq+?H6622}rc3x4nMEPa9fm!*7L&khR ze}7MZaYtF_$Ugnk@~@~<*n1j%JlkO;{AAew=Jk%57Uf#K3h z1_ovZhgJp#0Wbm+0uU8Y3d}jTf`P#w#5%yh5CRGa5E~gkU|`^3U|=v=!N6dFEKZ26 zz`($Pq=rL*fx!cbuUC>`gD`I3|C|IN_uEEQ|z_mzK0!m93b%DjDpnU0~KVZHL zlrLNKmJy^+4$7D3gfX~^elUS#)ouV0 zgIJS5EDjLs8HmLRV)?N%6f|&wSPwxgZV*eCgQ1{-2gK?Hv3NnOmmn4&h~>=5P|&~+ zV&#Ka0wC6O5K9omIt*e7fmlC5EMXAKn2VvHK?KB_31W$YSoc9JF%XNFo1vgV9K;F* zu_QpO!yuL*lP6|7+9E? zsv#|B@GcYg; zvqEV$F=0-NxeN>p#bpc(Y{Fbpf-Ld^5m92|BE`xe0d8~w9ziZao_tlX4?&)RghjqL z0|T3QaUjU$#S9EAf~ka$D#su;wp$ae69eT!)kQ#Hss@%-rw3~Xxb`Qi)=T*3m{d_n>m5+Dyl#DxSj zBpDdEbYI@{5EA$&#>~JVoiD|}z;y@W0f_I!ilsrC1(^f|u{a1M2l2EB*n?UO42%Mx zbjQUct;)m)D)gicSQ)yQ7(jKWAXBw60|QH6rbI-qDFXu|7bGRJiLv!%YH%T}nD@@ugS0|Qr;7_YVrL=WdgHqME9$a0+G5xkrb$-YdZn@nsl_QYCH!e#;|ZwW)` zI#5=J@OnU&YRED$a6ycRi0Y~%^omDJthE4V0uU)LV5EZN8n_MO5fgQ|>p+DGvN;m= zvlti{#DrNOzLL=31SKj~K~}Mea!G=$;u8~uSp->h3Lw&gED(7%K{hcBMg|6LVRk`w zF@5ejP%LI!GbBhV{Xv>1~=tMzoK^{;%fy&b2QU(ULDnTCc z2w@&U9*}aQ+YsYG>6=R@0m@MYI~-Id<*P9;a7D^1W<~Pcb5aw{;<;x7Np$&s;Jgo3 zqr$+zrK5sNuL4Lf8(1#`i>^3_XqKK3hrB>mtPVFQ@39oCgAx`foyvexCqI*%E)yFc zC<`)pGs$H_*un;uW5Wlsia0~Q8;Mg|5}1_nWh zVUUa?2BG>g^EKe{0Z9(|ns5OzC>xZ+B#gqCszJ#uUkg+*Xv+vOXlR2f2PPp#4IKss zE+Iw@T?Pg&4R!_wHX#NLJy2P5`yQVV!#^=Lq_PGSsS@B6Ehd3tHz-Z!J2Nn_i9x&u zX2abFa)K@|R0fnhv@M_<4+aJ{9*EaC#5mv@z{YuEl@qTu1=qZgvdf1-vy=f`c7fVx zWss(|AUHQN=j(&~%A(6526nLk6I)-VcmzvdW&}6HMs~Rrh5rl;4DpwsK?U+2JEjo0 z&_nVrEM!5-S;SbNuGRvz1y~rA85kJY85jgvxwN@h*&_v*S=b{4m{`ROd6}45Sn~}S z7`Rlqb)T}aMrtvD+ze{|b1*OnGJ_q-#l$AY3@%@p^||XnEh$L(!lngM>&O6Z!wM>Z z+W%nn+)ONDV#R!*kYW`x6yjjb7Xr00I62tG*uXAkW*1}c%Y<0VrTc;-U!H-14bpC5 zVX(zw9eZLUZ3=JK&m`0|PfGUx5=#krO{d0XV_bf~q|x2}s2xUJGhZF=-ex zFmSQxau<2=GZYk?fJ!B1UGAa?IFD6FgjHNmpbp%m%>oIVf)ugpO0eXcf%1|-9k>My z)(?>qHx6iY*uzxN1SUm(}V9sIaedWME(cHSyS( zSeZo-l|r2zsFkP!$>~KU{0s$Pzt!1-+LWNofT(Ed>_JMCph~-7N;ND&aVNx3v;-t# z1*(=%^+7f40!f3aJh+A{AQ3DY>Ks58$w2hgSu-$j$=8EZF2XHLBH(gQi;0NjL|TTHqXekXD!;P}K{U0adYr*$P)u#G$F)cAJF>Wy)Ca{#QHdD0~sC%O<&c!5F3sS`-F943qT97!LV-0SUf#k&u9atge zfl@0MFH<#0PF?^a7Rk)Q32q5-a7OSjLBu#B!3MK(fC^5I2mvMrh~-wdLDis`-4zfe zuVBBOfq{XQRbC)AQh=FFmqlJcn-SES1BWg%iy%t`s~}4xxEvK`Wn!u}2eq_Vvm$CC z40!=i69ZAY3bKkB219%&2GR|2l^{z556CD1CXitQ%*-r;tP%18kx+&50#IeF@&b_{ zm0%jA7{rJaVAkeh(_v>40SAsCE9*ZNZVORH1_ll*P?ZjeEJ%Qe$qPW7$_8^P8_cO} z=uTzRNfcz$<%Alm9Re{yn4JmYs#;J0gL*gM7y$ghsC*B7OxqArZ_X$O)110_)$t`LN_L-So37`Wu3!4?T~L)w=4ZlHb#kC-r@ zwvHf=ARnlC&o@y|3gSE+_BzlYhBj**Xau9U1l-!^6ORz)6XX-*>B}@a0|{} z!wUmJepq7R2PYQ(NC9RJP+#g_ISi``;@Pd(nVG0uixDg2I8-Us(UMO{i4tE`B zcn4a{F;yEdFtC6!a%?S#1xa?GrWvR$eNPlQ9Wsg6nlUi2{F4H;Q=kK^CMFD`Fnekk z85np$ZHQ`+GOGemLIqb(R&gLEIL$&DpJHO*))*7Sc6otVRbH^|oR_%RbWG(1*r5GH z7BOK~Z2>{h_y|j1=A}7;tl|;Ete{bizD%PROoA+8g0S``#NpiRrNRshj5^%xB_KNA z9n}5@TTE_d0S}abQxmj{sT&KaCy^WIpoR&!2Pn)2k%aX~#3QoAz!i`hM4Sz&X)VZx zB9#xS-n7**)nQl!QixGPK;lLVmKMYq7#IQ=85q(S5orN5HdhNv3(OiG3=CY%Iz^D$ zPnVAg9BaC4OrTa08?@HuhS2$*pm2n=Lm&>+fp!{TGN2G(5&<{MAblB-0&u^@AJT*Y zv6)1`!+4-H3#xyoLfj_E)R!rtFD9 zTwEaTD>#=M#C-?m`hfLXv@j@m|p1Wn@ffO0wC-T5IYdmxt3$928n^%zhJ(!0TY7`0|Ns;xU2&?lS_=7O^8t= z3Y1HjAueL6^<`jSxyQw>!^Wl&4H}!&g7ncj86*@T{Vq@*P-g_sS_z7AS%@$)FhJUu zAR~oAWuG965G%ygYB!Lps@)kFSRyldIdwhQ#0)vugxT&s2USb|gsVM3%~TbpYLKlu zB1~YFOx2*k(Pt};0k!Z!s&|4^SA#+`KNi$TxMu}Z2?~L}%&gc<9;Rvtn+KY`n0@CScs>b3a zh|TO-5w##+F;#=&H9rpQDinKI#cZGc`~RO!OOQ>A0n(2ZW0<%cJY~ng#PE_qjUSRG zLE-7l$iN`Tz#z!N#ma3V0}4?dFVT&pjSNHXU|BR!Ab@fSUmc)EHI{eI`~OW)_G}P7ZLuvVi&m;9db%uR-kP z$cm_iq#AG}!9o_vGFCC$yZ=DLtDtxq@vsXqL4zI=;ULF>i)=17T`^cN z>+(QT0wfH%ICR+9AwdHb2ZsxrE*DIL&U|oL1s=QCU@(n^n3zOrK{*~d_cGOh3LK4iP{Gf}1R5m-j~l`Aw2?K!-V^xj1?N-NyURgI z31l^h&jiVlFsng@42snnnxHxq96Rt(b_SI-)u19x$6MPTk_?cGA*dJ8gA-94LH!F3 zPIy>u$L38)p5tUNwS)MPiJ^o+VG4u|Dhu=Q`4<$lprHs*c!C@cqVvIyhZb5ONsy00 zk{}u^iQ;`o$&di{FgPiLn9w#T69XrMi!a12!UoI?nxHvIaGDGP&pC3lGixL=FmRQK zGB7alFx7xWIoLrhLTxTKcH{e?w1Z1uGCqB3Ox0oF86hn-rs_}#ivcvQz`}5yfq_8; zic!*-~v|}yETrn<| z{4~(up|&M^emVmK7Y~PyIJ3Ah2M2iEM2DMMSC|7btj1mB0%f24X&!HYXDs*lprkY~m46gH^d8 zvc`|aw6vJ2L18QYj}gWc`^TuoB?cNxV`k8Ynk&Yot%&SYwg|Xkv%sYqn|K5l8^m~{ zYg$spS)h2sM}fw`*%-tb85qRD?gl$TkF7Wxq*07Zl-uGns2r#U`G=_*6!MS?7{ua; zCoFtc#7f=4gFCU7Ih>p>McJ14}TNJC>W2#YgPBL~#WW`l9rBLvwZ zh1r=|1lc1Y(F&U91J_tgOkhufYI~4pS;Y+5*sYlVgQ|4~(D?Ih1_lNRco zLG-}`hYP}Di{xh0HH8L_E)&EuObdIC~^V1ZSi$3uu50>RC=f7G%GI>R*UoZO#Ax{|`xP#S9D#k_-%j#S1}+ z9GaMFyFu9toME}ec(e`JIcD*)RrfG3u&C-vsIjsAV_O88qRRzMmI$-df+Pf4I5qM> zZ6yxz2p$ghzD%Q2+H7JP`3wwPY&9U`M8z};K>Z$rS4@zu9%yX^6T=Dy1_mhx20;-n zmVct$pzM}k2rgV|+4GCQg-a2yAVWcZF=(pNoCD0!C;>I(OF<3!GSGlHn}|j^NZN~q zO{0Q=fvXf`&QcK32qNxzvT$frVv4gAf@FI@gbqK;KQRy^zY1jFJ#k0@WmWP2|9|8% ziVfOk7GUU^11sZM8RQrtomeJG*xDn|bj2c7@gjLa&~hG$A{!xwfb)d^9nuJ5CWDwoaUiKC5I=>1frVMuf{97P z1=Qb21xYh8v1m9kFtBO3f`rn*LKzgS{z!y^KYySOF?xK1A|~u z3CPN3P-wI1aIodKfV!fLBHW;9sJ=`IJ?=Wt3ZCLtP{G75HW57QXDq}nK2ZU*WY3s` z4KjbI1(E}cc!1yup-i;AXE8F)nM^nh&X8N7(`rN0V)F- z*VNan1Fa^LSLg|5U|>X%0*h$$ftH1U7YE2IfNKaYNI0@VsJ={%eo#rk4QeKWZJYo~ zpJ2uQrqNC|tu9Em$e#={3CfDGxV0 zQ#B|Dh(Rb=dCpV~$_io-3ML31`D4qU2}%OkCtEqRAnjUJ2Fo}|*}}xY#*mZ&Veew9 z24&5BNKk>85J%9Rz&k}+PK_+mZLm~nkMOv_^14RZ@d@d+x;t-{sDnu7J47DI_WzeX)JZPT0 zcpk0<05S!#mW!K-9l8jp7L*Q{*yR<#%Xn%*c4CiZ!qEs0Fqo%75e-i7pfU)OKGYcG zTp(!zG-vMa2Vti%K{6M_A&|5Ib_TfIWoFm{siGJlp<)TDb|H#DV>6)CEe7HCWopa^ zM+~Uo1IdACF^Ji4Igs~2av&O>&Y}810RfT&(eR7`krSx}S;Qm)sUk$c&SMgRxLBkX zloFUkYC%3`5~&5H5hf9Eji*&62QEcaFGPYW$OWLKu%N#1{cH#W;QWM2Y^kh4zz9>GQ|ez12)6fLFqDTv1T!Wd2Sq+4ygC>d7!<*66OaKIF3IF#6Enc;8g4d-HGP@v5ZCZ9Lj>44z`aLa zHqJ;cP7Y&HHZem%PNARn1KS3WMgJQ1PVk*3=}p- z5EbMJ=B!9at_7`CD*!E9W?}~mfCdOb{sI;L%J8rT&9Ehc$MZm%Ax1@Ja*1)XiWx$a zuMQ}1L5a|SNlXixwGEY_j7UiTm759VLy&by{d86_LkHwE&cmTACnms*Gm~ozv4cu; z4sZ~I`ipE4-0WJjAmIgGtpQ3MkW2&Sg0dm3KdHpTtO06uYQY(DOyJ%YsHgy~R|mJj zw4#_qvuaC0r5boRjET9n1XR3miNOX?l$e;o@>*?7)gUSGq=i_P5f2hq3o_OM%1g}P zxfcb{7{3l1i?|-Iwk#8~Di?Uw51SSf6L=n$IRY*M(dontkuYY28U=E61*rJu5(fnHqEiQ3T5Pc ztOm$fn0eZuL;>xqL!ASfEe5T1WM*&yRg|EyB5(*ZG1u0BLX@Sp7DOq4wsx_C2V-h0 zKmvR$wbfvnRqP*QZ6%n=24Yr$g5HR!rVdoIF99{r)Ieju4Gat{T3}W^h$Y8V-3XVqyq{x#6F1HAsgJbRdgahldF|PX|)Y^p9;8Y`8*WDX4S9R=f;USb~SzK^A}+ zAQPCXK^nB$U~Yh!h)^J|F%uL<;J(5u1_lNdP(A{Un}f^|;R3HY2A9Fyp!N2k&|nvX z4CO#P$&sb89MY8m1sKv=O&&3W^GwyCP|^{E&`kL&KrI(gL*-sQ7qbr2KdF1=3{2G^ zLv@6iszG4~8l(pC5p5abTfX8APK-=pUF)%P}0_7&&9?tlfzYj zjX@1e)`7{#>>v>aFgq1YZU&3Y<=5b6W7s4HBH8$Bnb;WaFlI@xG2CHbW@ckhV+4`5 zd|49i3|t~0^KbEj)OfOi)ZYfH*$URRUJxWQmlZ^Eu!Bf_evmotU{X{B#6AmF@5J?0 zoQ=VQMO}c6fdQf$SSZo(|ADa zU7{fI2(XQJz`p3<0g1?SgUDZCk#AsjFE2>_RSuANw*bf&9ugq-4^|M{5$yhHV6p~G zJ`n)P?qG1{Wn+*9`*)QvNF|dHNPMycC_HW0K%^*GrIQHA{BS{#nipVqMlpj#62Wep z40iKxVOudahV5YW{$N>c5s+zrIYGW|1BbwQFqs2(L!KBYloS|2YMj8K6e9)-jjiBt zE(H66L68fSfEYG{lLjdLGcqzTtYRq>H)R0v8W{x`W{Z}ITQabK`2q}O;$`Bt49cMN z%OJpD#4F8Z$>0QDMK8cmD=f`r%Miq%3r>c+7#SEW86p`R7?>FZ7^Vt?cu`QE86N|K zFGD6nAXrYAkAcCKA&Vgx%sVUu;$<_$GcYL#Fo+5=Fid4AW+(yk&I&+yr3}oB0t}$F z=9Ub_3}p<>3<3`*+JwdQ4pER2_ir6g2?&Y zAkvW)MCyRa#b8|v#6TjhU~`^ufY_h;LF7dy5UBuGqs9Yb?-T@+5+HIpn7jtIaSazp zBou7E6_{)Vo1X->w+}2*&Hz$#ka-59B11dV57w}T9Hu|4VGV*{f60JJ6)?#TCZ{lc zWMyRFb{h-_unVq;_| z1C#GKLFRAb2Dv$g2PA6&cF99-knOzeAhMdzfQ^x19iIssBSQz51)CznEfyO#MTU0H zkF1Ief?^JAiVUVgAal;}f$W;XEYD`lSkEZWX2|f6@ds;QLo5?0RF^QhvIREyG0k8M zY_JEDx=b?|1sPtld9pDww21q%F*4lZ4rF6wc*z_J554ycAd|%yL8K#?EM@$`s>tvZ z9L|vNhmf;5L9W#m2f5)3*k4hiAYIX%AQ6b)LE*s0;Kdio#=^kH7t6-N0P=NM!&^pB z>ixk8@)1bABEteU88$_RvtaTkS0WoD!!B`9C|w1UN#K~e%moU`E#Q#U7R+K}WT;?M zWeaP_=bpi+#;}*KnL&-=KA3D3`@yQl@Lc={D=ep66tiIqYdFqt!^XxS!~T(#jlqo} zk1YT^NHbBwTBMkbks(J3R8cl^ND7s+F*2-y@EEQMvN13+Sg3;K7-k67urV^cQHSu} z2(mFSGn~+X@YV`}cwayh?hK6#XZV}gm>DWS-6)31406n!Y^)3`pgddV$!weqSHQe! z3{%8svvD)1XoF0d#?T|al#QRE0Lq&pzJX1I;RKY|Bff)8f3DQ1Ra3|Tx&8Pym>pgd>hL`HRnKcMZ>496HM*o_#q7*b5Y zeqgxD!^WV?zyWG@FdSjfX1~X%%P_94?F>14e`PA6M80w(Bn~Zww;S4jNyl}?b%;5|n-Vjq*8QB;j7z)5VNK8jC82EtXAZajy z!4J#>`ELP31VaLt2MLL2h818QNY0o&hG9FH2Z_H}h9giOD8^zLE<$;r*of#NoS!2rTz0L5P-g9DTY z%6};g0bm};otEtB3<+?a1A8XJ9x$(w;V~y0Lk@$PAIR@*9Be#%j5!Q$U>?LrISj#2 z9>_;I3<*#k$VWL0xey-MM>z~t5FXe^ISl;}9@s}Y4D+BoP^po}um!>c`zW8`Ae0C4 zQ9i?Y2oGF_6fish^V%44MLpPy85+PxpENRD1&)^T{K|*2@Lo%3m3>=%28B)PKi0zXZ^1wWZ?Nb;E zp*)c7Qy5C1Jdo{E7#g8GknK|#Iv_l-?Nb^0p*)c7GZ^NBc@W!YGi(O)Ahyq8H~{8> zY)@yO!ypg>3YRvHG-f`=MGUe~-csf{42u}lp}eD9Af6$VS1VA-zKFpR$~(bY$G(Wc z1;S(K;B8@F#IO*`TfoJ~xR~JxnAgZ4EY!`unBh+-$i7AfMurLOOBmR~Ks=CJ*cg^F z@WFXg*+DB3KxZm|Mnqbln{_SGOw49pD27!_Dou&;&l#8|hoZ)7lro5IGh ziNOZUYi96en7|I|#WOP4vw+sCui*i8kF112?0*~}Ha|az{gV@9&neIWDGUYT2yqA- zqIZutNX>O|0Ra|unBr@A1O!-7WdE{)bg{Fc>p~XC)CF=CGs7JgkS>UuA+ALx zL9S(DH~<=UVStE#5(4=JB+d-=1*V7rH^}8jL_uUMCrJHcZjcN4L3@ zGFU)rFipS|f!Gcq?|{QuSPW!lCurFMg9RtZ92FrD2~h)bA-OKs5M^RuVweMtBZys~ zSYT#glmM9zVngDZkzp!mRVPCLcx(rxl9AyV6G#mxY?&A)^MhOn5r>2cNSu)Y(`^tp zWBM9X1Y`meG~^L%W(H6=lVUQ&4Un{l-4;d$OmST5A-?+uj!g(z3yup8@b(Od?;s?^ zUgQ*otOnCYOc97(`pO|I4{`Oufh3ZA~+o)*vt%zL7Nj9Kq?s-UV_s} zybvoxCIbgUCIcsfsR$#3AcLt08-pZ+sR$Q?CWEPn0D~czv;>omVA2yz27<{*FqsG@ z4H-dtCo-n6i86FD&J>emn8@fa9>6e@aSeY60}t5bg^aZ#i3|%FyG1e?L>Np(${BbV z!kB9rDjAx2n;Cc**hShIWEj}Qr!&Yf+!LR}aFGGjik`_}DzboKBO}N?os6r+4m0dz zoXmNWfst_q<8=l`Mj7tA3_BT5N<3vyVK5c>#h?Q<6I7R0GJyIgl?Z2RO~AG@GWLjuF;;@>o`Z}g%(aXM83WmC87skl zISDrHBBQBD2V*4zs3xmq&|sd!paYiO$iO4f$GDL}n0qo~C*uo=8H_i<>K}qh9fmm) zvl%PFHDx6OsHUp~*Wi`l8o!c3m7R?tkTHmD4#P_ZNzN0DFBy(?bdq5zP zjbS2V0n2B`kBkq5e=z=JjA9dD=wz(r`N!DFIGK};2}JTS9b~K%6K49zxI$cl=_BJI zaS5iA44+tJnGP~$u`4ohGPO&nF>x}Pu<0-fGTr7kVk!i?-;&W(Rwwu4NOU^77>!^SX^QCuQ~A(0W3Di$(|@xNnA zWU?3f%m^~`8&e9{gdDI5AU{encQXFwKEc?@sKzbFe3OBdU77hN!z~F-=1itY7DMJj zCRH|b=0XNmb{poK4Cf>?nIAG3bGb1;WT<8FWq!z@#>vR=kimtMk>MpnAbSY&M}|Q5 zDCS0nK=ycMMn-$CLS{zBm8@qNJDEVKZX*K=I5tm;@-cEUJ{0L-=46zX2w>o3%ogis zp2$=qdWP{OLk>SEzAlT-VF0Dl+039cxrq5CLjWfm!%K#rJZqU>GCbwk!TgY69}^qH zLx$~4XBZzc#7ThIeiCOG1;IJ!Aw!hNX=Xu2H;FTh3z@QE)E6`hPx~r3_J{vSU4Cg86L4PF?ce(XXRk<1&hRjMRLI+go`yXV+s8X86Ib#~{rh&Y{Pk%%H%b$Dqv+&Y{O(%#g*Q$6(D+&Y{QP%+SW6 z$KcH{nM02u7%Usj5YF+KA(`P3%V9PO>vF=rCVrXJF9c1(BufATpQdHai1D zh5(4n;{)kh2qrB!LAsp9K_o;ML_I_=vaWuH`vgtq0^0&H2Vw%mG-Pui;>aQp^$?X1 z7h;NJF@s#b66~*&Tp%B<7kt9b!0?v!B|8U$E_jq&j{(#IVq#!sU}E5BU}a!r5MW?s zU}6wtU}s=t5Mp3wU}6wv;ACI|hbI$*C<8A8Xx5LPfr&waL6CuoL6Sk3fssLqL70Jw zL4`q-fr&wtL7ah!L7zdAfr-I@L7IVy!GuAUfr-JCL7st$!HhwXfr-HaJo8}5pvu6= zV8x)yz{KFppw7U=5W=9zz{C*Bpv}O<5C(Q*1cN>U6GJqEAp;{r41*y96GIY%F#{7r zGJ`1t6GIAvIRg_zDuX2h6GJ+KH3Jhv7K1GVBSSWWEdvunC4)T!6GIJyBLgEt9fLCi z6GH=oD+6dhnL7g$Llc8110zE-gC_$MLnnhb0~13RgD(RULpOsz10zEZgFgck!z6}4 z1}28d48aUc3{x0F8JHNRGK4cQF-&8KWQbzOXPCh7iGhjHo^cM-5~i(8N0~U8d63@i-X3@i*h z3@i-13@i+M3@qSS0mX?R11p0N11p0t0~><~0~>=V0~>=F0~>=l_)t?8hDL_1OtuV{ z8ICe^Gc_jac*Ksaz=ca0YiFfNxWy6A%mxDUTJP>QDRa~YJwqyV=_orf+2&abAC=vDvTGD znwa9Bms5!%2-8`TUj)+NlUZDnV94N}nwMIXSd!{lX2_5mpIL?wadZv#POUU#2u>|= zD$U9EPOS{d2MgrJC#DvIS)O?%#zqX@sg+@gIi;xqiJ3(SMo1}cfb=;CB*Wa;Q^S}0Y=w@hOYGMu! zoX`+A3kDnC{FKt1R67QnfTGMYkhgLRa#C|s^GXsy0p*ffl9-uOY{%f9S^^4S1{YU1 z$55Y;cwa|n247Da%clL%bJ;NZhw`(MX5#Sgc9PS_F z67TBg?C;{~=gt7KBHq!*-9N}P#KV^%$kERQi3>IrA?xcH5%1>d;~F348Wim5@5c~a zSzMButLN#@;Opq_=^XFj>geJc1an(_h)0mCqf0P@b5LYJ2*TK4h7fRYc!nV&B8;I7 z6hHCt44!#qi8+}mt`#MzdBvIed7zZWkdj!E$l#oqlU$mUSd!|UTIrFSn9PtHp8=wv zu0W)uVm)w@$xLQ&%P&e!1tm4Gh0ck2V77ljDufY~T9BGp0v5}S2W21zNIqh4Oi5wz z%qvMP%E?d8PE7&pcB(8%Ee!kQw8Z382IrzwP~yx3nUtK$keZhU3QLCK)RK7Dip&z{ z{FGEM#}~v1NK66w0nBy=6%_f9asw;?jZyysP%h5Q&jSl0`6DzhJ1@T+Dx6u6ky->+ zksA*>`x)88p~Z>mso=QqO)UnqbD^|zer`cxQL1Z2az+Npwf&1ChAn0mX=zC z5ckMTNlDEEClJ5<5`?&?OJ;FFelb|DdumBQQEFl?$j+eBypqh^RJY93oD>gGY(jh$ zo|stz?pO?x24h)~nJc!%;Qp>?? z=lt9xkQgi|!ZT9yT=Mf$8B+4|O2F9xoGjtOx$()MJc23+SL+XUHo9UoQRf_x`ML3> z#i_xSxw)w&MVZNtIqCUDnI##yA(aJS4}t02_#{w<_0I!4grOKxcZK9bxRA(5WkAYR z9*M;naHE1!ON(J)#o$|-Q<9mSSX|GCli!r^7DdHa}q1S(!~gQm5EaOE4vz^9w4AGSf4#O63+L=2ar}KodX6&cu?;q|BVm5+qr0xPo#LIG=+nZCI5M zlvIf0S}m zd}@9g1E^X745~tEMhJw`8Y@fv95|9^*k;FmDLh_-Cz{v{E%goCxfl7d#1ZuM6 zl_Zs>F+hr1NTk9lV@M5_nU~HGoRL^m;OH6*R;7m!2YDA-V1tSRS7-&qkeHGZ?+*!< zg47hS-<(0kDafoMa1i5^_RqtmF{m^TY!b*2L{ST^>4H;Jvq2J|2=OcqD$UCS@p9uc z;cRH#4ox$9(1Z<9m7JK9la!d8?UtDbjxbQ&43Y@}RX!kwdn%~;3StG9CKZF%|1qS1 zOJtCkb0X-v0dRT?&&bS4g*N#RQlNGLSO(hq1Iv`;7eTz?Sd?B0YPGpmB&UKK#=gbr z44~=))TDwni=nj(C}qKgK*_YY7;JAyMp1rgdImVDgVHLvBq=RP1+#PGGZKq47~o}^ zTTW?l216Q{^i3>*=<-R;ONTN85-W4^6H}lf!Ko!~iP@=89<&Mul^{@&+<0h>?hUGY zp@PAwCCJ>|cyPsxkc6^w<8vU^f*Ul&;h7~F435Q>dCAVu7y;KIa1Jb<7>ctq3qVc) z1&4D+YH~KH1(#S1_82Hz=OyNV(+UGv1RSjpen?SbUU6D}Q7$$yh?3m+bJ&`T4=Q zi8(oFxhf?mhrzEjCx-#87sdc`f`3^KLqSn$8Hmn}2lpUA2?UaU7(jNXrUaKJLHVF` z0ggc^9~@HP8jK++u{aef8k(0{QIMKklA7Y0m*SrW70r#$$;``!a(q$~%ThsYTqqyX zk^`3lpq!DKn9BgF5Hs`AQN+ORgDC*zNKpDug{F3>Yf*$?jbNxXAT8ijjj9DjC^sHl zw82ya6s4AB=9d;jO#sJXQEDDEazM>XztjpC4-}$Mg`hx%GJR8X^NT8>oZNUwmCq1Z znp&C~TAW%G4rlq% zNiujslpzF4V5yY>)DdQY__-uCkHI%HkHI%FGmin34*iQV(=+oJ@*$L0er6t|#Rc#9 zfD-nXYfH0_ifz)7t$p)pS zK|APRy94rzGeKQau;p-$r$4;J1FJ&tpoI)5i6aCdfsy;3j#Ip5ps}fEx07H1l0P6l*A06*o2k02&K94X^ELRsVSiH3Ly$J z9F&U@qDYwwAqc6A5PYbI;T;=<49rl3NKtA@Mp1q_LI4^^pd6K-ms9DMUj(aw^79x# ztq@3>MjClR7KK$w`FWr!29%Y-J)q3u{5*z~{Gif2aNIxwA6ynWgPJGMN}3@z9@_k2 z2+m1OEntABxp>dK;?$xNP(L8JBr&&up(M8eT&aQTRt9JpmJbPYu#j_3YGM(j7zbta zlGHqp)Wnq3A_kDZ5RQZjf|R6Uh(bK-kqOd)i?UOT7@%Q=-Vy@$!yuhBWHk^! zfc6*^q!xk3qe=@rQgcA;-1rO#BP6w=1RMZG46dM|1%}-C#L|*{Xs^UMzZ5E%kys20 zJh%M(lGGw_G`bcQ$`y}D!2Ti z+{6+FNZX1bAKb(OB^m}$$F77SKP{~|wS*zKASbf~WN-MRnN=u+IFW8_lXp9ZaF9Idq^nA~};t~c(dkiut2ObOo z_u>jlQDq<_AE5FXJTSuGn_rd+Y68L1kbfSS2dRkkKqU%8W*OKMe);8KI1=(~dLH= z)HNVi86FNFc*B5l8kj9Y6P|A=4 zwgD9A=>7oN3NslI6(AoOGH5dBF)%bt^aMMhk|Cd=6r7N9!SPoDbrvW#&=W5xL_xs< z@*pfh>wx30gaH)Fc?|mC*h>MM2{H+kkw7LPJO=UxXh&BnLka^(Zz_WxLpp;VgB1fq zBIpDk{Mk=|!H~g-!I;4WoasO*5R{rgW@IrGFr+gmfHN2@4d^jIMD-XF!KsHK-;p7S zArG8tbHQmwfgzQlf*}(ejEIy83b+!6QidXMet_f(P=Wwuw#XiVcpr8chZcqu62zEpwLk>eRLp}q#6_D(M>Ihg$ z19_>4p_l&yO$NqPkn4<~t^;l01DOMgPEfFe=mLgPa6p2h7Zikv47pIZ zBFn%p8*oF$qcFBk{jkHMp0LWB5;XZ1TH7584MU|85oj1(Fzezfd;Y-6rvElpro41 z07}N7WDP1GKzS*ZK@)39tHF@Mpovo2GH8PAfQ1mgFklD<6_%h(1FDCL!SM}>&vbCI z1r>Z5;BWKD7?Kz&86f37C~!g5C#Z1EV8G>d zP%edd9aPQbfD;BNnZa@@r~s{IFl4A@KsKAf8|HP8?I87#WLXZbup!9=6wsi60=WiM z_<|B6s9XS5t;t|FrZ9l)V~7uCC;6{K^@M zz@-|f<^)AhDg#3#!fe!r0I6m}!Y~CM%M99}q>Wq$!)ktzD?t@#0YeT$CIhILVo*m{ zi^vL~VxS0G%wd`d3YSE1djeDgfx@?lAsbxQGMEN|OLtI)1r=hT7zCM`%8&zY5kNv7 zmPtVI1uDlGEI}z1l4U@}1}yGDIw5HnWEP@81T_sIDVHG?-4CF&0@9y{RD6QMr-UI9 z9A}_P9n?Ss6;_}e0rG(cg8@SYg8_p9xKROf9ViSysV{|r!4=&WkO`n7w;Y_oLB0gJ z8&n{I=pu0D2e|?y1GAk$*A3bpQUKRmc?{{`W+@4R4T}6B*LLc?}dg=&2uM zvjVtb4staprGr`)5Z^MCgYp;5jUXR^DkMZ2B-L*8CKpb7T|xGOavLZ$f?5%vTnMW2 zK*cqvP%H;98qzd?G?_tR0uqOmzz`NFC4ov8Jq8AIP_6-`3sBn)6c3>AD`iMy zNQ0(qP#u#GZW=+FRG_|y9s@(HFSrbWbp#P{4sr`9R6xBWP{ju-Wk7a;>MYbUA5u1NB!j3kLlA>2gCj!-gDZmzLp*~M=s0{ybWs7W2%D^C)!H~hA%K+-o=z@FYjLfMF49qDE49xiq4669L z7-i7r2?IZ%# zGSFjS5Qp?xKz*4+h609QhD-*qCj~^poQMB5eDS;IY`D4oW&61DfwXCMGR#OpaFwah5&HO9K-_^7)9W!6V*0naMhOz zmO-szY#EFh^cYMT^cW1l7?eGop*>`f>rxqP8S)rX!95gEHJk%BBY>fl0n|JK+3(Ge z%23G=!jKPcR^&0*G9)pWGng|ZGMIuF4x2F;GFXDUo~aB53>FNQ3=D!n44DjB;GPSp zgPFs?z#q)u!QjZC%V5M{%3#L8DCz-j&?GZJ#37;#yr6zk8Z;L&GBDJaOp5w`?V9s! zXVH`1q8kq|uqZGxaxg0}FtREzG71WUxO~hE41BB%jC`_uEbNSe9NO$c9HK(5j6xn9 z92~Mjwz5LDLJ~s096}aCB0?fU9zwoCBBFwUj35>>0|N&u0}}@a2OC5SI|CD=0EYlb zkcoqXT~w%HDWi}Fs{#|Fj0DI^VFqS4AzKaw29OED3~V4u$b&_JL70JAfq{uzftgXr zR;Zy@uwkMYJFhIOEGriW2Z-X}1Cg?8Azv|e zW{_i`Qcwz{kC_o@xsgX4)U=AGY42XJEJTsJ3ELY zB*4bbBorzX%F4hf6bcUGNKkVa%CdqivhR>)Q; zm4$(kkpmn+f7un7nD_)68QB$>I6yRu0wV`A3j-q)$R$Fy%nA&AAk};z)s3vI3JgMx zoM4idg`G);iH(7YQAU6Xq(p|3ot=Y&gF}Xi1Ipr%VPa)xW|CoIWnknG-~a_{h){@7 z2sZLg^N)rgqxk2LsY016z8^}#IlxA2t+rkGC~rGP%R@U zk$_dOurmq;Fe@;~Fv+qqvomsVgIxgfI0pwiJ1fXJ9K7tTLNT&JwjjSZY-DF(ViIcD zD8tUc3~~|&7dx|1F337QJ|;N^Hc_EQRYpEmumFn!C=?VJ`8Ytal*vbz;o#t8U;-H^*ci#o&d9~a z&H@T3u$5e_?93b-AP;j1aIrBkg2IZEokb{BmX$-umW_dlOMr`u<4m>i|FgPx0~;2A zP6z{SBbWlZV3`SWDqT>pqao-RKG3mF=apZy`R_W#ba!X!#MDc#nB^s0UtNyjcU*EX z&;PXX&M zjJv?Q7g#`NPBAjEfKDj`9aqc12Pq(71*ZUnYse755X9ie;Lad|tsvz=E=O5F9%Nx~ zU|?uiH?*o_Mg}G}4rVq%4rVr4Rwg!9W;P)mW;P)YW;P*5W;P)O9&o7*E$f)rn3&kO znAl`k*n}G9va-oHEM#J46LMf?6LMi@6AEEw6O3SClNGXMW|QS(W)sR~W)mu8W)mu9 zW)rGpW)o6jW)l(t)dS!npP5Z46=cvxW(EdEP}Z>pmw8NV3QUZAvaFm8EF9o+i-Vnk zNtRW}mV=Xlg^>?bWN~mYutHc&9PA)LK0Xc(kPsgq69=aPSd}0L6SD#XD=(3M-U4ao)1%XOfAxE$QwjgH<*>bRh>n9ElHjqjV4ps$54vG5M5wap%h>?L8b)u1hhmnCjC^aWFu{f21fsc`a z)5kr)N5ROz(2M~rXQ*eaXRHUh2%V9E70dxSw8CTBr+3@Gcs#yxHY?|t#;ynJFZ3zQ zmis0cVaur~w6oMh=Jmyu&LPt6>A#PCDBZo_+mC&ByFCKeC|#PHEmT$Ff5SoIe*@o~ zEg`m&?q$jSmJ37H@0xM-li<7!tF~UZ+7iky6V z_~#d0UITUTHIYwUChuWj^bG)&a7hdd3^^+p7;?Hmu0vo@>4M-fFa!m=1fNqdsL1p= z>d;xxbYPXX&MQzsJ_9UF?<6Zrwg@G0Ca34_*5&X020Lnl7sW(o%4%aa&o{+xpIq>^NUhb^*{>& zAqxJhGAJ+zFeu&OYIV1{^xFa}qKAckND(8PcrLp*~ggCBz%1Ni6}hP^EB|3UWLfl>l! z=N*IwANRz-0IF1=xejVD0|WTHTSkU3@H8=Od=1pY2ldcEs#L(bLco&~pfSN5r0H3Z zJOjf9mI&}!5Ri%r(l5g_$powhG)4%)CJafSFkrA@;A3E90Ck3P!SkVc43!Li44@H_ zRIu^5JGdaXgY?4e0!<|rgQrwL9b3@k0%)WSWC%Vp3>Y{V7#Uz@pmxMSdJP#sdw(Gq zbWWoSgAfBF11N-$M`jQ%#%-4#18C$uhk=2?f`N;Hk->){l_4EGa|iN$0YfEtoI4#n zqRznJ!{E*kz~IB6z+l8+03PB1iGl3)hpGdGG-y-^=629rMJ@v<)QE8dB-|n0)D(tN z2GHC9!WRs9mJWc@E@ Date: Sun, 24 Jun 2018 13:29:01 +0200 Subject: [PATCH 006/253] backend oauth TODO --- Duplicati/Library/Backend/OAuthHelper/OAuthHttpClient.cs | 3 ++- .../Library/Backend/OAuthHelper/OAuthHttpMessageHandler.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Duplicati/Library/Backend/OAuthHelper/OAuthHttpClient.cs b/Duplicati/Library/Backend/OAuthHelper/OAuthHttpClient.cs index e31d213c2..6fa63a53a 100644 --- a/Duplicati/Library/Backend/OAuthHelper/OAuthHttpClient.cs +++ b/Duplicati/Library/Backend/OAuthHelper/OAuthHttpClient.cs @@ -90,6 +90,7 @@ namespace Duplicati.Library { OAuthHttpMessageHandler handler = new OAuthHttpMessageHandler(authid, protocolKey); + /* TODO-DNC - not supported https://github.com/dotnet/corefx/issues/26223 // Set the read/write timeout if (HttpContextSettings.ReadWriteTimeout > TimeSpan.Zero) { @@ -101,7 +102,7 @@ namespace Duplicati.Library { handler.ServerCertificateValidationCallback = HttpContextSettings.CertificateValidator.ValidateServerCertficate; } - + */ return handler; } } diff --git a/Duplicati/Library/Backend/OAuthHelper/OAuthHttpMessageHandler.cs b/Duplicati/Library/Backend/OAuthHelper/OAuthHttpMessageHandler.cs index 00758d58e..c77dcad3a 100644 --- a/Duplicati/Library/Backend/OAuthHelper/OAuthHttpMessageHandler.cs +++ b/Duplicati/Library/Backend/OAuthHelper/OAuthHttpMessageHandler.cs @@ -21,7 +21,7 @@ using System.Threading.Tasks; namespace Duplicati.Library { - public class OAuthHttpMessageHandler : WebRequestHandler + public class OAuthHttpMessageHandler : HttpClientHandler { /// /// Requests which contain a property with this name (in 'request.Properties') will not have the authentication header automatically added. From 68de4bbbdecc4f0a51e3f5fa237dd1aab5c668a3 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 24 Jun 2018 14:49:30 +0200 Subject: [PATCH 007/253] more libraries ported --- .../Duplicati.Library.DynamicLoader.csproj | 95 ++++-------------- .../DynamicLoader/Properties/AssemblyInfo.cs | 54 ---------- Duplicati/Library/DynamicLoader/app.config | 3 - .../Logging/Duplicati.Library.Logging.csproj | 74 +++----------- Duplicati/Library/Logging/Log.cs | 8 ++ .../Logging/Properties/AssemblyInfo.cs | 54 ---------- Duplicati/Library/Logging/app.config | 3 - .../Duplicati.Library.SQLiteHelper.csproj | 83 ++++----------- Duplicati/Library/SQLiteHelper/Duplicati.snk | Bin 0 -> 596 bytes .../SQLiteHelper/Properties/AssemblyInfo.cs | 39 ------- .../Duplicati.Library.UsageReporter.csproj | 82 ++++----------- .../UsageReporter/Properties/AssemblyInfo.cs | 43 -------- .../Library/UsageReporter/packages.config | 5 - Duplicati/License/Duplicati.License.csproj | 83 ++++----------- Duplicati/License/Properties/AssemblyInfo.cs | 52 ---------- Duplicati/Tools/Duplicati.Tools.csproj | 49 +++------ Duplicati/Tools/Duplicati.snk | Bin 0 -> 596 bytes 17 files changed, 114 insertions(+), 613 deletions(-) delete mode 100644 Duplicati/Library/DynamicLoader/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/DynamicLoader/app.config delete mode 100644 Duplicati/Library/Logging/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Logging/app.config create mode 100644 Duplicati/Library/SQLiteHelper/Duplicati.snk delete mode 100644 Duplicati/Library/SQLiteHelper/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/UsageReporter/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/UsageReporter/packages.config delete mode 100644 Duplicati/License/Properties/AssemblyInfo.cs create mode 100644 Duplicati/Tools/Duplicati.snk diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 1253a98c5..b2f8ad26d 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -1,82 +1,25 @@ - - + + - Debug - AnyCPU - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Library - Properties - Duplicati.Library.DynamicLoader - Duplicati.Library.DynamicLoader + netstandard2.0 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - v4.6.2 - - - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.DynamicLoader + Duplicati Team + Duplicati Team + Dynamic Loader for Duplicati + DynamicLoader + Duplicati.DynamicLoader + Duplicati.DynamicLoader + - - + + + + - - - - - - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Library/DynamicLoader/Properties/AssemblyInfo.cs b/Duplicati/Library/DynamicLoader/Properties/AssemblyInfo.cs deleted file mode 100644 index 723d466fc..000000000 --- a/Duplicati/Library/DynamicLoader/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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("DynamicLoader")] -[assembly: AssemblyDescription("A module for dynamically loading external dll's")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.DynamicLoader")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("1a2c7ace-da27-4d93-890d-2bfb2a14c00b")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/DynamicLoader/app.config b/Duplicati/Library/DynamicLoader/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/DynamicLoader/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index 04fc4bcb4..6d7adc594 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -1,66 +1,16 @@ - - + - Debug - AnyCPU - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Library - Properties - Duplicati.Library.Logging - Duplicati.Library.Logging + netstandard2.0 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - v4.6.2 - - - - false + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Logging + Duplicati Team + Duplicati Team + A simple module for logging troubleshooting data + Logging + Duplicati.Logging + Duplicati.Logging - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Duplicati/Library/Logging/Log.cs b/Duplicati/Library/Logging/Log.cs index c64e87af1..a3433a5c2 100644 --- a/Duplicati/Library/Logging/Log.cs +++ b/Duplicati/Library/Logging/Log.cs @@ -421,6 +421,7 @@ namespace Duplicati.Library.Logging { lock (m_lock) { + /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md var cur = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData(LOGICAL_CONTEXT_KEY) as string; if (cur == null || cur == m_root.InstanceID) return m_root; @@ -430,10 +431,15 @@ namespace Duplicati.Library.Logging throw new Exception("Unable to find log in lookup table, this may be caused by attempting to transport call contexts between AppDomains (eg. with remoting calls)"); return sc; + */ + throw new NotImplementedException(); } } private set { + throw new NotImplementedException(); + /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md + lock (m_lock) { if (value != null) @@ -447,7 +453,9 @@ namespace Duplicati.Library.Logging } } + */ } } + } } diff --git a/Duplicati/Library/Logging/Properties/AssemblyInfo.cs b/Duplicati/Library/Logging/Properties/AssemblyInfo.cs deleted file mode 100644 index 5cff50e20..000000000 --- a/Duplicati/Library/Logging/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Logging")] -[assembly: AssemblyDescription("A simple module for logging troubleshooting data")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Logging")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("c44ecfb9-e8f0-4da0-84a2-7fc7490e3147")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Logging/app.config b/Duplicati/Library/Logging/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Logging/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index f295a7e5f..778bfa9bf 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -1,50 +1,20 @@ - - + + - Debug - AnyCPU - {2C838169-B187-4B09-8768-1C24C2521C8D} - Library - Duplicati.Library.SQLiteHelper - SQLiteHelper - ..\..\GUI\Duplicati.GUI.TrayIcon\Duplicati.snk - v4.6.2 - - false + netstandard2.0 + 2.0.0.7 + true + Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.SQLiteHelper + Duplicati Team + Duplicati Team + SQLiteHelper for Duplicati + SQLiteHelper + Duplicati.SQLiteHelper + Duplicati.SQLiteHelper - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - false - - - full - true - bin\Release - prompt - 4 - false - false - - - - - - - - - - - - - - + SQLite\win64\System.Data.SQLite.dll @@ -67,23 +37,12 @@ PreserveNewest - + - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - + + + + + \ No newline at end of file diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.snk b/Duplicati/Library/SQLiteHelper/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T - + + - Debug - AnyCPU - {BB014EA5-CE2C-4444-8D30-38983A0E8553} - Library - Duplicati.Library.UsageReporter - Duplicati.Library.UsageReporter - v4.6.2 + netstandard2.0 + 2.0.0.7 + true Duplicati.snk - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + LGPL, Copyright � Duplicati Team 2015 + Duplicati.Library.UsageReporter + Duplicati Team + Duplicati Team + Usage reporter for Duplicati + UsageReporter + Duplicati.Library.UsageReporter + Duplicati.Library.UsageReporter + - - - ..\..\..\packages\CoCoL.1.5.1\lib\net45\CoCoL.dll - - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + + - - - - - - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - - - - + + + + \ No newline at end of file diff --git a/Duplicati/Library/UsageReporter/Properties/AssemblyInfo.cs b/Duplicati/Library/UsageReporter/Properties/AssemblyInfo.cs deleted file mode 100644 index 3cb77b953..000000000 --- a/Duplicati/Library/UsageReporter/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.UsageReporter")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/Library/UsageReporter/packages.config b/Duplicati/Library/UsageReporter/packages.config deleted file mode 100644 index 040b8a7cf..000000000 --- a/Duplicati/Library/UsageReporter/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index ed5b000f4..33dddcadb 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -1,53 +1,20 @@ - - - - Debug - AnyCPU - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Library - Properties - Duplicati.License - Duplicati.License - 512 - Duplicati.snk - - - 3.5 - - v4.6.2 - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - + + + netstandard2.0 + 2.0.0.7 true + Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 + Duplicati.License + Duplicati Team + Duplicati Team + A license text reader for Duplicati + License + Duplicati.License + Duplicati.License - - + licenses\alphavss\Homepage.txt @@ -395,28 +362,14 @@ licenses\FasterHashing\licensedata.json PreserveNewest - - - - - - - - - - - - - + licenses\SharpCompress\licensedata.json PreserveNewest - - - - + + - + \ No newline at end of file diff --git a/Duplicati/License/Properties/AssemblyInfo.cs b/Duplicati/License/Properties/AssemblyInfo.cs deleted file mode 100644 index ce8fa1e44..000000000 --- a/Duplicati/License/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,52 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.License")] -[assembly: AssemblyDescription("A license text reader for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("2ab7f791-2317-41cf-966d-7451d9e63ae9")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index 770f1ca6b..66e6a2760 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -1,36 +1,20 @@ - - + + - Debug - AnyCPU - {0797AA22-C5DD-4950-BB60-34765AB8C6DD} - Library - Duplicati.Tools + netstandard2.0 + 2.0.0.7 + true + Duplicati.snk + LGPL, Copyright � Duplicati Team 2015 + Duplicati.Tools + Duplicati Team + Duplicati Team + Dummy Tools copy library + Tools Duplicati.Tools - v4.6.2 - false + Duplicati.Tools - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - - - true - bin\Release - prompt - 4 - - - - - - - + utility-scripts\DuplicatiVerify.ps1 @@ -87,13 +71,10 @@ PreserveNewest - - - utility-scripts\pause-resume.py - + \ No newline at end of file diff --git a/Duplicati/Tools/Duplicati.snk b/Duplicati/Tools/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T Date: Fri, 29 Jun 2018 17:31:16 +0200 Subject: [PATCH 008/253] upstream --- .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index 778bfa9bf..caa1503fb 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -44,5 +44,11 @@ + + + + ..\..\..\thirdparty\UnixSupport\UnixSupport.dll + + \ No newline at end of file From 9e930acec552ad1b2d499c5be9481382b00ec79c Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 00:01:50 +0200 Subject: [PATCH 009/253] modules.builtin --- .../Duplicati.Library.Modules.Builtin.csproj | 154 ++++-------------- .../Builtin/Properties/AssemblyInfo.cs | 56 ------- .../Modules/Builtin/SendJabberMessage.cs | 89 ++++------ .../Library/Modules/Builtin/packages.config | 8 - 4 files changed, 65 insertions(+), 242 deletions(-) delete mode 100644 Duplicati/Library/Modules/Builtin/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Modules/Builtin/packages.config diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 442af65b5..0b40e9c85 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -1,140 +1,48 @@ - - + + - Debug - AnyCPU - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Library - Properties - Duplicati.Library.Modules.Builtin - Duplicati.Library.Modules.Builtin - 512 + netstandard2.0 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - - v4.6.2 - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.Library.Modules.Builtin + Duplicati Team + Duplicati Team + Buildin modules for Duplicati + ModulesBuiltin + Duplicati.Library.Modules.Builtin + Duplicati.Library.Modules.Builtin + - - ..\..\..\..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll - True - - - - - - ..\..\..\..\packages\agsXMPP.1.1.1.0\lib\agsXMPP.dll - - - - - - ..\..\..\..\packages\MimeKit.1.18.1\lib\net45\MimeKit.dll - - - ..\..\..\..\packages\MailKit.1.18.1.1\lib\net45\MailKit.dll - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + + + + + + + + + + + + + + + - - - - - - - - - - - - DnsLite.cs - - - - - - - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {D63E53E4-A458-4C2F-914D-92F715F58ACE} - Duplicati.Library.Snapshots - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - - - - - + PreserveNewest mozroots.exe PreserveNewest - - - - - - - - PreserveNewest - - - - + \ No newline at end of file diff --git a/Duplicati/Library/Modules/Builtin/Properties/AssemblyInfo.cs b/Duplicati/Library/Modules/Builtin/Properties/AssemblyInfo.cs deleted file mode 100644 index 03f8cb13a..000000000 --- a/Duplicati/Library/Modules/Builtin/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,56 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Library.Modules.Builtin")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Library.Modules.Builtin")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("3794e72f-a1ee-4dc7-b658-e8ac8a3aaa3c")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] -[assembly: InternalsVisibleTo("Duplicati.Library.Modules.Builtin.UnitTest")] diff --git a/Duplicati/Library/Modules/Builtin/SendJabberMessage.cs b/Duplicati/Library/Modules/Builtin/SendJabberMessage.cs index 755ae54f9..17505f419 100644 --- a/Duplicati/Library/Modules/Builtin/SendJabberMessage.cs +++ b/Duplicati/Library/Modules/Builtin/SendJabberMessage.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Linq; using Duplicati.Library.Interface; -using Duplicati.Library.Logging; -using System.Net.NetworkInformation; -using Duplicati.Library.Modules.Builtin.ResultSerialization; +using Matrix; +using Matrix.Xmpp.Client; +using Enum = System.Enum; namespace Duplicati.Library.Modules.Builtin { @@ -172,73 +172,52 @@ namespace Duplicati.Library.Modules.Builtin return base.ReplaceTemplate(input, result, subjectline); } - protected override void SendMessage(string subject, string body) + protected override async void SendMessage(string subject, string body) { Exception ex = null; var waitEvent = new System.Threading.ManualResetEvent(false); var uri = new Library.Utility.Uri(m_username.Contains("://") ? m_username : "http://" + m_username); - var con = new agsXMPP.XmppClientConnection(uri.Host, uri.Port == -1 ? (uri.Scheme == "https" ? 5223 :5222) : uri.Port); - if (uri.Scheme == "https") - con.UseSSL = true; var resource = uri.Path ?? ""; if (resource.StartsWith("/", StringComparison.Ordinal)) resource = resource.Substring(1); - - if (string.IsNullOrWhiteSpace(resource)) - resource = "Duplicati"; - - agsXMPP.ObjectHandler loginDelegate = (sender) => + + var xmppClient = new XmppClient { - try - { - foreach(var recipient in m_to.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)) - con.Send(new agsXMPP.protocol.client.Message(recipient, agsXMPP.protocol.client.MessageType.chat, body)); - } - catch (Exception e) - { - Logging.Log.WriteWarningMessage(LOGTAG, "XMPPSendError", e, "Failed to send to XMPP messages: {0}", e.Message); - ex = e; - } - finally - { - waitEvent.Set(); - } + Username = uri.Username, + Password = string.IsNullOrWhiteSpace(m_password) ? uri.Password : m_password, + XmppDomain = uri.Host, + Port = uri.Port == -1 ? (uri.Scheme == "https" ? 5223 : 5222) : uri.Port, + Tls = uri.Scheme == "https", + Resource = string.IsNullOrWhiteSpace(resource) ? "Duplicati" : resource, + HostnameResolver = new Matrix.Network.Resolver.NameResolver() }; - agsXMPP.ErrorHandler errorHandler = (sender, e) => { - Logging.Log.WriteWarningMessage(LOGTAG, "XMPPError", e, "An error ocurred in XMPP: {0}", e.Message); - - ex = e; - waitEvent.Set(); - }; - - agsXMPP.XmppElementHandler loginErroHandler = (sender, e) => { - Logging.Log.WriteWarningMessage(LOGTAG, "XMPPLoginError", null, "Failed to login to XMPP: {0}", e); - - ex = new Exception(string.Format("Failed to log in: {0}", e)); - waitEvent.Set(); - }; - - con.OnLogin += loginDelegate; - con.OnError += errorHandler; - con.OnAuthError += loginErroHandler; - //con.OnBinded += (sender) => {Console.WriteLine("Binded: {0}", sender);}; - //con.OnIq += (sender, iq) => {Console.WriteLine("Iq: {0}", iq);}; - //con.OnReadXml += (sender, xml) => {Console.WriteLine("ReadXml: {0}", xml);}; - //con.OnWriteXml += (sender, xml) => {Console.WriteLine("writeXml: {0}", xml);};; - con.Open(uri.Username, string.IsNullOrWhiteSpace(m_password) ? uri.Password : m_password, resource); - - var timeout = !waitEvent.WaitOne(TimeSpan.FromSeconds(30), true); - - con.OnLogin -= loginDelegate; - con.OnError -= errorHandler; - con.OnAuthError -= loginErroHandler; + // connect so the server + await xmppClient.ConnectAsync(); try { - con.Close(); + foreach (var recipient in m_to.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries)) + await xmppClient.SendAsync(new Message(recipient, body, subject)); + } + catch (Exception e) + { + Logging.Log.WriteWarningMessage(LOGTAG, "XMPPSendError", e, "Failed to send to XMPP messages: {0}", e.Message); + ex = e; + } + finally + { + waitEvent.Set(); + } + + var timeout = !waitEvent.WaitOne(TimeSpan.FromSeconds(30), true); + + try + { + // Close connection again + await xmppClient.DisconnectAsync(); } catch (Exception lex) { diff --git a/Duplicati/Library/Modules/Builtin/packages.config b/Duplicati/Library/Modules/Builtin/packages.config deleted file mode 100644 index 75d5024ea..000000000 --- a/Duplicati/Library/Modules/Builtin/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From dd3271f6857be34c7b1354bb0de15026a9f14886 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 00:19:21 +0200 Subject: [PATCH 010/253] recoverytool --- .../Duplicati.CommandLine.RecoveryTool.csproj | 133 +++--------------- .../RecoveryTool/Properties/AssemblyInfo.cs | 43 ------ .../Properties/launchSettings.json | 10 ++ .../CommandLine/RecoveryTool/packages.config | 4 - 4 files changed, 31 insertions(+), 159 deletions(-) delete mode 100644 Duplicati/CommandLine/RecoveryTool/Properties/AssemblyInfo.cs create mode 100644 Duplicati/CommandLine/RecoveryTool/Properties/launchSettings.json delete mode 100644 Duplicati/CommandLine/RecoveryTool/packages.config diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index c838d0325..2ac914e66 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -1,181 +1,90 @@ - - + + - Debug - AnyCPU - {4A010589-76E6-4F05-A5C4-4598D5DF11F8} - Exe - False - Duplicati.CommandLine.RecoveryTool - Duplicati.CommandLine.RecoveryTool + netstandard2.0 + 2.0.0.7 + true Duplicati.snk - v4.6.2 - false - true - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - - - - index /Users/kenneth/testdata/recovery --targetpath=/Users/kenneth/testdata/recovery-restored - - - full - true - bin\Release - prompt - 4 - true + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.CommandLine.RecoveryTool + Duplicati Team + Duplicati Team + RecoveryTool for Duplicati + RecoveryTool + Duplicati.CommandLine.RecoveryTool + Duplicati.CommandLine.RecoveryTooln + - - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + - - - - - - - - - - - + - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Duplicati.Library.Backend.AzureBlob - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Duplicati.Library.Backend.CloudFiles - {FC9B7611-836F-4127-8B44-A7C31F506807} - Duplicati.Library.Backend.File - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Duplicati.Library.Backend.FTP - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Duplicati.Library.Backend.GoogleServices - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} - Duplicati.Library.Backend.HubiC - {2cd5dbc3-3da6-432d-ba97-f0b8d24501c2} - Duplicati.Library.Backend.Jottacloud - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Duplicati.Library.Backend.OneDrive - {D9E4E686-423C-48EC-A392-404E7C00860C} - Duplicati.Library.Backend.OpenStack - {851a1cb8-3ceb-41b4-956f-34d760d2a8e5} - Duplicati.Library.Backend.Rclone - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Duplicati.Library.Backend.S3 + - {32a74526-3e5f-413a-8cb4-1efdad4c8b91} - Duplicati.Library.Backend.Sia - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Duplicati.Library.Backend.SSHv2 - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Duplicati.Library.Backend.TahoeLAFS - {BAE27510-8B5D-44B2-B33E-372A98908041} - Duplicati.Library.Backend.WEBDAV - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Duplicati.Library.Compression - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87} - Duplicati.Library.Encryption - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - {10D2D1B7-C664-41D8-9B3A-00040C3D421B} - Duplicati.Library.Main - {08D7E42D-285C-4010-9881-986125FE2F3E} - Duplicati.Library.Backend.AmazonCloudDrive - {61C43D61-4368-4942-84A3-1EB623F4EF2A} - Duplicati.Library.Backend.Backblaze - {6643A5AE-AB38-453F-ADCE-408E35A81A83} - Duplicati.Library.Backend.Mega - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} - Duplicati.Library.Backend.Box - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F} - Duplicati.Library.Backend.AlternativeFTP - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493} - Duplicati.Library.Backend.Dropbox + - - - + \ No newline at end of file diff --git a/Duplicati/CommandLine/RecoveryTool/Properties/AssemblyInfo.cs b/Duplicati/CommandLine/RecoveryTool/Properties/AssemblyInfo.cs deleted file mode 100644 index 24b0dacd1..000000000 --- a/Duplicati/CommandLine/RecoveryTool/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.CommandLine.RecoveryTool")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("kenneth")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/Duplicati/CommandLine/RecoveryTool/Properties/launchSettings.json b/Duplicati/CommandLine/RecoveryTool/Properties/launchSettings.json new file mode 100644 index 000000000..a33873917 --- /dev/null +++ b/Duplicati/CommandLine/RecoveryTool/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Duplicati.CommandLine.RecoveryTool": { + "commandName": "Project", + "environmentVariables": { + "AUTOUPDATER_Duplicati_SKIP_UPDATE": "1" + } + } + } +} \ No newline at end of file diff --git a/Duplicati/CommandLine/RecoveryTool/packages.config b/Duplicati/CommandLine/RecoveryTool/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/CommandLine/RecoveryTool/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From c181a1946d9e53f18dcd8459ae9b522fb99c3c88 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 00:27:28 +0200 Subject: [PATCH 011/253] BackendTester --- ...Duplicati.CommandLine.BackendTester.csproj | 152 +++--------------- .../BackendTester/Properties/AssemblyInfo.cs | 55 ------- .../CommandLine/BackendTester/app.config | 7 - 3 files changed, 22 insertions(+), 192 deletions(-) delete mode 100644 Duplicati/CommandLine/BackendTester/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/CommandLine/BackendTester/app.config diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index f518279ed..ce2b18f80 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -1,198 +1,90 @@ - - + + - Debug - AnyCPU - {E7280DCA-7776-4A73-B9B5-41FD77FC8799} - Exe - False - Properties - Duplicati.CommandLine.BackendTester - Duplicati.CommandLine.BackendTester - 512 - - - 3.5 - + netstandard2.0 + 2.0.0.7 + true Duplicati.snk - v4.6.2 - - false - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - ~/.config/dupl-unittest.txt - - - - - - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.CommandLine.BackendTester + Duplicati Team + Duplicati Team + A backend debugging tool for Duplicati + BackendTester + Duplicati.CommandLine.BackendTester + Duplicati.CommandLine.BackendTester + - + - - - - - - - - - - - Designer - - - - - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Duplicati.Library.Backend.AzureBlob + + + - {b20a7cee-9c5b-47b9-8b76-bc85adfe8493} - Duplicati.Library.Backend.Dropbox - {2cd5dbc3-3da6-432d-ba97-f0b8d24501c2} - Duplicati.Library.Backend.Jottacloud - {851a1cb8-3ceb-41b4-956f-34d760d2a8e5} - Duplicati.Library.Backend.Rclone + - {32a74526-3e5f-413a-8cb4-1efdad4c8b91} - Duplicati.Library.Backend.Sia - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Duplicati.License - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Duplicati.Library.Backend.OneDrive - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Duplicati.Library.Backend.TahoeLAFS - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Duplicati.Library.Backend.GoogleServices - {D9E4E686-423C-48EC-A392-404E7C00860C} - Duplicati.Library.Backend.OpenStack - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} - Duplicati.Library.Backend.HubiC - {08D7E42D-285C-4010-9881-986125FE2F3E} - Duplicati.Library.Backend.AmazonCloudDrive - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Duplicati.Library.Backend.CloudFiles - {FC9B7611-836F-4127-8B44-A7C31F506807} - Duplicati.Library.Backend.File - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Duplicati.Library.Backend.FTP - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Duplicati.Library.Backend.S3 - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Duplicati.Library.Backend.SSHv2 - {BAE27510-8B5D-44B2-B33E-372A98908041} - Duplicati.Library.Backend.WEBDAV - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB} - Duplicati.Library.OAuthHelper - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - {61C43D61-4368-4942-84A3-1EB623F4EF2A} - Duplicati.Library.Backend.Backblaze - {6643A5AE-AB38-453F-ADCE-408E35A81A83} - Duplicati.Library.Backend.Mega - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} - Duplicati.Library.Backend.Box - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F} - Duplicati.Library.Backend.AlternativeFTP - - + \ No newline at end of file diff --git a/Duplicati/CommandLine/BackendTester/Properties/AssemblyInfo.cs b/Duplicati/CommandLine/BackendTester/Properties/AssemblyInfo.cs deleted file mode 100644 index 747b0ed7e..000000000 --- a/Duplicati/CommandLine/BackendTester/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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("CommandLine.BackendTester")] -[assembly: AssemblyDescription("A backend debugging tool for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("CommandLine.BackendTester")] -[assembly: AssemblyCopyright("Copyright © Duplicati Team 2015")] -[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("53df9eb0-a6e8-49a2-838d-b2a2c4a8d41f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/CommandLine/BackendTester/app.config b/Duplicati/CommandLine/BackendTester/app.config deleted file mode 100644 index d18d02a10..000000000 --- a/Duplicati/CommandLine/BackendTester/app.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - From a741425a66b131ea08a9697fc2c70df44cfbacd2 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 00:33:04 +0200 Subject: [PATCH 012/253] BackendTool --- .../Duplicati.CommandLine.BackendTool.csproj | 123 +++--------------- .../CommandLine/BackendTool/Duplicati.snk | Bin 0 -> 596 bytes .../BackendTool/Properties/AssemblyInfo.cs | 44 ------- Duplicati/CommandLine/BackendTool/app.config | 3 - 4 files changed, 19 insertions(+), 151 deletions(-) create mode 100644 Duplicati/CommandLine/BackendTool/Duplicati.snk delete mode 100644 Duplicati/CommandLine/BackendTool/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/CommandLine/BackendTool/app.config diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 33bdffdb5..337f7723d 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -1,163 +1,78 @@ - - + + - Debug - AnyCPU - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11} - Exe - False - Duplicati.CommandLine.BackendTool + netstandard2.0 + 2.0.0.7 + true + Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.CommandLine.BackendTool + Duplicati Team + Duplicati Team + + BackendTool Duplicati.CommandLine.BackendTool - ..\Duplicati.snk - v4.6.2 - - false - true + Duplicati.CommandLine.BackendTool - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - false - - - - - - - - none - true - bin\Release - prompt - 4 - true - false - - - - - - - - - - + + - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Duplicati.Library.Backend.CloudFiles - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Duplicati.Library.Backend.AzureBlob - {FC9B7611-836F-4127-8B44-A7C31F506807} - Duplicati.Library.Backend.File - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Duplicati.Library.Backend.FTP - {2cd5dbc3-3da6-432d-ba97-f0b8d24501c2} - Duplicati.Library.Backend.Jottacloud - {851a1cb8-3ceb-41b4-956f-34d760d2a8e5} - Duplicati.Library.Backend.Rclone - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Duplicati.Library.Backend.S3 + - {32a74526-3e5f-413a-8cb4-1efdad4c8b91} - Duplicati.Library.Backend.Sia - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Duplicati.Library.Backend.SSHv2 - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Duplicati.Library.Backend.TahoeLAFS - {BAE27510-8B5D-44B2-B33E-372A98908041} - Duplicati.Library.Backend.WEBDAV - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Duplicati.License - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Duplicati.Library.Backend.OneDrive - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Duplicati.Library.Backend.GoogleServices - {D9E4E686-423C-48EC-A392-404E7C00860C} - Duplicati.Library.Backend.OpenStack - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} - Duplicati.Library.Backend.HubiC - {08D7E42D-285C-4010-9881-986125FE2F3E} - Duplicati.Library.Backend.AmazonCloudDrive - {61C43D61-4368-4942-84A3-1EB623F4EF2A} - Duplicati.Library.Backend.Backblaze - {6643A5AE-AB38-453F-ADCE-408E35A81A83} - Duplicati.Library.Backend.Mega - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} - Duplicati.Library.Backend.Box - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F} - Duplicati.Library.Backend.AlternativeFTP - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493} - Duplicati.Library.Backend.Dropbox - - - + \ No newline at end of file diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.snk b/Duplicati/CommandLine/BackendTool/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T - - From 49317391940a71a6c922686e1bf258c2a97a36ed Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 01:08:35 +0200 Subject: [PATCH 013/253] CommandLine --- .../CommandLine/Duplicati.CommandLine.csproj | 166 +++--------------- .../CommandLine/Properties/AssemblyInfo.cs | 52 ------ Duplicati/CommandLine/app.config | 9 - 3 files changed, 25 insertions(+), 202 deletions(-) delete mode 100644 Duplicati/CommandLine/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/CommandLine/app.config diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index 60419c63a..5cb263f07 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -1,225 +1,109 @@ - - + + - Debug - AnyCPU - {81765A64-3661-4E3E-B850-2F6F87A51F74} - Exe - False - Properties - Duplicati.CommandLine - Duplicati.CommandLine + netstandard2.0 + 2.0.0.7 + true Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.CommandLine + Duplicati Team + Duplicati Team + A commandline version of Duplicati + CommandLine + Duplicati.CommandLine + Duplicati.CommandLine TrayWarning.ico - - - 3.5 - - - v4.6.2 - - false - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - - - - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + - - + + + - - - - - - - - - - + + - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Duplicati.Library.Backend.AzureBlob - {FC9B7611-836F-4127-8B44-A7C31F506807} - Duplicati.Library.Backend.File - {2cd5dbc3-3da6-432d-ba97-f0b8d24501c2} - Duplicati.Library.Backend.Jottacloud - {851a1cb8-3ceb-41b4-956f-34d760d2a8e5} - Duplicati.Library.Backend.Rclone - - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A} - Duplicati.Library.Backend.SharePoint + - {32a74526-3e5f-413a-8cb4-1efdad4c8b91} - Duplicati.Library.Backend.Sia - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Duplicati.Library.Compression - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87} - Duplicati.Library.Encryption - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - {10D2D1B7-C664-41D8-9B3A-00040C3D421B} - Duplicati.Library.Main - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Duplicati.License - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Duplicati.Library.Backend.FTP - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Duplicati.Library.Backend.CloudFiles - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Duplicati.Library.Backend.S3 - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Duplicati.Library.Backend.SSHv2 - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Duplicati.Library.Backend.TahoeLAFS - {BAE27510-8B5D-44B2-B33E-372A98908041} - Duplicati.Library.Backend.WEBDAV - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11} - Duplicati.CommandLine.BackendTool - {E7280DCA-7776-4A73-B9B5-41FD77FC8799} - Duplicati.CommandLine.BackendTester - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Duplicati.Library.Backend.OneDrive - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Duplicati.Library.Backend.GoogleServices - {D9E4E686-423C-48EC-A392-404E7C00860C} - Duplicati.Library.Backend.OpenStack - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} - Duplicati.Library.Backend.HubiC - {4A010589-76E6-4F05-A5C4-4598D5DF11F8} - Duplicati.CommandLine.RecoveryTool - {08D7E42D-285C-4010-9881-986125FE2F3E} - Duplicati.Library.Backend.AmazonCloudDrive - {61C43D61-4368-4942-84A3-1EB623F4EF2A} - Duplicati.Library.Backend.Backblaze - {6643A5AE-AB38-453F-ADCE-408E35A81A83} - Duplicati.Library.Backend.Mega - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} - Duplicati.Library.Backend.Box - {BB014EA5-CE2C-4444-8D30-38983A0E8553} - Duplicati.Library.UsageReporter - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493} - Duplicati.Library.Backend.Dropbox - {0797AA22-C5DD-4950-BB60-34765AB8C6DD} - Duplicati.Tools + - - - - - - - + \ No newline at end of file diff --git a/Duplicati/CommandLine/Properties/AssemblyInfo.cs b/Duplicati/CommandLine/Properties/AssemblyInfo.cs deleted file mode 100644 index a4d46a315..000000000 --- a/Duplicati/CommandLine/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,52 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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")] -[assembly: AssemblyDescription("A commandline version of Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.CommandLine")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("bfc1d214-8825-417d-8e2c-be4bb0d6524d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/CommandLine/app.config b/Duplicati/CommandLine/app.config deleted file mode 100644 index e59716060..000000000 --- a/Duplicati/CommandLine/app.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - From 795b5c34dc5020a06c05cae3f9e60c317a4a4489 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 01:18:59 +0200 Subject: [PATCH 014/253] Main --- .../Duplicati.Library.Compression.csproj | 2 +- .../Main/Duplicati.Library.Main.csproj | 203 ++---------------- .../Library/Main/Properties/AssemblyInfo.cs | 54 ----- Duplicati/Library/Main/app.config | 3 - Duplicati/Library/Main/packages.config | 5 - 5 files changed, 22 insertions(+), 245 deletions(-) delete mode 100644 Duplicati/Library/Main/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Main/app.config delete mode 100644 Duplicati/Library/Main/packages.config diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 5272c206f..e881200b8 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 1e0baeebf..de1f5d3d7 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -1,212 +1,54 @@ - - + + - Debug - AnyCPU - {10D2D1B7-C664-41D8-9B3A-00040C3D421B} - Library - Properties - Duplicati.Library.Main - Duplicati.Library.Main + netstandard2.0 + 2.0.0.7 + true Duplicati.snk - - - 3.5 - v4.6.2 - - - - false - - - True - full - False - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - True - bin\Release\ - TRACE - prompt - 4 + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.Main + Duplicati Team + Duplicati Team + The main Duplicati implementation module + Main + Duplicati.Main + Duplicati.Main + - - - - - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - ..\..\..\packages\CoCoL.1.5.1\lib\net45\CoCoL.dll - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - {D63E53E4-A458-4C2F-914D-92F715F58ACE} - Duplicati.Library.Snapshots - {2C838169-B187-4B09-8768-1C24C2521C8D} - Duplicati.Library.SQLiteHelper - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - {BB014EA5-CE2C-4444-8D30-38983A0E8553} - Duplicati.Library.UsageReporter - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - - - + - - - - @@ -215,8 +57,5 @@ PreserveNewest - - - - - + + \ No newline at end of file diff --git a/Duplicati/Library/Main/Properties/AssemblyInfo.cs b/Duplicati/Library/Main/Properties/AssemblyInfo.cs deleted file mode 100644 index e7934bf6c..000000000 --- a/Duplicati/Library/Main/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Main")] -[assembly: AssemblyDescription("The main Duplicati implementation module")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Main")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("a33bf3f8-4dbd-4995-8a82-b735847d2e08")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Main/app.config b/Duplicati/Library/Main/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Main/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Main/packages.config b/Duplicati/Library/Main/packages.config deleted file mode 100644 index 040b8a7cf..000000000 --- a/Duplicati/Library/Main/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file From 860bbdd36352db9ad9ebca574c2b4539f9c109c3 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 01:22:58 +0200 Subject: [PATCH 015/253] cleanup --- BuildTools/UpdateVersionStamp/app.config | 3 --- .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 1 - Duplicati/GUI/Duplicati.GUI.TrayIcon/app.config | 7 ------- Duplicati/Library/Backend/CloudFiles/app.config | 3 --- Duplicati/Library/Backend/File/app.config | 3 --- Duplicati/Library/Backend/S3/app.config | 3 --- Duplicati/Library/Backend/SharePoint/app.config | 3 --- Duplicati/Library/Backend/WEBDAV/app.config | 3 --- Duplicati/Library/Compression/app.config | 3 --- .../Library/Snapshots/Duplicati.Library.Snapshots.csproj | 1 - Duplicati/Library/Snapshots/app.config | 3 --- Duplicati/Server/Duplicati.Server.csproj | 1 - Duplicati/Server/app.config | 7 ------- Duplicati/Service/Duplicati.Service.csproj | 5 +---- Duplicati/Service/app.config | 3 --- Duplicati/WindowsService/App.config | 6 ------ Duplicati/WindowsService/WindowsService.csproj | 3 +-- Tools/SQLiteTool/App.config | 6 ------ 18 files changed, 2 insertions(+), 62 deletions(-) delete mode 100644 BuildTools/UpdateVersionStamp/app.config delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/app.config delete mode 100644 Duplicati/Library/Backend/CloudFiles/app.config delete mode 100644 Duplicati/Library/Backend/File/app.config delete mode 100644 Duplicati/Library/Backend/S3/app.config delete mode 100644 Duplicati/Library/Backend/SharePoint/app.config delete mode 100644 Duplicati/Library/Backend/WEBDAV/app.config delete mode 100644 Duplicati/Library/Compression/app.config delete mode 100644 Duplicati/Library/Snapshots/app.config delete mode 100644 Duplicati/Server/app.config delete mode 100644 Duplicati/Service/app.config delete mode 100644 Duplicati/WindowsService/App.config delete mode 100644 Tools/SQLiteTool/App.config diff --git a/BuildTools/UpdateVersionStamp/app.config b/BuildTools/UpdateVersionStamp/app.config deleted file mode 100644 index 51278a456..000000000 --- a/BuildTools/UpdateVersionStamp/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 4646f08ef..3cdae7f10 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -102,7 +102,6 @@ - SettingsSingleFileGenerator diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/app.config b/Duplicati/GUI/Duplicati.GUI.TrayIcon/app.config deleted file mode 100644 index 1657ceed0..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/app.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Duplicati/Library/Backend/CloudFiles/app.config b/Duplicati/Library/Backend/CloudFiles/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Backend/CloudFiles/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Backend/File/app.config b/Duplicati/Library/Backend/File/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Backend/File/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Backend/S3/app.config b/Duplicati/Library/Backend/S3/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Backend/S3/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Backend/SharePoint/app.config b/Duplicati/Library/Backend/SharePoint/app.config deleted file mode 100644 index a80813afe..000000000 --- a/Duplicati/Library/Backend/SharePoint/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Backend/WEBDAV/app.config b/Duplicati/Library/Backend/WEBDAV/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Backend/WEBDAV/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Compression/app.config b/Duplicati/Library/Compression/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Compression/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index ad0876b78..1cf20de19 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -103,7 +103,6 @@ - PreserveNewest diff --git a/Duplicati/Library/Snapshots/app.config b/Duplicati/Library/Snapshots/app.config deleted file mode 100644 index b4ca687d2..000000000 --- a/Duplicati/Library/Snapshots/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index ce303995f..254f1a3fc 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -127,7 +127,6 @@ - diff --git a/Duplicati/Server/app.config b/Duplicati/Server/app.config deleted file mode 100644 index 1657ceed0..000000000 --- a/Duplicati/Server/app.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index a17c4bd81..4868a5180 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -5,7 +5,7 @@ AnyCPU {E93F3DE2-FF3A-4709-96A3-8190AA14FA25} Exe - False + False Duplicati.Service Duplicati.Service v4.6.2 @@ -55,7 +55,4 @@ Duplicati.Library.Utility - - - \ No newline at end of file diff --git a/Duplicati/Service/app.config b/Duplicati/Service/app.config deleted file mode 100644 index b7a7ef166..000000000 --- a/Duplicati/Service/app.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Duplicati/WindowsService/App.config b/Duplicati/WindowsService/App.config deleted file mode 100644 index 877624ed9..000000000 --- a/Duplicati/WindowsService/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 5202a9cb6..b826f2311 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -6,7 +6,7 @@ AnyCPU {BEF7AF9A-3978-4F90-8592-198BF6EA6C6B} Exe - False + False Properties Duplicati.WindowsService Duplicati.WindowsService @@ -71,7 +71,6 @@ - diff --git a/Tools/SQLiteTool/App.config b/Tools/SQLiteTool/App.config deleted file mode 100644 index 2ae22ede8..000000000 --- a/Tools/SQLiteTool/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 989ae94bacc4cdd35a0f13bd10a965f25ad1d40a Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 01:29:15 +0200 Subject: [PATCH 016/253] Serialization --- .../Duplicati.Server.Serialization.csproj | 103 ++++-------------- .../Properties/AssemblyInfo.cs | 36 ------ .../packages.config | 4 - 3 files changed, 20 insertions(+), 123 deletions(-) delete mode 100644 Duplicati/Server/Duplicati.Server.Serialization/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Server/Duplicati.Server.Serialization/packages.config diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 72d6c777d..140c30242 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -1,90 +1,27 @@ - - - - Debug - AnyCPU - {33FD1D24-C28F-4C71-933F-98F1586EA76C} - Library - Properties - Duplicati.Server.Serialization - Duplicati.Server.Serialization - 512 - v4.6.2 - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - - - + + + netstandard2.0 + 2.0.0.7 + true Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.Server.Serialization + Duplicati Team + Duplicati Team + Serialization module for Duplicati + Serialization + Duplicati.Server.Serialization + Duplicati.Server.Serialization + - - - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + - - - - - - - - - - - - - - - - - - - + + + + - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - - - - - - - + \ No newline at end of file diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Properties/AssemblyInfo.cs b/Duplicati/Server/Duplicati.Server.Serialization/Properties/AssemblyInfo.cs deleted file mode 100644 index f29219237..000000000 --- a/Duplicati/Server/Duplicati.Server.Serialization/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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.Server.Serialization")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Server.Serialization")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("acd58890-bd78-42fa-965a-fa3c0ab2f86c")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Server/Duplicati.Server.Serialization/packages.config b/Duplicati/Server/Duplicati.Server.Serialization/packages.config deleted file mode 100644 index ee51c2373..000000000 --- a/Duplicati/Server/Duplicati.Server.Serialization/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From d1c20de1117b99b177c980f2dfd72bbaa7d8c386 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 01:57:11 +0200 Subject: [PATCH 017/253] Server --- Duplicati/Server/Duplicati.Server.csproj | 427 ++++++-------------- Duplicati/Server/LiveControls.cs | 95 ++--- Duplicati/Server/Properties/AssemblyInfo.cs | 36 -- Duplicati/Server/packages.config | 5 - 4 files changed, 171 insertions(+), 392 deletions(-) delete mode 100644 Duplicati/Server/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Server/packages.config diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 254f1a3fc..1c0d3156c 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -1,329 +1,146 @@ - - - - Debug - AnyCPU - {19E661D2-C5DA-4F35-B3EE-7586E5734B5F} - Exe - False - Properties - Duplicati.Server - Duplicati.Server - 512 - v4.6.2 - - false - true - - - true - bin\Debug\ - DEBUG;TRACE - full - AnyCPU - prompt - false - false - 4 - false - --webservice-port=8200,8201,8202 - false - - - bin\Release\ - TRACE - true - pdbonly - AnyCPU - prompt - true - true - 4 - false - + + + netstandard2.0 + 2.0.0.7 + true Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.Server + Duplicati Team + Duplicati Team + The Server Duplicati implementation + Server + Duplicati.Server + Duplicati.Server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - ..\..\packages\BouncyCastle.1.8.1\lib\BouncyCastle.Crypto.dll - ..\..\thirdparty\UnixSupport\UnixSupport.dll ..\..\thirdparty\HttpServer\HttpServer.dll - - - - ..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {E7280DCA-7776-4A73-B9B5-41FD77FC8799} - Duplicati.CommandLine.BackendTester - - - {81765A64-3661-4E3E-B850-2F6F87A51F74} - Duplicati.CommandLine - - - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F} - Duplicati.Library.Backend.AlternativeFTP - - - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Duplicati.Library.Backend.AzureBlob - - - {FC9B7611-836F-4127-8B44-A7C31F506807} - Duplicati.Library.Backend.File - - - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Duplicati.Library.Backend.CloudFiles - - - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Duplicati.Library.Backend.FTP - - - {2cd5dbc3-3da6-432d-ba97-f0b8d24501c2} - Duplicati.Library.Backend.Jottacloud - - - {d4c37c33-5e73-4b56-b2c3-dc4a6baa36bb} - Duplicati.Library.OAuthHelper - - - {851a1cb8-3ceb-41b4-956f-34d760d2a8e5} - Duplicati.Library.Backend.Rclone - - - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Duplicati.Library.Backend.S3 - - - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A} - Duplicati.Library.Backend.SharePoint - - - {32a74526-3e5f-413a-8cb4-1efdad4c8b91} - Duplicati.Library.Backend.Sia - - - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Duplicati.Library.Backend.SSHv2 - - - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Duplicati.Library.Backend.TahoeLAFS - - - {BAE27510-8B5D-44B2-B33E-372A98908041} - Duplicati.Library.Backend.WEBDAV - - - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Duplicati.Library.Compression - - - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - - - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87} - Duplicati.Library.Encryption - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - - - {10D2D1B7-C664-41D8-9B3A-00040C3D421B} - Duplicati.Library.Main - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Duplicati.License - - - {bef7af9a-3978-4f90-8592-198bf6ea6c6b} - WindowsService - - - {33FD1D24-C28F-4C71-933F-98F1586EA76C} - Duplicati.Server.Serialization - - - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11} - Duplicati.CommandLine.BackendTool - - - {D63E53E4-A458-4C2F-914D-92F715F58ACE} - Duplicati.Library.Snapshots - - - {2C838169-B187-4B09-8768-1C24C2521C8D} - Duplicati.Library.SQLiteHelper - - - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Duplicati.Library.Backend.OneDrive - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - - - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Duplicati.Library.Backend.GoogleServices - - - {D9E4E686-423C-48EC-A392-404E7C00860C} - Duplicati.Library.Backend.OpenStack - - - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} - Duplicati.Library.Backend.HubiC - - - {4A010589-76E6-4F05-A5C4-4598D5DF11F8} - Duplicati.CommandLine.RecoveryTool - - - {08D7E42D-285C-4010-9881-986125FE2F3E} - Duplicati.Library.Backend.AmazonCloudDrive - - - {61C43D61-4368-4942-84A3-1EB623F4EF2A} - Duplicati.Library.Backend.Backblaze - - - {6643A5AE-AB38-453F-ADCE-408E35A81A83} - Duplicati.Library.Backend.Mega - - - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} - Duplicati.Library.Backend.Box - - - {BB014EA5-CE2C-4444-8D30-38983A0E8553} - Duplicati.Library.UsageReporter - - - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493} - Duplicati.Library.Backend.Dropbox - - - {0797AA22-C5DD-4950-BB60-34765AB8C6DD} - Duplicati.Tools - - + - - + \ No newline at end of file diff --git a/Duplicati/Server/LiveControls.cs b/Duplicati/Server/LiveControls.cs index f6aa8a1dd..d39e634af 100644 --- a/Duplicati/Server/LiveControls.cs +++ b/Duplicati/Server/LiveControls.cs @@ -337,7 +337,8 @@ namespace Duplicati.Server /// private void RegisterHibernateMonitor() { - Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); + //TODO-DNC + //Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); } /// @@ -345,7 +346,8 @@ namespace Duplicati.Server /// private void UnregisterHibernateMonitor() { - Microsoft.Win32.SystemEvents.PowerModeChanged -= new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); + //TODO-DNC + //Microsoft.Win32.SystemEvents.PowerModeChanged -= new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); } /// @@ -355,55 +357,56 @@ namespace Duplicati.Server /// The event information private void SystemEvents_PowerModeChanged(object sender, object _e) { - Microsoft.Win32.PowerModeChangedEventArgs e = _e as Microsoft.Win32.PowerModeChangedEventArgs; - if (e == null) - return; + //TODO-DNC + //Microsoft.Win32.PowerModeChangedEventArgs e = _e as Microsoft.Win32.PowerModeChangedEventArgs; + //if (e == null) + // return; - if (e.Mode == Microsoft.Win32.PowerModes.Suspend) - { - //If we are running, register as being paused due to suspending - if (this.m_state == LiveControlState.Running) - { - this.SetPauseMode(); - m_pausedForSuspend = true; - m_suspendMinimumPause = new DateTime(0); - } - else - { - if (m_waitTimeExpiration.Ticks != 0) - { - m_pausedForSuspend = true; - m_suspendMinimumPause = this.EstimatedPauseEnd; - ResetTimer(null); - } + //if (e.Mode == Microsoft.Win32.PowerModes.Suspend) + //{ + // //If we are running, register as being paused due to suspending + // if (this.m_state == LiveControlState.Running) + // { + // this.SetPauseMode(); + // m_pausedForSuspend = true; + // m_suspendMinimumPause = new DateTime(0); + // } + // else + // { + // if (m_waitTimeExpiration.Ticks != 0) + // { + // m_pausedForSuspend = true; + // m_suspendMinimumPause = this.EstimatedPauseEnd; + // ResetTimer(null); + // } - } - } - else if (e.Mode == Microsoft.Win32.PowerModes.Resume) - { - //If we have been been paused due to suspending, we un-pause now - if (m_pausedForSuspend) - { - long delayTicks = (m_suspendMinimumPause - DateTime.Now).Ticks; + // } + //} + //else if (e.Mode == Microsoft.Win32.PowerModes.Resume) + //{ + // //If we have been been paused due to suspending, we un-pause now + // if (m_pausedForSuspend) + // { + // long delayTicks = (m_suspendMinimumPause - DateTime.Now).Ticks; - var appset = Program.DataConnection.ApplicationSettings; - if (!string.IsNullOrEmpty(appset.StartupDelayDuration) && appset.StartupDelayDuration != "0") - try { delayTicks = Math.Max(delayTicks, Library.Utility.Timeparser.ParseTimeSpan(appset.StartupDelayDuration).Ticks); } - catch { } + // var appset = Program.DataConnection.ApplicationSettings; + // if (!string.IsNullOrEmpty(appset.StartupDelayDuration) && appset.StartupDelayDuration != "0") + // try { delayTicks = Math.Max(delayTicks, Library.Utility.Timeparser.ParseTimeSpan(appset.StartupDelayDuration).Ticks); } + // catch { } - if (delayTicks > 0) - { - this.Pause(TimeSpan.FromTicks(delayTicks)); - } - else - { - this.Resume(); - } - } + // if (delayTicks > 0) + // { + // this.Pause(TimeSpan.FromTicks(delayTicks)); + // } + // else + // { + // this.Resume(); + // } + // } - m_pausedForSuspend = false; - m_suspendMinimumPause = new DateTime(0); - } + // m_pausedForSuspend = false; + // m_suspendMinimumPause = new DateTime(0); + //} } } diff --git a/Duplicati/Server/Properties/AssemblyInfo.cs b/Duplicati/Server/Properties/AssemblyInfo.cs deleted file mode 100644 index cbb72e89f..000000000 --- a/Duplicati/Server/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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.Server")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Server")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("94819ef2-1899-420c-8a91-77cde270c53e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Server/packages.config b/Duplicati/Server/packages.config deleted file mode 100644 index efc598b08..000000000 --- a/Duplicati/Server/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file From 6971fa461439835cb005d022d6158b9a0465931a Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 30 Jun 2018 02:04:02 +0200 Subject: [PATCH 018/253] Service --- Duplicati/Service/Duplicati.Service.csproj | 72 +++++-------------- Duplicati/Service/Duplicati.snk | Bin 0 -> 596 bytes Duplicati/Service/Properties/AssemblyInfo.cs | 44 ------------ 3 files changed, 19 insertions(+), 97 deletions(-) create mode 100644 Duplicati/Service/Duplicati.snk delete mode 100644 Duplicati/Service/Properties/AssemblyInfo.cs diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index 4868a5180..19a9e763b 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,58 +1,24 @@ - - + + - Debug - AnyCPU - {E93F3DE2-FF3A-4709-96A3-8190AA14FA25} - Exe - False - Duplicati.Service + netstandard2.0 + 2.0.0.7 + true + Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.Service + Duplicati Team + Duplicati Team + + Service Duplicati.Service - v4.6.2 - - false + Duplicati.Service - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - false - - - full - true - bin\Release - prompt - 4 - true - false - - - - - - - - - - - - - {19E661D2-C5DA-4F35-B3EE-7586E5734B5F} - Duplicati.Server - - - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - + + + + + + \ No newline at end of file diff --git a/Duplicati/Service/Duplicati.snk b/Duplicati/Service/Duplicati.snk new file mode 100644 index 0000000000000000000000000000000000000000..e0c1e2dd86119728adaeefc5f14f2e597dabceeb GIT binary patch literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T Date: Sun, 9 Sep 2018 14:10:26 +0200 Subject: [PATCH 019/253] sync of cocol versions --- .../Duplicati.GUI.TrayIcon.csproj | 10 ++++++---- Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 3cdae7f10..7b59c7358 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -64,6 +64,9 @@ Duplicati.snk + + ..\..\..\packages\CoCoL.1.6.1\lib\netstandard2.0\CoCoL.dll + @@ -92,9 +95,6 @@ ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - ..\..\..\packages\CoCoL.1.5.1\lib\net45\CoCoL.dll - @@ -142,7 +142,9 @@ - + + Designer + diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config b/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config index 040b8a7cf..9cc66836c 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config @@ -1,5 +1,5 @@  - - + + \ No newline at end of file From 30fab22340d6575e3c9e0e5c299952c375c72878 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 9 Sep 2018 14:21:55 +0200 Subject: [PATCH 020/253] unsinged whole solution --- .../Duplicati.CommandLine.BackendTester.csproj | 3 +-- Duplicati/CommandLine/BackendTester/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.CommandLine.BackendTool.csproj | 3 +-- Duplicati/CommandLine/BackendTool/Duplicati.snk | Bin 596 -> 0 bytes .../CommandLine/Duplicati.CommandLine.csproj | 3 +-- Duplicati/CommandLine/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.CommandLine.RecoveryTool.csproj | 3 +-- Duplicati/CommandLine/RecoveryTool/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.GUI.TrayIcon.csproj | 3 +-- .../GUI/Duplicati.GUI.TrayIcon/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.AutoUpdater.csproj | 3 +-- Duplicati/Library/AutoUpdater/Duplicati.snk | Bin 596 -> 0 bytes ...uplicati.Library.Backend.AlternativeFTP.csproj | 3 +-- .../Library/Backend/AlternativeFTP/Duplicati.snk | Bin 596 -> 0 bytes ...licati.Library.Backend.AmazonCloudDrive.csproj | 3 +-- .../Backend/AmazonCloudDrive/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.AzureBlob.csproj | 3 +-- Duplicati/Library/Backend/AzureBlob/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.Backblaze.csproj | 3 +-- Duplicati/Library/Backend/Backblaze/Duplicati.snk | Bin 596 -> 0 bytes .../Box/Duplicati.Library.Backend.Box.csproj | 3 +-- Duplicati/Library/Backend/Box/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.CloudFiles.csproj | 3 +-- .../Library/Backend/CloudFiles/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.Dropbox.csproj | 3 +-- Duplicati/Library/Backend/Dropbox/Duplicati.snk | Bin 596 -> 0 bytes .../FTP/Duplicati.Library.Backend.FTP.csproj | 3 +-- Duplicati/Library/Backend/FTP/Duplicati.snk | Bin 596 -> 0 bytes .../File/Duplicati.Library.Backend.File.csproj | 3 +-- Duplicati/Library/Backend/File/Duplicati.snk | Bin 596 -> 0 bytes ...uplicati.Library.Backend.GoogleServices.csproj | 3 +-- .../Library/Backend/GoogleServices/Duplicati.snk | Bin 596 -> 0 bytes .../HubiC/Duplicati.Library.Backend.HubiC.csproj | 3 +-- Duplicati/Library/Backend/HubiC/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.Jottacloud.csproj | 3 +-- .../Library/Backend/Jottacloud/Duplicati.snk | Bin 596 -> 0 bytes .../Mega/Duplicati.Library.Backend.Mega.csproj | 3 +-- Duplicati/Library/Backend/Mega/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.OAuthHelper.csproj | 3 +-- .../Library/Backend/OAuthHelper/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.OneDrive.csproj | 3 +-- Duplicati/Library/Backend/OneDrive/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.OpenStack.csproj | 3 +-- Duplicati/Library/Backend/OpenStack/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.Rclone.csproj | 3 +-- Duplicati/Library/Backend/Rclone/Duplicati.snk | Bin 596 -> 0 bytes .../S3/Duplicati.Library.Backend.S3.csproj | 3 +-- Duplicati/Library/Backend/S3/Duplicati.snk | Bin 596 -> 0 bytes .../SSHv2/Duplicati.Library.Backend.SSHv2.csproj | 3 +-- Duplicati/Library/Backend/SSHv2/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.SharePoint.csproj | 3 +-- .../Library/Backend/SharePoint/Duplicati.snk | Bin 596 -> 0 bytes .../Sia/Duplicati.Library.Backend.Sia.csproj | 3 +-- Duplicati/Library/Backend/Sia/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.TahoeLAFS.csproj | 3 +-- Duplicati/Library/Backend/TahoeLAFS/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Backend.WEBDAV.csproj | 3 +-- Duplicati/Library/Backend/WEBDAV/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Compression.csproj | 3 +-- Duplicati/Library/Compression/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.DynamicLoader.csproj | 3 +-- Duplicati/Library/DynamicLoader/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Encryption.csproj | 3 +-- Duplicati/Library/Encryption/Duplicati.snk | Bin 596 -> 0 bytes .../Interface/Duplicati.Library.Interface.csproj | 3 +-- Duplicati/Library/Interface/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Localization.csproj | 3 +-- Duplicati/Library/Localization/Duplicati.snk | Bin 596 -> 0 bytes .../Logging/Duplicati.Library.Logging.csproj | 3 +-- Duplicati/Library/Logging/Duplicati.snk | Bin 596 -> 0 bytes .../Library/Main/Duplicati.Library.Main.csproj | 3 +-- Duplicati/Library/Main/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.Modules.Builtin.csproj | 3 +-- Duplicati/Library/Modules/Builtin/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.SQLiteHelper.csproj | 3 +-- Duplicati/Library/SQLiteHelper/Duplicati.snk | Bin 596 -> 0 bytes .../Snapshots/Duplicati.Library.Snapshots.csproj | 3 +-- Duplicati/Library/Snapshots/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Library.UsageReporter.csproj | 3 +-- Duplicati/Library/UsageReporter/Duplicati.snk | Bin 596 -> 0 bytes .../Utility/Duplicati.Library.Utility.csproj | 4 +--- Duplicati/Library/Utility/Duplicati.snk | Bin 596 -> 0 bytes Duplicati/License/Duplicati.License.csproj | 3 +-- Duplicati/License/Duplicati.snk | Bin 596 -> 0 bytes .../Duplicati.Server.Serialization.csproj | 3 +-- .../Duplicati.Server.Serialization/Duplicati.snk | Bin 596 -> 0 bytes Duplicati/Server/Duplicati.Server.csproj | 3 +-- Duplicati/Server/Duplicati.snk | Bin 596 -> 0 bytes Duplicati/Service/Duplicati.Service.csproj | 3 +-- Duplicati/Service/Duplicati.snk | Bin 596 -> 0 bytes Duplicati/Tools/Duplicati.Tools.csproj | 3 +-- Duplicati/Tools/Duplicati.snk | Bin 596 -> 0 bytes Duplicati/WindowsService/Duplicati.snk | Bin 596 -> 0 bytes Duplicati/WindowsService/WindowsService.csproj | 5 +---- thirdparty/UnixSupport/Duplicati.snk | Bin 596 -> 0 bytes thirdparty/UnixSupport/UnixSupport.csproj | 2 +- 96 files changed, 48 insertions(+), 98 deletions(-) delete mode 100644 Duplicati/CommandLine/BackendTester/Duplicati.snk delete mode 100644 Duplicati/CommandLine/BackendTool/Duplicati.snk delete mode 100644 Duplicati/CommandLine/Duplicati.snk delete mode 100644 Duplicati/CommandLine/RecoveryTool/Duplicati.snk delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.snk delete mode 100644 Duplicati/Library/AutoUpdater/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/AlternativeFTP/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/AzureBlob/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Backblaze/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Box/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/CloudFiles/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Dropbox/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/FTP/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/File/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/GoogleServices/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/HubiC/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Jottacloud/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Mega/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/OAuthHelper/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/OneDrive/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/OpenStack/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Rclone/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/S3/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/SSHv2/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/SharePoint/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/Sia/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/TahoeLAFS/Duplicati.snk delete mode 100644 Duplicati/Library/Backend/WEBDAV/Duplicati.snk delete mode 100644 Duplicati/Library/Compression/Duplicati.snk delete mode 100644 Duplicati/Library/DynamicLoader/Duplicati.snk delete mode 100644 Duplicati/Library/Encryption/Duplicati.snk delete mode 100644 Duplicati/Library/Interface/Duplicati.snk delete mode 100644 Duplicati/Library/Localization/Duplicati.snk delete mode 100644 Duplicati/Library/Logging/Duplicati.snk delete mode 100644 Duplicati/Library/Main/Duplicati.snk delete mode 100644 Duplicati/Library/Modules/Builtin/Duplicati.snk delete mode 100644 Duplicati/Library/SQLiteHelper/Duplicati.snk delete mode 100644 Duplicati/Library/Snapshots/Duplicati.snk delete mode 100644 Duplicati/Library/UsageReporter/Duplicati.snk delete mode 100644 Duplicati/Library/Utility/Duplicati.snk delete mode 100644 Duplicati/License/Duplicati.snk delete mode 100644 Duplicati/Server/Duplicati.Server.Serialization/Duplicati.snk delete mode 100644 Duplicati/Server/Duplicati.snk delete mode 100644 Duplicati/Service/Duplicati.snk delete mode 100644 Duplicati/Tools/Duplicati.snk delete mode 100644 Duplicati/WindowsService/Duplicati.snk delete mode 100644 thirdparty/UnixSupport/Duplicati.snk diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index ce2b18f80..0f693fd1f 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -3,8 +3,7 @@ netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine.BackendTester Duplicati Team diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.snk b/Duplicati/CommandLine/BackendTester/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine.BackendTool Duplicati Team diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.snk b/Duplicati/CommandLine/BackendTool/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine Duplicati Team diff --git a/Duplicati/CommandLine/Duplicati.snk b/Duplicati/CommandLine/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine.RecoveryTool Duplicati Team diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.snk b/Duplicati/CommandLine/RecoveryTool/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!TDuplicati.GUI.TrayIcon.Program - Duplicati.snk + @@ -102,7 +102,6 @@ - SettingsSingleFileGenerator Settings.Designer.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.snk b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.AutoUpdater Duplicati Team diff --git a/Duplicati/Library/AutoUpdater/Duplicati.snk b/Duplicati/Library/AutoUpdater/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Backend.AlternativeFTP Duplicati Team diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.snk b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Backend.AmazonCloudDrive Duplicati Team diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.snk b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.AzureBlob Duplicati Team diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.snk b/Duplicati/Library/Backend/AzureBlob/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.Backblaze Duplicati Team diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.snk b/Duplicati/Library/Backend/Backblaze/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.Box Duplicati Team diff --git a/Duplicati/Library/Backend/Box/Duplicati.snk b/Duplicati/Library/Backend/Box/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.CloudFiles Duplicati Team diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.snk b/Duplicati/Library/Backend/CloudFiles/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.Dropbox Duplicati Team diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.snk b/Duplicati/Library/Backend/Dropbox/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Backend.FTP Duplicati Team diff --git a/Duplicati/Library/Backend/FTP/Duplicati.snk b/Duplicati/Library/Backend/FTP/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.File Duplicati Team diff --git a/Duplicati/Library/Backend/File/Duplicati.snk b/Duplicati/Library/Backend/File/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.GoogleCloudStorage Duplicati Team diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.snk b/Duplicati/Library/Backend/GoogleServices/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.HubiC Duplicati Team diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.snk b/Duplicati/Library/Backend/HubiC/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.Jottacloud Duplicati Team diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.snk b/Duplicati/Library/Backend/Jottacloud/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.Mega Duplicati Team diff --git a/Duplicati/Library/Backend/Mega/Duplicati.snk b/Duplicati/Library/Backend/Mega/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.OAuthHelper Duplicati Team diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.snk b/Duplicati/Library/Backend/OAuthHelper/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.OneDrive Duplicati Team diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.snk b/Duplicati/Library/Backend/OneDrive/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.OpenStack Duplicati Team diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.snk b/Duplicati/Library/Backend/OpenStack/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.Rclone Duplicati Team diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.snk b/Duplicati/Library/Backend/Rclone/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.S3 Duplicati Team diff --git a/Duplicati/Library/Backend/S3/Duplicati.snk b/Duplicati/Library/Backend/S3/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.SSHv2 Duplicati Team diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.snk b/Duplicati/Library/Backend/SSHv2/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T net462 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.SharePoint Duplicati Team diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.snk b/Duplicati/Library/Backend/SharePoint/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.Sia Duplicati Team diff --git a/Duplicati/Library/Backend/Sia/Duplicati.snk b/Duplicati/Library/Backend/Sia/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.TahoeLAFS Duplicati Team diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.snk b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Backend.WEBDAV Duplicati Team diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.snk b/Duplicati/Library/Backend/WEBDAV/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Compression Duplicati Team diff --git a/Duplicati/Library/Compression/Duplicati.snk b/Duplicati/Library/Compression/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.DynamicLoader Duplicati Team diff --git a/Duplicati/Library/DynamicLoader/Duplicati.snk b/Duplicati/Library/DynamicLoader/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright � Duplicati Team 2015 Duplicati.Encryption Duplicati Team diff --git a/Duplicati/Library/Encryption/Duplicati.snk b/Duplicati/Library/Encryption/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Interface Duplicati Team diff --git a/Duplicati/Library/Interface/Duplicati.snk b/Duplicati/Library/Interface/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Localization Duplicati Team diff --git a/Duplicati/Library/Localization/Duplicati.snk b/Duplicati/Library/Localization/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.Logging Duplicati Team diff --git a/Duplicati/Library/Logging/Duplicati.snk b/Duplicati/Library/Logging/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.Main Duplicati Team diff --git a/Duplicati/Library/Main/Duplicati.snk b/Duplicati/Library/Main/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.Library.Modules.Builtin Duplicati Team diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.snk b/Duplicati/Library/Modules/Builtin/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.SQLiteHelper Duplicati Team diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.snk b/Duplicati/Library/SQLiteHelper/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!TDuplicati.Library.Snapshots Duplicati.Library.Snapshots 512 - Duplicati.snk + 3.5 @@ -103,7 +103,6 @@ - PreserveNewest diff --git a/Duplicati/Library/Snapshots/Duplicati.snk b/Duplicati/Library/Snapshots/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.UsageReporter Duplicati Team diff --git a/Duplicati/Library/UsageReporter/Duplicati.snk b/Duplicati/Library/UsageReporter/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!TProperties Duplicati.Library.Utility Duplicati.Library.Utility - Duplicati.snk + 3.5 @@ -36,7 +36,6 @@ 4 - true @@ -91,7 +90,6 @@ - diff --git a/Duplicati/Library/Utility/Duplicati.snk b/Duplicati/Library/Utility/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright © Duplicati Team 2015 Duplicati.License Duplicati Team diff --git a/Duplicati/License/Duplicati.snk b/Duplicati/License/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.Server.Serialization Duplicati Team diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.snk b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.Server Duplicati Team diff --git a/Duplicati/Server/Duplicati.snk b/Duplicati/Server/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright ? Duplicati Team 2015 Duplicati.Service Duplicati Team diff --git a/Duplicati/Service/Duplicati.snk b/Duplicati/Service/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T netstandard2.0 2.0.0.7 - true - Duplicati.snk + LGPL, Copyright � Duplicati Team 2015 Duplicati.Tools Duplicati Team diff --git a/Duplicati/Tools/Duplicati.snk b/Duplicati/Tools/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!TZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T4 - Duplicati.snk + @@ -70,9 +70,6 @@ Component - - - {7E119745-1F62-43F0-936C-F312A1912C0B} diff --git a/thirdparty/UnixSupport/Duplicati.snk b/thirdparty/UnixSupport/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!TUnixSupport UnixSupport v4.6.2 - Duplicati.snk + 1.0 false From a22a7a7d240d6812088beb528b1ea3fb91e1279f Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 9 Sep 2018 14:42:40 +0200 Subject: [PATCH 021/253] remove of FasterHashing component --- .../CommandLine/RecoveryTool/Recompress.cs | 3 +- Duplicati/CommandLine/RecoveryTool/Restore.cs | 5 ++- Duplicati/Library/Backend/Backblaze/B2.cs | 3 +- Duplicati/Library/Main/BackendManager.cs | 9 +++-- .../Main/Database/LocalRepairDatabase.cs | 3 +- .../Operation/Backup/StreamBlockSplitter.cs | 5 ++- .../Main/Operation/Common/BackendHandler.cs | 3 +- .../Operation/Common/IndexVolumeCreator.cs | 5 ++- .../Main/Operation/RecreateDatabaseHandler.cs | 3 +- .../Library/Main/Operation/RepairHandler.cs | 5 ++- .../Library/Main/Operation/RestoreHandler.cs | 11 +++--- .../Library/Main/Operation/TestHandler.cs | 3 +- Duplicati/Library/Main/Options.cs | 3 +- Duplicati/Library/Main/Utility.cs | 3 +- .../Utility/Duplicati.Library.Utility.csproj | 5 --- .../Library/Utility/HashAlgorithmHelper.cs | 39 ------------------- .../Library/Utility/HashCalculatingStream.cs | 3 +- Duplicati/Library/Utility/Utility.cs | 5 ++- Duplicati/License/Duplicati.License.csproj | 12 ------ 19 files changed, 44 insertions(+), 84 deletions(-) delete mode 100644 Duplicati/Library/Utility/HashAlgorithmHelper.cs diff --git a/Duplicati/CommandLine/RecoveryTool/Recompress.cs b/Duplicati/CommandLine/RecoveryTool/Recompress.cs index d26c7f085..f12d21bfc 100644 --- a/Duplicati/CommandLine/RecoveryTool/Recompress.cs +++ b/Duplicati/CommandLine/RecoveryTool/Recompress.cs @@ -2,6 +2,7 @@ using System.IO; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using Duplicati.Library.Main; using Duplicati.Library.Main.Volumes; using Duplicati.Library.Utility; @@ -206,7 +207,7 @@ namespace Duplicati.CommandLine.RecoveryTool textJSON = sourceStreamReader.ReadToEnd(); JToken token = JObject.Parse(textJSON); var fileInfoBlocks = new FileInfo(Path.Combine(targetfolder, cmfileNew.Replace("vol/", ""))); - var filehasher = HashAlgorithmHelper.Create(m_Options.FileHashAlgorithm); + var filehasher = HashAlgorithm.Create(m_Options.FileHashAlgorithm); using (var fileStream = fileInfoBlocks.Open(FileMode.Open)) { diff --git a/Duplicati/CommandLine/RecoveryTool/Restore.cs b/Duplicati/CommandLine/RecoveryTool/Restore.cs index c74167200..7ff3e42f8 100644 --- a/Duplicati/CommandLine/RecoveryTool/Restore.cs +++ b/Duplicati/CommandLine/RecoveryTool/Restore.cs @@ -18,6 +18,7 @@ using System; using System.IO; using System.Linq; using System.Collections.Generic; +using System.Security.Cryptography; namespace Duplicati.CommandLine.RecoveryTool { @@ -90,8 +91,8 @@ namespace Duplicati.CommandLine.RecoveryTool return 100; } - var blockhasher = string.IsNullOrWhiteSpace(blockhash_str) ? null : Library.Utility.HashAlgorithmHelper.Create(blockhash_str); - var filehasher = string.IsNullOrWhiteSpace(filehash_str) ? null : Library.Utility.HashAlgorithmHelper.Create(filehash_str); + var blockhasher = string.IsNullOrWhiteSpace(blockhash_str) ? null : HashAlgorithm.Create(blockhash_str); + var filehasher = string.IsNullOrWhiteSpace(filehash_str) ? null : HashAlgorithm.Create(filehash_str); if (blockhasher == null) throw new Duplicati.Library.Interface.UserInformationException(string.Format("Block hash algorithm not valid: {0}", blockhash_str), "BlockHashAlgorithmNotSupported"); diff --git a/Duplicati/Library/Backend/Backblaze/B2.cs b/Duplicati/Library/Backend/Backblaze/B2.cs index d295eeeda..5e543aef8 100644 --- a/Duplicati/Library/Backend/Backblaze/B2.cs +++ b/Duplicati/Library/Backend/Backblaze/B2.cs @@ -21,6 +21,7 @@ using Duplicati.Library.Utility; using Duplicati.Library.Interface; using Newtonsoft.Json; using System.Net; +using System.Security.Cryptography; namespace Duplicati.Library.Backend.Backblaze { @@ -189,7 +190,7 @@ namespace Duplicati.Library.Backend.Backblaze var p = measure.Position; // Compute the hash - using(var hashalg = Duplicati.Library.Utility.HashAlgorithmHelper.Create("sha1")) + using(var hashalg = HashAlgorithm.Create("sha1")) sha1 = Library.Utility.Utility.ByteArrayAsHexString(hashalg.ComputeHash(measure)); // Reset the stream position diff --git a/Duplicati/Library/Main/BackendManager.cs b/Duplicati/Library/Main/BackendManager.cs index 64f302fc4..9d263e899 100644 --- a/Duplicati/Library/Main/BackendManager.cs +++ b/Duplicati/Library/Main/BackendManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using System.Text; using Duplicati.Library.Utility; using Duplicati.Library.Main.Database; @@ -414,14 +415,14 @@ namespace Duplicati.Library.Main public static string CalculateFileHash(string filename) { using (System.IO.FileStream fs = System.IO.File.OpenRead(filename)) - using (var hasher = HashAlgorithmHelper.Create(VOLUME_HASH)) + using (var hasher = HashAlgorithm.Create(VOLUME_HASH)) return Convert.ToBase64String(hasher.ComputeHash(fs)); } /// Calculate file hash directly on stream object (for piping) public static string CalculateFileHash(System.IO.Stream stream) { - using (var hasher = HashAlgorithmHelper.Create(VOLUME_HASH)) + using (var hasher = HashAlgorithm.Create(VOLUME_HASH)) return Convert.ToBase64String(hasher.ComputeHash(stream)); } @@ -432,7 +433,7 @@ namespace Duplicati.Library.Main public static System.Security.Cryptography.CryptoStream GetFileHasherStream (System.IO.Stream stream, System.Security.Cryptography.CryptoStreamMode mode, out Func getHash) { - var hasher = HashAlgorithmHelper.Create(VOLUME_HASH); + var hasher = HashAlgorithm.Create(VOLUME_HASH); System.Security.Cryptography.CryptoStream retHasherStream = new System.Security.Cryptography.CryptoStream(stream, hasher, mode); getHash = () => @@ -659,7 +660,7 @@ namespace Duplicati.Library.Main IndexVolumeWriter wr = null; try { - var hashsize = HashAlgorithmHelper.Create(m_options.BlockHashAlgorithm).HashSize / 8; + var hashsize = HashAlgorithm.Create(m_options.BlockHashAlgorithm).HashSize / 8; wr = new IndexVolumeWriter(m_options); using (var rd = new IndexVolumeReader(p.CompressionModule, item.Indexfile.Item2.LocalFilename, m_options, hashsize)) wr.CopyFrom(rd, x => x == oldname ? newname : x); diff --git a/Duplicati/Library/Main/Database/LocalRepairDatabase.cs b/Duplicati/Library/Main/Database/LocalRepairDatabase.cs index b7fe07dd2..722f433d5 100644 --- a/Duplicati/Library/Main/Database/LocalRepairDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalRepairDatabase.cs @@ -18,6 +18,7 @@ using System; using System.Linq; using System.Collections.Generic; +using System.Security.Cryptography; namespace Duplicati.Library.Main.Database { @@ -339,7 +340,7 @@ namespace Duplicati.Library.Main.Database public void FixMissingBlocklistHashes(string blockhashalgorithm, long blocksize) { - var blockhasher = Library.Utility.HashAlgorithmHelper.Create(blockhashalgorithm); + var blockhasher = HashAlgorithm.Create(blockhashalgorithm); var hashsize = blockhasher.HashSize / 8; var blocklistbuffer = new byte[blocksize]; int blocklistoffset = 0; diff --git a/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs b/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs index 164a044a1..22c89548b 100644 --- a/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs +++ b/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs @@ -23,6 +23,7 @@ using Duplicati.Library.Utility; using System.Linq; using Duplicati.Library.Interface; using System.IO; +using System.Security.Cryptography; namespace Duplicati.Library.Main.Operation.Backup { @@ -47,8 +48,8 @@ namespace Duplicati.Library.Main.Operation.Backup async self => { var blocksize = options.Blocksize; - var filehasher = Duplicati.Library.Utility.HashAlgorithmHelper.Create(options.FileHashAlgorithm); - var blockhasher = Duplicati.Library.Utility.HashAlgorithmHelper.Create(options.BlockHashAlgorithm); + var filehasher = HashAlgorithm.Create(options.FileHashAlgorithm); + var blockhasher = HashAlgorithm.Create(options.BlockHashAlgorithm); var emptymetadata = Utility.WrapMetadata(new Dictionary(), options); var maxmetadatasize = (options.Blocksize / (long)options.BlockhashSize) * options.Blocksize; diff --git a/Duplicati/Library/Main/Operation/Common/BackendHandler.cs b/Duplicati/Library/Main/Operation/Common/BackendHandler.cs index 88dae4cce..b5806e00f 100644 --- a/Duplicati/Library/Main/Operation/Common/BackendHandler.cs +++ b/Duplicati/Library/Main/Operation/Common/BackendHandler.cs @@ -26,6 +26,7 @@ using Newtonsoft.Json; using System.Linq; using System.Text; using System.IO; +using System.Security.Cryptography; namespace Duplicati.Library.Main.Operation.Common { @@ -129,7 +130,7 @@ namespace Duplicati.Library.Main.Operation.Common public static string CalculateFileHash(string filename) { using (System.IO.FileStream fs = System.IO.File.OpenRead(filename)) - using (var hasher = Duplicati.Library.Utility.HashAlgorithmHelper.Create(VOLUME_HASH)) + using (var hasher = HashAlgorithm.Create(VOLUME_HASH)) return Convert.ToBase64String(hasher.ComputeHash(fs)); } diff --git a/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs b/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs index 10492d361..7224ffbaa 100644 --- a/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs +++ b/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs @@ -15,7 +15,8 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; -using System.IO; +using System.IO; +using System.Security.Cryptography; using System.Threading.Tasks; using Duplicati.Library.Main.Volumes; @@ -134,7 +135,7 @@ namespace Duplicati.Library.Main.Operation.Common { public static async Task CreateIndexVolume(string blockname, Options options, Common.DatabaseCommon database) { - using(var h = Duplicati.Library.Utility.HashAlgorithmHelper.Create(options.BlockHashAlgorithm)) + using(var h = HashAlgorithm.Create(options.BlockHashAlgorithm)) { var w = new IndexVolumeWriter(options); w.VolumeID = await database.RegisterRemoteVolumeAsync(w.RemoteFilename, RemoteVolumeType.Index, RemoteVolumeState.Temporary); diff --git a/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs b/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs index dcb0ffe3f..81c068880 100644 --- a/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs +++ b/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using Duplicati.Library.Interface; using Duplicati.Library.Main.Database; using Duplicati.Library.Main.Volumes; @@ -309,7 +310,7 @@ namespace Duplicati.Library.Main.Operation if (!m_options.RepairOnlyPaths) { - var hashalg = Library.Utility.HashAlgorithmHelper.Create(m_options.BlockHashAlgorithm); + var hashalg = HashAlgorithm.Create(m_options.BlockHashAlgorithm); if (hashalg == null) throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); var hashsize = hashalg.HashSize / 8; diff --git a/Duplicati/Library/Main/Operation/RepairHandler.cs b/Duplicati/Library/Main/Operation/RepairHandler.cs index 77759926b..fb65de209 100644 --- a/Duplicati/Library/Main/Operation/RepairHandler.cs +++ b/Duplicati/Library/Main/Operation/RepairHandler.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using System.Text; using Duplicati.Library.Interface; using Duplicati.Library.Main.Database; @@ -117,7 +118,7 @@ namespace Duplicati.Library.Main.Operation var tp = FilelistProcessor.RemoteListAnalysis(backend, m_options, db, m_result.BackendWriter, null); var buffer = new byte[m_options.Blocksize]; - var blockhasher = Library.Utility.HashAlgorithmHelper.Create(m_options.BlockHashAlgorithm); + var blockhasher = HashAlgorithm.Create(m_options.BlockHashAlgorithm); var hashsize = blockhasher.HashSize / 8; if (blockhasher == null) @@ -308,7 +309,7 @@ namespace Duplicati.Library.Main.Operation newEntry = w; w.SetRemoteFilename(n.Name); - var h = Library.Utility.HashAlgorithmHelper.Create(m_options.BlockHashAlgorithm); + var h = HashAlgorithm.Create(m_options.BlockHashAlgorithm); foreach(var blockvolume in db.GetBlockVolumesFromIndexName(n.Name)) { diff --git a/Duplicati/Library/Main/Operation/RestoreHandler.cs b/Duplicati/Library/Main/Operation/RestoreHandler.cs index 073c09c58..81b5abb7b 100644 --- a/Duplicati/Library/Main/Operation/RestoreHandler.cs +++ b/Duplicati/Library/Main/Operation/RestoreHandler.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Cryptography; using System.Text; using Duplicati.Library.Interface; using Duplicati.Library.Main.Database; @@ -129,8 +130,8 @@ namespace Duplicati.Library.Main.Operation //Figure out what files are to be patched, and what blocks are needed PrepareBlockAndFileList(database, m_options, filter, m_result); - blockhasher = Library.Utility.HashAlgorithmHelper.Create(m_options.BlockHashAlgorithm); - filehasher = Library.Utility.HashAlgorithmHelper.Create(m_options.FileHashAlgorithm); + blockhasher = HashAlgorithm.Create(m_options.BlockHashAlgorithm); + filehasher = HashAlgorithm.Create(m_options.FileHashAlgorithm); if (blockhasher == null) throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); if (!blockhasher.CanReuseTransform) @@ -199,7 +200,7 @@ namespace Duplicati.Library.Main.Operation var blocksize = options.Blocksize; var updateCounter = 0L; var fullblockverification = options.FullBlockVerification; - var blockhasher = fullblockverification ? Library.Utility.HashAlgorithmHelper.Create(options.BlockHashAlgorithm) : null; + var blockhasher = fullblockverification ? HashAlgorithm.Create(options.BlockHashAlgorithm) : null; using (var blockmarker = database.CreateBlockMarker()) using(var volumekeeper = database.GetMissingBlockData(blocks, options.Blocksize)) @@ -357,8 +358,8 @@ namespace Duplicati.Library.Main.Operation Utility.VerifyParameters(database, m_options); m_blockbuffer = new byte[m_options.Blocksize]; - var blockhasher = Library.Utility.HashAlgorithmHelper.Create(m_options.BlockHashAlgorithm); - var filehasher = Library.Utility.HashAlgorithmHelper.Create(m_options.FileHashAlgorithm); + var blockhasher = HashAlgorithm.Create(m_options.BlockHashAlgorithm); + var filehasher = HashAlgorithm.Create(m_options.FileHashAlgorithm); if (blockhasher == null) throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); if (!blockhasher.CanReuseTransform) diff --git a/Duplicati/Library/Main/Operation/TestHandler.cs b/Duplicati/Library/Main/Operation/TestHandler.cs index b80a150a2..d0b53e602 100644 --- a/Duplicati/Library/Main/Operation/TestHandler.cs +++ b/Duplicati/Library/Main/Operation/TestHandler.cs @@ -20,6 +20,7 @@ using Duplicati.Library.Main.Database; using System.Linq; using System.Collections.Generic; using Duplicati.Library.Interface; +using System.Security.Cryptography; namespace Duplicati.Library.Main.Operation { @@ -201,7 +202,7 @@ namespace Duplicati.Library.Main.Operation /// A value between 0 and 1 that indicates how many blocks are tested in a dblock file public static KeyValuePair>> TestVolumeInternals(LocalTestDatabase db, IRemoteVolume vol, string tf, Options options, double sample_percent) { - var blockhasher = Library.Utility.HashAlgorithmHelper.Create(options.BlockHashAlgorithm); + var blockhasher = HashAlgorithm.Create(options.BlockHashAlgorithm); if (blockhasher == null) throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(options.BlockHashAlgorithm), "BlockHashAlgorithmInvalid"); diff --git a/Duplicati/Library/Main/Options.cs b/Duplicati/Library/Main/Options.cs index 14d9a0e29..fde9e5e9a 100644 --- a/Duplicati/Library/Main/Options.cs +++ b/Duplicati/Library/Main/Options.cs @@ -20,6 +20,7 @@ using System; using System.Linq; using System.Collections.Generic; +using System.Security.Cryptography; using Duplicati.Library.Interface; using Duplicati.Library.Utility; @@ -1506,7 +1507,7 @@ namespace Duplicati.Library.Main get { if (m_cachedBlockHashSize.Key != BlockHashAlgorithm) - m_cachedBlockHashSize = new KeyValuePair(BlockHashAlgorithm, Duplicati.Library.Utility.HashAlgorithmHelper.Create(BlockHashAlgorithm).HashSize / 8); + m_cachedBlockHashSize = new KeyValuePair(BlockHashAlgorithm, HashAlgorithm.Create(BlockHashAlgorithm).HashSize / 8); return m_cachedBlockHashSize.Value; } diff --git a/Duplicati/Library/Main/Utility.cs b/Duplicati/Library/Main/Utility.cs index a523030b2..02cd1d2f8 100644 --- a/Duplicati/Library/Main/Utility.cs +++ b/Duplicati/Library/Main/Utility.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Security.Cryptography; using Newtonsoft.Json; using System.Text; using Duplicati.Library.Main.Database; @@ -50,7 +51,7 @@ namespace Duplicati.Library.Main using (var ms = new System.IO.MemoryStream()) using (var w = new StreamWriter(ms, Encoding.UTF8)) - using(var filehasher = Library.Utility.HashAlgorithmHelper.Create(options.FileHashAlgorithm)) + using(var filehasher = HashAlgorithm.Create(options.FileHashAlgorithm)) { if (filehasher == null) throw new Duplicati.Library.Interface.UserInformationException(Strings.Common.InvalidHashAlgorithm(options.FileHashAlgorithm), "FileHashAlgorithmNotSupported"); diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 23fa38179..9ee0065dd 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -8,7 +8,6 @@ Properties Duplicati.Library.Utility Duplicati.Library.Utility - 3.5 @@ -42,9 +41,6 @@ - - ..\..\..\packages\FasterHashing.1.3.0\lib\net45\FasterHashing.dll - @@ -80,7 +76,6 @@ - diff --git a/Duplicati/Library/Utility/HashAlgorithmHelper.cs b/Duplicati/Library/Utility/HashAlgorithmHelper.cs deleted file mode 100644 index 62bf0e7c0..000000000 --- a/Duplicati/Library/Utility/HashAlgorithmHelper.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2017, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Security.Cryptography; - -namespace Duplicati.Library.Utility -{ - /// - /// This class helps picking the fastest hash algorithm implementation, - /// which is what should do, but does not. - /// - public static class HashAlgorithmHelper - { - /// - /// Create the hash algorithm with the specified name. - /// - /// The hash algorithm. - /// The name of the algorithm to create. - public static HashAlgorithm Create(string name) - { - return FasterHashing.FasterHash.Create(name); - } - } -} diff --git a/Duplicati/Library/Utility/HashCalculatingStream.cs b/Duplicati/Library/Utility/HashCalculatingStream.cs index 6ff39e23d..5332baa85 100644 --- a/Duplicati/Library/Utility/HashCalculatingStream.cs +++ b/Duplicati/Library/Utility/HashCalculatingStream.cs @@ -19,6 +19,7 @@ #endregion using System; using System.Collections.Generic; +using System.Security.Cryptography; using System.Text; namespace Duplicati.Library.Utility @@ -49,7 +50,7 @@ namespace Duplicati.Library.Utility private int m_hashbufferLength = 0; public HashCalculatingStream(System.IO.Stream basestream, string hashalgorithm) - : this(basestream, HashAlgorithmHelper.Create(hashalgorithm)) + : this(basestream, HashAlgorithm.Create(hashalgorithm)) { } diff --git a/Duplicati/Library/Utility/Utility.cs b/Duplicati/Library/Utility/Utility.cs index 6626ce6a7..1d91974fe 100644 --- a/Duplicati/Library/Utility/Utility.cs +++ b/Duplicati/Library/Utility/Utility.cs @@ -21,6 +21,7 @@ using System.Linq; using System.Threading.Tasks; using System.Text; using System.Text.RegularExpressions; +using System.Security.Cryptography; namespace Duplicati.Library.Utility { @@ -39,7 +40,7 @@ namespace Duplicati.Library.Utility /// /// Gets the hash algorithm used for calculating a hash /// - public static string HashAlgorithm => "SHA256"; + private static string BlockHashAlgorithm => "SHA256"; /// /// The EPOCH offset (unix style) @@ -660,7 +661,7 @@ namespace Duplicati.Library.Utility /// The base64 encoded hash public static string CalculateHash(Stream stream) { - return Convert.ToBase64String(HashAlgorithmHelper.Create(HashAlgorithm).ComputeHash(stream)); + return Convert.ToBase64String(HashAlgorithm.Create(BlockHashAlgorithm).ComputeHash(stream)); } /// diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 9c2e1689c..0a48cfb6a 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -348,18 +348,6 @@ licenses\TlsTest\licensedata.json PreserveNewest - - - licenses\FasterHashing\download.txt - PreserveNewest - - - licenses\FasterHashing\license.txt - PreserveNewest - - - licenses\FasterHashing\licensedata.json - PreserveNewest licenses\SharpCompress\licensedata.json From be503ea028a2f94921c0caa005ba3529ac960c69 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 9 Sep 2018 15:54:14 +0200 Subject: [PATCH 022/253] utility cleanup zipfiledebugger converted --- .../Utility/Duplicati.Library.Utility.csproj | 3 - Duplicati/Library/Utility/packages.config | 4 -- Tools/ZipFileDebugger/Program.cs | 61 ++++++++++--------- .../Properties/AssemblyInfo.cs | 26 -------- Tools/ZipFileDebugger/ZipFileDebugger.csproj | 61 +++++-------------- 5 files changed, 48 insertions(+), 107 deletions(-) delete mode 100644 Duplicati/Library/Utility/packages.config delete mode 100644 Tools/ZipFileDebugger/Properties/AssemblyInfo.cs diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 9ee0065dd..8ed06aab0 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -84,9 +84,6 @@ - - - - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - + \ No newline at end of file diff --git a/Duplicati/Library/Utility/Power/WindowsPowerSupplyState.cs b/Duplicati/Library/Utility/Power/WindowsPowerSupplyState.cs index c1ffa620a..680886c8b 100644 --- a/Duplicati/Library/Utility/Power/WindowsPowerSupplyState.cs +++ b/Duplicati/Library/Utility/Power/WindowsPowerSupplyState.cs @@ -15,25 +15,30 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Windows.Forms; +using System; namespace Duplicati.Library.Utility.Power { public class WindowsPowerSupplyState : IPowerSupplyState { + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] public PowerSupply.Source GetSource() { try { - PowerLineStatus status = System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus; - if (status == PowerLineStatus.Online) - { + var managementScope = new System.Management.ManagementScope(new System.Management.ManagementPath("root\\cimv2")); + var objectQuery = new System.Management.ObjectQuery("SELECT BatteryStatus FROM Win32_Battery"); + var objectSearcher = new System.Management.ManagementObjectSearcher(managementScope, objectQuery); + var objectCollection = objectSearcher.Get(); + + if (objectCollection.Count == 0) return PowerSupply.Source.AC; - } - if (status == PowerLineStatus.Offline) - { - return PowerSupply.Source.Battery; - } + + foreach (System.Management.ManagementObject managementObject in objectCollection) + if (Convert.ToUInt16(managementObject.Properties["BatteryStatus"].Value) == 2) + return PowerSupply.Source.AC; + else + return PowerSupply.Source.Battery; return PowerSupply.Source.Unknown; } diff --git a/Duplicati/Library/Utility/Properties/AssemblyInfo.cs b/Duplicati/Library/Utility/Properties/AssemblyInfo.cs deleted file mode 100644 index 3ba2880fe..000000000 --- a/Duplicati/Library/Utility/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Core")] -[assembly: AssemblyDescription("A collection of utility functions used extensively in Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Core")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("8198402a-9bb8-46b0-9182-a0eed2490496")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] From 513a4c71cf13c8331c4b0913112ea6a4a6c77997 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 9 Sep 2018 21:19:41 +0200 Subject: [PATCH 029/253] Snapshots convert --- .../Duplicati.Library.Snapshots.csproj | 137 ++++-------------- .../Snapshots/Properties/AssemblyInfo.cs | 52 ------- Duplicati/Library/Snapshots/packages.config | 6 - 3 files changed, 29 insertions(+), 166 deletions(-) delete mode 100644 Duplicati/Library/Snapshots/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Snapshots/packages.config diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index c86b4776b..6f8deaade 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -1,107 +1,36 @@ - - + + - Debug - AnyCPU - {D63E53E4-A458-4C2F-914D-92F715F58ACE} - Exe - False - Properties - Duplicati.Library.Snapshots - Duplicati.Library.Snapshots - 512 - - - - 3.5 - - v4.6.2 - - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false + netstandard2.0 + 2.0.0.7 + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Snapshots + Duplicati Team + Duplicati Team + A disk snapshot implementation for Duplicati + Snapshots + + + + + + + + + + + + + + + - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - - - - - - - ..\..\..\packages\AlphaVSS.1.4.0\lib\net45\AlphaVSS.Common.dll - - - ..\..\..\packages\AlphaFS.2.1.3\lib\net45\AlphaFS.dll - - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - + PreserveNewest @@ -112,16 +41,8 @@ PreserveNewest - - - - - + + + \ No newline at end of file diff --git a/Duplicati/Library/Snapshots/Properties/AssemblyInfo.cs b/Duplicati/Library/Snapshots/Properties/AssemblyInfo.cs deleted file mode 100644 index a7dc4c1e9..000000000 --- a/Duplicati/Library/Snapshots/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,52 +0,0 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -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.Library.Snapshots")] -[assembly: AssemblyDescription("A disk snapshot implementation for Duplicati")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("8646AF32-A3E6-43fc-B541-DE6F6430CF46")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/Library/Snapshots/packages.config b/Duplicati/Library/Snapshots/packages.config deleted file mode 100644 index 7f058e904..000000000 --- a/Duplicati/Library/Snapshots/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From ed9af377d20ec5f088279460623a51a116ef7343 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 9 Sep 2018 21:33:32 +0200 Subject: [PATCH 030/253] Utility buildable --- Duplicati/Library/Utility/CallContextSettings.cs | 12 ++++++++++-- .../Library/Utility/Duplicati.Library.Utility.csproj | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Duplicati/Library/Utility/CallContextSettings.cs b/Duplicati/Library/Utility/CallContextSettings.cs index 384458b24..ad3e937bd 100644 --- a/Duplicati/Library/Utility/CallContextSettings.cs +++ b/Duplicati/Library/Utility/CallContextSettings.cs @@ -18,7 +18,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Net.Security; -using System.Runtime.Remoting.Messaging; using System.Security.Cryptography.X509Certificates; using Duplicati.Library.Interface; @@ -316,8 +315,10 @@ namespace Duplicati.Library.Utility /// public ContextGuard() { - + /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md + CallContext.LogicalSetData(contextSettingsType, ID); + */ } /// @@ -339,7 +340,10 @@ namespace Duplicati.Library.Utility _settings.Remove(ID); } + /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md + CallContext.LogicalSetData(contextSettingsType, null); + */ } } @@ -351,7 +355,11 @@ namespace Duplicati.Library.Utility { get { + /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md + return contextSettingsType != null ? CallContext.LogicalGetData(contextSettingsType) as string : null; + */ + return null; } } } diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 3f8bf0458..72615551b 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -13,6 +13,7 @@ + From 2cac7cecd2a45107a35cfbcc6116b1af5c40d2ea Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 10 Sep 2018 13:31:26 +0200 Subject: [PATCH 031/253] AlphaFS, AlphaVSS fully functional --- .../Duplicati.Library.Snapshots.csproj | 3 +- .../Library/Snapshots/SystemIOWindows.cs | 54 ++++++++++++------- .../Library/Snapshots/WinNativeMethods.cs | 4 +- .../Library/Snapshots/WindowsSnapshot.cs | 21 ++++---- 4 files changed, 51 insertions(+), 31 deletions(-) diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 6f8deaade..fa24ccea6 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -15,6 +15,7 @@ + @@ -43,6 +44,6 @@ - + \ No newline at end of file diff --git a/Duplicati/Library/Snapshots/SystemIOWindows.cs b/Duplicati/Library/Snapshots/SystemIOWindows.cs index 6b1f83d95..75cec86b2 100644 --- a/Duplicati/Library/Snapshots/SystemIOWindows.cs +++ b/Duplicati/Library/Snapshots/SystemIOWindows.cs @@ -21,11 +21,11 @@ using System.Collections.Generic; using System.Security.AccessControl; using System.IO; -using AlphaFS = Alphaleonis.Win32.Filesystem; - - namespace Duplicati.Library.Snapshots { + //TODO-DNC - Simplify this class of dependance on AlphaFS, because .NETCORE + //supports long paths and UNC paths + //https://github.com/duplicati/duplicati/pull/3124#issuecomment-419842529 public struct SystemIOWindows : ISystemIO { private const string UNCPREFIX = @"\\?\"; @@ -251,7 +251,7 @@ namespace Duplicati.Library.Snapshots { if (FileExists(symlinkfile) || DirectoryExists(symlinkfile)) throw new System.IO.IOException(string.Format("File already exists: {0}", symlinkfile)); - Alphaleonis.Win32.Filesystem.File.CreateSymbolicLink(PrefixWithUNC(symlinkfile), target, asDir ? Alphaleonis.Win32.Filesystem.SymbolicLinkTarget.Directory : Alphaleonis.Win32.Filesystem.SymbolicLinkTarget.File, AlphaFS.PathFormat.LongFullPath); + Alphaleonis.Win32.Filesystem.File.CreateSymbolicLink(PrefixWithUNC(symlinkfile), target, asDir ? Alphaleonis.Win32.Filesystem.SymbolicLinkTarget.Directory : Alphaleonis.Win32.Filesystem.SymbolicLinkTarget.File, Alphaleonis.Win32.Filesystem.PathFormat.LongFullPath); //Sadly we do not get a notification if the creation fails :( System.IO.FileAttributes attr = 0; @@ -274,14 +274,14 @@ namespace Duplicati.Library.Snapshots { try { - return AlphaFS.File.GetLinkTargetInfo(file).PrintName; + return Alphaleonis.Win32.Filesystem.File.GetLinkTargetInfo(file).PrintName; } catch (PathTooLongException) { } - return AlphaFS.File.GetLinkTargetInfo(SystemIOWindows.PrefixWithUNC(file)).PrintName; + return Alphaleonis.Win32.Filesystem.File.GetLinkTargetInfo(SystemIOWindows.PrefixWithUNC(file)).PrintName; } - catch (AlphaFS.NotAReparsePointException) { } - catch (AlphaFS.UnrecognizedReparsePointException) { } + catch (Alphaleonis.Win32.Filesystem.NotAReparsePointException) { } + catch (Alphaleonis.Win32.Filesystem.UnrecognizedReparsePointException) { } // This path looks like it isn't actually a symlink // (Note that some reparse points aren't actually symlinks - @@ -501,49 +501,67 @@ namespace Duplicati.Library.Snapshots private System.Security.AccessControl.FileSystemSecurity GetAccessControlDir(string path) { if (!IsPathTooLong(path)) - try { return System.IO.Directory.GetAccessControl(path); } + try + { + var di = new DirectoryInfo(path); + return di.GetAccessControl(); + } catch (System.IO.PathTooLongException) { } catch (System.ArgumentException) { } - return Alphaleonis.Win32.Filesystem.Directory.GetAccessControl(PrefixWithUNC(path)); + //TODO-DNC Revert back to proper call when Library will be netstandart ready + return (System.Security.AccessControl.FileSystemSecurity) + typeof(Alphaleonis.Win32.Filesystem.Directory).GetMethod("GetAccessControl", new Type[] { typeof(string) }) + .Invoke(null, new object[] { PrefixWithUNC(path) }); } private System.Security.AccessControl.FileSystemSecurity GetAccessControlFile(string path) { if (!IsPathTooLong(path)) - try { return System.IO.File.GetAccessControl(path); } + try + { + var fi = new FileInfo(path); + return fi.GetAccessControl(); + } catch (System.IO.PathTooLongException) { } catch (System.ArgumentException) { } - return Alphaleonis.Win32.Filesystem.File.GetAccessControl(PrefixWithUNC(path)); + //TODO-DNC Revert back to proper call when Library will be netstandart ready + return (System.Security.AccessControl.FileSystemSecurity) + typeof(Alphaleonis.Win32.Filesystem.File).GetMethod("GetAccessControl", new Type[] { typeof(string) }) + .Invoke(null, new object[] { PrefixWithUNC(path) }); } private void SetAccessControlFile(string path, FileSecurity rules) { if (!IsPathTooLong(path)) try - { - System.IO.File.SetAccessControl(path, rules); + { + new FileInfo(path).SetAccessControl(rules); return; } catch (System.IO.PathTooLongException) { } catch (System.ArgumentException) { } - Alphaleonis.Win32.Filesystem.File.SetAccessControl(PrefixWithUNC(path), rules, AccessControlSections.All); + //TODO-DNC Revert back to proper call when Library will be netstandart ready + typeof(Alphaleonis.Win32.Filesystem.File).GetMethod("SetAccessControl", new Type[] { typeof(string), typeof(System.Security.AccessControl.FileSystemSecurity), typeof(AccessControlSections) }) + .Invoke(null, new object[] { PrefixWithUNC(path), rules, AccessControlSections.All }); } private void SetAccessControlDir(string path, DirectorySecurity rules) { if (!IsPathTooLong(path)) try - { - System.IO.Directory.SetAccessControl(path, rules); + { + new DirectoryInfo(path).SetAccessControl(rules); return; } catch (System.IO.PathTooLongException) { } catch (System.ArgumentException) { } - Alphaleonis.Win32.Filesystem.Directory.SetAccessControl(PrefixWithUNC(path), rules, AccessControlSections.All); + //TODO-DNC Revert back to proper call when Library will be netstandart ready + typeof(Alphaleonis.Win32.Filesystem.Directory).GetMethod("SetAccessControl", new Type[] { typeof(string), typeof(System.Security.AccessControl.FileSystemSecurity), typeof(AccessControlSections) }) + .Invoke(null, new object[] { PrefixWithUNC(path), rules, AccessControlSections.All }); } public Dictionary GetMetadata(string path, bool isSymlink, bool followSymlink) diff --git a/Duplicati/Library/Snapshots/WinNativeMethods.cs b/Duplicati/Library/Snapshots/WinNativeMethods.cs index b7b1ac1c1..90b0c67a1 100644 --- a/Duplicati/Library/Snapshots/WinNativeMethods.cs +++ b/Duplicati/Library/Snapshots/WinNativeMethods.cs @@ -168,7 +168,9 @@ namespace Duplicati.Library.Snapshots throw new Win32Exception(Marshal.GetLastWin32Error()); //TODO: We need to be able to seek to pos 0 - return new Alphaleonis.Win32.Filesystem.BackupFileStream(hFile, FileSystemRights.Read); + //TODO-DNC Revert back to proper call when Library will be netstandart ready + return (Alphaleonis.Win32.Filesystem.BackupFileStream)Activator.CreateInstance + (typeof(Alphaleonis.Win32.Filesystem.BackupFileStream), hFile, FileSystemRights.Read); } /// diff --git a/Duplicati/Library/Snapshots/WindowsSnapshot.cs b/Duplicati/Library/Snapshots/WindowsSnapshot.cs index b9b49746c..956dde5bb 100644 --- a/Duplicati/Library/Snapshots/WindowsSnapshot.cs +++ b/Duplicati/Library/Snapshots/WindowsSnapshot.cs @@ -24,7 +24,6 @@ using System; using System.Collections.Generic; using System.IO; using Alphaleonis.Win32.Vss; -using AlphaFS = Alphaleonis.Win32.Filesystem; namespace Duplicati.Library.Snapshots { @@ -138,7 +137,7 @@ namespace Duplicati.Library.Snapshots m_volumes = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var s in sources) { - var drive = AlphaFS.Path.GetPathRoot(s); + var drive = Alphaleonis.Win32.Filesystem.Path.GetPathRoot(s); if (!m_volumes.ContainsKey(drive)) { //TODO: that seems a bit harsh... we could fall-back to not using VSS for that volume only @@ -209,7 +208,7 @@ namespace Duplicati.Library.Snapshots /// A list of non-shadow paths protected override string[] ListFolders(string localFolderPath) { - var root = Utility.Utility.AppendDirSeparator(AlphaFS.Path.GetPathRoot(localFolderPath)); + var root = Utility.Utility.AppendDirSeparator(Alphaleonis.Win32.Filesystem.Path.GetPathRoot(localFolderPath)); var volumePath = Utility.Utility.AppendDirSeparator(ConvertToSnapshotPath(root)); string[] tmp = null; @@ -217,7 +216,7 @@ namespace Duplicati.Library.Snapshots if (SystemIOWindows.IsPathTooLong(spath)) { - try { tmp = AlphaFS.Directory.GetDirectories(spath); } + try { tmp = Alphaleonis.Win32.Filesystem.Directory.GetDirectories(spath); } catch (PathTooLongException) { } catch (DirectoryNotFoundException) { } } @@ -230,7 +229,7 @@ namespace Duplicati.Library.Snapshots if (tmp == null) { spath = SystemIOWindows.PrefixWithUNC(spath); - tmp = AlphaFS.Directory.GetDirectories(spath); + tmp = Alphaleonis.Win32.Filesystem.Directory.GetDirectories(spath); } volumePath = SystemIOWindows.PrefixWithUNC(volumePath); @@ -252,7 +251,7 @@ namespace Duplicati.Library.Snapshots /// A list of non-shadow paths protected override string[] ListFiles(string localFolderPath) { - var root = Utility.Utility.AppendDirSeparator(AlphaFS.Path.GetPathRoot(localFolderPath)); + var root = Utility.Utility.AppendDirSeparator(Alphaleonis.Win32.Filesystem.Path.GetPathRoot(localFolderPath)); var volumePath = Utility.Utility.AppendDirSeparator(ConvertToSnapshotPath(root)); string[] tmp = null; @@ -260,7 +259,7 @@ namespace Duplicati.Library.Snapshots if (SystemIOWindows.IsPathTooLong(spath)) { - try { tmp = AlphaFS.Directory.GetFiles(spath); } + try { tmp = Alphaleonis.Win32.Filesystem.Directory.GetFiles(spath); } catch (PathTooLongException) { } catch (DirectoryNotFoundException) { } } @@ -273,7 +272,7 @@ namespace Duplicati.Library.Snapshots if (tmp == null) { spath = SystemIOWindows.PrefixWithUNC(spath); - tmp = AlphaFS.Directory.GetFiles(spath); + tmp = Alphaleonis.Win32.Filesystem.Directory.GetFiles(spath); } volumePath = SystemIOWindows.PrefixWithUNC(volumePath); @@ -306,7 +305,7 @@ namespace Duplicati.Library.Snapshots catch (PathTooLongException) { } } - return AlphaFS.File.GetLastWriteTimeUtc(SystemIOWindows.PrefixWithUNC(spath)); + return Alphaleonis.Win32.Filesystem.File.GetLastWriteTimeUtc(SystemIOWindows.PrefixWithUNC(spath)); } /// @@ -326,7 +325,7 @@ namespace Duplicati.Library.Snapshots catch (PathTooLongException) { } } - return AlphaFS.File.GetCreationTimeUtc(SystemIOWindows.PrefixWithUNC(spath)); + return Alphaleonis.Win32.Filesystem.File.GetCreationTimeUtc(SystemIOWindows.PrefixWithUNC(spath)); } /// @@ -415,7 +414,7 @@ namespace Duplicati.Library.Snapshots if (!Path.IsPathRooted(localPath)) throw new InvalidOperationException(); - var root = AlphaFS.Path.GetPathRoot(localPath); + var root = Alphaleonis.Win32.Filesystem.Path.GetPathRoot(localPath); if (!m_volumeMap.TryGetValue(root, out var volumePath)) throw new InvalidOperationException(); From 86d015997b606e886982095b0f0448527f9f4715 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 10 Sep 2018 14:34:20 +0200 Subject: [PATCH 032/253] Dependency info suppress --- .../AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 7b60f8d75..bdd50cdcf 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -11,6 +11,10 @@ An Azure blob storage backend for Duplicati AzureBlob + + + + @@ -18,6 +22,7 @@ + From 881087f968bffc48000d9d42e463deede37657c7 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 10 Sep 2018 14:44:44 +0200 Subject: [PATCH 033/253] allow projects to execute --- .../BackendTester/Duplicati.CommandLine.BackendTester.csproj | 2 +- .../BackendTool/Duplicati.CommandLine.BackendTool.csproj | 2 +- Duplicati/CommandLine/Duplicati.CommandLine.csproj | 2 +- .../RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj | 2 +- .../Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj | 2 +- Duplicati/Server/Duplicati.Server.csproj | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 0f693fd1f..76e9cfdfd 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - + Exe LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine.BackendTester Duplicati Team diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index e1b31eef9..5526f1e24 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - + Exe LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine.BackendTool Duplicati Team diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index 568fe37f9..8f1a1c333 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - + Exe LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine Duplicati Team diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 8e00272b4..0a989aebe 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - + Exe LGPL, Copyright ? Duplicati Team 2015 Duplicati.CommandLine.RecoveryTool Duplicati Team diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 41d235fad..f33c8ea27 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - + Exe LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.AutoUpdater Duplicati Team diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index d26e1a794..f7c2d3d24 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - + Exe LGPL, Copyright ? Duplicati Team 2015 Duplicati.Server Duplicati Team From 1e6ed778f54529de0f86c5e13575890f86bc6e4d Mon Sep 17 00:00:00 2001 From: Max123456 Date: Fri, 11 Jan 2019 22:15:38 +0100 Subject: [PATCH 034/253] fix for unc paths in prefixes --- .../Library/Main/Database/LocalListDatabase.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Duplicati/Library/Main/Database/LocalListDatabase.cs b/Duplicati/Library/Main/Database/LocalListDatabase.cs index 77f7de6ac..45060dfce 100644 --- a/Duplicati/Library/Main/Database/LocalListDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalListDatabase.cs @@ -140,7 +140,7 @@ namespace Duplicati.Library.Main.Database //If we have a prefix rule, apply it if (!string.IsNullOrWhiteSpace(prefixrule)) - cmd.ExecuteNonQuery(string.Format(@"DELETE FROM ""{0}"" WHERE SUBSTR(""Path"", 1, 1) != ?", tmpnames.Tablename), prefixrule); + cmd.ExecuteNonQuery(string.Format(@"DELETE FROM ""{0}"" WHERE SUBSTR(""Path"", 1, {1}) != ?", tmpnames.Tablename, prefixrule.Length), prefixrule); // Then we recursively find the largest prefix cmd.CommandText = string.Format(@"SELECT ""Path"" FROM ""{0}"" ORDER BY LENGTH(""Path"") DESC LIMIT 1", tmpnames.Tablename); @@ -171,17 +171,24 @@ namespace Duplicati.Library.Main.Database { var oldlen = maxpath.Length; var lix = maxpath.LastIndexOf(dirsep, maxpath.Length - 2, StringComparison.Ordinal); + maxpath = maxpath.Substring(0, lix + 1); if (string.IsNullOrWhiteSpace(maxpath) || maxpath.Length == oldlen || maxpath == "\\\\") maxpath = ""; } } - // Special handling for Windows and multi-drive backups as they do not have a single common root + // Special handling for Windows and multi-drive/UNC backups as they do not have a single common root if (string.IsNullOrWhiteSpace(maxpath) && string.IsNullOrWhiteSpace(prefixrule)) { - var roots = cmd.ExecuteReaderEnumerable(string.Format(@"SELECT DISTINCT SUBSTR(""Path"", 1, 1) FROM ""{0}""", tmpnames.Tablename)).Select(x => x.ConvertValueToString(0)).ToArray(); - return roots.Select(x => GetLargestPrefix(filter, x).First()).Distinct().ToArray(); + var paths = cmd.ExecuteReaderEnumerable(string.Format(@"SELECT Path FROM ""{0}""", tmpnames.Tablename)).Select(x => x.ConvertValueToString(0)).ToArray(); + var roots = paths.Select(x => x.Substring(0, 1)).Distinct().Where(x => x != "\\").ToArray(); + + //unc path like \\server.domain\ + var regexUNCPrefix = new System.Text.RegularExpressions.Regex(@"^\\\\.*?\\"); + var rootsUNC = paths.Select(x => regexUNCPrefix.Match(x)).Where(x => x.Success).Select(x => x.Value).Distinct().ToArray(); + + return roots.Concat(rootsUNC).Select(x => GetLargestPrefix(filter, x).First()).Distinct().ToArray(); } return @@ -189,7 +196,6 @@ namespace Duplicati.Library.Main.Database new FileversionFixed { Path = maxpath == "" ? "" : Util.AppendDirSeparator(maxpath, dirsep) } }; } - } private IEnumerable SelectFolderEntries(System.Data.IDbCommand cmd, string prefix, string table) From 633f6e7de25c7e151e30bb517148952f104729aa Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Sun, 28 Apr 2019 13:34:17 +0200 Subject: [PATCH 035/253] cosmetic fix --- .../TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 6a6b84e84..1e20a21be 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -11,7 +11,7 @@ TahoeLAFS backend for Duplicati TahoeLAFS - + From 958f102e9edf5fe231c1079404fbd8739217405d Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Sun, 28 Apr 2019 15:14:39 +0200 Subject: [PATCH 036/253] convert ConfigurationImporter --- ...i.CommandLine.ConfigurationImporter.csproj | 72 ++++--------------- .../Properties/AssemblyInfo.cs | 35 --------- 2 files changed, 15 insertions(+), 92 deletions(-) delete mode 100644 Duplicati/CommandLine/ConfigurationImporter/Properties/AssemblyInfo.cs diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index fac24af54..f755f5560 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -1,62 +1,20 @@ - - - + + - Debug - AnyCPU - {B93E3BF0-DAA7-49B7-B07D-0559C5816735} - Exe - Properties - Duplicati.CommandLine.ConfigurationImporter - Duplicati.CommandLine.ConfigurationImporter - v4.5 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + netstandard2.0 + 2.0.0.7 + + LGPL, Copyright © Duplicati Team 2015 + Duplicati.CommandLine.ConfigurationImporter + Duplicati Team + Duplicati Team + ConfigurationImporter + ConfigurationImporter + - - - - + + - - - - - - - {de3e5d4c-51ab-4e5e-bee8-e636cebfba65} - Duplicati.Library.Utility - - - {19e661d2-c5da-4f35-b3ee-7586e5734b5f} - Duplicati.Server - - - - + \ No newline at end of file diff --git a/Duplicati/CommandLine/ConfigurationImporter/Properties/AssemblyInfo.cs b/Duplicati/CommandLine/ConfigurationImporter/Properties/AssemblyInfo.cs deleted file mode 100644 index 259100343..000000000 --- a/Duplicati/CommandLine/ConfigurationImporter/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -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.ConfigurationImporter")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Duplicati.CommandLine.ConfigurationImporter")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[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("B93E3BF0-DAA7-49B7-B07D-0559C5816735")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] From 843b69136be66ae652c10535662cf6391c4a6582 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Sun, 28 Apr 2019 15:21:43 +0200 Subject: [PATCH 037/253] convert UpdateVersion GnupgSigningTool --- .../GnupgSigningTool/GnupgSigningTool.csproj | 63 +++++-------------- .../UpdateVersion/Properties/AssemblyInfo.cs | 26 -------- .../UpdateVersion/UpdateVersion.csproj | 43 ++++--------- 3 files changed, 29 insertions(+), 103 deletions(-) delete mode 100644 Installer/Windows/UpdateVersion/Properties/AssemblyInfo.cs diff --git a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj index 138186e07..76a20104d 100644 --- a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj +++ b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj @@ -1,50 +1,21 @@ - - + + - Debug - x86 - {72B910F2-8E80-4955-A0D6-ED4C35CEE665} - Exe - GnupgSigningTool - GnupgSigningTool - v4.7 - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - x86 - - - true - bin\Release - prompt - 4 - x86 + netstandard2.0 + 2.0.0.7 + + LGPL, Copyright © Duplicati Team 2015 + GnupgSigningTool + Duplicati Team + Duplicati Team + GnupgSigningTool + GnupgSigningTool + - + + + - - - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87} - Duplicati.Library.Encryption - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - - - - - + + \ No newline at end of file diff --git a/Installer/Windows/UpdateVersion/Properties/AssemblyInfo.cs b/Installer/Windows/UpdateVersion/Properties/AssemblyInfo.cs deleted file mode 100644 index 35a565c7a..000000000 --- a/Installer/Windows/UpdateVersion/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("UpdateVersion")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] diff --git a/Installer/Windows/UpdateVersion/UpdateVersion.csproj b/Installer/Windows/UpdateVersion/UpdateVersion.csproj index fcf56089f..1fd0b2e0e 100644 --- a/Installer/Windows/UpdateVersion/UpdateVersion.csproj +++ b/Installer/Windows/UpdateVersion/UpdateVersion.csproj @@ -1,34 +1,15 @@ - - + + - Debug - AnyCPU - {179ADEC2-1856-47FE-954E-64BCD7213373} - Exe - UpdateVersion - UpdateVersion - v4.7 + netstandard2.0 + 2.0.0.7 + + LGPL, Copyright © Duplicati Team 2015 + UpdateVersion + UpdateVersion + Duplicati Team + UpdateVersion + UpdateVersion - - true - full - false - bin\Debug - DEBUG - 4 - true - - - true - bin\Release - 4 - - - - - - - - - + \ No newline at end of file From cff004df76e156a449c9ca2c1a0ca9efcd1d8e3f Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Sun, 28 Apr 2019 23:32:30 +0200 Subject: [PATCH 038/253] fixes for AlphaFS long path --- .../Common/Duplicati.Library.Common.csproj | 122 ++++-------------- .../Common/Duplicati.Library.IO.projitems | 11 -- Duplicati/Library/Common/Duplicati.snk | Bin 596 -> 0 bytes .../Library/Common/IO/SystemIOWindows.cs | 122 ++++++++++++------ .../Library/Common/Properties/AssemblyInfo.cs | 42 ------ Duplicati/Library/Common/app.config | 4 - Duplicati/Library/Common/packages.config | 6 - .../Duplicati.Library.Snapshots.csproj | 12 +- .../Utility/Duplicati.Library.Utility.csproj | 1 + Duplicati/License/Duplicati.License.csproj | 5 + 10 files changed, 115 insertions(+), 210 deletions(-) delete mode 100644 Duplicati/Library/Common/Duplicati.Library.IO.projitems delete mode 100644 Duplicati/Library/Common/Duplicati.snk delete mode 100644 Duplicati/Library/Common/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Common/app.config delete mode 100644 Duplicati/Library/Common/packages.config diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index be138ff58..4285617b7 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -1,103 +1,35 @@ - - + + - Debug - AnyCPU - {D63E53E4-A458-4C2F-914D-92F715F58ACF} - Library - Properties - Duplicati.Library.IO - Duplicati.Library.IO - 512 - Duplicati.snk - - - 3.5 - - v4.5 - - false - 8.0.30703 - 2.0 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false + netstandard2.0 + 2.0.0.7 + + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.IO + Duplicati Team + Duplicati Team + Library.IO + Library.IO + + + + + + + + + + + + + - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - - - - - - - ..\..\..\packages\AlphaVSS.1.4.0\lib\net45\AlphaVSS.Common.dll - - - ..\..\..\packages\AlphaFS.2.1.3\lib\net45\AlphaFS.dll - - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - - - - - - - - - - - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - - - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - - - + - + + \ No newline at end of file diff --git a/Duplicati/Library/Common/Duplicati.Library.IO.projitems b/Duplicati/Library/Common/Duplicati.Library.IO.projitems deleted file mode 100644 index cc5809a92..000000000 --- a/Duplicati/Library/Common/Duplicati.Library.IO.projitems +++ /dev/null @@ -1,11 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - true - {3A169A2D-EDB4-41FD-87E0-8B942643F674} - - - Duplicati.Library.IO - - \ No newline at end of file diff --git a/Duplicati/Library/Common/Duplicati.snk b/Duplicati/Library/Common/Duplicati.snk deleted file mode 100644 index e0c1e2dd86119728adaeefc5f14f2e597dabceeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZQ)VqjoUVPFUfb~IvOVPIfnU}U&>ZqBFG;TL!xbC@f=sW??FHp%RuD04u?d|@dM zp47GKm!Hl%dFaei`<5*qzAgXqbzUyVi_n}?OMO*3eH|OE?krr| zFEl@9)L*-L?Q8KJPtTajTTV9l{O!|eX~_>-AD#yZ=6m07=(;Lz?67b_fmBH7>6XPy zU(fsaYt6=H^BbXYGcsePe{{ZI&XLwz9=grGu+&OTZN+`>n#aL@H_qHKNL{x|{OX?< z|2?cWgj<|a*&Wn5qtR68+v$gad`lNSIGSM4$`K*nE_8`M(8%hLo?+%X^GU{qHtmys zKah1))%qg*H$8)~{Blp<;-4#gv3~y3w(VO5op^Nq_Qo%mz;QX`zXzj&$<=3DJ8QK~doHe9_tNXtnN&4~oeV$j z^o2{LFP>08&A&p7*^IG!Mnm`8x8Lq$er`8lWi+;b>yXC%XWDAv$p-_y)7-T(lU$#a z#IstS7OnePcICwJ+w3(l+=qQ0gsr@P>rWc{j)4B;9b4MXBe*rpp6LBh{}W&Ed`G$N IQKi@%02MtM!T 260; + return path.StartsWith(UNCPREFIX, StringComparison.Ordinal) || path.StartsWith(UNCPREFIX_SERVER, StringComparison.Ordinal) || path.Length > 260; } public static string PrefixWithUNC(string path) @@ -91,11 +91,11 @@ namespace Duplicati.Library.Common.IO } } - private static Newtonsoft.Json.JsonSerializer _cachedSerializer; - - private Newtonsoft.Json.JsonSerializer Serializer - { - get + private static Newtonsoft.Json.JsonSerializer _cachedSerializer; + + private Newtonsoft.Json.JsonSerializer Serializer + { + get { if (_cachedSerializer != null) { @@ -106,8 +106,8 @@ namespace Duplicati.Library.Common.IO new Newtonsoft.Json.JsonSerializerSettings { Culture = System.Globalization.CultureInfo.InvariantCulture }); return _cachedSerializer; - } - } + } + } private string SerializeObject(T o) { @@ -129,28 +129,68 @@ namespace Duplicati.Library.Common.IO private System.Security.AccessControl.FileSystemSecurity GetAccessControlDir(string path) { - return PathTooLongFuncWrapper(System.IO.Directory.GetAccessControl, - Alphaleonis.Win32.Filesystem.Directory.GetAccessControl, path, true); + if (!IsPathTooLong(path)) + try + { + var di = new DirectoryInfo(path); + return di.GetAccessControl(); + } + catch (System.IO.PathTooLongException) { } + catch (System.ArgumentException) { } + + //TODO-DNC Revert back to proper call when Library will be netstandard ready + return (System.Security.AccessControl.FileSystemSecurity) + typeof(Alphaleonis.Win32.Filesystem.Directory).GetMethod("GetAccessControl", new Type[] { typeof(string) }) + .Invoke(null, new object[] { PrefixWithUNC(path) }); } private System.Security.AccessControl.FileSystemSecurity GetAccessControlFile(string path) { - return PathTooLongFuncWrapper(System.IO.File.GetAccessControl, - Alphaleonis.Win32.Filesystem.File.GetAccessControl, path, true); + if (!IsPathTooLong(path)) + try + { + var fi = new FileInfo(path); + return fi.GetAccessControl(); + } + catch (System.IO.PathTooLongException) { } + catch (System.ArgumentException) { } + + //TODO-DNC Revert back to proper call when Library will be netstandard ready + return (System.Security.AccessControl.FileSystemSecurity) + typeof(Alphaleonis.Win32.Filesystem.File).GetMethod("GetAccessControl", new Type[] { typeof(string) }) + .Invoke(null, new object[] { PrefixWithUNC(path) }); } private void SetAccessControlFile(string path, FileSecurity rules) { - PathTooLongActionWrapper(p => System.IO.File.SetAccessControl(p, rules), - p => Alphaleonis.Win32.Filesystem.File.SetAccessControl(p, rules, AccessControlSections.All), - path, true); + if (!IsPathTooLong(path)) + try + { + new FileInfo(path).SetAccessControl(rules); + return; + } + catch (System.IO.PathTooLongException) { } + catch (System.ArgumentException) { } + + //TODO-DNC Revert back to proper call when Library will be netstandard ready + typeof(Alphaleonis.Win32.Filesystem.File).GetMethod("SetAccessControl", new Type[] { typeof(string), typeof(System.Security.AccessControl.FileSystemSecurity), typeof(AccessControlSections) }) + .Invoke(null, new object[] { PrefixWithUNC(path), rules, AccessControlSections.All }); } private void SetAccessControlDir(string path, DirectorySecurity rules) { - PathTooLongActionWrapper(p => System.IO.Directory.SetAccessControl(p, rules), - p => Alphaleonis.Win32.Filesystem.Directory.SetAccessControl(p, rules, AccessControlSections.All), - path, true); + if (!IsPathTooLong(path)) + try + { + new DirectoryInfo(path).SetAccessControl(rules); + return; + } + catch (System.IO.PathTooLongException) { } + catch (System.ArgumentException) { } + + //TODO-DNC Revert back to proper call when Library will be netstandard ready + typeof(Alphaleonis.Win32.Filesystem.Directory).GetMethod("SetAccessControl", new Type[] { typeof(string), typeof(System.Security.AccessControl.FileSystemSecurity), typeof(AccessControlSections) }) + .Invoke(null, new object[] { PrefixWithUNC(path), rules, AccessControlSections.All }); } private static void PathTooLongVoidFuncWrapper(Func nativeIOFunc, @@ -379,13 +419,13 @@ namespace Duplicati.Library.Common.IO p => Alphaleonis.Win32.Filesystem.Directory.Delete(p, recursive), path, true); } - - public string GetPathRoot(string path) + + public string GetPathRoot(string path) { - return PathTooLongFuncWrapper(Path.GetPathRoot, AlphaFS.Path.GetPathRoot, path, false); + return PathTooLongFuncWrapper(Path.GetPathRoot, AlphaFS.Path.GetPathRoot, path, false); } - public string[] GetDirectories(string path) + public string[] GetDirectories(string path) { return PathTooLongFuncWrapper(Directory.GetDirectories, AlphaFS.Directory.GetDirectories, path, false); } @@ -408,25 +448,25 @@ namespace Duplicati.Library.Common.IO public DateTime GetLastWriteTimeUtc(string path) { return PathTooLongFuncWrapper(Directory.GetLastWriteTimeUtc, AlphaFS.File.GetLastWriteTimeUtc, path, false); - } - - public IEnumerable EnumerateDirectories(string path) - { + } + + public IEnumerable EnumerateDirectories(string path) + { return PathTooLongFuncWrapper(Directory.EnumerateDirectories, AlphaFS.Directory.EnumerateDirectories, path, false); - } - - public void FileCopy(string source, string target, bool overwrite) - { + } + + public void FileCopy(string source, string target, bool overwrite) + { // We do not check if path is too long on target. If so, then we catch an exception. - PathTooLongActionWrapper(p => File.Copy(p, target, overwrite), p => AlphaFS.File.Copy(p, target, overwrite), source, false); - } - - public string PathGetFullPath(string path) - { + PathTooLongActionWrapper(p => File.Copy(p, target, overwrite), p => AlphaFS.File.Copy(p, target, overwrite), source, false); + } + + public string PathGetFullPath(string path) + { return PathTooLongFuncWrapper(System.IO.Path.GetFullPath, AlphaFS.Path.GetFullPath, path, false); - } - - public IFileEntry DirectoryEntry(string path) + } + + public IFileEntry DirectoryEntry(string path) { IFileEntry DirectoryEntryNative(string p) { var dInfo = new DirectoryInfo(p); @@ -446,9 +486,9 @@ namespace Duplicati.Library.Common.IO } return PathTooLongFuncWrapper(DirectoryEntryNative, DirectoryEntryAlphaFS, path, false); - } - - public IFileEntry FileEntry(string path) + } + + public IFileEntry FileEntry(string path) { IFileEntry FileEntryNative(string p) { diff --git a/Duplicati/Library/Common/Properties/AssemblyInfo.cs b/Duplicati/Library/Common/Properties/AssemblyInfo.cs deleted file mode 100644 index 4e6119be6..000000000 --- a/Duplicati/Library/Common/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2018, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Reflection; -using System.Runtime.CompilerServices; - -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. - -[assembly: AssemblyTitle("Duplicati.Library.IO")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2018")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. - -[assembly: AssemblyVersion("2.0.0.7")] - -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. - -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] diff --git a/Duplicati/Library/Common/app.config b/Duplicati/Library/Common/app.config deleted file mode 100644 index 469464a22..000000000 --- a/Duplicati/Library/Common/app.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Duplicati/Library/Common/packages.config b/Duplicati/Library/Common/packages.config deleted file mode 100644 index f58651f3a..000000000 --- a/Duplicati/Library/Common/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index fa24ccea6..c0fd75f41 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -13,12 +13,10 @@ - - - + @@ -26,12 +24,6 @@ - - - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - - - PreserveNewest @@ -44,6 +36,4 @@ - - \ No newline at end of file diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 72615551b..2535bc527 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -18,6 +18,7 @@ + diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 0a48cfb6a..754ef9f1a 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -358,5 +358,10 @@ + + + + + \ No newline at end of file From aed2f4d5c8974bbdc83b55ea7d6b8364f57a758a Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Mon, 29 Apr 2019 00:57:02 +0200 Subject: [PATCH 039/253] Fixes related to DNC libraries interfaces --- .../CommandLine/Duplicati.CommandLine.csproj | 1 + .../CommandLine/RecoveryTool/Recompress.cs | 3 +- .../Backend/AzureBlob/AzureBlobWrapper.cs | 19 +- .../Library/Backend/OneDrive/OneDrive.cs | 673 ------------------ Duplicati/Library/Backend/S3/S3IAM.cs | 6 +- Duplicati/Library/Backend/S3/S3Wrapper.cs | 2 +- .../Library/Main/Operation/RestoreHandler.cs | 1 + .../Duplicati.Library.Snapshots.csproj | 6 + 8 files changed, 24 insertions(+), 687 deletions(-) delete mode 100644 Duplicati/Library/Backend/OneDrive/OneDrive.cs diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index 8f1a1c333..095cd2540 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -19,6 +19,7 @@ + diff --git a/Duplicati/CommandLine/RecoveryTool/Recompress.cs b/Duplicati/CommandLine/RecoveryTool/Recompress.cs index 62c22d287..c3b25a056 100644 --- a/Duplicati/CommandLine/RecoveryTool/Recompress.cs +++ b/Duplicati/CommandLine/RecoveryTool/Recompress.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading; +using System.Security.Cryptography; namespace Duplicati.CommandLine.RecoveryTool { @@ -207,7 +208,7 @@ namespace Duplicati.CommandLine.RecoveryTool textJSON = sourceStreamReader.ReadToEnd(); JToken token = JObject.Parse(textJSON); var fileInfoBlocks = new FileInfo(Path.Combine(targetfolder, cmfileNew.Replace("vol/", ""))); - var filehasher = HashAlgorithmHelper.Create(m_Options.FileHashAlgorithm); + var filehasher = HashAlgorithm.Create(m_Options.FileHashAlgorithm); using (var fileStream = fileInfoBlocks.Open(FileMode.Open)) { diff --git a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs index 5a84044e5..36087cea8 100644 --- a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs +++ b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs @@ -64,14 +64,15 @@ namespace Duplicati.Library.Backend.AzureBlob public AzureBlobWrapper(string accountName, string accessKey, string containerName) { - OperationContext.GlobalSendingRequest += (sender, args) => - { - args.Request.UserAgent = string.Format( - "APN/1.0 Duplicati/{0} AzureBlob/2.0 {1}", - System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, - Microsoft.WindowsAzure.Storage.Shared.Protocol.Constants.HeaderConstants.UserAgent - ); - }; + //TODO-DNC Missing UserAgent property in DNC + //OperationContext.GlobalSendingRequest += (sender, args) => + //{ + // args.Request.UserAgent = string.Format( + // "APN/1.0 Duplicati/{0} AzureBlob/2.0 {1}", + // System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, + // Microsoft.WindowsAzure.Storage.Shared.Protocol.Constants.HeaderConstants.UserAgent + // ); + //}; var connectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", accountName, accessKey); @@ -108,7 +109,7 @@ namespace Duplicati.Library.Backend.AzureBlob public virtual async Task AddFileStream(string keyName, Stream source, CancellationToken cancelToken) { - await _container.GetBlockBlobReference(keyName).UploadFromStreamAsync(source, cancelToken); + await _container.GetBlockBlobReference(keyName).UploadFromStreamAsync(source, source.Length, default, default, new OperationContext(), cancelToken); } public void DeleteObject(string keyName) diff --git a/Duplicati/Library/Backend/OneDrive/OneDrive.cs b/Duplicati/Library/Backend/OneDrive/OneDrive.cs deleted file mode 100644 index a355db687..000000000 --- a/Duplicati/Library/Backend/OneDrive/OneDrive.cs +++ /dev/null @@ -1,673 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using System.Net; -using Duplicati.Library.Interface; -using Duplicati.Library.Common.IO; - -namespace Duplicati.Library.Backend -{ - public class OneDrive : IBackend, IStreamingBackend, IQuotaEnabledBackend, IRenameEnabledBackend - { - private static readonly string LOGTAG = Logging.Log.LogTagFromType(); - - private const string SERVICES_AGREEMENT = "https://www.microsoft.com/en-us/servicesagreement"; - private const string PRIVACY_STATEMENT = "https://privacy.microsoft.com/en-us/privacystatement"; - - private const string AUTHID_OPTION = "authid"; - - private const string WLID_SERVER = "https://apis.live.net/v5.0"; - private const string ROOT_FOLDER_ID = "me/skydrive"; - private const string FOLDER_TEMPLATE = "{0}/files"; - private const string ONEDRIVE_SERVICE_URL = "https://api.onedrive.com/v1.0"; - - private const int FILE_LIST_PAGE_SIZE = 100; - - private const long BITS_FILE_SIZE_LIMIT = 1024 * 1024 * 15; - private const long BITS_CHUNK_SIZE = 1024 * 1024 * 10; - - private static readonly string USER_AGENT = string.Format("Duplicati v{0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); - - private readonly string m_rootfolder; - private readonly string m_prefix; - private string m_userid; - private WLID_FolderItem m_folderid; - - private readonly OAuthHelper m_oauth; - - private readonly Dictionary m_fileidCache = new Dictionary(StringComparer.OrdinalIgnoreCase); - - private readonly byte[] m_copybuffer = new byte[Duplicati.Library.Utility.Utility.DEFAULT_BUFFER_SIZE]; - - public OneDrive() { } - - public OneDrive(string url, Dictionary options) - { - var uri = new Utility.Uri(url); - - m_rootfolder = uri.Host; - m_prefix = Util.AppendDirSeparator("/" + uri.Path, "/"); - - string authid = null; - if (options.ContainsKey(AUTHID_OPTION)) - authid = options[AUTHID_OPTION]; - - m_oauth = new OAuthHelper(authid, this.ProtocolKey); - } - - private class WLID_DataItem - { - public WLID_FolderItem[] data { get; set; } - } - - private class WLID_FolderItem - { - public string id { get; set; } - public string name { get; set; } - public string description { get; set; } - public string parent_id { get; set; } - public string upload_location { get; set; } - public string type { get; set; } - [Newtonsoft.Json.JsonProperty(NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public DateTime? created_time { get; set; } - [Newtonsoft.Json.JsonProperty(NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public DateTime? updated_time { get; set; } - [Newtonsoft.Json.JsonProperty(NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] - public long? size { get; set; } - } - - private class WLID_CreateFolderData - { - public string name; - public string description; - } - - private class WLID_UserInfo - { - public string id { get; set; } - public string first_name { get; set; } - public string last_name { get; set; } - public string name { get; set; } - public string gender { get; set; } - public string locale { get; set; } - } - - private class WLID_QuotaInfo - { - [Newtonsoft.Json.JsonProperty("quota")] - public long? Quota { get; set; } - [Newtonsoft.Json.JsonProperty("available")] - public long? Available { get; set; } - } - - private WLID_FolderItem FindFolder(string folder, string parentfolder = null) - { - if (string.IsNullOrWhiteSpace(parentfolder)) - parentfolder = ROOT_FOLDER_ID; - - var url = string.Format("{0}/{1}?access_token={2}", WLID_SERVER, string.Format(FOLDER_TEMPLATE, parentfolder), Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - var res = m_oauth.GetJSONData(url, x => x.UserAgent = USER_AGENT); - - if (res == null || res.data == null) - return null; - - foreach(var r in res.data) - if (string.Equals(r.name, folder, StringComparison.OrdinalIgnoreCase)) - return r; - - return null; - } - - private WLID_FolderItem FindFolders(bool autocreate) - { - var folders = (m_rootfolder + '/' + m_prefix).Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - if (folders.Length == 0) - { - var url = string.Format("{0}/{1}?access_token={2}", WLID_SERVER, ROOT_FOLDER_ID, Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - return m_oauth.GetJSONData(url, x => x.UserAgent = USER_AGENT); - } - - WLID_FolderItem cur = null; - foreach (var f in folders) - { - var n = FindFolder(f, cur == null ? null : cur.id); - if (n == null) - { - if (autocreate) - { - var url = string.Format("{0}/{1}?access_token={2}", WLID_SERVER, cur == null ? ROOT_FOLDER_ID : cur.id, Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - var req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - req.Method = "POST"; - - var areq = new Utility.AsyncHttpRequest(req); - - using (var ms = new System.IO.MemoryStream()) - using (var sw = new System.IO.StreamWriter(ms)) - { - new Newtonsoft.Json.JsonSerializer().Serialize(sw, new WLID_CreateFolderData() { - name = f, - description = Strings.OneDrive.AutoCreatedFolderLabel - }); - - sw.Flush(); - ms.Position = 0; - - req.ContentLength = ms.Length; - req.ContentType = "application/json"; - - using (var reqs = areq.GetRequestStream()) - Utility.Utility.CopyStream(ms, reqs, true, m_copybuffer); - } - - using (var resp = (HttpWebResponse)areq.GetResponse()) - using (var rs = areq.GetResponseStream()) - using (var tr = new System.IO.StreamReader(rs)) - using (var jr = new Newtonsoft.Json.JsonTextReader(tr)) - { - if ((int)resp.StatusCode < 200 || (int)resp.StatusCode > 299) - throw new ProtocolViolationException(Strings.OneDrive.UnexpectedError(resp.StatusCode, resp.StatusDescription)); - cur = new Newtonsoft.Json.JsonSerializer().Deserialize(jr); - } - } - else - throw new FolderMissingException(Strings.OneDrive.MissingFolderError(f)); - } - else - cur = n; - } - - return cur; - } - - private string FolderID - { - get - { - if (m_folderid == null) - m_folderid = FindFolders(false); - - return m_folderid.id; - } - } - - private string GetFileID(string name, bool throwIfMissing = true) - { - string id; - m_fileidCache.TryGetValue(name, out id); - if (string.IsNullOrWhiteSpace(id)) - { - // Refresh the list of files, just in case - foreach (IFileEntry file in List()) { /* We just need to iterate the whole list */ } - m_fileidCache.TryGetValue(name, out id); - - if (string.IsNullOrWhiteSpace(id) && throwIfMissing) - throw new FileMissingException(Strings.OneDrive.FileNotFoundError(name)); - } - - return id; - } - - private WLID_QuotaInfo GetQuotaInfo() - { - var url = string.Format("{0}/me/skydrive/quota?access_token={1}", WLID_SERVER, Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - return m_oauth.GetJSONData(url, x => x.UserAgent = USER_AGENT); - } - - #region IBackend Members - - public void Test() - { - this.TestList(); - } - - public void CreateFolder() - { - FindFolders(true); - } - - public string DisplayName - { - get { return Strings.OneDrive.DisplayName; } - } - - public string ProtocolKey - { - get { return "onedrive"; } - } - - public IEnumerable List() - { - int offset = 0; - int count = FILE_LIST_PAGE_SIZE; - int numFiles = 0; - int filesOk = 0; - int filesRepeated = 0; - int iteration = 0; - - var files = new List(); - - m_fileidCache.Clear(); - - do - { - - while (count == FILE_LIST_PAGE_SIZE) - { - var url = string.Format("{0}/{1}?access_token={2}&limit={3}&offset={4}", WLID_SERVER, string.Format(FOLDER_TEMPLATE, FolderID), Library.Utility.Uri.UrlEncode(m_oauth.AccessToken), FILE_LIST_PAGE_SIZE, offset); - var res = m_oauth.GetJSONData(url); - - if (res != null && res.data != null) - { - count = res.data.Length; - - // log - Library.Logging.Log.WriteProfilingMessage(LOGTAG, "OneDriveListStats", "Iteration: {0:D} Offset: {1:D} Count: {2:D} TotalOK: {3:D} TotalRep: {4:D} TotalFiles: {5:D}", iteration, offset, count, filesOk, filesRepeated, numFiles); - - foreach (var r in res.data) - { - - if (m_fileidCache.ContainsKey(r.name)) - { - filesRepeated++; - } - else - { - m_fileidCache.Add(r.name, r.id); - - var fe = new FileEntry(r.name, r.size.Value, r.updated_time.Value, r.updated_time.Value); - fe.IsFolder = string.Equals(r.type, "folder", StringComparison.OrdinalIgnoreCase); - files.Add(fe); - - filesOk++; - } - } - } - else - { - count = 0; - } - - if (iteration != 0 && filesOk == numFiles) return files; - - offset += count; - - } - - // Save total number of files in the first iteration - if (iteration == 0) - { - numFiles = offset; - } - - filesRepeated = 0; - iteration++; - - offset = 0; - count = FILE_LIST_PAGE_SIZE; - } - while (filesOk != numFiles); - - return files; - } - - public void Put(string remotename, string filename) - { - using (System.IO.FileStream fs = System.IO.File.OpenRead(filename)) - Put(remotename, fs); - } - - public void Get(string remotename, string filename) - { - using (System.IO.FileStream fs = System.IO.File.Create(filename)) - Get(remotename, fs); - } - - public void Delete(string remotename) - { - try - { - var id = GetFileID(remotename); - var url = string.Format("{0}/{1}?access_token={2}", WLID_SERVER, id, Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - var req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - req.Method = "DELETE"; - - var areq = new Utility.AsyncHttpRequest(req); - using (var resp = (HttpWebResponse)areq.GetResponse()) - { - if (resp.StatusCode == System.Net.HttpStatusCode.NotFound) - throw new FileMissingException(); - - if ((int)resp.StatusCode < 200 || (int)resp.StatusCode > 299) - throw new ProtocolViolationException(Strings.OneDrive.UnexpectedError(resp.StatusCode, resp.StatusDescription)); - m_fileidCache.Remove(remotename); - } - } - catch (System.Net.WebException wex) - { - if (wex.Response is System.Net.HttpWebResponse && ((System.Net.HttpWebResponse)wex.Response).StatusCode == System.Net.HttpStatusCode.NotFound) - throw new FileMissingException(wex); - else - throw; - } - } - - - public IList SupportedCommands - { - get { - return new List(new ICommandLineArgument[] { - new CommandLineArgument(AUTHID_OPTION, CommandLineArgument.ArgumentType.Password, Strings.OneDrive.AuthidShort, Strings.OneDrive.AuthidLong(OAuthHelper.OAUTH_LOGIN_URL("onedrive"))), - }); - } - } - - public string Description - { - get { return Strings.OneDrive.Description( - "Microsoft Service Agreement", - SERVICES_AGREEMENT, - "Microsoft Online Privacy Statement", - PRIVACY_STATEMENT - ); - } - } - - #endregion - - #region IDisposable Members - - public void Dispose() - { - } - - #endregion - - private string UserID - { - get - { - if (string.IsNullOrEmpty(m_userid)) - { - var url = string.Format("{0}/me?access_token={1}", WLID_SERVER, Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - var req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - var areq = new Utility.AsyncHttpRequest(req); - - using(var resp = (HttpWebResponse)areq.GetResponse()) - using(var rs = areq.GetResponseStream()) - using(var tr = new System.IO.StreamReader(rs)) - using(var jr = new Newtonsoft.Json.JsonTextReader(tr)) - m_userid = new Newtonsoft.Json.JsonSerializer().Deserialize(jr).id; - } - - return m_userid; - } - } - - #region IRenameEnabledBackend - - public void Rename(string oldname, string newname) - { - try - { - try - { - var id = GetFileID(oldname); - var url = string.Format("{0}/{1}?access_token={2}", WLID_SERVER, id, Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - var req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - req.Method = "PUT"; - - var updateData = new WLID_FolderItem() { name = newname }; - var data = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(updateData)); - req.ContentLength = data.Length; - req.ContentType = "application/json; charset=UTF-8"; - using (var requestStream = req.GetRequestStream()) - requestStream.Write(data, 0, data.Length); - - var areq = new Utility.AsyncHttpRequest(req); - using (var resp = (HttpWebResponse)areq.GetResponse()) - { - if (resp.StatusCode == System.Net.HttpStatusCode.NotFound) - throw new FileMissingException(); - - if ((int)resp.StatusCode < 200 || (int)resp.StatusCode > 299) - throw new ProtocolViolationException(Strings.OneDrive.UnexpectedError(resp.StatusCode, resp.StatusDescription)); - - m_fileidCache[newname] = id; - m_fileidCache.Remove(oldname); - } - } - catch - { - // Since we don't know the state of file IDs, clear the cache - m_fileidCache.Clear(); - - throw; - } - } - catch (System.Net.WebException wex) - { - if (wex.Response is System.Net.HttpWebResponse && ((System.Net.HttpWebResponse)wex.Response).StatusCode == System.Net.HttpStatusCode.NotFound) - throw new FileMissingException(wex); - else - throw; - } - } - - #endregion - - #region IQuotaEnabledBackend Members - - public IQuotaInfo Quota - { - get - { - WLID_QuotaInfo quota = this.GetQuotaInfo(); - return new QuotaInfo(quota.Quota ?? -1, quota.Available ?? -1); - } - } - - public long TotalQuotaSpace - { - get - { - return this.GetQuotaInfo().Quota ?? -1; - } - } - - public long FreeQuotaSpace - { - get - { - return this.GetQuotaInfo().Available ?? -1; - } - } - - public string[] DNSName - { - get { return new string[] { new Uri(WLID_SERVER).Host, new Uri(ONEDRIVE_SERVICE_URL).Host, string.IsNullOrWhiteSpace(m_userid) ? null : string.Format("cid-{0}.users.storage.live.com", m_userid) }; } - } - - #endregion - - #region IStreamingBackend Members - - public void Put(string remotename, System.IO.Stream stream) - { - if (stream.Length > BITS_FILE_SIZE_LIMIT) - { - // Get extra info for BITS - var uid = UserID; - var fid = FolderID.Split('.')[2]; - - // Create a session - var url = string.Format("https://cid-{0}.users.storage.live.com/items/{1}/{2}?access_token={3}", uid, fid, Utility.Uri.UrlPathEncode(remotename), Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - - var req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - req.Method = "POST"; - req.ContentType = "application/json"; - - req.Headers.Add("X-Http-Method-Override", "BITS_POST"); - req.Headers.Add("BITS-Packet-Type", "Create-Session"); - req.Headers.Add("BITS-Supported-Protocols", "{7df0354d-249b-430f-820d-3d2a9bef4931}"); - req.ContentLength = 0; - - var areq = new Utility.AsyncHttpRequest(req); - - string sessionid; - - using(var resp = (HttpWebResponse)areq.GetResponse()) - { - var packtype = resp.Headers["BITS-Packet-Type"]; - if (!packtype.Equals("Ack", StringComparison.OrdinalIgnoreCase)) - throw new Exception(string.Format("Unable to create BITS transfer, got status: {0}", packtype)); - - sessionid = resp.Headers["BITS-Session-Id"]; - } - - if (string.IsNullOrEmpty(sessionid)) - throw new Exception("BITS session-id was missing"); - - // Session is now created, start uploading chunks - - var offset = 0L; - var retries = 0; - - while (offset < stream.Length) - { - try - { - var bytesInChunk = Math.Min(BITS_CHUNK_SIZE, stream.Length - offset); - - req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - req.Method = "POST"; - req.Headers.Add("X-Http-Method-Override", "BITS_POST"); - req.Headers.Add("BITS-Packet-Type", "Fragment"); - req.Headers.Add("BITS-Session-Id", sessionid); - req.Headers.Add("Content-Range", string.Format("bytes {0}-{1}/{2}", offset, offset + bytesInChunk - 1, stream.Length)); - - req.ContentLength = bytesInChunk; - - if (stream.Position != offset) - stream.Position = offset; - - areq = new Utility.AsyncHttpRequest(req); - var remaining = (int)bytesInChunk; - using(var reqs = areq.GetRequestStream()) - { - int read; - while ((read = stream.Read(m_copybuffer, 0, Math.Min(m_copybuffer.Length, remaining))) != 0) - { - reqs.Write(m_copybuffer, 0, read); - remaining -= read; - } - } - - using(var resp = (HttpWebResponse)areq.GetResponse()) - { - if (resp.StatusCode != HttpStatusCode.OK) - throw new WebException("Invalid partial upload response", null, WebExceptionStatus.UnknownError, resp); - } - - offset += bytesInChunk; - retries = 0; - } - catch (Exception ex) - { - var retry = false; - - // If we get a 5xx error, or some network issue, we retry - if (ex is WebException && ((WebException)ex).Response is HttpWebResponse) - { - var code = (int)((HttpWebResponse)((WebException)ex).Response).StatusCode; - retry = code >= 500 && code <= 599; - } - else if (ex is System.Net.Sockets.SocketException || ex is System.IO.IOException || ex.InnerException is System.Net.Sockets.SocketException || ex.InnerException is System.IO.IOException) - { - retry = true; - } - - - // Retry with exponential backoff - if (retry && retries < 5) - { - System.Threading.Thread.Sleep(TimeSpan.FromSeconds(Math.Pow(2, retries))); - retries++; - } - else - throw; - } - } - - // Transfer completed, now commit the upload and close the session - - req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - req.Method = "POST"; - req.Headers.Add("X-Http-Method-Override", "BITS_POST"); - req.Headers.Add("BITS-Packet-Type", "Close-Session"); - req.Headers.Add("BITS-Session-Id", sessionid); - req.ContentLength = 0; - - areq = new Utility.AsyncHttpRequest(req); - using(var resp = (HttpWebResponse)areq.GetResponse()) - { - if (resp.StatusCode != HttpStatusCode.OK) - throw new Exception("Invalid partial upload commit response"); - } - } - else - { - var url = string.Format("{0}/{1}/files/{2}?access_token={3}", WLID_SERVER, FolderID, Utility.Uri.UrlPathEncode(remotename), Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - var req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - req.Method = "PUT"; - - try - { - req.ContentLength = stream.Length; - } - catch - { - } - - // Docs says not to set this ? - //req.ContentType = "application/octet-stream"; - - var areq = new Utility.AsyncHttpRequest(req); - using(var reqs = areq.GetRequestStream()) - Utility.Utility.CopyStream(stream, reqs, true, m_copybuffer); - - using(var resp = (HttpWebResponse)areq.GetResponse()) - using(var rs = areq.GetResponseStream()) - using(var tr = new System.IO.StreamReader(rs)) - using(var jr = new Newtonsoft.Json.JsonTextReader(tr)) - { - var nf = new Newtonsoft.Json.JsonSerializer().Deserialize(jr); - m_fileidCache[remotename] = nf.id; - } - } - } - - public void Get(string remotename, System.IO.Stream stream) - { - var id = GetFileID(remotename); - var url = string.Format("{0}/{1}/content?access_token={2}", WLID_SERVER, id, Library.Utility.Uri.UrlEncode(m_oauth.AccessToken)); - var req = (HttpWebRequest)WebRequest.Create(url); - req.UserAgent = USER_AGENT; - - var areq = new Utility.AsyncHttpRequest(req); - using (var resp = (HttpWebResponse)areq.GetResponse()) - using (var rs = areq.GetResponseStream()) - Utility.Utility.CopyStream(rs, stream, true, m_copybuffer); - } - - #endregion - } -} diff --git a/Duplicati/Library/Backend/S3/S3IAM.cs b/Duplicati/Library/Backend/S3/S3IAM.cs index cd497cf87..c5610aa9a 100644 --- a/Duplicati/Library/Backend/S3/S3IAM.cs +++ b/Duplicati/Library/Backend/S3/S3IAM.cs @@ -150,7 +150,7 @@ namespace Duplicati.Library.Backend ActionNames = new[] { "iam:CreateUser" }.ToList() }; - return cl.SimulatePrincipalPolicy(simulatePrincipalPolicy). + return cl.SimulatePrincipalPolicyAsync(simulatePrincipalPolicy).GetAwaiter().GetResult(). EvaluationResults.First(). EvalDecision == PolicyEvaluationDecisionType.Allowed; @@ -190,7 +190,7 @@ namespace Duplicati.Library.Backend User user; try { - user = cl.GetUser().User; + user = cl.GetUserAsync().GetAwaiter().GetResult().User; } catch (Exception ex) when (ex is NoSuchEntityException || ex is ServiceFailureException) { @@ -218,7 +218,7 @@ namespace Duplicati.Library.Backend policyname, policydoc )); - var key = cl.CreateAccessKey(new CreateAccessKeyRequest { UserName = user.UserName }).AccessKey; + var key = cl.CreateAccessKeyAsync(new CreateAccessKeyRequest { UserName = user.UserName }).GetAwaiter().GetResult().AccessKey; return new Dictionary { diff --git a/Duplicati/Library/Backend/S3/S3Wrapper.cs b/Duplicati/Library/Backend/S3/S3Wrapper.cs index e725c6135..c3effca4b 100644 --- a/Duplicati/Library/Backend/S3/S3Wrapper.cs +++ b/Duplicati/Library/Backend/S3/S3Wrapper.cs @@ -100,7 +100,7 @@ namespace Duplicati.Library.Backend Key = keyName }; - using (GetObjectResponse objectGetResponse = m_client.GetObject(objectGetRequest)) + using (GetObjectResponse objectGetResponse = m_client.GetObjectAsync(objectGetRequest).GetAwaiter().GetResult()) using(System.IO.Stream s = objectGetResponse.ResponseStream) { try { s.ReadTimeout = (int)TimeSpan.FromMinutes(1).TotalMilliseconds; } diff --git a/Duplicati/Library/Main/Operation/RestoreHandler.cs b/Duplicati/Library/Main/Operation/RestoreHandler.cs index 85dd10b58..f6c38f106 100644 --- a/Duplicati/Library/Main/Operation/RestoreHandler.cs +++ b/Duplicati/Library/Main/Operation/RestoreHandler.cs @@ -5,6 +5,7 @@ using Duplicati.Library.Interface; using Duplicati.Library.Common.IO; using Duplicati.Library.Main.Database; using Duplicati.Library.Main.Volumes; +using System.Security.Cryptography; namespace Duplicati.Library.Main.Operation { diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index c0fd75f41..18708702c 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -23,6 +23,12 @@ + + + + ..\..\..\thirdparty\UnixSupport\UnixSupport.dll + + From 450ab23d762c89dadd2d7969a12c312755059366 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Mon, 29 Apr 2019 01:00:40 +0200 Subject: [PATCH 040/253] Last fixes in dependencies after upstream merge --- .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 5 ++++- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index eb4844308..a5b40e4f5 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -61,7 +61,6 @@ Duplicati.GUI.TrayIcon.Program - @@ -194,6 +193,10 @@ {BAE27510-8B5D-44B2-B33E-372A98908041} Duplicati.Library.Backend.WEBDAV + + {d63e53e4-a458-4c2f-914d-92f715f58acf} + Duplicati.Library.Common + {19E661D2-C5DA-4F35-B3EE-7586E5734B5F} Duplicati.Server diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 2e403a28c..d8bbfb25a 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -112,6 +112,10 @@ {BAE27510-8B5D-44B2-B33E-372A98908041} Duplicati.Library.Backend.WEBDAV + + {d63e53e4-a458-4c2f-914d-92f715f58acf} + Duplicati.Library.Common + {19ECCE09-B5EB-406C-8C57-BAC66997D469} Duplicati.Library.Compression @@ -180,4 +184,4 @@ - + \ No newline at end of file From 5ae4319d9273cfdb07bccbf6f7dd900a25fd7491 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Mon, 29 Apr 2019 08:22:22 +0200 Subject: [PATCH 041/253] Alter to C# 7.0 feature --- Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs index 36087cea8..79a1933df 100644 --- a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs +++ b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs @@ -109,7 +109,7 @@ namespace Duplicati.Library.Backend.AzureBlob public virtual async Task AddFileStream(string keyName, Stream source, CancellationToken cancelToken) { - await _container.GetBlockBlobReference(keyName).UploadFromStreamAsync(source, source.Length, default, default, new OperationContext(), cancelToken); + await _container.GetBlockBlobReference(keyName).UploadFromStreamAsync(source, source.Length, default(AccessCondition), default(BlobRequestOptions), new OperationContext(), cancelToken); } public void DeleteObject(string keyName) From 0d4ded3ae280e1b74c8ae3f7ad45967b4734ff60 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Mon, 29 Apr 2019 20:47:11 +0200 Subject: [PATCH 042/253] fix build and temp logging --- Duplicati/Library/Logging/Log.cs | 11 +++++------ Duplicati/Server/Duplicati.Server.csproj | 7 +------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/Duplicati/Library/Logging/Log.cs b/Duplicati/Library/Logging/Log.cs index 6d3822c1f..45df29ec3 100644 --- a/Duplicati/Library/Logging/Log.cs +++ b/Duplicati/Library/Logging/Log.cs @@ -454,16 +454,16 @@ namespace Duplicati.Library.Logging return sc; */ - throw new NotImplementedException(); + + return m_root; } } private set { - throw new NotImplementedException(); - /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md - lock (m_lock) { + /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md + if (value != null) { m_log_instances[value.InstanceID] = value; @@ -473,10 +473,9 @@ namespace Duplicati.Library.Logging { System.Runtime.Remoting.Messaging.CallContext.LogicalSetData(LOGICAL_CONTEXT_KEY, null); } + */ } - */ } } - } } diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index f7c2d3d24..9cff66525 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -130,12 +130,7 @@ - - - - - - + From cac6ea46798b63d2bcbc206c0746d41dcb9216ca Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Mon, 29 Apr 2019 21:16:17 +0200 Subject: [PATCH 043/253] convert UnitTest --- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 204 ++++++------------- 1 file changed, 67 insertions(+), 137 deletions(-) diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index d8bbfb25a..bcf644144 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -1,187 +1,117 @@ - - + + - Debug - AnyCPU - {ECB63D1C-1724-442D-9228-DEABF14F2EA3} - Library - Duplicati.UnitTest + netstandard2.0 + 2.0.0.7 + Exe + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.UnitTest + Duplicati Team + Duplicati Team + Duplicati.UnitTest + Duplicati.UnitTest Duplicati.UnitTest - v4.6.2 - false - - - true - full - false - bin\Debug - DEBUG; - prompt - 4 - false - - - full - true - bin\Release - prompt - 4 - false + Duplicati.UnitTest + - - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll - + + - - - - - - - - - - - - - - - - - - - - - - - {81765A64-3661-4E3E-B850-2F6F87A51F74} - Duplicati.CommandLine - - {E7280DCA-7776-4A73-B9B5-41FD77FC8799} - Duplicati.CommandLine.BackendTester - - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11} - Duplicati.CommandLine.BackendTool + - - {17566860-3D98-4604-AA5B-47661F75609F} - Duplicati.GUI.TrayIcon - - - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater + - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Duplicati.Library.Backend.AzureBlob - - - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Duplicati.Library.Backend.CloudFiles - {FC9B7611-836F-4127-8B44-A7C31F506807} - Duplicati.Library.Backend.File + + - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Duplicati.Library.Backend.FTP - - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Duplicati.Library.Backend.OneDrive + + + + + - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Duplicati.Library.Backend.S3 + + + - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Duplicati.Library.Backend.SSHv2 - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Duplicati.Library.Backend.TahoeLAFS - {BAE27510-8B5D-44B2-B33E-372A98908041} - Duplicati.Library.Backend.WEBDAV - - - {d63e53e4-a458-4c2f-914d-92f715f58acf} - Duplicati.Library.Common - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Duplicati.Library.Compression - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87} - Duplicati.Library.Encryption - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - - - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - - - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - {10D2D1B7-C664-41D8-9B3A-00040C3D421B} - Duplicati.Library.Main - - {D63E53E4-A458-4C2F-914D-92F715F58ACE} - Duplicati.Library.Snapshots - - - {2C838169-B187-4B09-8768-1C24C2521C8D} - Duplicati.Library.SQLiteHelper + - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Duplicati.License + + + + - {19E661D2-C5DA-4F35-B3EE-7586E5734B5F} - Duplicati.Server - - {E93F3DE2-FF3A-4709-96A3-8190AA14FA25} - Duplicati.Service + - - {33FD1D24-C28F-4C71-933F-98F1586EA76C} - Duplicati.Server.Serialization + + + + + + + + + - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Duplicati.Library.Backend.GoogleServices + + + + + + + + + + + + + + + + + + + + - - - + \ No newline at end of file From 4b2f0146345f5c99ce2b64ffd359f117efe3308e Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Mon, 29 Apr 2019 23:03:21 +0200 Subject: [PATCH 044/253] UnitTest csproj fixes --- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index bcf644144..b2759df91 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netcoreapp2.2 2.0.0.7 Exe LGPL, Copyright ? Duplicati Team 2015 @@ -12,10 +12,13 @@ Duplicati.UnitTest Duplicati.UnitTest Duplicati.UnitTest + false + + From cf74ae2cc3a7870e008cb613d2438365caa34750 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Mon, 29 Apr 2019 23:48:06 +0200 Subject: [PATCH 045/253] UnitTest netcore version --- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index b2759df91..81832778f 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -1,7 +1,7 @@  - netcoreapp2.2 + netcoreapp2.0 2.0.0.7 Exe LGPL, Copyright ? Duplicati Team 2015 From ae4174204b9c5a8c45e71e7cd256bd083a940459 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Tue, 30 Apr 2019 00:26:30 +0200 Subject: [PATCH 046/253] UnitTest dep upgrade --- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 81832778f..220c97726 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -16,9 +16,9 @@ - - - + + + From 5a6fc4336a8316ea4bfd66c250ef4770422c434f Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Tue, 30 Apr 2019 00:32:28 +0200 Subject: [PATCH 047/253] cleanup --- .gitignore | 2 +- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 2 +- Duplicati/UnitTest/app.config | 27 -------------------- Duplicati/UnitTest/packages.config | 4 --- 4 files changed, 2 insertions(+), 33 deletions(-) delete mode 100644 Duplicati/UnitTest/app.config delete mode 100644 Duplicati/UnitTest/packages.config diff --git a/.gitignore b/.gitignore index 2577fafa1..da0085f4c 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,4 @@ changelog-news.txt binfiles.wxs .idea/ .vs/ - +launchSettings.json diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 220c97726..6443055e1 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -77,7 +77,7 @@ - + diff --git a/Duplicati/UnitTest/app.config b/Duplicati/UnitTest/app.config deleted file mode 100644 index f171dd7bb..000000000 --- a/Duplicati/UnitTest/app.config +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Duplicati/UnitTest/packages.config b/Duplicati/UnitTest/packages.config deleted file mode 100644 index c108d442f..000000000 --- a/Duplicati/UnitTest/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 0cb6e4a1bfc5de58391955e7b386423cac4e703f Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 08:37:22 +0200 Subject: [PATCH 048/253] nuget upgrade --- .../Duplicati.Library.Backend.AlternativeFTP.csproj | 2 +- .../Duplicati.Library.Backend.AzureBlob.csproj | 12 ++++++------ .../Mega/Duplicati.Library.Backend.Mega.csproj | 2 +- .../Backend/S3/Duplicati.Library.Backend.S3.csproj | 6 +++--- .../Duplicati.Library.Backend.SharePoint.csproj | 2 +- .../Builtin/Duplicati.Library.Modules.Builtin.csproj | 8 ++++---- Duplicati/Server/Duplicati.Server.csproj | 6 +++--- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 16d3040de..533e3a631 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index bdd50cdcf..e2fd003f5 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -17,14 +17,14 @@ - - - - + + + + - - + + diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index e14e6d22d..7c3c362b0 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index 3ee696019..30fd42336 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index 18c396fe8..71ccd2f28 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -17,7 +17,7 @@ - + diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 35bdb530e..36ab29204 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -15,11 +15,11 @@ - + - - - + + + diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 9cff66525..306910cee 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -20,9 +20,9 @@ - - - + + + From ad2105aeb2df2733615fcf39804ef13e2f36135a Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 09:28:46 +0200 Subject: [PATCH 049/253] NuGet packages update --- .../Duplicati.CommandLine.BackendTester.csproj | 2 +- .../RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj | 2 +- .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 6 +++--- Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config | 2 +- .../AutoUpdater/Duplicati.Library.AutoUpdater.csproj | 2 +- Duplicati/Library/Backend/AlternativeFTP/packages.config | 4 ---- .../Duplicati.Library.Backend.AmazonCloudDrive.csproj | 4 ++-- .../AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj | 2 +- .../Backblaze/Duplicati.Library.Backend.Backblaze.csproj | 4 ++-- .../Backend/Box/Duplicati.Library.Backend.Box.csproj | 4 ++-- .../Dropbox/Duplicati.Library.Backend.Dropbox.csproj | 2 +- .../Duplicati.Library.Backend.GoogleServices.csproj | 4 ++-- .../Backend/Mega/Duplicati.Library.Backend.Mega.csproj | 2 +- .../OAuthHelper/Duplicati.Library.OAuthHelper.csproj | 4 ++-- .../OneDrive/Duplicati.Library.Backend.OneDrive.csproj | 2 +- .../OpenStack/Duplicati.Library.Backend.OpenStack.csproj | 4 ++-- .../Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj | 2 +- .../SharePoint/Duplicati.Library.Backend.SharePoint.csproj | 2 +- .../Backend/Sia/Duplicati.Library.Backend.Sia.csproj | 2 +- .../TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj | 2 +- Duplicati/Library/Common/Duplicati.Library.Common.csproj | 4 ++-- .../Compression/Duplicati.Library.Compression.csproj | 2 +- Duplicati/Library/Compression/packages.config | 4 ---- Duplicati/Library/Encryption/packages.config | 4 ---- Duplicati/Library/Main/Duplicati.Library.Main.csproj | 2 +- .../Builtin/Duplicati.Library.Modules.Builtin.csproj | 2 +- .../Library/Snapshots/Duplicati.Library.Snapshots.csproj | 2 +- .../UsageReporter/Duplicati.Library.UsageReporter.csproj | 2 +- .../Duplicati.Server.Serialization.csproj | 2 +- Duplicati/Server/Duplicati.Server.csproj | 2 +- 30 files changed, 36 insertions(+), 48 deletions(-) delete mode 100644 Duplicati/Library/Backend/AlternativeFTP/packages.config delete mode 100644 Duplicati/Library/Compression/packages.config delete mode 100644 Duplicati/Library/Encryption/packages.config diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 76e9cfdfd..02acad39c 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 0a989aebe..47d22960e 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index a5b40e4f5..bc9fb238a 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -66,6 +66,9 @@ ..\..\..\packages\CoCoL.1.6.1\lib\netstandard2.0\CoCoL.dll + + ..\..\..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + @@ -91,9 +94,6 @@ False - - ..\..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config b/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config index 9cc66836c..b9e1d2970 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index f33c8ea27..7cba895db 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/AlternativeFTP/packages.config b/Duplicati/Library/Backend/AlternativeFTP/packages.config deleted file mode 100644 index c1390ae05..000000000 --- a/Duplicati/Library/Backend/AlternativeFTP/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj index bfa3767b7..0e9c064ea 100644 --- a/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj +++ b/Duplicati/Library/Backend/AmazonCloudDrive/Duplicati.Library.Backend.AmazonCloudDrive.csproj @@ -5,7 +5,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Backend.AmazonCloudDrive Duplicati Team Duplicati Team @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index e2fd003f5..456913e18 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -21,7 +21,7 @@ - + diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index 4140ffc5a..1ff6f9622 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -4,7 +4,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.Backblaze Duplicati Team Duplicati Team @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 0e2b22603..2a89a9a42 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -4,7 +4,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.Box Duplicati Team Duplicati Team @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index 1c9191754..9a6da043e 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index e3a699955..9d85d2d11 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -4,7 +4,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.GoogleCloudStorage Duplicati Team Duplicati Team @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 7c3c362b0..43ed03c82 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index ed6ce5c03..13c1eed2c 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -4,7 +4,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.OAuthHelper Duplicati Team Duplicati Team @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 2995cd52f..65a247ce0 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index b96fc40a7..22f2f38f3 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -4,7 +4,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.OpenStack Duplicati Team Duplicati Team @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 88bbef006..753608214 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index 71ccd2f28..c66a61c44 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index ec9925d22..ed96e1d5b 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 1e20a21be..0a12e022a 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 4285617b7..f7ca9e464 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 1b37808a4..c92a22bee 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Compression/packages.config b/Duplicati/Library/Compression/packages.config deleted file mode 100644 index 2c846c9a5..000000000 --- a/Duplicati/Library/Compression/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Encryption/packages.config b/Duplicati/Library/Encryption/packages.config deleted file mode 100644 index 04c131435..000000000 --- a/Duplicati/Library/Encryption/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 568599726..d59373ddd 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 36ab29204..afc0de63e 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -16,7 +16,7 @@ - + diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 18708702c..5bf6f29da 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -12,7 +12,7 @@ - + diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index 22c62b50f..1269abb54 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -16,7 +16,7 @@ - + diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 11e1666fd..e8776ff87 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 306910cee..26af54c6c 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -19,7 +19,7 @@ - + From 676787cebd01a46b36e3c9c5a045bc29402d5701 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 09:45:31 +0200 Subject: [PATCH 050/253] TlsTest and mozroots remove --- Duplicati/Tools/Duplicati.Tools.csproj | 8 - thirdparty/TlsTest/Homepage.txt | 1 - thirdparty/TlsTest/License.txt | 18 -- thirdparty/TlsTest/TlsTest.cs | 324 --------------------- thirdparty/TlsTest/TlsTest.csproj | 33 --- thirdparty/TlsTest/TlsTest.exe | Bin 11776 -> 0 bytes thirdparty/TlsTest/TlsTest.sln | 17 -- thirdparty/TlsTest/licensedata.json | 7 - thirdparty/mozroots/Homepage.txt | 1 - thirdparty/mozroots/License.txt | 18 -- thirdparty/mozroots/licensedata.json | 7 - thirdparty/mozroots/mozroots.cs | 385 ------------------------- thirdparty/mozroots/mozroots.csproj | 33 --- thirdparty/mozroots/mozroots.exe | Bin 13312 -> 0 bytes thirdparty/mozroots/mozroots.sln | 17 -- 15 files changed, 869 deletions(-) delete mode 100644 thirdparty/TlsTest/Homepage.txt delete mode 100644 thirdparty/TlsTest/License.txt delete mode 100644 thirdparty/TlsTest/TlsTest.cs delete mode 100644 thirdparty/TlsTest/TlsTest.csproj delete mode 100755 thirdparty/TlsTest/TlsTest.exe delete mode 100644 thirdparty/TlsTest/TlsTest.sln delete mode 100644 thirdparty/TlsTest/licensedata.json delete mode 100644 thirdparty/mozroots/Homepage.txt delete mode 100644 thirdparty/mozroots/License.txt delete mode 100644 thirdparty/mozroots/licensedata.json delete mode 100644 thirdparty/mozroots/mozroots.cs delete mode 100644 thirdparty/mozroots/mozroots.csproj delete mode 100755 thirdparty/mozroots/mozroots.exe delete mode 100644 thirdparty/mozroots/mozroots.sln diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index b70f4b8b0..d5143bc26 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -61,14 +61,6 @@ win-tools\zlib1.dll PreserveNewest - - utility-scripts\mozroots.exe - PreserveNewest - - - utility-scripts\TlsTest.exe - PreserveNewest - diff --git a/thirdparty/TlsTest/Homepage.txt b/thirdparty/TlsTest/Homepage.txt deleted file mode 100644 index ad5bcaeeb..000000000 --- a/thirdparty/TlsTest/Homepage.txt +++ /dev/null @@ -1 +0,0 @@ -https://github.com/mono/mono/blob/master/mcs/class/Mono.Security/Test/tools/tlstest/tlstest.cs \ No newline at end of file diff --git a/thirdparty/TlsTest/License.txt b/thirdparty/TlsTest/License.txt deleted file mode 100644 index 96ab4af51..000000000 --- a/thirdparty/TlsTest/License.txt +++ /dev/null @@ -1,18 +0,0 @@ -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/thirdparty/TlsTest/TlsTest.cs b/thirdparty/TlsTest/TlsTest.cs deleted file mode 100644 index 4a137baa2..000000000 --- a/thirdparty/TlsTest/TlsTest.cs +++ /dev/null @@ -1,324 +0,0 @@ -// -// TlsTest.cs: TLS/SSL Test Program -// -// Author: -// Sebastien Pouliot -// -// (C) 2004 Novell (http://www.novell.com) -// Copyright 2014 Xamarin Inc. (http://www.xamarin.com) -// - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Reflection; -using System.Security.Cryptography.X509Certificates; -using System.Text; - -using Mono.Security.Protocol.Tls; - -public class TlsTest -{ - - public static void Usage(string message) - { - Console.WriteLine("{0}tlstest - Copyright (c) 2004 Novell", Environment.NewLine); - if (message != null) - { - Console.WriteLine("{0}{1}{0}", Environment.NewLine, message); - } - Console.WriteLine("Usage:"); - Console.WriteLine("tlstest [protocol] [class] [credentials] [--x:x509 [--x:x509]] [--time] [--show] url [...]"); - Console.WriteLine("{0}protocol (only applicable when using stream)", Environment.NewLine); - Console.WriteLine("\t--any \tNegotiate protocol [default]"); - Console.WriteLine("\t--ssl \tUse SSLv3"); - Console.WriteLine("\t--ssl2 \tUse SSLv2 - unsupported on Mono"); - Console.WriteLine("\t--ssl3 \tUse SSLv3"); - Console.WriteLine("\t--tls \tUse TLSv1"); - Console.WriteLine("\t--tls1 \tUse TLSv1"); - Console.WriteLine("\t--tls11 \tUse TLSv1.1"); - Console.WriteLine("\t--tls12 \tUse TLSv1.2"); - Console.WriteLine("{0}class", Environment.NewLine); - Console.WriteLine("\t--stream\tDirectly use the SslClientStream [default]"); - Console.WriteLine("\t--web \tUse the WebRequest/WebResponse classes"); - Console.WriteLine("{0}credentials", Environment.NewLine); - Console.WriteLine("\t--basic:username:password:domain\tBasic Authentication"); - Console.WriteLine("\t--digest:username:password:domain\tDigest Authentication"); - Console.WriteLine("{0}options", Environment.NewLine); - Console.WriteLine("\t--x:x509\tX.509 client certificate (multiple entries allowed"); - Console.WriteLine("\t--time \tShow the time required for each page load"); - Console.WriteLine("\t--show \tShow the web page content on screen"); - Console.WriteLine("{0}\turl [...]\tOne, or more, URL to download{0}", Environment.NewLine); - } - - private static bool show; - private static bool time; - private static bool web; - private static Mono.Security.Protocol.Tls.SecurityProtocolType? protocol; - private static X509CertificateCollection certificates = new X509CertificateCollection(); - private static NetworkCredential basicCred; - private static NetworkCredential digestCred; - - public static void Main(string[] args) - { - if (args.Length == 0) - { - Usage("Missing arguments"); - return; - } - - ArrayList urls = new ArrayList(); - foreach (string arg in args) - { - switch (arg) - { - // protocol - case "--any": - protocol = Mono.Security.Protocol.Tls.SecurityProtocolType.Default; - break; - case "--ssl": - case "--ssl3": - protocol = Mono.Security.Protocol.Tls.SecurityProtocolType.Ssl3; - break; - case "--ssl2": - protocol = Mono.Security.Protocol.Tls.SecurityProtocolType.Ssl2; - // note: will only works with Fx 1.2 - // but the tool doesn't link with it - Usage("Not supported"); - return; - case "--tls": - case "--tls1": - protocol = Mono.Security.Protocol.Tls.SecurityProtocolType.Tls; - break; - case "--tls11": - protocol = Mono.Security.Protocol.Tls.SecurityProtocolType.Tls11; - break; - case "--tls12": - protocol = Mono.Security.Protocol.Tls.SecurityProtocolType.Tls12; - break; - // class - case "--stream": - web = false; - break; - case "--web": - web = true; - break; - // options - case "--time": - time = true; - break; - case "--show": - show = true; - break; - case "--help": - Usage(null); - return; - // credentials, certificates, urls or bad options - default: - if (arg.StartsWith("--digest:")) - { - digestCred = GetCredentials(arg.Substring(9)); - continue; - } - else if (arg.StartsWith("--basic:")) - { - basicCred = GetCredentials(arg.Substring(8)); - continue; - } - else if (arg.StartsWith("--x:")) - { - string filename = arg.Substring(4); - X509Certificate x509 = X509Certificate.CreateFromCertFile(filename); - certificates.Add(x509); - continue; - } - else if (arg.StartsWith("--")) - { - Usage("Invalid option " + arg); - return; - } - urls.Add(arg); - break; - } - } - - if (urls.Count == 0) - { - Usage("no URL were specified"); - return; - } - - foreach (string url in urls) - { - Console.WriteLine("{0}{1}", Environment.NewLine, url); - string content = null; - DateTime start = DateTime.Now; - - try - { - if (web) - { - content = GetWebPage(url); - } - else - { - content = GetStreamPage(url); - } - } - catch (Exception e) - { - // HResult is now public (was protected before 4.5) - Console.WriteLine("FAILED: #{0}", e.HResult); - Console.WriteLine(e.ToString()); - } - - TimeSpan ts = (DateTime.Now - start); - if ((show) && (content != null)) - { - Console.WriteLine("{0}{1}{0}", Environment.NewLine, content); - } - if (time) - { - Console.WriteLine("Time: " + ts.ToString()); - } - } - } - - public static string GetWebPage(string url) - { - ServicePointManager.CertificatePolicy = new TestCertificatePolicy(); - if (protocol != null) - ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)(int)protocol.Value; - - Uri uri = new Uri(url); - HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); - - if ((digestCred != null) || (basicCred != null)) - { - CredentialCache cache = new CredentialCache(); - if (digestCred != null) - cache.Add(uri, "Digest", digestCred); - if (basicCred != null) - cache.Add(uri, "Basic", basicCred); - req.Credentials = cache; - } - - if (certificates.Count > 0) - req.ClientCertificates.AddRange(certificates); - - WebResponse resp = req.GetResponse(); - Stream stream = resp.GetResponseStream(); - StreamReader sr = new StreamReader(stream, Encoding.UTF8); - return sr.ReadToEnd(); - } - - public static string GetStreamPage(string url) - { - Uri uri = new Uri(url); - if (uri.Scheme != Uri.UriSchemeHttps) - throw new NotSupportedException("Stream only works with HTTPS protocol"); - - IPHostEntry host = Dns.Resolve(uri.Host); - IPAddress ip = host.AddressList[0]; - Socket socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - socket.Connect(new IPEndPoint(ip, uri.Port)); - NetworkStream ns = new NetworkStream(socket, false); - SslClientStream ssl = new SslClientStream(ns, uri.Host, false, protocol ?? Mono.Security.Protocol.Tls.SecurityProtocolType.Default, certificates); - ssl.ServerCertValidationDelegate += new CertificateValidationCallback(CertificateValidation); - - StreamWriter sw = new StreamWriter(ssl); - sw.WriteLine("GET {0} HTTP/1.0{1}", uri.AbsolutePath, Environment.NewLine); - sw.Flush(); - - StreamReader sr = new StreamReader(ssl, Encoding.UTF8); - return sr.ReadToEnd(); - } - - private static NetworkCredential GetCredentials(string credentials) - { - string[] creds = credentials.Split(':'); - NetworkCredential nc = new NetworkCredential(); - nc.UserName = ((creds.Length > 0) ? creds[0] : String.Empty); - nc.Password = ((creds.Length > 1) ? creds[1] : String.Empty); - nc.Domain = ((creds.Length > 2) ? creds[2] : String.Empty); - return nc; - } - - private static void ShowCertificateError(int error) - { - string message = null; - switch (error) - { - case -2146762490: - message = "CERT_E_PURPOSE 0x800B0106"; - break; - case -2146762481: - message = "CERT_E_CN_NO_MATCH 0x800B010F"; - break; - case -2146869223: - message = "TRUST_E_BASIC_CONSTRAINTS 0x80096019"; - break; - case -2146869232: - message = "TRUST_E_BAD_DIGEST 0x80096010"; - break; - case -2146762494: - message = "CERT_E_VALIDITYPERIODNESTING 0x800B0102"; - break; - case -2146762495: - message = "CERT_E_EXPIRED 0x800B0101"; - break; - case -2146762486: - message = "CERT_E_CHAINING 0x800B010A"; - break; - case -2146762487: - message = "CERT_E_UNTRUSTEDROOT 0x800B0109"; - break; - default: - message = "unknown (try WinError.h)"; - break; - } - Console.WriteLine("Error #{0}: {1}", error, message); - } - - private static bool CertificateValidation(X509Certificate certificate, int[] certificateErrors) - { - if (certificateErrors.Length > 0) - { - Console.WriteLine(certificate.ToString(true)); - // X509Certificate.ToString(true) doesn't show dates :-( - Console.WriteLine("\tValid From: {0}", certificate.GetEffectiveDateString()); - Console.WriteLine("\tValid Until: {0}{1}", certificate.GetExpirationDateString(), Environment.NewLine); - // multiple errors are possible using SslClientStream - foreach (int error in certificateErrors) - { - ShowCertificateError(error); - } - } - // whatever the reason we do not stop the SSL connection - return true; - } - - public class TestCertificatePolicy : ICertificatePolicy - { - - public bool CheckValidationResult(ServicePoint sp, X509Certificate certificate, WebRequest request, int error) - { - if (error != 0) - { - Console.WriteLine(certificate.ToString(true)); - // X509Certificate.ToString(true) doesn't show dates :-( - Console.WriteLine("\tValid From: {0}", certificate.GetEffectiveDateString()); - Console.WriteLine("\tValid Until: {0}{1}", certificate.GetExpirationDateString(), Environment.NewLine); - - ShowCertificateError(error); - } - // whatever the reason we do not stop the SSL connection - return true; - } - } -} diff --git a/thirdparty/TlsTest/TlsTest.csproj b/thirdparty/TlsTest/TlsTest.csproj deleted file mode 100644 index db9a424a7..000000000 --- a/thirdparty/TlsTest/TlsTest.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - Debug - AnyCPU - {95B35AA3-7F86-43F1-9794-0CA115CFDF32} - Exe - False - TlsTest - TlsTest - v4.6.2 - - - true - false - bin\Debug - DEBUG; - 4 - - - true - bin\Release - 4 - - - - - - - - - - \ No newline at end of file diff --git a/thirdparty/TlsTest/TlsTest.exe b/thirdparty/TlsTest/TlsTest.exe deleted file mode 100755 index 84996219d8de0fd582ae3af0fe0e6cc3cc049deb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 -// -// Copyright (C) 2005 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// - -using System; -using System.Collections; -using System.IO; -using System.Net; -using System.Reflection; -using System.Security.Cryptography; -using System.Text; - -using Mono.Security.Authenticode; -using Mono.Security.X509; - -[assembly: AssemblyTitle("Mozilla Roots Importer")] -[assembly: AssemblyDescription("Download and import trusted root certificates from Mozilla's MXR.")] - -namespace Mono.Tools -{ - - class MozRoots - { - - // this URL is recommended by https://bugzilla.mozilla.org/show_bug.cgi?id=1279952#c8 and is also used as basis for curl's https://curl.haxx.se/ca/cacert.pem bundle - private const string defaultUrl = "https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt"; - - static string url; - static string inputFile; - static string pkcs7filename; - static bool import; - static bool machine; - static bool confirmAddition; - static bool confirmRemoval; - static bool quiet; - - static byte[] DecodeOctalString(string s) - { - string[] pieces = s.Split('\\'); - byte[] data = new byte[pieces.Length - 1]; - for (int i = 1; i < pieces.Length; i++) - { - data[i - 1] = (byte)((pieces[i][0] - '0' << 6) + (pieces[i][1] - '0' << 3) + (pieces[i][2] - '0')); - } - return data; - } - - static X509Certificate DecodeCertificate(string s) - { - byte[] rawdata = DecodeOctalString(s); - return new X509Certificate(rawdata); - } - - static Stream GetFile() - { - try - { - if (inputFile != null) - { - return File.OpenRead(inputFile); - } - else { - WriteLine("Downloading from '{0}'...", url); - HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); - req.Timeout = 10000; - return req.GetResponse().GetResponseStream(); - } - } - catch - { - return null; - } - } - - static X509CertificateCollection DecodeCollection() - { - X509CertificateCollection roots = new X509CertificateCollection(); - StringBuilder sb = new StringBuilder(); - bool processing = false; - - using (Stream s = GetFile()) - { - if (s == null) - { - WriteLine("Couldn't retrieve the file using the supplied information."); - return null; - } - - StreamReader sr = new StreamReader(s); - while (true) - { - string line = sr.ReadLine(); - if (line == null) - break; - - if (processing) - { - if (line.StartsWith("END")) - { - processing = false; - X509Certificate root = DecodeCertificate(sb.ToString()); - roots.Add(root); - - sb = new StringBuilder(); - continue; - } - sb.Append(line); - } - else { - processing = line.StartsWith("CKA_VALUE MULTILINE_OCTAL"); - } - } - return roots; - } - } - - static int Process() - { - ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => - { - if (sslPolicyErrors != System.Net.Security.SslPolicyErrors.None) - Console.WriteLine("WARNING: Downloading the trusted certificate list couldn't be done securely (error: {0}), continuing anyway. If you're using mozroots to bootstrap Mono's trust store on a clean system this might be OK, otherwise it could indicate a network intrusion. Please ensure you're using a trusted network or move to cert-sync.", sslPolicyErrors); - - // this is very bad, but on a clean system without an existing trust store we don't really have a better option - return true; - }; - - X509CertificateCollection roots = DecodeCollection(); - if (roots == null) - { - return 1; - } - else if (roots.Count == 0) - { - WriteLine("No certificates were found."); - return 0; - } - - if (pkcs7filename != null) - { - SoftwarePublisherCertificate pkcs7 = new SoftwarePublisherCertificate(); - pkcs7.Certificates.AddRange(roots); - - WriteLine("Saving root certificates into '{0}' file...", pkcs7filename); - using (FileStream fs = File.OpenWrite(pkcs7filename)) - { - byte[] data = pkcs7.GetBytes(); - fs.Write(data, 0, data.Length); - fs.Close(); - } - } - - if (import) - { - WriteLine("Importing certificates into {0} store...", - machine ? "machine" : "user"); - - X509Stores stores = (machine ? X509StoreManager.LocalMachine : X509StoreManager.CurrentUser); - X509CertificateCollection trusted = stores.TrustedRoot.Certificates; - int additions = 0; - foreach (X509Certificate root in roots) - { - if (!trusted.Contains(root)) - { - if (!confirmAddition || AskConfirmation("add", root)) - { - stores.TrustedRoot.Import(root); - if (confirmAddition) - WriteLine("Certificate added.{0}", Environment.NewLine); - additions++; - } - } - } - if (additions > 0) - WriteLine("{0} new root certificates were added to your trust store.", additions); - - X509CertificateCollection removed = new X509CertificateCollection(); - foreach (X509Certificate trust in trusted) - { - if (!roots.Contains(trust)) - { - removed.Add(trust); - } - } - if (removed.Count > 0) - { - if (confirmRemoval) - { - WriteLine("{0} previously trusted certificates were not part of the update.", removed.Count); - } - else { - WriteLine("{0} previously trusted certificates were removed.", removed.Count); - } - - foreach (X509Certificate old in removed) - { - if (!confirmRemoval || AskConfirmation("remove", old)) - { - stores.TrustedRoot.Remove(old); - if (confirmRemoval) - WriteLine("Certificate removed.{0}", Environment.NewLine); - } - } - } - WriteLine("Import process completed.{0}", Environment.NewLine); - } - return 0; - } - - static string Thumbprint(string algorithm, X509Certificate certificate) - { - HashAlgorithm hash = HashAlgorithm.Create(algorithm); - byte[] digest = hash.ComputeHash(certificate.RawData); - return BitConverter.ToString(digest); - } - - static bool AskConfirmation(string action, X509Certificate certificate) - { - // the quiet flag is ignored for confirmations - Console.WriteLine(); - Console.WriteLine("Issuer: {0}", certificate.IssuerName); - Console.WriteLine("Serial number: {0}", BitConverter.ToString(certificate.SerialNumber)); - Console.WriteLine("Valid from {0} to {1}", certificate.ValidFrom, certificate.ValidUntil); - Console.WriteLine("Thumbprint SHA-1: {0}", Thumbprint("SHA1", certificate)); - Console.WriteLine("Thumbprint MD5: {0}", Thumbprint("MD5", certificate)); - while (true) - { - Console.Write("Are you sure you want to {0} this certificate ? ", action); - string s = Console.ReadLine().ToLower(); - if (s == "yes") - return true; - else if (s == "no") - return false; - } - } - - static bool ParseOptions(string[] args) - { - if (args.Length < 1) - return false; - - // set defaults - url = defaultUrl; - confirmAddition = true; - confirmRemoval = true; - - for (int i = 0; i < args.Length; i++) - { - switch (args[i]) - { - case "--url": - if (i >= args.Length - 1) - return false; - url = args[++i]; - break; - case "--file": - if (i >= args.Length - 1) - return false; - inputFile = args[++i]; - break; - case "--pkcs7": - if (i >= args.Length - 1) - return false; - pkcs7filename = args[++i]; - break; - case "--import": - import = true; - break; - case "--machine": - machine = true; - break; - case "--sync": - confirmAddition = false; - confirmRemoval = false; - break; - case "--ask": - confirmAddition = true; - confirmRemoval = true; - break; - case "--ask-add": - confirmAddition = true; - confirmRemoval = false; - break; - case "--ask-remove": - confirmAddition = false; - confirmRemoval = true; - break; - case "--quiet": - quiet = true; - break; - default: - WriteLine("Unknown option '{0}'."); - return false; - } - } - return true; - } - - static void Header() - { - Console.WriteLine(System.Reflection.Assembly.GetExecutingAssembly().ToString()); - Console.WriteLine("WARNING: mozroots is deprecated, please move to cert-sync instead."); - Console.WriteLine(); - } - - static void Help() - { - Console.WriteLine("Usage: mozroots [--import [--machine] [--sync | --ask | --ask-add | --ask-remove]]"); - Console.WriteLine("Where the basic options are:"); - Console.WriteLine(" --import\tImport the certificates into the trust store."); - Console.WriteLine(" --sync\t\tSynchronize (add/remove) the trust store with the certificates."); - Console.WriteLine(" --ask\t\tAlways confirm before adding or removing trusted certificates."); - Console.WriteLine(" --ask-add\tAlways confirm before adding a new trusted certificate."); - Console.WriteLine(" --ask-remove\tAlways confirm before removing an existing trusted certificate."); - Console.WriteLine("{0}and the advanced options are", Environment.NewLine); - Console.WriteLine(" --url url\tSpecify an alternative URL for downloading the trusted"); - Console.WriteLine("\t\tcertificates (MXR source format)."); - Console.WriteLine(" --file name\tDo not download but use the specified file."); - Console.WriteLine(" --pkcs7 name\tExport the certificates into a PKCS#7 file."); - Console.WriteLine(" --machine\tImport the certificate in the machine trust store."); - Console.WriteLine("\t\tThe default is to import into the user store."); - Console.WriteLine(" --quiet\tLimit console output to errors and confirmations messages."); - } - - static void WriteLine(string str) - { - if (!quiet) - Console.WriteLine(str); - } - - static void WriteLine(string format, params object[] args) - { - if (!quiet) - Console.WriteLine(format, args); - } - - static int Main(string[] args) - { - try - { - if (!ParseOptions(args)) - { - Header(); - Help(); - return 1; - } - if (!quiet) - { - Header(); - } - return Process(); - } - catch (Exception e) - { - // ignore quiet on exception - Console.WriteLine("Error: {0}", e); - return 1; - } - } - } -} \ No newline at end of file diff --git a/thirdparty/mozroots/mozroots.csproj b/thirdparty/mozroots/mozroots.csproj deleted file mode 100644 index 7c8d38c20..000000000 --- a/thirdparty/mozroots/mozroots.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - Debug - AnyCPU - {C44F0C79-B4E2-4D41-B357-1FD7B8888E78} - Exe - False - mozroots - mozroots - v4.6.2 - - - true - false - bin\Debug - DEBUG; - 4 - - - true - bin\Release - 4 - - - - - - - - - - \ No newline at end of file diff --git a/thirdparty/mozroots/mozroots.exe b/thirdparty/mozroots/mozroots.exe deleted file mode 100755 index 348fdf8d075173fe552bfcc16d19ac67790a66f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13312 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 Rvi2*$nr=3ZS~Q44004$8D^UOd diff --git a/thirdparty/mozroots/mozroots.sln b/thirdparty/mozroots/mozroots.sln deleted file mode 100644 index fa7e636bd..000000000 --- a/thirdparty/mozroots/mozroots.sln +++ /dev/null @@ -1,17 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mozroots", "mozroots.csproj", "{C44F0C79-B4E2-4D41-B357-1FD7B8888E78}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C44F0C79-B4E2-4D41-B357-1FD7B8888E78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C44F0C79-B4E2-4D41-B357-1FD7B8888E78}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C44F0C79-B4E2-4D41-B357-1FD7B8888E78}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C44F0C79-B4E2-4D41-B357-1FD7B8888E78}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal From c01210a443a162ca08e6b4e30ab629470081897c Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 10:11:02 +0200 Subject: [PATCH 051/253] mozroots remove 2 --- .../Library/Modules/Builtin/CheckMonoSSL.cs | 180 ------------------ .../Duplicati.Library.Modules.Builtin.csproj | 4 - Duplicati/License/Duplicati.License.csproj | 28 --- 3 files changed, 212 deletions(-) delete mode 100644 Duplicati/Library/Modules/Builtin/CheckMonoSSL.cs diff --git a/Duplicati/Library/Modules/Builtin/CheckMonoSSL.cs b/Duplicati/Library/Modules/Builtin/CheckMonoSSL.cs deleted file mode 100644 index 5de5a8531..000000000 --- a/Duplicati/Library/Modules/Builtin/CheckMonoSSL.cs +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Security.Cryptography.X509Certificates; - -namespace Duplicati.Library.Modules.Builtin -{ - public class CheckMonoSSL : Duplicati.Library.Interface.IGenericModule, Duplicati.Library.Interface.IWebModule - { - private static readonly string LOGTAG = Logging.Log.LogTagFromType(); - - public CheckMonoSSL() - { - } - - private int CheckStore(StoreName storename, StoreLocation storelocation) - { - X509Store store = null; - try - { - store = new X509Store(storename, storelocation); - store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); - return store.Certificates.Count; - } - catch - { - } - finally - { - if (store != null) - try { store.Close(); } - catch { } - } - - return 0; - } - - // Prevent inlining, so we can catch loader errors from the caller - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private int CheckMonoCerts() - { - return -#if __MonoCS__ - Mono.Security.X509.X509StoreManager.LocalMachine.TrustedRoot.Certificates.Count + - Mono.Security.X509.X509StoreManager.CurrentUser.TrustedRoot.Certificates.Count + - Mono.Security.X509.X509StoreManager.TrustedRootCertificates.Count + -#endif - 0; - } - - private int CheckForInstalledCerts() - { - var count = - CheckStore(StoreName.Root, StoreLocation.CurrentUser) + - CheckStore(StoreName.AuthRoot, StoreLocation.CurrentUser) + - CheckStore(StoreName.CertificateAuthority, StoreLocation.CurrentUser) + - CheckStore(StoreName.Root, StoreLocation.LocalMachine) + - CheckStore(StoreName.AuthRoot, StoreLocation.LocalMachine) + - CheckStore(StoreName.CertificateAuthority, StoreLocation.LocalMachine); - - try { count += CheckMonoCerts(); } - catch { } - - return count; - } - -#region IGenericModule implementation - - public string Key { get { return "check-mono-ssl"; } } - public string DisplayName { get { return Strings.CheckMonoSSL.Displayname; } } - public string Description { get { return Strings.CheckMonoSSL.Description; } } - public bool LoadAsDefault { get { return true; } } - public IList SupportedCommands { get { return null; } } - - public void Configure(IDictionary commandlineOptions) - { - //Ensure the setup is valid, could throw an exception - if (!commandlineOptions.ContainsKey("main-action") || !Library.Utility.Utility.IsMono) - return; - - if (CheckForInstalledCerts() == 0) - Duplicati.Library.Logging.Log.WriteWarningMessage(LOGTAG, "MissingCerts", null, Strings.CheckMonoSSL.ErrorMessage); - } -#endregion - -#region IWebModule implementation - - private const string KEY_CONFIGTYPE = "mono-ssl-config"; - private const ConfigType DEFAULT_CONFIG_TYPE = ConfigType.List; - - private enum ConfigType - { - List, - Install, - Test - } - - - public IDictionary Execute(IDictionary options) - { - string k; - options.TryGetValue(KEY_CONFIGTYPE, out k); - - ConfigType ct; - if (!Enum.TryParse(k, true, out ct)) - ct = DEFAULT_CONFIG_TYPE; - - var d = new Dictionary(); - - switch (ct) - { - case ConfigType.Install: - - try - { - var path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "mozroots.exe"); - var pi = new System.Diagnostics.ProcessStartInfo(path, "--import --sync --quiet") - { - UseShellExecute = false - }; - var p = System.Diagnostics.Process.Start(pi); - p.WaitForExit((int)TimeSpan.FromMinutes(5).TotalMilliseconds); - } - catch(Exception ex) - { - d["error"] = ex.ToString(); - } - - d["count"] = CheckForInstalledCerts().ToString(); - break; - - case ConfigType.Test: - try - { - var req = System.Net.WebRequest.CreateHttp("https://updates.duplicati.com"); - req.Method = "HEAD"; - req.AllowAutoRedirect = false; - - using (var resp = (System.Net.HttpWebResponse)req.GetResponse()) - { - d["status"] = resp.StatusDescription; - d["status_code"] = ((int)resp.StatusCode).ToString(); - } - } - catch(Exception ex) - { - d["error"] = ex.ToString(); - } - break; - - case ConfigType.List: - default: - d["count"] = CheckForInstalledCerts().ToString(); - d["mono"] = Library.Utility.Utility.IsMono.ToString(); - d["message"] = Strings.CheckMonoSSL.ErrorMessage; - break; - } - - return d; - } - -#endregion - } -} - diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index afc0de63e..743588fec 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -38,10 +38,6 @@ PreserveNewest - - mozroots.exe - PreserveNewest - \ No newline at end of file diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 754ef9f1a..8a9c49f68 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -19,10 +19,6 @@ licenses\alphavss\Homepage.txt PreserveNewest - - licenses\alphavss\License.txt - PreserveNewest - licenses\gpg\Homepage.txt PreserveNewest @@ -324,30 +320,6 @@ licenses\AngularGettext\licensedata.json PreserveNewest - - - licenses\mozroots\Homepage.txt - PreserveNewest - - - licenses\mozroots\License.txt - PreserveNewest - - - licenses\mozroots\licensedata.json - PreserveNewest - - - licenses\TlsTest\Homepage.txt - PreserveNewest - - - licenses\TlsTest\License.txt - PreserveNewest - - - licenses\TlsTest\licensedata.json - PreserveNewest licenses\SharpCompress\licensedata.json From 787bcb57aee56d9a7c3e7dfe7ad88d277dfda7f2 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 10:29:38 +0200 Subject: [PATCH 052/253] fixed Sharepoint backend --- ...Duplicati.CommandLine.BackendTester.csproj | 3 - .../Duplicati.CommandLine.BackendTool.csproj | 3 - .../CommandLine/Duplicati.CommandLine.csproj | 5 +- .../Duplicati.CommandLine.RecoveryTool.csproj | 3 - ...uplicati.Library.Backend.SharePoint.csproj | 21 +- Duplicati/License/Duplicati.License.csproj | 16 +- Duplicati/Server/Duplicati.Server.csproj | 5 +- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 5 +- .../Microsoft.SharePoint.Client.Portable.dll | Bin 823032 -> 0 bytes ...oft.SharePoint.Client.Runtime.Portable.dll | Bin 309008 -> 0 bytes ...soft.SharePoint.Client.Runtime.Windows.dll | Bin 29968 -> 0 bytes ...icrosoftSharePointClientComponentsEULA.rtf | 500 ------------------ thirdparty/SharePoint.CSOM/download.txt | 1 - thirdparty/SharePoint.CSOM/license.txt | 115 ---- thirdparty/SharePoint.CSOM/licensedata.json | 7 - .../SharePointPnP.Client.dll | Bin 0 -> 2257768 bytes .../SharePointPnP-Sites-Core/download.txt | 1 + .../SharePointPnP-Sites-Core/license.txt | 26 + .../SharePointPnP-Sites-Core/licensedata.json | 7 + 19 files changed, 47 insertions(+), 671 deletions(-) delete mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Portable.dll delete mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Runtime.Portable.dll delete mode 100644 thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Runtime.Windows.dll delete mode 100644 thirdparty/SharePoint.CSOM/MicrosoftSharePointClientComponentsEULA.rtf delete mode 100644 thirdparty/SharePoint.CSOM/download.txt delete mode 100644 thirdparty/SharePoint.CSOM/license.txt delete mode 100644 thirdparty/SharePoint.CSOM/licensedata.json create mode 100644 thirdparty/SharePointPnP-Sites-Core/SharePointPnP.Client.dll create mode 100644 thirdparty/SharePointPnP-Sites-Core/download.txt create mode 100644 thirdparty/SharePointPnP-Sites-Core/license.txt create mode 100644 thirdparty/SharePointPnP-Sites-Core/licensedata.json diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 02acad39c..751b9645d 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -27,11 +27,8 @@ - diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 5526f1e24..c230d6dd6 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -29,11 +29,8 @@ - diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index 095cd2540..17c001862 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -31,11 +31,8 @@ - diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 47d22960e..2f6aa80ac 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -43,11 +43,8 @@ - diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index c66a61c44..00d4a3003 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,7 +1,7 @@  - net462 + netstandard2.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -16,22 +16,6 @@ - - - - - - - ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.Portable.dll - - - ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.Runtime.Portable.dll - - - ..\..\..\..\thirdparty\SharePoint.CSOM\Microsoft.SharePoint.Client.Runtime.Windows.dll - - - @@ -40,6 +24,9 @@ + + ..\..\..\..\thirdparty\SharePointPnP-Sites-Core\SharePointPnP.Client.dll + diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 8a9c49f68..99e8fefc8 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -158,20 +158,16 @@ licenses\WindowsAzure\licensedata.json PreserveNewest - - licenses\\SharePointCSOM\download.txt + + licenses\SharePointPnP-Sites-Core\download.txt PreserveNewest - - licenses\\SharePointCSOM\license.txt + + licenses\SharePointPnP-Sites-Core\license.txt PreserveNewest - - licenses\\SharePointCSOM\MicrosoftSharePointClientComponentsEULA.rtf - PreserveNewest - - - licenses\\SharePointCSOM\licensedata.json + + licenses\SharePointPnP-Sites-Core\licensedata.json PreserveNewest diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 26af54c6c..d9cb6c44c 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -48,11 +48,8 @@ - diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 6443055e1..39ed5b4ac 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -44,11 +44,8 @@ - diff --git a/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Portable.dll b/thirdparty/SharePoint.CSOM/Microsoft.SharePoint.Client.Portable.dll deleted file mode 100644 index 84f97332d7355b070ea0b21443539a36bdfbb8d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823032 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
  • ABtDF~`}U?C4G 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 O`j{Aam@fckGeO)95&^j%L^CX4U|?WkVEE6# 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
    Q~NEyTti!3Fg`J0x(}SoOsr;RCXPl`RtN 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

    3u=v~b(pk3aAWGE=?kqreM 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

    ~Z*k=gGU84iJU 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

    U8J;!- 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

    |cgj7iXa7rqqe>fu*(m$M&3h5s% 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󝥈dqU$sCNuXbD-J} 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%0DbNlSX!;m5 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 z
    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∧#Jz3C)xd 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

    Z$Gaa@ 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 literal 0 HcmV?d00001 diff --git a/thirdparty/SharePointPnP-Sites-Core/download.txt b/thirdparty/SharePointPnP-Sites-Core/download.txt new file mode 100644 index 000000000..fe2082d94 --- /dev/null +++ b/thirdparty/SharePointPnP-Sites-Core/download.txt @@ -0,0 +1 @@ +https://github.com/SharePoint/PnP-Sites-Core \ No newline at end of file diff --git a/thirdparty/SharePointPnP-Sites-Core/license.txt b/thirdparty/SharePointPnP-Sites-Core/license.txt new file mode 100644 index 000000000..5d3163081 --- /dev/null +++ b/thirdparty/SharePointPnP-Sites-Core/license.txt @@ -0,0 +1,26 @@ +SharePoint Patterns and Practices (PnP) + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/thirdparty/SharePointPnP-Sites-Core/licensedata.json b/thirdparty/SharePointPnP-Sites-Core/licensedata.json new file mode 100644 index 000000000..86e2a826b --- /dev/null +++ b/thirdparty/SharePointPnP-Sites-Core/licensedata.json @@ -0,0 +1,7 @@ +{ + "name": "SharePointPnP-Sites-Core", + "description": "Office 365 Dev PnP Core component (.NET) targeted for increasing developer productivity with CSOM based solutions. ", + "link": "https://github.com/SharePoint/PnP-Sites-Core", + "license": "license.txt", + "notes": "" +} \ No newline at end of file From 27671e0585a7101d76a0a4dec2173c48c64c3e27 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 10:47:44 +0200 Subject: [PATCH 053/253] fixed Win32SystemEvents --- Duplicati/Server/Duplicati.Server.csproj | 1 + Duplicati/Server/LiveControls.cs | 94 ++++++++++++------------ 2 files changed, 47 insertions(+), 48 deletions(-) diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index d9cb6c44c..e692d87d9 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -19,6 +19,7 @@ + diff --git a/Duplicati/Server/LiveControls.cs b/Duplicati/Server/LiveControls.cs index ce37ccc5b..bc261f57c 100644 --- a/Duplicati/Server/LiveControls.cs +++ b/Duplicati/Server/LiveControls.cs @@ -338,8 +338,7 @@ namespace Duplicati.Server ///

  • private void RegisterHibernateMonitor() { - //TODO-DNC - //Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); + Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); } /// @@ -349,56 +348,55 @@ namespace Duplicati.Server /// The event information private void SystemEvents_PowerModeChanged(object sender, object _e) { - //TODO-DNC - //Microsoft.Win32.PowerModeChangedEventArgs e = _e as Microsoft.Win32.PowerModeChangedEventArgs; - //if (e == null) - // return; + Microsoft.Win32.PowerModeChangedEventArgs e = _e as Microsoft.Win32.PowerModeChangedEventArgs; + if (e == null) + return; - //if (e.Mode == Microsoft.Win32.PowerModes.Suspend) - //{ - // //If we are running, register as being paused due to suspending - // if (this.m_state == LiveControlState.Running) - // { - // this.SetPauseMode(); - // m_pausedForSuspend = true; - // m_suspendMinimumPause = new DateTime(0); - // } - // else - // { - // if (m_waitTimeExpiration.Ticks != 0) - // { - // m_pausedForSuspend = true; - // m_suspendMinimumPause = this.EstimatedPauseEnd; - // ResetTimer(null); - // } + if (e.Mode == Microsoft.Win32.PowerModes.Suspend) + { + //If we are running, register as being paused due to suspending + if (this.m_state == LiveControlState.Running) + { + this.SetPauseMode(); + m_pausedForSuspend = true; + m_suspendMinimumPause = new DateTime(0); + } + else + { + if (m_waitTimeExpiration.Ticks != 0) + { + m_pausedForSuspend = true; + m_suspendMinimumPause = this.EstimatedPauseEnd; + ResetTimer(null); + } - // } - //} - //else if (e.Mode == Microsoft.Win32.PowerModes.Resume) - //{ - // //If we have been been paused due to suspending, we un-pause now - // if (m_pausedForSuspend) - // { - // long delayTicks = (m_suspendMinimumPause - DateTime.Now).Ticks; - - // var appset = Program.DataConnection.ApplicationSettings; - // if (!string.IsNullOrEmpty(appset.StartupDelayDuration) && appset.StartupDelayDuration != "0") - // try { delayTicks = Math.Max(delayTicks, Library.Utility.Timeparser.ParseTimeSpan(appset.StartupDelayDuration).Ticks); } - // catch { } + } + } + else if (e.Mode == Microsoft.Win32.PowerModes.Resume) + { + //If we have been been paused due to suspending, we un-pause now + if (m_pausedForSuspend) + { + long delayTicks = (m_suspendMinimumPause - DateTime.Now).Ticks; - // if (delayTicks > 0) - // { - // this.Pause(TimeSpan.FromTicks(delayTicks)); - // } - // else - // { - // this.Resume(); - // } - // } + var appset = Program.DataConnection.ApplicationSettings; + if (!string.IsNullOrEmpty(appset.StartupDelayDuration) && appset.StartupDelayDuration != "0") + try { delayTicks = Math.Max(delayTicks, Library.Utility.Timeparser.ParseTimeSpan(appset.StartupDelayDuration).Ticks); } + catch { } - // m_pausedForSuspend = false; - // m_suspendMinimumPause = new DateTime(0); - //} + if (delayTicks > 0) + { + this.Pause(TimeSpan.FromTicks(delayTicks)); + } + else + { + this.Resume(); + } + } + + m_pausedForSuspend = false; + m_suspendMinimumPause = new DateTime(0); + } } } From 81ed86ec7d0bd03747e7283e4166fa071c1f3323 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 21:30:22 +0200 Subject: [PATCH 054/253] convert WindowsService --- Duplicati/WindowsService/Program.cs | 37 +- Duplicati/WindowsService/ProjectInstaller.cs | 46 -- .../WindowsService/Properties/AssemblyInfo.cs | 36 -- Duplicati/WindowsService/ServiceControl.cs | 1 - Duplicati/WindowsService/ServiceInstaller.cs | 423 +++++++++++++++++- .../WindowsService/ServiceProcessInstaller.cs | 29 -- .../WindowsService/WindowsService.csproj | 94 +--- 7 files changed, 459 insertions(+), 207 deletions(-) delete mode 100644 Duplicati/WindowsService/ProjectInstaller.cs delete mode 100644 Duplicati/WindowsService/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/WindowsService/ServiceProcessInstaller.cs diff --git a/Duplicati/WindowsService/Program.cs b/Duplicati/WindowsService/Program.cs index f355362a9..ec81c8c37 100644 --- a/Duplicati/WindowsService/Program.cs +++ b/Duplicati/WindowsService/Program.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; -using System.Configuration.Install; +using System.Diagnostics; using System.Linq; using System.Reflection; +using System.Security.Principal; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; @@ -28,13 +29,10 @@ namespace Duplicati.WindowsService Console.WriteLine("This is a Windows Service wrapper tool that hosts the Duplicati.Server.exe process, letting it run as a windows service."); Console.WriteLine("|To run from a console, run the Duplicati.Server.exe instead of Duplicati.WindowsService.exe"); Console.WriteLine(); - Console.WriteLine("Supported commands:"); + Console.WriteLine("Supported commands (Must be run as Administrator):"); Console.WriteLine(" install:\r\n Installs the service"); Console.WriteLine(" uninstall:\r\n Uninstalls the service"); Console.WriteLine(); - Console.WriteLine("Supported options for the install command:"); - Console.WriteLine(" /localuser:\r\n Installs the service as a local user"); - Console.WriteLine(); Console.WriteLine("It is possible to pass arguments to Duplicati.Server.exe, simply add them to the commandline:"); Console.WriteLine(" Duplicati.WindowsService.exe install --webservice-interface=loopback --log-retention=3M"); Console.WriteLine(); @@ -49,13 +47,34 @@ namespace Duplicati.WindowsService // Remove the install and uninstall flags if they are present var commandline = Library.Utility.Utility.WrapAsCommandLine(args.Where(x => !(string.Equals("install", x, StringComparison.OrdinalIgnoreCase) || string.Equals("uninstall", x, StringComparison.OrdinalIgnoreCase)))); var selfexec = Assembly.GetExecutingAssembly().Location; - - + // --uninstall + --install = reinstall if (uninstall) - ManagedInstallerClass.InstallHelper(new string[] { "/u", selfexec }); + { + try + { + ServiceInstaller.DeleteService(ServiceControl.SERVICE_NAME); + Console.WriteLine("Duplicati service delete succeeded."); + } + catch (Exception ex) + { + Console.WriteLine("Duplicati service delete failed. Exception: {0}", ex.Message); + } + } if (install) - ManagedInstallerClass.InstallHelper(new string[] { "/commandline=" + commandline, selfexec }); + { + //The fully qualified path to the service binary file. If the path contains a space, it must be quoted so that it is correctly interpreted. For example, "d:\my share\myservice.exe" should be specified as ""d:\my share\myservice.exe"". + //The path can also include arguments for an auto-start service. For example, "d:\myshare\myservice.exe arg1 arg2". These arguments are passed to the service entry point (typically the main function). + try + { + ServiceInstaller.InstallService(ServiceControl.SERVICE_NAME, ServiceControl.DISPLAY_NAME, "\"" + selfexec + "\"" + " " + commandline); + Console.WriteLine("Duplicati service installation succeeded."); + } + catch (Exception ex) + { + Console.WriteLine("Duplicati service installation failed. Exception: {0}", ex.Message); + } + } } else { diff --git a/Duplicati/WindowsService/ProjectInstaller.cs b/Duplicati/WindowsService/ProjectInstaller.cs deleted file mode 100644 index 4efcc248d..000000000 --- a/Duplicati/WindowsService/ProjectInstaller.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Configuration.Install; -using System.Text; -using System.Linq; -using System.Threading.Tasks; - -namespace Duplicati.WindowsService -{ - [RunInstaller(true)] - public class ProjectInstaller : Installer - { - public ProjectInstaller() - { - this.Installers.AddRange(new Installer[] { - new ServiceProcessInstaller(), - new ServiceInstaller() - }); - } - - public override void Install(IDictionary stateSaver) - { - var commandline = Context.Parameters["commandline"]; - if (!string.IsNullOrWhiteSpace(commandline)) - { - var rawpath = Context.Parameters["assemblypath"]; - var path = new StringBuilder(rawpath); - if (!rawpath.StartsWith("\"", StringComparison.Ordinal) || !rawpath.EndsWith("\"", StringComparison.Ordinal)) - { - path.Insert(0, '"'); - path.Append('"'); - } - - path.Append(" "); - path.Append(commandline); - - Context.Parameters["assemblypath"] = path.ToString(); - } - - base.Install(stateSaver); - } - - } -} diff --git a/Duplicati/WindowsService/Properties/AssemblyInfo.cs b/Duplicati/WindowsService/Properties/AssemblyInfo.cs deleted file mode 100644 index b260b4959..000000000 --- a/Duplicati/WindowsService/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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("WindowsService")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("WindowsService")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[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("bef7af9a-3978-4f90-8592-198bf6ea6c6b")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/WindowsService/ServiceControl.cs b/Duplicati/WindowsService/ServiceControl.cs index 281bc7306..71e78c1b1 100644 --- a/Duplicati/WindowsService/ServiceControl.cs +++ b/Duplicati/WindowsService/ServiceControl.cs @@ -14,7 +14,6 @@ namespace Duplicati.WindowsService private const string LOG_NAME = "Application"; public const string SERVICE_NAME = "Duplicati"; public const string DISPLAY_NAME = "Duplicati service"; - public const string DESCRIPTION = "Runs Duplicati as a service"; private readonly System.Diagnostics.EventLog m_eventLog; diff --git a/Duplicati/WindowsService/ServiceInstaller.cs b/Duplicati/WindowsService/ServiceInstaller.cs index 724106c17..25794e8bd 100644 --- a/Duplicati/WindowsService/ServiceInstaller.cs +++ b/Duplicati/WindowsService/ServiceInstaller.cs @@ -1,20 +1,425 @@ using System; using System.Collections.Generic; -using System.Linq; +using System.Runtime.InteropServices; using System.Text; -using System.Threading.Tasks; namespace Duplicati.WindowsService { - //[System.ComponentModel.RunInstaller(true)] - public class ServiceInstaller : System.ServiceProcess.ServiceInstaller + public class ServiceInstaller { - public ServiceInstaller() + [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)] + private static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess); + + [DllImport("advapi32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CloseServiceHandle(IntPtr hSCObject); + + [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern IntPtr OpenService(IntPtr hSCManager, string lpServiceName, uint dwDesiredAccess); + + [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern IntPtr CreateService(IntPtr hSCManager, string lpServiceName, string lpDisplayName, uint dwDesiredAccess, uint dwServiceType, + uint dwStartType, uint dwErrorControl, string lpBinaryPathName, string lpLoadOrderGroup, string lpdwTagId, string lpDependencies, string lpServiceStartName, + string lpPassword); + + [DllImport("advapi32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool DeleteService(IntPtr hService); + + /// + /// Access to the service. Before granting the requested access, the + /// system checks the access token of the calling process. + /// + [Flags] + private enum SERVICE_ACCESS : uint { - this.StartType = System.ServiceProcess.ServiceStartMode.Automatic; - this.ServiceName = ServiceControl.SERVICE_NAME; - this.DisplayName = ServiceControl.DISPLAY_NAME; - this.Description = ServiceControl.DESCRIPTION; + /// + /// Required to call the QueryServiceConfig and + /// QueryServiceConfig2 functions to query the service configuration. + /// + SERVICE_QUERY_CONFIG = 0x00001, + + /// + /// Required to call the ChangeServiceConfig or ChangeServiceConfig2 function + /// to change the service configuration. Because this grants the caller + /// the right to change the executable file that the system runs, + /// it should be granted only to administrators. + /// + SERVICE_CHANGE_CONFIG = 0x00002, + + /// + /// Required to call the QueryServiceStatusEx function to ask the service + /// control manager about the status of the service. + /// + SERVICE_QUERY_STATUS = 0x00004, + + /// + /// Required to call the EnumDependentServices function to enumerate all + /// the services dependent on the service. + /// + SERVICE_ENUMERATE_DEPENDENTS = 0x00008, + + /// + /// Required to call the StartService function to start the service. + /// + SERVICE_START = 0x00010, + + /// + /// Required to call the ControlService function to stop the service. + /// + SERVICE_STOP = 0x00020, + + /// + /// Required to call the ControlService function to pause or continue + /// the service. + /// + SERVICE_PAUSE_CONTINUE = 0x00040, + + /// + /// Required to call the EnumDependentServices function to enumerate all + /// the services dependent on the service. + /// + SERVICE_INTERROGATE = 0x00080, + + /// + /// Required to call the ControlService function to specify a user-defined + /// control code. + /// + SERVICE_USER_DEFINED_CONTROL = 0x00100, + + /// + /// Includes STANDARD_RIGHTS_REQUIRED in addition to all access rights in this table. + /// + SERVICE_ALL_ACCESS = (ACCESS_MASK.STANDARD_RIGHTS_REQUIRED | + SERVICE_QUERY_CONFIG | + SERVICE_CHANGE_CONFIG | + SERVICE_QUERY_STATUS | + SERVICE_ENUMERATE_DEPENDENTS | + SERVICE_START | + SERVICE_STOP | + SERVICE_PAUSE_CONTINUE | + SERVICE_INTERROGATE | + SERVICE_USER_DEFINED_CONTROL), + + GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ | + SERVICE_QUERY_CONFIG | + SERVICE_QUERY_STATUS | + SERVICE_INTERROGATE | + SERVICE_ENUMERATE_DEPENDENTS, + + GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE | + SERVICE_CHANGE_CONFIG, + + GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE | + SERVICE_START | + SERVICE_STOP | + SERVICE_PAUSE_CONTINUE | + SERVICE_USER_DEFINED_CONTROL, + + /// + /// Required to call the QueryServiceObjectSecurity or + /// SetServiceObjectSecurity function to access the SACL. The proper + /// way to obtain this access is to enable the SE_SECURITY_NAME + /// privilege in the caller's current access token, open the handle + /// for ACCESS_SYSTEM_SECURITY access, and then disable the privilege. + /// + ACCESS_SYSTEM_SECURITY = ACCESS_MASK.ACCESS_SYSTEM_SECURITY, + + /// + /// Required to call the DeleteService function to delete the service. + /// + DELETE = ACCESS_MASK.DELETE, + + /// + /// Required to call the QueryServiceObjectSecurity function to query + /// the security descriptor of the service object. + /// + READ_CONTROL = ACCESS_MASK.READ_CONTROL, + + /// + /// Required to call the SetServiceObjectSecurity function to modify + /// the Dacl member of the service object's security descriptor. + /// + WRITE_DAC = ACCESS_MASK.WRITE_DAC, + + /// + /// Required to call the SetServiceObjectSecurity function to modify + /// the Owner and Group members of the service object's security + /// descriptor. + /// + WRITE_OWNER = ACCESS_MASK.WRITE_OWNER, + } + + [Flags] + private enum ACCESS_MASK : uint + { + DELETE = 0x00010000, + READ_CONTROL = 0x00020000, + WRITE_DAC = 0x00040000, + WRITE_OWNER = 0x00080000, + SYNCHRONIZE = 0x00100000, + + STANDARD_RIGHTS_REQUIRED = 0x000F0000, + + STANDARD_RIGHTS_READ = 0x00020000, + STANDARD_RIGHTS_WRITE = 0x00020000, + STANDARD_RIGHTS_EXECUTE = 0x00020000, + + STANDARD_RIGHTS_ALL = 0x001F0000, + + SPECIFIC_RIGHTS_ALL = 0x0000FFFF, + + ACCESS_SYSTEM_SECURITY = 0x01000000, + + MAXIMUM_ALLOWED = 0x02000000, + + GENERIC_READ = 0x80000000, + GENERIC_WRITE = 0x40000000, + GENERIC_EXECUTE = 0x20000000, + GENERIC_ALL = 0x10000000, + + DESKTOP_READOBJECTS = 0x00000001, + DESKTOP_CREATEWINDOW = 0x00000002, + DESKTOP_CREATEMENU = 0x00000004, + DESKTOP_HOOKCONTROL = 0x00000008, + DESKTOP_JOURNALRECORD = 0x00000010, + DESKTOP_JOURNALPLAYBACK = 0x00000020, + DESKTOP_ENUMERATE = 0x00000040, + DESKTOP_WRITEOBJECTS = 0x00000080, + DESKTOP_SWITCHDESKTOP = 0x00000100, + + WINSTA_ENUMDESKTOPS = 0x00000001, + WINSTA_READATTRIBUTES = 0x00000002, + WINSTA_ACCESSCLIPBOARD = 0x00000004, + WINSTA_CREATEDESKTOP = 0x00000008, + WINSTA_WRITEATTRIBUTES = 0x00000010, + WINSTA_ACCESSGLOBALATOMS = 0x00000020, + WINSTA_EXITWINDOWS = 0x00000040, + WINSTA_ENUMERATE = 0x00000100, + WINSTA_READSCREEN = 0x00000200, + + WINSTA_ALL_ACCESS = 0x0000037F + } + + /// + /// Service types. + /// + [Flags] + private enum SERVICE_TYPE : uint + { + /// + /// Driver service. + /// + SERVICE_KERNEL_DRIVER = 0x00000001, + + /// + /// File system driver service. + /// + SERVICE_FILE_SYSTEM_DRIVER = 0x00000002, + + /// + /// Service that runs in its own process. + /// + SERVICE_WIN32_OWN_PROCESS = 0x00000010, + + /// + /// Service that shares a process with one or more other services. + /// + SERVICE_WIN32_SHARE_PROCESS = 0x00000020, + + /// + /// The service can interact with the desktop. + /// + SERVICE_INTERACTIVE_PROCESS = 0x00000100, + } + + /// + /// Service start options + /// + private enum SERVICE_START : uint + { + /// + /// A device driver started by the system loader. This value is valid + /// only for driver services. + /// + SERVICE_BOOT_START = 0x00000000, + + /// + /// A device driver started by the IoInitSystem function. This value + /// is valid only for driver services. + /// + SERVICE_SYSTEM_START = 0x00000001, + + /// + /// A service started automatically by the service control manager + /// during system startup. For more information, see Automatically + /// Starting Services. + /// + SERVICE_AUTO_START = 0x00000002, + + /// + /// A service started by the service control manager when a process + /// calls the StartService function. For more information, see + /// Starting Services on Demand. + /// + SERVICE_DEMAND_START = 0x00000003, + + /// + /// A service that cannot be started. Attempts to start the service + /// result in the error code ERROR_SERVICE_DISABLED. + /// + SERVICE_DISABLED = 0x00000004, + } + + /// + /// Severity of the error, and action taken, if this service fails + /// to start. + /// + private enum SERVICE_ERROR + { + /// + /// The startup program ignores the error and continues the startup + /// operation. + /// + SERVICE_ERROR_IGNORE = 0x00000000, + + /// + /// The startup program logs the error in the event log but continues + /// the startup operation. + /// + SERVICE_ERROR_NORMAL = 0x00000001, + + /// + /// The startup program logs the error in the event log. If the + /// last-known-good configuration is being started, the startup + /// operation continues. Otherwise, the system is restarted with + /// the last-known-good configuration. + /// + SERVICE_ERROR_SEVERE = 0x00000002, + + /// + /// The startup program logs the error in the event log, if possible. + /// If the last-known-good configuration is being started, the startup + /// operation fails. Otherwise, the system is restarted with the + /// last-known good configuration. + /// + SERVICE_ERROR_CRITICAL = 0x00000003, + } + + [Flags] + private enum SCM_ACCESS : uint + { + /// + /// Required to connect to the service control manager. + /// + SC_MANAGER_CONNECT = 0x00001, + + /// + /// Required to call the CreateService function to create a service + /// object and add it to the database. + /// + SC_MANAGER_CREATE_SERVICE = 0x00002, + + /// + /// Required to call the EnumServicesStatusEx function to list the + /// services that are in the database. + /// + SC_MANAGER_ENUMERATE_SERVICE = 0x00004, + + /// + /// Required to call the LockServiceDatabase function to acquire a + /// lock on the database. + /// + SC_MANAGER_LOCK = 0x00008, + + /// + /// Required to call the QueryServiceLockStatus function to retrieve + /// the lock status information for the database. + /// + SC_MANAGER_QUERY_LOCK_STATUS = 0x00010, + + /// + /// Required to call the NotifyBootConfigStatus function. + /// + SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00020, + + /// + /// Includes STANDARD_RIGHTS_REQUIRED, in addition to all access + /// rights in this table. + /// + SC_MANAGER_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED | + SC_MANAGER_CONNECT | + SC_MANAGER_CREATE_SERVICE | + SC_MANAGER_ENUMERATE_SERVICE | + SC_MANAGER_LOCK | + SC_MANAGER_QUERY_LOCK_STATUS | + SC_MANAGER_MODIFY_BOOT_CONFIG, + + GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ | + SC_MANAGER_ENUMERATE_SERVICE | + SC_MANAGER_QUERY_LOCK_STATUS, + + GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE | + SC_MANAGER_CREATE_SERVICE | + SC_MANAGER_MODIFY_BOOT_CONFIG, + + GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE | + SC_MANAGER_CONNECT | SC_MANAGER_LOCK, + + GENERIC_ALL = SC_MANAGER_ALL_ACCESS, + } + + public static void InstallService(string ServiceName, string DisplayName, string Path) + { + var scMgrHandle = OpenSCManager(null, null, (uint)SCM_ACCESS.SC_MANAGER_ALL_ACCESS); + + try + { + if (scMgrHandle == IntPtr.Zero) + throw new Exception($"Win32 error { Marshal.GetLastWin32Error().ToString() } during install service (OpenSCManager)"); + + var serviceHandle = CreateService(scMgrHandle, ServiceName, DisplayName, (uint)SERVICE_ACCESS.SERVICE_ALL_ACCESS, (uint)SERVICE_TYPE.SERVICE_WIN32_OWN_PROCESS, + (uint)SERVICE_START.SERVICE_AUTO_START, (uint)SERVICE_ERROR.SERVICE_ERROR_NORMAL, Path, null, null, null, null, null); + + if (serviceHandle == IntPtr.Zero) + throw new Exception($"Win32 error { Marshal.GetLastWin32Error().ToString() } during install service (CreateService)"); + + CloseServiceHandle(serviceHandle); + } + finally + { + CloseServiceHandle(scMgrHandle); + } + } + + public static void DeleteService(string ServiceName) + { + var scMgrHandle = OpenSCManager(null, null, (uint)SCM_ACCESS.SC_MANAGER_ALL_ACCESS); + + try + { + if (scMgrHandle == IntPtr.Zero) + throw new Exception($"Win32 error { Marshal.GetLastWin32Error().ToString() } during delete service (OpenSCManager)"); + + var serviceHandle = OpenService(scMgrHandle, ServiceName, (uint)SERVICE_ACCESS.SERVICE_ALL_ACCESS); + + if (serviceHandle == IntPtr.Zero) + throw new Exception($"Win32 error { Marshal.GetLastWin32Error().ToString() } during delete service (OpenService)"); + + try + { + if (DeleteService(serviceHandle) == false) + throw new Exception($"Win32 error { Marshal.GetLastWin32Error().ToString() } during delete service (DeleteService)"); + } + finally + { + CloseServiceHandle(serviceHandle); + } + } + finally + { + CloseServiceHandle(scMgrHandle); + } } } } diff --git a/Duplicati/WindowsService/ServiceProcessInstaller.cs b/Duplicati/WindowsService/ServiceProcessInstaller.cs deleted file mode 100644 index 9b76e3407..000000000 --- a/Duplicati/WindowsService/ServiceProcessInstaller.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Duplicati.WindowsService -{ - public class ServiceProcessInstaller : System.ServiceProcess.ServiceProcessInstaller - { - public ServiceProcessInstaller() - { - this.Account = System.ServiceProcess.ServiceAccount.LocalSystem; - } - - public override void Install(System.Collections.IDictionary stateSaver) - { - var localuser = Context.Parameters["localuser"]; - if (localuser != null) - { - this.Account = System.ServiceProcess.ServiceAccount.User; - this.Username = localuser; - } - - - base.Install(stateSaver); - } - } -} diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 0b09877fc..110371e10 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -1,91 +1,31 @@ - - - + + - Debug - AnyCPU - {BEF7AF9A-3978-4F90-8592-198BF6EA6C6B} + netstandard2.0 + 2.0.0.7 Exe - False - Properties - Duplicati.WindowsService + LGPL, Copyright © Duplicati Team 2015 + Duplicati.WindowsService + Duplicati Team + Duplicati Team + WindowsService for Duplicati + WindowsService Duplicati.WindowsService - v4.6.2 - 512 - true - - false - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - + - - - - - - - - - - - + + + Runner.cs - - - Component - - - - Component - - - Component - - - Component - + - - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - + - - + \ No newline at end of file From c482424b53630d0ddf1316d0f749e2de523ae745 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 21:38:52 +0200 Subject: [PATCH 055/253] unnecessary deps --- Duplicati/Server/Duplicati.Server.csproj | 2 -- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 2 -- 2 files changed, 4 deletions(-) diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index e692d87d9..f4a424997 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -77,8 +77,6 @@ - - diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 39ed5b4ac..399f3224c 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -71,8 +71,6 @@ - - From 84de33bd5f632ecb0b3fb89d2f0410f22d3d15cf Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 21:47:20 +0200 Subject: [PATCH 056/253] clean deps --- .../SharePoint/Duplicati.Library.Backend.SharePoint.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index 00d4a3003..b1b16f8d6 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -27,7 +27,6 @@ ..\..\..\..\thirdparty\SharePointPnP-Sites-Core\SharePointPnP.Client.dll - \ No newline at end of file From e7b1df98def5d535ce386bf5ea70b76b09a74a6e Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 22:08:05 +0200 Subject: [PATCH 057/253] first attempt to convert TrayIcon --- .../Duplicati.GUI.TrayIcon.csproj | 332 ++---------------- .../GUI/Duplicati.GUI.TrayIcon/Info.plist | 30 -- .../Properties/AssemblyInfo.cs | 36 -- .../Properties/Settings.Designer.cs | 30 -- .../Properties/Settings.settings | 7 - .../Duplicati.GUI.TrayIcon/packages.config | 5 - 6 files changed, 31 insertions(+), 409 deletions(-) delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Info.plist delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.Designer.cs delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.settings delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index bc9fb238a..f140bafcc 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,82 +1,40 @@ - - + + - Debug - AnyCPU - {17566860-3D98-4604-AA5B-47661F75609F} - WinExe - Properties - Duplicati.GUI.TrayIcon + netcoreapp3.0 + 2.0.0.7 + Exe + LGPL, Copyright ? Duplicati Team 2015 + Duplicati.GUI.TrayIcon + Duplicati Team + Duplicati Team + The Duplicati Tray implementation + Server Duplicati.GUI.TrayIcon - 512 - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true + Duplicati.GUI.TrayIcon Duplicati.ico - v4.6.2 - - false - true - - - bin\Debug - full - true - true - true - 4 - false - DEBUG - true - - - - - - false - - - bin\Release - false - none - true - true - true - 4 - false - - Duplicati.GUI.TrayIcon.Program - - + + + + + PreserveNewest + + + OSXTrayHost\rumps.py + PreserveNewest + + + + + + + + - - ..\..\..\packages\CoCoL.1.6.1\lib\netstandard2.0\CoCoL.dll - - - ..\..\..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll - - - - - - ..\..\..\thirdparty\appindicator-sharp\appindicator-sharp.dll - False ..\..\..\thirdparty\appindicator-sharp\gdk-sharp.dll @@ -91,328 +49,100 @@ ..\..\..\thirdparty\notify-sharp\notify-sharp.dll - False - - - - - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - - - - - - - CocoaRunner.cs - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - - - Designer - + - {1BFAE226-8364-4086-825C-BB83F6F3EE4C} - Duplicati.Library.Backend.CloudFiles - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} - Duplicati.Library.Backend.AzureBlob - {FC9B7611-836F-4127-8B44-A7C31F506807} - Duplicati.Library.Backend.File - {F61679A9-E5DE-468A-B5A4-05F92D0143D2} - Duplicati.Library.Backend.FTP - {2cd5dbc3-3da6-432d-ba97-f0b8d24501c2} - Duplicati.Library.Backend.Jottacloud - {d4c37c33-5e73-4b56-b2c3-dc4a6baa36bb} - Duplicati.Library.OAuthHelper - {851a1cb8-3ceb-41b4-956f-34d760d2a8e5} - Duplicati.Library.Backend.Rclone - {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} - Duplicati.Library.Backend.S3 - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A} - Duplicati.Library.Backend.SharePoint - {FF2BF37C-E502-4C98-BEA0-701671DDFA08} - Duplicati.Library.Backend.SSHv2 - {C0270709-2A40-43B5-8CF1-69581B9FA2A1} - Duplicati.Library.Backend.TahoeLAFS - {BAE27510-8B5D-44B2-B33E-372A98908041} - Duplicati.Library.Backend.WEBDAV - {d63e53e4-a458-4c2f-914d-92f715f58acf} - Duplicati.Library.Common - {19E661D2-C5DA-4F35-B3EE-7586E5734B5F} - Duplicati.Server - {33FD1D24-C28F-4C71-933F-98F1586EA76C} - Duplicati.Server.Serialization - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Utility - {C5899F45-B0FF-483C-9D38-24A9FCAAB237} - Duplicati.Library.Interface - {81765A64-3661-4E3E-B850-2F6F87A51F74} - Duplicati.CommandLine - {E7280DCA-7776-4A73-B9B5-41FD77FC8799} - Duplicati.CommandLine.BackendTester - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11} - Duplicati.CommandLine.BackendTool - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Duplicati.Library.Compression - {2C838169-B187-4B09-8768-1C24C2521C8D} - Duplicati.Library.SQLiteHelper - {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} - Duplicati.Library.DynamicLoader - {94484FDB-2EFA-4CF0-9BE6-A561157B4F87} - Duplicati.Library.Encryption - {D10A5FC0-11B4-4E70-86AA-8AEA52BD9798} - Duplicati.Library.Logging - {10D2D1B7-C664-41D8-9B3A-00040C3D421B} - Duplicati.Library.Main - {52826615-7964-47FE-B4B3-1B2DBDF605B9} - Duplicati.Library.Modules.Builtin - {D63E53E4-A458-4C2F-914D-92F715F58ACE} - Duplicati.Library.Snapshots - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99} - Duplicati.License - {B68F2214-951F-4F78-8488-66E1ED3F50BF} - Duplicati.Library.Localization - {7E119745-1F62-43F0-936C-F312A1912C0B} - Duplicati.Library.AutoUpdater - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} - Duplicati.Library.Backend.OneDrive - - - {E93F3DE2-FF3A-4709-96A3-8190AA14FA25} - Duplicati.Service - {5489181D-950C-44AF-873C-45EB0A3B6BD2} - Duplicati.Library.Backend.GoogleServices - {D9E4E686-423C-48EC-A392-404E7C00860C} - Duplicati.Library.Backend.OpenStack - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} - Duplicati.Library.Backend.HubiC - {4A010589-76E6-4F05-A5C4-4598D5DF11F8} - Duplicati.CommandLine.RecoveryTool - {08D7E42D-285C-4010-9881-986125FE2F3E} - Duplicati.Library.Backend.AmazonCloudDrive - {61C43D61-4368-4942-84A3-1EB623F4EF2A} - Duplicati.Library.Backend.Backblaze - {6643A5AE-AB38-453F-ADCE-408E35A81A83} - Duplicati.Library.Backend.Mega - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} - Duplicati.Library.Backend.Box - {BB014EA5-CE2C-4444-8D30-38983A0E8553} - Duplicati.Library.UsageReporter - - - {bef7af9a-3978-4f90-8592-198bf6ea6c6b} - WindowsService - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F} - Duplicati.Library.Backend.AlternativeFTP - {32a74526-3e5f-413a-8cb4-1efdad4c8b91} - Duplicati.Library.Backend.Sia - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493} - Duplicati.Library.Backend.Dropbox - {0797AA22-C5DD-4950-BB60-34765AB8C6DD} - Duplicati.Tools - - - False - Microsoft .NET Framework 4 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - OSXTrayHost\rumps.py - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + \ No newline at end of file diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Info.plist b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Info.plist deleted file mode 100644 index 6f1f9676b..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - LSApplicationCategoryType - public.app-category.productivity - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.duplicati.Duplicati - CFBundleDisplayName - Duplicati - CFBundleName - Duplicati - CFBundleExecutable - Duplicati - CFBundleIconFile - Duplicati.icns - CFBundleInfoDictionaryVersion - 6.0 - CFBundleShortVersionString - 1.3 - CFBundleVersion - 1.3.0.973 - CFBundleSignature - hand - NSAppleScriptEnabled - NO - - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/AssemblyInfo.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/AssemblyInfo.cs deleted file mode 100644 index 9e1a1180a..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -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")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.GUI.TrayIcon")] -[assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] -[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("33531def-3214-4568-bfb0-0bdeabe4a798")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyVersion("2.0.0.7")] -[assembly: AssemblyFileVersion("2.0.0.7")] diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.Designer.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.Designer.cs deleted file mode 100644 index 828ce2482..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.225 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Duplicati.GUI.TrayIcon.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.settings b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.settings deleted file mode 100644 index abf36c5d3..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config b/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config deleted file mode 100644 index b9e1d2970..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file From ea7cbfa88959ed8b5d91e12e293984f6e38562b8 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Wed, 1 May 2019 22:29:21 +0200 Subject: [PATCH 058/253] fixed packageid --- .../GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index f140bafcc..26f88f329 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -9,7 +9,7 @@ Duplicati Team Duplicati Team The Duplicati Tray implementation - Server + TrayIcon Duplicati.GUI.TrayIcon Duplicati.GUI.TrayIcon Duplicati.ico From 13d723a026efc84aae673d749baa74039854091f Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Sat, 4 May 2019 00:03:52 +0200 Subject: [PATCH 059/253] Full port of TrayIcon to pure Win32 --- .../AppIndicatorRunner.cs | 2 +- .../GUI/Duplicati.GUI.TrayIcon/CocoaRunner.cs | 2 +- .../Duplicati.GUI.TrayIcon.csproj | 16 +- .../GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs | 2 +- .../GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs | 91 ---- .../GUI/Duplicati.GUI.TrayIcon/Program.cs | 4 +- .../GUI/Duplicati.GUI.TrayIcon/RumpsRunner.cs | 2 +- .../OSXIcons}/normal-error.png | Bin .../OSXIcons}/normal-pause.png | Bin .../OSXIcons}/normal-running.png | Bin .../OSXIcons}/normal.png | Bin .../SVGIcons/dark/context_menu_open.svg | 0 .../SVGIcons/dark/context_menu_pause.svg | 0 .../SVGIcons/dark/context_menu_quit.svg | 0 .../SVGIcons/dark/context_menu_resume.svg | 0 .../SVGIcons/dark/normal-error.svg | 0 .../SVGIcons/dark/normal-pause.svg | 0 .../SVGIcons/dark/normal-running.svg | 0 .../SVGIcons/dark/normal.svg | 0 .../SVGIcons/light/context_menu_open.svg | 0 .../SVGIcons/light/context_menu_pause.svg | 0 .../SVGIcons/light/context_menu_quit.svg | 0 .../SVGIcons/light/context_menu_resume.svg | 0 .../SVGIcons/light/normal-error.svg | 0 .../SVGIcons/light/normal-pause.svg | 0 .../SVGIcons/light/normal-running.svg | 0 .../SVGIcons/light/normal.svg | 0 .../WinIcons}/TrayNormal.ico | Bin .../WinIcons}/TrayNormalError.ico | Bin .../WinIcons}/TrayNormalPause.ico | Bin .../WinIcons}/TrayWorking.ico | Bin .../WinIcons}/context_menu_open.ico | Bin .../WinIcons}/context_menu_pause.ico | Bin .../WinIcons}/context_menu_play.ico | Bin .../WinIcons}/context_menu_quit.ico | Bin .../Duplicati.GUI.TrayIcon/Win32IconLoader.cs | 93 ++++ .../GUI/Duplicati.GUI.TrayIcon/Win32Menu.cs | 329 +++++++++++++ .../Duplicati.GUI.TrayIcon/Win32NotifyIcon.cs | 170 +++++++ .../GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs | 166 +++++++ .../GUI/Duplicati.GUI.TrayIcon/Win32Window.cs | 452 ++++++++++++++++++ .../Duplicati.GUI.TrayIcon/WinFormsRunner.cs | 263 ---------- 41 files changed, 1227 insertions(+), 365 deletions(-) delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{OSX Icons => TrayResources/OSXIcons}/normal-error.png (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{OSX Icons => TrayResources/OSXIcons}/normal-pause.png (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{OSX Icons => TrayResources/OSXIcons}/normal-running.png (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{OSX Icons => TrayResources/OSXIcons}/normal.png (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/context_menu_open.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/context_menu_pause.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/context_menu_quit.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/context_menu_resume.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/normal-error.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/normal-pause.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/normal-running.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/dark/normal.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/context_menu_open.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/context_menu_pause.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/context_menu_quit.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/context_menu_resume.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/normal-error.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/normal-pause.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/normal-running.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{ => TrayResources}/SVGIcons/light/normal.svg (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/TrayNormal.ico (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/TrayNormalError.ico (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/TrayNormalPause.ico (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/TrayWorking.ico (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/context_menu_open.ico (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/context_menu_pause.ico (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/context_menu_play.ico (100%) rename Duplicati/GUI/Duplicati.GUI.TrayIcon/{Resources => TrayResources/WinIcons}/context_menu_quit.ico (100%) create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Menu.cs create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32NotifyIcon.cs create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/WinFormsRunner.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs index 5bd571d6a..3cb7339e5 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs @@ -34,7 +34,7 @@ namespace Duplicati.GUI.TrayIcon protected override void CreateTrayInstance() { - m_themeFolder = SystemIO.IO_OS.PathCombine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "SVGIcons"); + m_themeFolder = SystemIO.IO_OS.PathCombine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), @"TrayResources\SVGIcons"); m_themeFolder = SystemIO.IO_OS.PathCombine(m_themeFolder, "dark"); m_appIndicator = new ApplicationIndicator("duplicati", "normal", Category.ApplicationStatus, m_themeFolder); diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/CocoaRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/CocoaRunner.cs index 3dc156deb..413296fa2 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/CocoaRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/CocoaRunner.cs @@ -81,7 +81,7 @@ namespace Duplicati.GUI.TrayIcon } private static readonly System.Reflection.Assembly ASSEMBLY = System.Reflection.Assembly.GetExecutingAssembly(); - private static readonly string ICON_PATH = ASSEMBLY.GetName().Name + ".OSX_Icons."; + private static readonly string ICON_PATH = ASSEMBLY.GetName().Name + ".TrayResources.OSXIcons."; private static readonly string ICON_NORMAL = ICON_PATH + "normal.png"; private static readonly string ICON_PAUSED = ICON_PATH + "normal-pause.png"; diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 26f88f329..be6f2d4bc 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,7 +1,7 @@ - + - netcoreapp3.0 + netstandard2.0 2.0.0.7 Exe LGPL, Copyright ? Duplicati Team 2015 @@ -17,8 +17,10 @@ - - + + PreserveNewest + + PreserveNewest @@ -26,7 +28,11 @@ PreserveNewest - + + + + + diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs index 3110fc531..a1272f8db 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs @@ -32,7 +32,7 @@ namespace Duplicati.GUI.TrayIcon /// static GtkRunner() { - m_svgfolder = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "SVGIcons"); + m_svgfolder = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), @"TrayResources\SVGIcons"); m_svgfolder = System.IO.Path.Combine(m_svgfolder, "dark"); Gtk.Application.Init(); diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs deleted file mode 100644 index be35ef172..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Drawing; -using System.Collections.Generic; - -namespace Duplicati.GUI.TrayIcon -{ - public static class ImageLoader - { - private static readonly System.Reflection.Assembly ASSEMBLY = System.Reflection.Assembly.GetExecutingAssembly(); - private static readonly string PREFIX = ASSEMBLY.GetName().Name + "."; - private static readonly Dictionary BITMAPS = new Dictionary(); - private static readonly Dictionary ICONS = new Dictionary(); - private static readonly object LOCK = new object(); - - private static Bitmap LoadImage(string filename) - { - Bitmap bmp; - if (BITMAPS.TryGetValue(filename, out bmp)) - return bmp; - - lock(LOCK) - if (!BITMAPS.TryGetValue(filename, out bmp)) - return BITMAPS[filename] = (Bitmap)Image.FromStream(ASSEMBLY.GetManifestResourceStream(PREFIX + filename)); - - return BITMAPS[filename]; - } - - public static Icon LoadIcon(string filename) - { - return LoadIcon(filename, new Size(32, 32)); - } - - public static Icon LoadIcon(string filename, Size size) - { - Icon ico; - - var cachename = string.Format("{0};{1}x{2}", filename, size.Width, size.Height); - - if (ICONS.TryGetValue(cachename, out ico)) - return ico; - - if (!filename.EndsWith(".ico", StringComparison.OrdinalIgnoreCase)) - using(var ms = new System.IO.MemoryStream()) - { - Icon ic; - using(var bmp = LoadImage(filename)) - ic = Icon.FromHandle(bmp.GetHicon()); - - ms.Position = 0; - lock(LOCK) - if (!ICONS.TryGetValue(cachename, out ico)) - return ICONS[cachename] = ic; - } - - lock(LOCK) - if (!ICONS.TryGetValue(cachename, out ico)) - return ICONS[cachename] = new Icon(ASSEMBLY.GetManifestResourceStream(PREFIX + filename), size); - - return ICONS[cachename]; - } - - public const string NormalIcon = "Resources.TrayNormal.ico"; - public const string ErrorIcon = "Resources.TrayNormalError.ico"; - public const string PauseIcon = "Resources.TrayNormalPause.ico"; - public const string WorkingIcon = "Resources.TrayWorking.ico"; - - public static Bitmap Pause { get { return LoadImage("Resources.context_menu_pause.ico"); } } - public static Bitmap Play { get { return LoadImage("Resources.context_menu_play.ico"); } } - public static Bitmap CloseMenuIcon { get { return LoadImage("Resources.context_menu_quit.ico"); } } - public static Bitmap StatusMenuIcon { get { return LoadImage("Resources.context_menu_open.ico"); } } - - } -} - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs index 411d668f4..851cc5927 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs @@ -319,7 +319,7 @@ namespace Duplicati.GUI.TrayIcon // attempt to load non-existing assemblies [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private static TrayIconBase GetWinformsInstance() { return new Windows.WinFormsRunner(); } + private static TrayIconBase GetWinformsInstance() { return new Win32Runner(); } #if __MonoCS__ || __WindowsGTK__ || ENABLE_GTK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetGtkInstance() { return new GtkRunner(); } @@ -350,7 +350,7 @@ namespace Duplicati.GUI.TrayIcon [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static bool TryGetWinforms() { - return typeof(System.Windows.Forms.NotifyIcon) != null; + return Platform.IsClientWindows; } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/RumpsRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/RumpsRunner.cs index de7365d67..991e68f86 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/RumpsRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/RumpsRunner.cs @@ -96,7 +96,7 @@ namespace Duplicati.GUI.TrayIcon } private static readonly System.Reflection.Assembly ASSEMBLY = System.Reflection.Assembly.GetExecutingAssembly(); - private static readonly string ICON_PATH = ASSEMBLY.GetName().Name + ".OSX_Icons."; + private static readonly string ICON_PATH = ASSEMBLY.GetName().Name + ".TrayResources.OSXIcons."; private static readonly string ICON_NORMAL = ICON_PATH + "normal.png"; private static readonly string ICON_PAUSED = ICON_PATH + "normal-pause.png"; diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal-error.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal-error.png similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal-error.png rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal-error.png diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal-pause.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal-pause.png similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal-pause.png rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal-pause.png diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal-running.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal-running.png similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal-running.png rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal-running.png diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal.png similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/OSX Icons/normal.png rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/OSXIcons/normal.png diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_open.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_open.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_open.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_open.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_pause.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_pause.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_pause.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_pause.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_quit.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_quit.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_quit.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_quit.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_resume.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_resume.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/context_menu_resume.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/context_menu_resume.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal-error.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal-error.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal-error.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal-error.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal-pause.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal-pause.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal-pause.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal-pause.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal-running.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal-running.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal-running.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal-running.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/normal.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/dark/normal.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_open.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_open.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_open.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_open.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_pause.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_pause.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_pause.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_pause.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_quit.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_quit.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_quit.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_quit.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_resume.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_resume.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/context_menu_resume.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/context_menu_resume.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal-error.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal-error.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal-error.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal-error.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal-pause.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal-pause.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal-pause.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal-pause.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal-running.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal-running.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal-running.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal-running.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal.svg b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal.svg similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/normal.svg rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/SVGIcons/light/normal.svg diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayNormal.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayNormal.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayNormal.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayNormal.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayNormalError.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayNormalError.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayNormalError.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayNormalError.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayNormalPause.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayNormalPause.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayNormalPause.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayNormalPause.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayWorking.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayWorking.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/TrayWorking.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/TrayWorking.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_open.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_open.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_open.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_open.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_pause.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_pause.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_pause.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_pause.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_play.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_play.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_play.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_play.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_quit.ico b/Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_quit.ico similarity index 100% rename from Duplicati/GUI/Duplicati.GUI.TrayIcon/Resources/context_menu_quit.ico rename to Duplicati/GUI/Duplicati.GUI.TrayIcon/TrayResources/WinIcons/context_menu_quit.ico diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs new file mode 100644 index 000000000..cf984827d --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs @@ -0,0 +1,93 @@ +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Drawing; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Microsoft.Win32.SafeHandles; +using System.Runtime.ConstrainedExecution; +using System.IO; + +namespace Duplicati.GUI.TrayIcon +{ + public class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid + { + [DllImport("user32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + private static extern bool DestroyIcon(IntPtr hIcon); + + public SafeIconHandle(IntPtr hIcon) : base(true) + { + SetHandle(hIcon); + } + + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + protected override bool ReleaseHandle() + { + return DestroyIcon(handle); + } + } + public static class Win32IconLoader + { + private const uint IMAGE_ICON = 1; + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern IntPtr LoadImage(IntPtr hInstance, string lpszName, uint uType, int cxDesired, int cyDesired, LR fuLoad); + + [Flags] + private enum LR : uint + { + LR_DEFAULTCOLOR = 0x00000000, + LR_MONOCHROME = 0x00000001, + LR_COLOR = 0x00000002, + LR_COPYRETURNORG = 0x00000004, + LR_COPYDELETEORG = 0x00000008, + LR_LOADFROMFILE = 0x00000010, + LR_LOADTRANSPARENT = 0x00000020, + LR_DEFAULTSIZE = 0x00000040, + LR_VGACOLOR = 0x00000080, + LR_LOADMAP3DCOLORS = 0x00001000, + LR_CREATEDIBSECTION = 0x00002000, + LR_COPYFROMRESOURCE = 0x00004000, + LR_SHARED = 0x00008000 + } + + private static readonly Dictionary ICONS = new Dictionary(); + private static readonly object LOCK = new object(); + private static readonly string m_icofolder = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), @"TrayResources\WinIcons"); + + private static SafeIconHandle LoadIcon(string filename) + { + lock (LOCK) + if (ICONS.TryGetValue(filename, out SafeIconHandle ico)) + return ico; + else + return new SafeIconHandle(LoadImage(IntPtr.Zero, Path.Combine(m_icofolder, filename), IMAGE_ICON, 16, 16, LR.LR_LOADFROMFILE)); + } + + public static SafeIconHandle TrayNormalIcon { get { return LoadIcon("TrayNormal.ico"); } } + public static SafeIconHandle TrayErrorIcon { get { return LoadIcon("TrayNormalError.ico"); } } + public static SafeIconHandle TrayPauseIcon { get { return LoadIcon("TrayNormalPause.ico"); } } + public static SafeIconHandle TrayWorkingIcon { get { return LoadIcon("TrayWorking.ico"); } } + public static SafeIconHandle MenuPauseIcon { get { return LoadIcon("context_menu_pause.ico"); } } + public static SafeIconHandle MenuPlayIcon { get { return LoadIcon("context_menu_play.ico"); } } + public static SafeIconHandle MenuQuitIcon { get { return LoadIcon("context_menu_quit.ico"); } } + public static SafeIconHandle MenuOpenIcon { get { return LoadIcon("context_menu_open.ico"); } } + } +} \ No newline at end of file diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Menu.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Menu.cs new file mode 100644 index 000000000..41ad1b48f --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Menu.cs @@ -0,0 +1,329 @@ +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Drawing; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Microsoft.Win32.SafeHandles; +using System.Runtime.ConstrainedExecution; +using System.IO; + +namespace Duplicati.GUI.TrayIcon +{ + public class SafeObjectHandle : SafeHandleZeroOrMinusOneIsInvalid + { + [DllImport("gdi32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + private static extern bool DeleteObject(IntPtr hObject); + public SafeObjectHandle(IntPtr hObject) : base(true) + { + SetHandle(hObject); + } + + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + protected override bool ReleaseHandle() + { + return DeleteObject(handle); + } + } + + public class SafeMenuHandle : SafeHandleZeroOrMinusOneIsInvalid + { + [DllImport("user32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + private static extern bool DestroyMenu(IntPtr hMenu); + public SafeMenuHandle(IntPtr hMenu) : base(true) + { + SetHandle(hMenu); + } + + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] + protected override bool ReleaseHandle() + { + return DestroyMenu(handle); + } + } + + public static class Win32NativeMenu + { + [DllImport("user32.dll")] + private static extern IntPtr CreatePopupMenu(); + + [DllImport("user32.dll")] + private static extern int TrackPopupMenuEx(SafeMenuHandle hMenu, TPM wFlags, int x, int y, IntPtr hWnd, IntPtr tpmParams); + + [DllImport("user32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GetCursorPos(out POINT lpPoint); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern bool AppendMenu(SafeMenuHandle hMenu, MenuFlags uFlags, uint uIDNewItem, string lpNewItem); + + [DllImport("user32.dll")] + private static extern bool EnableMenuItem(SafeMenuHandle hMenu, uint uIDEnableItem, MenuFlags uEnable); + + [DllImport("user32.dll")] + private static extern bool SetMenuItemBitmaps(SafeMenuHandle hMenu, uint uPosition, MFT uFlags, IntPtr hBitmapUnchecked, IntPtr hBitmapChecked); + + [DllImport("user32.dll")] + private static extern bool GetIconInfo(SafeIconHandle hIcon, out ICONINFO piconinfo); + + [DllImport("user32.dll")] + private static extern bool SetForegroundWindow(IntPtr hWnd); + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private class MENUITEMINFO + { + public Int32 cbSize = Marshal.SizeOf(typeof(MENUITEMINFO)); + public MIIM fMask; + public MFT fType; + public MFS fState; + public UInt32 wID; + public IntPtr hSubMenu; + public IntPtr hbmpChecked; + public IntPtr hbmpUnchecked; + public IntPtr dwItemData; + public string dwTypeData = null; + public UInt32 cch; // length of dwTypeData + public IntPtr hbmpItem; + + public MENUITEMINFO() { } + public MENUITEMINFO(MIIM pfMask) + { + fMask = pfMask; + } + } + + [Flags] + private enum MIIM + { + BITMAP = 0x00000080, + CHECKMARKS = 0x00000008, + DATA = 0x00000020, + FTYPE = 0x00000100, + ID = 0x00000002, + STATE = 0x00000001, + STRING = 0x00000040, + SUBMENU = 0x00000004, + TYPE = 0x00000010 + } + + [Flags] + public enum TPM : uint + { + TPM_LEFTBUTTON = 0x0000, + TPM_RIGHTBUTTON = 0x0002, + TPM_LEFTALIGN = 0x0000, + TPM_CENTERALIGN = 0x0004, + TPM_RIGHTALIGN = 0x0008, + TPM_TOPALIGN = 0x0000, + TPM_VCENTERALIGN = 0x0010, + TPM_BOTTOMALIGN = 0x0020, + TPM_HORIZONTAL = 0x0000, + TPM_VERTICAL = 0x0040, + TPM_NONOTIFY = 0x0080, + TPM_RETURNCMD = 0x0100, + TPM_RECURSE = 0x0001, + TPM_HORPOSANIMATION = 0x0400, + TPM_HORNEGANIMATION = 0x0800, + TPM_VERPOSANIMATION = 0x1000, + TPM_VERNEGANIMATION = 0x2000, + TPM_NOANIMATION = 0x4000, + TPM_LAYOUTRTL = 0x8000, + TPM_WORKAREA = 0x10000 + } + + [Flags] + private enum MFT : uint + { + + GRAYED = 0x00000003, + DISABLED = 0x00000003, + CHECKED = 0x00000008, + SEPARATOR = 0x00000800, + RADIOCHECK = 0x00000200, + BITMAP = 0x00000004, + OWNERDRAW = 0x00000100, + MENUBARBREAK = 0x00000020, + MENUBREAK = 0x00000040, + RIGHTORDER = 0x00002000, + BYCOMMAND = 0x00000000, + BYPOSITION = 0x00000400, + POPUP = 0x00000010, + ////Added + MFT_STRING = 0x000, + MF_BYPOSITION = 0x400, + MF_REMOVE = 0x1000 + } + + private enum MFS : uint + { + MFS_ENABLED = 0x00000000, + MFS_UNCHECKED = 0x00000000, + MFS_UNHILITE = 0x00000000, + MFS_GRAYED = 0x00000003, + MFS_DISABLED = 0x00000003, + MFS_CHECKED = 0x00000008, + MFS_HILITE = 0x00000080, + MFS_DEFAULT = 0x00001000 + } + + [StructLayout(LayoutKind.Sequential)] + private struct POINT + { + public int x; + public int y; + } + + [Flags] + private enum MenuFlags : uint + { + MF_STRING = 0, + MF_BYCOMMAND = 0, + MF_BYPOSITION = 0x400, + MF_SEPARATOR = 0x800, + MF_REMOVE = 0x1000, + MF_DISABLED = 0x00000002, + MF_ENABLED = 0x00000000, + MF_GRAYED = 0x00000001 + } + + [StructLayout(LayoutKind.Sequential)] + private struct ICONINFO + { + public bool fIcon; + public Int32 xHotspot; + public Int32 yHotspot; + public IntPtr hbmMask; + public IntPtr hbmColor; + } + + public static Win32MenuItem ShowContextMenu(IntPtr hMainWindow, IList listMenu) + { + if (!GetCursorPos(out POINT pt)) + throw new System.ComponentModel.Win32Exception(); + + var hMenu = new SafeMenuHandle(CreatePopupMenu()); + + if (hMenu.IsInvalid) + throw new System.ComponentModel.Win32Exception(); + + uint menuID = 1; + + //Keep reference until end of function. Then handles are safely closed. + var listSupressDispose = new List(); + + foreach (var menu in listMenu) + { + if (menu.Text == "-") + { + if (!AppendMenu(hMenu, MenuFlags.MF_SEPARATOR, 0, null)) + throw new System.ComponentModel.Win32Exception(); + } + else + { + if (!AppendMenu(hMenu, MenuFlags.MF_STRING, menuID, menu.Text)) + throw new System.ComponentModel.Win32Exception(); + + if (!menu.Enabled) + EnableMenuItem(hMenu, menuID, MenuFlags.MF_BYCOMMAND | MenuFlags.MF_DISABLED); + + ICONINFO ii = new ICONINFO(); + //TODO-DNC Icons in Tray contect menu are not transparent - cosmetic + GetIconInfo(menu.Icon, out ii); + listSupressDispose.Add(new SafeObjectHandle(ii.hbmColor)); + listSupressDispose.Add(new SafeObjectHandle(ii.hbmMask)); + SetMenuItemBitmaps(hMenu, menuID, MFT.BYCOMMAND, ii.hbmColor, ii.hbmColor); + } + + menuID++; + } + + //must set window to the foreground or the menu won't disappear when it should + SetForegroundWindow(hMainWindow); + + var selectedMenu = TrackPopupMenuEx(hMenu, TPM.TPM_RIGHTALIGN | TPM.TPM_BOTTOMALIGN | + TPM.TPM_RETURNCMD | TPM.TPM_RIGHTBUTTON, pt.x, pt.y, hMainWindow, IntPtr.Zero); + + return selectedMenu == 0 ? null : listMenu[selectedMenu - 1]; + } + } + + public class Win32MenuItem : IMenuItem + { + public string Text { get; private set; } + public SafeIconHandle Icon { get; private set; } + public Action Callback { get; private set; } + public IList SubItems { get; private set; } + public bool Enabled { get; private set; } + + public Win32MenuItem(string text, MenuIcons icon, Action callback, IList subitems) + { + if (subitems != null && subitems.Count > 0) + throw new NotImplementedException("So far not needed."); + + this.Text = text; + this.Callback = callback; + this.SubItems = subitems; + this.Enabled = true; + SetIcon(icon); + } + + #region IMenuItem implementation + public void SetText(string text) + { + this.Text = text; + } + + public void SetIcon(MenuIcons icon) + { + switch (icon) + { + case MenuIcons.Pause: + this.Icon = Win32IconLoader.MenuPauseIcon; + break; + case MenuIcons.Quit: + this.Icon = Win32IconLoader.MenuQuitIcon; + break; + case MenuIcons.Resume: + this.Icon = Win32IconLoader.MenuPlayIcon; + break; + case MenuIcons.Status: + this.Icon = Win32IconLoader.MenuOpenIcon; + break; + case MenuIcons.None: + default: + this.Icon = new SafeIconHandle(IntPtr.Zero); + break; + } + } + + public void SetEnabled(bool isEnabled) + { + this.Enabled = isEnabled; + } + + public void SetDefault(bool value) + { + //TODO-DNC Cosmetic, not needed + } + #endregion + } +} \ No newline at end of file diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32NotifyIcon.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32NotifyIcon.cs new file mode 100644 index 000000000..be2ebccb8 --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32NotifyIcon.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Duplicati.GUI.TrayIcon +{ + public static class Win32NativeNotifyIcon + { + public const int WM_APP = 0x8000; + + public enum NotifyFlags : int + { + NIF_MESSAGE = 0x00000001, + NIF_ICON = 0x00000002, + NIF_TIP = 0x00000004, + NIF_STATE = 0x00000008, + NIF_INFO = 0x00000010, + NIF_GUID = 0x00000020, + NIF_REALTIME = 0x00000040, + NIF_SHOWTIP = 0x00000080 + } + + public enum NotifyIconMessage : int + { + NIM_ADD = 0x00000000, + NIM_MODIFY = 0x00000001, + NIM_DELETE = 0x00000002, + NIM_SETFOCUS = 0x00000003, + NIM_SETVERSION = 0x00000004 + } + + public enum InfoFlags : int + { + NIIF_NONE = 0x00000000, + NIIF_INFO = 0x00000001, + NIIF_WARNING = 0x00000002, + NIIF_ERROR = 0x00000003, + NIIF_USER = 0x00000004, + NIIF_NOSOUND = 0x00000010, + NIIF_LARGE_ICON = 0x00000020, + NIIF_RESPECT_QUIET_TIME = 0x00000080 + } + + public const int NOTIFYICON_VERSION_4 = 4; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public class NOTIFYICONDATA + { + public int cbSize; + public IntPtr hWnd; + public int uID; + public NotifyFlags uFlags; + public int uCallbackMessage; + public SafeIconHandle hIcon; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string szTip; + public int dwState; + public int dwStateMask; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] + public string szInfo; + public int uTimeoutOrVersion; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] + public string szInfoTitle; + public InfoFlags dwInfoFlags; + public Guid guidItem; + public IntPtr hBalloonicon; + } + + [DllImport("shell32.dll", CharSet = CharSet.Auto)] + public static extern int Shell_NotifyIcon(NotifyIconMessage dwMessage, NOTIFYICONDATA pNID); + } + + public class Win32NotifyIcon + { + public int ID { get; private set; } + + public int MessageID { get; private set; } + + public IntPtr MainWindowHandle { get; private set; } + + public SafeIconHandle Icon { get; private set; } + + public string ToolTip { get; private set; } + + public Win32NotifyIcon(IntPtr MainWindowHandle, int ID, int MessageID, SafeIconHandle Icon, string ToolTip) + { + if (MainWindowHandle == IntPtr.Zero | ID == 0 | MessageID == 0) + throw new ArgumentException("Bad input arguments Win32NotifyIcon::ctor"); + + this.MainWindowHandle = MainWindowHandle; + this.ID = ID; + this.MessageID = MessageID; + this.Icon = Icon; + this.ToolTip = ToolTip; + } + + public void Create() + { + var nid = new Win32NativeNotifyIcon.NOTIFYICONDATA + { + hIcon = Icon, + hWnd = MainWindowHandle, + uID = ID, + szTip = ToolTip, + uFlags = Win32NativeNotifyIcon.NotifyFlags.NIF_ICON | Win32NativeNotifyIcon.NotifyFlags.NIF_TIP | + Win32NativeNotifyIcon.NotifyFlags.NIF_MESSAGE | Win32NativeNotifyIcon.NotifyFlags.NIF_SHOWTIP, + uCallbackMessage = MessageID, + cbSize = Marshal.SizeOf(typeof(Win32NativeNotifyIcon.NOTIFYICONDATA)) + }; + + if (Win32NativeNotifyIcon.Shell_NotifyIcon(Win32NativeNotifyIcon.NotifyIconMessage.NIM_ADD, nid) == 0) + throw new System.ComponentModel.Win32Exception(); + + nid.uTimeoutOrVersion = Win32NativeNotifyIcon.NOTIFYICON_VERSION_4; + + if (Win32NativeNotifyIcon.Shell_NotifyIcon(Win32NativeNotifyIcon.NotifyIconMessage.NIM_SETVERSION, nid) == 0) + throw new System.ComponentModel.Win32Exception(); + } + + public void Delete() + { + var nid = new Win32NativeNotifyIcon.NOTIFYICONDATA + { + hWnd = MainWindowHandle, + uID = ID, + hIcon = new SafeIconHandle(IntPtr.Zero), + cbSize = Marshal.SizeOf(typeof(Win32NativeNotifyIcon.NOTIFYICONDATA)) + }; + + if (Win32NativeNotifyIcon.Shell_NotifyIcon(Win32NativeNotifyIcon.NotifyIconMessage.NIM_DELETE, nid) == 0) + throw new System.ComponentModel.Win32Exception(); + } + + public void SetIcon(SafeIconHandle hIcon) + { + var nid = new Win32NativeNotifyIcon.NOTIFYICONDATA + { + hIcon = hIcon, + hWnd = MainWindowHandle, + uID = ID, + uFlags = Win32NativeNotifyIcon.NotifyFlags.NIF_ICON, + cbSize = Marshal.SizeOf(typeof(Win32NativeNotifyIcon.NOTIFYICONDATA)) + }; + + if (Win32NativeNotifyIcon.Shell_NotifyIcon(Win32NativeNotifyIcon.NotifyIconMessage.NIM_MODIFY, nid) == 0) + throw new System.ComponentModel.Win32Exception(); + + Icon = hIcon; + } + + public void ShowBalloonTip(string BallonTitle, string BallonMessage, Win32NativeNotifyIcon.InfoFlags NotificationType) + { + var nid = new Win32NativeNotifyIcon.NOTIFYICONDATA + { + hIcon = Icon, + hWnd = MainWindowHandle, + uID = ID, + cbSize = Marshal.SizeOf(typeof(Win32NativeNotifyIcon.NOTIFYICONDATA)), + szInfoTitle = BallonTitle, + szInfo = BallonMessage, + dwInfoFlags = NotificationType, + uFlags = Win32NativeNotifyIcon.NotifyFlags.NIF_INFO + }; + + if (Win32NativeNotifyIcon.Shell_NotifyIcon(Win32NativeNotifyIcon.NotifyIconMessage.NIM_MODIFY, nid) == 0) + throw new System.ComponentModel.Win32Exception(); + } + } +} \ No newline at end of file diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs new file mode 100644 index 000000000..ff948a792 --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs @@ -0,0 +1,166 @@ +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Drawing; +using Duplicati.Server.Serialization.Interface; + +namespace Duplicati.GUI.TrayIcon +{ + public class Win32Runner : TrayIconBase + { + private const string WINDOW_CLASSNAME = "DuplicatiMessageMonitorWindowTrayIcon"; + private const int TRAY_ICON_ID_1 = 1; + public const int WM_TRAYICON_1 = Win32NativeNotifyIcon.WM_APP + 1; + private readonly Win32Window m_window = new Win32Window(); + private Win32NotifyIcon m_ntfIcon; + private bool m_TrayIconCreated = false; + List m_TrayContextMenu; + + public override void Init(string[] args) + { + base.Init(args); + + m_window.MessageReceived += MessageMonitor_MessageReceived; + m_window.CreateWindow(WINDOW_CLASSNAME); + } + + private void MessageMonitor_MessageReceived(IntPtr hwnd, Win32NativeWindow.WindowsMessage message, IntPtr wParam, IntPtr lParam) + { + Console.WriteLine("Message: " + message); + switch (message) + { + case Win32NativeWindow.WindowsMessage.WM_SHOWWINDOW: + if (!m_TrayIconCreated) + { + m_ntfIcon = new Win32NotifyIcon(m_window.Handle, TRAY_ICON_ID_1, WM_TRAYICON_1, + Win32IconLoader.TrayNormalIcon, Duplicati.Library.AutoUpdater.AutoUpdateSettings.AppName); + m_ntfIcon.Create(); + m_TrayIconCreated = true; + } + break; + case (Win32NativeWindow.WindowsMessage)WM_TRAYICON_1: + var llpTray = (Win32NativeWindow.WindowsMessage)((uint)lParam.ToInt32() & 0x0000FFFF); + switch (llpTray) + { + case Win32NativeWindow.WindowsMessage.WM_LBUTTONDBLCLK: + m_onDoubleClick?.Invoke(); + break; + case Win32NativeWindow.WindowsMessage.WM_LBUTTONUP: + m_onSingleClick?.Invoke(); + break; + case Win32NativeWindow.WindowsMessage.WM_CONTEXTMENU: + Win32NativeMenu.ShowContextMenu(m_window.Handle, m_TrayContextMenu)?.Callback?.Invoke(); + break; + case Win32NativeWindow.WindowsMessage.NIN_BALLOONUSERCLICK: + m_onNotificationClick?.Invoke(); + break; + } + break; + } + } + + protected override void UpdateUIState(Action action) + { + action.Invoke(); + } + + protected override void RegisterStatusUpdateCallback() + { + Program.Connection.OnStatusUpdated += delegate (IServerStatus status) + { + this.OnStatusUpdated(status); + }; + } + + #region implemented abstract members of Duplicati.GUI.TrayIcon.TrayIconBase + protected override void Run(string[] args) + { + } + + protected override IMenuItem CreateMenuItem(string text, MenuIcons icon, Action callback, IList subitems) + { + return new Win32MenuItem(text, icon, callback, subitems); + } + + protected override void NotifyUser(string title, string message, NotificationType type) + { + var icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; + + switch (type) + { + case NotificationType.Information: + icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; + break; + case NotificationType.Warning: + icon = Win32NativeNotifyIcon.InfoFlags.NIIF_WARNING; + break; + case NotificationType.Error: + icon = Win32NativeNotifyIcon.InfoFlags.NIIF_ERROR; + break; + } + + m_ntfIcon.ShowBalloonTip(title, message, icon); + } + + protected override void Exit() + { + m_ntfIcon.Delete(); + m_window.DestroyWindow(); + } + + protected override void SetIcon(TrayIcons icon) + { + //There are calls before NotifyIcons is created + if (m_ntfIcon == null) + return; + + switch (icon) + { + case TrayIcons.IdleError: + m_ntfIcon?.SetIcon(Win32IconLoader.TrayErrorIcon); + break; + case TrayIcons.Paused: + case TrayIcons.PausedError: + m_ntfIcon?.SetIcon(Win32IconLoader.TrayPauseIcon); + break; + case TrayIcons.Running: + case TrayIcons.RunningError: + m_ntfIcon?.SetIcon(Win32IconLoader.TrayWorkingIcon); + break; + case TrayIcons.Idle: + default: + m_ntfIcon?.SetIcon(Win32IconLoader.TrayNormalIcon); + break; + } + } + + protected override void SetMenu(System.Collections.Generic.IEnumerable items) + { + m_TrayContextMenu = new List(); + + foreach(var item in items) + m_TrayContextMenu.Add((Win32MenuItem)item); + } + + public override void Dispose() + { + } + #endregion + } +} diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs new file mode 100644 index 000000000..0aaf97eed --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs @@ -0,0 +1,452 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; + +namespace Duplicati.GUI.TrayIcon +{ + public class Win32Window : IDisposable + { + private bool m_disposed; + private IntPtr m_classAtom = IntPtr.Zero; + private readonly IntPtr m_hInstance = Win32NativeWindow.GetModuleHandle(null); + public delegate void MessageMonitorEventHandler(IntPtr hwnd, Win32NativeWindow.WindowsMessage message, IntPtr wParam, IntPtr lParam); + public event MessageMonitorEventHandler MessageReceived; + public IntPtr Handle { get; private set; } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!m_disposed) + { + if (disposing) + { + // free other managed objects that implement IDisposable only + } + + // Dispose unmanaged resources + DestroyWindow(); + m_disposed = true; + } + } + + public Win32Window() + { + Handle = IntPtr.Zero; + } + + public void CreateWindow(string ClassName) + { + if (string.IsNullOrEmpty(ClassName)) throw new ArgumentException("ClassName is null or empty"); + + if (Handle != IntPtr.Zero | m_classAtom != IntPtr.Zero) + return; + + Win32NativeWindow.WNDCLASSEX wc = new Win32NativeWindow.WNDCLASSEX + { + cbSize = Marshal.SizeOf(typeof(Win32NativeWindow.WNDCLASSEX)), + lpfnWndProc = CustomWndProc, + lpszClassName = ClassName, + hInstance = m_hInstance + }; + + var atom = Win32NativeWindow.RegisterClassEx(ref wc); + + if (atom == 0) + throw new System.ComponentModel.Win32Exception(); + + m_classAtom = new IntPtr(atom); + + Handle = Win32NativeWindow.CreateWindowEx(0, m_classAtom, + null, 0, 0, 0, 0, 0, IntPtr.Zero, IntPtr.Zero, m_hInstance, IntPtr.Zero); + + if (Handle == IntPtr.Zero) + throw new System.ComponentModel.Win32Exception(); + + //Send WM_SHOWWINDOW to create NotifyIcon + Win32NativeWindow.ShowWindow(Handle, 1); + Win32NativeWindow.ShowWindow(Handle, 0); + + Win32NativeWindow.MSG msg = new Win32NativeWindow.MSG(); + + while (Win32NativeWindow.GetMessage(out msg, IntPtr.Zero, 0, 0)) + { + Win32NativeWindow.TranslateMessage(ref msg); + Win32NativeWindow.DispatchMessage(ref msg); + } + } + + public void DestroyWindow() + { + Win32NativeWindow.PostQuitMessage(0); + + if (Handle != IntPtr.Zero) + { + Win32NativeWindow.DestroyWindow(Handle); + Handle = IntPtr.Zero; + } + + if (m_classAtom != IntPtr.Zero) + { + Win32NativeWindow.UnregisterClass(m_classAtom, m_hInstance); + m_classAtom = IntPtr.Zero; + } + } + + private IntPtr CustomWndProc(IntPtr hWnd, Win32NativeWindow.WindowsMessage msg, IntPtr wParam, IntPtr lParam) + { + MessageReceived?.Invoke(hWnd, msg, wParam, lParam); + return Win32NativeWindow.DefWindowProc(hWnd, msg, wParam, lParam); + } + } + public static class Win32NativeWindow + { + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern IntPtr CreateWindowEx(uint dwExStyle, IntPtr lpszClassName, + string lpszWindowName, uint dwStyle, int x, int y, int nWidth, int nHeight, + IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr DefWindowProc(IntPtr hWnd, WindowsMessage msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr DispatchMessage([In] ref MSG lpMsg); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern bool TranslateMessage([In] ref MSG lpMsg); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool GetMessage(out MSG msg, IntPtr hWnd, uint uMsgFilterMin, uint uMsgFilterMax); + + [DllImport("user32.dll", SetLastError = true)] + public static extern UInt16 RegisterClassEx(ref WNDCLASSEX lpWndClass); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool UnregisterClass(IntPtr lpClassName, IntPtr hInstance); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool DestroyWindow(IntPtr hWnd); + + [DllImport("user32.dll", SetLastError = true)] + public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern IntPtr GetModuleHandle(string lpModuleName); + + [DllImport("user32.dll")] + public static extern void PostQuitMessage(int nExitCode); + + public delegate IntPtr WndProc(IntPtr hWnd, WindowsMessage msg, IntPtr wParam, IntPtr lParam); + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct WNDCLASSEX + { + public int cbSize; + public uint style; + public WndProc lpfnWndProc; + public int cbClsExtra; + public int cbWndExtra; + public IntPtr hInstance; + public IntPtr hIcon; + public IntPtr hCursor; + public IntPtr hbrBackground; + public string lpszMenuName; + public string lpszClassName; + public IntPtr hIconSm; + } + + [StructLayout(LayoutKind.Sequential)] + public struct MSG + { + public IntPtr hwnd; + public uint message; + public IntPtr wParam; + public IntPtr lParam; + public int time; + public POINT pt; + } + + [StructLayout(LayoutKind.Sequential)] + public struct POINT + { + public int x; + public int y; + } + + public enum WindowsMessage + { + WM_NULL = 0x0000, + WM_CREATE = 0x0001, + WM_DESTROY = 0x0002, + WM_MOVE = 0x0003, + WM_SIZE = 0x0005, + WM_ACTIVATE = 0x0006, + WM_SETFOCUS = 0x0007, + WM_KILLFOCUS = 0x0008, + WM_ENABLE = 0x000A, + WM_SETREDRAW = 0x000B, + WM_SETTEXT = 0x000C, + WM_GETTEXT = 0x000D, + WM_GETTEXTLENGTH = 0x000E, + WM_PAINT = 0x000F, + WM_CLOSE = 0x0010, + WM_QUERYENDSESSION = 0x0011, + WM_QUERYOPEN = 0x0013, + WM_ENDSESSION = 0x0016, + WM_QUIT = 0x0012, + WM_ERASEBKGND = 0x0014, + WM_SYSCOLORCHANGE = 0x0015, + WM_SHOWWINDOW = 0x0018, + WM_WININICHANGE = 0x001A, + WM_SETTINGCHANGE = WM_WININICHANGE, + WM_DEVMODECHANGE = 0x001B, + WM_ACTIVATEAPP = 0x001C, + WM_FONTCHANGE = 0x001D, + WM_TIMECHANGE = 0x001E, + WM_CANCELMODE = 0x001F, + WM_SETCURSOR = 0x0020, + WM_MOUSEACTIVATE = 0x0021, + WM_CHILDACTIVATE = 0x0022, + WM_QUEUESYNC = 0x0023, + WM_GETMINMAXINFO = 0x0024, + WM_PAINTICON = 0x0026, + WM_ICONERASEBKGND = 0x0027, + WM_NEXTDLGCTL = 0x0028, + WM_SPOOLERSTATUS = 0x002A, + WM_DRAWITEM = 0x002B, + WM_MEASUREITEM = 0x002C, + WM_DELETEITEM = 0x002D, + WM_VKEYTOITEM = 0x002E, + WM_CHARTOITEM = 0x002F, + WM_SETFONT = 0x0030, + WM_GETFONT = 0x0031, + WM_SETHOTKEY = 0x0032, + WM_GETHOTKEY = 0x0033, + WM_QUERYDRAGICON = 0x0037, + WM_COMPAREITEM = 0x0039, + WM_GETOBJECT = 0x003D, + WM_COMPACTING = 0x0041, + WM_COMMNOTIFY = 0x0044, + WM_WINDOWPOSCHANGING = 0x0046, + WM_WINDOWPOSCHANGED = 0x0047, + WM_POWER = 0x0048, + WM_COPYDATA = 0x004A, + WM_CANCELJOURNAL = 0x004B, + WM_NOTIFY = 0x004E, + WM_INPUTLANGCHANGEREQUEST = 0x0050, + WM_INPUTLANGCHANGE = 0x0051, + WM_TCARD = 0x0052, + WM_HELP = 0x0053, + WM_USERCHANGED = 0x0054, + WM_NOTIFYFORMAT = 0x0055, + WM_CONTEXTMENU = 0x007B, + WM_STYLECHANGING = 0x007C, + WM_STYLECHANGED = 0x007D, + WM_DISPLAYCHANGE = 0x007E, + WM_GETICON = 0x007F, + WM_SETICON = 0x0080, + WM_NCCREATE = 0x0081, + WM_NCDESTROY = 0x0082, + WM_NCCALCSIZE = 0x0083, + WM_NCHITTEST = 0x0084, + WM_NCPAINT = 0x0085, + WM_NCACTIVATE = 0x0086, + WM_GETDLGCODE = 0x0087, + WM_SYNCPAINT = 0x0088, + + + WM_NCMOUSEMOVE = 0x00A0, + WM_NCLBUTTONDOWN = 0x00A1, + WM_NCLBUTTONUP = 0x00A2, + WM_NCLBUTTONDBLCLK = 0x00A3, + WM_NCRBUTTONDOWN = 0x00A4, + WM_NCRBUTTONUP = 0x00A5, + WM_NCRBUTTONDBLCLK = 0x00A6, + WM_NCMBUTTONDOWN = 0x00A7, + WM_NCMBUTTONUP = 0x00A8, + WM_NCMBUTTONDBLCLK = 0x00A9, + WM_NCXBUTTONDOWN = 0x00AB, + WM_NCXBUTTONUP = 0x00AC, + WM_NCXBUTTONDBLCLK = 0x00AD, + + WM_INPUT_DEVICE_CHANGE = 0x00FE, + WM_INPUT = 0x00FF, + + WM_KEYFIRST = 0x0100, + WM_KEYDOWN = 0x0100, + WM_KEYUP = 0x0101, + WM_CHAR = 0x0102, + WM_DEADCHAR = 0x0103, + WM_SYSKEYDOWN = 0x0104, + WM_SYSKEYUP = 0x0105, + WM_SYSCHAR = 0x0106, + WM_SYSDEADCHAR = 0x0107, + WM_UNICHAR = 0x0109, + WM_KEYLAST = 0x0109, + + WM_IME_STARTCOMPOSITION = 0x010D, + WM_IME_ENDCOMPOSITION = 0x010E, + WM_IME_COMPOSITION = 0x010F, + WM_IME_KEYLAST = 0x010F, + + WM_INITDIALOG = 0x0110, + WM_COMMAND = 0x0111, + WM_SYSCOMMAND = 0x0112, + WM_TIMER = 0x0113, + WM_HSCROLL = 0x0114, + WM_VSCROLL = 0x0115, + WM_INITMENU = 0x0116, + WM_INITMENUPOPUP = 0x0117, + WM_MENUSELECT = 0x011F, + WM_MENUCHAR = 0x0120, + WM_ENTERIDLE = 0x0121, + WM_MENURBUTTONUP = 0x0122, + WM_MENUDRAG = 0x0123, + WM_MENUGETOBJECT = 0x0124, + WM_UNINITMENUPOPUP = 0x0125, + WM_MENUCOMMAND = 0x0126, + + WM_CHANGEUISTATE = 0x0127, + WM_UPDATEUISTATE = 0x0128, + WM_QUERYUISTATE = 0x0129, + + WM_CTLCOLORMSGBOX = 0x0132, + WM_CTLCOLOREDIT = 0x0133, + WM_CTLCOLORLISTBOX = 0x0134, + WM_CTLCOLORBTN = 0x0135, + WM_CTLCOLORDLG = 0x0136, + WM_CTLCOLORSCROLLBAR = 0x0137, + WM_CTLCOLORSTATIC = 0x0138, + MN_GETHMENU = 0x01E1, + + WM_MOUSEFIRST = 0x0200, + WM_MOUSEMOVE = 0x0200, + WM_LBUTTONDOWN = 0x0201, + WM_LBUTTONUP = 0x0202, + WM_LBUTTONDBLCLK = 0x0203, + WM_RBUTTONDOWN = 0x0204, + WM_RBUTTONUP = 0x0205, + WM_RBUTTONDBLCLK = 0x0206, + WM_MBUTTONDOWN = 0x0207, + WM_MBUTTONUP = 0x0208, + WM_MBUTTONDBLCLK = 0x0209, + WM_MOUSEWHEEL = 0x020A, + WM_XBUTTONDOWN = 0x020B, + WM_XBUTTONUP = 0x020C, + WM_XBUTTONDBLCLK = 0x020D, + WM_MOUSEHWHEEL = 0x020E, + + WM_PARENTNOTIFY = 0x0210, + WM_ENTERMENULOOP = 0x0211, + WM_EXITMENULOOP = 0x0212, + + WM_NEXTMENU = 0x0213, + WM_SIZING = 0x0214, + WM_CAPTURECHANGED = 0x0215, + WM_MOVING = 0x0216, + + WM_POWERBROADCAST = 0x0218, + + WM_DEVICECHANGE = 0x0219, + + WM_MDICREATE = 0x0220, + WM_MDIDESTROY = 0x0221, + WM_MDIACTIVATE = 0x0222, + WM_MDIRESTORE = 0x0223, + WM_MDINEXT = 0x0224, + WM_MDIMAXIMIZE = 0x0225, + WM_MDITILE = 0x0226, + WM_MDICASCADE = 0x0227, + WM_MDIICONARRANGE = 0x0228, + WM_MDIGETACTIVE = 0x0229, + + + WM_MDISETMENU = 0x0230, + WM_ENTERSIZEMOVE = 0x0231, + WM_EXITSIZEMOVE = 0x0232, + WM_DROPFILES = 0x0233, + WM_MDIREFRESHMENU = 0x0234, + + WM_IME_SETCONTEXT = 0x0281, + WM_IME_NOTIFY = 0x0282, + WM_IME_CONTROL = 0x0283, + WM_IME_COMPOSITIONFULL = 0x0284, + WM_IME_SELECT = 0x0285, + WM_IME_CHAR = 0x0286, + WM_IME_REQUEST = 0x0288, + WM_IME_KEYDOWN = 0x0290, + WM_IME_KEYUP = 0x0291, + + WM_MOUSEHOVER = 0x02A1, + WM_MOUSELEAVE = 0x02A3, + WM_NCMOUSEHOVER = 0x02A0, + WM_NCMOUSELEAVE = 0x02A2, + + WM_WTSSESSION_CHANGE = 0x02B1, + + WM_TABLET_FIRST = 0x02c0, + WM_TABLET_LAST = 0x02df, + + WM_CUT = 0x0300, + WM_COPY = 0x0301, + WM_PASTE = 0x0302, + WM_CLEAR = 0x0303, + WM_UNDO = 0x0304, + WM_RENDERFORMAT = 0x0305, + WM_RENDERALLFORMATS = 0x0306, + WM_DESTROYCLIPBOARD = 0x0307, + WM_DRAWCLIPBOARD = 0x0308, + WM_PAINTCLIPBOARD = 0x0309, + WM_VSCROLLCLIPBOARD = 0x030A, + WM_SIZECLIPBOARD = 0x030B, + WM_ASKCBFORMATNAME = 0x030C, + WM_CHANGECBCHAIN = 0x030D, + WM_HSCROLLCLIPBOARD = 0x030E, + WM_QUERYNEWPALETTE = 0x030F, + WM_PALETTEISCHANGING = 0x0310, + WM_PALETTECHANGED = 0x0311, + WM_HOTKEY = 0x0312, + + WM_PRINT = 0x0317, + WM_PRINTCLIENT = 0x0318, + + WM_APPCOMMAND = 0x0319, + + WM_THEMECHANGED = 0x031A, + + WM_CLIPBOARDUPDATE = 0x031D, + + WM_DWMCOMPOSITIONCHANGED = 0x031E, + WM_DWMNCRENDERINGCHANGED = 0x031F, + WM_DWMCOLORIZATIONCOLORCHANGED = 0x0320, + WM_DWMWINDOWMAXIMIZEDCHANGE = 0x0321, + + WM_GETTITLEBARINFOEX = 0x033F, + + WM_HANDHELDFIRST = 0x0358, + WM_HANDHELDLAST = 0x035F, + + WM_AFXFIRST = 0x0360, + WM_AFXLAST = 0x037F, + + WM_PENWINFIRST = 0x0380, + WM_PENWINLAST = 0x038F, + + WM_APP = 0x8000, + + WM_USER = 0x0400, + + NIN_BALLOONUSERCLICK = 1029, + + WM_REFLECT = WM_USER + 0x1C00, + } + } +} diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/WinFormsRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/WinFormsRunner.cs deleted file mode 100644 index f47693229..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/WinFormsRunner.cs +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Windows.Forms; -using Duplicati.Server.Serialization; -using Duplicati.Server.Serialization.Interface; - -namespace Duplicati.GUI.TrayIcon.Windows -{ - //We use a separate class to start the runner to avoid attempts to load WinForms from Program.cs - public class WinFormsRunner : TrayIconBase - { - private class MenuItemWrapper : IMenuItem - { - private readonly ToolStripItem m_menu; - private readonly Action m_callback; - - public ToolStripItem MenuItem { get { return m_menu; } } - - public MenuItemWrapper(string text, MenuIcons icon, Action callback, IList subitems) - { - if (text == "-") - m_menu = new ToolStripSeparator(); - else - { - m_menu = new ToolStripMenuItem(text); - if (icon != MenuIcons.None) - m_menu.Image = GetIcon(icon); - - if (callback != null) - { - m_callback = callback; - m_menu.Click += OnMenuClick; - } - - if (subitems != null && subitems.Count > 0) - foreach(var itm in subitems) - ((ToolStripMenuItem)m_menu).DropDownItems.Add(((MenuItemWrapper)itm).MenuItem); - } - } - - private void OnMenuClick (object sender, EventArgs e) - { - m_callback(); - } - - private System.Drawing.Image GetIcon(MenuIcons icon) - { - switch(icon) - { - case MenuIcons.Pause: - return ImageLoader.Pause; - case MenuIcons.Quit: - return ImageLoader.CloseMenuIcon; - case MenuIcons.Resume: - return ImageLoader.Play; - case MenuIcons.Status: - return ImageLoader.StatusMenuIcon; - case MenuIcons.None: - default: - return null; - } - } - - #region IMenuItem implementation - public void SetText(string text) - { - m_menu.Text = text; - } - - public void SetIcon(MenuIcons icon) - { - m_menu.Image = GetIcon(icon); - } - - public void SetEnabled(bool isEnabled) - { - m_menu.Enabled = isEnabled; - } - - public void SetDefault(bool value) - { - m_menu.Font = new System.Drawing.Font(m_menu.Font, System.Drawing.FontStyle.Bold); - } - #endregion - } - - private Form m_handleProvider; - private NotifyIcon m_trayIcon; - - public override void Init (string[] args) - { - //We need this ugly hack to get a handle that we can call Invoke on, - // and sadly the TrayIcon does not expose one, and forcing the context menu - // to create one causes weird "lost clicks" - m_handleProvider = new Form() - { - FormBorderStyle = FormBorderStyle.None, - Width = 10, - Height = 10, - Top = 0, - Left = 0 - }; - m_handleProvider.Show(); - m_handleProvider.Hide(); - - m_trayIcon = new NotifyIcon(); - m_trayIcon.DoubleClick += new EventHandler(m_trayIcon_DoubleClick); - m_trayIcon.Click += new EventHandler(m_trayIcon_Click); - m_trayIcon.BalloonTipClicked += m_BalloonTipClicked; - m_trayIcon.Text = Duplicati.Library.AutoUpdater.AutoUpdateSettings.AppName; - base.Init(args); - } - - protected override void UpdateUIState(Action action) - { - m_handleProvider.Invoke(action); - } - - private void m_trayIcon_Click(object sender, EventArgs e) - { - if (m_onSingleClick != null) - m_onSingleClick(); - else if (m_trayIcon != null && m_trayIcon.ContextMenuStrip != null) - { - // Show context menu on left-click as we have nothing happening otherwise - try - { - typeof(NotifyIcon).GetMethod("ShowContextMenu", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).Invoke(m_trayIcon, null); - } - catch { } - } - } - - private void m_trayIcon_DoubleClick(object sender, EventArgs e) - { - if (m_onDoubleClick != null) - m_onDoubleClick(); - } - - private void m_BalloonTipClicked(object sender, EventArgs e) - { - m_onNotificationClick?.Invoke(); - } - - protected override void RegisterStatusUpdateCallback () - { - Program.Connection.OnStatusUpdated += delegate(IServerStatus status) { - m_handleProvider.Invoke(new Action(OnStatusUpdated), status); - }; - } - - #region implemented abstract members of Duplicati.GUI.TrayIcon.TrayIconBase - protected override void Run (string[] args) - { - m_trayIcon.Visible = true; - Application.Run(); - } - - protected override IMenuItem CreateMenuItem (string text, MenuIcons icon, Action callback, IList subitems) - { - return new MenuItemWrapper(text, icon, callback, subitems); - } - - protected override void NotifyUser(string title, string message, NotificationType type) - { - var icon = ToolTipIcon.None; - - switch (type) - { - case NotificationType.Information: - icon = ToolTipIcon.Info; - break; - case NotificationType.Warning: - icon = ToolTipIcon.Warning; - break; - case NotificationType.Error: - icon = ToolTipIcon.Error; - break; - } - - m_trayIcon.ShowBalloonTip((int)TimeSpan.FromSeconds(60).TotalMilliseconds, title, message, icon); - } - - protected override void Exit () - { - Application.Exit(); - } - - protected override void SetIcon(TrayIcons icon) - { - switch (icon) - { - case TrayIcons.IdleError: - m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.ErrorIcon, System.Windows.Forms.SystemInformation.SmallIconSize); - break; - case TrayIcons.Paused: - m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.PauseIcon, System.Windows.Forms.SystemInformation.SmallIconSize); - break; - case TrayIcons.PausedError: - m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.PauseIcon, System.Windows.Forms.SystemInformation.SmallIconSize); - break; - case TrayIcons.Running: - m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.WorkingIcon, System.Windows.Forms.SystemInformation.SmallIconSize); - break; - case TrayIcons.RunningError: - m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.WorkingIcon, System.Windows.Forms.SystemInformation.SmallIconSize); - break; - case TrayIcons.Idle: - default: - m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.NormalIcon, System.Windows.Forms.SystemInformation.SmallIconSize); - break; - } - } - - protected override void SetMenu (System.Collections.Generic.IEnumerable items) - { - m_trayIcon.ContextMenuStrip = new ContextMenuStrip(); - foreach(var itm in items) - m_trayIcon.ContextMenuStrip.Items.Add(((MenuItemWrapper)itm).MenuItem); - } - - public override void Dispose () - { - if (m_handleProvider != null) - { - m_handleProvider.Dispose(); - m_handleProvider = null; - } - - if (m_trayIcon != null) - { - m_trayIcon.Visible = false; - m_trayIcon.Dispose(); - m_trayIcon = null; - } - } - #endregion - - /*public override IBrowserWindow ShowUrlInWindow(string url) - { - var v = new WindowsBrowser(url); - v.Show(); - return v; - }*/ - } -} - From 34805225be9c2ac4d8a237ced5b1d4e7eed11128 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Sat, 4 May 2019 00:40:46 +0200 Subject: [PATCH 060/253] Debug code removed --- Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs index ff948a792..3fb54adef 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs @@ -42,7 +42,6 @@ namespace Duplicati.GUI.TrayIcon private void MessageMonitor_MessageReceived(IntPtr hwnd, Win32NativeWindow.WindowsMessage message, IntPtr wParam, IntPtr lParam) { - Console.WriteLine("Message: " + message); switch (message) { case Win32NativeWindow.WindowsMessage.WM_SHOWWINDOW: @@ -56,6 +55,7 @@ namespace Duplicati.GUI.TrayIcon break; case (Win32NativeWindow.WindowsMessage)WM_TRAYICON_1: var llpTray = (Win32NativeWindow.WindowsMessage)((uint)lParam.ToInt32() & 0x0000FFFF); + switch (llpTray) { case Win32NativeWindow.WindowsMessage.WM_LBUTTONDBLCLK: From eff8abbeb18c9fc69233c50c3202678f752ba573 Mon Sep 17 00:00:00 2001 From: Michal Naiman Date: Sat, 4 May 2019 09:11:41 +0200 Subject: [PATCH 061/253] UnixSupport converted --- thirdparty/UnixSupport/UnixSupport.csproj | 48 ++++++----------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/thirdparty/UnixSupport/UnixSupport.csproj index 5be446aba..b74fe6fe2 100644 --- a/thirdparty/UnixSupport/UnixSupport.csproj +++ b/thirdparty/UnixSupport/UnixSupport.csproj @@ -1,42 +1,20 @@ - - + + - Debug - AnyCPU - 8.0.30703 - 2.0 - {480C1FD4-970A-4DF6-A6DA-A2B49EF2E639} - Library - UnixSupport + netstandard2.0 + 2.0.0.7 + Exe + LGPL, Copyright © Duplicati Team 2015 + UnixSupport + Duplicati Team + Duplicati Team + UnixSupport for Duplicati + UnixSupport UnixSupport - v4.6.2 - - 1.0 - false - - true - full - false - bin\Debug - DEBUG - prompt - 4 - false - - - none - false - bin\Release - prompt - 4 - false - - + - - - + \ No newline at end of file From 96ea8b124d5f623a899337794934e48d241a9ed3 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 28 Jul 2019 12:55:07 +0200 Subject: [PATCH 062/253] upstream changes in library --- .../Backend/AzureBlob/AzureBlobWrapper.cs | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs index 7acfa0c74..58c755cbc 100644 --- a/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs +++ b/Duplicati/Library/Backend/AzureBlob/AzureBlobWrapper.cs @@ -64,14 +64,15 @@ namespace Duplicati.Library.Backend.AzureBlob public AzureBlobWrapper(string accountName, string accessKey, string containerName) { - OperationContext.GlobalSendingRequest += (sender, args) => - { - args.Request.UserAgent = string.Format( - "APN/1.0 Duplicati/{0} AzureBlob/2.0 {1}", - System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, - Microsoft.WindowsAzure.Storage.Shared.Protocol.Constants.HeaderConstants.UserAgent - ); - }; + //TODO-DNC Missing UserAgent property in DNC + //OperationContext.GlobalSendingRequest += (sender, args) => + //{ + // args.Request.UserAgent = string.Format( + // "APN/1.0 Duplicati/{0} AzureBlob/2.0 {1}", + // System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, + // Microsoft.WindowsAzure.Storage.Shared.Protocol.Constants.HeaderConstants.UserAgent + // ); + //}; var connectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", accountName, accessKey); @@ -84,27 +85,45 @@ namespace Duplicati.Library.Backend.AzureBlob public void AddContainer() { - _container.Create(BlobContainerPublicAccessType.Off); + _container.CreateAsync().GetAwaiter().GetResult(); + _container.SetPermissionsAsync(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Off }); } public virtual void GetFileStream(string keyName, Stream target) { - _container.GetBlockBlobReference(keyName).DownloadToStream(target); + _container.GetBlockBlobReference(keyName).DownloadToStreamAsync(target).GetAwaiter().GetResult(); } public virtual async Task AddFileStream(string keyName, Stream source, CancellationToken cancelToken) { - await _container.GetBlockBlobReference(keyName).UploadFromStreamAsync(source, cancelToken); + await _container.GetBlockBlobReference(keyName).UploadFromStreamAsync(source, source.Length, default(AccessCondition), default(BlobRequestOptions), new OperationContext(), cancelToken); } public void DeleteObject(string keyName) { - _container.GetBlockBlobReference(keyName).DeleteIfExists(); + _container.GetBlockBlobReference(keyName).DeleteIfExistsAsync().GetAwaiter().GetResult(); + } + + private async Task> ListContainerEntriesAsync() + { + var segment = await _container.ListBlobsSegmentedAsync(null); + var list = new List(); + + list.AddRange(segment.Results); + + while (segment.ContinuationToken != null) + { + // TODO-DNC do we need BlobListingDetails.Metadata ??? + segment = await _container.ListBlobsSegmentedAsync(segment.ContinuationToken); + list.AddRange(segment.Results); + } + + return list; } public virtual List ListContainerEntries() { - var listBlobItems = _container.ListBlobs(blobListingDetails: BlobListingDetails.Metadata); + var listBlobItems = ListContainerEntriesAsync().GetAwaiter().GetResult(); try { return listBlobItems.Select(x => From afa2fa25722598f7d864c9f49f10603a0be5a0cd Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 2 Aug 2019 23:48:41 +0200 Subject: [PATCH 063/253] thx BlueBlock - add new CallContext - fix getting embedded resources --- ...cati.Library.Backend.AlternativeFTP.csproj | 2 +- ...Duplicati.Library.Backend.AzureBlob.csproj | 2 +- .../S3/Duplicati.Library.Backend.S3.csproj | 6 ++-- .../Duplicati.Library.Encryption.csproj | 7 +++- Duplicati/Library/Logging/CallContext.cs | 33 +++++++++++++++++++ Duplicati/Library/Logging/Log.cs | 14 +++----- .../Main/Duplicati.Library.Main.csproj | 1 + .../Duplicati.Library.Modules.Builtin.csproj | 4 +-- .../Library/SQLiteHelper/DatabaseUpgrader.cs | 8 ++--- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 4 +-- 10 files changed, 57 insertions(+), 24 deletions(-) create mode 100644 Duplicati/Library/Logging/CallContext.cs diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 533e3a631..59d710521 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 456913e18..0e6b858c0 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -17,7 +17,7 @@ - + diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index 30fd42336..eead6e083 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index f444d7363..029aa207d 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 @@ -14,6 +14,11 @@ Duplicati.Encryption + + + + + diff --git a/Duplicati/Library/Logging/CallContext.cs b/Duplicati/Library/Logging/CallContext.cs new file mode 100644 index 000000000..bd910f747 --- /dev/null +++ b/Duplicati/Library/Logging/CallContext.cs @@ -0,0 +1,33 @@ +using System.Collections.Concurrent; +using System.Threading; + +namespace Duplicati.Logging +{ + namespace Duplicati.Library.Logging + { + /// + /// Provides a way to set contextual data that flows with the call and + /// async context of a test or invocation. + /// + public static class CallContext + { + static ConcurrentDictionary> state = new ConcurrentDictionary>(); + + /// + /// Stores a given object and associates it with the specified name. + /// + /// The name with which to associate the new item in the call context. + /// The object to store in the call context. + public static void SetData(string name, object data) => + state.GetOrAdd(name, _ => new AsyncLocal()).Value = data; + + /// + /// Retrieves an object with the specified name from the . + /// + /// The name of the item in the call context. + /// The object in the call context associated with the specified name, or if not found. + public static object GetData(string name) => + state.TryGetValue(name, out AsyncLocal data) ? data.Value : null; + } + } +} \ No newline at end of file diff --git a/Duplicati/Library/Logging/Log.cs b/Duplicati/Library/Logging/Log.cs index 45df29ec3..6c8dce1cc 100644 --- a/Duplicati/Library/Logging/Log.cs +++ b/Duplicati/Library/Logging/Log.cs @@ -17,6 +17,7 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // #endregion +using Duplicati.Logging.Duplicati.Library.Logging; using System; using System.Collections.Generic; using System.Text; @@ -443,8 +444,7 @@ namespace Duplicati.Library.Logging { lock (m_lock) { - /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md - var cur = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData(LOGICAL_CONTEXT_KEY) as string; + var cur = CallContext.GetData(LOGICAL_CONTEXT_KEY) as string; if (cur == null || cur == m_root.InstanceID) return m_root; @@ -453,27 +453,21 @@ namespace Duplicati.Library.Logging throw new Exception("Unable to find log in lookup table, this may be caused by attempting to transport call contexts between AppDomains (eg. with remoting calls)"); return sc; - */ - - return m_root; } } private set { lock (m_lock) { - /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md - if (value != null) { m_log_instances[value.InstanceID] = value; - System.Runtime.Remoting.Messaging.CallContext.LogicalSetData(LOGICAL_CONTEXT_KEY, value.InstanceID); + CallContext.SetData(LOGICAL_CONTEXT_KEY, value.InstanceID); } else { - System.Runtime.Remoting.Messaging.CallContext.LogicalSetData(LOGICAL_CONTEXT_KEY, null); + CallContext.SetData(LOGICAL_CONTEXT_KEY, null); } - */ } } } diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index d59373ddd..c06290ee4 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -52,6 +52,7 @@ + PreserveNewest diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 743588fec..caadf0a38 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs b/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs index 8c7a41a6f..75072bd88 100644 --- a/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs +++ b/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs @@ -56,7 +56,7 @@ namespace Duplicati.Library.SQLiteHelper public static class DatabaseUpgrader { //This is the "folder" where the embedded resources can be found - private const string FOLDER_NAME = "Database_schema"; + private const string FOLDER_NAME = "Duplicati.Library.Main.Database.Database_schema"; //This is the name of the schema sql private const string SCHEMA_NAME = "Schema.sql"; @@ -140,17 +140,17 @@ namespace Duplicati.Library.SQLiteHelper var asm = eltype.Assembly; string schema; - using (var rd = new System.IO.StreamReader(asm.GetManifestResourceStream(eltype, FOLDER_NAME + "." + SCHEMA_NAME))) + using (var rd = new System.IO.StreamReader(asm.GetManifestResourceStream($"{FOLDER_NAME}.{SCHEMA_NAME}"))) schema = rd.ReadToEnd(); //Get updates, and sort them according to version //This enables upgrading through several versions //ea, from 1 to 8, by stepping 2->3->4->5->6->7->8 SortedDictionary upgrades = new SortedDictionary(); - string prefix = eltype.Namespace + "." + FOLDER_NAME + "."; + string prefix = FOLDER_NAME + "."; foreach (string s in asm.GetManifestResourceNames()) { - //The resource name will be "Duplicati.GUI.Database_schema.1.Sample upgrade.sql" + //The resource name will be "Duplicati.Library.Main.Database.Database_schema.1.Sample upgrade.sql" //The number indicates the version that will be upgraded to if (s.StartsWith(prefix, StringComparison.Ordinal) && !s.Equals(prefix + SCHEMA_NAME)) { diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 399f3224c..e66df16c1 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -16,9 +16,9 @@ - + - + From 66eee70d1ead7561f3846f27ed4b57c2434bf341 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 3 Aug 2019 00:34:26 +0200 Subject: [PATCH 064/253] fixed some codacy findings fix CallContext --- .../Duplicati.GUI.TrayIcon/Win32IconLoader.cs | 2 + .../GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs | 64 ++++++++++--------- .../GUI/Duplicati.GUI.TrayIcon/Win32Window.cs | 5 +- .../Duplicati.Library.Localization.csproj | 4 ++ .../Localization/LocalizationContext.cs | 13 ++-- .../Localization/LocalizationService.cs | 9 ++- .../Library/Utility/CallContextSettings.cs | 19 ++---- 7 files changed, 58 insertions(+), 58 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs index cf984827d..afd7b1322 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32IconLoader.cs @@ -75,10 +75,12 @@ namespace Duplicati.GUI.TrayIcon private static SafeIconHandle LoadIcon(string filename) { lock (LOCK) + { if (ICONS.TryGetValue(filename, out SafeIconHandle ico)) return ico; else return new SafeIconHandle(LoadImage(IntPtr.Zero, Path.Combine(m_icofolder, filename), IMAGE_ICON, 16, 16, LR.LR_LOADFROMFILE)); + } } public static SafeIconHandle TrayNormalIcon { get { return LoadIcon("TrayNormal.ico"); } } diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs index 3fb54adef..bbca442d2 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Runner.cs @@ -26,10 +26,10 @@ namespace Duplicati.GUI.TrayIcon { private const string WINDOW_CLASSNAME = "DuplicatiMessageMonitorWindowTrayIcon"; private const int TRAY_ICON_ID_1 = 1; - public const int WM_TRAYICON_1 = Win32NativeNotifyIcon.WM_APP + 1; + private const int WM_TRAYICON_1 = Win32NativeNotifyIcon.WM_APP + 1; private readonly Win32Window m_window = new Win32Window(); private Win32NotifyIcon m_ntfIcon; - private bool m_TrayIconCreated = false; + private bool m_TrayIconCreated; List m_TrayContextMenu; public override void Init(string[] args) @@ -42,36 +42,38 @@ namespace Duplicati.GUI.TrayIcon private void MessageMonitor_MessageReceived(IntPtr hwnd, Win32NativeWindow.WindowsMessage message, IntPtr wParam, IntPtr lParam) { - switch (message) + if (message == Win32NativeWindow.WindowsMessage.WM_SHOWWINDOW) { - case Win32NativeWindow.WindowsMessage.WM_SHOWWINDOW: - if (!m_TrayIconCreated) - { - m_ntfIcon = new Win32NotifyIcon(m_window.Handle, TRAY_ICON_ID_1, WM_TRAYICON_1, - Win32IconLoader.TrayNormalIcon, Duplicati.Library.AutoUpdater.AutoUpdateSettings.AppName); - m_ntfIcon.Create(); - m_TrayIconCreated = true; - } - break; - case (Win32NativeWindow.WindowsMessage)WM_TRAYICON_1: - var llpTray = (Win32NativeWindow.WindowsMessage)((uint)lParam.ToInt32() & 0x0000FFFF); + if (!m_TrayIconCreated) + { + m_ntfIcon = new Win32NotifyIcon(m_window.Handle, TRAY_ICON_ID_1, WM_TRAYICON_1, + Win32IconLoader.TrayNormalIcon, Duplicati.Library.AutoUpdater.AutoUpdateSettings.AppName); + m_ntfIcon.Create(); + m_TrayIconCreated = true; + } + } - switch (llpTray) - { - case Win32NativeWindow.WindowsMessage.WM_LBUTTONDBLCLK: - m_onDoubleClick?.Invoke(); - break; - case Win32NativeWindow.WindowsMessage.WM_LBUTTONUP: - m_onSingleClick?.Invoke(); - break; - case Win32NativeWindow.WindowsMessage.WM_CONTEXTMENU: - Win32NativeMenu.ShowContextMenu(m_window.Handle, m_TrayContextMenu)?.Callback?.Invoke(); - break; - case Win32NativeWindow.WindowsMessage.NIN_BALLOONUSERCLICK: - m_onNotificationClick?.Invoke(); - break; - } - break; + if (message == (Win32NativeWindow.WindowsMessage)WM_TRAYICON_1) + { + var llpTray = (Win32NativeWindow.WindowsMessage)((uint)lParam.ToInt32() & 0x0000FFFF); + + switch (llpTray) + { + case Win32NativeWindow.WindowsMessage.WM_LBUTTONDBLCLK: + m_onDoubleClick?.Invoke(); + break; + case Win32NativeWindow.WindowsMessage.WM_LBUTTONUP: + m_onSingleClick?.Invoke(); + break; + case Win32NativeWindow.WindowsMessage.WM_CONTEXTMENU: + Win32NativeMenu.ShowContextMenu(m_window.Handle, m_TrayContextMenu)?.Callback?.Invoke(); + break; + case Win32NativeWindow.WindowsMessage.NIN_BALLOONUSERCLICK: + m_onNotificationClick?.Invoke(); + break; + default: + break; + } } } @@ -144,6 +146,8 @@ namespace Duplicati.GUI.TrayIcon m_ntfIcon?.SetIcon(Win32IconLoader.TrayWorkingIcon); break; case TrayIcons.Idle: + m_ntfIcon?.SetIcon(Win32IconLoader.TrayNormalIcon); + break; default: m_ntfIcon?.SetIcon(Win32IconLoader.TrayNormalIcon); break; diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs index 0aaf97eed..427e0c353 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Win32Window.cs @@ -44,7 +44,8 @@ namespace Duplicati.GUI.TrayIcon public void CreateWindow(string ClassName) { - if (string.IsNullOrEmpty(ClassName)) throw new ArgumentException("ClassName is null or empty"); + if (string.IsNullOrEmpty(ClassName)) + throw new ArgumentException("ClassName is null or empty"); if (Handle != IntPtr.Zero | m_classAtom != IntPtr.Zero) return; @@ -74,7 +75,7 @@ namespace Duplicati.GUI.TrayIcon Win32NativeWindow.ShowWindow(Handle, 1); Win32NativeWindow.ShowWindow(Handle, 0); - Win32NativeWindow.MSG msg = new Win32NativeWindow.MSG(); + var msg = new Win32NativeWindow.MSG(); while (Win32NativeWindow.GetMessage(out msg, IntPtr.Zero, 0, 0)) { diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 95fe534a3..97c49efc0 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -19,5 +19,9 @@ + + + + \ No newline at end of file diff --git a/Duplicati/Library/Localization/LocalizationContext.cs b/Duplicati/Library/Localization/LocalizationContext.cs index 35c7f8e25..1638cf443 100644 --- a/Duplicati/Library/Localization/LocalizationContext.cs +++ b/Duplicati/Library/Localization/LocalizationContext.cs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Logging.Duplicati.Library.Logging; using System; namespace Duplicati.Library.Localization { @@ -38,10 +39,9 @@ namespace Duplicati.Library.Localization /// The localization to use. public LocalizationContext(System.Globalization.CultureInfo ci) { - /* TODO-DNC - m_prev = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData(LocalizationService.LOGICAL_CONTEXT_KEY); - System.Runtime.Remoting.Messaging.CallContext.LogicalSetData(LocalizationService.LOGICAL_CONTEXT_KEY, ci.Name); - */ + m_prev = CallContext.GetData(LocalizationService.LOGICAL_CONTEXT_KEY) as string; + CallContext.SetData(LocalizationService.LOGICAL_CONTEXT_KEY, ci.Name); + m_isDisposed = false; } @@ -58,9 +58,8 @@ namespace Duplicati.Library.Localization { if (!m_isDisposed) { - /* TODO-DNC - System.Runtime.Remoting.Messaging.CallContext.LogicalSetData(LocalizationService.LOGICAL_CONTEXT_KEY, m_prev); - */ + CallContext.SetData(LocalizationService.LOGICAL_CONTEXT_KEY, m_prev); + m_isDisposed = true; } } diff --git a/Duplicati/Library/Localization/LocalizationService.cs b/Duplicati/Library/Localization/LocalizationService.cs index 6fee29a3e..818661c5c 100644 --- a/Duplicati/Library/Localization/LocalizationService.cs +++ b/Duplicati/Library/Localization/LocalizationService.cs @@ -21,6 +21,7 @@ using System.Globalization; using System.Collections.Generic; using System.Text.RegularExpressions; using Duplicati.Library.Localization.Short; +using Duplicati.Logging.Duplicati.Library.Logging; namespace Duplicati.Library.Localization { @@ -34,11 +35,10 @@ namespace Duplicati.Library.Localization /// private static Dictionary Services = new Dictionary(); - /* TODO-DNC /// /// The key for accessing logical context /// - internal const string LOGICAL_CONTEXT_KEY = "DUPLICATI_LOCALIZATION_CULTURE_CONTEXT"; */ + internal const string LOGICAL_CONTEXT_KEY = "DUPLICATI_LOCALIZATION_CULTURE_CONTEXT"; /// /// Regular expression to match a locale @@ -94,11 +94,10 @@ namespace Duplicati.Library.Localization { get { - /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md - var lc = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData(LOGICAL_CONTEXT_KEY) as string; + var lc = CallContext.GetData(LOGICAL_CONTEXT_KEY) as string; + if (!string.IsNullOrWhiteSpace(lc)) return Get(new CultureInfo(lc)); - */ return Get(CultureInfo.CurrentCulture); } } diff --git a/Duplicati/Library/Utility/CallContextSettings.cs b/Duplicati/Library/Utility/CallContextSettings.cs index ad3e937bd..efff8d636 100644 --- a/Duplicati/Library/Utility/CallContextSettings.cs +++ b/Duplicati/Library/Utility/CallContextSettings.cs @@ -21,7 +21,8 @@ using System.Net.Security; using System.Security.Cryptography.X509Certificates; using Duplicati.Library.Interface; - +using Duplicati.Logging.Duplicati.Library.Logging; + namespace Duplicati.Library.Utility { public static class SystemContextSettings @@ -315,10 +316,7 @@ namespace Duplicati.Library.Utility /// public ContextGuard() { - /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md - - CallContext.LogicalSetData(contextSettingsType, ID); - */ + CallContext.SetData(contextSettingsType, ID); } /// @@ -340,10 +338,7 @@ namespace Duplicati.Library.Utility _settings.Remove(ID); } - /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md - - CallContext.LogicalSetData(contextSettingsType, null); - */ + CallContext.SetData(contextSettingsType, null); } } @@ -355,11 +350,7 @@ namespace Duplicati.Library.Utility { get { - /* TODO-DNC - No supported Remoting - https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/porting.md - - return contextSettingsType != null ? CallContext.LogicalGetData(contextSettingsType) as string : null; - */ - return null; + return contextSettingsType != null ? CallContext.GetData(contextSettingsType) as string : null; } } } From 74a35ded5368d189ffc936d0fba350a382111031 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 3 Aug 2019 00:55:20 +0200 Subject: [PATCH 065/253] update to newer version --- .appveyor.yml | 21 ++++++++++++--------- .travis.yml | 10 +++++++--- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 7b33b5db2..4dc59d492 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -4,10 +4,13 @@ configuration: Debug platform: Any CPU environment: AUTOUPDATER_Duplicati_SKIP_UPDATE: 1 - UNITTEST_BASEFOLDER: C:\projects\duplicati\testdata COVERALLS_REPO_TOKEN: secure: szQsrkP5rvra8L60SomD73/dFvRwot0UuyA566zqzI2qmLOr+MhLN0AyC8BTbhYY before_build: + - ps: $env:UNITTEST_BASEFOLDER = "$Env:APPVEYOR_BUILD_FOLDER" + "\testdata" + - ps: if ($env:APPVEYOR_REPO_NAME.Equals("duplicati/duplicati")) { + $env:GITTER_NOTIFY_URL = "https://webhooks.gitter.im/e/a2c55bac2b5c38838e0f" + } - cmd: nuget restore Duplicati.sln build: project: Duplicati.sln @@ -19,9 +22,9 @@ test_script: 7z x DSMCBE.zip -otestdata mkdir .\testData\data - nuget install OpenCover -Version 4.6.166 -OutputDirectory packages - nuget install coveralls.net -Version 0.6.0 -OutputDirectory packages - nuget install NUnit.Runners -Version 3.4.0 -OutputDirectory packages + nuget install OpenCover -Version 4.7.922 -OutputDirectory packages + nuget install coveralls.net -Version 0.7.0 -OutputDirectory packages + nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory packages $testDir = ".\Duplicati\UnitTest\bin\Debug" $tests = @("$testDir\Duplicati.UnitTest.dll") @@ -30,10 +33,10 @@ test_script: foreach ($elem in $tests) { $testResultsFile = "$elem" + ".xml" - .\packages\OpenCover.4.6.166\tools\OpenCover.Console.exe ` + .\packages\OpenCover.4.7.922\tools\OpenCover.Console.exe ` -register:user ` - -target:.\packages\NUnit.ConsoleRunner.3.4.0\tools\nunit3-console.exe ` - "-targetargs:""$elem"" /framework:net-4.5 /where:cat!=BulkData /result:""$testResultsFile""" ` + -target:.\packages\NUnit.ConsoleRunner.3.10.0\tools\nunit3-console.exe ` + "-targetargs:""$elem"" /where:cat!=BulkData /result:""$testResultsFile""" ` "-filter:+[Duplicati.Library.Main]* -[UnitTest]*" ` -output:opencover.xml ` -returntargetcode ` @@ -54,7 +57,7 @@ test_script: $commitEmail = git show --quiet --format="%aE" $revision $commitMessage = git show --quiet --format="%s" $revision - .\packages\coveralls.net.0.6.0\tools\csmacnz.Coveralls.exe ` + .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe ` --opencover -i opencover.xml ` --repoToken "$Env:COVERALLS_REPO_TOKEN" ` --commitId "$revision" ` @@ -71,7 +74,7 @@ test_script: } notifications: - provider: Webhook - url: https://webhooks.gitter.im/e/a2c55bac2b5c38838e0f + url: $Env:GITTER_NOTIFY_URL method: POST on_build_success: true on_build_failure: true diff --git a/.travis.yml b/.travis.yml index 58ff9f993..1fffae46a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,10 +4,11 @@ solution: Duplicati.sln dotnet: 2.0.0 install: - nuget restore Duplicati.sln - - nuget install NUnit.Runners -Version 3.5.0 -OutputDirectory testrunner + - nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory testrunner + - sudo pip install --upgrade pip - sudo pip install selenium - sudo pip install --upgrade urllib3 - - if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.18.2 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.18.2 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.18.2; fi + - if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.23.0 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0; fi addons: coverity_scan: project: @@ -19,6 +20,8 @@ addons: branch_pattern: coverity_scan env: global: + - DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + - DOTNET_CLI_TELEMETRY_OPTOUT=1 # stop telemetry # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created # via the "travis encrypt" command using the project repo's public key - secure: "ijaQDcVcMo/utuP514FiDZVGR5LJbATWmYDmgRIIaI0YG2Rk6uuJp9XXDXr8sx66JWttPGgs7Htqfy50VKHdr7nsfyCQCRNGmqF+OJeUgAQMj5spxn9A7PZY9+GVhnXoJ06wvYjCv5MPeLBMDK/KpIM5Ny5IG+TKzQy4U7Dyg0riMUT61aqzxSjTGfHZPmaqBICJTzsRmeGHglemFUz/1B4NAN+IeAtXoH9YIfA2LjJfYmMLckPgFQLKN/tQRaGPWXh77y0qVgA++K8UVu5W3yGo3JXBPDdabGgKs9BPlfN5/Ixnkcy6ekAubDA/Aspur9x7/szj4/AnGMY6frNB33nQcnJQZ/51GYKr6CXCmjoJQuWc8ZKdEMqDn3w/kyEzvluSjAsJNRVboeWPE4VfpAeUBsjQ+TuEQi8WXhN8VJgZV7yCkVlZTVbhtOxMPsBiFb74lpWC2iQuWLJv9ED6vyXZVzZhNtfjXNXNZzIwYxbcd7I0ZQ8fmDstFnvBJveJby2ZRpECXTbc03eIUq1SAaVJJY2r47RD1PwVqM3xvUTljIqtKdyIz915mEOjqG1BnCDaiGHYJ4byuDDeIUZO9X70s60Gh4hupZA2Ruup0v7SfYgkto6aNcStd0NYd716Vd7hqXNTp6nu01L5YYJDY4h5sHyBXVXbxCKlUb01kUw=" @@ -69,7 +72,8 @@ jobs: access_key: $SAUCE_ACCESS_KEY before_install: - - echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- + - chmod +x ./build.sh # make the script executable if it already is not + - echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- script: - ./build.sh ${CATEGORY} ${TRAVIS_BUILD_DIR} From c90408aa2c7cabb105e4706a0b13725094879f1c Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 3 Aug 2019 00:57:53 +0200 Subject: [PATCH 066/253] newer build dependency --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 7f4610b83..3bfb919e9 100755 --- a/build.sh +++ b/build.sh @@ -76,7 +76,7 @@ echo "travis_fold:end:download_extract_testdata" # run unit tests echo "travis_fold:start:unit_test" if [[ "$CATEGORY" != "GUI" && "$CATEGORY" != "" ]]; then - mono ./testrunner/NUnit.ConsoleRunner.3.5.0/tools/nunit3-console.exe \ + mono ./testrunner/NUnit.ConsoleRunner.3.10.0/tools/nunit3-console.exe \ ./Duplicati/UnitTest/bin/Release/Duplicati.UnitTest.dll --where:cat==$CATEGORY --workers=1 fi echo "travis_fold:end:unit_test" From 8ad9f81356f89c16cab102cad5ebb8968b3b6e91 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 3 Aug 2019 01:14:56 +0200 Subject: [PATCH 067/253] test changes in unit tests --- .appveyor.yml | 2 +- .travis.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 4dc59d492..698c3a0f4 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -26,7 +26,7 @@ test_script: nuget install coveralls.net -Version 0.7.0 -OutputDirectory packages nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory packages - $testDir = ".\Duplicati\UnitTest\bin\Debug" + $testDir = ".\Duplicati\UnitTest\bin\Debug\netcoreapp2.0" $tests = @("$testDir\Duplicati.UnitTest.dll") $testsPassed = $true diff --git a/.travis.yml b/.travis.yml index 1fffae46a..7f839c2a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ install: - sudo pip install --upgrade pip - sudo pip install selenium - sudo pip install --upgrade urllib3 - - if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.23.0 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0; fi + #- if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.23.0 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0; fi addons: coverity_scan: project: From 87f9222a87f64d8fffbe7b6bd72694496c2e99f8 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 3 Aug 2019 01:27:45 +0200 Subject: [PATCH 068/253] revert test changes --- .appveyor.yml | 2 +- .travis.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 698c3a0f4..4dc59d492 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -26,7 +26,7 @@ test_script: nuget install coveralls.net -Version 0.7.0 -OutputDirectory packages nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory packages - $testDir = ".\Duplicati\UnitTest\bin\Debug\netcoreapp2.0" + $testDir = ".\Duplicati\UnitTest\bin\Debug" $tests = @("$testDir\Duplicati.UnitTest.dll") $testsPassed = $true diff --git a/.travis.yml b/.travis.yml index 7f839c2a2..1fffae46a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ install: - sudo pip install --upgrade pip - sudo pip install selenium - sudo pip install --upgrade urllib3 - #- if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.23.0 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0; fi + - if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.23.0 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0; fi addons: coverity_scan: project: From dd0b6add42bb82894f28e5969ec7b86b27d1aa12 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 5 Sep 2019 15:43:59 +0200 Subject: [PATCH 069/253] nuget update --- .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 1 - .../Duplicati.Library.Backend.AlternativeFTP.csproj | 2 +- .../Library/Backend/S3/Duplicati.Library.Backend.S3.csproj | 6 +++--- .../Compression/Duplicati.Library.Compression.csproj | 2 +- .../Localization/Duplicati.Library.Localization.csproj | 2 +- Duplicati/Library/Main/Duplicati.Library.Main.csproj | 1 - .../Builtin/Duplicati.Library.Modules.Builtin.csproj | 4 ++-- .../UsageReporter/Duplicati.Library.UsageReporter.csproj | 2 +- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 2 +- 9 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index be6f2d4bc..e335b445c 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -34,7 +34,6 @@ - diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 59d710521..df6319c4d 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index eead6e083..c0dbe96e4 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index c92a22bee..8c089df36 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 97c49efc0..1f9c04db0 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index c06290ee4..2bef41a2b 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -16,7 +16,6 @@ - diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index caadf0a38..f11fc511d 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index 1269abb54..b0bf1b3f2 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index e66df16c1..1b48cdadb 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -17,7 +17,7 @@ - + From 470d96e74845d1f2eb6685413dc9c473160b253e Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 5 Sep 2019 16:33:42 +0200 Subject: [PATCH 070/253] fixes autobuild --- .appveyor.yml | 2 +- .travis.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 4dc59d492..c9894df88 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -23,7 +23,7 @@ test_script: mkdir .\testData\data nuget install OpenCover -Version 4.7.922 -OutputDirectory packages - nuget install coveralls.net -Version 0.7.0 -OutputDirectory packages + nuget install coveralls.net -Version 1.0.0 -OutputDirectory packages nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory packages $testDir = ".\Duplicati\UnitTest\bin\Debug" diff --git a/.travis.yml b/.travis.yml index 1fffae46a..2727c0255 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ install: - sudo pip install --upgrade pip - sudo pip install selenium - sudo pip install --upgrade urllib3 - - if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.23.0 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.23.0; fi + - if [ ! -d "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.24.0 ]; then ln -s "${TRAVIS_BUILD_DIR}"/packages/sharpcompress.0.24.0 "${TRAVIS_BUILD_DIR}"/packages/SharpCompress.0.24.0; fi addons: coverity_scan: project: From 95584c2d0f707d226b728daadf6bd8b2dfcb8b42 Mon Sep 17 00:00:00 2001 From: BlueBlock Date: Fri, 6 Sep 2019 16:55:42 -0400 Subject: [PATCH 071/253] set project type to netcoreapp --- ...Duplicati.CommandLine.BackendTester.csproj | 6 +- .../Duplicati.CommandLine.BackendTool.csproj | 6 +- ...i.CommandLine.ConfigurationImporter.csproj | 8 +- .../CommandLine/Duplicati.CommandLine.csproj | 7 +- .../Duplicati.CommandLine.RecoveryTool.csproj | 6 +- .../Duplicati.GUI.TrayIcon.csproj | 306 +++++++++--------- .../Duplicati.Library.AutoUpdater.csproj | 8 +- ...cati.Library.Backend.AlternativeFTP.csproj | 2 +- .../Main/Duplicati.Library.Main.csproj | 4 +- .../Duplicati.Library.Snapshots.csproj | 2 +- .../Duplicati.Library.UsageReporter.csproj | 4 +- Duplicati/Server/Duplicati.Server.csproj | 8 +- Duplicati/Service/Duplicati.Service.csproj | 7 +- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 6 +- .../WindowsService/WindowsService.csproj | 6 +- 15 files changed, 195 insertions(+), 191 deletions(-) diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 751b9645d..a299ccedd 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -1,10 +1,10 @@  - netstandard2.0 - 2.0.0.7 Exe - LGPL, Copyright ? Duplicati Team 2015 + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.BackendTester Duplicati Team Duplicati Team diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index c230d6dd6..f434a50b5 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -1,10 +1,10 @@  - netstandard2.0 - 2.0.0.7 Exe - LGPL, Copyright ? Duplicati Team 2015 + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.BackendTool Duplicati Team Duplicati Team diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index f755f5560..fef7a5a7d 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -1,15 +1,17 @@  - netstandard2.0 + Exe + netcoreapp2.2 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.ConfigurationImporter Duplicati Team Duplicati Team ConfigurationImporter ConfigurationImporter + Duplicati.CommandLine.ConfigurationImporter + Duplicati.CommandLine.ConfigurationImporter diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index 17c001862..f72f077d3 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -1,10 +1,10 @@  - netstandard2.0 - 2.0.0.7 Exe - LGPL, Copyright ? Duplicati Team 2015 + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine Duplicati Team Duplicati Team @@ -16,6 +16,7 @@ + diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 2f6aa80ac..1f8341238 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -1,10 +1,10 @@  - netstandard2.0 - 2.0.0.7 Exe - LGPL, Copyright ? Duplicati Team 2015 + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.RecoveryTool Duplicati Team Duplicati Team diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index e335b445c..232d0e119 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,153 +1,155 @@ - - - - netstandard2.0 - 2.0.0.7 - Exe - LGPL, Copyright ? Duplicati Team 2015 - Duplicati.GUI.TrayIcon - Duplicati Team - Duplicati Team - The Duplicati Tray implementation - TrayIcon - Duplicati.GUI.TrayIcon - Duplicati.GUI.TrayIcon - Duplicati.ico - Duplicati.GUI.TrayIcon.Program - - - - - PreserveNewest - - - PreserveNewest - - - OSXTrayHost\rumps.py - PreserveNewest - - - - - - - - - - - - - - ..\..\..\thirdparty\appindicator-sharp\appindicator-sharp.dll - - - ..\..\..\thirdparty\appindicator-sharp\gdk-sharp.dll - - - ..\..\..\thirdparty\appindicator-sharp\gtk-sharp.dll - - - - - ..\..\..\thirdparty\MonoMac\MonoMac.dll - - - ..\..\..\thirdparty\notify-sharp\notify-sharp.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + Exe + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 + Duplicati.GUI.TrayIcon + Duplicati Team + Duplicati Team + The Duplicati Tray implementation + TrayIcon + Duplicati.GUI.TrayIcon + Duplicati.GUI.TrayIcon + Duplicati.ico + Duplicati.GUI.TrayIcon.Program + + + + + + + PreserveNewest + + + PreserveNewest + + + OSXTrayHost\rumps.py + PreserveNewest + + + + + + + + + + + + + + ..\..\..\thirdparty\appindicator-sharp\appindicator-sharp.dll + + + ..\..\..\thirdparty\appindicator-sharp\gdk-sharp.dll + + + ..\..\..\thirdparty\appindicator-sharp\gtk-sharp.dll + + + + + ..\..\..\thirdparty\MonoMac\MonoMac.dll + + + ..\..\..\thirdparty\notify-sharp\notify-sharp.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 7cba895db..1d1feeb86 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -3,13 +3,15 @@ netstandard2.0 2.0.0.7 - Exe - LGPL, Copyright © Duplicati Team 2015 + Library + LGPL, Copyright © Duplicati Team 2019 Duplicati.Library.AutoUpdater Duplicati Team Duplicati Team - AutoUpdater for Duplicati + AutoUpdater library for Duplicati AutoUpdater + Duplicati.Backend.AutoUpdater + Duplicati.Backend.AutoUpdater diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index df6319c4d..b3c46a821 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - + Library LGPL, Copyright © Duplicati Team 2015 Duplicati.Backend.AlternativeFTP Duplicati Team diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 2bef41a2b..9a86a1d52 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -19,6 +19,8 @@ + + @@ -33,8 +35,6 @@ - - diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 5bf6f29da..208e03710 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -16,11 +16,11 @@ + - diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index b0bf1b3f2..57786e68a 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 @@ -20,8 +20,8 @@ - + diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index f4a424997..a72d186c9 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -1,10 +1,10 @@  - netstandard2.0 - 2.0.0.7 Exe - LGPL, Copyright ? Duplicati Team 2015 + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 Duplicati.Server Duplicati Team Duplicati Team @@ -89,8 +89,6 @@ - - diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index d837820ec..838d9c082 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,10 +1,10 @@  - netstandard2.0 + netcoreapp2.2 2.0.0.7 - - LGPL, Copyright ? Duplicati Team 2015 + Exe + LGPL, Copyright ? Duplicati Team 2019 Duplicati.Service Duplicati Team Duplicati Team @@ -15,7 +15,6 @@ - diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 1b48cdadb..4f7319579 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -1,10 +1,10 @@  - netcoreapp2.0 - 2.0.0.7 Exe - LGPL, Copyright ? Duplicati Team 2015 + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 Duplicati.UnitTest Duplicati Team Duplicati Team diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 110371e10..71516456d 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -1,10 +1,10 @@  - netstandard2.0 - 2.0.0.7 Exe - LGPL, Copyright © Duplicati Team 2015 + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright © Duplicati Team 2019 Duplicati.WindowsService Duplicati Team Duplicati Team From 1c28cf0b15e83d34f489226a6c5825e4305ec655 Mon Sep 17 00:00:00 2001 From: BlueBlock Date: Fri, 6 Sep 2019 16:57:44 -0400 Subject: [PATCH 072/253] refactor AutoUpdater to an exe and a library --- Duplicati.sln | 106 ++--- .../Duplicati.CommandLine.AutoUpdater.csproj | 23 ++ .../AutoUpdater/Program.cs | 286 ++++++------- .../Library/AutoUpdater/AutoUpdateSettings.cs | 4 +- .../Library/AutoUpdater/UpdaterManager.cs | 5 +- Duplicati/Library/Snapshots/LinuxSnapshot.cs | 2 +- Duplicati/Library/UsageReporter/Reporter.cs | 2 +- .../SignatureReadingStream.cs | 388 +++++++++--------- 8 files changed, 425 insertions(+), 391 deletions(-) create mode 100644 Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj rename Duplicati/{Library => CommandLine}/AutoUpdater/Program.cs (85%) rename Duplicati/Library/{AutoUpdater => Utility}/SignatureReadingStream.cs (95%) diff --git a/Duplicati.sln b/Duplicati.sln index 35e1e1594..7b80c0e98 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -3,105 +3,107 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29102.190 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Utility", "Duplicati\Library\Utility\Duplicati.Library.Utility.csproj", "{DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Utility", "Duplicati\Library\Utility\Duplicati.Library.Utility.csproj", "{DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Main", "Duplicati\Library\Main\Duplicati.Library.Main.csproj", "{10D2D1B7-C664-41D8-9B3A-00040C3D421B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Main", "Duplicati\Library\Main\Duplicati.Library.Main.csproj", "{10D2D1B7-C664-41D8-9B3A-00040C3D421B}" 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}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "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.Backend.FTP", "Duplicati\Library\Backend\FTP\Duplicati.Library.Backend.FTP.csproj", "{F61679A9-E5DE-468A-B5A4-05F92D0143D2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "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.Compression", "Duplicati\Library\Compression\Duplicati.Library.Compression.csproj", "{19ECCE09-B5EB-406C-8C57-BAC66997D469}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Compression", "Duplicati\Library\Compression\Duplicati.Library.Compression.csproj", "{19ECCE09-B5EB-406C-8C57-BAC66997D469}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Logging", "Duplicati\Library\Logging\Duplicati.Library.Logging.csproj", "{D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Logging", "Duplicati\Library\Logging\Duplicati.Library.Logging.csproj", "{D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}" 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}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.S3", "Duplicati\Library\Backend\S3\Duplicati.Library.Backend.S3.csproj", "{C03F6DFD-805A-4BE0-9338-64870ADDB4A2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Duplicati\CommandLine\Duplicati.CommandLine.csproj", "{81765A64-3661-4E3E-B850-2F6F87A51F74}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine", "Duplicati\CommandLine\Duplicati.CommandLine.csproj", "{81765A64-3661-4E3E-B850-2F6F87A51F74}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.WEBDAV", "Duplicati\Library\Backend\WEBDAV\Duplicati.Library.Backend.WEBDAV.csproj", "{BAE27510-8B5D-44B2-B33E-372A98908041}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.WEBDAV", "Duplicati\Library\Backend\WEBDAV\Duplicati.Library.Backend.WEBDAV.csproj", "{BAE27510-8B5D-44B2-B33E-372A98908041}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.CloudFiles", "Duplicati\Library\Backend\CloudFiles\Duplicati.Library.Backend.CloudFiles.csproj", "{1BFAE226-8364-4086-825C-BB83F6F3EE4C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.CloudFiles", "Duplicati\Library\Backend\CloudFiles\Duplicati.Library.Backend.CloudFiles.csproj", "{1BFAE226-8364-4086-825C-BB83F6F3EE4C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTester", "Duplicati\CommandLine\BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{E7280DCA-7776-4A73-B9B5-41FD77FC8799}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTester", "Duplicati\CommandLine\BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{E7280DCA-7776-4A73-B9B5-41FD77FC8799}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Interface", "Duplicati\Library\Interface\Duplicati.Library.Interface.csproj", "{C5899F45-B0FF-483C-9D38-24A9FCAAB237}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Interface", "Duplicati\Library\Interface\Duplicati.Library.Interface.csproj", "{C5899F45-B0FF-483C-9D38-24A9FCAAB237}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.DynamicLoader", "Duplicati\Library\DynamicLoader\Duplicati.Library.DynamicLoader.csproj", "{0CA86ECF-5BEC-4909-B4F6-110A03B30B92}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.DynamicLoader", "Duplicati\Library\DynamicLoader\Duplicati.Library.DynamicLoader.csproj", "{0CA86ECF-5BEC-4909-B4F6-110A03B30B92}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Snapshots", "Duplicati\Library\Snapshots\Duplicati.Library.Snapshots.csproj", "{D63E53E4-A458-4C2F-914D-92F715F58ACE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Snapshots", "Duplicati\Library\Snapshots\Duplicati.Library.Snapshots.csproj", "{D63E53E4-A458-4C2F-914D-92F715F58ACE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.License", "Duplicati\License\Duplicati.License.csproj", "{4D012CB1-4B92-47F4-89B7-BF80A73A2E99}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.License", "Duplicati\License\Duplicati.License.csproj", "{4D012CB1-4B92-47F4-89B7-BF80A73A2E99}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Modules.Builtin", "Duplicati\Library\Modules\Builtin\Duplicati.Library.Modules.Builtin.csproj", "{52826615-7964-47FE-B4B3-1B2DBDF605B9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Modules.Builtin", "Duplicati\Library\Modules\Builtin\Duplicati.Library.Modules.Builtin.csproj", "{52826615-7964-47FE-B4B3-1B2DBDF605B9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.TahoeLAFS", "Duplicati\Library\Backend\TahoeLAFS\Duplicati.Library.Backend.TahoeLAFS.csproj", "{C0270709-2A40-43B5-8CF1-69581B9FA2A1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.TahoeLAFS", "Duplicati\Library\Backend\TahoeLAFS\Duplicati.Library.Backend.TahoeLAFS.csproj", "{C0270709-2A40-43B5-8CF1-69581B9FA2A1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.OneDrive", "Duplicati\Library\Backend\OneDrive\Duplicati.Library.Backend.OneDrive.csproj", "{CCD76347-7DC7-4B42-B7E1-E500E624CAC3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.OneDrive", "Duplicati\Library\Backend\OneDrive\Duplicati.Library.Backend.OneDrive.csproj", "{CCD76347-7DC7-4B42-B7E1-E500E624CAC3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.SSHv2", "Duplicati\Library\Backend\SSHv2\Duplicati.Library.Backend.SSHv2.csproj", "{FF2BF37C-E502-4C98-BEA0-701671DDFA08}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.SSHv2", "Duplicati\Library\Backend\SSHv2\Duplicati.Library.Backend.SSHv2.csproj", "{FF2BF37C-E502-4C98-BEA0-701671DDFA08}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Server", "Duplicati\Server\Duplicati.Server.csproj", "{19E661D2-C5DA-4F35-B3EE-7586E5734B5F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Server", "Duplicati\Server\Duplicati.Server.csproj", "{19E661D2-C5DA-4F35-B3EE-7586E5734B5F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.GUI.TrayIcon", "Duplicati\GUI\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{17566860-3D98-4604-AA5B-47661F75609F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.GUI.TrayIcon", "Duplicati\GUI\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{17566860-3D98-4604-AA5B-47661F75609F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Server.Serialization", "Duplicati\Server\Duplicati.Server.Serialization\Duplicati.Server.Serialization.csproj", "{33FD1D24-C28F-4C71-933F-98F1586EA76C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Server.Serialization", "Duplicati\Server\Duplicati.Server.Serialization\Duplicati.Server.Serialization.csproj", "{33FD1D24-C28F-4C71-933F-98F1586EA76C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTool", "Duplicati\CommandLine\BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{2AF960C0-357D-4D44-A3D5-8B6E89DB0F11}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTool", "Duplicati\CommandLine\BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{2AF960C0-357D-4D44-A3D5-8B6E89DB0F11}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.SQLiteHelper", "Duplicati\Library\SQLiteHelper\Duplicati.Library.SQLiteHelper.csproj", "{2C838169-B187-4B09-8768-1C24C2521C8D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.SQLiteHelper", "Duplicati\Library\SQLiteHelper\Duplicati.Library.SQLiteHelper.csproj", "{2C838169-B187-4B09-8768-1C24C2521C8D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Localization", "Duplicati\Library\Localization\Duplicati.Library.Localization.csproj", "{B68F2214-951F-4F78-8488-66E1ED3F50BF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Localization", "Duplicati\Library\Localization\Duplicati.Library.Localization.csproj", "{B68F2214-951F-4F78-8488-66E1ED3F50BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.AutoUpdater", "Duplicati\Library\AutoUpdater\Duplicati.Library.AutoUpdater.csproj", "{7E119745-1F62-43F0-936C-F312A1912C0B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.AutoUpdater", "Duplicati\Library\AutoUpdater\Duplicati.Library.AutoUpdater.csproj", "{7E119745-1F62-43F0-936C-F312A1912C0B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Service", "Duplicati\Service\Duplicati.Service.csproj", "{E93F3DE2-FF3A-4709-96A3-8190AA14FA25}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Service", "Duplicati\Service\Duplicati.Service.csproj", "{E93F3DE2-FF3A-4709-96A3-8190AA14FA25}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.AzureBlob", "Duplicati\Library\Backend\AzureBlob\Duplicati.Library.Backend.AzureBlob.csproj", "{8E4CECFB-0413-4B00-AB93-78D1C3902BD5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.AzureBlob", "Duplicati\Library\Backend\AzureBlob\Duplicati.Library.Backend.AzureBlob.csproj", "{8E4CECFB-0413-4B00-AB93-78D1C3902BD5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.UnitTest", "Duplicati\UnitTest\Duplicati.UnitTest.csproj", "{ECB63D1C-1724-442D-9228-DEABF14F2EA3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.UnitTest", "Duplicati\UnitTest\Duplicati.UnitTest.csproj", "{ECB63D1C-1724-442D-9228-DEABF14F2EA3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.OAuthHelper", "Duplicati\Library\Backend\OAuthHelper\Duplicati.Library.OAuthHelper.csproj", "{D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.OAuthHelper", "Duplicati\Library\Backend\OAuthHelper\Duplicati.Library.OAuthHelper.csproj", "{D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.GoogleServices", "Duplicati\Library\Backend\GoogleServices\Duplicati.Library.Backend.GoogleServices.csproj", "{5489181D-950C-44AF-873C-45EB0A3B6BD2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.GoogleServices", "Duplicati\Library\Backend\GoogleServices\Duplicati.Library.Backend.GoogleServices.csproj", "{5489181D-950C-44AF-873C-45EB0A3B6BD2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.OpenStack", "Duplicati\Library\Backend\OpenStack\Duplicati.Library.Backend.OpenStack.csproj", "{D9E4E686-423C-48EC-A392-404E7C00860C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.OpenStack", "Duplicati\Library\Backend\OpenStack\Duplicati.Library.Backend.OpenStack.csproj", "{D9E4E686-423C-48EC-A392-404E7C00860C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.HubiC", "Duplicati\Library\Backend\HubiC\Duplicati.Library.Backend.HubiC.csproj", "{D60AD540-0E7D-40CE-83AE-D26E01FFE9B8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.HubiC", "Duplicati\Library\Backend\HubiC\Duplicati.Library.Backend.HubiC.csproj", "{D60AD540-0E7D-40CE-83AE-D26E01FFE9B8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.RecoveryTool", "Duplicati\CommandLine\RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{4A010589-76E6-4F05-A5C4-4598D5DF11F8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.RecoveryTool", "Duplicati\CommandLine\RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{4A010589-76E6-4F05-A5C4-4598D5DF11F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.AmazonCloudDrive", "Duplicati\Library\Backend\AmazonCloudDrive\Duplicati.Library.Backend.AmazonCloudDrive.csproj", "{08D7E42D-285C-4010-9881-986125FE2F3E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.AmazonCloudDrive", "Duplicati\Library\Backend\AmazonCloudDrive\Duplicati.Library.Backend.AmazonCloudDrive.csproj", "{08D7E42D-285C-4010-9881-986125FE2F3E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Backblaze", "Duplicati\Library\Backend\Backblaze\Duplicati.Library.Backend.Backblaze.csproj", "{61C43D61-4368-4942-84A3-1EB623F4EF2A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Backblaze", "Duplicati\Library\Backend\Backblaze\Duplicati.Library.Backend.Backblaze.csproj", "{61C43D61-4368-4942-84A3-1EB623F4EF2A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Mega", "Duplicati\Library\Backend\Mega\Duplicati.Library.Backend.Mega.csproj", "{6643A5AE-AB38-453F-ADCE-408E35A81A83}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Mega", "Duplicati\Library\Backend\Mega\Duplicati.Library.Backend.Mega.csproj", "{6643A5AE-AB38-453F-ADCE-408E35A81A83}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Box", "Duplicati\Library\Backend\Box\Duplicati.Library.Backend.Box.csproj", "{3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Box", "Duplicati\Library\Backend\Box\Duplicati.Library.Backend.Box.csproj", "{3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.UsageReporter", "Duplicati\Library\UsageReporter\Duplicati.Library.UsageReporter.csproj", "{BB014EA5-CE2C-4444-8D30-38983A0E8553}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.UsageReporter", "Duplicati\Library\UsageReporter\Duplicati.Library.UsageReporter.csproj", "{BB014EA5-CE2C-4444-8D30-38983A0E8553}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.SharePoint", "Duplicati\Library\Backend\SharePoint\Duplicati.Library.Backend.SharePoint.csproj", "{59C8BBC5-6E42-46FB-AB3E-6C183A82459A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.SharePoint", "Duplicati\Library\Backend\SharePoint\Duplicati.Library.Backend.SharePoint.csproj", "{59C8BBC5-6E42-46FB-AB3E-6C183A82459A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsService", "Duplicati\WindowsService\WindowsService.csproj", "{BEF7AF9A-3978-4F90-8592-198BF6EA6C6B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WindowsService", "Duplicati\WindowsService\WindowsService.csproj", "{BEF7AF9A-3978-4F90-8592-198BF6EA6C6B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.AlternativeFTP", "Duplicati\Library\Backend\AlternativeFTP\Duplicati.Library.Backend.AlternativeFTP.csproj", "{3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.AlternativeFTP", "Duplicati\Library\Backend\AlternativeFTP\Duplicati.Library.Backend.AlternativeFTP.csproj", "{3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Dropbox", "Duplicati\Library\Backend\Dropbox\Duplicati.Library.Backend.Dropbox.csproj", "{B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Dropbox", "Duplicati\Library\Backend\Dropbox\Duplicati.Library.Backend.Dropbox.csproj", "{B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Tools", "Duplicati\Tools\Duplicati.Tools.csproj", "{0797AA22-C5DD-4950-BB60-34765AB8C6DD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Tools", "Duplicati\Tools\Duplicati.Tools.csproj", "{0797AA22-C5DD-4950-BB60-34765AB8C6DD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Jottacloud", "Duplicati\Library\Backend\Jottacloud\Duplicati.Library.Backend.Jottacloud.csproj", "{2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Jottacloud", "Duplicati\Library\Backend\Jottacloud\Duplicati.Library.Backend.Jottacloud.csproj", "{2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Sia", "Duplicati\Library\Backend\Sia\Duplicati.Library.Backend.Sia.csproj", "{32A74526-3E5F-413A-8CB4-1EFDAD4C8B91}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Sia", "Duplicati\Library\Backend\Sia\Duplicati.Library.Backend.Sia.csproj", "{32A74526-3E5F-413A-8CB4-1EFDAD4C8B91}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Rclone", "Duplicati\Library\Backend\Rclone\Duplicati.Library.Backend.Rclone.csproj", "{851A1CB8-3CEB-41B4-956F-34D760D2A8E5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Rclone", "Duplicati\Library\Backend\Rclone\Duplicati.Library.Backend.Rclone.csproj", "{851A1CB8-3CEB-41B4-956F-34D760D2A8E5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Common", "Duplicati\Library\Common\Duplicati.Library.Common.csproj", "{D63E53E4-A458-4C2F-914D-92F715F58ACF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Common", "Duplicati\Library\Common\Duplicati.Library.Common.csproj", "{D63E53E4-A458-4C2F-914D-92F715F58ACF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.ConfigurationImporter", "Duplicati\CommandLine\ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{B93E3BF0-DAA7-49B7-B07D-0559C5816735}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.ConfigurationImporter", "Duplicati\CommandLine\ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{B93E3BF0-DAA7-49B7-B07D-0559C5816735}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Encryption", "Duplicati\Library\Encryption\Duplicati.Library.Encryption.csproj", "{2CF2D90E-C25B-47AD-91E0-98451BAB8058}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Encryption", "Duplicati\Library\Encryption\Duplicati.Library.Encryption.csproj", "{2CF2D90E-C25B-47AD-91E0-98451BAB8058}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.AutoUpdater", "Duplicati\CommandLine\AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{4D1B198B-F773-44F2-872B-2B283053323C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -309,6 +311,10 @@ Global {2CF2D90E-C25B-47AD-91E0-98451BAB8058}.Debug|Any CPU.Build.0 = Debug|Any CPU {2CF2D90E-C25B-47AD-91E0-98451BAB8058}.Release|Any CPU.ActiveCfg = Release|Any CPU {2CF2D90E-C25B-47AD-91E0-98451BAB8058}.Release|Any CPU.Build.0 = Release|Any CPU + {4D1B198B-F773-44F2-872B-2B283053323C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D1B198B-F773-44F2-872B-2B283053323C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D1B198B-F773-44F2-872B-2B283053323C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D1B198B-F773-44F2-872B-2B283053323C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj new file mode 100644 index 000000000..469385ccd --- /dev/null +++ b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -0,0 +1,23 @@ + + + + Exe + netcoreapp2.2 + 2.0.0.7 + LGPL, Copyright ? Duplicati Team 2019 + Duplicati.CommandLine.AutoUpdater + Duplicati Team + Duplicati Team + AutoUpdater + CommandLineAutoUpdater + Duplicati.CommandLine.AutoUpdater + Duplicati.CommandLine.AutoUpdater + + + + + + + + + diff --git a/Duplicati/Library/AutoUpdater/Program.cs b/Duplicati/CommandLine/AutoUpdater/Program.cs similarity index 85% rename from Duplicati/Library/AutoUpdater/Program.cs rename to Duplicati/CommandLine/AutoUpdater/Program.cs index 92ced508c..c5cc8573d 100644 --- a/Duplicati/Library/AutoUpdater/Program.cs +++ b/Duplicati/CommandLine/AutoUpdater/Program.cs @@ -1,143 +1,147 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Collections.Generic; +#region Disclaimer / License +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +#endregion +using System; +using System.Linq; +using System.Collections.Generic; +using Duplicati.Library.AutoUpdater; using Duplicati.Library.Common.IO; -namespace Duplicati.Library.AutoUpdater -{ - public static class Program - { - public static int Main(string[] args) - { - // Ignore webroot during startup verification - Duplicati.Library.AutoUpdater.UpdaterManager.IgnoreWebrootFolder = true; - return Duplicati.Library.AutoUpdater.UpdaterManager.RunFromMostRecent(typeof(Program).GetMethod("RealMain"), args, AutoUpdateStrategy.Never); - } - - public static int RealMain(string[] _args) - { - // Enable webroot checks for the verifier - Duplicati.Library.AutoUpdater.UpdaterManager.IgnoreWebrootFolder = false; - - var args = new List(_args); - Duplicati.Library.Utility.CommandLineParser.ExtractOptions(args); - - if (args.Count == 0) - { - WriteUsage(); - return 100; - } - else if (args.Count != 1) - { - Console.WriteLine("Invalid number of arguments, got {0}:{1}{1}{2}{1}{1}", args.Count, Environment.NewLine, string.Join(Environment.NewLine, args)); - return 100; - } - - UpdaterManager.OnError += (ex) => Console.WriteLine("Error detected: {0}", ex); - - var cmd = args[0].ToLowerInvariant().Trim(); - switch (cmd) - { - case "help": - WriteUsage(); - return 0; - case "list": - { - var versions = UpdaterManager.FindInstalledVersions(); - var selfdir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); - if (string.Equals(Util.AppendDirSeparator(selfdir), Util.AppendDirSeparator(UpdaterManager.InstalledBaseDir))) - versions = versions.Union(new KeyValuePair[] { new KeyValuePair(selfdir, UpdaterManager.SelfVersion) }); - Console.WriteLine(string.Join(Environment.NewLine, versions.Select(x => string.Format(" {0} {1} ({2})", (x.Value.Version == UpdaterManager.SelfVersion.Version ? "*" : "-"), x.Value.Displayname, x.Value.Version)))); - return 0; - } - - case "verify": - { - var versions = UpdaterManager.FindInstalledVersions(); - var selfdir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); - if (string.Equals(Util.AppendDirSeparator(selfdir), Util.AppendDirSeparator(UpdaterManager.InstalledBaseDir))) - versions = versions.Union(new KeyValuePair[] { new KeyValuePair(selfdir, UpdaterManager.SelfVersion) }); - - Console.WriteLine(string.Join(Environment.NewLine, versions.Select(x => string.Format(" {0} {1} ({2}): {3}", (x.Value.Version == UpdaterManager.SelfVersion.Version ? "*" : "-"), x.Value.Displayname, x.Value.Version, UpdaterManager.VerifyUnpackedFolder(x.Key, x.Value) ? "Valid" : "*** Modified ***")))); - return 0; - } - case "check": - { - var update = UpdaterManager.CheckForUpdate(); - if (update == null) - Console.WriteLine("No updates found"); - else if (update.Version == UpdaterManager.SelfVersion.Version) - Console.WriteLine("You are running the latest version: {0}", update.Displayname); - else - Console.WriteLine("New version is available: {0}", update.Displayname); - - return 0; - } - case "install": - { - var update = UpdaterManager.CheckForUpdate(); - if (update == null || update.Version == UpdaterManager.SelfVersion.Version) - { - Console.WriteLine("You are running the latest version: {0} ({1})", UpdaterManager.SelfVersion.Displayname, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); - return 0; - } - Console.WriteLine("Downloading update \"{0}\" ...", update.Displayname); - - long lastpg = 0; - UpdaterManager.DownloadAndUnpackUpdate(update, f => { - var npg = (long)(f*100); - if (Math.Abs(npg - lastpg) >= 5 || (npg == 100 && lastpg != 100)) - { - lastpg = npg; - Console.WriteLine("Downloading {0}% ...", npg); - } - }); - - Console.WriteLine("New version \"{0}\" installed!", update.Displayname); - return 0; - } - default: - Console.WriteLine("Unknown command: \"{0}\"", args[0]); - Console.WriteLine(); - Console.WriteLine("Try the command \"{0}\" instead", "help"); - return 100; - } - } - - private static void WriteUsage() - { - Console.WriteLine("Usage:{0}\t{1}{2} [LIST|VERIFY|CHECK|INSTALL|HELP]", Environment.NewLine, Duplicati.Library.Utility.Utility.IsMono ? "mono " : "", System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location)); - Console.WriteLine(); - Console.WriteLine("Environment variables:"); - Console.WriteLine(); - Console.WriteLine("{0} - Disables updates completely", string.Format(UpdaterManager.SKIPUPDATE_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName)); - Console.WriteLine("{0} - Choose how to handle updates, valid settings: {1}", string.Format(UpdaterManager.UPDATE_STRATEGY_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName), string.Join(", ", Enum.GetNames(typeof(AutoUpdateStrategy)))); - Console.WriteLine("{0} - Use alternate updates urls", string.Format(AutoUpdateSettings.UPDATEURL_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName)); - Console.WriteLine("{0} - Choose different channel than the default {1}, valid settings: {2}", string.Format(AutoUpdateSettings.UPDATECHANNEL_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName), AutoUpdater.AutoUpdateSettings.DefaultUpdateChannel, string.Join(",", Enum.GetNames(typeof(ReleaseType)).Where( x => x != ReleaseType.Unknown.ToString()))); - Console.WriteLine(); - Console.WriteLine("Updates are downloaded from: {0}", string.Join(";", AutoUpdateSettings.URLs)); - Console.WriteLine("Updates are installed in: {0}", UpdaterManager.INSTALLDIR); - Console.WriteLine("The base version is \"{0}\" ({1}) and is installed in: {2}", UpdaterManager.BaseVersion.Displayname, UpdaterManager.BaseVersion.Version, UpdaterManager.InstalledBaseDir); - Console.WriteLine("This version is \"{0}\" ({1}) and is installed in: {2}", UpdaterManager.SelfVersion.Displayname, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); - Console.WriteLine(); - } - } -} - +namespace Duplicati.CommandLine.AutoUpdater +{ + public static class Program + { + [STAThread] + public static int Main(string[] args) + { + // Ignore webroot during startup verification + Duplicati.Library.AutoUpdater.UpdaterManager.IgnoreWebrootFolder = true; + return Duplicati.Library.AutoUpdater.UpdaterManager.RunFromMostRecent(typeof(Program).GetMethod("RealMain"), args, AutoUpdateStrategy.Never); + } + + public static int RealMain(string[] _args) + { + // Enable webroot checks for the verifier + Duplicati.Library.AutoUpdater.UpdaterManager.IgnoreWebrootFolder = false; + + var args = new List(_args); + Duplicati.Library.Utility.CommandLineParser.ExtractOptions(args); + + if (args.Count == 0) + { + WriteUsage(); + return 100; + } + else if (args.Count != 1) + { + Console.WriteLine("Invalid number of arguments, got {0}:{1}{1}{2}{1}{1}", args.Count, Environment.NewLine, string.Join(Environment.NewLine, args)); + return 100; + } + + UpdaterManager.OnError += (ex) => Console.WriteLine("Error detected: {0}", ex); + + var cmd = args[0].ToLowerInvariant().Trim(); + switch (cmd) + { + case "help": + WriteUsage(); + return 0; + case "list": + { + var versions = UpdaterManager.FindInstalledVersions(); + var selfdir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + if (string.Equals(Util.AppendDirSeparator(selfdir), Util.AppendDirSeparator(UpdaterManager.InstalledBaseDir))) + versions = versions.Union(new KeyValuePair[] { new KeyValuePair(selfdir, UpdaterManager.SelfVersion) }); + Console.WriteLine(string.Join(Environment.NewLine, versions.Select(x => string.Format(" {0} {1} ({2})", (x.Value.Version == UpdaterManager.SelfVersion.Version ? "*" : "-"), x.Value.Displayname, x.Value.Version)))); + return 0; + } + + case "verify": + { + var versions = UpdaterManager.FindInstalledVersions(); + var selfdir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + if (string.Equals(Util.AppendDirSeparator(selfdir), Util.AppendDirSeparator(UpdaterManager.InstalledBaseDir))) + versions = versions.Union(new KeyValuePair[] { new KeyValuePair(selfdir, UpdaterManager.SelfVersion) }); + + Console.WriteLine(string.Join(Environment.NewLine, versions.Select(x => string.Format(" {0} {1} ({2}): {3}", (x.Value.Version == UpdaterManager.SelfVersion.Version ? "*" : "-"), x.Value.Displayname, x.Value.Version, UpdaterManager.VerifyUnpackedFolder(x.Key, x.Value) ? "Valid" : "*** Modified ***")))); + return 0; + } + case "check": + { + var update = UpdaterManager.CheckForUpdate(); + if (update == null) + Console.WriteLine("No updates found"); + else if (update.Version == UpdaterManager.SelfVersion.Version) + Console.WriteLine("You are running the latest version: {0}", update.Displayname); + else + Console.WriteLine("New version is available: {0}", update.Displayname); + + return 0; + } + case "install": + { + var update = UpdaterManager.CheckForUpdate(); + if (update == null || update.Version == UpdaterManager.SelfVersion.Version) + { + Console.WriteLine("You are running the latest version: {0} ({1})", UpdaterManager.SelfVersion.Displayname, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); + return 0; + } + Console.WriteLine("Downloading update \"{0}\" ...", update.Displayname); + + long lastpg = 0; + UpdaterManager.DownloadAndUnpackUpdate(update, f => { + var npg = (long)(f * 100); + if (Math.Abs(npg - lastpg) >= 5 || (npg == 100 && lastpg != 100)) + { + lastpg = npg; + Console.WriteLine("Downloading {0}% ...", npg); + } + }); + + Console.WriteLine("New version \"{0}\" installed!", update.Displayname); + return 0; + } + default: + Console.WriteLine("Unknown command: \"{0}\"", args[0]); + Console.WriteLine(); + Console.WriteLine("Try the command \"{0}\" instead", "help"); + return 100; + } + } + + private static void WriteUsage() + { + Console.WriteLine("Usage:{0}\t{1}{2} [LIST|VERIFY|CHECK|INSTALL|HELP]", Environment.NewLine, Duplicati.Library.Utility.Utility.IsMono ? "mono " : "", System.IO.Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().Location)); + Console.WriteLine(); + Console.WriteLine("Environment variables:"); + Console.WriteLine(); + Console.WriteLine("{0} - Disables updates completely", string.Format(UpdaterManager.SKIPUPDATE_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName)); + Console.WriteLine("{0} - Choose how to handle updates, valid settings: {1}", string.Format(UpdaterManager.UPDATE_STRATEGY_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName), string.Join(", ", Enum.GetNames(typeof(AutoUpdateStrategy)))); + Console.WriteLine("{0} - Use alternate updates urls", string.Format(AutoUpdateSettings.UPDATEURL_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName)); + Console.WriteLine("{0} - Choose different channel than the default {1}, valid settings: {2}", string.Format(AutoUpdateSettings.UPDATECHANNEL_ENVNAME_TEMPLATE, AutoUpdateSettings.AppName), Duplicati.Library.AutoUpdater.AutoUpdateSettings.DefaultUpdateChannel, string.Join(",", Enum.GetNames(typeof(ReleaseType)).Where(x => x != ReleaseType.Unknown.ToString()))); + Console.WriteLine(); + Console.WriteLine("Updates are downloaded from: {0}", string.Join(";", AutoUpdateSettings.URLs)); + Console.WriteLine("Updates are installed in: {0}", UpdaterManager.INSTALLDIR); + Console.WriteLine("The base version is \"{0}\" ({1}) and is installed in: {2}", UpdaterManager.BaseVersion.Displayname, UpdaterManager.BaseVersion.Version, UpdaterManager.InstalledBaseDir); + Console.WriteLine("This version is \"{0}\" ({1}) and is installed in: {2}", UpdaterManager.SelfVersion.Displayname, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); + Console.WriteLine(); + } + } +} + diff --git a/Duplicati/Library/AutoUpdater/AutoUpdateSettings.cs b/Duplicati/Library/AutoUpdater/AutoUpdateSettings.cs index 7c4ec1289..58d9f5478 100644 --- a/Duplicati/Library/AutoUpdater/AutoUpdateSettings.cs +++ b/Duplicati/Library/AutoUpdater/AutoUpdateSettings.cs @@ -38,8 +38,8 @@ namespace Duplicati.Library.AutoUpdater private const string OEM_UPDATE_README = "oem-update-readme.txt"; private const string OEM_UPDATE_INSTALL_FILE = "oem-update-installid.txt"; - internal const string UPDATEURL_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_URLS"; - internal const string UPDATECHANNEL_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_CHANNEL"; + public const string UPDATEURL_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_URLS"; + public const string UPDATECHANNEL_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_CHANNEL"; internal const string MATCH_UPDATE_URL_PREFIX_GROUP = "prefix"; internal const string MATCH_UPDATE_URL_CHANNEL_GROUP = "channel"; diff --git a/Duplicati/Library/AutoUpdater/UpdaterManager.cs b/Duplicati/Library/AutoUpdater/UpdaterManager.cs index f619663da..b695488a9 100644 --- a/Duplicati/Library/AutoUpdater/UpdaterManager.cs +++ b/Duplicati/Library/AutoUpdater/UpdaterManager.cs @@ -24,6 +24,7 @@ using System.Threading.Tasks; using Duplicati.Library.Interface; using Duplicati.Library.Common.IO; using Duplicati.Library.Common; +using Duplicati.Library.Utility; namespace Duplicati.Library.AutoUpdater { @@ -73,10 +74,10 @@ namespace Duplicati.Library.AutoUpdater private const string DATETIME_FORMAT = "yyyymmddhhMMss"; private const string BASEINSTALLDIR_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_INSTALL_ROOT"; private const string UPDATEINSTALLDIR_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_UPDATE_ROOT"; - internal const string SKIPUPDATE_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_SKIP_UPDATE"; + public const string SKIPUPDATE_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_SKIP_UPDATE"; private const string RUN_UPDATED_FOLDER_PATH = "AUTOUPDATER_LOAD_UPDATE"; private const string SLEEP_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_SLEEP"; - internal const string UPDATE_STRATEGY_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_POLICY"; + public const string UPDATE_STRATEGY_ENVNAME_TEMPLATE = "AUTOUPDATER_{0}_POLICY"; private const string UPDATE_MANIFEST_FILENAME = "autoupdate.manifest"; private const string README_FILE = "README.txt"; private const string INSTALL_FILE = "installation.txt"; diff --git a/Duplicati/Library/Snapshots/LinuxSnapshot.cs b/Duplicati/Library/Snapshots/LinuxSnapshot.cs index 1e51a5498..5b2c61590 100644 --- a/Duplicati/Library/Snapshots/LinuxSnapshot.cs +++ b/Duplicati/Library/Snapshots/LinuxSnapshot.cs @@ -216,7 +216,7 @@ namespace Duplicati.Library.Snapshots /// A string with the combined output of the stdout and stderr private static string ExecuteCommand(string program, string commandline, int expectedExitCode) { - program = System.IO.Path.Combine(System.IO.Path.Combine(AutoUpdater.UpdaterManager.InstalledBaseDir, "lvm-scripts"), program); + program = System.IO.Path.Combine(System.IO.Path.Combine(Duplicati.Library.AutoUpdater.UpdaterManager.InstalledBaseDir, "lvm-scripts"), program); var inf = new ProcessStartInfo(program, commandline) { CreateNoWindow = true, diff --git a/Duplicati/Library/UsageReporter/Reporter.cs b/Duplicati/Library/UsageReporter/Reporter.cs index 7ef020e9f..561597d6b 100644 --- a/Duplicati/Library/UsageReporter/Reporter.cs +++ b/Duplicati/Library/UsageReporter/Reporter.cs @@ -171,7 +171,7 @@ namespace Duplicati.Library.UsageReporter { if (Cached_MaxReportLevel == null) { - var str = Environment.GetEnvironmentVariable(string.Format(DISABLED_ENVNAME_TEMPLATE, AutoUpdater.AutoUpdateSettings.AppName)); + var str = Environment.GetEnvironmentVariable(string.Format(DISABLED_ENVNAME_TEMPLATE, Duplicati.Library.AutoUpdater.AutoUpdateSettings.AppName)); ReportType tmp; if (string.IsNullOrWhiteSpace(str) || !Enum.TryParse(str, out tmp)) Cached_MaxReportLevel = ReportType.Information; diff --git a/Duplicati/Library/AutoUpdater/SignatureReadingStream.cs b/Duplicati/Library/Utility/SignatureReadingStream.cs similarity index 95% rename from Duplicati/Library/AutoUpdater/SignatureReadingStream.cs rename to Duplicati/Library/Utility/SignatureReadingStream.cs index 0e8212453..943d32b64 100644 --- a/Duplicati/Library/AutoUpdater/SignatureReadingStream.cs +++ b/Duplicati/Library/Utility/SignatureReadingStream.cs @@ -1,194 +1,194 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Library.AutoUpdater -{ - public class SignatureReadingStream : System.IO.Stream, IDisposable - { - /// - /// The size of the SHA256 output hash in bytes - /// - /// - internal const int SIGNED_HASH_SIZE = 128; - - /// - /// The stream to read from - /// - private readonly System.IO.Stream m_stream; - - protected SignatureReadingStream() - { - } - - public SignatureReadingStream(System.IO.Stream stream, System.Security.Cryptography.RSACryptoServiceProvider key) - { - if (!VerifySignature(stream, key)) - throw new System.IO.InvalidDataException("Unable to verify signature"); - m_stream = stream; - this.Position = 0; - } - - private static bool VerifySignature(System.IO.Stream stream, System.Security.Cryptography.RSACryptoServiceProvider key) - { - stream.Position = 0; - var signature = new byte[SIGNED_HASH_SIZE]; - if (Duplicati.Library.Utility.Utility.ForceStreamRead(stream, signature, signature.Length) != signature.Length) - throw new System.IO.InvalidDataException("Unexpected end-of-stream while reading signature"); - var sha256 = System.Security.Cryptography.SHA256.Create(); - sha256.Initialize(); - - var bytes = stream.Length - (signature.Length); - var buf = new byte[8 * 1024]; - while (bytes > 0) - { - var r = stream.Read(buf, 0, (int)Math.Min(bytes, buf.Length)); - if (r == 0) - throw new Exception("Unexpected end-of-stream while reading content"); - bytes -= r; - sha256.TransformBlock(buf, 0, r, buf, 0); - } - - sha256.TransformFinalBlock(buf, 0, 0); - var hash = sha256.Hash; - var OID = System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"); - return key.VerifyHash(hash, OID, signature); - } - - public static void CreateSignedStream(System.IO.Stream datastream, System.IO.Stream signedstream, System.Security.Cryptography.RSACryptoServiceProvider key) - { - var sha256 = System.Security.Cryptography.SHA256.Create(); - - datastream.Position = 0; - signedstream.Position = SIGNED_HASH_SIZE; - - var buf = new byte[8 * 1024]; - var bytes = datastream.Length; - while (bytes > 0) - { - var r = datastream.Read(buf, 0, (int)Math.Min(bytes, buf.Length)); - if (r == 0) - throw new Exception("Unexpected end-of-stream while reading content"); - - signedstream.Write(buf, 0, r); - - bytes -= r; - sha256.TransformBlock(buf, 0, r, buf, 0); - } - - sha256.TransformFinalBlock(buf, 0, 0); - var hash = sha256.Hash; - - var OID = System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"); - var signature = key.SignHash(hash, OID); - - signedstream.Position = 0; - signedstream.Write(signature, 0, signature.Length); - - signedstream.Position = 0; - if (!VerifySignature(signedstream, key)) - throw new System.IO.InvalidDataException("Unable to verify signature"); - } - - #region implemented abstract members of Stream - - public override void Flush() - { - try { m_stream.Flush(); } - catch { } - } - - public override int Read(byte[] buffer, int offset, int count) - { - return m_stream.Read(buffer, offset, count); - } - - public override long Seek(long offset, System.IO.SeekOrigin origin) - { - switch (origin) - { - case System.IO.SeekOrigin.Current: - return Seek(offset + this.Position, System.IO.SeekOrigin.Begin); - case System.IO.SeekOrigin.End: - return Seek(this.Length - offset, System.IO.SeekOrigin.Begin); - case System.IO.SeekOrigin.Begin: - default: - return this.Position = offset; - } - } - - public override void SetLength(long value) - { - throw new InvalidOperationException(); - } - - public override void Write(byte[] buffer, int offset, int count) - { - throw new InvalidOperationException(); - } - - public override bool CanRead - { - get - { - return true; - } - } - - public override bool CanSeek - { - get - { - return true; - } - } - - public override bool CanWrite - { - get - { - return false; - } - } - - public override long Length - { - get - { - return m_stream.Length - SIGNED_HASH_SIZE; - } - } - - // Since the constructor sets the Position, we seal the implementation here to prevent subclasses - // from potentially referencing uninitialized members. - public sealed override long Position - { - get - { - return m_stream.Position - SIGNED_HASH_SIZE; - } - set - { - m_stream.Position = value + SIGNED_HASH_SIZE; - } - } - - #endregion - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; + +namespace Duplicati.Library.Utility +{ + public class SignatureReadingStream : System.IO.Stream, IDisposable + { + /// + /// The size of the SHA256 output hash in bytes + /// + /// + internal const int SIGNED_HASH_SIZE = 128; + + /// + /// The stream to read from + /// + private readonly System.IO.Stream m_stream; + + protected SignatureReadingStream() + { + } + + public SignatureReadingStream(System.IO.Stream stream, System.Security.Cryptography.RSACryptoServiceProvider key) + { + if (!VerifySignature(stream, key)) + throw new System.IO.InvalidDataException("Unable to verify signature"); + m_stream = stream; + this.Position = 0; + } + + private static bool VerifySignature(System.IO.Stream stream, System.Security.Cryptography.RSACryptoServiceProvider key) + { + stream.Position = 0; + var signature = new byte[SIGNED_HASH_SIZE]; + if (Duplicati.Library.Utility.Utility.ForceStreamRead(stream, signature, signature.Length) != signature.Length) + throw new System.IO.InvalidDataException("Unexpected end-of-stream while reading signature"); + var sha256 = System.Security.Cryptography.SHA256.Create(); + sha256.Initialize(); + + var bytes = stream.Length - (signature.Length); + var buf = new byte[8 * 1024]; + while (bytes > 0) + { + var r = stream.Read(buf, 0, (int)Math.Min(bytes, buf.Length)); + if (r == 0) + throw new Exception("Unexpected end-of-stream while reading content"); + bytes -= r; + sha256.TransformBlock(buf, 0, r, buf, 0); + } + + sha256.TransformFinalBlock(buf, 0, 0); + var hash = sha256.Hash; + var OID = System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"); + return key.VerifyHash(hash, OID, signature); + } + + public static void CreateSignedStream(System.IO.Stream datastream, System.IO.Stream signedstream, System.Security.Cryptography.RSACryptoServiceProvider key) + { + var sha256 = System.Security.Cryptography.SHA256.Create(); + + datastream.Position = 0; + signedstream.Position = SIGNED_HASH_SIZE; + + var buf = new byte[8 * 1024]; + var bytes = datastream.Length; + while (bytes > 0) + { + var r = datastream.Read(buf, 0, (int)Math.Min(bytes, buf.Length)); + if (r == 0) + throw new Exception("Unexpected end-of-stream while reading content"); + + signedstream.Write(buf, 0, r); + + bytes -= r; + sha256.TransformBlock(buf, 0, r, buf, 0); + } + + sha256.TransformFinalBlock(buf, 0, 0); + var hash = sha256.Hash; + + var OID = System.Security.Cryptography.CryptoConfig.MapNameToOID("SHA256"); + var signature = key.SignHash(hash, OID); + + signedstream.Position = 0; + signedstream.Write(signature, 0, signature.Length); + + signedstream.Position = 0; + if (!VerifySignature(signedstream, key)) + throw new System.IO.InvalidDataException("Unable to verify signature"); + } + + #region implemented abstract members of Stream + + public override void Flush() + { + try { m_stream.Flush(); } + catch { } + } + + public override int Read(byte[] buffer, int offset, int count) + { + return m_stream.Read(buffer, offset, count); + } + + public override long Seek(long offset, System.IO.SeekOrigin origin) + { + switch (origin) + { + case System.IO.SeekOrigin.Current: + return Seek(offset + this.Position, System.IO.SeekOrigin.Begin); + case System.IO.SeekOrigin.End: + return Seek(this.Length - offset, System.IO.SeekOrigin.Begin); + case System.IO.SeekOrigin.Begin: + default: + return this.Position = offset; + } + } + + public override void SetLength(long value) + { + throw new InvalidOperationException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new InvalidOperationException(); + } + + public override bool CanRead + { + get + { + return true; + } + } + + public override bool CanSeek + { + get + { + return true; + } + } + + public override bool CanWrite + { + get + { + return false; + } + } + + public override long Length + { + get + { + return m_stream.Length - SIGNED_HASH_SIZE; + } + } + + // Since the constructor sets the Position, we seal the implementation here to prevent subclasses + // from potentially referencing uninitialized members. + public sealed override long Position + { + get + { + return m_stream.Position - SIGNED_HASH_SIZE; + } + set + { + m_stream.Position = value + SIGNED_HASH_SIZE; + } + } + + #endregion + } +} + From 28793ef204067eb1c3480478121802e8c55f9c1b Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 25 Dec 2019 18:21:24 +0100 Subject: [PATCH 073/253] packages update --- .../GnupgSigningTool/GnupgSigningTool.csproj | 2 +- Duplicati.sln | 4 +--- .../Duplicati.CommandLine.AutoUpdater.csproj | 2 +- .../Duplicati.CommandLine.BackendTester.csproj | 6 ++---- .../Duplicati.CommandLine.BackendTool.csproj | 4 +--- ...ati.CommandLine.ConfigurationImporter.csproj | 2 +- .../CommandLine/Duplicati.CommandLine.csproj | 4 +--- .../Duplicati.CommandLine.RecoveryTool.csproj | 6 ++---- .../Duplicati.GUI.TrayIcon.csproj | 4 ++-- .../Duplicati.Library.AutoUpdater.csproj | 4 ++-- ...licati.Library.Backend.AlternativeFTP.csproj | 2 +- .../Duplicati.Library.Backend.AzureBlob.csproj | 4 ++-- .../Duplicati.Library.Backend.Backblaze.csproj | 4 ++-- .../Box/Duplicati.Library.Backend.Box.csproj | 4 ++-- .../Duplicati.Library.Backend.CloudFiles.csproj | 2 +- .../Duplicati.Library.Backend.Dropbox.csproj | 4 ++-- .../FTP/Duplicati.Library.Backend.FTP.csproj | 2 +- .../File/Duplicati.Library.Backend.File.csproj | 2 +- ...licati.Library.Backend.GoogleServices.csproj | 4 ++-- .../Duplicati.Library.Backend.HubiC.csproj | 2 +- .../Duplicati.Library.Backend.Jottacloud.csproj | 2 +- .../Mega/Duplicati.Library.Backend.Mega.csproj | 4 ++-- .../Duplicati.Library.OAuthHelper.csproj | 4 ++-- .../Duplicati.Library.Backend.OneDrive.csproj | 4 ++-- .../Duplicati.Library.Backend.OpenStack.csproj | 4 ++-- .../Duplicati.Library.Backend.Rclone.csproj | 4 ++-- .../S3/Duplicati.Library.Backend.S3.csproj | 12 ++++++------ Duplicati/Library/Backend/S3/S3AwsClient.cs | 2 +- .../Duplicati.Library.Backend.SSHv2.csproj | 2 +- .../Duplicati.Library.Backend.SharePoint.csproj | 4 ++-- .../Sia/Duplicati.Library.Backend.Sia.csproj | 4 ++-- .../Duplicati.Library.Backend.TahoeLAFS.csproj | 4 ++-- .../Duplicati.Library.Backend.WEBDAV.csproj | 2 +- .../Common/Duplicati.Library.Common.csproj | 6 +++--- .../Duplicati.Library.Compression.csproj | 4 ++-- .../Library/Compression/SevenZipCompression.cs | 2 +- .../Duplicati.Library.DynamicLoader.csproj | 2 +- .../Duplicati.Library.Encryption.csproj | 11 ++--------- .../Duplicati.Library.Interface.csproj | 2 +- .../Duplicati.Library.Localization.csproj | 4 ++-- .../Logging/Duplicati.Library.Logging.csproj | 2 +- Duplicati/Library/Main/BackendManager.cs | 7 +++---- .../Library/Main/Duplicati.Library.Main.csproj | 4 ++-- .../Duplicati.Library.Modules.Builtin.csproj | 12 ++++++------ .../Duplicati.Library.SQLiteHelper.csproj | 2 +- .../Duplicati.Library.Snapshots.csproj | 4 ++-- .../Duplicati.Library.UsageReporter.csproj | 6 +++--- .../Utility/Duplicati.Library.Utility.csproj | 6 +++--- Duplicati/License/Duplicati.License.csproj | 2 +- .../Duplicati.Server.Serialization.csproj | 4 ++-- Duplicati/Server/Duplicati.Server.csproj | 14 ++++++-------- Duplicati/Service/Duplicati.Service.csproj | 2 +- Duplicati/Tools/Duplicati.Tools.csproj | 2 +- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 6 ++---- Duplicati/WindowsService/WindowsService.csproj | 4 ++-- .../Windows/UpdateVersion/UpdateVersion.csproj | 2 +- thirdparty/SharpAESCrypt/SharpAESCrypt.dll | Bin 37376 -> 0 bytes thirdparty/SharpAESCrypt/SharpAESCrypt.exe | Bin 37888 -> 0 bytes thirdparty/UnixSupport/UnixSupport.csproj | 2 +- 59 files changed, 105 insertions(+), 127 deletions(-) delete mode 100644 thirdparty/SharpAESCrypt/SharpAESCrypt.dll delete mode 100644 thirdparty/SharpAESCrypt/SharpAESCrypt.exe diff --git a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj index 76a20104d..70e11b000 100644 --- a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj +++ b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati.sln b/Duplicati.sln index 84f0c0049..fd1e8ae1f 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -71,8 +71,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.H EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.RecoveryTool", "Duplicati\CommandLine\RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{4A010589-76E6-4F05-A5C4-4598D5DF11F8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.AmazonCloudDrive", "Duplicati\Library\Backend\AmazonCloudDrive\Duplicati.Library.Backend.AmazonCloudDrive.csproj", "{08D7E42D-285C-4010-9881-986125FE2F3E}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Backblaze", "Duplicati\Library\Backend\Backblaze\Duplicati.Library.Backend.Backblaze.csproj", "{61C43D61-4368-4942-84A3-1EB623F4EF2A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Mega", "Duplicati\Library\Backend\Mega\Duplicati.Library.Backend.Mega.csproj", "{6643A5AE-AB38-453F-ADCE-408E35A81A83}" @@ -103,7 +101,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.Confi EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Encryption", "Duplicati\Library\Encryption\Duplicati.Library.Encryption.csproj", "{2CF2D90E-C25B-47AD-91E0-98451BAB8058}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.AutoUpdater", "Duplicati\CommandLine\AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{4D1B198B-F773-44F2-872B-2B283053323C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoUpdater", "Duplicati\CommandLine\AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{4D1B198B-F773-44F2-872B-2B283053323C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index 469385ccd..1a85ed188 100644 --- a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.AutoUpdater diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index a299ccedd..ed38de83b 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.BackendTester @@ -15,7 +15,7 @@ - + @@ -51,8 +51,6 @@ - - diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index f434a50b5..72251b810 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.BackendTool @@ -57,8 +57,6 @@ - - diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index fef7a5a7d..7836ed5d0 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.ConfigurationImporter diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index f72f077d3..e8869eaf5 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine @@ -84,8 +84,6 @@ - - diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 1f8341238..9bd7da865 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.RecoveryTool @@ -15,7 +15,7 @@ - + @@ -65,8 +65,6 @@ - - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 3bca9646f..d3004bb6b 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.GUI.TrayIcon @@ -36,7 +36,7 @@ - + diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 1d1feeb86..9b53277f3 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 Library LGPL, Copyright © Duplicati Team 2019 @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index b3c46a821..da8ffa352 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 Library LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 0e6b858c0..82e18ac3e 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -21,7 +21,7 @@ - + diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index 1ff6f9622..fb886c70b 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 2a89a9a42..40a5fff01 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index ca86a53a6..7f6cc94ab 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index 9a6da043e..bad280595 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index c27a297e2..b2eff197b 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index 9fff93568..94558bd60 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 9d85d2d11..4939e66d0 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index 1d9ae57f6..b65a41f2d 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index 47eac21d2..2f3ef48f1 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 43ed03c82..32199b557 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -14,7 +14,7 @@ - + diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index 13c1eed2c..320acf19e 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 65a247ce0..8e3469f2c 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index 22f2f38f3..17cd664b6 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 753608214..779a3e949 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index f6c875613..be83cdbcc 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -13,14 +13,14 @@ - - - + + + + + - - diff --git a/Duplicati/Library/Backend/S3/S3AwsClient.cs b/Duplicati/Library/Backend/S3/S3AwsClient.cs index 507db5ce5..d31266d0d 100644 --- a/Duplicati/Library/Backend/S3/S3AwsClient.cs +++ b/Duplicati/Library/Backend/S3/S3AwsClient.cs @@ -183,7 +183,7 @@ namespace Duplicati.Library.Backend ListObjectsResponse listResponse; try { - listResponse = m_client.ListObjects(listRequest); + listResponse = m_client.ListObjectsAsync(listRequest).GetAwaiter().GetResult(); } catch (AmazonS3Exception e) { diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index 411a4ece1..1ed11bb9c 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index b1b16f8d6..f101effbb 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index ed96e1d5b..5c746a906 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 0a12e022a..a38e6dd83 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index 6715f73de..a5325b0bf 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index f7ca9e464..94c04f404 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,10 +13,10 @@ - + - + diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 8c089df36..d97fbadf6 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -16,7 +16,7 @@ - + ..\..\..\thirdparty\ManagedLZMA\managed-lzma.dll diff --git a/Duplicati/Library/Compression/SevenZipCompression.cs b/Duplicati/Library/Compression/SevenZipCompression.cs index 5bce099c0..4739d739f 100644 --- a/Duplicati/Library/Compression/SevenZipCompression.cs +++ b/Duplicati/Library/Compression/SevenZipCompression.cs @@ -8,7 +8,7 @@ using Duplicati.Library.Utility; namespace Duplicati.Library.Compression { //TODO-DNC -#if !NETSTANDARD2_0 +#if !NETSTANDARD2_1 public class SevenZipCompression : ICompressionHinting { // next file starts a new stream if the previous stream is larger than this diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 00c048bcf..3f5f4f6d6 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index 029aa207d..c574b962b 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -15,8 +15,7 @@ - - + @@ -25,10 +24,4 @@ - - - ..\..\..\thirdparty\SharpAESCrypt\SharpAESCrypt.dll - - - \ No newline at end of file diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 0f4f34bd2..9668d4c5a 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 1f9c04db0..771c7fd44 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,7 +13,7 @@ - + diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index 2f6b6c675..6484dfb5a 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -1,6 +1,6 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Main/BackendManager.cs b/Duplicati/Library/Main/BackendManager.cs index b7d1033a6..0370feae5 100644 --- a/Duplicati/Library/Main/BackendManager.cs +++ b/Duplicati/Library/Main/BackendManager.cs @@ -9,6 +9,7 @@ using Duplicati.Library.Main.Volumes; using Newtonsoft.Json; using Duplicati.Library.Localization.Short; using System.Threading; +using System.Net; namespace Duplicati.Library.Main { @@ -656,11 +657,9 @@ namespace Duplicati.Library.Main item.IndexfileUpdated = true; } - IndexVolumeWriter wr = null; - try + var hashsize = HashAlgorithm.Create(m_options.BlockHashAlgorithm).HashSize / 8; + using (IndexVolumeWriter wr = new IndexVolumeWriter(m_options)) { - var hashsize = HashAlgorithm.Create(m_options.BlockHashAlgorithm).HashSize / 8; - wr = new IndexVolumeWriter(m_options); using (var rd = new IndexVolumeReader(p.CompressionModule, item.Indexfile.Item2.LocalFilename, m_options, hashsize)) wr.CopyFrom(rd, x => x == oldname ? newname : x); item.Indexfile.Item1.Dispose(); diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index c2aa2dfdd..250e975a7 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index f11fc511d..39cff8556 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 @@ -15,11 +15,11 @@ - - - - - + + + + + diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index cce95023b..060e348f6 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 208e03710..fff0af54b 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Snapshots @@ -12,7 +12,7 @@ - + diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index 57786e68a..d2354e514 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 @@ -15,8 +15,8 @@ - - + + diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 2535bc527..4c8304843 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 @@ -13,8 +13,8 @@ - - + + diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 99e8fefc8..7bb1c090f 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index e8776ff87..1ed472d10 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index a72d186c9..c95cc1f31 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.Server @@ -19,11 +19,11 @@ - - - - - + + + + + @@ -97,8 +97,6 @@ - - diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index 838d9c082..f3578b28b 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,7 +1,7 @@  - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 Exe LGPL, Copyright ? Duplicati Team 2019 diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index edfa92d9c..34b11e3a1 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 4f7319579..0beea31e9 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.UnitTest @@ -18,7 +18,7 @@ - + @@ -96,8 +96,6 @@ - - diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 71516456d..59fde9822 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.2 + netcoreapp3.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2019 Duplicati.WindowsService @@ -25,7 +25,7 @@ - + \ No newline at end of file diff --git a/Installer/Windows/UpdateVersion/UpdateVersion.csproj b/Installer/Windows/UpdateVersion/UpdateVersion.csproj index 1fd0b2e0e..2f52b7be8 100644 --- a/Installer/Windows/UpdateVersion/UpdateVersion.csproj +++ b/Installer/Windows/UpdateVersion/UpdateVersion.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/thirdparty/SharpAESCrypt/SharpAESCrypt.dll b/thirdparty/SharpAESCrypt/SharpAESCrypt.dll deleted file mode 100644 index c25b5a292f455f59f8f4e789cf36a0148ab76a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37376 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 Dy9!E* diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/thirdparty/UnixSupport/UnixSupport.csproj index b74fe6fe2..2b1f79558 100644 --- a/thirdparty/UnixSupport/UnixSupport.csproj +++ b/thirdparty/UnixSupport/UnixSupport.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + netstandard2.1 2.0.0.7 Exe LGPL, Copyright © Duplicati Team 2015 From 76b191327fb29ca38f6aaa626a2f01a42e7013b0 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 25 Dec 2019 18:23:23 +0100 Subject: [PATCH 074/253] packages update 2 --- .../Duplicati.Library.Backend.AlternativeFTP.csproj | 2 +- .../Library/Backend/S3/Duplicati.Library.Backend.S3.csproj | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index da8ffa352..deec96810 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index be83cdbcc..73f5e717b 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -13,9 +13,9 @@ - - - + + + From 4d62e9584da5a0c60761072910b98ca3448e7f80 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 25 Dec 2019 18:34:40 +0100 Subject: [PATCH 075/253] Upgrade of AlphaVSS --- Duplicati/Library/Common/Duplicati.Library.Common.csproj | 2 +- Duplicati/Library/Common/IO/VssBackupComponents.cs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 94c04f404..1d1d8e48e 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -15,7 +15,7 @@ - + diff --git a/Duplicati/Library/Common/IO/VssBackupComponents.cs b/Duplicati/Library/Common/IO/VssBackupComponents.cs index bffaa28d6..06b20ac14 100644 --- a/Duplicati/Library/Common/IO/VssBackupComponents.cs +++ b/Duplicati/Library/Common/IO/VssBackupComponents.cs @@ -300,8 +300,7 @@ namespace Duplicati.Library.Common.IO throw new InvalidOperationException(); //Here we don't need a custom Path.Combine: we need unconditional access to alphaFS - var alphadll = Path.Combine(assemblyLocation, "alphavss", VssUtils.GetPlatformSpecificAssemblyShortName() + ".dll"); - var vss = (IVssImplementation)System.Reflection.Assembly.LoadFile(alphadll).CreateInstance("Alphaleonis.Win32.Vss.VssImplementation"); + var vss = VssFactoryProvider.Default.GetVssFactory(); if (vss == null) throw new InvalidOperationException(); From 7e2218663e17c7a63a8d02d073ea1ed0e25b488b Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 25 Dec 2019 19:08:52 +0100 Subject: [PATCH 076/253] Add Compat Analyzers --- .../AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj | 7 +++++++ .../Duplicati.CommandLine.BackendTester.csproj | 4 ++++ .../BackendTool/Duplicati.CommandLine.BackendTool.csproj | 7 +++++++ .../Duplicati.CommandLine.ConfigurationImporter.csproj | 7 +++++++ Duplicati/CommandLine/Duplicati.CommandLine.csproj | 7 +++++++ .../Duplicati.CommandLine.RecoveryTool.csproj | 4 ++++ .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 4 ++++ .../AutoUpdater/Duplicati.Library.AutoUpdater.csproj | 4 ++++ .../Duplicati.Library.Backend.AlternativeFTP.csproj | 4 ++++ .../AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj | 4 ++++ .../Backblaze/Duplicati.Library.Backend.Backblaze.csproj | 4 ++++ .../Backend/Box/Duplicati.Library.Backend.Box.csproj | 4 ++++ .../Duplicati.Library.Backend.CloudFiles.csproj | 9 ++++++++- .../Dropbox/Duplicati.Library.Backend.Dropbox.csproj | 4 ++++ .../Backend/FTP/Duplicati.Library.Backend.FTP.csproj | 7 +++++++ .../Backend/File/Duplicati.Library.Backend.File.csproj | 9 ++++++++- .../Duplicati.Library.Backend.GoogleServices.csproj | 4 ++++ .../Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj | 9 ++++++++- .../Duplicati.Library.Backend.Jottacloud.csproj | 7 +++++++ .../Backend/Mega/Duplicati.Library.Backend.Mega.csproj | 4 ++++ .../OAuthHelper/Duplicati.Library.OAuthHelper.csproj | 4 ++++ .../OneDrive/Duplicati.Library.Backend.OneDrive.csproj | 4 ++++ .../OpenStack/Duplicati.Library.Backend.OpenStack.csproj | 4 ++++ .../Rclone/Duplicati.Library.Backend.Rclone.csproj | 4 ++++ .../Backend/S3/Duplicati.Library.Backend.S3.csproj | 4 ++++ .../Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj | 4 ++++ .../Duplicati.Library.Backend.SharePoint.csproj | 4 ++++ .../Backend/Sia/Duplicati.Library.Backend.Sia.csproj | 4 ++++ .../TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj | 4 ++++ .../WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj | 9 ++++++++- Duplicati/Library/Common/Duplicati.Library.Common.csproj | 4 ++++ .../Compression/Duplicati.Library.Compression.csproj | 4 ++++ .../DynamicLoader/Duplicati.Library.DynamicLoader.csproj | 7 +++++++ .../Encryption/Duplicati.Library.Encryption.csproj | 4 ++++ .../Library/Interface/Duplicati.Library.Interface.csproj | 7 +++++++ .../Localization/Duplicati.Library.Localization.csproj | 4 ++++ .../Library/Logging/Duplicati.Library.Logging.csproj | 8 +++++++- Duplicati/Library/Main/Duplicati.Library.Main.csproj | 4 ++++ .../Builtin/Duplicati.Library.Modules.Builtin.csproj | 4 ++++ .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 7 +++++++ .../Library/Snapshots/Duplicati.Library.Snapshots.csproj | 4 ++++ .../UsageReporter/Duplicati.Library.UsageReporter.csproj | 4 ++++ .../Library/Utility/Duplicati.Library.Utility.csproj | 4 ++++ Duplicati/License/Duplicati.License.csproj | 7 +++++++ .../Duplicati.Server.Serialization.csproj | 4 ++++ Duplicati/Server/Duplicati.Server.csproj | 4 ++++ Duplicati/Service/Duplicati.Service.csproj | 7 +++++++ Duplicati/Tools/Duplicati.Tools.csproj | 6 ++++++ Duplicati/UnitTest/Duplicati.UnitTest.csproj | 4 ++++ Duplicati/WindowsService/WindowsService.csproj | 4 ++++ 50 files changed, 254 insertions(+), 5 deletions(-) diff --git a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index 1a85ed188..f6f7dd514 100644 --- a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -14,6 +14,13 @@ Duplicati.CommandLine.AutoUpdater + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index ed38de83b..5e20d61ef 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -15,6 +15,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 72251b810..4c290a19f 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -13,6 +13,13 @@ Duplicati.CommandLine.BackendTool Duplicati.CommandLine.BackendTool + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index 7836ed5d0..f55467201 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -14,6 +14,13 @@ Duplicati.CommandLine.ConfigurationImporter + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index e8869eaf5..7b9b9e03f 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -101,5 +101,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 9bd7da865..830f2bd18 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -15,6 +15,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index d3004bb6b..b6a58902d 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -36,6 +36,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 9b53277f3..4284d4c0f 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -15,6 +15,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index deec96810..16e881216 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -16,6 +16,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 82e18ac3e..05ab47579 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -21,6 +21,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index fb886c70b..51bf59670 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 40a5fff01..26a0ec5e6 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index 7f6cc94ab..7cc1b0eb7 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -4,13 +4,20 @@ netstandard2.1 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.CloudFiles Duplicati Team Duplicati Team CloudFiles backend for Duplicati CloudFiles + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index bad280595..03b456f36 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index b2eff197b..892830302 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -12,6 +12,13 @@ FTP + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index 94558bd60..be7f17605 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -4,13 +4,20 @@ netstandard2.1 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.File Duplicati Team Duplicati Team File backend for Duplicati File + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 4939e66d0..901627186 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index b65a41f2d..a3b5f8b01 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -4,13 +4,20 @@ netstandard2.1 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.HubiC Duplicati Team Duplicati Team HubiC backend for Duplicati HubiC + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index 2f3ef48f1..6812728f2 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -11,6 +11,13 @@ Jottacloud backend for Duplicati Jottacloud + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 32199b557..4de7f9c3e 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -14,6 +14,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index 320acf19e..338241538 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 8e3469f2c..f52e00447 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index 17cd664b6..e6f7aaf05 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 779a3e949..9b1792930 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index 73f5e717b..bd9b7ffd2 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -16,6 +16,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index 1ed11bb9c..30237db02 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index f101effbb..ddcee7f22 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index 5c746a906..ef25d86fe 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index a38e6dd83..118f70c18 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index a5325b0bf..ca03fda67 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -4,13 +4,20 @@ netstandard2.1 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Library.Backend.WEBDAV Duplicati Team Duplicati Team WEBDAV backend for Duplicati WEBDAV + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 1d1d8e48e..4d349bc93 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index d97fbadf6..c82f34cfb 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 3f5f4f6d6..4c73e6cab 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -13,6 +13,13 @@ Duplicati.DynamicLoader Duplicati.DynamicLoader + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index c574b962b..a0a1673a6 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -15,6 +15,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 9668d4c5a..1fbbd9802 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -12,6 +12,13 @@ Interface + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 771c7fd44..1d188fd8c 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index 6484dfb5a..d579b72e2 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -3,7 +3,7 @@ netstandard2.1 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 Duplicati.Logging Duplicati Team Duplicati Team @@ -12,4 +12,10 @@ Duplicati.Logging Duplicati.Logging + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 250e975a7..4150ca1df 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -15,6 +15,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 39cff8556..791587b75 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -16,6 +16,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index 060e348f6..fb9c14642 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -37,6 +37,13 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index fff0af54b..4b6f400ac 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -12,6 +12,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index d2354e514..1222b4a9b 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -16,6 +16,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 4c8304843..66db802da 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -13,6 +13,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 7bb1c090f..a7f724402 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -327,6 +327,13 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 1ed472d10..8cf2f5d94 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -15,6 +15,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index c95cc1f31..01225068d 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -19,6 +19,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index f3578b28b..a589f06e6 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -13,6 +13,13 @@ Duplicati.Service Duplicati.Service + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index 34b11e3a1..edd10e9c6 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -62,5 +62,11 @@ utility-scripts\pause-resume.py + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 0beea31e9..cf5203512 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -16,6 +16,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 59fde9822..51f5720e6 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -25,6 +25,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From 3f2eb254c3b4ef52bdffa3975cb8bab4dcd37982 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 31 May 2020 14:38:14 +0200 Subject: [PATCH 077/253] buildable again --- Duplicati.sln | 4 + .../Duplicati.CommandLine.BackendTool.csproj | 10 +- .../CommandLine/Duplicati.CommandLine.csproj | 2 - .../Duplicati.CommandLine.RecoveryTool.csproj | 2 - ...uplicati.Library.Backend.Tardigrade.csproj | 102 +++++------------- .../Tardigrade/Properties/AssemblyInfo.cs | 36 ------- .../Backend/Tardigrade/packages.config | 4 - Duplicati/Library/Main/BackendManager.cs | 6 +- .../Main/Duplicati.Library.Main.csproj | 9 +- Duplicati/Server/Duplicati.Server.csproj | 4 +- Duplicati/UnitTest/RestoreHandlerTests.cs | 4 +- 11 files changed, 38 insertions(+), 145 deletions(-) delete mode 100644 Duplicati/Library/Backend/Tardigrade/Properties/AssemblyInfo.cs delete mode 100644 Duplicati/Library/Backend/Tardigrade/packages.config diff --git a/Duplicati.sln b/Duplicati.sln index 24fff06ba..1c82a31a7 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -311,6 +311,10 @@ Global {4D1B198B-F773-44F2-872B-2B283053323C}.Debug|Any CPU.Build.0 = Debug|Any CPU {4D1B198B-F773-44F2-872B-2B283053323C}.Release|Any CPU.ActiveCfg = Release|Any CPU {4D1B198B-F773-44F2-872B-2B283053323C}.Release|Any CPU.Build.0 = Release|Any CPU + {AE035E01-C917-4F13-A35E-78F21C1A2F17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE035E01-C917-4F13-A35E-78F21C1A2F17}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE035E01-C917-4F13-A35E-78F21C1A2F17}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE035E01-C917-4F13-A35E-78F21C1A2F17}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 986bdd34f..f6a047013 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -20,15 +20,9 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + - - - - - - - {ae035e01-c917-4f13-a35e-78f21c1a2f17} - Duplicati.Library.Backend.Tardigrade + diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index af533c5c2..eada60c92 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -97,8 +97,6 @@ - {AE035E01-C917-4F13-A35E-78F21C1A2F17} - Duplicati.Library.Backend.Tardigrade diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index aae1ddeb2..6e5463a51 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -80,8 +80,6 @@ - {AE035E01-C917-4F13-A35E-78F21C1A2F17} - Duplicati.Library.Backend.Tardigrade diff --git a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj index 5e3fedd2c..81cdfd6b1 100644 --- a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj +++ b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj @@ -1,85 +1,31 @@ - - - + + - Debug - AnyCPU - {AE035E01-C917-4F13-A35E-78F21C1A2F17} - Library - Properties - Duplicati.Library.Backend.Tardigrade - Duplicati.Library.Backend.Tardigrade - v4.6.2 - 512 - true - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - x64 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + netstandard2.1 + 2.0.0.7 + + LGPL, Copyright © Duplicati Team 2015 + Duplicati.Library.Backend.Tardigrade + Duplicati Team + Duplicati Team + Tardigrade backend for Duplicati + Tardigrade + - - - - - - - - - - ..\..\..\..\packages\uplink.NET.2.1.5\lib\netstandard2.0\uplink.NET.dll - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + - - - - - + + + + - - - {d63e53e4-a458-4c2f-914d-92f715f58acf} - Duplicati.Library.Common - - - {c5899f45-b0ff-483c-9d38-24a9fcaab237} - Duplicati.Library.Interface - - - {b68f2214-951f-4f78-8488-66e1ed3f50bf} - Duplicati.Library.Localization - - - {de3e5d4c-51ab-4e5e-bee8-e636cebfba65} - Duplicati.Library.Utility - - - - - - - - - - Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". - - - + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Tardigrade/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/Tardigrade/Properties/AssemblyInfo.cs deleted file mode 100644 index 5f3cc907e..000000000 --- a/Duplicati/Library/Backend/Tardigrade/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("Duplicati.Library.Backend.Tardigrade")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Duplicati.Library.Backend.Tardigrade")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("ae035e01-c917-4f13-a35e-78f21c1a2f17")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Duplicati/Library/Backend/Tardigrade/packages.config b/Duplicati/Library/Backend/Tardigrade/packages.config deleted file mode 100644 index 3e0da8d53..000000000 --- a/Duplicati/Library/Backend/Tardigrade/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Duplicati/Library/Main/BackendManager.cs b/Duplicati/Library/Main/BackendManager.cs index b72461812..3882c33e8 100644 --- a/Duplicati/Library/Main/BackendManager.cs +++ b/Duplicati/Library/Main/BackendManager.cs @@ -654,10 +654,10 @@ namespace Duplicati.Library.Main item.IndexfileUpdated = true; } - var hashsize = HashAlgorithm.Create(m_options.BlockHashAlgorithm).HashSize / 8; - using (IndexVolumeWriter wr = new IndexVolumeWriter(m_options)) + IndexVolumeWriter wr = null; + try { - var hashsize = HashAlgorithmHelper.Create(m_options.BlockHashAlgorithm).HashSize / 8; + var hashsize = HashAlgorithm.Create(m_options.BlockHashAlgorithm).HashSize / 8; wr = new IndexVolumeWriter(m_options); using (var rd = new IndexVolumeReader(p.CompressionModule, item.Indexfile.Item2.LocalFilename, m_options, hashsize)) wr.CopyFrom(rd, x => x == oldname ? newname : x); diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 186e47808..e860a9acb 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -59,14 +59,7 @@ - - + PreserveNewest diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index b1b06fd04..0a1a8f6e5 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -31,9 +31,7 @@ - - {ae035e01-c917-4f13-a35e-78f21c1a2f17} - Duplicati.Library.Backend.Tardigrade + diff --git a/Duplicati/UnitTest/RestoreHandlerTests.cs b/Duplicati/UnitTest/RestoreHandlerTests.cs index 271c0e50a..e41ef37ef 100644 --- a/Duplicati/UnitTest/RestoreHandlerTests.cs +++ b/Duplicati/UnitTest/RestoreHandlerTests.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using System.Collections.Generic; using System.IO; using System.Security.AccessControl; +using Duplicati.Library.Common.IO; namespace Duplicati.UnitTest { @@ -17,7 +18,7 @@ namespace Duplicati.UnitTest { return; } - + /* TODO-DNC string folderPath = Path.Combine(this.DATAFOLDER, "folder"); Directory.CreateDirectory(folderPath); string filePath = Path.Combine(folderPath, "file"); @@ -58,6 +59,7 @@ namespace Duplicati.UnitTest FileSecurity restoredFileSecurity = File.GetAccessControl(restoredFilePath); Assert.IsTrue(restoredFileSecurity.AreAccessRulesProtected); } + */ } } } \ No newline at end of file From b008aed1f3382f486b0cdfd531838aa1669bb870 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 3 Jun 2020 00:00:38 +0200 Subject: [PATCH 078/253] migrate to net5 + runnable --- BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj | 2 +- BuildTools/DependencyFinder/DependencyFinder.csproj | 2 +- BuildTools/GnupgSigningTool/GnupgSigningTool.csproj | 2 +- BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj | 2 +- .../AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj | 2 +- .../Duplicati.CommandLine.BackendTester.csproj | 2 +- .../BackendTool/Duplicati.CommandLine.BackendTool.csproj | 2 +- .../Duplicati.CommandLine.ConfigurationImporter.csproj | 2 +- Duplicati/CommandLine/Duplicati.CommandLine.csproj | 2 +- .../Duplicati.CommandLine.RecoveryTool.csproj | 2 +- .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 2 +- .../AutoUpdater/Duplicati.Library.AutoUpdater.csproj | 2 +- Duplicati/Library/AutoUpdater/UpdaterManager.cs | 2 +- .../Duplicati.Library.Backend.AlternativeFTP.csproj | 2 +- .../AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj | 2 +- .../Backblaze/Duplicati.Library.Backend.Backblaze.csproj | 2 +- .../Backend/Box/Duplicati.Library.Backend.Box.csproj | 2 +- .../Duplicati.Library.Backend.CloudFiles.csproj | 2 +- .../Dropbox/Duplicati.Library.Backend.Dropbox.csproj | 2 +- .../Backend/FTP/Duplicati.Library.Backend.FTP.csproj | 2 +- .../Backend/File/Duplicati.Library.Backend.File.csproj | 2 +- .../Duplicati.Library.Backend.GoogleServices.csproj | 2 +- .../Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj | 2 +- .../Duplicati.Library.Backend.Jottacloud.csproj | 2 +- .../Backend/Mega/Duplicati.Library.Backend.Mega.csproj | 2 +- .../OAuthHelper/Duplicati.Library.OAuthHelper.csproj | 2 +- .../OneDrive/Duplicati.Library.Backend.OneDrive.csproj | 2 +- .../OpenStack/Duplicati.Library.Backend.OpenStack.csproj | 2 +- .../Rclone/Duplicati.Library.Backend.Rclone.csproj | 2 +- .../Backend/S3/Duplicati.Library.Backend.S3.csproj | 2 +- .../Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj | 2 +- .../Duplicati.Library.Backend.SharePoint.csproj | 2 +- .../Backend/Sia/Duplicati.Library.Backend.Sia.csproj | 2 +- .../TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj | 2 +- .../Duplicati.Library.Backend.Tardigrade.csproj | 2 +- .../WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj | 2 +- Duplicati/Library/Common/Duplicati.Library.Common.csproj | 2 +- .../Compression/Duplicati.Library.Compression.csproj | 2 +- .../DynamicLoader/Duplicati.Library.DynamicLoader.csproj | 2 +- .../Encryption/Duplicati.Library.Encryption.csproj | 2 +- .../Library/Interface/Duplicati.Library.Interface.csproj | 2 +- .../Localization/Duplicati.Library.Localization.csproj | 2 +- .../Library/Logging/Duplicati.Library.Logging.csproj | 2 +- Duplicati/Library/Main/Duplicati.Library.Main.csproj | 2 +- .../Builtin/Duplicati.Library.Modules.Builtin.csproj | 2 +- Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs | 9 +++++---- .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 2 +- .../Library/Snapshots/Duplicati.Library.Snapshots.csproj | 2 +- .../UsageReporter/Duplicati.Library.UsageReporter.csproj | 2 +- .../Library/Utility/Duplicati.Library.Utility.csproj | 2 +- Duplicati/License/Duplicati.License.csproj | 2 +- .../Duplicati.Server.Serialization.csproj | 2 +- Duplicati/Server/Duplicati.Server.csproj | 2 +- Duplicati/Server/Program.cs | 2 ++ Duplicati/Service/Duplicati.Service.csproj | 2 +- Duplicati/Tools/Duplicati.Tools.csproj | 2 +- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 2 +- Duplicati/WindowsService/WindowsService.csproj | 2 +- Installer/Windows/UpdateVersion/UpdateVersion.csproj | 2 +- Tools/SQLiteTool/SQLiteTool.csproj | 2 +- Tools/ZipFileDebugger/ZipFileDebugger.csproj | 2 +- thirdparty/UnixSupport/UnixSupport.csproj | 2 +- 62 files changed, 67 insertions(+), 64 deletions(-) diff --git a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj index 8b63a6959..f99c18099 100644 --- a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj +++ b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.0 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/BuildTools/DependencyFinder/DependencyFinder.csproj b/BuildTools/DependencyFinder/DependencyFinder.csproj index 4d5104e7b..b2d393b4f 100644 --- a/BuildTools/DependencyFinder/DependencyFinder.csproj +++ b/BuildTools/DependencyFinder/DependencyFinder.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.0 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj index 70e11b000..a1c84cf38 100644 --- a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj +++ b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj index 9ff2e842f..9455f79a1 100644 --- a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj +++ b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.0 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index f6f7dd514..af65c842e 100644 --- a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.AutoUpdater diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 73fbee4c7..1aa442fb0 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.BackendTester diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index f6a047013..7a8955787 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.BackendTool diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index f55467201..027d90c48 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.ConfigurationImporter diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index eada60c92..d5c1927c6 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 6e5463a51..4d4d36526 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.CommandLine.RecoveryTool diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 327911f22..dedfb53e7 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.GUI.TrayIcon diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 4284d4c0f..027d5cab6 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 Library LGPL, Copyright © Duplicati Team 2019 diff --git a/Duplicati/Library/AutoUpdater/UpdaterManager.cs b/Duplicati/Library/AutoUpdater/UpdaterManager.cs index 8f3309f9c..487650597 100644 --- a/Duplicati/Library/AutoUpdater/UpdaterManager.cs +++ b/Duplicati/Library/AutoUpdater/UpdaterManager.cs @@ -1099,7 +1099,7 @@ namespace Duplicati.Library.AutoUpdater return r; } - var app = Environment.GetCommandLineArgs().First(); + var app = Environment.GetCommandLineArgs().First().Substring(0, Environment.GetCommandLineArgs().First().Length - 3) + "exe"; var args = Library.Utility.Utility.WrapAsCommandLine(Environment.GetCommandLineArgs().Skip(1), false); if (!Path.IsPathRooted(app)) diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 16e881216..7f83ea55c 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 Library LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 05ab47579..aca37804f 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index 51bf59670..c3c296c04 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 26a0ec5e6..0052d3925 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index 7cc1b0eb7..a274b01e0 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index 03b456f36..d04bb0a7b 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index 892830302..de9514c70 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index be7f17605..eb3a3d20e 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 901627186..3c6001d96 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index a3b5f8b01..04e59504f 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index 6812728f2..2e4217635 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 4de7f9c3e..3dd6f475c 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index 338241538..d0c280bc1 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index f52e00447..88719452c 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index e6f7aaf05..6011b53ab 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 9b1792930..4f7762999 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index bd9b7ffd2..ccf857a30 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index 30237db02..14759cc2a 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index ddcee7f22..3264f4dca 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index ef25d86fe..29a93757f 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 118f70c18..e6559e3f9 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj index 81cdfd6b1..ff1d9ee40 100644 --- a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj +++ b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index ca03fda67..eee4b310b 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 4d349bc93..9dc3ebe9a 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index c82f34cfb..6598e1720 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 4c73e6cab..af060a4d8 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index a0a1673a6..a0b644641 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 1fbbd9802..708fe64ad 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 1d188fd8c..e6e2ccc36 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index d579b72e2..c1cc80145 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -1,6 +1,6 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index e860a9acb..254e48bd9 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 791587b75..3cffc6061 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs b/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs index 14c99c527..8c0f8fe72 100644 --- a/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs +++ b/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs @@ -56,7 +56,7 @@ namespace Duplicati.Library.SQLiteHelper public static class DatabaseUpgrader { //This is the "folder" where the embedded resources can be found - private const string FOLDER_NAME = "Duplicati.Library.Main.Database.Database_schema"; + private const string FOLDER_NAME = "Database_schema"; //This is the name of the schema sql private const string SCHEMA_NAME = "Schema.sql"; @@ -140,7 +140,7 @@ namespace Duplicati.Library.SQLiteHelper var asm = eltype.Assembly; string schema; - using (var rd = new System.IO.StreamReader(asm.GetManifestResourceStream($"{FOLDER_NAME}.{SCHEMA_NAME}"))) + using (var rd = new System.IO.StreamReader(asm.GetManifestResourceStream(eltype, $"{FOLDER_NAME}.{SCHEMA_NAME}"))) schema = rd.ReadToEnd(); //Get updates, and sort them according to version @@ -152,11 +152,12 @@ namespace Duplicati.Library.SQLiteHelper { //The resource name will be "Duplicati.Library.Main.Database.Database_schema.1.Sample upgrade.sql" //The number indicates the version that will be upgraded to - if (s.StartsWith(prefix, StringComparison.Ordinal) && !s.Equals(prefix + SCHEMA_NAME)) + //Could be ""Duplicati.Server.Database.Database_schema.1. Add Notifications.sql"" + if (s.Contains(prefix, StringComparison.Ordinal) && !s.EndsWith(prefix + SCHEMA_NAME)) { try { - string version = s.Substring(prefix.Length, s.IndexOf(".", prefix.Length + 1, StringComparison.Ordinal) - prefix.Length); + string version = s.Substring(s.IndexOf(prefix) + prefix.Length, s.IndexOf(".", s.IndexOf(prefix) + prefix.Length + 1, StringComparison.Ordinal) - s.IndexOf(prefix) - prefix.Length); int fileversion = int.Parse(version); string prev; diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index fb9c14642..c399c83cc 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 4b6f400ac..12e3413ad 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Snapshots diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index 1222b4a9b..3808375fc 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 66db802da..ce2979d00 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 5d1ba7979..3fe81df2f 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 8cf2f5d94..66a40599e 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 0a1a8f6e5..3d69d2952 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.Server diff --git a/Duplicati/Server/Program.cs b/Duplicati/Server/Program.cs index ddbbc8a8d..3826fa357 100644 --- a/Duplicati/Server/Program.cs +++ b/Duplicati/Server/Program.cs @@ -177,6 +177,8 @@ namespace Duplicati.Server public static int RealMain(string[] _args) { + System.Diagnostics.Debugger.Launch(); + //If we are on Windows, append the bundled "win-tools" programs to the search path //We add it last, to allow the user to override with other versions if (Platform.IsClientWindows) diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index a589f06e6..0830fcb29 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net5.0 2.0.0.7 Exe LGPL, Copyright ? Duplicati Team 2019 diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index edd10e9c6..4a7766ead 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index cf5203512..2d0e7cb18 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 Duplicati.UnitTest diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 51f5720e6..d36f4b5d4 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2019 Duplicati.WindowsService diff --git a/Installer/Windows/UpdateVersion/UpdateVersion.csproj b/Installer/Windows/UpdateVersion/UpdateVersion.csproj index 2f52b7be8..584c56439 100644 --- a/Installer/Windows/UpdateVersion/UpdateVersion.csproj +++ b/Installer/Windows/UpdateVersion/UpdateVersion.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Tools/SQLiteTool/SQLiteTool.csproj b/Tools/SQLiteTool/SQLiteTool.csproj index f8b00f970..c684f3d13 100644 --- a/Tools/SQLiteTool/SQLiteTool.csproj +++ b/Tools/SQLiteTool/SQLiteTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.0 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Tools/ZipFileDebugger/ZipFileDebugger.csproj b/Tools/ZipFileDebugger/ZipFileDebugger.csproj index 07e2b19a3..be01c9117 100644 --- a/Tools/ZipFileDebugger/ZipFileDebugger.csproj +++ b/Tools/ZipFileDebugger/ZipFileDebugger.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.0 + net5.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/thirdparty/UnixSupport/UnixSupport.csproj index 2b1f79558..791eb952e 100644 --- a/thirdparty/UnixSupport/UnixSupport.csproj +++ b/thirdparty/UnixSupport/UnixSupport.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + net5.0 2.0.0.7 Exe LGPL, Copyright © Duplicati Team 2015 From 7b40e8df2056ce3f892529f66136661322bda233 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 28 Dec 2020 12:17:33 -0800 Subject: [PATCH 079/253] Fix naming mismatch causing migrations to not be found --- Duplicati/Library/Main/Duplicati.Library.Main.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 254e48bd9..cda82e7b4 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -10,8 +10,8 @@ Duplicati Team The main Duplicati implementation module Main - Duplicati.Main - Duplicati.Main + Duplicati.Library.Main + Duplicati.Library.Main From 624a5d698b0d3379a1d25d872604fb617d87d93d Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 28 Dec 2020 12:18:58 -0800 Subject: [PATCH 080/253] Add a catch to prevent the database being locked when migrations fail. --- Duplicati/Library/Main/Database/LocalDatabase.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Duplicati/Library/Main/Database/LocalDatabase.cs b/Duplicati/Library/Main/Database/LocalDatabase.cs index f46694ef3..9a11f11a2 100644 --- a/Duplicati/Library/Main/Database/LocalDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalDatabase.cs @@ -56,7 +56,16 @@ namespace Duplicati.Library.Main.Database var c = Duplicati.Library.SQLiteHelper.SQLiteLoader.LoadConnection(path); - Library.SQLiteHelper.DatabaseUpgrader.UpgradeDatabase(c, path, typeof(LocalDatabase)); + try + { + Library.SQLiteHelper.DatabaseUpgrader.UpgradeDatabase(c, path, typeof(LocalDatabase)); + } + catch + { + //Don't leak database connections when something goes wrong + c.Dispose(); + throw; + } return c; } From 50bc8880ac9c7ad60f02d6a918b72a654c8b8523 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 29 Dec 2020 10:20:19 -0800 Subject: [PATCH 081/253] Restore not forking when debugging. * Fix library name mismatch preventing environmental variables from being loaded correctly --- .gitignore | 1 - .../AutoUpdater/Duplicati.Library.AutoUpdater.csproj | 4 ++-- .../Duplicati.Library.Backend.AlternativeFTP.csproj | 6 +++--- .../Backend/FTP/Duplicati.Library.Backend.FTP.csproj | 2 +- .../Backend/Telegram/Properties/AssemblyInfo.cs | 2 +- Duplicati/Server/Properties/launchSettings.json | 10 ++++++++++ 6 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 Duplicati/Server/Properties/launchSettings.json diff --git a/.gitignore b/.gitignore index 87191f644..7ba91052e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,5 @@ changelog-news.txt binfiles.wxs .idea/ .vs/ -launchSettings.json Installer/debian/*.buildinfo diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 027d5cab6..86baeb948 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -10,8 +10,8 @@ Duplicati Team AutoUpdater library for Duplicati AutoUpdater - Duplicati.Backend.AutoUpdater - Duplicati.Backend.AutoUpdater + Duplicati.Library.AutoUpdater + Duplicati.Library.AutoUpdater diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 7f83ea55c..273743324 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -5,13 +5,13 @@ 2.0.0.7 Library LGPL, Copyright © Duplicati Team 2015 - Duplicati.Backend.AlternativeFTP + Duplicati.Library.Backend.AlternativeFTP Duplicati Team Duplicati Team An alternative FTP backend for Duplicati AlternativeFTP - Duplicati.Backend.AlternativeFTP - Duplicati.Backend.AlternativeFTP + Duplicati.Library.Backend.AlternativeFTP + Duplicati.Library.Backend.AlternativeFTP diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index de9514c70..66530b9cb 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -5,7 +5,7 @@ 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 - Duplicati.Backend.FTP + Duplicati.Library.Backend.FTP Duplicati Team Duplicati Team A FTP backend for Duplicati diff --git a/Duplicati/Library/Backend/Telegram/Properties/AssemblyInfo.cs b/Duplicati/Library/Backend/Telegram/Properties/AssemblyInfo.cs index d33f05968..f4f56eb32 100644 --- a/Duplicati/Library/Backend/Telegram/Properties/AssemblyInfo.cs +++ b/Duplicati/Library/Backend/Telegram/Properties/AssemblyInfo.cs @@ -27,7 +27,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyDescription("A Telegram backend for Duplicati")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Duplicati Team")] -[assembly: AssemblyProduct("Duplicati.Backend.Telegram")] +[assembly: AssemblyProduct("Duplicati.Library.Backend.Telegram")] [assembly: AssemblyCopyright("LGPL, Copyright © Duplicati Team 2015")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/Duplicati/Server/Properties/launchSettings.json b/Duplicati/Server/Properties/launchSettings.json new file mode 100644 index 000000000..b0473b0da --- /dev/null +++ b/Duplicati/Server/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Duplicati.Server": { + "commandName": "Project", + "environmentVariables": { + "AUTOUPDATER_Duplicati_SKIP_UPDATE": "1" + } + } + } +} \ No newline at end of file From 9050e6449fc6fdfb3676cdf770e0c387edc178b6 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 2 Jan 2021 21:15:05 -0800 Subject: [PATCH 082/253] Actions --- .github/workflows/dotnet.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/dotnet.yml diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 000000000..d58fd9b35 --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,25 @@ +name: .NET + +on: + push: + branches: [ net5, net5ci ] + pull_request: + branches: [ net5 ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.101 + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore + - name: Test + run: dotnet test --no-build --verbosity normal From 971b5bc64efd4c41e76ac99e355690428650ae55 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 2 Jan 2021 21:17:03 -0800 Subject: [PATCH 083/253] Update dotnet.yml --- .github/workflows/dotnet.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index d58fd9b35..eabaa575f 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -2,7 +2,7 @@ name: .NET on: push: - branches: [ net5, net5ci ] + branches: [ net5 ] pull_request: branches: [ net5 ] @@ -18,8 +18,8 @@ jobs: with: dotnet-version: 5.0.101 - name: Restore dependencies - run: dotnet restore + run: dotnet restore Duplicati.sln - name: Build - run: dotnet build --no-restore + run: dotnet build --no-restore Duplicati.sln - name: Test - run: dotnet test --no-build --verbosity normal + run: dotnet test --no-build --verbosity normal Duplicati.sln From b1973934d75d60eb535dfbe973f73cf1c9f846fa Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 2 Jan 2021 21:47:00 -0800 Subject: [PATCH 084/253] Update .appveyor.yml --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index a6aee7fe8..b27b0c9fc 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,5 +1,5 @@ version: 1.0.{build} -image: Visual Studio 2017 +image: Visual Studio 2019 configuration: Debug platform: Any CPU environment: From a759995e7bb3472be524b76b3e0c9d5751a0d68b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 2 Jan 2021 22:26:00 -0800 Subject: [PATCH 085/253] Just use the nuget version of the sqlite library --- .../Duplicati.Library.SQLiteHelper.csproj | 24 +---- .../Library/SQLiteHelper/SQLiteLoader.cs | 95 +------------------ 2 files changed, 3 insertions(+), 116 deletions(-) diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index c399c83cc..fe1103ea4 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -14,34 +14,12 @@ Duplicati.SQLiteHelper - - - SQLite\win64\System.Data.SQLite.dll - PreserveNewest - - - SQLite\win32\System.Data.SQLite.dll - PreserveNewest - - - SQLite\pinvoke\System.Data.SQLite.dll - PreserveNewest - - - SQLite\win32\SQLite.Interop.dll - PreserveNewest - - - SQLite\win64\SQLite.Interop.dll - PreserveNewest - - - all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs b/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs index 4a752af16..59682aeed 100644 --- a/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs +++ b/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs @@ -20,6 +20,7 @@ using System; using System.IO; using Duplicati.Library.Common; +using System.Data.SQLite; namespace Duplicati.Library.SQLiteHelper { @@ -152,83 +153,7 @@ namespace Duplicati.Library.SQLiteHelper { get { - if (m_type != null) - return m_type; - - var filename = "System.Data.SQLite.dll"; - var basePath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "SQLite"); - - // Set this to make SQLite preload automatically - Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory", basePath); - - //Default is to use the pinvoke version which requires a native .dll/.so - var assemblyPath = Path.Combine(basePath, "pinvoke"); - var loadMixedModeAssembly = false; - - if (!Duplicati.Library.Utility.Utility.IsMono) - { - //If we run with MS.Net we can use the mixed mode assemblies - if (Environment.Is64BitProcess) - { - if (File.Exists(Path.Combine(Path.Combine(basePath, "win64"), filename))) - { - assemblyPath = Path.Combine(basePath, "win64"); - loadMixedModeAssembly = true; - } - } - else - { - if (File.Exists(Path.Combine(Path.Combine(basePath, "win32"), filename))) - { - assemblyPath = Path.Combine(basePath, "win32"); - loadMixedModeAssembly = true; - } - } - - // If we have a new path, try to force load the mixed-mode assembly for the current architecture - // This can be avoided if the preload in SQLite works, but it is easy to do it here as well - if (loadMixedModeAssembly) - { - try { PInvoke.LoadLibraryEx(Path.Combine(assemblyPath, "SQLite.Interop.dll"), IntPtr.Zero, 0); } - catch (Exception ex) { Logging.Log.WriteExplicitMessage(LOGTAG, "LoadMixedModeSQLiteError", ex, "Failed to load the mixed mode SQLite database: {0}", Path.Combine(assemblyPath, "SQLite.Interop.dll")); } - } - } - else - { - //On Mono, we try to find the Mono version of SQLite - - //This secret environment variable can be used to support older installations - var envvalue = System.Environment.GetEnvironmentVariable("DISABLE_MONO_DATA_SQLITE"); - if (!Utility.Utility.ParseBool(envvalue, envvalue != null)) - { - foreach (var asmversion in new[] { "4.0.0.0", "2.0.0.0" }) - { - var name = string.Format("Mono.Data.Sqlite, Version={0}, Culture=neutral, PublicKeyToken=0738eb9f132ed756", asmversion); - try - { - Type t = System.Reflection.Assembly.Load(name).GetType("Mono.Data.Sqlite.SqliteConnection"); - if (t != null && t.GetInterface("System.Data.IDbConnection", false) != null) - { - Version v = new Version((string)t.GetProperty("SQLiteVersion").GetValue(null, null)); - if (v >= new Version(3, 6, 3)) - { - return m_type = t; - } - } - } - catch(Exception ex) - { - Logging.Log.WriteExplicitMessage(LOGTAG, "FailedToLoadSQLiteAssembly", ex, "Failed to load the SQLite assembly: {0}", name); - } - } - - Logging.Log.WriteVerboseMessage(LOGTAG, "FailedToLoadSQLite", "Failed to load Mono.Data.Sqlite.SqliteConnection, reverting to built-in."); - } - } - - m_type = System.Reflection.Assembly.LoadFile(Path.Combine(assemblyPath, filename)).GetType("System.Data.SQLite.SQLiteConnection"); - - return m_type; + return typeof(SQLiteConnection); } } @@ -307,20 +232,4 @@ namespace Duplicati.Library.SQLiteHelper } } } - - /// - /// Helper class with PInvoke methods - /// - internal static class PInvoke - { - /// - /// Loads the specified module into the address space of the calling process. - /// - /// The library ex. - /// The filename of the module to load. - /// Reserved for future use. - /// Action to take on load. - [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, uint dwFlags); - } } From ef0039b8ffada0d3f655fe073149f2cbffe38a78 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 2 Jan 2021 22:34:19 -0800 Subject: [PATCH 086/253] Update build script --- .github/workflows/{dotnet.yml => ci.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{dotnet.yml => ci.yml} (97%) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/ci.yml similarity index 97% rename from .github/workflows/dotnet.yml rename to .github/workflows/ci.yml index eabaa575f..ee13b04c5 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: .NET +name: CI Build on: push: From b1001fcfeaf5a2dab813c09701208592691195e3 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 07:49:42 -0800 Subject: [PATCH 087/253] Move Unix Support (for file history) --- {thirdparty => Duplicati}/UnixSupport/File.cs | 688 +++++++++--------- .../UnixSupport/README.txt | 0 .../UnixSupport/UnixSupport.csproj | 0 .../UnixSupport/UnixSupport.dll | Bin 4 files changed, 344 insertions(+), 344 deletions(-) rename {thirdparty => Duplicati}/UnixSupport/File.cs (97%) rename {thirdparty => Duplicati}/UnixSupport/README.txt (100%) rename {thirdparty => Duplicati}/UnixSupport/UnixSupport.csproj (100%) rename {thirdparty => Duplicati}/UnixSupport/UnixSupport.dll (100%) diff --git a/thirdparty/UnixSupport/File.cs b/Duplicati/UnixSupport/File.cs similarity index 97% rename from thirdparty/UnixSupport/File.cs rename to Duplicati/UnixSupport/File.cs index 7a47fdd63..8f0c1645a 100644 --- a/thirdparty/UnixSupport/File.cs +++ b/Duplicati/UnixSupport/File.cs @@ -1,344 +1,344 @@ -using System; -using System.Collections.Generic; -using Mono.Unix.Native; - -namespace UnixSupport -{ - public static class File - { - - private static readonly bool SUPPORTS_LLISTXATTR; - - static File () - { - bool works = false; - try - { - string[] v; - Mono.Unix.Native.Syscall.llistxattr("/", out v); - works = true; - } - catch (EntryPointNotFoundException e) - { - } - catch - { - } - SUPPORTS_LLISTXATTR = works; - } - - /// - /// Opens the file and honors advisory locking. - /// - /// A open stream that references the file - /// The full path to the file - public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode) - { - return OpenExclusive(path, mode, (int)Mono.Unix.Native.FilePermissions.DEFFILEMODE); - } - - /// - /// Opens the file and honors advisory locking. - /// - /// A open stream that references the file - /// The full path to the file - /// The file create mode - public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode, int filemode) - { - Flock lck; - lck.l_len = 0; - lck.l_pid = Syscall.getpid(); - lck.l_start = 0; - lck.l_type = LockType.F_WRLCK; - lck.l_whence = SeekFlags.SEEK_SET; - - OpenFlags flags = OpenFlags.O_CREAT; - if (mode == System.IO.FileAccess.Read) - { - lck.l_type = LockType.F_RDLCK; - flags |= OpenFlags.O_RDONLY; - } else if (mode == System.IO.FileAccess.Write) { - flags |= OpenFlags.O_WRONLY; - } else { - flags |= OpenFlags.O_RDWR; - } - - int fd = Syscall.open(path, flags, (Mono.Unix.Native.FilePermissions)filemode); - if (fd > 0) - { - //This does not work on OSX, it gives ENOTTY - //int res = Syscall.fcntl(fd, Mono.Unix.Native.FcntlCommand.F_SETLK, ref lck); - - //This is the same (at least for our purpose, and works on OSX) - int res = Syscall.lockf(fd, LockfCommand.F_TLOCK, 0); - - //If we have the lock, return the stream - if (res == 0) - return new Mono.Unix.UnixStream(fd); - else - { - Mono.Unix.Native.Syscall.close(fd); - throw new LockedFileException(path, mode); - } - } - - throw new BadFileException(path); - } - - [Serializable] - private class BadFileException : System.IO.IOException - { - public BadFileException(string filename) - : base(string.Format("Unable to open the file \"{0}\", error: {1} ({2})", filename, Syscall.GetLastError(), (int)Syscall.GetLastError())) - { - } - } - - [Serializable] - private class LockedFileException : System.IO.IOException - { - public LockedFileException(string filename, System.IO.FileAccess mode) - : base(string.Format("Unable to open the file \"{0}\" in mode {1}, error: {2} ({3})", filename, mode, Syscall.GetLastError(), (int)Syscall.GetLastError())) - { - } - } - - [Serializable] - private class FileAccesException : System.IO.IOException - { - public FileAccesException(string filename, string method) - : base(string.Format("Unable to access the file \"{0}\" with method {1}, error: {2} ({3})", filename, method, Syscall.GetLastError(), (int)Syscall.GetLastError())) - { - } - } - - /// - /// Gets the symlink target for the given path - /// - /// The path to get the symlink target for - /// The symlink target - public static string GetSymlinkTarget(string path) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(2048); //2kb, should cover utf16 * 1023 chars - if (Mono.Unix.Native.Syscall.readlink(path, sb, (ulong)sb.Capacity) >= 0) - return sb.ToString(); - - throw new System.IO.FileLoadException(string.Format("Unable to get symlink for \"{0}\", error: {1} ({2})", path, Syscall.GetLastError(), (int)Syscall.GetLastError())); - } - - /// - /// Creates a new symlink - /// - /// The path to create the symbolic link entry - /// The path the symbolic link points to - public static void CreateSymlink(string path, string target) - { - if (Mono.Unix.Native.Syscall.symlink(target, path) != 0) - throw new System.IO.IOException(string.Format("Unable to create symlink from \"{0}\" to \"{1}\", error: {2} ({3})", path, target, Syscall.GetLastError(), (int)Syscall.GetLastError())); - } - - /// - /// Enum that describes the different filesystem entry types - /// - public enum FileType - { - File, - Directory, - Symlink, - Fifo, - Socket, - CharacterDevice, - BlockDevice, - Unknown - } - - /// - /// Gets the type of the file. - /// - /// The file type - /// The full path to look up - public static FileType GetFileType(string path) - { - - var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); - if (fse.IsRegularFile) - return FileType.File; - else if (fse.IsDirectory) - return FileType.Directory; - else if (fse.IsSymbolicLink) - return FileType.Symlink; - else if (fse.IsFifo) - return FileType.Fifo; - else if (fse.IsSocket) - return FileType.Socket; - else if (fse.IsCharacterDevice) - return FileType.CharacterDevice; - else if (fse.IsBlockDevice) - return FileType.BlockDevice; - else - return FileType.Unknown; - } - - - /// - /// Gets the extended attributes. - /// - /// The extended attributes. - /// The full path to look up - /// A flag indicating if the target is a symlink - /// A flag indicating if a symlink should be followed - public static Dictionary GetExtendedAttributes(string path, bool isSymlink, bool followSymlink) - { - // If we get a symlink that we should not follow, we need llistxattr support - if (isSymlink && !followSymlink && !SUPPORTS_LLISTXATTR) - return null; - - var use_llistxattr = SUPPORTS_LLISTXATTR && !followSymlink; - - string[] values; - var size = use_llistxattr ? Mono.Unix.Native.Syscall.llistxattr(path, out values) : Mono.Unix.Native.Syscall.listxattr(path, out values); - if (size < 0) - { - // In case the underlying filesystem does not support extended attributes, - // we simply return that there are no attributes - var err = Syscall.GetLastError(); - if (err == Errno.EOPNOTSUPP || err == Errno.ENODATA) - return null; - - throw new FileAccesException(path, use_llistxattr ? "llistxattr" : "listxattr"); - } - - var dict = new Dictionary(); - foreach(var s in values) - { - byte[] v; - var n = SUPPORTS_LLISTXATTR ? Mono.Unix.Native.Syscall.lgetxattr(path, s, out v) : Mono.Unix.Native.Syscall.getxattr(path, s, out v); - if (n > 0) - dict.Add(s, v); - } - - return dict; - } - - /// - /// Sets an extended attribute. - /// - /// The full path to set the values for - /// The extended attribute key - /// The value to set - public static void SetExtendedAttribute(string path, string key, byte[] value) - { - Mono.Unix.Native.Syscall.setxattr(path, key, value); - } - - /// - /// Describes the basic user/group/perm tuplet for a file or folder - /// - public struct FileInfo - { - public readonly long UID; - public readonly long GID; - public readonly long Permissions; - public readonly string OwnerName; - public readonly string GroupName; - - internal FileInfo(Mono.Unix.UnixFileSystemInfo fse) - { - UID = fse.OwnerUserId; - GID = fse.OwnerGroupId; - Permissions = (long)fse.FileAccessPermissions; - - try - { - OwnerName = fse.OwnerUser.UserName; - } - catch (ArgumentException) - { - // Could not retrieve user name, possibly the user is not defined on the local system - OwnerName = null; - } - - try - { - GroupName = fse.OwnerGroup.GroupName; - } - catch (ArgumentException) - { - // Could not retrieve group name, possibly the group is not defined on the local system - GroupName = null; - } - } - } - - /// - /// Gets the basic user/group/perm tuplet for a file or folder - /// - /// The basic user/group/perm tuplet for a file or folder - /// The full path to look up - public static FileInfo GetUserGroupAndPermissions(string path) - { - return new FileInfo(Mono.Unix.UnixFileInfo.GetFileSystemEntry(path)); - } - - /// - /// Sets the basic user/group/perm tuplet for a file or folder - /// - /// The full path to look up - /// The owner user id to set - /// The owner group id to set - /// The file access permissions to set - public static void SetUserGroupAndPermissions(string path, long uid, long gid, long permissions) - { - Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).SetOwner(uid, gid); - Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).FileAccessPermissions = (Mono.Unix.FileAccessPermissions)permissions; - } - - /// - /// Gets the UID from a user name - /// - /// The user ID. - /// The user name. - public static long GetUserID(string name) - { - return new Mono.Unix.UnixUserInfo(name).UserId; - } - - /// - /// Gets the GID from a group name - /// - /// The user ID. - /// The group name. - public static long GetGroupID(string name) - { - return new Mono.Unix.UnixGroupInfo(name).GroupId; - } - - /// - /// Gets the number of hard links for a file - /// - /// The hardlink count - /// The full path to look up - public static long GetHardlinkCount(string path) - { - var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); - if (fse.IsRegularFile || fse.IsDirectory) - return fse.LinkCount; - else - return 0; - } - - /// - /// Gets a unique ID for the path inode target, - /// which is the device ID and inode ID - /// joined with a ":" - /// - /// The inode target ID. - /// The full path to look up - public static string GetInodeTargetID(string path) - { - var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); - return fse.Device + ":" + fse.Inode; - } - } -} - +using System; +using System.Collections.Generic; +using Mono.Unix.Native; + +namespace UnixSupport +{ + public static class File + { + + private static readonly bool SUPPORTS_LLISTXATTR; + + static File () + { + bool works = false; + try + { + string[] v; + Mono.Unix.Native.Syscall.llistxattr("/", out v); + works = true; + } + catch (EntryPointNotFoundException e) + { + } + catch + { + } + SUPPORTS_LLISTXATTR = works; + } + + /// + /// Opens the file and honors advisory locking. + /// + /// A open stream that references the file + /// The full path to the file + public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode) + { + return OpenExclusive(path, mode, (int)Mono.Unix.Native.FilePermissions.DEFFILEMODE); + } + + /// + /// Opens the file and honors advisory locking. + /// + /// A open stream that references the file + /// The full path to the file + /// The file create mode + public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode, int filemode) + { + Flock lck; + lck.l_len = 0; + lck.l_pid = Syscall.getpid(); + lck.l_start = 0; + lck.l_type = LockType.F_WRLCK; + lck.l_whence = SeekFlags.SEEK_SET; + + OpenFlags flags = OpenFlags.O_CREAT; + if (mode == System.IO.FileAccess.Read) + { + lck.l_type = LockType.F_RDLCK; + flags |= OpenFlags.O_RDONLY; + } else if (mode == System.IO.FileAccess.Write) { + flags |= OpenFlags.O_WRONLY; + } else { + flags |= OpenFlags.O_RDWR; + } + + int fd = Syscall.open(path, flags, (Mono.Unix.Native.FilePermissions)filemode); + if (fd > 0) + { + //This does not work on OSX, it gives ENOTTY + //int res = Syscall.fcntl(fd, Mono.Unix.Native.FcntlCommand.F_SETLK, ref lck); + + //This is the same (at least for our purpose, and works on OSX) + int res = Syscall.lockf(fd, LockfCommand.F_TLOCK, 0); + + //If we have the lock, return the stream + if (res == 0) + return new Mono.Unix.UnixStream(fd); + else + { + Mono.Unix.Native.Syscall.close(fd); + throw new LockedFileException(path, mode); + } + } + + throw new BadFileException(path); + } + + [Serializable] + private class BadFileException : System.IO.IOException + { + public BadFileException(string filename) + : base(string.Format("Unable to open the file \"{0}\", error: {1} ({2})", filename, Syscall.GetLastError(), (int)Syscall.GetLastError())) + { + } + } + + [Serializable] + private class LockedFileException : System.IO.IOException + { + public LockedFileException(string filename, System.IO.FileAccess mode) + : base(string.Format("Unable to open the file \"{0}\" in mode {1}, error: {2} ({3})", filename, mode, Syscall.GetLastError(), (int)Syscall.GetLastError())) + { + } + } + + [Serializable] + private class FileAccesException : System.IO.IOException + { + public FileAccesException(string filename, string method) + : base(string.Format("Unable to access the file \"{0}\" with method {1}, error: {2} ({3})", filename, method, Syscall.GetLastError(), (int)Syscall.GetLastError())) + { + } + } + + /// + /// Gets the symlink target for the given path + /// + /// The path to get the symlink target for + /// The symlink target + public static string GetSymlinkTarget(string path) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(2048); //2kb, should cover utf16 * 1023 chars + if (Mono.Unix.Native.Syscall.readlink(path, sb, (ulong)sb.Capacity) >= 0) + return sb.ToString(); + + throw new System.IO.FileLoadException(string.Format("Unable to get symlink for \"{0}\", error: {1} ({2})", path, Syscall.GetLastError(), (int)Syscall.GetLastError())); + } + + /// + /// Creates a new symlink + /// + /// The path to create the symbolic link entry + /// The path the symbolic link points to + public static void CreateSymlink(string path, string target) + { + if (Mono.Unix.Native.Syscall.symlink(target, path) != 0) + throw new System.IO.IOException(string.Format("Unable to create symlink from \"{0}\" to \"{1}\", error: {2} ({3})", path, target, Syscall.GetLastError(), (int)Syscall.GetLastError())); + } + + /// + /// Enum that describes the different filesystem entry types + /// + public enum FileType + { + File, + Directory, + Symlink, + Fifo, + Socket, + CharacterDevice, + BlockDevice, + Unknown + } + + /// + /// Gets the type of the file. + /// + /// The file type + /// The full path to look up + public static FileType GetFileType(string path) + { + + var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); + if (fse.IsRegularFile) + return FileType.File; + else if (fse.IsDirectory) + return FileType.Directory; + else if (fse.IsSymbolicLink) + return FileType.Symlink; + else if (fse.IsFifo) + return FileType.Fifo; + else if (fse.IsSocket) + return FileType.Socket; + else if (fse.IsCharacterDevice) + return FileType.CharacterDevice; + else if (fse.IsBlockDevice) + return FileType.BlockDevice; + else + return FileType.Unknown; + } + + + /// + /// Gets the extended attributes. + /// + /// The extended attributes. + /// The full path to look up + /// A flag indicating if the target is a symlink + /// A flag indicating if a symlink should be followed + public static Dictionary GetExtendedAttributes(string path, bool isSymlink, bool followSymlink) + { + // If we get a symlink that we should not follow, we need llistxattr support + if (isSymlink && !followSymlink && !SUPPORTS_LLISTXATTR) + return null; + + var use_llistxattr = SUPPORTS_LLISTXATTR && !followSymlink; + + string[] values; + var size = use_llistxattr ? Mono.Unix.Native.Syscall.llistxattr(path, out values) : Mono.Unix.Native.Syscall.listxattr(path, out values); + if (size < 0) + { + // In case the underlying filesystem does not support extended attributes, + // we simply return that there are no attributes + var err = Syscall.GetLastError(); + if (err == Errno.EOPNOTSUPP || err == Errno.ENODATA) + return null; + + throw new FileAccesException(path, use_llistxattr ? "llistxattr" : "listxattr"); + } + + var dict = new Dictionary(); + foreach(var s in values) + { + byte[] v; + var n = SUPPORTS_LLISTXATTR ? Mono.Unix.Native.Syscall.lgetxattr(path, s, out v) : Mono.Unix.Native.Syscall.getxattr(path, s, out v); + if (n > 0) + dict.Add(s, v); + } + + return dict; + } + + /// + /// Sets an extended attribute. + /// + /// The full path to set the values for + /// The extended attribute key + /// The value to set + public static void SetExtendedAttribute(string path, string key, byte[] value) + { + Mono.Unix.Native.Syscall.setxattr(path, key, value); + } + + /// + /// Describes the basic user/group/perm tuplet for a file or folder + /// + public struct FileInfo + { + public readonly long UID; + public readonly long GID; + public readonly long Permissions; + public readonly string OwnerName; + public readonly string GroupName; + + internal FileInfo(Mono.Unix.UnixFileSystemInfo fse) + { + UID = fse.OwnerUserId; + GID = fse.OwnerGroupId; + Permissions = (long)fse.FileAccessPermissions; + + try + { + OwnerName = fse.OwnerUser.UserName; + } + catch (ArgumentException) + { + // Could not retrieve user name, possibly the user is not defined on the local system + OwnerName = null; + } + + try + { + GroupName = fse.OwnerGroup.GroupName; + } + catch (ArgumentException) + { + // Could not retrieve group name, possibly the group is not defined on the local system + GroupName = null; + } + } + } + + /// + /// Gets the basic user/group/perm tuplet for a file or folder + /// + /// The basic user/group/perm tuplet for a file or folder + /// The full path to look up + public static FileInfo GetUserGroupAndPermissions(string path) + { + return new FileInfo(Mono.Unix.UnixFileInfo.GetFileSystemEntry(path)); + } + + /// + /// Sets the basic user/group/perm tuplet for a file or folder + /// + /// The full path to look up + /// The owner user id to set + /// The owner group id to set + /// The file access permissions to set + public static void SetUserGroupAndPermissions(string path, long uid, long gid, long permissions) + { + Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).SetOwner(uid, gid); + Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).FileAccessPermissions = (Mono.Unix.FileAccessPermissions)permissions; + } + + /// + /// Gets the UID from a user name + /// + /// The user ID. + /// The user name. + public static long GetUserID(string name) + { + return new Mono.Unix.UnixUserInfo(name).UserId; + } + + /// + /// Gets the GID from a group name + /// + /// The user ID. + /// The group name. + public static long GetGroupID(string name) + { + return new Mono.Unix.UnixGroupInfo(name).GroupId; + } + + /// + /// Gets the number of hard links for a file + /// + /// The hardlink count + /// The full path to look up + public static long GetHardlinkCount(string path) + { + var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); + if (fse.IsRegularFile || fse.IsDirectory) + return fse.LinkCount; + else + return 0; + } + + /// + /// Gets a unique ID for the path inode target, + /// which is the device ID and inode ID + /// joined with a ":" + /// + /// The inode target ID. + /// The full path to look up + public static string GetInodeTargetID(string path) + { + var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); + return fse.Device + ":" + fse.Inode; + } + } +} + diff --git a/thirdparty/UnixSupport/README.txt b/Duplicati/UnixSupport/README.txt similarity index 100% rename from thirdparty/UnixSupport/README.txt rename to Duplicati/UnixSupport/README.txt diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/Duplicati/UnixSupport/UnixSupport.csproj similarity index 100% rename from thirdparty/UnixSupport/UnixSupport.csproj rename to Duplicati/UnixSupport/UnixSupport.csproj diff --git a/thirdparty/UnixSupport/UnixSupport.dll b/Duplicati/UnixSupport/UnixSupport.dll similarity index 100% rename from thirdparty/UnixSupport/UnixSupport.dll rename to Duplicati/UnixSupport/UnixSupport.dll From e74433acedcc5ae637cbe48829d2e3531d5bf1ff Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 08:07:00 -0800 Subject: [PATCH 088/253] Use nuget posix library and fold UnixSupport into the normal build. --- Duplicati.sln | 8 +++++++- .../Common/Duplicati.Library.Common.csproj | 7 +------ .../Duplicati.Library.SQLiteHelper.csproj | 8 +------- .../Snapshots/Duplicati.Library.Snapshots.csproj | 9 ++------- Duplicati/Server/Duplicati.Server.csproj | 4 +--- Duplicati/UnixSupport/README.txt | 3 --- Duplicati/UnixSupport/UnixSupport.csproj | 6 +++--- Duplicati/UnixSupport/UnixSupport.dll | Bin 8192 -> 0 bytes Installer/debian/debian/rules | 3 --- Installer/fedora/duplicati.spec | 3 --- 10 files changed, 15 insertions(+), 36 deletions(-) delete mode 100644 Duplicati/UnixSupport/README.txt delete mode 100644 Duplicati/UnixSupport/UnixSupport.dll diff --git a/Duplicati.sln b/Duplicati.sln index 0344487ae..542e78004 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -105,10 +105,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoU EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Tardigrade", "Duplicati\Library\Backend\Tardigrade\Duplicati.Library.Backend.Tardigrade.csproj", "{AE035E01-C917-4F13-A35E-78F21C1A2F17}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.TencentCOS", "Duplicati\Library\Backend\TencentCOS\Duplicati.Library.Backend.TencentCOS.csproj", "{545DD6D4-9476-42D6-B51C-A28E000C489E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.TencentCOS", "Duplicati\Library\Backend\TencentCOS\Duplicati.Library.Backend.TencentCOS.csproj", "{545DD6D4-9476-42D6-B51C-A28E000C489E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Telegram", "Duplicati\Library\Backend\Telegram\Duplicati.Library.Backend.Telegram.csproj", "{B6BB37DE-1DCA-401B-B92F-202F341916EA}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnixSupport", "Duplicati\UnixSupport\UnixSupport.csproj", "{70AEA9C1-108D-447B-B53C-E4F8370B1C04}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -327,6 +329,10 @@ Global {B6BB37DE-1DCA-401B-B92F-202F341916EA}.Debug|Any CPU.Build.0 = Debug|Any CPU {B6BB37DE-1DCA-401B-B92F-202F341916EA}.Release|Any CPU.ActiveCfg = Release|Any CPU {B6BB37DE-1DCA-401B-B92F-202F341916EA}.Release|Any CPU.Build.0 = Release|Any CPU + {70AEA9C1-108D-447B-B53C-E4F8370B1C04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70AEA9C1-108D-447B-B53C-E4F8370B1C04}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70AEA9C1-108D-447B-B53C-E4F8370B1C04}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70AEA9C1-108D-447B-B53C-E4F8370B1C04}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 9dc3ebe9a..f29e24624 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -24,16 +24,11 @@ + - - - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - - - \ No newline at end of file diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index fe1103ea4..458bef8bf 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -27,12 +27,6 @@ + - - - - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - - - \ No newline at end of file diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 12e3413ad..e20d5c200 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -24,14 +24,9 @@ - + - - - - - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - + diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 3d69d2952..ed9b0873e 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -115,12 +115,10 @@ + - - ..\..\thirdparty\UnixSupport\UnixSupport.dll - ..\..\thirdparty\HttpServer\HttpServer.dll diff --git a/Duplicati/UnixSupport/README.txt b/Duplicati/UnixSupport/README.txt deleted file mode 100644 index b9345d996..000000000 --- a/Duplicati/UnixSupport/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This project is not really 3rd party. - -It was created solely for use with Duplicati, but it depends on the Mono.Posix.dll file, which is not found on the common Windows developer platform. By creating this mini project, it is possible to reference the functions from Mono.Posix during a Windows build without having access to the Mono.Posix.dll. As this dll is never invoked on Windows, it should have no interest to the Windows developer. diff --git a/Duplicati/UnixSupport/UnixSupport.csproj b/Duplicati/UnixSupport/UnixSupport.csproj index 791eb952e..899511bc0 100644 --- a/Duplicati/UnixSupport/UnixSupport.csproj +++ b/Duplicati/UnixSupport/UnixSupport.csproj @@ -1,9 +1,9 @@ - + net5.0 2.0.0.7 - Exe + Library LGPL, Copyright © Duplicati Team 2015 UnixSupport Duplicati Team @@ -14,7 +14,7 @@ - + \ No newline at end of file diff --git a/Duplicati/UnixSupport/UnixSupport.dll b/Duplicati/UnixSupport/UnixSupport.dll deleted file mode 100644 index 3d04df69f588d8145adba67c0dddf0525d2f3123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 X6g5M@05WIj11bZlY3`_5Lm~tKDbwv2 diff --git a/Installer/debian/debian/rules b/Installer/debian/debian/rules index 6ba8bb314..d2b5e2037 100755 --- a/Installer/debian/debian/rules +++ b/Installer/debian/debian/rules @@ -35,9 +35,6 @@ override_dh_auto_build: xbuild /property:Configuration=Release BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj mono BuildTools/UpdateVersionStamp/bin/Release/UpdateVersionStamp.exe --version=$(VERSION) - xbuild /property:Configuration=Release thirdparty/UnixSupport/UnixSupport.csproj - cp thirdparty/UnixSupport/bin/Release/UnixSupport.dll thirdparty/UnixSupport/UnixSupport.dll - xbuild /property:Configuration=Release Duplicati.sln override_dh_auto_install: diff --git a/Installer/fedora/duplicati.spec b/Installer/fedora/duplicati.spec index aa659b911..393959e89 100755 --- a/Installer/fedora/duplicati.spec +++ b/Installer/fedora/duplicati.spec @@ -121,9 +121,6 @@ nuget restore Duplicati.sln xbuild /property:Configuration=Release BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj mono BuildTools/UpdateVersionStamp/bin/Release/UpdateVersionStamp.exe --version=%{_buildversion} -xbuild /property:Configuration=Release thirdparty/UnixSupport/UnixSupport.csproj -cp thirdparty/UnixSupport/bin/Release/UnixSupport.dll thirdparty/UnixSupport/UnixSupport.dll - xbuild /property:Configuration=Release Duplicati.sln # xbuild BuildTools/LocalizationTool/LocalizationTool.sln From 360d819c0d4022445b3924ad69549d7f41a7b10e Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 08:54:09 -0800 Subject: [PATCH 089/253] Threads are not longer abortable --- Duplicati/CommandLine/Commands.cs | 2 +- Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs | 2 +- Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs | 4 ++-- Duplicati/Library/Main/BackendManager.cs | 4 ++-- Duplicati/Library/Main/Controller.cs | 2 +- Duplicati/Library/Main/ResultClasses.cs | 2 +- Duplicati/Library/Utility/WorkerThread.cs | 2 +- Duplicati/Server/Program.cs | 2 +- Duplicati/Server/WebServer/RESTMethods/CommandLine.cs | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Duplicati/CommandLine/Commands.cs b/Duplicati/CommandLine/Commands.cs index 74523762c..55fbf233b 100644 --- a/Duplicati/CommandLine/Commands.cs +++ b/Duplicati/CommandLine/Commands.cs @@ -115,7 +115,7 @@ namespace Duplicati.CommandLine if (m_thread != null && m_thread.IsAlive) { - m_thread.Abort(); + m_thread.Interrupt(); m_thread.Join(500); } } diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs index 4260da6fa..dcaec091e 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs @@ -63,7 +63,7 @@ namespace Duplicati.GUI.TrayIcon Duplicati.Server.Program.ApplicationExitEvent.Set(); if (!m_runner.Join(TimeSpan.FromSeconds(10))) { - m_runner.Abort(); + m_runner.Interrupt(); m_runner.Join(TimeSpan.FromSeconds(10)); } } diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs index 19fd89ec2..d9bae32eb 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs @@ -211,11 +211,11 @@ namespace Duplicati.GUI.TrayIcon { m_shutdown = true; m_waitLock.Set(); - m_pollThread.Abort(); + m_pollThread.Interrupt(); m_pollThread.Join(TimeSpan.FromSeconds(10)); if (!m_requestThread.Join(TimeSpan.FromSeconds(10))) { - m_requestThread.Abort(); + m_requestThread.Interrupt(); m_requestThread.Join(TimeSpan.FromSeconds(10)); } } diff --git a/Duplicati/Library/Main/BackendManager.cs b/Duplicati/Library/Main/BackendManager.cs index 3882c33e8..c7564f2a5 100644 --- a/Duplicati/Library/Main/BackendManager.cs +++ b/Duplicati/Library/Main/BackendManager.cs @@ -400,7 +400,7 @@ namespace Duplicati.Library.Main if (m_taskControl != null) m_taskControl.StateChangedEvent += (state) => { if (state == TaskControlState.Abort) - m_thread.Abort(); + m_thread.Interrupt(); }; m_queue = new BlockingQueue(options.SynchronousUpload ? 1 : (options.AsynchronousUploadLimit == 0 ? int.MaxValue : options.AsynchronousUploadLimit)); m_thread = new System.Threading.Thread(this.ThreadRun); @@ -1459,7 +1459,7 @@ namespace Duplicati.Library.Main { if (!m_thread.Join(TimeSpan.FromSeconds(10))) { - m_thread.Abort(); + m_thread.Interrupt(); m_thread.Join(TimeSpan.FromSeconds(10)); } diff --git a/Duplicati/Library/Main/Controller.cs b/Duplicati/Library/Main/Controller.cs index 18669a994..4240f93ae 100644 --- a/Duplicati/Library/Main/Controller.cs +++ b/Duplicati/Library/Main/Controller.cs @@ -1105,7 +1105,7 @@ namespace Duplicati.Library.Main var t = m_currentTaskThread; if (t != null) - t.Abort(); + t.Interrupt(); } public long MaxUploadSpeed diff --git a/Duplicati/Library/Main/ResultClasses.cs b/Duplicati/Library/Main/ResultClasses.cs index 2f3ef85bd..3a8a7a004 100644 --- a/Duplicati/Library/Main/ResultClasses.cs +++ b/Duplicati/Library/Main/ResultClasses.cs @@ -496,7 +496,7 @@ namespace Duplicati.Library.Main // If we are aborted, throw exception if (m_controlState == TaskControlState.Abort) { - System.Threading.Thread.CurrentThread.Abort(); + System.Threading.Thread.CurrentThread.Interrupt(); // For some reason, aborting the current thread does not always throw an exception throw new CancelException(); diff --git a/Duplicati/Library/Utility/WorkerThread.cs b/Duplicati/Library/Utility/WorkerThread.cs index 0c25bdb30..faf6d19e2 100644 --- a/Duplicati/Library/Utility/WorkerThread.cs +++ b/Duplicati/Library/Utility/WorkerThread.cs @@ -232,7 +232,7 @@ namespace Duplicati.Library.Utility { try { - m_thread.Abort(); + m_thread.Interrupt(); m_thread.Join(500); } catch diff --git a/Duplicati/Server/Program.cs b/Duplicati/Server/Program.cs index 69d7c9fc8..1c3ed0b7e 100644 --- a/Duplicati/Server/Program.cs +++ b/Duplicati/Server/Program.cs @@ -297,7 +297,7 @@ namespace Duplicati.Server Library.UsageReporter.Reporter.ShutDown(); - try { PingPongThread?.Abort(); } + try { PingPongThread?.Interrupt(); } catch { } LogHandler?.Dispose(); diff --git a/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs b/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs index 624821b49..00e6bb373 100644 --- a/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs +++ b/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs @@ -190,7 +190,7 @@ namespace Duplicati.Server.WebServer.RESTMethods var tr = t.Thread; if (tr != null) - tr.Abort(); + tr.Interrupt(); info.OutputOK(); } From 238a31fea021168c9461e4b6c7d364682e447689 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 09:40:58 -0800 Subject: [PATCH 090/253] FIXME: Strange time issue with backups --- Duplicati/UnitTest/PurgeTesting.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Duplicati/UnitTest/PurgeTesting.cs b/Duplicati/UnitTest/PurgeTesting.cs index d35d3dc1e..32f89b4b8 100644 --- a/Duplicati/UnitTest/PurgeTesting.cs +++ b/Duplicati/UnitTest/PurgeTesting.cs @@ -285,6 +285,8 @@ namespace Duplicati.UnitTest Assert.AreEqual(3, modFilesets); } + //FIXME: Avoid backup from the future + System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5)); // A subsequent backup should be successful. using (Controller c = new Controller("file://" + this.TARGETFOLDER, testopts, null)) { From 0ee4f27ab69848e34a3d25ffe7441198e27e1a60 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 14:17:05 -0800 Subject: [PATCH 091/253] Matrix build --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee13b04c5..c9482edf8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,10 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ ubuntu-latest, windows-latest, macos-latest ] steps: - uses: actions/checkout@v2 From 7b30ef31eac6d25380e945279525a3564dc33bdd Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 14:59:07 -0800 Subject: [PATCH 092/253] Add artifacts --- .github/workflows/ci.yml | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c9482edf8..76dfe74ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: CI Build +name: CI on: push: @@ -7,10 +7,10 @@ on: branches: [ net5 ] jobs: - build: - + UnitTest: runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: os: [ ubuntu-latest, windows-latest, macos-latest ] @@ -26,3 +26,27 @@ jobs: run: dotnet build --no-restore Duplicati.sln - name: Test run: dotnet test --no-build --verbosity normal Duplicati.sln + + Artifact: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest, windows-latest, macos-latest ] + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.101 + - name: Restore dependencies + run: dotnet restore Duplicati.sln + - name: Package + run: dotnet publish -p:PublishReadyToRun=true --self-contained=true -p:PublishTrimmed=true -o publish Duplicati.sln + - name: Save Artifacts + uses: actions/upload-artifact@v2 + with: + name: artifacts + path: publish + \ No newline at end of file From d935d71d3ae827b7e0fba691fc45c5594bd7517d Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 15:40:05 -0800 Subject: [PATCH 093/253] Set runtime when publishing --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76dfe74ef..6e3f5eb6a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-latest, windows-latest, macos-latest ] + os: [ [ubuntu-latest, linux-x64], [windows-latest, win-x64], [macos-latest, osx-x64] ] steps: - uses: actions/checkout@v2 @@ -43,7 +43,7 @@ jobs: - name: Restore dependencies run: dotnet restore Duplicati.sln - name: Package - run: dotnet publish -p:PublishReadyToRun=true --self-contained=true -p:PublishTrimmed=true -o publish Duplicati.sln + run: dotnet publish -p:PublishReadyToRun=true --runtime=${{ matrix.os[1] }} --self-contained=true -p:PublishTrimmed=true -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: From 7400e20ff0ef18ee87516449a529032b760676c3 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 16:42:57 -0800 Subject: [PATCH 094/253] Try object syntax --- .github/workflows/ci.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e3f5eb6a..3666b40c8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,11 +28,14 @@ jobs: run: dotnet test --no-build --verbosity normal Duplicati.sln Artifact: - runs-on: ${{ matrix.os }} + runs-on: ${{ matrix.cfg.os }} strategy: fail-fast: false matrix: - os: [ [ubuntu-latest, linux-x64], [windows-latest, win-x64], [macos-latest, osx-x64] ] + cfg: + - { os: ubuntu-latest, runtime: linux-x64 } + - { os: windows-latest, runtime: win-x64 } + - { os: macos-latest, runtime: osx-x64 } steps: - uses: actions/checkout@v2 @@ -43,7 +46,7 @@ jobs: - name: Restore dependencies run: dotnet restore Duplicati.sln - name: Package - run: dotnet publish -p:PublishReadyToRun=true --runtime=${{ matrix.os[1] }} --self-contained=true -p:PublishTrimmed=true -o publish Duplicati.sln + run: dotnet publish -p:PublishReadyToRun=true --runtime=${{ matrix.cfg.runtime }} --self-contained=true -p:PublishTrimmed=true -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: From d4e613939eddff16b8a4d67933ac0e79a9c52b1b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 17:08:31 -0800 Subject: [PATCH 095/253] Debug macos time difference --- Duplicati/Library/Common/IO/SystemIOLinux.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Duplicati/Library/Common/IO/SystemIOLinux.cs b/Duplicati/Library/Common/IO/SystemIOLinux.cs index 1acb95b47..b005efb70 100644 --- a/Duplicati/Library/Common/IO/SystemIOLinux.cs +++ b/Duplicati/Library/Common/IO/SystemIOLinux.cs @@ -54,7 +54,10 @@ namespace Duplicati.Library.Common.IO public void FileSetLastWriteTimeUtc(string path, DateTime time) { + Console.WriteLine("Was modify time {0}: {1}", path, File.GetLastWriteTimeUtc(path).Ticks); + Console.WriteLine("Set modify time {0}: {1}", path, time.Ticks); File.SetLastWriteTimeUtc(path, time); + Console.WriteLine("Now modify time {0}: {1}", path, File.GetLastWriteTimeUtc(path).Ticks); } public void FileSetCreationTimeUtc(string path, DateTime time) @@ -64,7 +67,9 @@ namespace Duplicati.Library.Common.IO public DateTime FileGetLastWriteTimeUtc(string path) { - return File.GetLastWriteTimeUtc(path); + var time = File.GetLastWriteTimeUtc(path); + Console.WriteLine("Get modify time {0}: {1}", path, time.Ticks); + return time; } public DateTime FileGetCreationTimeUtc(string path) @@ -258,7 +263,9 @@ namespace Duplicati.Library.Common.IO public DateTime GetLastWriteTimeUtc(string path) { - return File.GetLastWriteTimeUtc(path); + var time = File.GetLastWriteTimeUtc(path); + Console.WriteLine("Get modify time {0}: {1}", path, time.Ticks); + return time; } public IEnumerable EnumerateDirectories(string path) From 4cdeaa94c7ae59e10aaa047c69ac0076a33a64c9 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 19:32:09 -0800 Subject: [PATCH 096/253] Relax unit test file time checking on osx --- Duplicati/UnitTest/TestUtils.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Duplicati/UnitTest/TestUtils.cs b/Duplicati/UnitTest/TestUtils.cs index 36d7beaf1..b1828d5d9 100644 --- a/Duplicati/UnitTest/TestUtils.cs +++ b/Duplicati/UnitTest/TestUtils.cs @@ -23,8 +23,9 @@ using Duplicati.Library.Logging; using System.Reflection; using System.Threading; using System.Threading.Tasks; -using Duplicati.Library.Common.IO; +using Duplicati.Library.Common.IO; using NUnit.Framework; +using System.Runtime.InteropServices; namespace Duplicati.UnitTest { @@ -243,13 +244,17 @@ namespace Duplicati.UnitTest // Compare file metadata if (verifymetadata) { + //OSX seem to like to actually set the time to some value earlier than what you set by tens of milliseconds. + //Reading the time right after it is set gives the expected value but when read later it is slightly different. + //Maybe a bug in .net? + var granularity = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? 100 : 1; Assert.That( SystemIO.IO_OS.GetLastWriteTimeUtc(actualFile), - Is.EqualTo(SystemIO.IO_OS.GetLastWriteTimeUtc(expectedFile)).Within(1).Milliseconds, + Is.EqualTo(SystemIO.IO_OS.GetLastWriteTimeUtc(expectedFile)).Within(granularity).Milliseconds, $"{contextMessage}, last write time mismatch for {expectedFile} and {actualFile}"); Assert.That( SystemIO.IO_OS.GetCreationTimeUtc(actualFile), - Is.EqualTo(SystemIO.IO_OS.GetCreationTimeUtc(expectedFile)).Within(1).Milliseconds, + Is.EqualTo(SystemIO.IO_OS.GetCreationTimeUtc(expectedFile)).Within(granularity).Milliseconds, $"{contextMessage}, creation time mismatch for {expectedFile} and {actualFile}"); } } From 733fd712d2034ee272fa2fb27896fde810525b1f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 19:32:33 -0800 Subject: [PATCH 097/253] Fix restore not including the runtime --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3666b40c8..e1fdd854d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,7 @@ jobs: with: dotnet-version: 5.0.101 - name: Restore dependencies - run: dotnet restore Duplicati.sln + run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln - name: Package run: dotnet publish -p:PublishReadyToRun=true --runtime=${{ matrix.cfg.runtime }} --self-contained=true -p:PublishTrimmed=true -o publish Duplicati.sln - name: Save Artifacts From f2d209cfaf43e5457cd7d75d7d48385b9d69d1aa Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 22:26:35 -0800 Subject: [PATCH 098/253] Even more relaxed --- Duplicati/UnitTest/TestUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/UnitTest/TestUtils.cs b/Duplicati/UnitTest/TestUtils.cs index b1828d5d9..af64aff14 100644 --- a/Duplicati/UnitTest/TestUtils.cs +++ b/Duplicati/UnitTest/TestUtils.cs @@ -247,7 +247,7 @@ namespace Duplicati.UnitTest //OSX seem to like to actually set the time to some value earlier than what you set by tens of milliseconds. //Reading the time right after it is set gives the expected value but when read later it is slightly different. //Maybe a bug in .net? - var granularity = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? 100 : 1; + var granularity = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? 500 : 1; Assert.That( SystemIO.IO_OS.GetLastWriteTimeUtc(actualFile), Is.EqualTo(SystemIO.IO_OS.GetLastWriteTimeUtc(expectedFile)).Within(granularity).Milliseconds, From e80abca658aec831842280add66ff7fbf02142f0 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 3 Jan 2021 22:27:03 -0800 Subject: [PATCH 099/253] Try to get publishing to work despite depending on exes like dlls --- .../BackendTester/Duplicati.CommandLine.BackendTester.csproj | 2 ++ .../BackendTool/Duplicati.CommandLine.BackendTool.csproj | 2 ++ Duplicati/CommandLine/Duplicati.CommandLine.csproj | 2 ++ .../RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj | 2 ++ Duplicati/Server/Duplicati.Server.csproj | 2 ++ 5 files changed, 10 insertions(+) diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index cc2164e3c..0e46bd51c 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -12,6 +12,8 @@ BackendTester Duplicati.CommandLine.BackendTester Duplicati.CommandLine.BackendTester + + true diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 8c3675620..20a77eb2f 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -12,6 +12,8 @@ BackendTool Duplicati.CommandLine.BackendTool Duplicati.CommandLine.BackendTool + + true diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj index ac9279d38..25ae7b2f7 100644 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/Duplicati.CommandLine.csproj @@ -13,6 +13,8 @@ Duplicati.CommandLine Duplicati.CommandLine TrayWarning.ico + + true diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 4d4d36526..409836524 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -12,6 +12,8 @@ RecoveryTool Duplicati.CommandLine.RecoveryTool Duplicati.CommandLine.RecoveryTooln + + true diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index ed9b0873e..008283252 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -12,6 +12,8 @@ Server Duplicati.Server Duplicati.Server + + true From 48f7110c0b3a034da68a17dc197ed9f71e53d33e Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 4 Jan 2021 07:35:30 -0800 Subject: [PATCH 100/253] fix publishing maybe --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1fdd854d..b0777dfbe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,7 +46,7 @@ jobs: - name: Restore dependencies run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln - name: Package - run: dotnet publish -p:PublishReadyToRun=true --runtime=${{ matrix.cfg.runtime }} --self-contained=true -p:PublishTrimmed=true -o publish Duplicati.sln + run: dotnet publish --runtime=${{ matrix.cfg.runtime }} -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: From 25217a93c11049cfb3604f120699a40405bf2975 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 4 Jan 2021 19:42:48 -0800 Subject: [PATCH 101/253] CI script updates --- .appveyor.yml | 55 ++++++---------------------------------- .github/workflows/ci.yml | 2 +- .travis.yml | 40 ++--------------------------- 3 files changed, 11 insertions(+), 86 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index b27b0c9fc..008d4371a 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -2,13 +2,14 @@ version: 1.0.{build} image: Visual Studio 2019 configuration: Debug platform: Any CPU +#Don't build twice for PR's to same repo +skip_branch_with_pr: true environment: AUTOUPDATER_Duplicati_SKIP_UPDATE: 1 COVERALLS_REPO_TOKEN: secure: szQsrkP5rvra8L60SomD73/dFvRwot0UuyA566zqzI2qmLOr+MhLN0AyC8BTbhYY before_build: - ps: $env:UNITTEST_BASEFOLDER = "$Env:APPVEYOR_BUILD_FOLDER" + "\testdata" - - cmd: nuget restore Duplicati.sln build: project: Duplicati.sln verbosity: minimal @@ -18,53 +19,13 @@ test_script: 7z x DSMCBE.zip -otestdata mkdir .\testData\data + + dotnet test --verbosity normal Duplicati.sln + $testsPassed = $? - nuget install OpenCover -Version 4.7.922 -OutputDirectory packages - nuget install coveralls.net -Version 1.0.0 -OutputDirectory packages - nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory packages - - $testDir = ".\Duplicati\UnitTest\bin\Debug" - $tests = @("$testDir\Duplicati.UnitTest.dll") - $testsPassed = $true - - foreach ($elem in $tests) { - $testResultsFile = "$elem" + ".xml" - - .\packages\OpenCover.4.7.922\tools\OpenCover.Console.exe ` - -register:user ` - -target:.\packages\NUnit.ConsoleRunner.3.10.0\tools\nunit3-console.exe ` - "-targetargs:""$elem"" /where:cat!=BulkData /result:""$testResultsFile""" ` - "-filter:+[Duplicati.Library.Main]* -[UnitTest]*" ` - -output:opencover.xml ` - -returntargetcode ` - - # Keep track of test failures so that we can throw an exception after - # uploading coverage and test results. - $testsPassed = $testsPassed -and $? - - # Upload test results to AppVeyor. - $wc = New-Object "System.Net.WebClient" - $wc.UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\""$testResultsFile"")) - } - - if ($Env:COVERALLS_REPO_TOKEN) { - $revision = git rev-parse HEAD - $branch = git rev-parse --abbrev-ref HEAD - $commitAuthor = git show --quiet --format="%aN" $revision - $commitEmail = git show --quiet --format="%aE" $revision - $commitMessage = git show --quiet --format="%s" $revision - - .\packages\coveralls.net.0.7.0\tools\csmacnz.Coveralls.exe ` - --opencover -i opencover.xml ` - --repoToken "$Env:COVERALLS_REPO_TOKEN" ` - --commitId "$revision" ` - --commitBranch "$branch" ` - --commitAuthor "$commitAuthor" ` - --commitEmail "$commitEmail" ` - --commitMessage "$commitMessage" ` - --useRelativePaths ` - --basePath .\Duplicati\UnitTest\bin\Debug - } + # Upload test results to AppVeyor. + $wc = New-Object "System.Net.WebClient" + $wc.UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", "TestResults.xml") if (!$testsPassed) { throw "Tests failed." diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b0777dfbe..724cddec8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,6 +50,6 @@ jobs: - name: Save Artifacts uses: actions/upload-artifact@v2 with: - name: artifacts + name: duplicati-${{ matrix.cfg.runtime }} path: publish \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 225209504..821ca6fe8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,20 +3,8 @@ services: docker before_install: - sudo apt-get install moreutils - set -o pipefail -addons: - coverity_scan: - project: - name: "duplicati/duplicati" - description: "Duplicati Build submitted via Travis CI" - notification_email: kenneth@duplicati.com - build_command_prepend: "msbuild /t:Clean" - build_command: "msbuild /t:Rebuild" - branch_pattern: coverity_scan env: global: - # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created - # via the "travis encrypt" command using the project repo's public key - - secure: "ijaQDcVcMo/utuP514FiDZVGR5LJbATWmYDmgRIIaI0YG2Rk6uuJp9XXDXr8sx66JWttPGgs7Htqfy50VKHdr7nsfyCQCRNGmqF+OJeUgAQMj5spxn9A7PZY9+GVhnXoJ06wvYjCv5MPeLBMDK/KpIM5Ny5IG+TKzQy4U7Dyg0riMUT61aqzxSjTGfHZPmaqBICJTzsRmeGHglemFUz/1B4NAN+IeAtXoH9YIfA2LjJfYmMLckPgFQLKN/tQRaGPWXh77y0qVgA++K8UVu5W3yGo3JXBPDdabGgKs9BPlfN5/Ixnkcy6ekAubDA/Aspur9x7/szj4/AnGMY6frNB33nQcnJQZ/51GYKr6CXCmjoJQuWc8ZKdEMqDn3w/kyEzvluSjAsJNRVboeWPE4VfpAeUBsjQ+TuEQi8WXhN8VJgZV7yCkVlZTVbhtOxMPsBiFb74lpWC2iQuWLJv9ED6vyXZVzZhNtfjXNXNZzIwYxbcd7I0ZQ8fmDstFnvBJveJby2ZRpECXTbc03eIUq1SAaVJJY2r47RD1PwVqM3xvUTljIqtKdyIz915mEOjqG1BnCDaiGHYJ4byuDDeIUZO9X70s60Gh4hupZA2Ruup0v7SfYgkto6aNcStd0NYd716Vd7hqXNTp6nu01L5YYJDY4h5sHyBXVXbxCKlUb01kUw=" - USAGEREPORTER_Duplicati_LEVEL=none - AUTOUPDATER_Duplicati_SKIP_UPDATE=1 - BUILD_DIR=${TRAVIS_BUILD_DIR}/../.build @@ -37,7 +25,7 @@ jobs: directories: - $BUILD_DIR script: - - ${ROOT_DIR}/pipeline/jobs/build_job.sh + - dotnet build ${ROOT_DIR}/Duplicati.sln - stage: tests @@ -45,31 +33,7 @@ jobs: directories: - $BUILD_DIR script: - - ${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories BulkNormal - - stage: tests - cache: - directories: - - $BUILD_DIR - script: - - ${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories BulkNoSize - - stage: tests - cache: - directories: - - $BUILD_DIR - script: - - ${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories SVNDataLong,SVNData,RecoveryTool,ProblematicPath,SymLink - - stage: tests - cache: - directories: - - $BUILD_DIR - script: - - travis_wait ${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories Border - - stage: tests - cache: - directories: - - $BUILD_DIR - script: - - ${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories Filter,Targeted,Purge,Serialization,WebApi,Utility,UriUtility,IO,ImportExport,Disruption,RestoreHandler,RepairHandler,DeleteHandler,Controller + - dotnet test --verbosity normal ${ROOT_DIR}/Duplicati.sln - stage: tests cache: From 3643862bfd7b0efdbc7d61c9fa1a5791e0732e19 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 4 Jan 2021 19:51:49 -0800 Subject: [PATCH 102/253] More ci tweaks --- .appveyor.yml | 5 ++--- .travis.yml | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 008d4371a..3ab28bf43 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -10,9 +10,8 @@ environment: secure: szQsrkP5rvra8L60SomD73/dFvRwot0UuyA566zqzI2qmLOr+MhLN0AyC8BTbhYY before_build: - ps: $env:UNITTEST_BASEFOLDER = "$Env:APPVEYOR_BUILD_FOLDER" + "\testdata" -build: - project: Duplicati.sln - verbosity: minimal +build_script: + cmd: dotnet build Duplicati.sln test_script: - ps: | Start-FileDownload https://s3.amazonaws.com/duplicati-test-file-hosting/DSMCBE.zip diff --git a/.travis.yml b/.travis.yml index 821ca6fe8..96c9824d4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ -language: minimal +language: csharp +mono: none +dotnet: 5.0.101 services: docker before_install: - sudo apt-get install moreutils From 8e7f55d863b6f23066594025313c9dfbc78861eb Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 4 Jan 2021 19:52:39 -0800 Subject: [PATCH 103/253] Try splitting workflow to get artifacts sooner --- .github/workflows/artifacts.yml | 35 +++++++++++++++++++++++++++++++++ .github/workflows/ci.yml | 27 ------------------------- 2 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/artifacts.yml diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml new file mode 100644 index 000000000..28057c472 --- /dev/null +++ b/.github/workflows/artifacts.yml @@ -0,0 +1,35 @@ +name: Atrifacts + +on: + push: + branches: [ net5 ] + pull_request: + branches: [ net5 ] + +jobs: + Artifact: + runs-on: ${{ matrix.cfg.os }} + strategy: + fail-fast: false + matrix: + cfg: + - { os: ubuntu-latest, runtime: linux-x64 } + - { os: windows-latest, runtime: win-x64 } + - { os: macos-latest, runtime: osx-x64 } + + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.101 + - name: Restore dependencies + run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln + - name: Package + run: dotnet publish --runtime=${{ matrix.cfg.runtime }} -o publish Duplicati.sln + - name: Save Artifacts + uses: actions/upload-artifact@v2 + with: + name: duplicati-${{ matrix.cfg.runtime }} + path: publish + \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 724cddec8..5c85e7961 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,30 +26,3 @@ jobs: run: dotnet build --no-restore Duplicati.sln - name: Test run: dotnet test --no-build --verbosity normal Duplicati.sln - - Artifact: - runs-on: ${{ matrix.cfg.os }} - strategy: - fail-fast: false - matrix: - cfg: - - { os: ubuntu-latest, runtime: linux-x64 } - - { os: windows-latest, runtime: win-x64 } - - { os: macos-latest, runtime: osx-x64 } - - steps: - - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.101 - - name: Restore dependencies - run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln - - name: Package - run: dotnet publish --runtime=${{ matrix.cfg.runtime }} -o publish Duplicati.sln - - name: Save Artifacts - uses: actions/upload-artifact@v2 - with: - name: duplicati-${{ matrix.cfg.runtime }} - path: publish - \ No newline at end of file From dd883b89373109edd85cab4d9364fc32cbc87ac3 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 4 Jan 2021 19:59:33 -0800 Subject: [PATCH 104/253] Fix some naming --- .github/workflows/artifacts.yml | 4 ++-- .github/workflows/ci.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 28057c472..329768791 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -1,4 +1,4 @@ -name: Atrifacts +name: Artifacts on: push: @@ -7,7 +7,7 @@ on: branches: [ net5 ] jobs: - Artifact: + Zip: runs-on: ${{ matrix.cfg.os }} strategy: fail-fast: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c85e7961..e72833eee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: CI +name: Unit on: push: @@ -7,7 +7,7 @@ on: branches: [ net5 ] jobs: - UnitTest: + Tests: runs-on: ${{ matrix.os }} strategy: fail-fast: false From aa05b6bead43b3d70c6bf7a0f44868f831ffa82a Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 4 Jan 2021 21:07:03 -0800 Subject: [PATCH 105/253] Try to get selenium working and make the artifacts be release builds --- .github/workflows/artifacts.yml | 2 +- pipeline/stage_integrationtests/job.sh | 12 +----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 329768791..d374343b0 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -26,7 +26,7 @@ jobs: - name: Restore dependencies run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln - name: Package - run: dotnet publish --runtime=${{ matrix.cfg.runtime }} -o publish Duplicati.sln + run: dotnet publish -c Release --runtime=${{ matrix.cfg.runtime }} -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index 12f6762c9..d3bebb32a 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -2,15 +2,6 @@ . /pipeline/docker-run/markers.sh . /pipeline/shared/duplicati.sh -# The version of mono available within the selenium docker image is too old so -# we will install the latest version. -function update_mono () { - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF - echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list - sudo apt update - sudo apt install -y mono-complete -} - function start_test () { pip install selenium pip install --upgrade urllib3 @@ -21,12 +12,11 @@ function start_test () { # export PATH=$PATH:/duplicati/ #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - mono "${DUPLICATI_ROOT}/Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/Duplicati.Server.exe" & + mono "${DUPLICATI_ROOT}/Duplicati/Server/bin/Debug/net5.0/Duplicati.Server.exe" & cd python "${DUPLICATI_ROOT}/guiTests/guiTest.py" } travis_mark_begin "INTEGRATION TESTING" -update_mono start_test travis_mark_end "INTEGRATION TESTING" From d976969deb747c88138d6d2d150271bc8a8909dc Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 4 Jan 2021 21:22:57 -0800 Subject: [PATCH 106/253] Erronious mono --- pipeline/stage_integrationtests/job.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index d3bebb32a..8b0bf9d2f 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -12,7 +12,7 @@ function start_test () { # export PATH=$PATH:/duplicati/ #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - mono "${DUPLICATI_ROOT}/Duplicati/Server/bin/Debug/net5.0/Duplicati.Server.exe" & + "${DUPLICATI_ROOT}/Duplicati/Server/bin/Debug/net5.0/Duplicati.Server.exe" & cd python "${DUPLICATI_ROOT}/guiTests/guiTest.py" } From cc6e404397d220751c1b24be6e556d026f6ba5cd Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 5 Jan 2021 07:39:44 -0800 Subject: [PATCH 107/253] Try to fix paths --- .travis.yml | 3 ++- pipeline/stage_integrationtests/job.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 96c9824d4..53a61894f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,8 @@ jobs: directories: - $BUILD_DIR script: - - dotnet build ${ROOT_DIR}/Duplicati.sln + - dotnet build -o $BUILD_DIR ${ROOT_DIR}/Duplicati.sln + - cp -R ${ROOT_DIR}/guiTests $BUILD_DIR/ - stage: tests diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index 8b0bf9d2f..d908dc039 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -12,7 +12,7 @@ function start_test () { # export PATH=$PATH:/duplicati/ #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - "${DUPLICATI_ROOT}/Duplicati/Server/bin/Debug/net5.0/Duplicati.Server.exe" & + "${DUPLICATI_ROOT}/Duplicati.Server.exe" & cd python "${DUPLICATI_ROOT}/guiTests/guiTest.py" } From 60e85591a96f9846328ababdbd2eda295ec9e1b4 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 5 Jan 2021 08:05:10 -0800 Subject: [PATCH 108/253] Try to find the files. --- .travis.yml | 3 --- pipeline/stage_integrationtests/job.sh | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 53a61894f..3edf04c08 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,9 +32,6 @@ jobs: - stage: tests - cache: - directories: - - $BUILD_DIR script: - dotnet test --verbosity normal ${ROOT_DIR}/Duplicati.sln diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index d908dc039..b7f38711a 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -12,6 +12,7 @@ function start_test () { # export PATH=$PATH:/duplicati/ #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- + ls ${DUPLICATI_ROOT} "${DUPLICATI_ROOT}/Duplicati.Server.exe" & cd python "${DUPLICATI_ROOT}/guiTests/guiTest.py" From 9d8e6014ce47c5aa6cf675f5e066a8381c83a0b7 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 5 Jan 2021 19:44:39 -0800 Subject: [PATCH 109/253] Its native, no .exe --- pipeline/stage_integrationtests/job.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index b7f38711a..34168569c 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -13,7 +13,7 @@ function start_test () { #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- ls ${DUPLICATI_ROOT} - "${DUPLICATI_ROOT}/Duplicati.Server.exe" & + "${DUPLICATI_ROOT}/Duplicati.Server" & cd python "${DUPLICATI_ROOT}/guiTests/guiTest.py" } From 47b3da1cd344be172b228bbaf0c05962345849d6 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 5 Jan 2021 20:37:07 -0800 Subject: [PATCH 110/253] Python 3 --- guiTests/guiTest.py | 45 +++++++--------------- pipeline/stage_integrationtests/job.sh | 7 ++-- pipeline/stage_integrationtests/trigger.sh | 2 +- 3 files changed, 17 insertions(+), 37 deletions(-) diff --git a/guiTests/guiTest.py b/guiTests/guiTest.py index 882c8b0a6..b635c5d11 100644 --- a/guiTests/guiTest.py +++ b/guiTests/guiTest.py @@ -10,33 +10,14 @@ from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.firefox.options import Options -if "TRAVIS_BUILD_NUMBER" in os.environ: - if "SAUCE_USERNAME" not in os.environ: - print "No sauce labs login credentials found. Stopping tests..." - sys.exit(0) - - capabilities = {'browserName': "firefox"} - capabilities['platform'] = "Windows 7" - capabilities['version'] = "48.0" - capabilities['screenResolution'] = "1280x1024" - capabilities["build"] = os.environ["TRAVIS_BUILD_NUMBER"] - capabilities["tunnel-identifier"] = os.environ["TRAVIS_JOB_NUMBER"] - - # connect to sauce labs - username = os.environ["SAUCE_USERNAME"] - access_key = os.environ["SAUCE_ACCESS_KEY"] - hub_url = "%s:%s@localhost:4445" % (username, access_key) - driver = webdriver.Remote(command_executor="http://%s/wd/hub" % hub_url, desired_capabilities=capabilities) -else: - # local - print "Using LOCAL webdriver" - profile = webdriver.FirefoxProfile() - profile.set_preference("intl.accept_languages", "en") - options = Options() - options.set_headless(headless=True) - driver = webdriver.Firefox(profile, firefox_options=options) - driver.maximize_window() - +# local +print("Using LOCAL webdriver") +profile = webdriver.FirefoxProfile() +profile.set_preference("intl.accept_languages", "en") +options = Options() +options.set_headless(headless=True) +driver = webdriver.Firefox(profile, firefox_options=options) +driver.maximize_window() def write_random_file(size, filename): if not os.path.exists(os.path.dirname(filename)): @@ -142,10 +123,10 @@ driver.find_element_by_link_text(BACKUP_NAME).click() wait_for_text(60, "//div[@class='task ng-scope']/dl[2]/dd[1]", "(took ") # Restore -if len([n for n in driver.find_elements_by_xpath(u"//span[contains(text(),'Restore files \u2026')]") if n.is_displayed()]) == 0: +if len([n for n in driver.find_elements_by_xpath("//span[contains(text(),'Restore files \u2026')]") if n.is_displayed()]) == 0: driver.find_element_by_link_text(BACKUP_NAME).click() -[n for n in driver.find_elements_by_xpath(u"//span[contains(text(),'Restore files \u2026')]") if n.is_displayed()][0].click() +[n for n in driver.find_elements_by_xpath("//span[contains(text(),'Restore files \u2026')]") if n.is_displayed()][0].click() driver.find_element_by_xpath("//span[contains(text(),'" + SOURCE_FOLDER + "')]") # wait for filelist time.sleep(1) driver.find_element_by_xpath("//restore-file-picker/ul/li/div/a[2]").click() # select root folder checkbox @@ -198,9 +179,9 @@ wait_for_text(60, "//form[@id='restore']/div[3]/h3/div[1]", "Your files and fold # hash direct restore files sha1_direct_restore = sha1_folder(DIRECT_RESTORE_FOLDER) -print "Source hashes: " + str(sha1_source) -print "Restore hashes: " + str(sha1_restore) -print "Direct Restore hashes: " + str(sha1_direct_restore) +print("Source hashes: " + str(sha1_source)) +print("Restore hashes: " + str(sha1_restore)) +print("Direct Restore hashes: " + str(sha1_direct_restore)) # Tell Sauce Labs to stop the test driver.quit() diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index 34168569c..d6276f163 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -3,8 +3,8 @@ . /pipeline/shared/duplicati.sh function start_test () { - pip install selenium - pip install --upgrade urllib3 + pip3 install selenium + #pip install --upgrade urllib3 # wget "https://github.com/mozilla/geckodriver/releases/download/v0.23.0/geckodriver-v0.23.0-linux32.tar.gz" # tar -xvzf geckodriver* @@ -12,10 +12,9 @@ function start_test () { # export PATH=$PATH:/duplicati/ #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - ls ${DUPLICATI_ROOT} "${DUPLICATI_ROOT}/Duplicati.Server" & cd - python "${DUPLICATI_ROOT}/guiTests/guiTest.py" + python3 "${DUPLICATI_ROOT}/guiTests/guiTest.py" } travis_mark_begin "INTEGRATION TESTING" diff --git a/pipeline/stage_integrationtests/trigger.sh b/pipeline/stage_integrationtests/trigger.sh index f3a404fb2..5e6967fa8 100755 --- a/pipeline/stage_integrationtests/trigger.sh +++ b/pipeline/stage_integrationtests/trigger.sh @@ -1,7 +1,7 @@ #!/bin/bash . error_handling.sh -PACKAGES="python-pip rsync" +PACKAGES="python3-pip rsync" docker-run --image selenium/standalone-firefox \ --packages "$PACKAGES" \ --asroot \ From 39b79f6474d5eb09a23d26163428bc22cfb57aa6 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 5 Jan 2021 20:44:22 -0800 Subject: [PATCH 111/253] Test self contained --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3edf04c08..0263fac07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,7 @@ jobs: directories: - $BUILD_DIR script: - - dotnet build -o $BUILD_DIR ${ROOT_DIR}/Duplicati.sln + - dotnet publish -r linux-x64 -o $BUILD_DIR ${ROOT_DIR}/Duplicati.sln - cp -R ${ROOT_DIR}/guiTests $BUILD_DIR/ From 096e0a46f30040e4455c60318ad98efcdbb7a744 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 5 Jan 2021 21:20:20 -0800 Subject: [PATCH 112/253] Disable the updater --- pipeline/stage_integrationtests/job.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index d6276f163..d16c8a0b7 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -12,7 +12,7 @@ function start_test () { # export PATH=$PATH:/duplicati/ #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - "${DUPLICATI_ROOT}/Duplicati.Server" & + AUTOUPDATER_Duplicati_SKIP_UPDATE=1 "${DUPLICATI_ROOT}/Duplicati.Server" & cd python3 "${DUPLICATI_ROOT}/guiTests/guiTest.py" } From 3a730741c25442e258b5f54eb701e9c9a118d541 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 6 Jan 2021 07:23:16 -0800 Subject: [PATCH 113/253] change working directory --- pipeline/stage_integrationtests/job.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh index d16c8a0b7..d0d9b9ed2 100755 --- a/pipeline/stage_integrationtests/job.sh +++ b/pipeline/stage_integrationtests/job.sh @@ -12,8 +12,8 @@ function start_test () { # export PATH=$PATH:/duplicati/ #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - AUTOUPDATER_Duplicati_SKIP_UPDATE=1 "${DUPLICATI_ROOT}/Duplicati.Server" & cd + AUTOUPDATER_Duplicati_SKIP_UPDATE=1 "${DUPLICATI_ROOT}/Duplicati.Server" & python3 "${DUPLICATI_ROOT}/guiTests/guiTest.py" } From 51288b85edfbb21b10c1066da869cf9ae64d22df Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 6 Jan 2021 07:38:24 -0800 Subject: [PATCH 114/253] Test assumptiions about docker on github actions --- .github/workflows/ci.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e72833eee..4c7928fb6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,3 +26,18 @@ jobs: run: dotnet build --no-restore Duplicati.sln - name: Test run: dotnet test --no-build --verbosity normal Duplicati.sln + jobs: + + Selenium: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup .NET + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.101 + - name: Build + run: dotnet publish -r linux-x64 -o publish/ Duplicati.sln + - name: Selenium + run: docker images + \ No newline at end of file From 14dbd73da252739e0d4e10802c73d3627f538fca Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 6 Jan 2021 07:50:59 -0800 Subject: [PATCH 115/253] Typo --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c7928fb6..962d54101 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,6 @@ jobs: run: dotnet build --no-restore Duplicati.sln - name: Test run: dotnet test --no-build --verbosity normal Duplicati.sln - jobs: Selenium: runs-on: ubuntu-latest From 2db939ba6a2d05a00c7526a2b436f248fc6f3fc2 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 7 Jan 2021 21:40:47 -0800 Subject: [PATCH 116/253] Fix missing webroot when publishing --- Duplicati/Server/Duplicati.Server.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 008283252..6cd9d5d2a 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -132,7 +132,10 @@ - + + Always + Always + \ No newline at end of file From 32c3eb3a0ecc1d105c13d090a6ec1bfdb81115ea Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 7 Jan 2021 21:43:58 -0800 Subject: [PATCH 117/253] Selenium Docker Actions --- .github/workflows/ci.yml | 8 +------- guiTests/guiTest.py | 2 +- pipeline/selenium/docker/Dockerfile | 10 ++++++++++ pipeline/selenium/docker/runner.sh | 9 +++++++++ pipeline/selenium/test.sh | 6 ++++++ 5 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 pipeline/selenium/docker/Dockerfile create mode 100755 pipeline/selenium/docker/runner.sh create mode 100755 pipeline/selenium/test.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 962d54101..269e09899 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,12 +31,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.101 - - name: Build - run: dotnet publish -r linux-x64 -o publish/ Duplicati.sln - name: Selenium - run: docker images + run: pipeline/selenium/test.sh \ No newline at end of file diff --git a/guiTests/guiTest.py b/guiTests/guiTest.py index b635c5d11..811970b07 100644 --- a/guiTests/guiTest.py +++ b/guiTests/guiTest.py @@ -74,7 +74,7 @@ driver.implicitly_wait(10) driver.get("http://localhost:8200/ngax/index.html") if "Duplicati" not in driver.title: - raise Exception("Unable to load duplicati GUI!") + raise Exception("Unable to load duplicati GUI! Got: " + driver.title) # Create and hash random files in the source folder write_random_file(1024 * 1024, SOURCE_FOLDER + os.sep + "1MB.test") diff --git a/pipeline/selenium/docker/Dockerfile b/pipeline/selenium/docker/Dockerfile new file mode 100644 index 000000000..a565835aa --- /dev/null +++ b/pipeline/selenium/docker/Dockerfile @@ -0,0 +1,10 @@ +FROM selenium/standalone-firefox + +ENV DEBIAN_FRONTEND=noninteractive +RUN wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O ~/packages-microsoft-prod.deb +RUN sudo dpkg -i ~/packages-microsoft-prod.deb +RUN sudo apt-get update && sudo apt-get install -y python3-pip rsync dotnet-sdk-5.0 +RUN pip3 install selenium + +ADD runner.sh / +CMD /runner.sh \ No newline at end of file diff --git a/pipeline/selenium/docker/runner.sh b/pipeline/selenium/docker/runner.sh new file mode 100755 index 000000000..bb6cd50ff --- /dev/null +++ b/pipeline/selenium/docker/runner.sh @@ -0,0 +1,9 @@ +mkdir /home/seluser/published/ +chmod +S /home/seluser/published/ +sudo dotnet publish -o /home/seluser/published/ /sources/Duplicati.sln + +cd +AUTOUPDATER_Duplicati_SKIP_UPDATE=1 "/home/seluser/published/Duplicati.Server" & +timeout 240 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; echo Checking if server started...; done' 127.0.0.1 8200 +echo Running Tests... +python3 /sources/guiTests/guiTest.py \ No newline at end of file diff --git a/pipeline/selenium/test.sh b/pipeline/selenium/test.sh new file mode 100755 index 000000000..240f08ff5 --- /dev/null +++ b/pipeline/selenium/test.sh @@ -0,0 +1,6 @@ +SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) + +docker build $SCRIPTDIR/docker -t duplicati-selenium + +export MSYS_NO_PATHCONV=1 +docker run --rm -v $SCRIPTDIR/../../:/sources duplicati-selenium \ No newline at end of file From f424c1e999cbb3e331ae7bdc4d9c9aa70e1aa8c1 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 8 Jan 2021 07:51:13 -0800 Subject: [PATCH 118/253] Don't publish the unit tests --- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 2d0e7cb18..1c470e3dd 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -13,6 +13,7 @@ Duplicati.UnitTest Duplicati.UnitTest false + false From cda1e2e09a3fff60beac508fbc223221ece77c15 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 8 Jan 2021 08:16:30 -0800 Subject: [PATCH 119/253] Remove old build scripts --- .appveyor.yml | 31 ------ .github/workflows/artifacts.yml | 1 + .travis.yml | 47 --------- pipeline/.local_config.sh | 10 -- pipeline/docker-run/docker-run | 97 ------------------ pipeline/docker-run/error_handling.sh | 17 ---- pipeline/docker-run/markers.sh | 11 --- pipeline/docker-run/runner.sh | 108 --------------------- pipeline/jobs/_imports.sh | 10 -- pipeline/jobs/build_job.sh | 7 -- pipeline/jobs/selenium_job.sh | 7 -- pipeline/jobs/unittest_job.sh | 7 -- pipeline/shared/duplicati.sh | 9 -- pipeline/stage_build/job.sh | 32 ------ pipeline/stage_build/trigger.sh | 7 -- pipeline/stage_integrationtests/job.sh | 22 ----- pipeline/stage_integrationtests/trigger.sh | 9 -- pipeline/stage_unittests/job.sh | 19 ---- pipeline/stage_unittests/trigger.sh | 7 -- pipeline/start.sh | 11 --- 20 files changed, 1 insertion(+), 468 deletions(-) delete mode 100644 .appveyor.yml delete mode 100644 .travis.yml delete mode 100644 pipeline/.local_config.sh delete mode 100755 pipeline/docker-run/docker-run delete mode 100644 pipeline/docker-run/error_handling.sh delete mode 100644 pipeline/docker-run/markers.sh delete mode 100755 pipeline/docker-run/runner.sh delete mode 100755 pipeline/jobs/_imports.sh delete mode 100755 pipeline/jobs/build_job.sh delete mode 100755 pipeline/jobs/selenium_job.sh delete mode 100755 pipeline/jobs/unittest_job.sh delete mode 100644 pipeline/shared/duplicati.sh delete mode 100755 pipeline/stage_build/job.sh delete mode 100755 pipeline/stage_build/trigger.sh delete mode 100755 pipeline/stage_integrationtests/job.sh delete mode 100755 pipeline/stage_integrationtests/trigger.sh delete mode 100755 pipeline/stage_unittests/job.sh delete mode 100755 pipeline/stage_unittests/trigger.sh delete mode 100755 pipeline/start.sh diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 3ab28bf43..000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: 1.0.{build} -image: Visual Studio 2019 -configuration: Debug -platform: Any CPU -#Don't build twice for PR's to same repo -skip_branch_with_pr: true -environment: - AUTOUPDATER_Duplicati_SKIP_UPDATE: 1 - COVERALLS_REPO_TOKEN: - secure: szQsrkP5rvra8L60SomD73/dFvRwot0UuyA566zqzI2qmLOr+MhLN0AyC8BTbhYY -before_build: - - ps: $env:UNITTEST_BASEFOLDER = "$Env:APPVEYOR_BUILD_FOLDER" + "\testdata" -build_script: - cmd: dotnet build Duplicati.sln -test_script: - - ps: | - Start-FileDownload https://s3.amazonaws.com/duplicati-test-file-hosting/DSMCBE.zip - - 7z x DSMCBE.zip -otestdata - mkdir .\testData\data - - dotnet test --verbosity normal Duplicati.sln - $testsPassed = $? - - # Upload test results to AppVeyor. - $wc = New-Object "System.Net.WebClient" - $wc.UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", "TestResults.xml") - - if (!$testsPassed) { - throw "Tests failed." - } diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index d374343b0..638981acb 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -26,6 +26,7 @@ jobs: - name: Restore dependencies run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln - name: Package + #TODO: investigate #if __WindowsGTK__ || ENABLE_GTK via -p:DefineConstants=ENABLE_GTK Maybe needed for GUI? run: dotnet publish -c Release --runtime=${{ matrix.cfg.runtime }} -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0263fac07..000000000 --- a/.travis.yml +++ /dev/null @@ -1,47 +0,0 @@ -language: csharp -mono: none -dotnet: 5.0.101 -services: docker -before_install: - - sudo apt-get install moreutils - - set -o pipefail -env: - global: - - USAGEREPORTER_Duplicati_LEVEL=none - - AUTOUPDATER_Duplicati_SKIP_UPDATE=1 - - BUILD_DIR=${TRAVIS_BUILD_DIR}/../.build - - TEST_DIR=${TRAVIS_BUILD_DIR}/../.test - - ROOT_DIR="$TRAVIS_BUILD_DIR" - -# matrix expansion within jobs would be good: -# https://github.com/travis-ci/travis-ci/issues/8295 - -# There is one cache per branch, so concurrent builds on different branches possible! -# DO NOT SET ENVIRONMENT VARIABLES WITHIN JOBS, OR CACHES WILL NOT BE SHARED AMONGST JOBS! - - -jobs: - include: - - stage: build - cache: - directories: - - $BUILD_DIR - script: - - dotnet publish -r linux-x64 -o $BUILD_DIR ${ROOT_DIR}/Duplicati.sln - - cp -R ${ROOT_DIR}/guiTests $BUILD_DIR/ - - - - stage: tests - script: - - dotnet test --verbosity normal ${ROOT_DIR}/Duplicati.sln - - - stage: tests - cache: - directories: - - $BUILD_DIR - script: - - ${ROOT_DIR}/pipeline/jobs/selenium_job.sh - addons: - sauce_connect: - username: $SAUCE_USERNAME - access_key: $SAUCE_ACCESS_KEY diff --git a/pipeline/.local_config.sh b/pipeline/.local_config.sh deleted file mode 100644 index 35475b945..000000000 --- a/pipeline/.local_config.sh +++ /dev/null @@ -1,10 +0,0 @@ - -export ROOT_DIR=${SCRIPT_DIR}/../ -# caches -export BUILD_DIR=/tmp/.duplicati_build -export TEST_DIR=/tmp/.duplicati_test -export ARCHIVE_DIR=${ROOT_DIR}/.duplicati_zip -export PACKAGES_DIR=${ROOT_DIR}/.duplicati_packages -export SIGN_DIR=${ROOT_DIR}/.duplicati_sign -export UPLOAD_DIR=${ROOT_DIR}/.duplicati_upload - diff --git a/pipeline/docker-run/docker-run b/pipeline/docker-run/docker-run deleted file mode 100755 index aa3625825..000000000 --- a/pipeline/docker-run/docker-run +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash -. "$( cd "$(dirname "$0")" ; pwd -P )/error_handling.sh" -. "$( cd "$(dirname "$0")" ; pwd -P )/markers.sh" - -function pull_docker_image () { - travis_mark_begin "PULL MINIMAL DOCKER IMAGE" - docker pull $DOCKER_IMAGE - travis_mark_end "PULL MINIMAL DOCKER IMAGE" -} - -function add_option () { - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$2" -} - -function add_volumes () { - volume_args=() - - volume_args[${#volume_args[@]}]="-v /var/run/docker.sock:/var/run/docker.sock \ - -v ${TARGET_DIR}:/application \ - ${DOCKER_VOLUME} \ - -v $( cd "$(dirname "$0")" ; pwd -P )/../:/pipeline ${DOCKER_SHARED_MEM}" - - for (( i=1; i<${#SOURCE_DIR[@]}+1; i++ )); do - volume_args[${#volume_args[@]}]="-v ${SOURCE_DIR[$i-1]}:/source_$i" - done -} - -function run_with_docker () { - if [ -z ${TARGET_DIR} ]; then - echo "no target cache specified" - exit 1 - fi - - add_volumes - - docker run ${volume_args[@]} \ - --privileged $DOCKER_AS_ROOT --rm $DOCKER_IMAGE "/pipeline/docker-run/runner.sh" "${FORWARD_OPTS[@]}" -} - -function parse_options () { - FORWARD_OPTS=() - SOURCE_DIR=() - - while true ; do - case "$1" in - --image) - DOCKER_IMAGE="$2" - ;; - --sourcedir) - SOURCE_DIR[${#SOURCE_DIR[@]}]="$2" - ;; - --targetdir) - TARGET_DIR="$2" - ;; - --asroot) - DOCKER_AS_ROOT="-u 0" - ;; - --volume) - DOCKER_VOLUME="-v $2" - ;; - --sharedmem) - DOCKER_SHARED_MEM="-v /dev/shm:/dev/shm" - ;; - --*) - if [[ $2 =~ ^--.* || -z $2 ]]; then - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - else - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$2" - fi - ;; - esac - - if [[ -z $1 ]]; then - break - elif [[ $2 =~ ^--.* || -z $2 ]]; then - shift - else - shift - shift - fi - done - - - if [ "${TARGET_DIR##${SOURCE_DIR}}" != "${TARGET_DIR}" ]; then - echo "targetdir $TARGET_DIR is not allowed to be a subdir of sourcedir $SOURCE_DIR" - fi - - - add_option "--workingdir" "$TARGET_DIR" - add_option "--sourcedirnum" ${#SOURCE_DIR[@]} -} - -parse_options "$@" -pull_docker_image -run_with_docker \ No newline at end of file diff --git a/pipeline/docker-run/error_handling.sh b/pipeline/docker-run/error_handling.sh deleted file mode 100644 index baab6e68b..000000000 --- a/pipeline/docker-run/error_handling.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -function quit_on_error() { - local parent_lineno="$1" - local message="$2" - local code="${3:-1}" - if [[ -n "$message" ]] ; then - echo "Error in $0 line ${parent_lineno}: ${message}; exiting with status ${code}" - else - echo "Error in $0 line ${parent_lineno}; exiting with status ${code}" - fi - exit "${code}" -} - -set -eE -trap 'quit_on_error $LINENO' ERR -set -o pipefail diff --git a/pipeline/docker-run/markers.sh b/pipeline/docker-run/markers.sh deleted file mode 100644 index f27571163..000000000 --- a/pipeline/docker-run/markers.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -function travis_mark_begin () { - echo "travis_fold:start:$1" - echo "+ START $1" -} - -function travis_mark_end () { - echo "travis_fold:end:$1" - echo "+ DONE $1" -} diff --git a/pipeline/docker-run/runner.sh b/pipeline/docker-run/runner.sh deleted file mode 100755 index 4ed08661c..000000000 --- a/pipeline/docker-run/runner.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash -. "$( cd "$(dirname "$0")" ; pwd -P )/error_handling.sh" -. "$( cd "$(dirname "$0")" ; pwd -P )/markers.sh" - -function sync_dirs () { - rsync_delete_option="--delete" - for (( i=1; i<$SOURCE_DIR_NUM+1; i++ )); do - travis_mark_begin "SYNCING DIR source_${i}" - rsync -a $rsync_delete_option "/source_${i}/" "/application/" - unset rsync_delete_option - travis_mark_end "SYNCING DIR source_${i}" - done -} - -function setup () { - travis_mark_begin "INSTALLING PACKAGES IN DOCKER" - - if [ -f /sbin/apk ]; then - apk --update add $DOCKER_PACKAGES - elif [ -f /usr/bin/apt-get ]; then - export DEBIAN_FRONTEND=noninteractive - apt-get update && apt-get install -y $DOCKER_PACKAGES - fi - travis_mark_end "INSTALLING PACKAGES IN DOCKER" -} - -function clean_up () { - if [[ -z $KEEP_TARGET_FILTER ]]; then - return - fi - - cd /application - find . -type f ! -regex "${KEEP_TARGET_FILTER}" -delete - find . -type d -empty -delete - - for (( i=1; i<${#KEEP_SOURCE_FILTER[@]}+1; i++ )); do - cd /source_${i} - find . -type f ! -regex "${KEEP_SOURCE_FILTER[$i-1]}" -delete - find . -type d -empty -delete - done -} - -function parse_options () { - KEEP_SOURCE_FILTER=() - - while true ; do - case "$1" in - --command) - DOCKER_COMMAND="$2" - ;; - --packages) - DOCKER_PACKAGES="$2" - ;; - --sourcedirnum) - SOURCE_DIR_NUM="$2" - ;; - --keeptargetfilter) - KEEP_TARGET_FILTER="$2" - ;; - --keepsourcefilter) - KEEP_SOURCE_FILTER[${#KEEP_SOURCE_FILTER[@]}]="$2" - ;; - --*) - if [[ $2 =~ ^--.* || -z $2 ]]; then - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - else - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$2" - fi - ;; - esac - - if [[ -z $1 ]]; then - break - elif [[ $2 =~ ^--.* || -z $2 ]]; then - shift - else - shift - shift - fi - done -} - -function set_user_script_vars () { - option_found=false - for arg in ${FORWARD_OPTS[@]}; do - if [[ $option_found == true ]]; then - eval $option=$arg - export $option - option_found=false - elif [[ $arg =~ ^--.* ]]; then - option_found=true - option=${arg#"--"} - elif [[ $arg =~ ^-.* ]]; then - flag=${arg#"-"} - eval $flag=true - export $flag - fi - done -} - -parse_options "$@" -setup -sync_dirs -cd /application -set_user_script_vars -$DOCKER_COMMAND "${FORWARD_OPTS[@]}" -clean_up \ No newline at end of file diff --git a/pipeline/jobs/_imports.sh b/pipeline/jobs/_imports.sh deleted file mode 100755 index 8d3a04fe8..000000000 --- a/pipeline/jobs/_imports.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -export PATH="$PATH:${ROOT_DIR}/pipeline/docker-run" -. error_handling.sh - -which ts > /dev/null -if [[ $? -ne 0 ]]; then - echo "please install ts. e.g. brew install moreutils/apt-get install moreutils" - exit 1 -fi \ No newline at end of file diff --git a/pipeline/jobs/build_job.sh b/pipeline/jobs/build_job.sh deleted file mode 100755 index 46717ce4f..000000000 --- a/pipeline/jobs/build_job.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/_imports.sh" - -${ROOT_DIR}/pipeline/stage_build/trigger.sh \ ---sourcedir "${ROOT_DIR}" \ ---targetdir "${BUILD_DIR}" $@ | ts diff --git a/pipeline/jobs/selenium_job.sh b/pipeline/jobs/selenium_job.sh deleted file mode 100755 index 32aafd190..000000000 --- a/pipeline/jobs/selenium_job.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/_imports.sh" - -${ROOT_DIR}/pipeline/stage_integrationtests/trigger.sh \ ---sourcedir "${BUILD_DIR}" \ ---targetdir "${TEST_DIR}" $@ | ts diff --git a/pipeline/jobs/unittest_job.sh b/pipeline/jobs/unittest_job.sh deleted file mode 100755 index 719732915..000000000 --- a/pipeline/jobs/unittest_job.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/_imports.sh" - -${ROOT_DIR}/pipeline/stage_unittests/trigger.sh \ ---sourcedir $BUILD_DIR \ ---targetdir $TEST_DIR $@ | ts diff --git a/pipeline/shared/duplicati.sh b/pipeline/shared/duplicati.sh deleted file mode 100644 index c58546e3c..000000000 --- a/pipeline/shared/duplicati.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -. "$( cd "$(dirname "$0")" ; pwd -P )/../docker-run/error_handling.sh" - -export DUPLICATI_ROOT="/application/" -declare -a FORWARD_OPTS - -export UPDATE_SOURCE="${DUPLICATI_ROOT}/Updates/build/${BUILDTAG}_source" -export UPDATE_TARGET="${DUPLICATI_ROOT}/Updates/build/${BUILDTAG}_target" - diff --git a/pipeline/stage_build/job.sh b/pipeline/stage_build/job.sh deleted file mode 100755 index b61f3dd3a..000000000 --- a/pipeline/stage_build/job.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -. /pipeline/docker-run/markers.sh -. /pipeline/shared/duplicati.sh - -function build () { - nuget restore "${DUPLICATI_ROOT}"/Duplicati.sln - - if [ ! -d "${DUPLICATI_ROOT}"/packages/SharpCompress.0.23.0 ]; then - ln -s "${DUPLICATI_ROOT}"/packages/sharpcompress.0.23.0 "${DUPLICATI_ROOT}"/packages/SharpCompress.0.23.0 - fi - - # build version stamper - msbuild -p:Configuration=Release -v:minimal "${DUPLICATI_ROOT}/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj" - mono "${DUPLICATI_ROOT}/BuildTools/UpdateVersionStamp/bin/Release/UpdateVersionStamp.exe" --version="${releaseversion}" - - # build autoupdate - nuget restore "${DUPLICATI_ROOT}/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.sln" - msbuild -p:Configuration=Release -v:minimal "${DUPLICATI_ROOT}/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.sln" - - # build gpg signing tool - nuget restore "${DUPLICATI_ROOT}/BuildTools/GnupgSigningTool/GnupgSigningTool.sln" - msbuild -p:Configuration=Release -v:minimal "${DUPLICATI_ROOT}/BuildTools/GnupgSigningTool/GnupgSigningTool.sln" - - # build duplicati - msbuild -p:DefineConstants=ENABLE_GTK /p:Configuration=Release "${DUPLICATI_ROOT}/Duplicati.sln" - - cp -r "${DUPLICATI_ROOT}"/Duplicati/Server/webroot "${DUPLICATI_ROOT}"/Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/webroot -} - -travis_mark_begin "BUILDING BINARIES" -build -travis_mark_end "BUILDING BINARIES" diff --git a/pipeline/stage_build/trigger.sh b/pipeline/stage_build/trigger.sh deleted file mode 100755 index c583ffc8b..000000000 --- a/pipeline/stage_build/trigger.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -. error_handling.sh - -PACKAGES="libgtk2.0-cil rsync" -docker-run --image mono \ ---packages "$PACKAGES" \ ---command "/pipeline/stage_build/job.sh" $@ \ No newline at end of file diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh deleted file mode 100755 index d0d9b9ed2..000000000 --- a/pipeline/stage_integrationtests/job.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -. /pipeline/docker-run/markers.sh -. /pipeline/shared/duplicati.sh - -function start_test () { - pip3 install selenium - #pip install --upgrade urllib3 - - # wget "https://github.com/mozilla/geckodriver/releases/download/v0.23.0/geckodriver-v0.23.0-linux32.tar.gz" - # tar -xvzf geckodriver* - # chmod +x geckodriver - # export PATH=$PATH:/duplicati/ - - #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - cd - AUTOUPDATER_Duplicati_SKIP_UPDATE=1 "${DUPLICATI_ROOT}/Duplicati.Server" & - python3 "${DUPLICATI_ROOT}/guiTests/guiTest.py" -} - -travis_mark_begin "INTEGRATION TESTING" -start_test -travis_mark_end "INTEGRATION TESTING" diff --git a/pipeline/stage_integrationtests/trigger.sh b/pipeline/stage_integrationtests/trigger.sh deleted file mode 100755 index 5e6967fa8..000000000 --- a/pipeline/stage_integrationtests/trigger.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -. error_handling.sh - -PACKAGES="python3-pip rsync" -docker-run --image selenium/standalone-firefox \ ---packages "$PACKAGES" \ ---asroot \ ---sharedmem \ ---command "sudo -u seluser /pipeline/stage_integrationtests/job.sh" $@ diff --git a/pipeline/stage_unittests/job.sh b/pipeline/stage_unittests/job.sh deleted file mode 100755 index fece2e7b0..000000000 --- a/pipeline/stage_unittests/job.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -. /pipeline/docker-run/markers.sh -. /pipeline/shared/duplicati.sh - -function start_test () { - travis_mark_begin "SETUP NUGET" - nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory testrunner - travis_mark_end "SETUP NUGET" - - for CAT in $(echo $testcategories | sed "s/,/ /g") - do - travis_mark_begin "UNIT TESTING CATEGORY $CAT" - mono "${DUPLICATI_ROOT}"/testrunner/NUnit.ConsoleRunner.3.10.0/tools/nunit3-console.exe \ - "${DUPLICATI_ROOT}"/Duplicati/UnitTest/bin/Release/Duplicati.UnitTest.dll --where:cat==$CAT --workers=1 - travis_mark_end "UNIT TESTING CATEGORY $CAT" - done -} - -start_test diff --git a/pipeline/stage_unittests/trigger.sh b/pipeline/stage_unittests/trigger.sh deleted file mode 100755 index 4d493175a..000000000 --- a/pipeline/stage_unittests/trigger.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -. error_handling.sh - -PACKAGES="wget unzip rsync" -docker-run --image mono \ ---packages "$PACKAGES" \ ---command "/pipeline/stage_unittests/job.sh" $@ \ No newline at end of file diff --git a/pipeline/start.sh b/pipeline/start.sh deleted file mode 100755 index a208fd6b3..000000000 --- a/pipeline/start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/docker-run/error_handling.sh" -. "${SCRIPT_DIR}/.local_config.sh" - -${ROOT_DIR}/pipeline/jobs/build_job.sh -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories BulkNormal -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories BulkNoSize -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories SVNDataLong,SVNData,RecoveryTool,ProblematicPath,SymLink -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories Border -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories Filter,Targeted,Purge,Serialization,WebApi,Utility,UriUtility,IO,ImportExport,Disruption,RestoreHandler,RepairHandler,DeleteHandler,Controller From bb0a6e8a121ea56b2d102329c7da16b95a7d5bb3 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 16 Jan 2021 16:06:01 -0800 Subject: [PATCH 120/253] Get debian packages building (untested) --- .github/workflows/artifacts.yml | 11 + Installer/Makefile/Makefile | 85 --- Installer/Synology/INFO | 18 - Installer/Synology/LICENSE | 491 ------------------ Installer/Synology/PACKAGE_ICON.PNG | Bin 4481 -> 0 bytes Installer/Synology/PACKAGE_ICON_120.PNG | Bin 4940 -> 0 bytes Installer/Synology/PACKAGE_ICON_256.PNG | Bin 7114 -> 0 bytes Installer/Synology/dsm.duplicati.conf | 12 - Installer/Synology/make-binary-package.sh | 148 ------ Installer/Synology/scripts/postinst | 11 - Installer/Synology/scripts/postuninst | 3 - Installer/Synology/scripts/postupgrade.sh | 2 - Installer/Synology/scripts/preinst | 2 - Installer/Synology/scripts/preuninst | 2 - Installer/Synology/scripts/preupgrade.sh | 2 - Installer/Synology/scripts/start-stop-status | 142 ----- Installer/Synology/web-extra/config | 12 - .../web-extra/package/ngax/package.js | 49 -- .../Synology/web-extra/synoimg/app_128.png | Bin 1401 -> 0 bytes .../Synology/web-extra/synoimg/app_16.png | Bin 292 -> 0 bytes .../Synology/web-extra/synoimg/app_192.png | Bin 2164 -> 0 bytes .../Synology/web-extra/synoimg/app_24.png | Bin 427 -> 0 bytes .../Synology/web-extra/synoimg/app_256.png | Bin 3270 -> 0 bytes .../Synology/web-extra/synoimg/app_32.png | Bin 353 -> 0 bytes .../Synology/web-extra/synoimg/app_48.png | Bin 579 -> 0 bytes .../Synology/web-extra/synoimg/app_64.png | Bin 671 -> 0 bytes .../Synology/web-extra/synoimg/app_72.png | Bin 911 -> 0 bytes Installer/debian/build.sh | 12 + Installer/debian/debian/docs | 2 - Installer/debian/debian/rules | 96 ---- Installer/debian/docker/Dockerfile | 24 + .../debian/{ => docker}/debian/changelog | 0 Installer/debian/{ => docker}/debian/compat | 0 Installer/debian/{ => docker}/debian/control | 4 +- .../debian/{ => docker}/debian/copyright | 0 Installer/debian/docker/debian/docs | 1 + .../{ => docker}/debian/duplicati.default | 0 .../{ => docker}/debian/duplicati.install | 0 .../{ => docker}/debian/duplicati.service | 0 Installer/debian/docker/debian/make.sh | 2 + .../debian/{ => docker}/debian/patches/series | 0 Installer/debian/docker/debian/rules | 57 ++ Installer/debian/docker/runner.sh | 10 + Installer/fedora/duplicati-binary.spec | 28 +- pipeline/linuxZip/build.sh | 9 + pipeline/linuxZip/docker/Dockerfile | 11 + pipeline/linuxZip/docker/runner.sh | 5 + pipeline/selenium/docker/Dockerfile | 2 +- 48 files changed, 146 insertions(+), 1107 deletions(-) delete mode 100755 Installer/Makefile/Makefile delete mode 100755 Installer/Synology/INFO delete mode 100644 Installer/Synology/LICENSE delete mode 100644 Installer/Synology/PACKAGE_ICON.PNG delete mode 100644 Installer/Synology/PACKAGE_ICON_120.PNG delete mode 100644 Installer/Synology/PACKAGE_ICON_256.PNG delete mode 100644 Installer/Synology/dsm.duplicati.conf delete mode 100644 Installer/Synology/make-binary-package.sh delete mode 100755 Installer/Synology/scripts/postinst delete mode 100755 Installer/Synology/scripts/postuninst delete mode 100755 Installer/Synology/scripts/postupgrade.sh delete mode 100755 Installer/Synology/scripts/preinst delete mode 100755 Installer/Synology/scripts/preuninst delete mode 100755 Installer/Synology/scripts/preupgrade.sh delete mode 100755 Installer/Synology/scripts/start-stop-status delete mode 100644 Installer/Synology/web-extra/config delete mode 100644 Installer/Synology/web-extra/package/ngax/package.js delete mode 100644 Installer/Synology/web-extra/synoimg/app_128.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_16.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_192.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_24.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_256.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_32.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_48.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_64.png delete mode 100644 Installer/Synology/web-extra/synoimg/app_72.png create mode 100644 Installer/debian/build.sh delete mode 100644 Installer/debian/debian/docs delete mode 100755 Installer/debian/debian/rules create mode 100644 Installer/debian/docker/Dockerfile rename Installer/debian/{ => docker}/debian/changelog (100%) rename Installer/debian/{ => docker}/debian/compat (100%) rename Installer/debian/{ => docker}/debian/control (52%) rename Installer/debian/{ => docker}/debian/copyright (100%) create mode 100644 Installer/debian/docker/debian/docs rename Installer/debian/{ => docker}/debian/duplicati.default (100%) rename Installer/debian/{ => docker}/debian/duplicati.install (100%) rename Installer/debian/{ => docker}/debian/duplicati.service (100%) create mode 100644 Installer/debian/docker/debian/make.sh rename Installer/debian/{ => docker}/debian/patches/series (100%) create mode 100644 Installer/debian/docker/debian/rules create mode 100644 Installer/debian/docker/runner.sh create mode 100644 pipeline/linuxZip/build.sh create mode 100644 pipeline/linuxZip/docker/Dockerfile create mode 100644 pipeline/linuxZip/docker/runner.sh diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 638981acb..34db456e1 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -33,4 +33,15 @@ jobs: with: name: duplicati-${{ matrix.cfg.runtime }} path: publish + Deb: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Package + run: Installer/debian/build.sh + - name: Save Artifacts + uses: actions/upload-artifact@v2 + with: + name: duplicati*.deb + path: publish \ No newline at end of file diff --git a/Installer/Makefile/Makefile b/Installer/Makefile/Makefile deleted file mode 100755 index 691dd74cb..000000000 --- a/Installer/Makefile/Makefile +++ /dev/null @@ -1,85 +0,0 @@ -BUILD_TOOL=xbuild -BUILD_ARGS=/property:Platform=Any\ CPU /property:Configuration=Release -BUILD_ARGS_DEBUG=/property:Platform=Any\ CPU /property:Configuration=Debug - -NUGET_TOOL=nuget -NUGET_ARGS=restore - -OUTPUT_ARGS=/property:OutputPath=bin/Release -SOURCE_DIR=../../. -PACKAGE_DIR=./pkg -PKG_TARGET=$(PACKAGE_DIR)/usr/lib/duplicati - -all: package - -build: - $(NUGET_TOOL) $(NUGET_ARGS) "$(SOURCE_DIR)/Duplicati.sln" - $(BUILD_TOOL) $(BUILD_ARGS) "$(SOURCE_DIR)/Duplicati.sln" - $(BUILD_TOOL) $(BUILD_ARGS) "$(SOURCE_DIR)/BuildTools/UpdateVersionStamp/UpdateVersionStamp.sln" - -debug: - $(NUGET_TOOL) $(NUGET_ARGS) "$(SOURCE_DIR)/Duplicati.sln" - $(BUILD_TOOL) $(BUILD_ARGS_DEBUG) "$(SOURCE_DIR)/Duplicati.sln" - $(BUILD_TOOL) $(BUILD_ARGS_DEBUG) "$(SOURCE_DIR)/BuildTools/UpdateVersionStamp/UpdateVersionStamp.sln" - -package: build - if [ -e "$(PACKAGE_DIR)" ]; then \ - rm -rf "$(PACKAGE_DIR)"; \ - fi - mkdir "$(PACKAGE_DIR)" - mkdir "$(PACKAGE_DIR)/usr" - mkdir "$(PACKAGE_DIR)/usr/lib" - mkdir "$(PACKAGE_DIR)/usr/bin" - mkdir "$(PACKAGE_DIR)/usr/share" - mkdir "$(PACKAGE_DIR)/usr/share/applications" - mkdir "$(PACKAGE_DIR)/usr/share/pixmaps" - mkdir "$(PACKAGE_DIR)/usr/share/doc" - mkdir "$(PACKAGE_DIR)/usr/share/doc/duplicati" - cp -R "$(SOURCE_DIR)/Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release" "$(PACKAGE_DIR)/usr/lib/duplicati" - - rm -rf "$(PKG_TARGET)/SQLite" - rm -rf "$(PKG_TARGET)/win-tools" - rm -rf "$(PKG_TARGET)/"*.mdb - - cp -R "$(SOURCE_DIR)/Duplicati/Server/webroot" "$(PACKAGE_DIR)/usr/lib/duplicati/" - cp "$(SOURCE_DIR)/Installer/debian/duplicati-launcher.sh" "$(PACKAGE_DIR)/usr/bin/duplicati" - cp "$(SOURCE_DIR)/Installer/debian/duplicati-commandline-launcher.sh" "$(PACKAGE_DIR)/usr/bin/duplicati-cli" - cp "$(SOURCE_DIR)/Installer/debian/duplicati-server-launcher.sh" "$(PACKAGE_DIR)/usr/bin/duplicati-server" - cp "$(SOURCE_DIR)/Installer/debian/duplicati.desktop" "$(PACKAGE_DIR)/usr/share/applications/" - cp "$(SOURCE_DIR)/Installer/debian/duplicati.xpm" "$(PACKAGE_DIR)/usr/share/pixmaps/" - cp "$(SOURCE_DIR)/Installer/debian/duplicati.png" "$(PACKAGE_DIR)/usr/share/pixmaps/" - - # If we edit files, we sometimes get backup files included - find "$(PACKAGE_DIR)" -type f -name \*\~ -exec rm -rf '{}' \; - - #Set permissions - #chown -R root:root "$(PACKAGE_DIR)" - chmod -R 755 "$(PACKAGE_DIR)" - - find "$(PACKAGE_DIR)" -type d -exec chmod 755 "{}" \; - find "$(PACKAGE_DIR)" -type f -exec chmod 644 "{}" \; - - for EXT in exe py sh; do \ - find "$(PACKAGE_DIR)" -type f -name \*.$(EXT) -exec chmod 755 "{}" \; ; \ - done - - chmod +x "$(PACKAGE_DIR)/usr/bin/duplicati" - chmod +x "$(PACKAGE_DIR)/usr/bin/duplicati-cli" - - if [ -e "duplicati.tar" ]; then \ - rm -rf "duplicati.tar"; \ - fi - if [ -e "duplicati.tar.gz" ]; then \ - rm -rf "duplicati.tar.gz"; \ - fi - - tar -C "$(PACKAGE_DIR)" -cf "duplicati.tar" . - gzip --best "duplicati.tar" - -clean: - (find "$(SOURCE_DIR)" -type d -name bin -exec rm -rf "{}" \; &> /dev/null) || echo "bin cleaned" - (find "$(SOURCE_DIR)" -type d -name obj -exec rm -rf "{}" \; &> /dev/null) || echo "obj cleaned" - rm -rf "$(PACKAGE_DIR)" - - -.PHONY: build all clean package debug diff --git a/Installer/Synology/INFO b/Installer/Synology/INFO deleted file mode 100755 index 1af1ba15a..000000000 --- a/Installer/Synology/INFO +++ /dev/null @@ -1,18 +0,0 @@ -package="Duplicati" -support_url="https://www.duplicati.com/" -displayname="Duplicati" -maintainer="The Duplicati Team" -maintainer_url="http://github.com/duplicati/duplicati" -distributor="The Duplicati Team" -distributor_url="https://www.duplicati.com/" -arch="noarch" -dsmuidir="webroot" -dsmappname="SYNO.BACKUP.DUPLICATI" -support_center="no" -install_dep_services="mono" -start_dep_services="mono" -thirdparty="yes" -support_conf_folder="yes" -description="Duplicati is a free, open source, backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers." -firmware="6.0-7300" -startstop_restart_services="nginx" diff --git a/Installer/Synology/LICENSE b/Installer/Synology/LICENSE deleted file mode 100644 index cd9008a6d..000000000 --- a/Installer/Synology/LICENSE +++ /dev/null @@ -1,491 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - - Copyright 2015, http://www.duplicati.com, info@duplicati.com diff --git a/Installer/Synology/PACKAGE_ICON.PNG b/Installer/Synology/PACKAGE_ICON.PNG deleted file mode 100644 index ea42debab0210f1546893c845531e0143d5735c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4481 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 RPYetU44$rjF6*2Ung9&soYw#V diff --git a/Installer/Synology/PACKAGE_ICON_120.PNG b/Installer/Synology/PACKAGE_ICON_120.PNG deleted file mode 100644 index 377d9c2736b0c0e72f9b309963f2c1144f339dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4940 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 bA9;t}awgZSI9eDO7#KWV{an^LB{Ts5B6?7j diff --git a/Installer/Synology/PACKAGE_ICON_256.PNG b/Installer/Synology/PACKAGE_ICON_256.PNG deleted file mode 100644 index 0605c4ed9fe407fac6a4bea4141c73eda0ef4b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7114 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 Xm#?!jI=%P*Mv!Tqu6{1-oD!M> "INFO" -MD5=$(md5 "package.tgz" | awk -F ' ' '{print $NF}') -echo "checksum=\"${MD5}\"" >> "INFO" -echo "extractsize=\"${DIRSIZE_KB}\"" >> "INFO" -echo "package_icon=\"${ICON_72}\"" >> "INFO" -echo "package_icon_256=\"${ICON_256}\"" >> "INFO" - -chmod +x scripts/* - -tar cf "${BASE_FILE_NAME}.spk" INFO LICENSE *.PNG package.tgz scripts conf WIZARD_UIFILES - -git checkout INFO -rm package.tgz - -if [ -f "${GPG_KEYFILE}" ]; then - if [ "z${KEYFILE_PASSWORD}" == "z" ]; then - echo -n "Enter keyfile password: " - read -s KEYFILE_PASSWORD - echo - fi - - GPGDATA=$("${MONO}" "../../BuildTools/AutoUpdateBuilder/bin/Debug/SharpAESCrypt.exe" d "${KEYFILE_PASSWORD}" "${GPG_KEYFILE}") - if [ ! $? -eq 0 ]; then - echo "Decrypting GPG keyfile failed" - exit 1 - fi - GPGID=$(echo "${GPGDATA}" | head -n 1) - GPGKEY=$(echo "${GPGDATA}" | head -n 2 | tail -n 1) -else - echo "No GPG keyfile found, skipping gpg signing" -fi - -if [ "z${GPGID}" != "z" ]; then - # Now codesign the spk file - mkdir "${TMPDIRNAME}" - tar xf "${BASE_FILE_NAME}.spk" -C "${TMPDIRNAME}" - cat $(find ${TMPDIRNAME} -type f | sort ${SORT_OPTIONS}) > "${BASE_FILE_NAME}.spk.tmp" - - gpg2 --ignore-time-conflict --ignore-valid-from --yes --batch --armor --detach-sign --default-key="${GPGID}" --output "${BASE_FILE_NAME}.signature" "${BASE_FILE_NAME}.spk.tmp" - rm "${BASE_FILE_NAME}.spk.tmp" - - curl --silent --form "file=@${BASE_FILE_NAME}.signature" "${TIMESERVER}" > "${TMPDIRNAME}/syno_signature.asc" - rm "${BASE_FILE_NAME}.signature" - - rm "${BASE_FILE_NAME}.spk" - tar cf "${BASE_FILE_NAME}.spk" -C "${TMPDIRNAME}" $(ls -1 ${TMPDIRNAME}) - - rm -rf "${TMPDIRNAME}" -fi diff --git a/Installer/Synology/scripts/postinst b/Installer/Synology/scripts/postinst deleted file mode 100755 index bda2ac6af..000000000 --- a/Installer/Synology/scripts/postinst +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -mkdir -p /usr/local/bin - -echo "mono ${SYNOPKG_PKGDEST}/Duplicati.CommandLine.exe $@" > "/usr/local/bin/duplicati-cli" -chmod +x "/usr/local/bin/duplicati-cli" - -echo "" >> "${SYNOPKG_PKGDEST}/webroot/nph-proxy.cgi" -echo "mono ${SYNOPKG_PKGDEST}/CGIProxyHandler.exe" >> "${SYNOPKG_PKGDEST}/webroot/nph-proxy.cgi" -chmod +x "${SYNOPKG_PKGDEST}/webroot/nph-proxy.cgi" - -exit 0 \ No newline at end of file diff --git a/Installer/Synology/scripts/postuninst b/Installer/Synology/scripts/postuninst deleted file mode 100755 index d21cac945..000000000 --- a/Installer/Synology/scripts/postuninst +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -rm "/usr/local/bin/duplicati-cli" -exit 0 \ No newline at end of file diff --git a/Installer/Synology/scripts/postupgrade.sh b/Installer/Synology/scripts/postupgrade.sh deleted file mode 100755 index 03538c00a..000000000 --- a/Installer/Synology/scripts/postupgrade.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exit 0 \ No newline at end of file diff --git a/Installer/Synology/scripts/preinst b/Installer/Synology/scripts/preinst deleted file mode 100755 index 03538c00a..000000000 --- a/Installer/Synology/scripts/preinst +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exit 0 \ No newline at end of file diff --git a/Installer/Synology/scripts/preuninst b/Installer/Synology/scripts/preuninst deleted file mode 100755 index 03538c00a..000000000 --- a/Installer/Synology/scripts/preuninst +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exit 0 \ No newline at end of file diff --git a/Installer/Synology/scripts/preupgrade.sh b/Installer/Synology/scripts/preupgrade.sh deleted file mode 100755 index 03538c00a..000000000 --- a/Installer/Synology/scripts/preupgrade.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exit 0 \ No newline at end of file diff --git a/Installer/Synology/scripts/start-stop-status b/Installer/Synology/scripts/start-stop-status deleted file mode 100755 index c22c29b57..000000000 --- a/Installer/Synology/scripts/start-stop-status +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/sh -source /root/.profile # Get Environment Variables from Root Profile - -if ! type mono 2>/dev/null; then - for d in /volume*/@appstore/mono; do - if [ -x "$d/bin/mono" ]; then - PATH="$PATH:$d/bin" - export PATH - break - fi - done -fi - -# Package Varables -PACKAGE_NAME_SIMPLE="$(echo "$SYNOPKG_PKGNAME" | awk '{print tolower($0)}' | sed -e 's/ /_/g')" -PACKAGE_DIR="${SYNOPKG_PKGDEST}" -PACKAGE_UPGRADE_FLAG="/tmp/${PACKAGE_NAME_SIMPLE}.upgrade" - -# We need more space than what /tmp holds -PACKAGE_TEMP_DIR="${PACKAGE_DIR}/temp" - -# These control how the authentication is integrated -SYNO_LOGIN_CGI=/usr/syno/synoman/webman/login.cgi -SYNO_AUTHENTICATE_CGI=/usr/syno/synoman/webman/modules/authenticate.cgi - -# If all users should have access, set to "1" -SYNO_ALL_USERS=0 - -# If we should disable verification of Synology's XSRF tokens, set to "1" -SYNO_SKIP_XSRF=0 - -# If we should disable Synology auth completely, set to "0" -SYNO_DSM_AUTH=1 - - -# Start & Stop Varables -PID_FILE="/var/run/${PACKAGE_NAME_SIMPLE}.pid" - -DaemonStart() { - DaemonStatus - if [ $? == 0 ]; then - echo "Starting ${PACKAGE_NAME_SIMPLE}." - - mkdir -p "${PACKAGE_TEMP_DIR}" - - SYNO_DSM_AUTH=${SYNO_DSM_AUTH} \ - SYNO_SKIP_XSRF=${SYNO_SKIP_XSRF} \ - SYNO_ALL_USERS=${SYNO_ALL_USERS} \ - SYNO_AUTHENTICATE_CGI="${SYNO_AUTHENTICATE_CGI}" \ - SYNO_LOGIN_CGI="${SYNO_LOGIN_CGI}" \ - TMP_DIR="${PACKAGE_TEMP_DIR}" \ - TEMP="${PACKAGE_TEMP_DIR}" \ - mono "${PACKAGE_DIR}/Duplicati.Server.exe" & - echo $! > "$PID_FILE" - - cp -f ${PACKAGE_DIR}/dsm.duplicati.conf /usr/local/etc/nginx/conf.d/ - - else - echo "${PACKAGE_NAME_SIMPLE} already running." - fi -} - -DaemonDebug() { - DaemonStatus -} - -DaemonStop() { - DaemonStatus - if [ $? == 1 ]; then - echo "Stopping ${PACKAGE_NAME_SIMPLE}." - pkill -P $(cat "$PID_FILE") - rm -f "$PID_FILE" - - rm -f /usr/local/etc/nginx/conf.d/dsm.duplicati.conf - - sleep 3 - else - echo "Nothing to stop for ${PACKAGE_NAME_SIMPLE}." - fi -} - -DaemonStatus() { - if [ -f "$PID_FILE" ]; then - PID=$(cat "$PID_FILE") - - if [ -n "$(ps | grep $PID | grep -vn "grep $PID")" ]; then - echo "${PACKAGE_NAME_SIMPLE} is running ..." - return 1 # is running - else - echo "${PACKAGE_NAME_SIMPLE} is NOT running ..." - rm -f ${PID_FILE} # Remove Invalid PID - return 0 # is NOT running - fi - else - echo "${PACKAGE_NAME_SIMPLE} is NOT running ...." - return 0 # is NOT running - fi -} - -case $1 in - start) - DaemonStart - sleep 1 - DaemonStatus - exit $(( ! $? )) # [ $? == 1 ] && exit 0 || exit 1 # this if statement flips the boolean outcome. - ;; - stop) - DaemonStop - sleep 1 - DaemonStatus - exit $? - ;; - restart) - DaemonStop - sleep 10 - DaemonStart - sleep 1 - DaemonStatus - exit $(( ! $? )) # this if statement flips the boolean outcome. - ;; - status) - DaemonStatus - exit $(( ! $? )) # this if statement flips the boolean outcome. - ;; - debug) - DaemonDebug - exit 0 - ;; - log-show) - exit 0 - ;; - log-clear) - exit 0 - ;; - log) - exit 0 - ;; - *) - echo "Usage: $0 {start|stop|restart|status|debug|log|log-show|log-clear}" - exit 1 - ;; -esac diff --git a/Installer/Synology/web-extra/config b/Installer/Synology/web-extra/config deleted file mode 100644 index 8aadc00c2..000000000 --- a/Installer/Synology/web-extra/config +++ /dev/null @@ -1,12 +0,0 @@ -{ - ".url": { - "com.duplicati.App": { - "type": "legacy", - "allUsers": false, - "title": "Duplicati", - "desc": "Use Duplicati to backup your data to cloud services", - "icon": "synoimg/app_{0}.png", - "url": "webman/3rdparty/Duplicati/index.html" - } - } -} \ No newline at end of file diff --git a/Installer/Synology/web-extra/package/ngax/package.js b/Installer/Synology/web-extra/package/ngax/package.js deleted file mode 100644 index 027f067e7..000000000 --- a/Installer/Synology/web-extra/package/ngax/package.js +++ /dev/null @@ -1,49 +0,0 @@ -backupApp.service('ProxyService', function(AppService, $http) { - var origconfig = AppService.proxy_config; - var synotoken = null; - var is_grabbing = false; - - try - { - if (synotoken == null) - synotoken = SYNO.SDS.Session.SynoToken; - } - catch (e) {} - - try - { - if (synotoken == null) - synotoken = window.parent.SYNO.SDS.Session.SynoToken; - } - catch (e) {} - - function grab_syno_token() { - if (synotoken != null || is_grabbing) - return; - - is_grabbing = true; - $http.get('/webman/login.cgi?_dc=' + Math.random()).then( - function(data) { - is_grabbing = false; - synotoken = data.data.SynoToken; - }, - - function() { - is_grabbing = false; - } - ); - }; - - AppService.proxy_config = function(method, options, data, targeturl) { - grab_syno_token(); - - if (synotoken != null) - options.headers['X-Syno-Token'] = synotoken; - - if (origconfig != null) - origconfig(method, options, data, targeturl); - }; - - grab_syno_token(); - -}); \ No newline at end of file diff --git a/Installer/Synology/web-extra/synoimg/app_128.png b/Installer/Synology/web-extra/synoimg/app_128.png deleted file mode 100644 index 01bc68497d2149c326398a7152ba9d4ab8d786ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1401 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4mJh`hQoG=rx_Sn9XwqeLn;{G&ShSs8!qCI z|8{{{lhK;o+daXzk8OXuJnH_ow-0WcT~046e}2TX_ zw>l|AYh8JNHF@&3AIn!8tHd9;b0mh><%w45>L=1S7RAkMF|J>Hgi~iZ^g%l%jrx%&74+3snsi&O4i zvlW^c^;Kv-(+h33ue`mVV(&jJ`sf`0=l?;6@|=C|&4Z-AM7Sn2`2Rl~o~irKJ6>$_ z3BlT*s~>3yhOAKkEpVVaX+gRj_w0rCU*t6fEAF*3bgiwnoBsFA-X{1$+pc1Gdx_jo`c4v@dNjUqKTa$sw;MuoUDF#M~;@?dC z4GcXyYag;ZFdVzH?*p>}Lv~*L4@Ln8?$ASA47x`1Zf`Gq?)cKGV4cnNqy=|=#dXGf zuKGV`O@79tk{1`4#f-eySG=+|TyZubFMe{#pX_Zh-=8sTFZlVXz_oXYbGy=}8HRm5 zofg~Id)|9xcS|>7U+m7x^-G-9lQzwWytOQ)N8(Js(f0Fmf9{IdXi;*_%k%iIwKw~E zlXLF0wkzRG(S=d*1Jd?=6@M_~z`35z%HccL~zZ)hU{Fdf&XC zf$i?!yG^$HpTBT}dB^+9^Ovq#7MF9!xN&yJO8*^aL_)qw>`1=2t740^sPx3BuS((# z5-*rUk1Pu8UYg)=ddj0v2J=0kD&E)MO}Wu{^VP6zB)Ff~VQo%-tC z&pNh*A2+V=KYd}Q_R>|`;*^+0v+TdGN`L6h(DrWmbNz1hlLEboKbP$-+OX$VtgOSU zD|=rtZQcKCPF2t;wIT+`?2orj^tNvKU|q@4z(4>kNZ4mywpro|n+yZvmKob(dA@;I zJaL5%JkQvr7#Q~$W=(#xZiRUBzeY9(2Ijjr^FQS@FbX()uiU+4OFRw_tq39bQ=?7g_2Z%;Wh0|Ud4BlSHIj??0c R`K3Umpr@;!%Q~loCIHNog988n diff --git a/Installer/Synology/web-extra/synoimg/app_16.png b/Installer/Synology/web-extra/synoimg/app_16.png deleted file mode 100644 index 9dd644e77e91597f33ea379ebeccba46ec16e85b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 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 diff --git a/Installer/Synology/web-extra/synoimg/app_32.png b/Installer/Synology/web-extra/synoimg/app_32.png deleted file mode 100644 index 15cf40684dfbcddef24ac125c7e1c27bc0000479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNf8lEnWAr*{or>X|9CknX# z->a^oSbHIEgIgPytwJZ8?WDr(9lLk$R=X3sPu|+RyEyN}_q4b@cgy7_NH98ZL^{tq ztY)*gug73d3`ZeP`@@+B-I%f*w)E>L>FLTZ?7UePl2&p-XPK9MgTA$X`H>%Am<*Qx zV&sv3GlS<3{{%)O2euOofA`Nl&G@U{`a5%$!GmLV({-f;1vz|49 z(}aI9S{a?lhzbvWJ-6K6f$hn*oMy|fW)0KNzm08N8OUuB{Fm>=j7iZ+uciibuVB7t zzk4l@$>u%vdB?A4FBcQgY_Zt%*Ks3rL&B!6?z8m)b;jp2mp)x;FP}S?fq{X+)78&q Iol`;+0Ct6wS^xk5 diff --git a/Installer/Synology/web-extra/synoimg/app_48.png b/Installer/Synology/web-extra/synoimg/app_48.png deleted file mode 100644 index 5184f62c69bee445da207dc5be60d284c28fb097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?Fixf#C9nIx(p;|Q{6qcYlLW;U za9!ZHVA-Qwd5@93ai7D}6-TeL_)U~mZ;%RH_eXQn^NJPLj9-p_c>3C0P5-9nVm{#& zu~s@4Pgtty-|d_ed{MpUKq60(gJs36nVWLNyP6YO?j>d1sB?P7ROEN`_5-G_knZq{ z5scaitZN!XH!y`A;EG_>p0L;9gJ0D=mZtJc#VQM|U$Tl`nEU1ZnL8B|Ha%ROaijKM z{O5m{#d%g4&ySNTpV9GX>$@e!*^d=9FPWz2+Z$ zOIZ2dmRapE{pIY=1Fj2J$u~}wICsCs=j4IZjUw?z8IsTQZ53JU8%p0D)o%Fp%dqO( zFWcGQVkRsreR1Mnk<8KZ1Wtpis>zLd&t~$oT{u5O{UHC6o3l+Ev>(WQEE3O{`R!Aq oQG$ShY0jB{ODp_cqU)Gkr$2H%71ce3fq{X+)78&qol`;+0Dkce00000 diff --git a/Installer/Synology/web-extra/synoimg/app_64.png b/Installer/Synology/web-extra/synoimg/app_64.png deleted file mode 100644 index a1f02a530cc296d2664b22ad149847d91c77c0a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEw>%mmkML)4}aMSEHaG0c1rG1FA&O5-m!)8c%xiiOTBAFMP?{d!K4p`XPz0}Z)nBfWyI$b>vQ_cH3Lg7{cY61mPaFPUxnT|0!9;1M zNreg9Y7&~dBa0r0HMvMLWfdrt|5otbf74pv$_;@BDg_IldL%_Pa0M`GIk2u^5M96& zg255nwf6$ohO2K|gBsp^OA0*T*)T)o!|J^CI~MizK94gfd#c)|Z}a>3%KV&zp7$fI z4~6zHxTpT;%wE^AVE_Cte~M&gC>d>F^2t^Am~waC%}+{C=0E?ox?;|f=Ti+b;tWn- zJoCqhr9EZ)_v?4#&h3f)o{|6lKxby6ub^bh;e&tJH$P3SSRndB*fGJ$)w=w?ihxs} z3y&E~Ph8Qwa?PDB9pVoB)=V-&@AmjDSi5&F!(}d+pJMmsF%xzL?*$8w%_8FSwY`5AXy=P5_Y%vXhhDwD3m z((}>3AG}_(;kxL|TUPAx`nI#vWUCxARK&DjZ++fvmAhus`_P%(!g{ug^u+`yz5Zf%Z^UC>k z@r8|-jJbWZV;3A~USAsx<{fn~4B!!A22s<*!4#B-K_!;kboWUtFSshpk-b37$xvY1 z@q(5lg*8nJ|Aq2|a69Gh;{SB4eC^&prQQEy^`-|;mA6ecZ`>%Xw)?|H{hYFA!L0c& zR($+a`@uQ1rgC9?Q#$J*i`F%f&;K1-zkf~njozvMzD}1HD&fixYh~g5{$Tgl)_p5( zAJh6BJNKu>OUc^M{kkoBegm7fUZuhBUeZS;O zj;{6B#tR%evp8%%M_z7P+*18u?yprRSUp!QX*9Ectr>6jY7y6-SxdZxH13F{+rRC7 zAH6!^d-AqP>|Eu)YUQ)C5>qGNR}G_335V_4aDisT7fIK3$F0EOP%>1op;Mv-Qg?=ed>ec1c8p^yMcfpH}?c zeXVTYkE1h%p1)zYzncC*L)ApKv@px_pDW{ehm2EKURr&VTUFS;FE#R4+pYT8Y_*3L zZ`OTy+x2xrLXg)CcHdNYzT;| diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh new file mode 100644 index 000000000..a7a782c7b --- /dev/null +++ b/Installer/debian/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash +#This is a helper to make the release linux zip. Mainly for testing outside of ci/cd + +SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) + +docker build $SCRIPTDIR/docker -t duplicati-debian + +export VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>/\1/'` +echo Building version: $VERSION + +export MSYS_NO_PATHCONV=1 +docker run --rm -eVERSION=$VERSION -v $SCRIPTDIR/../../:/sources duplicati-debian \ No newline at end of file diff --git a/Installer/debian/debian/docs b/Installer/debian/debian/docs deleted file mode 100644 index 18b71a363..000000000 --- a/Installer/debian/debian/docs +++ /dev/null @@ -1,2 +0,0 @@ -changelog.txt -releasenotes.txt diff --git a/Installer/debian/debian/rules b/Installer/debian/debian/rules deleted file mode 100755 index d2b5e2037..000000000 --- a/Installer/debian/debian/rules +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- -# Sample debian/rules that uses debhelper. -# -# This file was originally written by Joey Hess and Craig Small. -# As a special exception, when this file is copied by dh-make into a -# dh-make output file, you may use that output file without restriction. -# This special exception was added by Craig Small in version 0.37 of dh-make. -# -# Modified to make a template file for a multi-binary package with separated -# build-arch and build-indep targets by Bill Allombert 2001 - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# This has to be exported to make some magic below work. -export DH_OPTIONS -VERSION := $(shell cat ./version) - - -%: - dh $@ - -override_dh_clean: - dh_clean - xbuild /property:Configuration=Release /target:Clean Duplicati.sln - xbuild /property:Configuration=Release /target:Clean BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj - find -type d -name bin | xargs rm -rf - find -type d -name obj | xargs rm -rf - find -maxdepth 1 -type d -name build | xargs rm -rf - -override_dh_auto_build: - nuget restore Duplicati.sln - - xbuild /property:Configuration=Release BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj - mono BuildTools/UpdateVersionStamp/bin/Release/UpdateVersionStamp.exe --version=$(VERSION) - - xbuild /property:Configuration=Release Duplicati.sln - -override_dh_auto_install: - mkdir build - mkdir build/bin - mkdir build/lib - mkdir build/lib/duplicati - mkdir build/lib/duplicati/SQLite - mkdir build/share - mkdir build/share/applications - mkdir build/share/pixmaps - cp Installer/debian/duplicati-launcher.sh build/bin/duplicati - cp Installer/debian/duplicati-commandline-launcher.sh build/bin/duplicati-cli - cp Installer/debian/duplicati-server-launcher.sh build/bin/duplicati-server - cp Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.dll build/lib/duplicati/ - cp Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.exe build/lib/duplicati/ - cp Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.exe.config build/lib/duplicati/ - cp -r Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/SQLite/pinvoke build/lib/duplicati/SQLite/ - cp Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/default_compressed_extensions.txt build/lib/duplicati/ - cp Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/acknowledgements.txt build/lib/duplicati/ - cp Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/changelog.txt build/lib/duplicati/ - cp Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/run-script-example.sh build/lib/duplicati/ - cp Tools/Verification/DuplicatiVerify.py build/lib/duplicati/ - cp -r Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/ build/lib/duplicati/ - cp -r Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/licenses build/lib/duplicati/ - cp -r Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/lvm-scripts build/lib/duplicati/lvm-scripts - cp -r Duplicati/Server/webroot build/lib/duplicati/ - if [ -f "oem-app-name.txt" ]; then cp "oem-app-name.txt" build/lib/duplicati; fi - if [ -f "oem-update-url.txt" ]; then cp "oem-update-url.txt" build/lib/duplicati; fi - if [ -f "oem-update-key.txt" ]; then cp "oem-update-key.txt" build/lib/duplicati; fi - if [ -f "oem-update-readme.txt" ]; then cp "oem-update-readme.txt" build/lib/duplicati; fi - if [ -f "oem-update-installid.txt" ]; then cp "oem-update-installid.txt" build/lib/duplicati; fi - cp Installer/debian/duplicati.desktop build/share/applications - cp Installer/debian/duplicati.xpm build/share/pixmaps - cp Installer/debian/duplicati.png build/share/pixmaps - cp Installer/debian/duplicati.svg build/share/pixmaps - rm -rf build/lib/duplicati/win-tools - rm -rf build/lib/duplicati/SQLite/win64 - rm -rf build/lib/duplicati/SQLite/win32 - rm -rf build/lib/duplicati/MonoMac.dll - rm -rf build/lib/duplicati/OSX\ Icons - rm -rf build/lib/duplicati/OSXTrayHost - rm -rf build/lib/duplicati/licenses/MonoMac - rm -rf build/lib/duplicati/licenses/gpg - find build/lib/duplicati/* -type f | xargs chmod 644 - find build/lib/duplicati/* -type d | xargs chmod 755 - find build/lib/duplicati/* -type f -name \*.exe | xargs chmod 755 - find build/lib/duplicati/* -type f -name \*.sh | xargs chmod 755 - find build/lib/duplicati/* -type f -name \*.py | xargs chmod 755 - dh_install - -#override_dh_auto_install: -# rm -rf Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.mdb -# mkdir ${DESTDIR}/usr/lib/duplicati/ -# cp -R Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/* ${DESTDIR}/usr/lib/duplicati/ -# cp -R Duplicati/Server/webroot ${DESTDIR}/usr/lib/duplicati/ - -override_dh_systemd_enable: - dh_systemd_enable --no-enable diff --git a/Installer/debian/docker/Dockerfile b/Installer/debian/docker/Dockerfile new file mode 100644 index 000000000..4ed3afd41 --- /dev/null +++ b/Installer/debian/docker/Dockerfile @@ -0,0 +1,24 @@ +FROM ubuntu:latest + +ENV DEBIAN_FRONTEND noninteractive + +# Install common build tools +RUN set -uex; \ + apt-get update; \ + apt-get install --no-install-suggests --no-install-recommends -y \ + build-essential \ + debhelper \ + dpkg-dev \ + ; \ + apt-get clean all +RUN apt-get update && apt-get install -y curl +RUN curl -sL -o ~/packages-microsoft-prod.deb https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb +RUN dpkg -i ~/packages-microsoft-prod.deb +RUN apt-get update && apt-get install -y dotnet-sdk-5.0 + +ADD debian /deb/debian +RUN chmod -x /deb/debian/duplicati.install +RUN chmod -x /deb/debian/docs + +ADD runner.sh / +CMD /runner.sh \ No newline at end of file diff --git a/Installer/debian/debian/changelog b/Installer/debian/docker/debian/changelog similarity index 100% rename from Installer/debian/debian/changelog rename to Installer/debian/docker/debian/changelog diff --git a/Installer/debian/debian/compat b/Installer/debian/docker/debian/compat similarity index 100% rename from Installer/debian/debian/compat rename to Installer/debian/docker/debian/compat diff --git a/Installer/debian/debian/control b/Installer/debian/docker/debian/control similarity index 52% rename from Installer/debian/debian/control rename to Installer/debian/docker/debian/control index 79c2c6b0a..fc2efc922 100644 --- a/Installer/debian/debian/control +++ b/Installer/debian/docker/debian/control @@ -2,14 +2,14 @@ Source: duplicati Section: utils Priority: extra Maintainer: Kenneth Skovhede -Build-Depends: debhelper (>= 8.0.0) +Build-Depends: debhelper (>= 8.0.0), dotnet-sdk-5.0 Standards-Version: 3.9.4 Homepage: http://www.duplicati.com Vcs-Git: https://github.com/duplicati/duplicati.git Package: duplicati Architecture: all -Depends: mono-runtime (>= 5.10.0), ca-certificates-mono, libmono-2.0-1, libmono-system-core4.0-cil, libmono-system-configuration4.0-cil, libmono-system-configuration-install4.0-cil, libmono-system-data4.0-cil, libmono-system-drawing4.0-cil, libmono-system-net4.0-cil, libmono-system-net-http4.0-cil, libmono-system-net-http-webrequest4.0-cil, libmono-system-numerics4.0-cil, libmono-system-runtime-serialization4.0-cil, libmono-system-servicemodel4.0a-cil, libmono-system-servicemodel-discovery4.0-cil, libmono-system-serviceprocess4.0-cil, libmono-system-transactions4.0-cil, libmono-system-web4.0-cil, libmono-system-web-services4.0-cil, libmono-system-xml4.0-cil, libmono-microsoft-csharp4.0-cil, libsqlite3-0 (>= 3.6.12), libappindicator0.1-cil | libappindicator3-0.1-cil, gtk-sharp2 +Depends: Description: Backup client for encrypted online backups Duplicati is a free backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers. It diff --git a/Installer/debian/debian/copyright b/Installer/debian/docker/debian/copyright similarity index 100% rename from Installer/debian/debian/copyright rename to Installer/debian/docker/debian/copyright diff --git a/Installer/debian/docker/debian/docs b/Installer/debian/docker/debian/docs new file mode 100644 index 000000000..68905cd33 --- /dev/null +++ b/Installer/debian/docker/debian/docs @@ -0,0 +1 @@ +changelog.txt diff --git a/Installer/debian/debian/duplicati.default b/Installer/debian/docker/debian/duplicati.default similarity index 100% rename from Installer/debian/debian/duplicati.default rename to Installer/debian/docker/debian/duplicati.default diff --git a/Installer/debian/debian/duplicati.install b/Installer/debian/docker/debian/duplicati.install similarity index 100% rename from Installer/debian/debian/duplicati.install rename to Installer/debian/docker/debian/duplicati.install diff --git a/Installer/debian/debian/duplicati.service b/Installer/debian/docker/debian/duplicati.service similarity index 100% rename from Installer/debian/debian/duplicati.service rename to Installer/debian/docker/debian/duplicati.service diff --git a/Installer/debian/docker/debian/make.sh b/Installer/debian/docker/debian/make.sh new file mode 100644 index 000000000..be0f97563 --- /dev/null +++ b/Installer/debian/docker/debian/make.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make --debug=b -f $@ \ No newline at end of file diff --git a/Installer/debian/debian/patches/series b/Installer/debian/docker/debian/patches/series similarity index 100% rename from Installer/debian/debian/patches/series rename to Installer/debian/docker/debian/patches/series diff --git a/Installer/debian/docker/debian/rules b/Installer/debian/docker/debian/rules new file mode 100644 index 000000000..1fa806239 --- /dev/null +++ b/Installer/debian/docker/debian/rules @@ -0,0 +1,57 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. +# +# Modified to make a template file for a multi-binary package with separated +# build-arch and build-indep targets by Bill Allombert 2001 + +# Uncomment this to turn on verbose mode. +export DH_VERBOSE=1 +VERBOSE := 1 +# This has to be exported to make some magic below work. +export DH_OPTIONS +export VERSION + +%: + dh $@ + +override_dh_clean: + dh_clean + #dotnet clean does stupid things with nuget, so just delete the folders + find /sources -type d -name bin | xargs rm -rf + find /sources -type d -name obj | xargs rm -rf + +override_dh_auto_build: + dotnet publish -c Release -o build/lib/duplicati/ /sources/Duplicati.sln + +override_dh_auto_install: + mkdir build/bin + mkdir build/share + mkdir build/share/applications + mkdir build/share/pixmaps + cp /sources/Installer/debian/duplicati-launcher.sh build/bin/duplicati + cp /sources/Installer/debian/duplicati-commandline-launcher.sh build/bin/duplicati-cli + cp /sources/Installer/debian/duplicati-server-launcher.sh build/bin/duplicati-server + cp /sources/Tools/Verification/DuplicatiVerify.py build/lib/duplicati/ + cp /sources/Installer/debian/duplicati.desktop build/share/applications + cp /sources/Installer/debian/duplicati.xpm build/share/pixmaps + cp /sources/Installer/debian/duplicati.png build/share/pixmaps + cp /sources/Installer/debian/duplicati.svg build/share/pixmaps + rm -rf build/lib/duplicati/win-tools + rm -rf build/lib/duplicati/OSX\ Icons + rm -rf build/lib/duplicati/OSXTrayHost + rm -rf build/lib/duplicati/licenses/MonoMac + rm -rf build/lib/duplicati/licenses/gpg + find build/lib/duplicati/* -type f | xargs chmod 644 + find build/lib/duplicati/* -type d | xargs chmod 755 + find build/lib/duplicati/* -type f -name \*.sh | xargs chmod 755 + find build/lib/duplicati/* -type f -name \*.py | xargs chmod 755 + dh_install + +override_dh_systemd_enable: + dh_systemd_enable --no-enable diff --git a/Installer/debian/docker/runner.sh b/Installer/debian/docker/runner.sh new file mode 100644 index 000000000..2a677a352 --- /dev/null +++ b/Installer/debian/docker/runner.sh @@ -0,0 +1,10 @@ +cd /deb + +DATE_STAMP=$(LANG=C date -R) +sed -e "s;%VERSION%;$VERSION;g" -e "s;%DATE%;$DATE_STAMP;g" -i "debian/changelog" + +cp /sources/changelog.txt ./ + +dpkg-buildpackage -b --no-sign + +cp /*.deb /sources/ \ No newline at end of file diff --git a/Installer/fedora/duplicati-binary.spec b/Installer/fedora/duplicati-binary.spec index 9b4dc58cb..c8638aa40 100644 --- a/Installer/fedora/duplicati-binary.spec +++ b/Installer/fedora/duplicati-binary.spec @@ -38,34 +38,11 @@ Source4: %{namer}.default BuildRequires: desktop-file-utils BuildRequires: dos2unix BuildRequires: systemd +BuildRequires: dotnet Requires: desktop-file-utils Requires: bash -Requires: sqlite >= 3.6.12 -Requires: mono(appindicator-sharp) Requires: libappindicator -Requires: mono-core >= 3.0 -Requires: mono-data-sqlite -Requires: mono(System) -Requires: mono(System.Configuration) -Requires: mono(System.Configuration.Install) -Requires: mono(System.Core) -Requires: mono(System.Data) -Requires: mono(System.Drawing) -Requires: mono(System.Net) -Requires: mono(System.Net.Http) -Requires: mono(System.Net.Http.WebRequest) -Requires: mono(System.Runtime.Serialization) -Requires: mono(System.ServiceModel) -Requires: mono(System.ServiceModel.Discovery) -Requires: mono(System.ServiceProcess) -Requires: mono(System.Transactions) -Requires: mono(System.Web) -Requires: mono(System.Web.Services) -Requires: mono(System.Xml) -Requires: mono(System.Xml.Linq) -Requires: mono(Mono.Security) -Requires: mono(Mono.Posix) Provides: duplicati Provides: duplicati-cli @@ -105,9 +82,6 @@ rm -rf libstorj_uplink.dylib %install -# Mono binaries are installed in /usr/lib, not /usr/lib64, even on x86_64: -# https://fedoraproject.org/wiki/Packaging:Mono - install -d %{buildroot}%{_datadir}/pixmaps/ install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/ install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/SVGIcons/ diff --git a/pipeline/linuxZip/build.sh b/pipeline/linuxZip/build.sh new file mode 100644 index 000000000..6dccde114 --- /dev/null +++ b/pipeline/linuxZip/build.sh @@ -0,0 +1,9 @@ +#!/bin/bash +#This is a helper to make the release linux zip. Mainly for testing outside of ci/cd + +SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) + +docker build $SCRIPTDIR/docker -t duplicati-build + +export MSYS_NO_PATHCONV=1 +docker run --rm -v $SCRIPTDIR/../../:/sources duplicati-build \ No newline at end of file diff --git a/pipeline/linuxZip/docker/Dockerfile b/pipeline/linuxZip/docker/Dockerfile new file mode 100644 index 000000000..fd46d58e3 --- /dev/null +++ b/pipeline/linuxZip/docker/Dockerfile @@ -0,0 +1,11 @@ +FROM ubuntu + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y curl zip +RUN curl -sL -o ~/packages-microsoft-prod.deb https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb +RUN dpkg -i ~/packages-microsoft-prod.deb +RUN apt-get update && apt-get install -y dotnet-sdk-5.0 + +ADD runner.sh / +CMD /runner.sh \ No newline at end of file diff --git a/pipeline/linuxZip/docker/runner.sh b/pipeline/linuxZip/docker/runner.sh new file mode 100644 index 000000000..d4e601f46 --- /dev/null +++ b/pipeline/linuxZip/docker/runner.sh @@ -0,0 +1,5 @@ +mkdir /published/ +chmod +S /published/ +dotnet publish -c Release --runtime=linux-x64 -o /published/ /sources/Duplicati.sln + +zip /sources/linux-release.zip /published/ \ No newline at end of file diff --git a/pipeline/selenium/docker/Dockerfile b/pipeline/selenium/docker/Dockerfile index a565835aa..0f2f6780d 100644 --- a/pipeline/selenium/docker/Dockerfile +++ b/pipeline/selenium/docker/Dockerfile @@ -3,7 +3,7 @@ FROM selenium/standalone-firefox ENV DEBIAN_FRONTEND=noninteractive RUN wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O ~/packages-microsoft-prod.deb RUN sudo dpkg -i ~/packages-microsoft-prod.deb -RUN sudo apt-get update && sudo apt-get install -y python3-pip rsync dotnet-sdk-5.0 +RUN sudo apt-get update && sudo apt-get install -y python3-pip dotnet-sdk-5.0 RUN pip3 install selenium ADD runner.sh / From 5e8db0cead65f9721d631fb86c4eff61599e1b0e Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 16 Jan 2021 16:19:46 -0800 Subject: [PATCH 121/253] Fix execute bit --- .gitattributes | 3 +++ Duplicati/CommandLine/Checkout DSMCBE Data.sh | 0 Duplicati/Library/Modules/Builtin/run-script-example.sh | 0 Duplicati/Library/Snapshots/lvm-scripts/create-lvm-snapshot.sh | 0 Duplicati/Library/Snapshots/lvm-scripts/find-volume.sh | 0 Duplicati/Library/Snapshots/lvm-scripts/remove-lvm-snapshot.sh | 0 Installer/OSX/make-dmg.sh | 0 Installer/OSX/uninstall.sh | 0 Installer/debian/bin-rules.sh | 0 Installer/debian/build.sh | 0 Installer/debian/docker-build-binary.sh | 0 Installer/debian/docker/debian/make.sh | 0 Installer/debian/docker/runner.sh | 0 Installer/debian/duplicati-server-launcher.sh | 0 Installer/debian/init-script-example.sh | 0 Installer/debian/make-binary-package.sh | 0 Installer/fedora/build-package.sh | 0 Installer/fedora/docker-build-binary.sh | 0 Installer/fedora/docker-build-package.sh | 0 Installer/fedora/duplicati-install-recursive.sh | 0 Installer/fedora/duplicati-make-git-snapshot.sh | 0 Installer/fedora/make-binary-package.sh | 0 build-release.sh | 0 pipeline/linuxZip/build.sh | 0 pipeline/linuxZip/docker/runner.sh | 0 tabs-to-spaces.sh | 0 26 files changed, 3 insertions(+) create mode 100644 .gitattributes mode change 100644 => 100755 Duplicati/CommandLine/Checkout DSMCBE Data.sh mode change 100644 => 100755 Duplicati/Library/Modules/Builtin/run-script-example.sh mode change 100644 => 100755 Duplicati/Library/Snapshots/lvm-scripts/create-lvm-snapshot.sh mode change 100644 => 100755 Duplicati/Library/Snapshots/lvm-scripts/find-volume.sh mode change 100644 => 100755 Duplicati/Library/Snapshots/lvm-scripts/remove-lvm-snapshot.sh mode change 100644 => 100755 Installer/OSX/make-dmg.sh mode change 100644 => 100755 Installer/OSX/uninstall.sh mode change 100644 => 100755 Installer/debian/bin-rules.sh mode change 100644 => 100755 Installer/debian/build.sh mode change 100644 => 100755 Installer/debian/docker-build-binary.sh mode change 100644 => 100755 Installer/debian/docker/debian/make.sh mode change 100644 => 100755 Installer/debian/docker/runner.sh mode change 100644 => 100755 Installer/debian/duplicati-server-launcher.sh mode change 100644 => 100755 Installer/debian/init-script-example.sh mode change 100644 => 100755 Installer/debian/make-binary-package.sh mode change 100644 => 100755 Installer/fedora/build-package.sh mode change 100644 => 100755 Installer/fedora/docker-build-binary.sh mode change 100644 => 100755 Installer/fedora/docker-build-package.sh mode change 100644 => 100755 Installer/fedora/duplicati-install-recursive.sh mode change 100644 => 100755 Installer/fedora/duplicati-make-git-snapshot.sh mode change 100644 => 100755 Installer/fedora/make-binary-package.sh mode change 100644 => 100755 build-release.sh mode change 100644 => 100755 pipeline/linuxZip/build.sh mode change 100644 => 100755 pipeline/linuxZip/docker/runner.sh mode change 100644 => 100755 tabs-to-spaces.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..55e883fc9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.sh text eol=lf +#The #! won't work if CRLF +/Installer/debian/docker/debian/rules text eol=lf \ No newline at end of file diff --git a/Duplicati/CommandLine/Checkout DSMCBE Data.sh b/Duplicati/CommandLine/Checkout DSMCBE Data.sh old mode 100644 new mode 100755 diff --git a/Duplicati/Library/Modules/Builtin/run-script-example.sh b/Duplicati/Library/Modules/Builtin/run-script-example.sh old mode 100644 new mode 100755 diff --git a/Duplicati/Library/Snapshots/lvm-scripts/create-lvm-snapshot.sh b/Duplicati/Library/Snapshots/lvm-scripts/create-lvm-snapshot.sh old mode 100644 new mode 100755 diff --git a/Duplicati/Library/Snapshots/lvm-scripts/find-volume.sh b/Duplicati/Library/Snapshots/lvm-scripts/find-volume.sh old mode 100644 new mode 100755 diff --git a/Duplicati/Library/Snapshots/lvm-scripts/remove-lvm-snapshot.sh b/Duplicati/Library/Snapshots/lvm-scripts/remove-lvm-snapshot.sh old mode 100644 new mode 100755 diff --git a/Installer/OSX/make-dmg.sh b/Installer/OSX/make-dmg.sh old mode 100644 new mode 100755 diff --git a/Installer/OSX/uninstall.sh b/Installer/OSX/uninstall.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/bin-rules.sh b/Installer/debian/bin-rules.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/docker-build-binary.sh b/Installer/debian/docker-build-binary.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/docker/debian/make.sh b/Installer/debian/docker/debian/make.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/docker/runner.sh b/Installer/debian/docker/runner.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/duplicati-server-launcher.sh b/Installer/debian/duplicati-server-launcher.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/init-script-example.sh b/Installer/debian/init-script-example.sh old mode 100644 new mode 100755 diff --git a/Installer/debian/make-binary-package.sh b/Installer/debian/make-binary-package.sh old mode 100644 new mode 100755 diff --git a/Installer/fedora/build-package.sh b/Installer/fedora/build-package.sh old mode 100644 new mode 100755 diff --git a/Installer/fedora/docker-build-binary.sh b/Installer/fedora/docker-build-binary.sh old mode 100644 new mode 100755 diff --git a/Installer/fedora/docker-build-package.sh b/Installer/fedora/docker-build-package.sh old mode 100644 new mode 100755 diff --git a/Installer/fedora/duplicati-install-recursive.sh b/Installer/fedora/duplicati-install-recursive.sh old mode 100644 new mode 100755 diff --git a/Installer/fedora/duplicati-make-git-snapshot.sh b/Installer/fedora/duplicati-make-git-snapshot.sh old mode 100644 new mode 100755 diff --git a/Installer/fedora/make-binary-package.sh b/Installer/fedora/make-binary-package.sh old mode 100644 new mode 100755 diff --git a/build-release.sh b/build-release.sh old mode 100644 new mode 100755 diff --git a/pipeline/linuxZip/build.sh b/pipeline/linuxZip/build.sh old mode 100644 new mode 100755 diff --git a/pipeline/linuxZip/docker/runner.sh b/pipeline/linuxZip/docker/runner.sh old mode 100644 new mode 100755 diff --git a/tabs-to-spaces.sh b/tabs-to-spaces.sh old mode 100644 new mode 100755 From aad89b9bdada66b8e5f04c4d050345bbd35ced40 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 16 Jan 2021 16:38:12 -0800 Subject: [PATCH 122/253] Try to mitigate newline --- .gitattributes | 4 ++-- Installer/debian/build.sh | 3 ++- Installer/debian/docker/runner.sh | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index 55e883fc9..2c6923dd0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ *.sh text eol=lf -#The #! won't work if CRLF -/Installer/debian/docker/debian/rules text eol=lf \ No newline at end of file +#The #! in rules won't work if CRLF +/Installer/debian/docker/debian/* text eol=lf \ No newline at end of file diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh index a7a782c7b..46ddc3ba0 100755 --- a/Installer/debian/build.sh +++ b/Installer/debian/build.sh @@ -5,7 +5,8 @@ SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) docker build $SCRIPTDIR/docker -t duplicati-debian -export VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>/\1/'` +VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>/\1/'` +VERSION=${VERSION//$'\n'} echo Building version: $VERSION export MSYS_NO_PATHCONV=1 diff --git a/Installer/debian/docker/runner.sh b/Installer/debian/docker/runner.sh index 2a677a352..e817442bf 100755 --- a/Installer/debian/docker/runner.sh +++ b/Installer/debian/docker/runner.sh @@ -3,6 +3,8 @@ cd /deb DATE_STAMP=$(LANG=C date -R) sed -e "s;%VERSION%;$VERSION;g" -e "s;%DATE%;$DATE_STAMP;g" -i "debian/changelog" +cat debian/changelog + cp /sources/changelog.txt ./ dpkg-buildpackage -b --no-sign From ffc7b165adfefb06332c9b44e7f1f8e96bee206f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 16 Jan 2021 16:46:45 -0800 Subject: [PATCH 123/253] Why newline why --- Installer/debian/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh index 46ddc3ba0..85c07a582 100755 --- a/Installer/debian/build.sh +++ b/Installer/debian/build.sh @@ -7,7 +7,7 @@ docker build $SCRIPTDIR/docker -t duplicati-debian VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>/\1/'` VERSION=${VERSION//$'\n'} -echo Building version: $VERSION +echo Building version: ("$VERSION") export MSYS_NO_PATHCONV=1 docker run --rm -eVERSION=$VERSION -v $SCRIPTDIR/../../:/sources duplicati-debian \ No newline at end of file From 761eacc55d98d2924f1523c99b10934a3f673073 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 17 Jan 2021 09:53:09 -0800 Subject: [PATCH 124/253] Ugh --- Installer/debian/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh index 85c07a582..8efd1f271 100755 --- a/Installer/debian/build.sh +++ b/Installer/debian/build.sh @@ -7,7 +7,7 @@ docker build $SCRIPTDIR/docker -t duplicati-debian VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>/\1/'` VERSION=${VERSION//$'\n'} -echo Building version: ("$VERSION") +echo "Building version: ($VERSION)" export MSYS_NO_PATHCONV=1 docker run --rm -eVERSION=$VERSION -v $SCRIPTDIR/../../:/sources duplicati-debian \ No newline at end of file From acb557314f584de8709c6f86b0ea8d00268a5d26 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 17 Jan 2021 10:09:31 -0800 Subject: [PATCH 125/253] Maybe carriage return? --- Installer/debian/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh index 8efd1f271..d8233ed03 100755 --- a/Installer/debian/build.sh +++ b/Installer/debian/build.sh @@ -6,7 +6,7 @@ SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) docker build $SCRIPTDIR/docker -t duplicati-debian VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>/\1/'` -VERSION=${VERSION//$'\n'} +VERSION=${VERSION//$'\r\n'} echo "Building version: ($VERSION)" export MSYS_NO_PATHCONV=1 From 46440ebf4012c0baa20bbc061137b9b159ad9174 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 17 Jan 2021 10:13:40 -0800 Subject: [PATCH 126/253] More greedy regex --- Installer/debian/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh index d8233ed03..7d49c98c3 100755 --- a/Installer/debian/build.sh +++ b/Installer/debian/build.sh @@ -5,7 +5,7 @@ SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) docker build $SCRIPTDIR/docker -t duplicati-debian -VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>/\1/'` +VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>.*/\1/'` VERSION=${VERSION//$'\r\n'} echo "Building version: ($VERSION)" From 3056824ff10c880b29b3043b5db5551170000d6d Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 17 Jan 2021 10:19:42 -0800 Subject: [PATCH 127/253] Artifact naming --- .github/workflows/artifacts.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 34db456e1..64b00cdb8 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -42,6 +42,6 @@ jobs: - name: Save Artifacts uses: actions/upload-artifact@v2 with: - name: duplicati*.deb - path: publish + name: deb package + path: duplicati*.deb \ No newline at end of file From dd399d8f2f5a0753fba70e2864dd904de33fffee Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 7 Feb 2021 16:54:36 -0800 Subject: [PATCH 128/253] Fedora work --- .gitattributes | 3 +- .gitignore | 2 + Installer/fedora/build.sh | 13 ++ Installer/fedora/docker/Dockerfile | 16 +++ .../{ => docker/buildroot}/duplicati.spec | 121 ++---------------- .../{ => docker/buildroot}/duplicati.xpm | 0 Installer/fedora/docker/runner.sh | 28 ++++ 7 files changed, 70 insertions(+), 113 deletions(-) create mode 100644 Installer/fedora/build.sh create mode 100644 Installer/fedora/docker/Dockerfile rename Installer/fedora/{ => docker/buildroot}/duplicati.spec (51%) mode change 100755 => 100644 rename Installer/fedora/{ => docker/buildroot}/duplicati.xpm (100%) create mode 100644 Installer/fedora/docker/runner.sh diff --git a/.gitattributes b/.gitattributes index 2c6923dd0..159224359 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ *.sh text eol=lf #The #! in rules won't work if CRLF -/Installer/debian/docker/debian/* text eol=lf \ No newline at end of file +/Installer/debian/docker/debian/* text eol=lf +/Installer/fedora/*.sh text eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7ba91052e..f2c3e652e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ binfiles.wxs .vs/ Installer/debian/*.buildinfo +/*.deb +/*.rpm \ No newline at end of file diff --git a/Installer/fedora/build.sh b/Installer/fedora/build.sh new file mode 100644 index 000000000..8365e6f18 --- /dev/null +++ b/Installer/fedora/build.sh @@ -0,0 +1,13 @@ +#!/bin/bash +#This is a helper to make the release linux zip. Mainly for testing outside of ci/cd + +SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) + +docker build $SCRIPTDIR/docker -t duplicati-fedora + +VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>.*/\1/'` +VERSION=${VERSION//$'\r\n'} +echo "Building version: ($VERSION)" + +export MSYS_NO_PATHCONV=1 +docker run --rm -eVERSION=$VERSION -v $SCRIPTDIR/../../:/sources duplicati-fedora \ No newline at end of file diff --git a/Installer/fedora/docker/Dockerfile b/Installer/fedora/docker/Dockerfile new file mode 100644 index 000000000..01bfb6c19 --- /dev/null +++ b/Installer/fedora/docker/Dockerfile @@ -0,0 +1,16 @@ +FROM fedora:33 + +# Install common build tools +RUN dnf -y install deltarpm +RUN dnf -y upgrade + +RUN rpm --import https://packages.microsoft.com/keys/microsoft.asc +RUN curl --output /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/33/prod.repo + +RUN dnf check-update +RUN dnf -y --allowerasing install @"Minimal Install" @buildsys-build yum-utils rpm-sign gnupg rpmdevtools desktop-file-utils dos2unix dotnet-sdk-5.0 + +ADD buildroot /buildroot + +ADD runner.sh / +CMD /runner.sh \ No newline at end of file diff --git a/Installer/fedora/duplicati.spec b/Installer/fedora/docker/buildroot/duplicati.spec old mode 100755 new mode 100644 similarity index 51% rename from Installer/fedora/duplicati.spec rename to Installer/fedora/docker/buildroot/duplicati.spec index 393959e89..3a2ae2386 --- a/Installer/fedora/duplicati.spec +++ b/Installer/fedora/docker/buildroot/duplicati.spec @@ -15,7 +15,7 @@ Name: %{namer} Version: %{_buildversion} Release: %{_gittag}%{?alphatag}%{?dist} Icon: duplicati.xpm -BuildArch: noarch +#BuildArch: noarch #Should work, but does not allow building noarch #ExclusiveArch: % {mono_arches} @@ -29,7 +29,7 @@ Summary: Backup client for encrypted online backups License: LGPLv2+ URL: http://www.duplicati.com #Source0: http://duplicati.googlecode.com/files/Duplicati%20% {_buildversion}.tgz -Source0: duplicati-%{_builddate}.tar.bz2 +Source0: duplicati-%{_buildversion}.tar.bz2 # based on libdrm's make-git-snapshot.sh # sh duplicati-make-git-snapshot.sh <_builddate> @@ -37,46 +37,19 @@ Source1: %{namer}-build-package.sh Source2: %{namer}-make-git-snapshot.sh Source3: %{namer}-buildinfo.spec -Patch1: %{namer}-0001-remove-unittest.patch - -BuildRequires: mono-devel gnome-sharp-devel BuildRequires: desktop-file-utils BuildRequires: dos2unix BuildRequires: systemd Requires: desktop-file-utils Requires: bash -Requires: sqlite >= 3.6.12 -Requires: mono(appindicator-sharp) Requires: libappindicator -Requires: mono-core >= 5.10.0 -Requires: mono-data-sqlite -Requires: mono(System) -Requires: mono(System.Configuration) -Requires: mono(System.Configuration.Install) -Requires: mono(System.Core) -Requires: mono(System.Data) -Requires: mono(System.Drawing) -Requires: mono(System.Net) -Requires: mono(System.Net.Http) -Requires: mono(System.Net.Http.WebRequest) -Requires: mono(System.Runtime.Serialization) -Requires: mono(System.ServiceModel) -Requires: mono(System.ServiceModel.Discovery) -Requires: mono(System.ServiceProcess) -Requires: mono(System.Transactions) -Requires: mono(System.Web) -Requires: mono(System.Web.Services) -Requires: mono(System.Xml) -Requires: mono(System.Xml.Linq) -Requires: mono(Mono.Security) -Requires: mono(Mono.Posix) Provides: duplicati Provides: duplicati-cli Provides: duplicati-server -%description +%description Duplicati is a free backup client that securely stores encrypted, incremental, compressed backups on cloud storage services and remote file servers. It supports targets like Amazon S3, Windows Live SkyDrive, @@ -89,53 +62,16 @@ tweaks like filters, deletion rules, transfer and bandwidth options to run backups for specific purposes. %prep -%setup -q -n %{namer}-%{_builddate} -dos2unix Duplicati.sln -dos2unix Tools/Verification/DuplicatiVerify.py -%patch1 -p1 - -# removing own duplicati binaries: -rm -f Duplicati/Localization/Duplicati.Library.Utility.dll - -# platform settings: -ln -sf /usr/lib/mono/gtk-sharp-2.0/gtk-sharp.dll \ - ./Duplicati/GUI/Duplicati.GUI.TrayIcon/BuildSupport/gtk-sharp.dll - -ln -sf /usr/lib/mono/gtk-sharp-2.0/glib-sharp.dll \ - ./Duplicati/GUI/Duplicati.GUI.TrayIcon/BuildSupport/glib-sharp.dll - -ln -sf /usr/lib/mono/gtk-sharp-2.0/gdk-sharp.dll \ - ./Duplicati/GUI/Duplicati.GUI.TrayIcon/BuildSupport/gdk-sharp.dll - -ln -sf /usr/lib/mono/gtk-sharp-2.0/atk-sharp.dll \ - ./Duplicati/GUI/Duplicati.GUI.TrayIcon/BuildSupport/atk-sharp.dll - -# rm thirdparty/appindicator-sharp/appindicator-sharp.dll +%setup -q find -type f -name "*dll" -or -name "*DLL" -or -name "*exe" %build -nuget restore Duplicati.sln - -xbuild /property:Configuration=Release BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj -mono BuildTools/UpdateVersionStamp/bin/Release/UpdateVersionStamp.exe --version=%{_buildversion} - -xbuild /property:Configuration=Release Duplicati.sln - -# xbuild BuildTools/LocalizationTool/LocalizationTool.sln - -# update l10n - -#./make.sh - - +dotnet publish -c Release --runtime=linux-x64 -o publish Duplicati.sln %install -# remove the app-indicator file, it is supposed to be on the system, if it is supported -# rm Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/appindicator-sharp.dll - # removing non-platform thirdparty binaries: rm -rf Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/win-tools rm -rf Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/SQLite/win64 @@ -162,18 +98,6 @@ install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/lvm-scripts/ install -p -D -m 755 Installer/debian/duplicati-launcher.sh %{buildroot}%{_bindir}/%{namer} install -p -D -m 755 Installer/debian/duplicati-commandline-launcher.sh %{buildroot}%{_bindir}/%{namer}-cli install -p -D -m 755 Installer/debian/duplicati-server-launcher.sh %{buildroot}%{_bindir}/%{namer}-server -install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.dll %{buildroot}%{_exec_prefix}/lib/%{namer}/ -install -p -m 755 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.exe %{buildroot}%{_exec_prefix}/lib/%{namer}/ -install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.exe.config %{buildroot}%{_exec_prefix}/lib/%{namer}/ -#install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/*.dll.config %{buildroot}%{_exec_prefix}/lib/%{namer}/ -install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/default_compressed_extensions.txt %{buildroot}%{_exec_prefix}/lib/%{namer}/ -install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/acknowledgements.txt %{buildroot}%{_exec_prefix}/lib/%{namer}/ -install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/changelog.txt %{buildroot}%{_exec_prefix}/lib/%{namer}/ -install -p Installer/debian/%{namer}.png %{buildroot}%{_datadir}/pixmaps/ -install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/dark/* %{buildroot}%{_exec_prefix}/lib/%{namer}/SVGIcons/dark/ -install -p -m 644 Duplicati/GUI/Duplicati.GUI.TrayIcon/SVGIcons/light/* %{buildroot}%{_exec_prefix}/lib/%{namer}/SVGIcons/light/ -install -p -m 755 Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/lvm-scripts/*.sh %{buildroot}%{_exec_prefix}/lib/%{namer}/lvm-scripts/ - # Install oem overrides if [ -f "oem-app-name.txt" ]; then install -p -m 644 "oem-app-name.txt" %{buildroot}%{_exec_prefix}/lib/%{namer}/; fi @@ -182,14 +106,10 @@ if [ -f "oem-update-key.txt" ]; then install -p -m 644 "oem-update-key.txt" %{bu if [ -f "oem-update-readme.txt" ]; then install -p -m 644 "oem-update-readme.txt" %{buildroot}%{_exec_prefix}/lib/%{namer}/; fi if [ -f "oem-update-installid.txt" ]; then install -p -m 644 "oem-update-installid.txt" %{buildroot}%{_exec_prefix}/lib/%{namer}/; fi -/bin/bash Installer/fedora/%{namer}-install-recursive.sh "Duplicati/Server/webroot/" "%{buildroot}%{_exec_prefix}/lib/%{namer}/webroot/" - -/bin/bash Installer/fedora/%{namer}-install-recursive.sh "Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/licenses/" "%{buildroot}%{_exec_prefix}/lib/%{namer}/licenses/" +/bin/bash Installer/fedora/%{namer}-install-recursive.sh "publish/" "%{buildroot}%{_exec_prefix}/lib/%{namer}/" desktop-file-install Installer/debian/%{namer}.desktop -mv Tools/Verification/DuplicatiVerify.py Tools/ -rm -rf Tools/Verification/ mv Duplicati/Library/Snapshots/lvm-scripts/remove-lvm-snapshot.sh Tools/ mv Duplicati/Library/Snapshots/lvm-scripts/create-lvm-snapshot.sh Tools/ mv Duplicati/Library/Snapshots/lvm-scripts/find-volume.sh Tools/ @@ -227,30 +147,7 @@ install -p -D -m 644 Installer/fedora/%{namer}.default %{_sysconfdir}/sysconfig/ %changelog -* Wed Jun 21 2017 Kenneth Skovhede - 2.0.0-0.20170621.git -- Added the service file to the install - -* Fri Jan 13 2017 Kenneth Skovhede - 2.0.0-0.20170113.git -- Fixed NuGet restore - -* Sat Apr 23 2016 Kenneth Skovhede - 2.0.0-0.20160423.git -- Updated list of dependencies - -* Thu Mar 27 2014 Kenneth Skovhede - 2.0.0-0.20140326.git -- Moved to /usr/lib -- Fixed minor build issues - -* Wed Mar 26 2014 Kenneth Skovhede - 2.0.0-0.20140326.git -- Updated patch files -- Fixed minor build issues - -* Wed May 29 2013 Ismael Olea - 2.0.0-0.20130529.git -- removed MacOSX support and deps -- first compiler building spec - -* Mon May 13 2013 Ismael Olea - 1.3.4-1 -- removing desktop contents - -* Sun May 12 2013 Ismael Olea - 1.3.4-0 -- first dirty package for upstream compiled binary +* Fri Jan 01 2021 Kenneth Skovhede 2.0 +- Packaged release +- See changelog.txt for changes diff --git a/Installer/fedora/duplicati.xpm b/Installer/fedora/docker/buildroot/duplicati.xpm similarity index 100% rename from Installer/fedora/duplicati.xpm rename to Installer/fedora/docker/buildroot/duplicati.xpm diff --git a/Installer/fedora/docker/runner.sh b/Installer/fedora/docker/runner.sh new file mode 100644 index 000000000..4c48f6d5d --- /dev/null +++ b/Installer/fedora/docker/runner.sh @@ -0,0 +1,28 @@ +mkdir -p ~/rpmbuild/SOURCES/ + + + +cp /buildroot/duplicati.xpm ~/rpmbuild/SOURCES/ +# cp make-binary-package.sh ~/rpmbuild/SOURCES/duplicati-make-binary-package.sh +# cp duplicati-install-recursive.sh ~/rpmbuild/SOURCES/duplicati-install-recursive.sh +# cp duplicati.service ~/rpmbuild/SOURCES/duplicati.service +# cp duplicati.default ~/rpmbuild/SOURCES/duplicati.default + + +BUILDDATE=$(LANG=C date -R) +GITTAG="1" + +echo Creating Tar... +(cd /sources/ && tar --exclude="./.git" --transform "s,^./,duplicati-${VERSION}/," -cjf ~/rpmbuild/SOURCES/duplicati-${VERSION}.tar.bz2 .) +tar -tf ~/rpmbuild/SOURCES/duplicati-${VERSION}.tar.bz2 | head +echo Done... + +echo "%global _builddate ${BUILDDATE}" >> ~/rpmbuild/SOURCES/duplicati-buildinfo.spec +echo "%global _buildversion ${VERSION}" >> ~/rpmbuild/SOURCES/duplicati-buildinfo.spec +echo "%global _gittag ${GITTAG}" >> ~/rpmbuild/SOURCES/duplicati-buildinfo.spec + +cd /buildroot +dos2unix duplicati.spec +rpmbuild -bb duplicati.spec + +cp /root/rpmbuild/RPMS/*/*.rpm /sources/ \ No newline at end of file From ab9e807bc01d9f3cb8ad7aa7dbc7bdf435fa311a Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 6 Mar 2021 18:10:39 -0800 Subject: [PATCH 129/253] Somewhat working Fedora rpm --- .../debian/duplicati-commandline-launcher.sh | 9 ----- Installer/debian/duplicati-launcher.sh | 9 ----- Installer/debian/duplicati-server-launcher.sh | 9 ----- .../fedora/docker/buildroot/duplicati.spec | 36 ++++++++++--------- Installer/fedora/duplicati.service | 1 + 5 files changed, 20 insertions(+), 44 deletions(-) delete mode 100755 Installer/debian/duplicati-commandline-launcher.sh delete mode 100755 Installer/debian/duplicati-launcher.sh delete mode 100755 Installer/debian/duplicati-server-launcher.sh diff --git a/Installer/debian/duplicati-commandline-launcher.sh b/Installer/debian/duplicati-commandline-launcher.sh deleted file mode 100755 index f3597e869..000000000 --- a/Installer/debian/duplicati-commandline-launcher.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -INSTALLDIR=/usr/lib/duplicati -export LD_LIBRARY_PATH="${INSTALLDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" -export MONO_PATH=$MONO_PATH:${INSTALLDIR} - -EXE_FILE=${INSTALLDIR}/Duplicati.CommandLine.exe -APP_NAME=Duplicati.CommandLine - -exec -a "$APP_NAME" mono "$EXE_FILE" "$@" diff --git a/Installer/debian/duplicati-launcher.sh b/Installer/debian/duplicati-launcher.sh deleted file mode 100755 index 785a0c82e..000000000 --- a/Installer/debian/duplicati-launcher.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -INSTALLDIR=/usr/lib/duplicati -export LD_LIBRARY_PATH="${INSTALLDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" -export MONO_PATH=$MONO_PATH:${INSTALLDIR} - -EXE_FILE=${INSTALLDIR}/Duplicati.GUI.TrayIcon.exe -APP_NAME=Duplicati - -exec -a "$APP_NAME" mono "$EXE_FILE" "$@" diff --git a/Installer/debian/duplicati-server-launcher.sh b/Installer/debian/duplicati-server-launcher.sh deleted file mode 100755 index 1a7297062..000000000 --- a/Installer/debian/duplicati-server-launcher.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -INSTALLDIR=/usr/lib/duplicati -export LD_LIBRARY_PATH="${INSTALLDIR}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" -export MONO_PATH=$MONO_PATH:${INSTALLDIR} - -EXE_FILE=${INSTALLDIR}/Duplicati.Server.exe -APP_NAME=DuplicatiServer - -exec -a "$APP_NAME" mono "$EXE_FILE" "$@" diff --git a/Installer/fedora/docker/buildroot/duplicati.spec b/Installer/fedora/docker/buildroot/duplicati.spec index 3a2ae2386..97b559245 100644 --- a/Installer/fedora/docker/buildroot/duplicati.spec +++ b/Installer/fedora/docker/buildroot/duplicati.spec @@ -68,7 +68,7 @@ find -type f -name "*dll" -or -name "*DLL" -or -name "*exe" %build -dotnet publish -c Release --runtime=linux-x64 -o publish Duplicati.sln +dotnet publish -c Release --runtime=linux-x64 -p:DefineConstants=ENABLE_GTK -o publish Duplicati.sln %install @@ -95,9 +95,13 @@ install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/licenses/ install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/webroot/ install -d %{buildroot}%{_exec_prefix}/lib/%{namer}/lvm-scripts/ -install -p -D -m 755 Installer/debian/duplicati-launcher.sh %{buildroot}%{_bindir}/%{namer} -install -p -D -m 755 Installer/debian/duplicati-commandline-launcher.sh %{buildroot}%{_bindir}/%{namer}-cli -install -p -D -m 755 Installer/debian/duplicati-server-launcher.sh %{buildroot}%{_bindir}/%{namer}-server +install -d %{buildroot}%{_unitdir}/ +install -d %{buildroot}%{_sysconfdir}/sysconfig/ +install -d %{buildroot}%{_bindir}/ + +ln -sf /usr/lib/%{namer}/Duplicati.GUI.TrayIcon %{buildroot}%{_bindir}/%{namer} +ln -sf /usr/lib/%{namer}/Duplicati.CommandLine %{buildroot}%{_bindir}/%{namer}-cli +ln -sf /usr/lib/%{namer}/Duplicati.Server %{buildroot}%{_bindir}/%{namer}-server # Install oem overrides if [ -f "oem-app-name.txt" ]; then install -p -m 644 "oem-app-name.txt" %{buildroot}%{_exec_prefix}/lib/%{namer}/; fi @@ -108,6 +112,13 @@ if [ -f "oem-update-installid.txt" ]; then install -p -m 644 "oem-update-install /bin/bash Installer/fedora/%{namer}-install-recursive.sh "publish/" "%{buildroot}%{_exec_prefix}/lib/%{namer}/" +install -p Installer/debian/%{namer}.png %{buildroot}%{_datadir}/pixmaps/ + +chmod 755 %{buildroot}%{_exec_prefix}/lib/%{namer}/Duplicati.GUI.TrayIcon +chmod 755 %{buildroot}%{_exec_prefix}/lib/%{namer}/Duplicati.CommandLine +chmod 755 %{buildroot}%{_exec_prefix}/lib/%{namer}/Duplicati.Server +find "%{buildroot}%{_exec_prefix}/lib/%{namer}"/* -type f -name \*.sh | xargs chmod 755 + desktop-file-install Installer/debian/%{namer}.desktop mv Duplicati/Library/Snapshots/lvm-scripts/remove-lvm-snapshot.sh Tools/ @@ -116,34 +127,25 @@ mv Duplicati/Library/Snapshots/lvm-scripts/find-volume.sh Tools/ mv Duplicati/Library/Modules/Builtin/run-script-example.sh Tools/ # Install the service: -install -p -D -m 755 Installer/fedora/%{namer}.service %{_unitdir} -install -p -D -m 644 Installer/fedora/%{namer}.default %{_sysconfdir}/sysconfig/ +install -p -D -m 755 Installer/fedora/%{namer}.service %{buildroot}%{_unitdir}/ +install -p -D -m 644 Installer/fedora/%{namer}.default %{buildroot}%{_sysconfdir}/sysconfig/ %post -/bin/touch --no-create %{_datadir}/icons/hicolor || : -%{_bindir}/gtk-update-icon-cache \ - --quiet %{_datadir}/icons/hicolor 2> /dev/null|| : %systemd_post %{namer}.service %preun %systemd_preun %{namer}.service %postun -/bin/touch --no-create %{_datadir}/icons/hicolor || : -%{_bindir}/gtk-update-icon-cache \ - --quiet %{_datadir}/icons/hicolor 2> /dev/null|| : -%systemd_postun_with_restart %{namer}.service - -%posttrans -/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : - +%systemd_postun %{namer}.service %files %doc changelog.txt Duplicati/license.txt Tools %{_bindir}/* %{_datadir}/*/* %{_exec_prefix}/lib/* +%{_sysconfdir}/sysconfig/* %changelog diff --git a/Installer/fedora/duplicati.service b/Installer/fedora/duplicati.service index dd4cf3ab7..de8d0e3cb 100644 --- a/Installer/fedora/duplicati.service +++ b/Installer/fedora/duplicati.service @@ -7,6 +7,7 @@ Nice=19 IOSchedulingClass=idle EnvironmentFile=-/etc/sysconfig/duplicati ExecStart=/usr/bin/duplicati-server $DAEMON_OPTS +Restart=on-failure [Install] WantedBy=multi-user.target From a28b5c786054c477095bf9cc0498e9b76cfb6b30 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 6 Mar 2021 22:12:01 -0800 Subject: [PATCH 130/253] Restore missing file --- .../GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs new file mode 100644 index 000000000..9e7dd2811 --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs @@ -0,0 +1,91 @@ +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Drawing; +using System.Collections.Generic; + +namespace Duplicati.GUI.TrayIcon +{ + public static class ImageLoader + { + private static readonly System.Reflection.Assembly ASSEMBLY = System.Reflection.Assembly.GetExecutingAssembly(); + private static readonly string PREFIX = ASSEMBLY.GetName().Name + "."; + private static readonly Dictionary BITMAPS = new Dictionary(); + private static readonly Dictionary ICONS = new Dictionary(); + private static readonly object LOCK = new object(); + + private static Bitmap LoadImage(string filename) + { + Bitmap bmp; + if (BITMAPS.TryGetValue(filename, out bmp)) + return bmp; + + lock(LOCK) + if (!BITMAPS.TryGetValue(filename, out bmp)) + return BITMAPS[filename] = (Bitmap)Image.FromStream(ASSEMBLY.GetManifestResourceStream(PREFIX + filename)); + + return BITMAPS[filename]; + } + + public static Icon LoadIcon(string filename) + { + return LoadIcon(filename, new Size(32, 32)); + } + + public static Icon LoadIcon(string filename, Size size) + { + Icon ico; + + var cachename = string.Format("{0};{1}x{2}", filename, size.Width, size.Height); + + if (ICONS.TryGetValue(cachename, out ico)) + return ico; + + if (!filename.EndsWith(".ico", StringComparison.OrdinalIgnoreCase)) + using(var ms = new System.IO.MemoryStream()) + { + Icon ic; + using(var bmp = LoadImage(filename)) + ic = Icon.FromHandle(bmp.GetHicon()); + + ms.Position = 0; + lock(LOCK) + if (!ICONS.TryGetValue(cachename, out ico)) + return ICONS[cachename] = ic; + } + + lock(LOCK) + if (!ICONS.TryGetValue(cachename, out ico)) + return ICONS[cachename] = new Icon(ASSEMBLY.GetManifestResourceStream(PREFIX + filename), size); + + return ICONS[cachename]; + } + + public const string NormalIcon = "Resources.TrayNormal.ico"; + public const string WarningIcon = "Resources.TrayNormalWarning.ico"; + public const string ErrorIcon = "Resources.TrayNormalError.ico"; + public const string PauseIcon = "Resources.TrayNormalPause.ico"; + public const string WorkingIcon = "Resources.TrayWorking.ico"; + + public static Bitmap Pause { get { return LoadImage("Resources.context_menu_pause.ico"); } } + public static Bitmap Play { get { return LoadImage("Resources.context_menu_play.ico"); } } + public static Bitmap CloseMenuIcon { get { return LoadImage("Resources.context_menu_quit.ico"); } } + public static Bitmap StatusMenuIcon { get { return LoadImage("Resources.context_menu_open.ico"); } } + + } +} \ No newline at end of file From 3b8d9608ef896f5e62d31bc779aba78ee7c96267 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 19 Mar 2021 06:42:02 -0700 Subject: [PATCH 131/253] Rip out libappindicator as it isn't compatible with net5 --- .../AppIndicatorRunner.cs | 88 ------------------- .../Duplicati.GUI.TrayIcon.csproj | 15 +--- .../GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs | 4 + .../GUI/Duplicati.GUI.TrayIcon/Program.cs | 38 +------- 4 files changed, 9 insertions(+), 136 deletions(-) delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs deleted file mode 100644 index 540382e7b..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -#if __WindowsGTK__ || ENABLE_GTK -using System; -using AppIndicator; -using Gtk; -using System.Collections.Generic; - -using Duplicati.Library.Common.IO; -using Duplicati.Library.Utility; -using Duplicati.Server.Serialization; - - -namespace Duplicati.GUI.TrayIcon -{ - public class AppIndicatorRunner : GtkRunner - { - protected ApplicationIndicator m_appIndicator; - private string m_themeFolder; - - protected override void CreateTrayInstance() - { - m_themeFolder = SystemIO.IO_OS.PathCombine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), @"TrayResources\SVGIcons"); - m_themeFolder = SystemIO.IO_OS.PathCombine(m_themeFolder, "dark"); - - m_appIndicator = new ApplicationIndicator("duplicati", "normal", Category.ApplicationStatus, m_themeFolder); - } - - protected override void Run(string[] args) - { - m_appIndicator.Menu.ShowAll(); - m_appIndicator.Status = Status.Active; - Gtk.Application.Run(); - } - - protected override void SetMenu (IEnumerable items) - { - base.SetMenu(items); - m_appIndicator.Menu = m_popupMenu; - } - - protected override void SetIcon(TrayIcons icon) - { - m_appIndicator.IconName = GetTrayIconFilename(icon); - - switch (icon) - { - case TrayIcons.Paused: - m_appIndicator.IconDesc = "Paused"; - break; - case TrayIcons.Running: - m_appIndicator.IconDesc = "Running"; - break; - case TrayIcons.IdleWarning: - m_appIndicator.IconDesc = "Warning"; - break; - case TrayIcons.IdleError: - m_appIndicator.IconDesc = "Error"; - break; - case TrayIcons.RunningError: - m_appIndicator.IconDesc = "Running"; - break; - case TrayIcons.PausedError: - m_appIndicator.IconDesc = "Paused"; - break; - case TrayIcons.Idle: - default: - m_appIndicator.IconDesc = "Ready"; - break; - } - } - } -} -#endif diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index dedfb53e7..f19073565 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -36,6 +36,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -44,23 +45,9 @@ - - ..\..\..\thirdparty\appindicator-sharp\appindicator-sharp.dll - - - ..\..\..\thirdparty\appindicator-sharp\gdk-sharp.dll - - - ..\..\..\thirdparty\appindicator-sharp\gtk-sharp.dll - - - ..\..\..\thirdparty\MonoMac\MonoMac.dll - - ..\..\..\thirdparty\notify-sharp\notify-sharp.dll - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs index 3b81a6e68..f5a5f99fa 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + #if __WindowsGTK__ || ENABLE_GTK using System; using System.Collections.Generic; @@ -343,8 +344,11 @@ namespace Duplicati.GUI.TrayIcon break; } + /* + FIXME: Someone would need to port notify-sharp to use Tmds.DBus var notification = new Notifications.Notification(title, message, icon); notification.Show(); + */ } protected void StatusUpdateEvent(object sender, EventArgs a) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs index e2881901b..91df59727 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs @@ -19,7 +19,6 @@ namespace Duplicati.GUI.TrayIcon private const string TOOLKIT_OPTION = "toolkit"; private const string TOOLKIT_WINDOWS_FORMS = "winforms"; private const string TOOLKIT_GTK = "gtk"; - private const string TOOLKIT_GTK_APP_INDICATOR = "gtk-appindicator"; private const string TOOLKIT_COCOA = "cocoa"; private const string TOOLKIT_RUMPS = "rumps"; @@ -50,9 +49,6 @@ namespace Duplicati.GUI.TrayIcon #if __WindowsGTK__ || ENABLE_GTK if (Platform.IsClientPosix) { - if (SupportsAppIndicator) - return TOOLKIT_GTK_APP_INDICATOR; - else return TOOLKIT_GTK; } else @@ -128,8 +124,6 @@ namespace Duplicati.GUI.TrayIcon #if __WindowsGTK__ || ENABLE_GTK else if (TOOLKIT_GTK.Equals(toolkit, StringComparison.OrdinalIgnoreCase)) toolkit = TOOLKIT_GTK; - else if (TOOLKIT_GTK_APP_INDICATOR.Equals(toolkit, StringComparison.OrdinalIgnoreCase)) - toolkit = TOOLKIT_GTK_APP_INDICATOR; #endif else if (TOOLKIT_COCOA.Equals(toolkit, StringComparison.OrdinalIgnoreCase)) toolkit = TOOLKIT_COCOA; @@ -294,13 +288,14 @@ namespace Duplicati.GUI.TrayIcon private static TrayIconBase RunTrayIcon(string toolkit) { + //https://medium.com/@k.l.mueller/cross-platform-tray-bar-applications-with-xamarin-forms-bbd6c1b7f17a + //https://docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/other/gtk?tabs=windows + if (toolkit == TOOLKIT_WINDOWS_FORMS) return GetWinformsInstance(); #if __WindowsGTK__ || ENABLE_GTK else if (toolkit == TOOLKIT_GTK) return GetGtkInstance(); - else if (toolkit == TOOLKIT_GTK_APP_INDICATOR) - return GetAppIndicatorInstance(); #endif else if (toolkit == TOOLKIT_COCOA) return GetCocoaRunnerInstance(); @@ -322,8 +317,6 @@ namespace Duplicati.GUI.TrayIcon #if __MonoCS__ || __WindowsGTK__ || ENABLE_GTK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetGtkInstance() { return new GtkRunner(); } - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private static TrayIconBase GetAppIndicatorInstance() { return new AppIndicatorRunner(); } #endif [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetCocoaRunnerInstance() { return new CocoaRunner(); } @@ -340,7 +333,7 @@ namespace Duplicati.GUI.TrayIcon private static bool TryGetGtk() { #if __WindowsGTK__ || ENABLE_GTK - return typeof(Gtk.StatusIcon) != null && typeof(Gdk.Image) != null; + return typeof(Gtk.StatusIcon) != null; #else return false; #endif @@ -351,16 +344,6 @@ namespace Duplicati.GUI.TrayIcon { return Platform.IsClientWindows; } - - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private static bool TryGetAppIndicator() - { -#if __WindowsGTK__ || ENABLE_GTK - return typeof(AppIndicator.ApplicationIndicator) != null; -#else - return false; -#endif - } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static bool TryGetMonoMac() @@ -382,17 +365,6 @@ namespace Duplicati.GUI.TrayIcon } } - private static bool SupportsAppIndicator - { - get - { - try { return TryGetAppIndicator(); } - catch {} - - return false; - } - } - private static bool SupportsCocoa { get @@ -436,8 +408,6 @@ namespace Duplicati.GUI.TrayIcon toolkits.Add(TOOLKIT_WINDOWS_FORMS); if (SupportsGtk) toolkits.Add(TOOLKIT_GTK); - if (SupportsAppIndicator) - toolkits.Add(TOOLKIT_GTK_APP_INDICATOR); if (SupportsCocoa) toolkits.Add(TOOLKIT_COCOA); if (SupportsRumps) From 0e227a31b9933fe34fa45f9e16d280d1bde2ad06 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 19 Mar 2021 06:42:14 -0700 Subject: [PATCH 132/253] Disable autoupdater across the board --- Duplicati/Library/AutoUpdater/UpdaterManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Duplicati/Library/AutoUpdater/UpdaterManager.cs b/Duplicati/Library/AutoUpdater/UpdaterManager.cs index 487650597..dd3890155 100644 --- a/Duplicati/Library/AutoUpdater/UpdaterManager.cs +++ b/Duplicati/Library/AutoUpdater/UpdaterManager.cs @@ -57,7 +57,8 @@ namespace Duplicati.Library.AutoUpdater ? System.IO.Path.GetDirectoryName(Duplicati.Library.Utility.Utility.getEntryAssembly().Location) : Environment.ExpandEnvironmentVariables(System.Environment.GetEnvironmentVariable(string.Format(BASEINSTALLDIR_ENVNAME_TEMPLATE, APPNAME))); - private static readonly bool DISABLE_UPDATE_DOMAIN = Utility.Utility.ParseBool(Environment.GetEnvironmentVariable(string.Format(SKIPUPDATE_ENVNAME_TEMPLATE, APPNAME)), false); + //FIXME: Auto Update doesn't work with the .net5 version + private static readonly bool DISABLE_UPDATE_DOMAIN = true;//Utility.Utility.ParseBool(Environment.GetEnvironmentVariable(string.Format(SKIPUPDATE_ENVNAME_TEMPLATE, APPNAME)), false); public static bool RequiresRespawn { get; set; } From dfa9e527bd9b8b420d8389edfad91ed22bb15087 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 19 Mar 2021 06:43:09 -0700 Subject: [PATCH 133/253] At least make the debian build run again The artifact is still b0rked due to some missing library that I don't understand since the fedora build works. --- Installer/debian/docker/debian/rules | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Installer/debian/docker/debian/rules b/Installer/debian/docker/debian/rules index 1fa806239..45f3d6b2f 100644 --- a/Installer/debian/docker/debian/rules +++ b/Installer/debian/docker/debian/rules @@ -34,9 +34,9 @@ override_dh_auto_install: mkdir build/share mkdir build/share/applications mkdir build/share/pixmaps - cp /sources/Installer/debian/duplicati-launcher.sh build/bin/duplicati - cp /sources/Installer/debian/duplicati-commandline-launcher.sh build/bin/duplicati-cli - cp /sources/Installer/debian/duplicati-server-launcher.sh build/bin/duplicati-server + ln -sf /usr/lib/duplicati/Duplicati.GUI.TrayIcon build/bin/duplicati + ln -sf /usr/lib/duplicati/Duplicati.CommandLine build/bin/duplicati-cli + ln -sf /usr/lib/duplicati/Duplicati.Server build/bin/duplicati-server cp /sources/Tools/Verification/DuplicatiVerify.py build/lib/duplicati/ cp /sources/Installer/debian/duplicati.desktop build/share/applications cp /sources/Installer/debian/duplicati.xpm build/share/pixmaps @@ -51,6 +51,9 @@ override_dh_auto_install: find build/lib/duplicati/* -type d | xargs chmod 755 find build/lib/duplicati/* -type f -name \*.sh | xargs chmod 755 find build/lib/duplicati/* -type f -name \*.py | xargs chmod 755 + chmod 755 build/lib/duplicati/Duplicati.GUI.TrayIcon + chmod 755 build/lib/duplicati/Duplicati.CommandLine + chmod 755 build/lib/duplicati/Duplicati.Server dh_install override_dh_systemd_enable: From 4d6d671fdc11e9cce660ed58ad426eb87a549e86 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 20 Mar 2021 15:58:36 -0700 Subject: [PATCH 134/253] Fix debian --- Installer/debian/docker/debian/rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/debian/docker/debian/rules b/Installer/debian/docker/debian/rules index 45f3d6b2f..1995c5ed3 100644 --- a/Installer/debian/docker/debian/rules +++ b/Installer/debian/docker/debian/rules @@ -27,7 +27,7 @@ override_dh_clean: find /sources -type d -name obj | xargs rm -rf override_dh_auto_build: - dotnet publish -c Release -o build/lib/duplicati/ /sources/Duplicati.sln + dotnet publish -c Release --runtime=linux-x64 -p:DefineConstants=ENABLE_GTK -o build/lib/duplicati/ /sources/Duplicati.sln override_dh_auto_install: mkdir build/bin From abc361031c3eeb7d31d6b0ac8ef1a8760fe33bda Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Thu, 1 Apr 2021 15:14:59 +0200 Subject: [PATCH 135/253] Removed unused sln --- Duplicati CommandLine Only.sln | 324 --------------------------------- 1 file changed, 324 deletions(-) delete mode 100644 Duplicati CommandLine Only.sln diff --git a/Duplicati CommandLine Only.sln b/Duplicati CommandLine Only.sln deleted file mode 100644 index 60f91ed27..000000000 --- a/Duplicati CommandLine Only.sln +++ /dev/null @@ -1,324 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26730.12 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Utility", "Duplicati\Library\Utility\Duplicati.Library.Utility.csproj", "{DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}" -EndProject -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.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.Compression", "Duplicati\Library\Compression\Duplicati.Library.Compression.csproj", "{19ECCE09-B5EB-406C-8C57-BAC66997D469}" -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.Logging", "Duplicati\Library\Logging\Duplicati.Library.Logging.csproj", "{D10A5FC0-11B4-4E70-86AA-8AEA52BD9798}" -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.Interface", "Duplicati\Library\Interface\Duplicati.Library.Interface.csproj", "{C5899F45-B0FF-483C-9D38-24A9FCAAB237}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.DynamicLoader", "Duplicati\Library\DynamicLoader\Duplicati.Library.DynamicLoader.csproj", "{0CA86ECF-5BEC-4909-B4F6-110A03B30B92}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Snapshots", "Duplicati\Library\Snapshots\Duplicati.Library.Snapshots.csproj", "{D63E53E4-A458-4C2F-914D-92F715F58ACE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Modules.Builtin", "Duplicati\Library\Modules\Builtin\Duplicati.Library.Modules.Builtin.csproj", "{52826615-7964-47FE-B4B3-1B2DBDF605B9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.License", "Duplicati\License\Duplicati.License.csproj", "{4D012CB1-4B92-47F4-89B7-BF80A73A2E99}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.SSHv2", "Duplicati\Library\Backend\SSHv2\Duplicati.Library.Backend.SSHv2.csproj", "{FF2BF37C-E502-4C98-BEA0-701671DDFA08}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.WEBDAV", "Duplicati\Library\Backend\WEBDAV\Duplicati.Library.Backend.WEBDAV.csproj", "{BAE27510-8B5D-44B2-B33E-372A98908041}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.OneDrive", "Duplicati\Library\Backend\OneDrive\Duplicati.Library.Backend.OneDrive.csproj", "{CCD76347-7DC7-4B42-B7E1-E500E624CAC3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.TahoeLAFS", "Duplicati\Library\Backend\TahoeLAFS\Duplicati.Library.Backend.TahoeLAFS.csproj", "{C0270709-2A40-43B5-8CF1-69581B9FA2A1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.CloudFiles", "Duplicati\Library\Backend\CloudFiles\Duplicati.Library.Backend.CloudFiles.csproj", "{1BFAE226-8364-4086-825C-BB83F6F3EE4C}" -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.S3", "Duplicati\Library\Backend\S3\Duplicati.Library.Backend.S3.csproj", "{C03F6DFD-805A-4BE0-9338-64870ADDB4A2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.AzureBlob", "Duplicati\Library\Backend\AzureBlob\Duplicati.Library.Backend.AzureBlob.csproj", "{8E4CECFB-0413-4B00-AB93-78D1C3902BD5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Localization", "Duplicati\Library\Localization\Duplicati.Library.Localization.csproj", "{B68F2214-951F-4F78-8488-66E1ED3F50BF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.AutoUpdater", "Duplicati\Library\AutoUpdater\Duplicati.Library.AutoUpdater.csproj", "{7E119745-1F62-43F0-936C-F312A1912C0B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.SQLiteHelper", "Duplicati\Library\SQLiteHelper\Duplicati.Library.SQLiteHelper.csproj", "{2C838169-B187-4B09-8768-1C24C2521C8D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.UsageReporter", "Duplicati\Library\UsageReporter\Duplicati.Library.UsageReporter.csproj", "{BB014EA5-CE2C-4444-8D30-38983A0E8553}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.OAuthHelper", "Duplicati\Library\Backend\OAuthHelper\Duplicati.Library.OAuthHelper.csproj", "{D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTool", "Duplicati\CommandLine\BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{2AF960C0-357D-4D44-A3D5-8B6E89DB0F11}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTester", "Duplicati\CommandLine\BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{E7280DCA-7776-4A73-B9B5-41FD77FC8799}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.GoogleServices", "Duplicati\Library\Backend\GoogleServices\Duplicati.Library.Backend.GoogleServices.csproj", "{5489181D-950C-44AF-873C-45EB0A3B6BD2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.OpenStack", "Duplicati\Library\Backend\OpenStack\Duplicati.Library.Backend.OpenStack.csproj", "{D9E4E686-423C-48EC-A392-404E7C00860C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.HubiC", "Duplicati\Library\Backend\HubiC\Duplicati.Library.Backend.HubiC.csproj", "{D60AD540-0E7D-40CE-83AE-D26E01FFE9B8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.RecoveryTool", "Duplicati\CommandLine\RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{4A010589-76E6-4F05-A5C4-4598D5DF11F8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Box", "Duplicati\Library\Backend\Box\Duplicati.Library.Backend.Box.csproj", "{3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.AlternativeFTP", "Duplicati\Library\Backend\AlternativeFTP\Duplicati.Library.Backend.AlternativeFTP.csproj", "{3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Backblaze", "Duplicati\Library\Backend\Backblaze\Duplicati.Library.Backend.Backblaze.csproj", "{61C43D61-4368-4942-84A3-1EB623F4EF2A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Dropbox", "Duplicati\Library\Backend\Dropbox\Duplicati.Library.Backend.Dropbox.csproj", "{B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Mega", "Duplicati\Library\Backend\Mega\Duplicati.Library.Backend.Mega.csproj", "{6643A5AE-AB38-453F-ADCE-408E35A81A83}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.SharePoint", "Duplicati\Library\Backend\SharePoint\Duplicati.Library.Backend.SharePoint.csproj", "{59C8BBC5-6E42-46FB-AB3E-6C183A82459A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Tools", "Duplicati\Tools\Duplicati.Tools.csproj", "{0797AA22-C5DD-4950-BB60-34765AB8C6DD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Sia", "Duplicati\Library\Backend\Sia\Duplicati.Library.Backend.Sia.csproj", "{32A74526-3E5F-413A-8CB4-1EFDAD4C8B91}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Common", "Duplicati\Library\Common\Duplicati.Library.Common.csproj", "{D63E53E4-A458-4C2F-914D-92F715F58ACF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Jottacloud", "Duplicati\Library\Backend\Jottacloud\Duplicati.Library.Backend.Jottacloud.csproj", "{2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Rclone", "Duplicati\Library\Backend\Rclone\Duplicati.Library.Backend.Rclone.csproj", "{851A1CB8-3CEB-41B4-956F-34D760D2A8E5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {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 - {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 - {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 - {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 - {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 - {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 - {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 - {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5899F45-B0FF-483C-9D38-24A9FCAAB237}.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 - {D63E53E4-A458-4C2F-914D-92F715F58ACE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D63E53E4-A458-4C2F-914D-92F715F58ACE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D63E53E4-A458-4C2F-914D-92F715F58ACE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D63E53E4-A458-4C2F-914D-92F715F58ACE}.Release|Any CPU.Build.0 = Release|Any CPU - {52826615-7964-47FE-B4B3-1B2DBDF605B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {52826615-7964-47FE-B4B3-1B2DBDF605B9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52826615-7964-47FE-B4B3-1B2DBDF605B9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {52826615-7964-47FE-B4B3-1B2DBDF605B9}.Release|Any CPU.Build.0 = Release|Any CPU - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D012CB1-4B92-47F4-89B7-BF80A73A2E99}.Release|Any CPU.Build.0 = Release|Any CPU - {FF2BF37C-E502-4C98-BEA0-701671DDFA08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF2BF37C-E502-4C98-BEA0-701671DDFA08}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF2BF37C-E502-4C98-BEA0-701671DDFA08}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF2BF37C-E502-4C98-BEA0-701671DDFA08}.Release|Any CPU.Build.0 = Release|Any CPU - {BAE27510-8B5D-44B2-B33E-372A98908041}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAE27510-8B5D-44B2-B33E-372A98908041}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAE27510-8B5D-44B2-B33E-372A98908041}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAE27510-8B5D-44B2-B33E-372A98908041}.Release|Any CPU.Build.0 = Release|Any CPU - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CCD76347-7DC7-4B42-B7E1-E500E624CAC3}.Release|Any CPU.Build.0 = Release|Any CPU - {C0270709-2A40-43B5-8CF1-69581B9FA2A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C0270709-2A40-43B5-8CF1-69581B9FA2A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C0270709-2A40-43B5-8CF1-69581B9FA2A1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C0270709-2A40-43B5-8CF1-69581B9FA2A1}.Release|Any CPU.Build.0 = Release|Any CPU - {1BFAE226-8364-4086-825C-BB83F6F3EE4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1BFAE226-8364-4086-825C-BB83F6F3EE4C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1BFAE226-8364-4086-825C-BB83F6F3EE4C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1BFAE226-8364-4086-825C-BB83F6F3EE4C}.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 - {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 - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8E4CECFB-0413-4B00-AB93-78D1C3902BD5}.Release|Any CPU.Build.0 = Release|Any CPU - {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B68F2214-951F-4F78-8488-66E1ED3F50BF}.Release|Any CPU.Build.0 = Release|Any CPU - {7E119745-1F62-43F0-936C-F312A1912C0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7E119745-1F62-43F0-936C-F312A1912C0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7E119745-1F62-43F0-936C-F312A1912C0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7E119745-1F62-43F0-936C-F312A1912C0B}.Release|Any CPU.Build.0 = Release|Any CPU - {2C838169-B187-4B09-8768-1C24C2521C8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2C838169-B187-4B09-8768-1C24C2521C8D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2C838169-B187-4B09-8768-1C24C2521C8D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2C838169-B187-4B09-8768-1C24C2521C8D}.Release|Any CPU.Build.0 = Release|Any CPU - {BB014EA5-CE2C-4444-8D30-38983A0E8553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB014EA5-CE2C-4444-8D30-38983A0E8553}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB014EA5-CE2C-4444-8D30-38983A0E8553}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB014EA5-CE2C-4444-8D30-38983A0E8553}.Release|Any CPU.Build.0 = Release|Any CPU - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D4C37C33-5E73-4B56-B2C3-DC4A6BAA36BB}.Release|Any CPU.Build.0 = Release|Any CPU - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11}.Release|Any CPU.Build.0 = Release|Any CPU - {E7280DCA-7776-4A73-B9B5-41FD77FC8799}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7280DCA-7776-4A73-B9B5-41FD77FC8799}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7280DCA-7776-4A73-B9B5-41FD77FC8799}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7280DCA-7776-4A73-B9B5-41FD77FC8799}.Release|Any CPU.Build.0 = Release|Any CPU - {5489181D-950C-44AF-873C-45EB0A3B6BD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5489181D-950C-44AF-873C-45EB0A3B6BD2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5489181D-950C-44AF-873C-45EB0A3B6BD2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5489181D-950C-44AF-873C-45EB0A3B6BD2}.Release|Any CPU.Build.0 = Release|Any CPU - {D9E4E686-423C-48EC-A392-404E7C00860C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9E4E686-423C-48EC-A392-404E7C00860C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9E4E686-423C-48EC-A392-404E7C00860C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9E4E686-423C-48EC-A392-404E7C00860C}.Release|Any CPU.Build.0 = Release|Any CPU - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8}.Release|Any CPU.Build.0 = Release|Any CPU - {4A010589-76E6-4F05-A5C4-4598D5DF11F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A010589-76E6-4F05-A5C4-4598D5DF11F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A010589-76E6-4F05-A5C4-4598D5DF11F8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A010589-76E6-4F05-A5C4-4598D5DF11F8}.Release|Any CPU.Build.0 = Release|Any CPU - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2}.Release|Any CPU.Build.0 = Release|Any CPU - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}.Release|Any CPU.Build.0 = Release|Any CPU - {61C43D61-4368-4942-84A3-1EB623F4EF2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61C43D61-4368-4942-84A3-1EB623F4EF2A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61C43D61-4368-4942-84A3-1EB623F4EF2A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61C43D61-4368-4942-84A3-1EB623F4EF2A}.Release|Any CPU.Build.0 = Release|Any CPU - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}.Release|Any CPU.Build.0 = Release|Any CPU - {6643A5AE-AB38-453F-ADCE-408E35A81A83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6643A5AE-AB38-453F-ADCE-408E35A81A83}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6643A5AE-AB38-453F-ADCE-408E35A81A83}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6643A5AE-AB38-453F-ADCE-408E35A81A83}.Release|Any CPU.Build.0 = Release|Any CPU - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59C8BBC5-6E42-46FB-AB3E-6C183A82459A}.Release|Any CPU.Build.0 = Release|Any CPU - {0797AA22-C5DD-4950-BB60-34765AB8C6DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0797AA22-C5DD-4950-BB60-34765AB8C6DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0797AA22-C5DD-4950-BB60-34765AB8C6DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0797AA22-C5DD-4950-BB60-34765AB8C6DD}.Release|Any CPU.Build.0 = Release|Any CPU - {32A74526-3E5F-413A-8CB4-1EFDAD4C8B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32A74526-3E5F-413A-8CB4-1EFDAD4C8B91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32A74526-3E5F-413A-8CB4-1EFDAD4C8B91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32A74526-3E5F-413A-8CB4-1EFDAD4C8B91}.Release|Any CPU.Build.0 = Release|Any CPU - {D63E53E4-A458-4C2F-914D-92F715F58ACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D63E53E4-A458-4C2F-914D-92F715F58ACF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D63E53E4-A458-4C2F-914D-92F715F58ACF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D63E53E4-A458-4C2F-914D-92F715F58ACF}.Release|Any CPU.Build.0 = Release|Any CPU - {2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2}.Release|Any CPU.Build.0 = Release|Any CPU - {851A1CB8-3CEB-41B4-956F-34D760D2A8E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {851A1CB8-3CEB-41B4-956F-34D760D2A8E5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {851A1CB8-3CEB-41B4-956F-34D760D2A8E5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {851A1CB8-3CEB-41B4-956F-34D760D2A8E5}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3221EB9F-EE08-460E-B236-CD594688FC5F} - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - StartupItem = Duplicati\CommandLine\Duplicati.CommandLine.csproj - Policies = $0 - $0.StandardHeader = $1 - $1.Text = @ Copyright (C) 2013, The Duplicati Team\r\n http://www.duplicati.com, info@duplicati.com\n \n This library is free software; you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as\n published by the Free Software Foundation; either version 2.1 of the\n License, or (at your option) any later version.\n\n This library is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public\n License along with this library; if not, write to the Free Software\n Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $1.IncludeInNewFiles = True - $0.DotNetNamingPolicy = $2 - $2.DirectoryNamespaceAssociation = PrefixedHierarchical - $2.ResourceNamePolicy = FileFormatDefault - $0.TextStylePolicy = $5 - $3.inheritsSet = VisualStudio - $3.scope = text/plain - $3.FileWidth = 120 - $3.EolMarker = Windows - $3.inheritsScope = text/plain - $0.CSharpFormattingPolicy = $4 - $4.IndentSwitchBody = True - $4.AnonymousMethodBraceStyle = NextLine - $4.PropertyBraceStyle = NextLine - $4.PropertyGetBraceStyle = NextLine - $4.PropertySetBraceStyle = NextLine - $4.EventBraceStyle = NextLine - $4.EventAddBraceStyle = NextLine - $4.EventRemoveBraceStyle = NextLine - $4.StatementBraceStyle = NextLine - $4.ElseNewLinePlacement = NewLine - $4.ElseIfNewLinePlacement = SameLine - $4.CatchNewLinePlacement = NewLine - $4.FinallyNewLinePlacement = NewLine - $4.BeforeMethodDeclarationParentheses = False - $4.BeforeMethodCallParentheses = False - $4.BeforeConstructorDeclarationParentheses = False - $4.BeforeIndexerDeclarationBracket = False - $4.BeforeDelegateDeclarationParentheses = False - $4.NewParentheses = False - $4.ForParentheses = False - $4.ForeachParentheses = False - $4.LockParentheses = False - $4.UsingParentheses = False - $4.SpacesBeforeBrackets = False - $4.inheritsSet = Mono - $4.inheritsScope = text/x-csharp - $4.scope = text/x-csharp - $5.FileWidth = 120 - $5.EolMarker = Windows - $5.inheritsSet = VisualStudio - $5.inheritsScope = text/plain - $5.scope = text/plain - EndGlobalSection - GlobalSection(SubversionScc) = preSolution - Svn-Managed = True - Manager = AnkhSVN - Subversion Support for Visual Studio - EndGlobalSection -EndGlobal From 63d8ab7c119404c7235587bd1aecb391aee7fc81 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Thu, 1 Apr 2021 22:37:26 +0200 Subject: [PATCH 136/253] Changed all non-entry methods to use `netstandard2.1` --- .../Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj | 2 +- .../Duplicati.Library.Backend.AlternativeFTP.csproj | 2 +- .../AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj | 2 +- .../Backblaze/Duplicati.Library.Backend.Backblaze.csproj | 2 +- .../Library/Backend/Box/Duplicati.Library.Backend.Box.csproj | 2 +- .../CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj | 2 +- .../Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj | 2 +- .../Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj | 2 +- .../Backend/File/Duplicati.Library.Backend.File.csproj | 2 +- .../Duplicati.Library.Backend.GoogleServices.csproj | 2 +- .../Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj | 2 +- .../Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj | 2 +- .../Backend/Mega/Duplicati.Library.Backend.Mega.csproj | 2 +- .../Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj | 2 +- .../OneDrive/Duplicati.Library.Backend.OneDrive.csproj | 2 +- .../OpenStack/Duplicati.Library.Backend.OpenStack.csproj | 2 +- .../Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj | 2 +- .../Library/Backend/S3/Duplicati.Library.Backend.S3.csproj | 2 +- .../Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj | 2 +- .../SharePoint/Duplicati.Library.Backend.SharePoint.csproj | 2 +- .../Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj | 2 +- .../TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj | 2 +- .../Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj | 2 +- .../TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj | 2 +- .../Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj | 2 +- Duplicati/Library/Common/Duplicati.Library.Common.csproj | 2 +- .../Library/Compression/Duplicati.Library.Compression.csproj | 2 +- .../DynamicLoader/Duplicati.Library.DynamicLoader.csproj | 2 +- .../Library/Encryption/Duplicati.Library.Encryption.csproj | 2 +- .../Library/Interface/Duplicati.Library.Interface.csproj | 2 +- .../Localization/Duplicati.Library.Localization.csproj | 2 +- Duplicati/Library/Logging/Duplicati.Library.Logging.csproj | 2 +- Duplicati/Library/Main/Duplicati.Library.Main.csproj | 2 +- .../Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj | 2 +- .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 2 +- .../Library/Snapshots/Duplicati.Library.Snapshots.csproj | 2 +- .../UsageReporter/Duplicati.Library.UsageReporter.csproj | 2 +- Duplicati/Library/Utility/Duplicati.Library.Utility.csproj | 2 +- Duplicati/License/Duplicati.License.csproj | 2 +- .../Duplicati.Server.Serialization.csproj | 2 +- Duplicati/Tools/Duplicati.Tools.csproj | 2 +- Installer/Windows/UpdateVersion/UpdateVersion.csproj | 4 ++-- thirdparty/UnixSupport/UnixSupport.csproj | 3 +-- 43 files changed, 44 insertions(+), 45 deletions(-) diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 86baeb948..4c26b01ee 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 Library LGPL, Copyright © Duplicati Team 2019 diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 273743324..986034145 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 Library LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index aca37804f..05ab47579 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index c3c296c04..51bf59670 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 0052d3925..26a0ec5e6 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index a274b01e0..7cc1b0eb7 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index d04bb0a7b..03b456f36 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index 66530b9cb..725c7c2a7 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index eb3a3d20e..be7f17605 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 3c6001d96..901627186 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index 04e59504f..a3b5f8b01 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index 2e4217635..6812728f2 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 3dd6f475c..4de7f9c3e 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index d0c280bc1..338241538 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 88719452c..f52e00447 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index 6011b53ab..e6f7aaf05 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 4f7762999..9b1792930 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index ccf857a30..bd9b7ffd2 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index 14759cc2a..30237db02 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index 3264f4dca..ddcee7f22 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index 29a93757f..ef25d86fe 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index e6559e3f9..118f70c18 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj index 273ffbd96..d7756b3c4 100644 --- a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj +++ b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj index e6e6a144b..e597a5538 100644 --- a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj +++ b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj @@ -1,6 +1,6 @@  - net5.0 + netstandard2.1 Library false diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index eee4b310b..ca03fda67 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 9dc3ebe9a..4d349bc93 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 6598e1720..c82f34cfb 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index af060a4d8..4c73e6cab 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -1,7 +1,7 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index a0b644641..a0a1673a6 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 708fe64ad..1fbbd9802 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index e6e2ccc36..1d188fd8c 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index c1cc80145..d579b72e2 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -1,6 +1,6 @@ - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index cda82e7b4..5c44f0dab 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 3cffc6061..791587b75 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index c399c83cc..fb9c14642 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 12e3413ad..4b6f400ac 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 Duplicati.Library.Snapshots diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index 3808375fc..1222b4a9b 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index ce2979d00..66db802da 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index e29878d9d..b70a13fc4 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 66a40599e..8cf2f5d94 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright ? Duplicati Team 2015 diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index 4a7766ead..edd10e9c6 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -1,7 +1,7 @@  - net5.0 + netstandard2.1 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/Installer/Windows/UpdateVersion/UpdateVersion.csproj b/Installer/Windows/UpdateVersion/UpdateVersion.csproj index 584c56439..4b2fbf8ad 100644 --- a/Installer/Windows/UpdateVersion/UpdateVersion.csproj +++ b/Installer/Windows/UpdateVersion/UpdateVersion.csproj @@ -1,10 +1,10 @@ - net5.0 + netstandard2.1 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright � Duplicati Team 2015 UpdateVersion UpdateVersion Duplicati Team diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/thirdparty/UnixSupport/UnixSupport.csproj index 791eb952e..ad63ee160 100644 --- a/thirdparty/UnixSupport/UnixSupport.csproj +++ b/thirdparty/UnixSupport/UnixSupport.csproj @@ -1,9 +1,8 @@  - net5.0 + netstandard2.1 2.0.0.7 - Exe LGPL, Copyright © Duplicati Team 2015 UnixSupport Duplicati Team From bd172d39c87704d1eb8815850add9ef49cdbcdbb Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Thu, 1 Apr 2021 22:38:34 +0200 Subject: [PATCH 137/253] Disabled auto-updater as re-launching does not work the same way with .net5 --- .../Library/AutoUpdater/UpdaterManager.cs | 210 +++++++++--------- 1 file changed, 106 insertions(+), 104 deletions(-) diff --git a/Duplicati/Library/AutoUpdater/UpdaterManager.cs b/Duplicati/Library/AutoUpdater/UpdaterManager.cs index 487650597..960b0cd91 100644 --- a/Duplicati/Library/AutoUpdater/UpdaterManager.cs +++ b/Duplicati/Library/AutoUpdater/UpdaterManager.cs @@ -452,109 +452,109 @@ namespace Duplicati.Library.AutoUpdater try { using (var tempfile = System.IO.File.Open(tempfilename, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) - { - Action cb = null; - if (progress != null) - cb = (s) => { progress(Math.Min(1.0, Math.Max(0.0, (double)s / version.CompressedSize))); }; - - var wreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); - wreq.UserAgent = string.Format("{0} v{1}", APPNAME, SelfVersion.Version); - wreq.Headers.Add("X-Install-ID", InstallID); - - var areq = new Duplicati.Library.Utility.AsyncHttpRequest(wreq); - using (var resp = areq.GetResponse()) - using (var rss = areq.GetResponseStream()) - using (var pgs = new Duplicati.Library.Utility.ProgressReportingStream(rss, cb)) - { - Duplicati.Library.Utility.Utility.CopyStream(pgs, tempfile); - } - - var sha256 = System.Security.Cryptography.SHA256.Create(); - var md5 = System.Security.Cryptography.MD5.Create(); - - if (tempfile.Length != version.CompressedSize) - throw new Exception(string.Format("Invalid file size {0}, expected {1} for {2}", tempfile.Length, version.CompressedSize, url)); - - tempfile.Position = 0; - var sha256hash = Convert.ToBase64String(sha256.ComputeHash(tempfile)); - if (sha256hash != version.SHA256) - throw new Exception(string.Format("Damaged or corrupted file, sha256 mismatch for {0}", url)); - - - tempfile.Position = 0; - var md5hash = Convert.ToBase64String(md5.ComputeHash(tempfile)); - if (md5hash != version.MD5) - throw new Exception(string.Format("Damaged or corrupted file, md5 mismatch for {0}", url)); - - tempfile.Position = 0; - using (var tempfolder = new Duplicati.Library.Utility.TempFolder()) - using (ICompression zip = new Duplicati.Library.Compression.FileArchiveZip(tempfile, ArchiveMode.Read, new Dictionary())) - { - foreach (var file in zip.ListFilesWithSize("")) - { - if (System.IO.Path.IsPathRooted(file.Key) || file.Key.Trim().StartsWith("..", StringComparison.OrdinalIgnoreCase)) - throw new Exception(string.Format("Out-of-place file path detected: {0}", file.Key)); - - var targetpath = System.IO.Path.Combine(tempfolder, file.Key); - var targetfolder = System.IO.Path.GetDirectoryName(targetpath); - if (!System.IO.Directory.Exists(targetfolder)) - System.IO.Directory.CreateDirectory(targetfolder); - - using (var zs = zip.OpenRead(file.Key)) - using (var fs = System.IO.File.Create(targetpath)) - zs.CopyTo(fs); - } - - if (VerifyUnpackedFolder(tempfolder, version)) - { - var versionstring = TryParseVersion(version.Version).ToString(); - var targetfolder = System.IO.Path.Combine(INSTALLDIR, versionstring); - if (System.IO.Directory.Exists(targetfolder)) - System.IO.Directory.Delete(targetfolder, true); - - System.IO.Directory.CreateDirectory(targetfolder); - - var tempfolderpath = Util.AppendDirSeparator(tempfolder); - var tempfolderlength = tempfolderpath.Length; - - // Would be nice, but does not work :( - //System.IO.Directory.Move(tempfolder, targetfolder); - - foreach (var e in Duplicati.Library.Utility.Utility.EnumerateFileSystemEntries(tempfolder)) - { - var relpath = e.Substring(tempfolderlength); - if (string.IsNullOrWhiteSpace(relpath)) - continue; - - var fullpath = System.IO.Path.Combine(targetfolder, relpath); - if (relpath.EndsWith(Util.DirectorySeparatorString, StringComparison.Ordinal)) - System.IO.Directory.CreateDirectory(fullpath); - else - System.IO.File.Copy(e, fullpath); - } - - // Verification will kick in when we list the installed updates - //VerifyUnpackedFolder(targetfolder, version); - System.IO.File.WriteAllText(System.IO.Path.Combine(INSTALLDIR, CURRENT_FILE), versionstring); - - m_hasUpdateInstalled = null; - - var obsolete = (from n in FindInstalledVersions() - where n.Value.Version != version.Version && n.Value.Version != SelfVersion.Version - let x = TryParseVersion(n.Value.Version) - orderby x descending - select n).Skip(1).ToArray(); - - foreach (var f in obsolete) - try { System.IO.Directory.Delete(f.Key, true); } - catch { } - - return true; - } - else - { - throw new Exception(string.Format("Unable to verify unpacked folder for url: {0}", url)); - } + { + Action cb = null; + if (progress != null) + cb = (s) => { progress(Math.Min(1.0, Math.Max(0.0, (double)s / version.CompressedSize))); }; + + var wreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); + wreq.UserAgent = string.Format("{0} v{1}", APPNAME, SelfVersion.Version); + wreq.Headers.Add("X-Install-ID", InstallID); + + var areq = new Duplicati.Library.Utility.AsyncHttpRequest(wreq); + using (var resp = areq.GetResponse()) + using (var rss = areq.GetResponseStream()) + using (var pgs = new Duplicati.Library.Utility.ProgressReportingStream(rss, cb)) + { + Duplicati.Library.Utility.Utility.CopyStream(pgs, tempfile); + } + + var sha256 = System.Security.Cryptography.SHA256.Create(); + var md5 = System.Security.Cryptography.MD5.Create(); + + if (tempfile.Length != version.CompressedSize) + throw new Exception(string.Format("Invalid file size {0}, expected {1} for {2}", tempfile.Length, version.CompressedSize, url)); + + tempfile.Position = 0; + var sha256hash = Convert.ToBase64String(sha256.ComputeHash(tempfile)); + if (sha256hash != version.SHA256) + throw new Exception(string.Format("Damaged or corrupted file, sha256 mismatch for {0}", url)); + + + tempfile.Position = 0; + var md5hash = Convert.ToBase64String(md5.ComputeHash(tempfile)); + if (md5hash != version.MD5) + throw new Exception(string.Format("Damaged or corrupted file, md5 mismatch for {0}", url)); + + tempfile.Position = 0; + using (var tempfolder = new Duplicati.Library.Utility.TempFolder()) + using (ICompression zip = new Duplicati.Library.Compression.FileArchiveZip(tempfile, ArchiveMode.Read, new Dictionary())) + { + foreach (var file in zip.ListFilesWithSize("")) + { + if (System.IO.Path.IsPathRooted(file.Key) || file.Key.Trim().StartsWith("..", StringComparison.OrdinalIgnoreCase)) + throw new Exception(string.Format("Out-of-place file path detected: {0}", file.Key)); + + var targetpath = System.IO.Path.Combine(tempfolder, file.Key); + var targetfolder = System.IO.Path.GetDirectoryName(targetpath); + if (!System.IO.Directory.Exists(targetfolder)) + System.IO.Directory.CreateDirectory(targetfolder); + + using (var zs = zip.OpenRead(file.Key)) + using (var fs = System.IO.File.Create(targetpath)) + zs.CopyTo(fs); + } + + if (VerifyUnpackedFolder(tempfolder, version)) + { + var versionstring = TryParseVersion(version.Version).ToString(); + var targetfolder = System.IO.Path.Combine(INSTALLDIR, versionstring); + if (System.IO.Directory.Exists(targetfolder)) + System.IO.Directory.Delete(targetfolder, true); + + System.IO.Directory.CreateDirectory(targetfolder); + + var tempfolderpath = Util.AppendDirSeparator(tempfolder); + var tempfolderlength = tempfolderpath.Length; + + // Would be nice, but does not work :( + //System.IO.Directory.Move(tempfolder, targetfolder); + + foreach (var e in Duplicati.Library.Utility.Utility.EnumerateFileSystemEntries(tempfolder)) + { + var relpath = e.Substring(tempfolderlength); + if (string.IsNullOrWhiteSpace(relpath)) + continue; + + var fullpath = System.IO.Path.Combine(targetfolder, relpath); + if (relpath.EndsWith(Util.DirectorySeparatorString, StringComparison.Ordinal)) + System.IO.Directory.CreateDirectory(fullpath); + else + System.IO.File.Copy(e, fullpath); + } + + // Verification will kick in when we list the installed updates + //VerifyUnpackedFolder(targetfolder, version); + System.IO.File.WriteAllText(System.IO.Path.Combine(INSTALLDIR, CURRENT_FILE), versionstring); + + m_hasUpdateInstalled = null; + + var obsolete = (from n in FindInstalledVersions() + where n.Value.Version != version.Version && n.Value.Version != SelfVersion.Version + let x = TryParseVersion(n.Value.Version) + orderby x descending + select n).Skip(1).ToArray(); + + foreach (var f in obsolete) + try { System.IO.Directory.Delete(f.Key, true); } + catch { } + + return true; + } + else + { + throw new Exception(string.Format("Unable to verify unpacked folder for url: {0}", url)); + } } } } @@ -1075,7 +1075,9 @@ namespace Duplicati.Library.AutoUpdater public static int RunFromMostRecent(System.Reflection.MethodInfo method, string[] cmdargs, AutoUpdateStrategy defaultstrategy = AutoUpdateStrategy.CheckDuring) { - return RunFromMostRecentSpawn(method, cmdargs, defaultstrategy); + // TODO: Disabled auto-updater as it does not currently work + return RunMethod(method, cmdargs); + //return RunFromMostRecentSpawn(method, cmdargs, defaultstrategy); } public static int RunFromMostRecentSpawn(System.Reflection.MethodInfo method, string[] cmdargs, AutoUpdateStrategy defaultstrategy = AutoUpdateStrategy.CheckDuring) From 400fa2a7d11497cff6f8e368eb5d5cbb14a4235f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 24 Mar 2021 07:14:52 -0700 Subject: [PATCH 138/253] MSI environment test --- .github/workflows/artifacts.yml | 35 ++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 64b00cdb8..747f13314 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -7,7 +7,7 @@ on: branches: [ net5 ] jobs: - Zip: + zip: runs-on: ${{ matrix.cfg.os }} strategy: fail-fast: false @@ -33,7 +33,7 @@ jobs: with: name: duplicati-${{ matrix.cfg.runtime }} path: publish - Deb: + deb: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -44,4 +44,33 @@ jobs: with: name: deb package path: duplicati*.deb - \ No newline at end of file + msi: + runs-on: windows-latest + needs: zip + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Download zip + uses: actions/download-artifact@v2 + with: + name: duplicati-win-x64 + - name: Install go-msi + run: choco install -y "go-msi" + - name: Prepare PATH + shell: bash + run: | + echo "$WIX\\bin" >> $GITHUB_PATH + echo "C:\\Program Files\\go-msi" >> $GITHUB_PATH + - name: Build MSI + id: buildmsi + shell: bash + run: | + mkdir -p build + msi="duplicati-win-x64.msi" + printf "::set-output name=msi::%s\n" "$msi" + go-msi make --msi "$PWD/$msi" --out "$PWD/build" --version "${GITHUB_REF#refs/tags/}" + - name: Save Artifacts + uses: actions/upload-artifact@v2 + with: + name: duplicati-win-x64-msi + path: msi #${{ steps.buildmsi.outputs.msi }} From a7eed0a5184a86bc6562c433d73b476e75b27849 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 1 Apr 2021 08:08:40 -0700 Subject: [PATCH 139/253] MSI work --- .github/workflows/artifacts.yml | 13 +- Installer/Windows/MSI/build.sh | 12 ++ .../MSI/templates/LicenseAgreementDlg_HK.wxs | 36 +++++ Installer/Windows/MSI/templates/WixUI_HK.wxs | 65 ++++++++ .../Windows/MSI/templates/choco/LICENSE.txt | 9 ++ .../MSI/templates/choco/VERIFICATION.txt | 10 ++ .../MSI/templates/choco/chocolateyInstall.ps1 | 7 + .../templates/choco/chocolateyUninstall.ps1 | 6 + .../Windows/MSI/templates/choco/pkg.nuspec | 38 +++++ Installer/Windows/MSI/templates/product.wxs | 142 ++++++++++++++++++ Installer/Windows/MSI/wix.json | 34 +++++ 11 files changed, 367 insertions(+), 5 deletions(-) create mode 100644 Installer/Windows/MSI/build.sh create mode 100644 Installer/Windows/MSI/templates/LicenseAgreementDlg_HK.wxs create mode 100644 Installer/Windows/MSI/templates/WixUI_HK.wxs create mode 100644 Installer/Windows/MSI/templates/choco/LICENSE.txt create mode 100644 Installer/Windows/MSI/templates/choco/VERIFICATION.txt create mode 100644 Installer/Windows/MSI/templates/choco/chocolateyInstall.ps1 create mode 100644 Installer/Windows/MSI/templates/choco/chocolateyUninstall.ps1 create mode 100644 Installer/Windows/MSI/templates/choco/pkg.nuspec create mode 100644 Installer/Windows/MSI/templates/product.wxs create mode 100644 Installer/Windows/MSI/wix.json diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 747f13314..eac7a05a5 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -54,6 +54,12 @@ jobs: uses: actions/download-artifact@v2 with: name: duplicati-win-x64 + - name: Unpack zip + shell: bash + run: | + mkdir -p bin + cd bin + unzip -o ../duplicati-win-x64.zip - name: Install go-msi run: choco install -y "go-msi" - name: Prepare PATH @@ -65,12 +71,9 @@ jobs: id: buildmsi shell: bash run: | - mkdir -p build - msi="duplicati-win-x64.msi" - printf "::set-output name=msi::%s\n" "$msi" - go-msi make --msi "$PWD/$msi" --out "$PWD/build" --version "${GITHUB_REF#refs/tags/}" + Installer/Windows/MSI/build.sh - name: Save Artifacts uses: actions/upload-artifact@v2 with: name: duplicati-win-x64-msi - path: msi #${{ steps.buildmsi.outputs.msi }} + path: duplicati-win-x64.msi diff --git a/Installer/Windows/MSI/build.sh b/Installer/Windows/MSI/build.sh new file mode 100644 index 000000000..5265bf030 --- /dev/null +++ b/Installer/Windows/MSI/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash +#This is a helper to make the msi. It assumes a bin folder exists a the root of the project with an unzipped install + +SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) + +VERSION=`grep '' < $SCRIPTDIR/../../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\([^\.]*\.[^\.]*\.[^\.]*\).*<\/Version>.*/\1/'` +VERSION=${VERSION//$'\r\n'} +echo "Building version: ($VERSION)" + +cd $SCRIPTDIR/../../../ + +go-msi make --msi `pwd`/duplicati-win-x64.msi --out `pwd`/build --version $VERSION --path Installer/Windows/MSI/wix.json --src Installer/Windows/MSI/templates \ No newline at end of file diff --git a/Installer/Windows/MSI/templates/LicenseAgreementDlg_HK.wxs b/Installer/Windows/MSI/templates/LicenseAgreementDlg_HK.wxs new file mode 100644 index 000000000..6fa2469ca --- /dev/null +++ b/Installer/Windows/MSI/templates/LicenseAgreementDlg_HK.wxs @@ -0,0 +1,36 @@ + + + + + + + + + + CostingComplete = 1 + "1"]]> + LicenseAccepted = "1" + + + 1 + + + + + {{if gt (.License | len) 0}} + + {{end}} + + + + 1 + + + + + + + + + diff --git a/Installer/Windows/MSI/templates/WixUI_HK.wxs b/Installer/Windows/MSI/templates/WixUI_HK.wxs new file mode 100644 index 000000000..cda1b3df9 --- /dev/null +++ b/Installer/Windows/MSI/templates/WixUI_HK.wxs @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + "1"]]> + + 1 + + NOT Installed + Installed AND PATCH + + 1 + LicenseAccepted = "1" + + 1 + 1 + NOT WIXUI_DONTVALIDATEPATH + "1"]]> + WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1" + + 1 + 1 + + Installed + + 1 + + 1 + 1 + 1 + + + + + diff --git a/Installer/Windows/MSI/templates/choco/LICENSE.txt b/Installer/Windows/MSI/templates/choco/LICENSE.txt new file mode 100644 index 000000000..c10af6d11 --- /dev/null +++ b/Installer/Windows/MSI/templates/choco/LICENSE.txt @@ -0,0 +1,9 @@ +From: {{.Choco.LicenseURL}} + +LICENSE + +{{if gt (.License | len) 0}} +{{.License | cat}} +{{else if gt (.Choco.LicenseURL | len) 0}} +{{.Choco.LicenseURL | download}} +{{end}} diff --git a/Installer/Windows/MSI/templates/choco/VERIFICATION.txt b/Installer/Windows/MSI/templates/choco/VERIFICATION.txt new file mode 100644 index 000000000..7c399c93f --- /dev/null +++ b/Installer/Windows/MSI/templates/choco/VERIFICATION.txt @@ -0,0 +1,10 @@ +VERIFICATION + +To check the checksum of this package, extract the msi file contained into it, +then run + + checksum.exe {{.Choco.MsiFile}} -t=sha256 + +The result must match + + {{.Choco.MsiSum | upper}} diff --git a/Installer/Windows/MSI/templates/choco/chocolateyInstall.ps1 b/Installer/Windows/MSI/templates/choco/chocolateyInstall.ps1 new file mode 100644 index 000000000..de61669cc --- /dev/null +++ b/Installer/Windows/MSI/templates/choco/chocolateyInstall.ps1 @@ -0,0 +1,7 @@ +$packageName = '{{.Choco.ID}}' +$fileType = 'msi' +$silentArgs = '/quiet'; +$scriptPath = $(Split-Path $MyInvocation.MyCommand.Path); +$fileFullPath = Join-Path $scriptPath '{{.Choco.MsiFile}}'; + +Install-ChocolateyInstallPackage $packageName $fileType $silentArgs $fileFullPath -checksum '{{.Choco.MsiSum}}' -checksumType = 'sha256' diff --git a/Installer/Windows/MSI/templates/choco/chocolateyUninstall.ps1 b/Installer/Windows/MSI/templates/choco/chocolateyUninstall.ps1 new file mode 100644 index 000000000..d4b26d054 --- /dev/null +++ b/Installer/Windows/MSI/templates/choco/chocolateyUninstall.ps1 @@ -0,0 +1,6 @@ +$packageName = "{{.Choco.ID}}"; +$fileType = 'msi'; +$scriptPath = $(Split-Path $MyInvocation.MyCommand.Path); +$fileFullPath = Join-Path $scriptPath '{{.Choco.MsiFile}}'; + +Uninstall-ChocolateyPackage $packageName $fileType "$fileFullPath /q" diff --git a/Installer/Windows/MSI/templates/choco/pkg.nuspec b/Installer/Windows/MSI/templates/choco/pkg.nuspec new file mode 100644 index 000000000..f1ed73102 --- /dev/null +++ b/Installer/Windows/MSI/templates/choco/pkg.nuspec @@ -0,0 +1,38 @@ + + + + {{.Choco.ID}} + {{.Choco.Title}} + {{.VersionOk}} + {{.Choco.Authors}} + {{.Choco.Owners}} + {{.Choco.Description}} + {{if gt (.Choco.ProjectURL | len) 0}} + {{.Choco.ProjectURL}} + {{end}} + {{if gt (.Choco.Tags | len) 0}} + {{.Choco.Tags}} + {{end}} + {{if gt (.Choco.LicenseURL | len) 0}} + {{.Choco.LicenseURL}} + {{end}} + {{if gt (.Choco.IconURL | len) 0}} + {{.Choco.IconURL}} + {{end}} + {{if gt (.Choco.ChangeLog | len) 0}} + {{.Choco.ChangeLog}} + {{end}} + {{if .Choco.RequireLicense}} + true + {{else}} + false + {{end}} + + + + + + + + + diff --git a/Installer/Windows/MSI/templates/product.wxs b/Installer/Windows/MSI/templates/product.wxs new file mode 100644 index 000000000..d035d42d0 --- /dev/null +++ b/Installer/Windows/MSI/templates/product.wxs @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + NOT NEWERVERSIONDETECTED + + + + + + {{if gt (.Files.Items | len) 0}} + + {{range $i, $e := .Files.Items}} + + {{end}} + + {{end}} + {{if gt (.Directories | len) 0}} + {{range $i, $e := .Directories}} + + {{end}} + {{end}} + + + + {{if gt (.Env.Vars | len) 0}} + + {{range $i, $e := .Env.Vars}} + + {{end}} + + {{end}} + + {{if gt (.Shortcuts.Items | len) 0}} + + + + {{range $i, $e := .Shortcuts.Items}} + + {{if gt ($e.Icon | len) 0}} + + {{end}} + + + {{end}} + + + + + {{end}} + + + + {{range $i, $e := .InstallHooks}} + + + {{end}} + {{range $i, $e := .UninstallHooks}} + + + {{end}} + + + {{range $i, $e := .InstallHooks}} + NOT Installed AND NOT REMOVE + {{end}} + {{range $i, $e := .UninstallHooks}} + REMOVE ~= "ALL" + {{end}} + + + + {{if gt (.Env.Vars | len) 0}} + + {{end}} + {{if gt (.Files.Items | len) 0}} + + {{end}} + {{if gt (.Shortcuts.Items | len) 0}} + + {{end}} + {{range $i, $e := .Directories}} + + {{end}} + + + + + + + + + + + + + + + + + + diff --git a/Installer/Windows/MSI/wix.json b/Installer/Windows/MSI/wix.json new file mode 100644 index 000000000..68b720ccb --- /dev/null +++ b/Installer/Windows/MSI/wix.json @@ -0,0 +1,34 @@ +{ + "product": "Duplicati", + "company": "duplicati", + "license": "LICENSE.txt", + "upgrade-code": "69163125-be0b-407e-b65d-80f7023524db", + "files": { + "guid": "95dd9d6c-89e7-4fc7-bfdc-708ffa99c68d", + "items": [ + "bin/Duplicati.GUI.TrayIcon.exe" + ] + }, + "directories": [ + "bin" + ], + "shortcuts": { + "guid": "19455e18-67ec-4ace-9c70-0aa48be5b815", + "items": [ + { + "name": "Duplicati", + "description": "Launch Duplicati", + "target": "[INSTALLDIR]\\Duplicati.GUI.TrayIcon.exe", + "wdir": "INSTALLDIR", + "arguments": "", + "icon": "Assets/application icon/application_icon.ico" + } + ] + }, + "choco": { + "description": "Free backup software to store encrypted backups online", + "project-url": "https://www.duplicati.com/", + "tags": "backup", + "license-url": "https://github.com/duplicati/duplicati/blob/master/LICENSE.txt" + } +} \ No newline at end of file From 4c6439c5073bc9e9784ab5380f02ee16885c0500 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 1 Apr 2021 19:25:55 -0700 Subject: [PATCH 140/253] debugging --- .github/workflows/artifacts.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index eac7a05a5..81e822d2e 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -58,6 +58,8 @@ jobs: shell: bash run: | mkdir -p bin + pwd + ls cd bin unzip -o ../duplicati-win-x64.zip - name: Install go-msi From 6810f410d38b51a723f896a2a804c5ccd480c5b6 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 1 Apr 2021 20:25:37 -0700 Subject: [PATCH 141/253] Fix shortcut --- Installer/Windows/MSI/wix.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Installer/Windows/MSI/wix.json b/Installer/Windows/MSI/wix.json index 68b720ccb..786fa3701 100644 --- a/Installer/Windows/MSI/wix.json +++ b/Installer/Windows/MSI/wix.json @@ -6,7 +6,6 @@ "files": { "guid": "95dd9d6c-89e7-4fc7-bfdc-708ffa99c68d", "items": [ - "bin/Duplicati.GUI.TrayIcon.exe" ] }, "directories": [ @@ -18,7 +17,7 @@ { "name": "Duplicati", "description": "Launch Duplicati", - "target": "[INSTALLDIR]\\Duplicati.GUI.TrayIcon.exe", + "target": "[INSTALLDIR]\\bin\\Duplicati.GUI.TrayIcon.exe", "wdir": "INSTALLDIR", "arguments": "", "icon": "Assets/application icon/application_icon.ico" From 753f61ee1fd0e3aff8186371b2e9fbd5ae2929ea Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 1 Apr 2021 21:03:11 -0700 Subject: [PATCH 142/253] Don't stop at the debugger in release builds * Also don't show a terminal window for the trayicon --- .gitignore | 1 + .../GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 4 +--- Duplicati/Server/Program.cs | 2 ++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index f2c3e652e..359f8d818 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ changelog-news.txt binfiles.wxs .idea/ .vs/ +/publish/ Installer/debian/*.buildinfo /*.deb diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index f19073565..093cd3726 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,7 +1,7 @@  - Exe + WinExe net5.0 2.0.0.7 LGPL, Copyright ? Duplicati Team 2019 @@ -14,8 +14,6 @@ Duplicati.GUI.TrayIcon Duplicati.ico Duplicati.GUI.TrayIcon.Program - - diff --git a/Duplicati/Server/Program.cs b/Duplicati/Server/Program.cs index 1c3ed0b7e..c2c731da2 100644 --- a/Duplicati/Server/Program.cs +++ b/Duplicati/Server/Program.cs @@ -177,7 +177,9 @@ namespace Duplicati.Server public static int RealMain(string[] _args) { +#if DEBUG System.Diagnostics.Debugger.Launch(); +#endif //If we are on Windows, append the bundled "win-tools" programs to the search path //We add it last, to allow the user to override with other versions From 90ac3c1cef64728ebc4ce658bdac990afc5cc792 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 2 Apr 2021 06:36:33 -0700 Subject: [PATCH 143/253] it already is unzipped --- .github/workflows/artifacts.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 81e822d2e..374770747 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -54,14 +54,7 @@ jobs: uses: actions/download-artifact@v2 with: name: duplicati-win-x64 - - name: Unpack zip - shell: bash - run: | - mkdir -p bin - pwd - ls - cd bin - unzip -o ../duplicati-win-x64.zip + path: bin - name: Install go-msi run: choco install -y "go-msi" - name: Prepare PATH From f73d736f54b8aed27b4e367d63d69a104a32edf6 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 2 Apr 2021 06:52:55 -0700 Subject: [PATCH 144/253] Add rpm build --- .github/workflows/artifacts.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 374770747..35ef0a3cf 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -44,6 +44,17 @@ jobs: with: name: deb package path: duplicati*.deb + rpm: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Package + run: Installer/fedora/build.sh + - name: Save Artifacts + uses: actions/upload-artifact@v2 + with: + name: rpm package + path: duplicati*.rpm msi: runs-on: windows-latest needs: zip From 11e4d35efb89afbf8bae00f7ae2aca6c7668ff38 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 2 Apr 2021 06:54:15 -0700 Subject: [PATCH 145/253] Fix execute bit --- Installer/fedora/build.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 Installer/fedora/build.sh diff --git a/Installer/fedora/build.sh b/Installer/fedora/build.sh old mode 100644 new mode 100755 From 842fc6dbaef455ae26b1e6c4fa74e371adeb700c Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 2 Apr 2021 07:15:56 -0700 Subject: [PATCH 146/253] More execute bit --- Installer/fedora/docker/runner.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 Installer/fedora/docker/runner.sh diff --git a/Installer/fedora/docker/runner.sh b/Installer/fedora/docker/runner.sh old mode 100644 new mode 100755 From 425a9d23dcdca7d87404387b7e3e57b3c76a29f3 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 2 Apr 2021 18:13:06 -0700 Subject: [PATCH 147/253] Fix change in sdk location --- Installer/fedora/docker/Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Installer/fedora/docker/Dockerfile b/Installer/fedora/docker/Dockerfile index 01bfb6c19..e94c92208 100644 --- a/Installer/fedora/docker/Dockerfile +++ b/Installer/fedora/docker/Dockerfile @@ -4,8 +4,9 @@ FROM fedora:33 RUN dnf -y install deltarpm RUN dnf -y upgrade -RUN rpm --import https://packages.microsoft.com/keys/microsoft.asc -RUN curl --output /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/33/prod.repo +#No Longer needed +#RUN rpm --import https://packages.microsoft.com/keys/microsoft.asc +#RUN curl --output /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/33/prod.repo RUN dnf check-update RUN dnf -y --allowerasing install @"Minimal Install" @buildsys-build yum-utils rpm-sign gnupg rpmdevtools desktop-file-utils dos2unix dotnet-sdk-5.0 From 8892ff7df3ecbc47f08d32cdb18d4ad50ecbb679 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sat, 3 Apr 2021 13:57:02 +0200 Subject: [PATCH 148/253] Cleaned up all `.csproj` files. Moved things around to make cleaner build files. Implementing everything with `netstandard2.1` and then thin wrapper executables using .net5 --- Duplicati.sln | 93 ++++++++++++-- .../Duplicati.CommandLine.AutoUpdater.csproj | 20 +-- ...Duplicati.CommandLine.BackendTester.csproj | 30 +---- .../CommandLine/BackendTester/Program.cs | 2 +- .../Duplicati.CommandLine.BackendTool.csproj | 20 +-- Duplicati/CommandLine/BackendTool/Program.cs | 2 +- Duplicati/CommandLine/{ => CLI}/Commands.cs | 0 .../CommandLine/{ => CLI}/ConsoleOutput.cs | 0 .../CLI/Duplicati.CommandLine.csproj | 101 ++++++++++++++++ Duplicati/CommandLine/{ => CLI}/Help.cs | 0 Duplicati/CommandLine/{ => CLI}/Program.cs | 1 - Duplicati/CommandLine/{ => CLI}/Strings.cs | 0 .../CommandLine/{ => CLI}/TrayWarning.ico | Bin Duplicati/CommandLine/{ => CLI}/help.txt | 0 ...i.CommandLine.ConfigurationImporter.csproj | 20 +-- .../ConfigurationImporter/Program.cs | 4 +- .../CommandLine/Duplicati.CommandLine.csproj | 114 ------------------ .../Duplicati.CommandLine.RecoveryTool.csproj | 20 +-- .../Duplicati.GUI.TrayIcon.csproj | 27 +---- .../Duplicati.Library.AutoUpdater.csproj | 14 +-- ...cati.Library.Backend.AlternativeFTP.csproj | 14 +-- ...Duplicati.Library.Backend.AzureBlob.csproj | 14 +-- ...Duplicati.Library.Backend.Backblaze.csproj | 14 +-- .../Box/Duplicati.Library.Backend.Box.csproj | 14 +-- ...uplicati.Library.Backend.CloudFiles.csproj | 17 +-- .../Duplicati.Library.Backend.Dropbox.csproj | 14 +-- .../FTP/Duplicati.Library.Backend.FTP.csproj | 17 +-- .../Duplicati.Library.Backend.File.csproj | 17 +-- ...cati.Library.Backend.GoogleServices.csproj | 14 +-- .../Duplicati.Library.Backend.HubiC.csproj | 17 +-- ...uplicati.Library.Backend.Jottacloud.csproj | 17 +-- .../Duplicati.Library.Backend.Mega.csproj | 14 +-- .../Duplicati.Library.OAuthHelper.csproj | 14 +-- .../Duplicati.Library.Backend.OneDrive.csproj | 14 +-- ...Duplicati.Library.Backend.OpenStack.csproj | 14 +-- .../Duplicati.Library.Backend.Rclone.csproj | 14 +-- .../S3/Duplicati.Library.Backend.S3.csproj | 14 +-- .../Duplicati.Library.Backend.SSHv2.csproj | 14 +-- ...uplicati.Library.Backend.SharePoint.csproj | 14 +-- .../Sia/Duplicati.Library.Backend.Sia.csproj | 14 +-- ...Duplicati.Library.Backend.TahoeLAFS.csproj | 14 +-- ...uplicati.Library.Backend.Tardigrade.csproj | 14 +-- ...uplicati.Library.Backend.TencentCOS.csproj | 3 +- .../Duplicati.Library.Backend.WEBDAV.csproj | 17 +-- .../Common/Duplicati.Library.Common.csproj | 14 +-- .../Duplicati.Library.Compression.csproj | 14 +-- .../Duplicati.Library.DynamicLoader.csproj | 19 +-- .../Duplicati.Library.Encryption.csproj | 16 +-- .../Duplicati.Library.Interface.csproj | 17 +-- .../Duplicati.Library.Localization.csproj | 14 +-- .../Logging/Duplicati.Library.Logging.csproj | 20 +-- .../Main/Duplicati.Library.Main.csproj | 16 +-- .../Duplicati.Library.Modules.Builtin.csproj | 16 +-- .../Duplicati.Library.SQLiteHelper.csproj | 21 +--- .../Duplicati.Library.Snapshots.csproj | 13 +- .../Duplicati.Library.UsageReporter.csproj | 16 +-- .../Utility/Duplicati.Library.Utility.csproj | 14 +-- Duplicati/License/Duplicati.License.csproj | 21 +--- .../Duplicati.Server.Serialization.csproj | 18 +-- Duplicati/Server/Duplicati.Server.csproj | 19 +-- Duplicati/Service/Duplicati.Service.csproj | 21 +--- Duplicati/Tools/Duplicati.Tools.csproj | 17 +-- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 16 +-- .../WindowsService/WindowsService.csproj | 22 +--- .../Duplicati.CommandLine.AutoUpdater.csproj | 15 +++ .../Program.cs | 9 ++ ...Duplicati.CommandLine.BackendTester.csproj | 15 +++ .../Program.cs | 9 ++ .../Duplicati.CommandLine.BackendTool.csproj | 16 +++ .../Program.cs | 9 ++ ...i.CommandLine.ConfigurationImporter.csproj | 15 +++ .../Program.cs | 9 ++ .../Duplicati.CommandLine.RecoveryTool.csproj | 15 +++ .../Program.cs | 9 ++ .../Duplicati.CommandLine.csproj | 15 +++ .../net5/Duplicati.CommandLine/Program.cs | 9 ++ .../Duplicati.GUI.TrayIcon.csproj | 15 +++ .../net5/Duplicati.GUI.TrayIcon/Program.cs | 9 ++ .../Duplicati.Server/Duplicati.Server.csproj | 16 +++ Executables/net5/Duplicati.Server/Program.cs | 9 ++ .../Duplicati.WindowsService.csproj | 15 +++ .../net5/Duplicati.WindowsService/Program.cs | 9 ++ .../Duplicati.Service.csproj | 14 +++ Executables/net5/Duplicati_Service/Program.cs | 9 ++ 84 files changed, 546 insertions(+), 850 deletions(-) rename Duplicati/CommandLine/{ => CLI}/Commands.cs (100%) rename Duplicati/CommandLine/{ => CLI}/ConsoleOutput.cs (100%) create mode 100644 Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj rename Duplicati/CommandLine/{ => CLI}/Help.cs (100%) rename Duplicati/CommandLine/{ => CLI}/Program.cs (97%) rename Duplicati/CommandLine/{ => CLI}/Strings.cs (100%) rename Duplicati/CommandLine/{ => CLI}/TrayWarning.ico (100%) rename Duplicati/CommandLine/{ => CLI}/help.txt (100%) delete mode 100644 Duplicati/CommandLine/Duplicati.CommandLine.csproj create mode 100644 Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj create mode 100644 Executables/net5/Duplicati.CommandLine.AutoUpdater/Program.cs create mode 100644 Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj create mode 100644 Executables/net5/Duplicati.CommandLine.BackendTester/Program.cs create mode 100644 Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj create mode 100644 Executables/net5/Duplicati.CommandLine.BackendTool/Program.cs create mode 100644 Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj create mode 100644 Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Program.cs create mode 100644 Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj create mode 100644 Executables/net5/Duplicati.CommandLine.RecoveryTool/Program.cs create mode 100644 Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj create mode 100644 Executables/net5/Duplicati.CommandLine/Program.cs create mode 100644 Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj create mode 100644 Executables/net5/Duplicati.GUI.TrayIcon/Program.cs create mode 100644 Executables/net5/Duplicati.Server/Duplicati.Server.csproj create mode 100644 Executables/net5/Duplicati.Server/Program.cs create mode 100644 Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj create mode 100644 Executables/net5/Duplicati.WindowsService/Program.cs create mode 100644 Executables/net5/Duplicati_Service/Duplicati.Service.csproj create mode 100644 Executables/net5/Duplicati_Service/Program.cs diff --git a/Duplicati.sln b/Duplicati.sln index bfa89734d..e4323bb42 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -17,7 +17,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Logging", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.S3", "Duplicati\Library\Backend\S3\Duplicati.Library.Backend.S3.csproj", "{C03F6DFD-805A-4BE0-9338-64870ADDB4A2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine", "Duplicati\CommandLine\Duplicati.CommandLine.csproj", "{81765A64-3661-4E3E-B850-2F6F87A51F74}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine", "Duplicati\CommandLine\CLI\Duplicati.CommandLine.csproj", "{81765A64-3661-4E3E-B850-2F6F87A51F74}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.WEBDAV", "Duplicati\Library\Backend\WEBDAV\Duplicati.Library.Backend.WEBDAV.csproj", "{BAE27510-8B5D-44B2-B33E-372A98908041}" EndProject @@ -81,8 +81,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.UsageRepo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.SharePoint", "Duplicati\Library\Backend\SharePoint\Duplicati.Library.Backend.SharePoint.csproj", "{59C8BBC5-6E42-46FB-AB3E-6C183A82459A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WindowsService", "Duplicati\WindowsService\WindowsService.csproj", "{BEF7AF9A-3978-4F90-8592-198BF6EA6C6B}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.AlternativeFTP", "Duplicati\Library\Backend\AlternativeFTP\Duplicati.Library.Backend.AlternativeFTP.csproj", "{3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Dropbox", "Duplicati\Library\Backend\Dropbox\Duplicati.Library.Backend.Dropbox.csproj", "{B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493}" @@ -107,6 +105,32 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.T EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.TencentCOS", "Duplicati\Library\Backend\TencentCOS\Duplicati.Library.Backend.TencentCOS.csproj", "{545DD6D4-9476-42D6-B51C-A28E000C489E}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Executables", "Executables", "{FA88A246-EF8E-46E3-90AF-539B8C0A6ADE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net5", "net5", "{6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net5\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Service", "Executables\net5\Duplicati_Service\Duplicati.Service.csproj", "{34149709-F3ED-4FB5-A087-43EB195C948B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTester", "Executables\net5\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTool", "Executables\net5\Duplicati.CommandLine.BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.ConfigurationImporter", "Executables\net5\Duplicati.CommandLine.ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{156B9B77-C2B7-4169-8FE7-1171D221446C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.RecoveryTool", "Executables\net5\Duplicati.CommandLine.RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{0FFC557E-1B84-46A2-B6E8-06064FA7EA58}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.GUI.TrayIcon", "Executables\net5\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{AF32C621-30DC-40F5-8CE6-DD69053068E9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Server", "Executables\net5\Duplicati.Server\Duplicati.Server.csproj", "{55EEEBD2-CE45-45D6-9838-958F1C7354E4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsService", "Duplicati\WindowsService\WindowsService.csproj", "{8A651E2D-A7C8-4EC7-B421-7A457654811D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.WindowsService", "Executables\net5\Duplicati.WindowsService\Duplicati.WindowsService.csproj", "{5D20B150-C445-47BE-8CE8-C9F74F19A4F2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Executables\net5\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{0F5A1F4E-25FA-4D02-920D-CA2138498081}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -269,10 +293,6 @@ Global {59C8BBC5-6E42-46FB-AB3E-6C183A82459A}.Debug|Any CPU.Build.0 = Debug|Any CPU {59C8BBC5-6E42-46FB-AB3E-6C183A82459A}.Release|Any CPU.ActiveCfg = Release|Any CPU {59C8BBC5-6E42-46FB-AB3E-6C183A82459A}.Release|Any CPU.Build.0 = Release|Any CPU - {BEF7AF9A-3978-4F90-8592-198BF6EA6C6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEF7AF9A-3978-4F90-8592-198BF6EA6C6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEF7AF9A-3978-4F90-8592-198BF6EA6C6B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEF7AF9A-3978-4F90-8592-198BF6EA6C6B}.Release|Any CPU.Build.0 = Release|Any CPU {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}.Debug|Any CPU.Build.0 = Debug|Any CPU {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -321,6 +341,50 @@ Global {545DD6D4-9476-42D6-B51C-A28E000C489E}.Debug|Any CPU.Build.0 = Debug|Any CPU {545DD6D4-9476-42D6-B51C-A28E000C489E}.Release|Any CPU.ActiveCfg = Release|Any CPU {545DD6D4-9476-42D6-B51C-A28E000C489E}.Release|Any CPU.Build.0 = Release|Any CPU + {95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}.Release|Any CPU.Build.0 = Release|Any CPU + {34149709-F3ED-4FB5-A087-43EB195C948B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34149709-F3ED-4FB5-A087-43EB195C948B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34149709-F3ED-4FB5-A087-43EB195C948B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34149709-F3ED-4FB5-A087-43EB195C948B}.Release|Any CPU.Build.0 = Release|Any CPU + {2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}.Release|Any CPU.Build.0 = Release|Any CPU + {31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6}.Release|Any CPU.Build.0 = Release|Any CPU + {156B9B77-C2B7-4169-8FE7-1171D221446C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {156B9B77-C2B7-4169-8FE7-1171D221446C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {156B9B77-C2B7-4169-8FE7-1171D221446C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {156B9B77-C2B7-4169-8FE7-1171D221446C}.Release|Any CPU.Build.0 = Release|Any CPU + {0FFC557E-1B84-46A2-B6E8-06064FA7EA58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FFC557E-1B84-46A2-B6E8-06064FA7EA58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FFC557E-1B84-46A2-B6E8-06064FA7EA58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FFC557E-1B84-46A2-B6E8-06064FA7EA58}.Release|Any CPU.Build.0 = Release|Any CPU + {AF32C621-30DC-40F5-8CE6-DD69053068E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF32C621-30DC-40F5-8CE6-DD69053068E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF32C621-30DC-40F5-8CE6-DD69053068E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF32C621-30DC-40F5-8CE6-DD69053068E9}.Release|Any CPU.Build.0 = Release|Any CPU + {55EEEBD2-CE45-45D6-9838-958F1C7354E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55EEEBD2-CE45-45D6-9838-958F1C7354E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55EEEBD2-CE45-45D6-9838-958F1C7354E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55EEEBD2-CE45-45D6-9838-958F1C7354E4}.Release|Any CPU.Build.0 = Release|Any CPU + {8A651E2D-A7C8-4EC7-B421-7A457654811D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A651E2D-A7C8-4EC7-B421-7A457654811D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A651E2D-A7C8-4EC7-B421-7A457654811D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A651E2D-A7C8-4EC7-B421-7A457654811D}.Release|Any CPU.Build.0 = Release|Any CPU + {5D20B150-C445-47BE-8CE8-C9F74F19A4F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D20B150-C445-47BE-8CE8-C9F74F19A4F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D20B150-C445-47BE-8CE8-C9F74F19A4F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D20B150-C445-47BE-8CE8-C9F74F19A4F2}.Release|Any CPU.Build.0 = Release|Any CPU + {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -340,8 +404,17 @@ Global $5.EolMarker = Windows $5.scope = text/plain EndGlobalSection - GlobalSection(SubversionScc) = preSolution - Svn-Managed = True - Manager = AnkhSVN - Subversion Support for Visual Studio + GlobalSection(NestedProjects) = preSolution + {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} = {FA88A246-EF8E-46E3-90AF-539B8C0A6ADE} + {95B7DD83-2C5A-4F1E-8EA7-39654B2B236A} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {34149709-F3ED-4FB5-A087-43EB195C948B} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {2F1C0C8D-5C15-4BC0-811F-87F2C98D9790} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {156B9B77-C2B7-4169-8FE7-1171D221446C} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {0FFC557E-1B84-46A2-B6E8-06064FA7EA58} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {AF32C621-30DC-40F5-8CE6-DD69053068E9} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {55EEEBD2-CE45-45D6-9838-958F1C7354E4} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {5D20B150-C445-47BE-8CE8-C9F74F19A4F2} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {0F5A1F4E-25FA-4D02-920D-CA2138498081} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} EndGlobalSection EndGlobal diff --git a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index af65c842e..9e8d2f49f 100644 --- a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -1,26 +1,12 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.CommandLine.AutoUpdater - Duplicati Team - Duplicati Team - AutoUpdater - CommandLineAutoUpdater - Duplicati.CommandLine.AutoUpdater + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.CommandLine.AutoUpdater.Implementation Duplicati.CommandLine.AutoUpdater - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index ef88227df..125af4987 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -1,27 +1,13 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.CommandLine.BackendTester - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 A backend debugging tool for Duplicati - BackendTester - Duplicati.CommandLine.BackendTester + Duplicati.CommandLine.BackendTester.Implementation Duplicati.CommandLine.BackendTester - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + @@ -36,8 +22,6 @@ - {ae035e01-c917-4f13-a35e-78f21c1a2f17} - Duplicati.Library.Backend.Tardigrade @@ -90,16 +74,10 @@ - {D63E53E4-A458-4C2F-914D-92F715F58ACF} - Duplicati.Library.Common - {19ECCE09-B5EB-406C-8C57-BAC66997D469} - Duplicati.Library.Compression - {2C838169-B187-4B09-8768-1C24C2521C8D} - Duplicati.Library.SQLiteHelper diff --git a/Duplicati/CommandLine/BackendTester/Program.cs b/Duplicati/CommandLine/BackendTester/Program.cs index 3537472a4..98df66b96 100644 --- a/Duplicati/CommandLine/BackendTester/Program.cs +++ b/Duplicati/CommandLine/BackendTester/Program.cs @@ -27,7 +27,7 @@ using System.Threading; namespace Duplicati.CommandLine.BackendTester { - class Program + public class Program { /// diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 8ee87705f..040c2c37b 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -1,26 +1,12 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.CommandLine.BackendTool - Duplicati Team - Duplicati Team - - BackendTool - Duplicati.CommandLine.BackendTool + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.CommandLine.BackendTool.Implementation Duplicati.CommandLine.BackendTool - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Duplicati/CommandLine/BackendTool/Program.cs b/Duplicati/CommandLine/BackendTool/Program.cs index 0b30706cd..c72cee92d 100644 --- a/Duplicati/CommandLine/BackendTool/Program.cs +++ b/Duplicati/CommandLine/BackendTool/Program.cs @@ -25,7 +25,7 @@ using System.Threading; namespace Duplicati.CommandLine.BackendTool { - class Program + public class Program { /// /// The main entry point for the application. diff --git a/Duplicati/CommandLine/Commands.cs b/Duplicati/CommandLine/CLI/Commands.cs similarity index 100% rename from Duplicati/CommandLine/Commands.cs rename to Duplicati/CommandLine/CLI/Commands.cs diff --git a/Duplicati/CommandLine/ConsoleOutput.cs b/Duplicati/CommandLine/CLI/ConsoleOutput.cs similarity index 100% rename from Duplicati/CommandLine/ConsoleOutput.cs rename to Duplicati/CommandLine/CLI/ConsoleOutput.cs diff --git a/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj new file mode 100644 index 000000000..6eaca98f1 --- /dev/null +++ b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj @@ -0,0 +1,101 @@ + + + + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 + A commandline version of Duplicati + Duplicati.CommandLine.Implementation + TrayWarning.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/Duplicati/CommandLine/Help.cs b/Duplicati/CommandLine/CLI/Help.cs similarity index 100% rename from Duplicati/CommandLine/Help.cs rename to Duplicati/CommandLine/CLI/Help.cs diff --git a/Duplicati/CommandLine/Program.cs b/Duplicati/CommandLine/CLI/Program.cs similarity index 97% rename from Duplicati/CommandLine/Program.cs rename to Duplicati/CommandLine/CLI/Program.cs index 512d091c0..3271e31f1 100644 --- a/Duplicati/CommandLine/Program.cs +++ b/Duplicati/CommandLine/CLI/Program.cs @@ -36,7 +36,6 @@ namespace Duplicati.CommandLine /// /// The main entry point for the application. /// - [STAThread] public static int Main(string[] args) { Duplicati.Library.AutoUpdater.UpdaterManager.IgnoreWebrootFolder = true; diff --git a/Duplicati/CommandLine/Strings.cs b/Duplicati/CommandLine/CLI/Strings.cs similarity index 100% rename from Duplicati/CommandLine/Strings.cs rename to Duplicati/CommandLine/CLI/Strings.cs diff --git a/Duplicati/CommandLine/TrayWarning.ico b/Duplicati/CommandLine/CLI/TrayWarning.ico similarity index 100% rename from Duplicati/CommandLine/TrayWarning.ico rename to Duplicati/CommandLine/CLI/TrayWarning.ico diff --git a/Duplicati/CommandLine/help.txt b/Duplicati/CommandLine/CLI/help.txt similarity index 100% rename from Duplicati/CommandLine/help.txt rename to Duplicati/CommandLine/CLI/help.txt diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index 027d90c48..552f70d7c 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -1,26 +1,12 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.CommandLine.ConfigurationImporter - Duplicati Team - Duplicati Team - ConfigurationImporter - ConfigurationImporter - Duplicati.CommandLine.ConfigurationImporter + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.CommandLine.ConfigurationImporter.Implementation Duplicati.CommandLine.ConfigurationImporter - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Duplicati/CommandLine/ConfigurationImporter/Program.cs b/Duplicati/CommandLine/ConfigurationImporter/Program.cs index 0d0d46f9a..2852d2c09 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Program.cs +++ b/Duplicati/CommandLine/ConfigurationImporter/Program.cs @@ -26,7 +26,7 @@ namespace Duplicati.CommandLine.ConfigurationImporter { private static readonly string usageString = $"Usage: {nameof(ConfigurationImporter)}.exe --import-metadata=(true | false) --server-datafolder="; - public static void Main(string[] args) + public static int Main(string[] args) { if (args.Length != 3) { @@ -53,6 +53,8 @@ namespace Duplicati.CommandLine.ConfigurationImporter ImportExportStructure importedStructure = Backups.ImportBackup(configurationFile, importMetadata, () => ConfigurationImporter.ReadPassword($"Password for {configurationFile}: "), advancedOptions); Console.WriteLine($"Imported \"{importedStructure.Backup.Name}\" with ID {importedStructure.Backup.ID} and local database at {importedStructure.Backup.DBPath}."); + + return 0; } private static string ReadPassword(string prompt) diff --git a/Duplicati/CommandLine/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/Duplicati.CommandLine.csproj deleted file mode 100644 index d5c1927c6..000000000 --- a/Duplicati/CommandLine/Duplicati.CommandLine.csproj +++ /dev/null @@ -1,114 +0,0 @@ - - - - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.CommandLine - Duplicati Team - Duplicati Team - A commandline version of Duplicati - CommandLine - Duplicati.CommandLine - Duplicati.CommandLine - TrayWarning.ico - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - \ No newline at end of file diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 855957464..a77927393 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -1,27 +1,13 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.CommandLine.RecoveryTool - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 RecoveryTool for Duplicati - RecoveryTool - Duplicati.CommandLine.RecoveryTool + Duplicati.CommandLine.RecoveryTool.Implementation Duplicati.CommandLine.RecoveryTooln - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index dedfb53e7..0c4af6124 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,21 +1,12 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.GUI.TrayIcon - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 The Duplicati Tray implementation - TrayIcon - Duplicati.GUI.TrayIcon + Duplicati.GUI.TrayIcon.Implementation Duplicati.GUI.TrayIcon Duplicati.ico - Duplicati.GUI.TrayIcon.Program - - @@ -35,14 +26,6 @@ - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - ..\..\..\thirdparty\appindicator-sharp\appindicator-sharp.dll @@ -87,8 +70,6 @@ - {ae035e01-c917-4f13-a35e-78f21c1a2f17} - Duplicati.Library.Backend.Tardigrade @@ -102,7 +83,7 @@ - + diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 4c26b01ee..5607d0508 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -2,23 +2,11 @@ netstandard2.1 - 2.0.0.7 - Library - LGPL, Copyright © Duplicati Team 2019 - Duplicati.Library.AutoUpdater - Duplicati Team - Duplicati Team + LGPL, Copyright © Duplicati Team 2021 AutoUpdater library for Duplicati - AutoUpdater - Duplicati.Library.AutoUpdater - Duplicati.Library.AutoUpdater - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index 986034145..d35ff0513 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -2,24 +2,12 @@ netstandard2.1 - 2.0.0.7 - Library - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.AlternativeFTP - Duplicati Team - Duplicati Team + LGPL, Copyright © Duplicati Team 2021 An alternative FTP backend for Duplicati - AlternativeFTP - Duplicati.Library.Backend.AlternativeFTP - Duplicati.Library.Backend.AlternativeFTP - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 05ab47579..72ee342e1 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -1,15 +1,9 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.AzureBlob - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 An Azure blob storage backend for Duplicati - AzureBlob @@ -21,10 +15,6 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index 51bf59670..7d6aeafb5 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -1,22 +1,12 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.Backblaze - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Backblaze backend for Duplicati - Backblaze - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 26a0ec5e6..17195a1f6 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -1,22 +1,12 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.Box - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Box backend for Duplicati - Box - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index 7cc1b0eb7..f791eeba5 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,23 +1,10 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.CloudFiles - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 CloudFiles backend for Duplicati - CloudFiles - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index 03b456f36..335504db6 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.Dropbox - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Dropbox backend for Duplicati - Dropbox - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index 725c7c2a7..4723a84db 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -1,24 +1,11 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.FTP - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 A FTP backend for Duplicati - FTP - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index be7f17605..ea38ecab6 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,24 +1,11 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.File - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 File backend for Duplicati - File - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 901627186..7e0560e75 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -1,22 +1,12 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.GoogleCloudStorage - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 GoogleCloudStorage backend for Duplicati - GoogleCloudStorage - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index a3b5f8b01..caa60e4ac 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -1,23 +1,10 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.HubiC - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 HubiC backend for Duplicati - HubiC - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index 6812728f2..dad384a70 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -1,23 +1,10 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.Jottacloud - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Jottacloud backend for Duplicati - Jottacloud - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 4de7f9c3e..de2eb8c20 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -1,23 +1,13 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.Mega - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Mega backend for Duplicati - Mega - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index 338241538..96e58c275 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -1,22 +1,12 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.OAuthHelper - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 OAuthHelper backend for Duplicati - OAuthHelper - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index f52e00447..6221407d3 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.OneDrive - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 OneDrive backend for Duplicati - OneDrive - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index e6f7aaf05..365354e85 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -1,22 +1,12 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.OpenStack - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 OpenStack backend for Duplicati - OpenStack - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 9b1792930..50b83f006 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.Rclone - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Rclone backend for Duplicati - Rclone - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index bd9b7ffd2..ad1df0555 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -1,25 +1,15 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.S3 - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 S3 backend for Duplicati - S3 - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index 30237db02..a103b2fe8 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.SSHv2 - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 SSHv2 backend for Duplicati - SSHv2 - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index ddcee7f22..45dda835e 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.SharePoint - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 A SharePoint Online Backend for Duplicati (includes OneDrive for Business support) - SharePoint - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index ef25d86fe..b779810b6 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.Sia - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Sia backend for Duplicati - Sia - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 118f70c18..b383e2364 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.TahoeLAFS - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 TahoeLAFS backend for Duplicati - TahoeLAFS - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj index d7756b3c4..dbd78c712 100644 --- a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj +++ b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Backend.Tardigrade - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Tardigrade backend for Duplicati - Tardigrade - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj index e597a5538..a041295df 100644 --- a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj +++ b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj @@ -1,6 +1,7 @@  - netstandard2.1 + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Library false diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index ca03fda67..eaedc5752 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,23 +1,10 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.Backend.WEBDAV - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 WEBDAV backend for Duplicati - WEBDAV - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 4d349bc93..ec9ff310d 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.IO - Duplicati Team - Duplicati Team - Library.IO + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Library.IO - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index c82f34cfb..272a1a66c 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Compression - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Compression implementation for Duplicati - Compression - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 4c73e6cab..f12092301 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -1,26 +1,11 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright ? Duplicati Team 2015 - Duplicati.DynamicLoader - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Dynamic Loader for Duplicati - DynamicLoader - Duplicati.DynamicLoader - Duplicati.DynamicLoader - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index a0a1673a6..e5aa5d688 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -1,24 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Encryption - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Encryption implementation for Duplicati - Encryption - Duplicati.Encryption - Duplicati.Encryption - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 1fbbd9802..47bb34216 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,24 +1,11 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Interface - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 The Duplicati library with all publicly exposed interfaces - Interface - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index 1d188fd8c..be370e485 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Localization - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Localization implementation for Duplicati - Localization - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index d579b72e2..b1e373704 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -1,21 +1,7 @@ - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Logging - Duplicati Team - Duplicati Team - A simple module for logging troubleshooting data - Logging - Duplicati.Logging - Duplicati.Logging + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 + A module for logging troubleshooting data - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - \ No newline at end of file diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 5c44f0dab..5f6293e85 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -1,24 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright ? Duplicati Team 2015 - Duplicati.Main - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 The main Duplicati implementation module - Main - Duplicati.Library.Main - Duplicati.Library.Main - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 791587b75..44883dd23 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -1,25 +1,13 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright ? Duplicati Team 2015 - Duplicati.Library.Modules.Builtin - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Buildin modules for Duplicati - ModulesBuiltin - Duplicati.Library.Modules.Builtin - Duplicati.Library.Modules.Builtin - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index fb9c14642..4cbf3ff84 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -1,17 +1,9 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright ? Duplicati Team 2015 - Duplicati.SQLiteHelper - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 SQLiteHelper for Duplicati - SQLiteHelper - Duplicati.SQLiteHelper - Duplicati.SQLiteHelper @@ -36,14 +28,7 @@ PreserveNewest - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 4b6f400ac..bbc91a9e8 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -1,21 +1,12 @@  - netstandard2.1 - 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Snapshots - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 A disk snapshot implementation for Duplicati - Snapshots - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index 1222b4a9b..d8395514d 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -1,25 +1,13 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Library.UsageReporter - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 Usage reporter for Duplicati - UsageReporter - Duplicati.Library.UsageReporter - Duplicati.Library.UsageReporter - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 66db802da..4b4203cec 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -1,22 +1,12 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.Library.Utility - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 A collection of utility functions used extensively in Duplicati - Utility - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index b70a13fc4..78a288271 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -1,17 +1,9 @@  - netstandard2.1 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2015 - Duplicati.License - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 A license text reader for Duplicati - License - Duplicati.License - Duplicati.License @@ -347,14 +339,7 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 8cf2f5d94..e9dbd012a 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -2,26 +2,10 @@ netstandard2.1 - 2.0.0.7 - - LGPL, Copyright ? Duplicati Team 2015 - Duplicati.Server.Serialization - Duplicati Team - Duplicati Team + LGPL, Copyright © Duplicati Team 2021 Serialization module for Duplicati - Serialization - Duplicati.Server.Serialization - Duplicati.Server.Serialization - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 3d69d2952..f9a8e2de7 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -1,17 +1,10 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.Server - Duplicati Team - Duplicati Team + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 The Server Duplicati implementation - Server - Duplicati.Server - Duplicati.Server + Duplicati.Server.Implementation @@ -19,10 +12,6 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - @@ -35,7 +24,7 @@ - + diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index 0830fcb29..bd271e01f 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,25 +1,10 @@  - net5.0 - 2.0.0.7 - Exe - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.Service - Duplicati Team - Duplicati Team - - Service - Duplicati.Service - Duplicati.Service + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.Service.Implementation - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index edd10e9c6..874ff2b1d 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -2,16 +2,9 @@ netstandard2.1 - 2.0.0.7 - LGPL, Copyright � Duplicati Team 2015 - Duplicati.Tools - Duplicati Team - Duplicati Team + LGPL, Copyright © Duplicati Team 2021 Dummy Tools copy library - Tools - Duplicati.Tools - Duplicati.Tools @@ -62,11 +55,5 @@ utility-scripts\pause-resume.py - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + \ No newline at end of file diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 2d0e7cb18..fb78e4bb8 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -3,23 +3,11 @@ Exe net5.0 - 2.0.0.7 - LGPL, Copyright ? Duplicati Team 2019 - Duplicati.UnitTest - Duplicati Team - Duplicati Team - Duplicati.UnitTest - Duplicati.UnitTest - Duplicati.UnitTest - Duplicati.UnitTest + LGPL, Copyright © Duplicati Team 2021 false - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - @@ -28,7 +16,7 @@ - + diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index d36f4b5d4..0363469b1 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -1,16 +1,9 @@  - Exe - net5.0 - 2.0.0.7 - LGPL, Copyright © Duplicati Team 2019 - Duplicati.WindowsService - Duplicati Team - Duplicati Team - WindowsService for Duplicati - WindowsService - Duplicati.WindowsService + netstandard2.1 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.WindowsService.Implementation @@ -24,12 +17,7 @@ - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj new file mode 100644 index 000000000..df8d7918e --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + AutoUpdater tool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.AutoUpdater/Program.cs b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Program.cs new file mode 100644 index 000000000..4a1ef94a7 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.AutoUpdater.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.AutoUpdater.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj new file mode 100644 index 000000000..7ea2aa927 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + A backend debugging tool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTester/Program.cs b/Executables/net5/Duplicati.CommandLine.BackendTester/Program.cs new file mode 100644 index 000000000..b16773448 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.BackendTester/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.BackendTester.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.BackendTester.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj new file mode 100644 index 000000000..f14021666 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -0,0 +1,16 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + Tool for file-level access to remote destinations + + + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTool/Program.cs b/Executables/net5/Duplicati.CommandLine.BackendTool/Program.cs new file mode 100644 index 000000000..aacea31c5 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.BackendTool/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.BackendTool.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.BackendTool.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj new file mode 100644 index 000000000..c5c439198 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + Configuration Import Tool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Program.cs b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Program.cs new file mode 100644 index 000000000..2d9f8b5c7 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.ConfigurationImporter.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.ConfigurationImporter.ConfigurationImporter.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj new file mode 100644 index 000000000..6581fe9d1 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + RecoveryTool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.RecoveryTool/Program.cs b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Program.cs new file mode 100644 index 000000000..5c7e2848d --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.RecoveryTool.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.RecoveryTool.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj new file mode 100644 index 000000000..f75a9f86c --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5 + LGPL, Copyright © Duplicati Team 2021 + Commandline implementation of Duplicati + + + + + + + + diff --git a/Executables/net5/Duplicati.CommandLine/Program.cs b/Executables/net5/Duplicati.CommandLine/Program.cs new file mode 100644 index 000000000..beda17e05 --- /dev/null +++ b/Executables/net5/Duplicati.CommandLine/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.CLI.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj new file mode 100644 index 000000000..9bad589f6 --- /dev/null +++ b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + The Duplicati Tray implementation + ..\..\..\Duplicati\GUI\Duplicati.ico + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.GUI.TrayIcon/Program.cs b/Executables/net5/Duplicati.GUI.TrayIcon/Program.cs new file mode 100644 index 000000000..6e4552ba9 --- /dev/null +++ b/Executables/net5/Duplicati.GUI.TrayIcon/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.GUI.TrayIcon.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.GUI.TrayIcon.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.Server/Duplicati.Server.csproj b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj new file mode 100644 index 000000000..cc432a9ec --- /dev/null +++ b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj @@ -0,0 +1,16 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + The Server Duplicati implementation + Duplicati.Server + + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.Server/Program.cs b/Executables/net5/Duplicati.Server/Program.cs new file mode 100644 index 000000000..834667b9e --- /dev/null +++ b/Executables/net5/Duplicati.Server/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.Server.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.Server.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj b/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj new file mode 100644 index 000000000..359c8035a --- /dev/null +++ b/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj @@ -0,0 +1,15 @@ + + + + Exe + net5.0 + LGPL, Copyright © Duplicati Team 2021 + WindowsService for Duplicati + Duplicati.WindowsService + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.WindowsService/Program.cs b/Executables/net5/Duplicati.WindowsService/Program.cs new file mode 100644 index 000000000..c7ba47cbc --- /dev/null +++ b/Executables/net5/Duplicati.WindowsService/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.WindowsService.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.WindowsService.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati_Service/Duplicati.Service.csproj b/Executables/net5/Duplicati_Service/Duplicati.Service.csproj new file mode 100644 index 000000000..a21d6c4ff --- /dev/null +++ b/Executables/net5/Duplicati_Service/Duplicati.Service.csproj @@ -0,0 +1,14 @@ + + + + net5.0 + Exe + LGPL, Copyright © Duplicati Team 2021 + Service controller for Duplicati + + + + + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati_Service/Program.cs b/Executables/net5/Duplicati_Service/Program.cs new file mode 100644 index 000000000..53eeb44b6 --- /dev/null +++ b/Executables/net5/Duplicati_Service/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.Service.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.Service.Program.Main(args); + } +} \ No newline at end of file From 557415c9ad429d9e4c704fa1b3b0b230e9d30dda Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sat, 3 Apr 2021 14:13:32 +0200 Subject: [PATCH 149/253] Changed implementation to target `netstandard2.0`. Added builds for .Net 4.8 --- Duplicati.sln | 73 +++++++++++++++++++ .../Duplicati.CommandLine.AutoUpdater.csproj | 2 +- ...Duplicati.CommandLine.BackendTester.csproj | 2 +- .../Duplicati.CommandLine.BackendTool.csproj | 2 +- .../CLI/Duplicati.CommandLine.csproj | 2 +- ...i.CommandLine.ConfigurationImporter.csproj | 2 +- .../Duplicati.CommandLine.RecoveryTool.csproj | 2 +- .../Duplicati.GUI.TrayIcon.csproj | 2 +- .../Duplicati.Library.AutoUpdater.csproj | 2 +- ...cati.Library.Backend.AlternativeFTP.csproj | 2 +- ...Duplicati.Library.Backend.AzureBlob.csproj | 2 +- ...Duplicati.Library.Backend.Backblaze.csproj | 2 +- .../Box/Duplicati.Library.Backend.Box.csproj | 2 +- ...uplicati.Library.Backend.CloudFiles.csproj | 2 +- .../Duplicati.Library.Backend.Dropbox.csproj | 2 +- .../FTP/Duplicati.Library.Backend.FTP.csproj | 2 +- .../Duplicati.Library.Backend.File.csproj | 2 +- ...cati.Library.Backend.GoogleServices.csproj | 2 +- .../Duplicati.Library.Backend.HubiC.csproj | 2 +- ...uplicati.Library.Backend.Jottacloud.csproj | 2 +- .../Duplicati.Library.Backend.Mega.csproj | 2 +- .../Duplicati.Library.OAuthHelper.csproj | 2 +- .../Duplicati.Library.Backend.OneDrive.csproj | 2 +- ...Duplicati.Library.Backend.OpenStack.csproj | 2 +- .../Duplicati.Library.Backend.Rclone.csproj | 2 +- .../S3/Duplicati.Library.Backend.S3.csproj | 2 +- .../Duplicati.Library.Backend.SSHv2.csproj | 2 +- ...uplicati.Library.Backend.SharePoint.csproj | 2 +- .../Sia/Duplicati.Library.Backend.Sia.csproj | 2 +- ...Duplicati.Library.Backend.TahoeLAFS.csproj | 2 +- ...uplicati.Library.Backend.Tardigrade.csproj | 2 +- ...uplicati.Library.Backend.TencentCOS.csproj | 2 +- .../Duplicati.Library.Backend.WEBDAV.csproj | 2 +- .../Common/Duplicati.Library.Common.csproj | 2 +- .../Duplicati.Library.Compression.csproj | 2 +- .../Duplicati.Library.DynamicLoader.csproj | 2 +- .../Duplicati.Library.Encryption.csproj | 2 +- .../Duplicati.Library.Interface.csproj | 2 +- .../Duplicati.Library.Localization.csproj | 2 +- .../Logging/Duplicati.Library.Logging.csproj | 2 +- .../Main/Duplicati.Library.Main.csproj | 2 +- .../Duplicati.Library.Modules.Builtin.csproj | 2 +- .../Library/SQLiteHelper/DatabaseUpgrader.cs | 2 +- .../Duplicati.Library.SQLiteHelper.csproj | 2 +- .../Duplicati.Library.Snapshots.csproj | 2 +- .../Duplicati.Library.UsageReporter.csproj | 2 +- .../Utility/Duplicati.Library.Utility.csproj | 2 +- Duplicati/License/Duplicati.License.csproj | 2 +- .../Duplicati.Server.Serialization.csproj | 2 +- Duplicati/Server/Duplicati.Server.csproj | 2 +- Duplicati/Service/Duplicati.Service.csproj | 2 +- Duplicati/Tools/Duplicati.Tools.csproj | 2 +- .../WindowsService/WindowsService.csproj | 6 +- .../Duplicati.CommandLine.AutoUpdater.csproj | 15 ++++ .../Program.cs | 9 +++ ...Duplicati.CommandLine.BackendTester.csproj | 15 ++++ .../Program.cs | 9 +++ .../Duplicati.CommandLine.BackendTool.csproj | 16 ++++ .../Program.cs | 9 +++ ...i.CommandLine.ConfigurationImporter.csproj | 15 ++++ .../Program.cs | 9 +++ .../Duplicati.CommandLine.RecoveryTool.csproj | 15 ++++ .../Program.cs | 9 +++ .../Duplicati.CommandLine.csproj | 15 ++++ .../net48/Duplicati.CommandLine/Program.cs | 9 +++ .../Duplicati.GUI.TrayIcon.csproj | 15 ++++ .../net48/Duplicati.GUI.TrayIcon/Program.cs | 9 +++ .../Duplicati.Server/Duplicati.Server.csproj | 16 ++++ Executables/net48/Duplicati.Server/Program.cs | 9 +++ .../Duplicati.WindowsService.csproj | 15 ++++ .../net48/Duplicati.WindowsService/Program.cs | 9 +++ .../Duplicati.Service.csproj | 14 ++++ .../net48/Duplicati_Service/Program.cs | 9 +++ .../Duplicati.GUI.TrayIcon.csproj | 2 +- .../UpdateVersion/UpdateVersion.csproj | 2 +- thirdparty/UnixSupport/UnixSupport.csproj | 2 +- 76 files changed, 371 insertions(+), 57 deletions(-) create mode 100644 Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj create mode 100644 Executables/net48/Duplicati.CommandLine.AutoUpdater/Program.cs create mode 100644 Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj create mode 100644 Executables/net48/Duplicati.CommandLine.BackendTester/Program.cs create mode 100644 Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj create mode 100644 Executables/net48/Duplicati.CommandLine.BackendTool/Program.cs create mode 100644 Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj create mode 100644 Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Program.cs create mode 100644 Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj create mode 100644 Executables/net48/Duplicati.CommandLine.RecoveryTool/Program.cs create mode 100644 Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj create mode 100644 Executables/net48/Duplicati.CommandLine/Program.cs create mode 100644 Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj create mode 100644 Executables/net48/Duplicati.GUI.TrayIcon/Program.cs create mode 100644 Executables/net48/Duplicati.Server/Duplicati.Server.csproj create mode 100644 Executables/net48/Duplicati.Server/Program.cs create mode 100644 Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj create mode 100644 Executables/net48/Duplicati.WindowsService/Program.cs create mode 100644 Executables/net48/Duplicati_Service/Duplicati.Service.csproj create mode 100644 Executables/net48/Duplicati_Service/Program.cs diff --git a/Duplicati.sln b/Duplicati.sln index e4323bb42..264aa26c2 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -131,6 +131,28 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.WindowsService", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Executables\net5\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{0F5A1F4E-25FA-4D02-920D-CA2138498081}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net48", "net48", "{E858B0D8-ADA9-4288-8C46-1DF696E07046}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Service", "Executables\net48\Duplicati_Service\Duplicati.Service.csproj", "{6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Executables\net48\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{7A51E705-9D09-434A-8E69-AA6B2C926BD1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net48\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{A0BF82B2-A742-4DD7-BF68-43967E763EF5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTester", "Executables\net48\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{1B392058-4534-4812-879C-17C548469558}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTool", "Executables\net48\Duplicati.CommandLine.BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{F110D89E-23B9-4346-BAD9-BED352CF1CC9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.ConfigurationImporter", "Executables\net48\Duplicati.CommandLine.ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{42876A0B-03DA-4149-9BEF-83372C15C699}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.RecoveryTool", "Executables\net48\Duplicati.CommandLine.RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{F863361E-64E6-4602-ABAF-7300DF79E690}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.GUI.TrayIcon", "Executables\net48\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{BB8EFA2D-63AA-4629-87D5-460CC9439487}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Server", "Executables\net48\Duplicati.Server\Duplicati.Server.csproj", "{26BC9AEE-E156-4246-BFF8-21E3424DC4F7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.WindowsService", "Executables\net48\Duplicati.WindowsService\Duplicati.WindowsService.csproj", "{E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -385,6 +407,46 @@ Global {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Debug|Any CPU.Build.0 = Debug|Any CPU {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Release|Any CPU.Build.0 = Release|Any CPU + {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Release|Any CPU.Build.0 = Release|Any CPU + {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Release|Any CPU.Build.0 = Release|Any CPU + {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Release|Any CPU.Build.0 = Release|Any CPU + {1B392058-4534-4812-879C-17C548469558}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1B392058-4534-4812-879C-17C548469558}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B392058-4534-4812-879C-17C548469558}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1B392058-4534-4812-879C-17C548469558}.Release|Any CPU.Build.0 = Release|Any CPU + {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Release|Any CPU.Build.0 = Release|Any CPU + {42876A0B-03DA-4149-9BEF-83372C15C699}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42876A0B-03DA-4149-9BEF-83372C15C699}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42876A0B-03DA-4149-9BEF-83372C15C699}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42876A0B-03DA-4149-9BEF-83372C15C699}.Release|Any CPU.Build.0 = Release|Any CPU + {F863361E-64E6-4602-ABAF-7300DF79E690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F863361E-64E6-4602-ABAF-7300DF79E690}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F863361E-64E6-4602-ABAF-7300DF79E690}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F863361E-64E6-4602-ABAF-7300DF79E690}.Release|Any CPU.Build.0 = Release|Any CPU + {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Release|Any CPU.Build.0 = Release|Any CPU + {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Release|Any CPU.Build.0 = Release|Any CPU + {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -416,5 +478,16 @@ Global {55EEEBD2-CE45-45D6-9838-958F1C7354E4} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {5D20B150-C445-47BE-8CE8-C9F74F19A4F2} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {0F5A1F4E-25FA-4D02-920D-CA2138498081} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {E858B0D8-ADA9-4288-8C46-1DF696E07046} = {FA88A246-EF8E-46E3-90AF-539B8C0A6ADE} + {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {7A51E705-9D09-434A-8E69-AA6B2C926BD1} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {A0BF82B2-A742-4DD7-BF68-43967E763EF5} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {1B392058-4534-4812-879C-17C548469558} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {F110D89E-23B9-4346-BAD9-BED352CF1CC9} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {42876A0B-03DA-4149-9BEF-83372C15C699} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {F863361E-64E6-4602-ABAF-7300DF79E690} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {BB8EFA2D-63AA-4629-87D5-460CC9439487} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {26BC9AEE-E156-4246-BFF8-21E3424DC4F7} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} + {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} EndGlobalSection EndGlobal diff --git a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index 9e8d2f49f..903945950 100644 --- a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Duplicati.CommandLine.AutoUpdater.Implementation Duplicati.CommandLine.AutoUpdater diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 125af4987..4de7a6bf0 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A backend debugging tool for Duplicati Duplicati.CommandLine.BackendTester.Implementation diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 040c2c37b..b6f5452b4 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Duplicati.CommandLine.BackendTool.Implementation Duplicati.CommandLine.BackendTool diff --git a/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj index 6eaca98f1..e74cf98bd 100644 --- a/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A commandline version of Duplicati Duplicati.CommandLine.Implementation diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index 552f70d7c..e25a87f59 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Duplicati.CommandLine.ConfigurationImporter.Implementation Duplicati.CommandLine.ConfigurationImporter diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index a77927393..3e7df6992 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 RecoveryTool for Duplicati Duplicati.CommandLine.RecoveryTool.Implementation diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 0c4af6124..ac7a8b1d6 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 The Duplicati Tray implementation Duplicati.GUI.TrayIcon.Implementation diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 5607d0508..7fb91f7f9 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 AutoUpdater library for Duplicati diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index d35ff0513..ad57b7276 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 An alternative FTP backend for Duplicati diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 72ee342e1..976f062b6 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 An Azure blob storage backend for Duplicati diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index 7d6aeafb5..3ba889fe9 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Backblaze backend for Duplicati diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 17195a1f6..2148f61a8 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Box backend for Duplicati diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index f791eeba5..0edee68e9 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 CloudFiles backend for Duplicati diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index 335504db6..3cde2222c 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Dropbox backend for Duplicati diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index 4723a84db..1fc87ad77 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A FTP backend for Duplicati diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index ea38ecab6..59a60d0c1 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 File backend for Duplicati diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 7e0560e75..472013ec6 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 GoogleCloudStorage backend for Duplicati diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index caa60e4ac..439650bfa 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 HubiC backend for Duplicati diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index dad384a70..a6a6b37d8 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Jottacloud backend for Duplicati diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index de2eb8c20..8039ee179 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Mega backend for Duplicati diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index 96e58c275..b7ccd34eb 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 OAuthHelper backend for Duplicati diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 6221407d3..622d85f21 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 OneDrive backend for Duplicati diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index 365354e85..24551a7ff 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 OpenStack backend for Duplicati diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 50b83f006..5a44fcde9 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Rclone backend for Duplicati diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index ad1df0555..02e8135b1 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 S3 backend for Duplicati diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index a103b2fe8..d49762cda 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 SSHv2 backend for Duplicati diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index 45dda835e..7b6e34fd0 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A SharePoint Online Backend for Duplicati (includes OneDrive for Business support) diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index b779810b6..6143a9a2d 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Sia backend for Duplicati diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index b383e2364..32be2a2b6 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 TahoeLAFS backend for Duplicati diff --git a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj index dbd78c712..3476fc4df 100644 --- a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj +++ b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Tardigrade backend for Duplicati diff --git a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj index a041295df..dd85c0385 100644 --- a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj +++ b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj @@ -1,6 +1,6 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Library false diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index eaedc5752..1acd3b8cc 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 WEBDAV backend for Duplicati diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index ec9ff310d..4770b267a 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Library.IO diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 272a1a66c..2b78e9016 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Compression implementation for Duplicati diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index f12092301..43d58998f 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Dynamic Loader for Duplicati diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index e5aa5d688..83ae624c4 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Encryption implementation for Duplicati diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 47bb34216..f4a2aa007 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 The Duplicati library with all publicly exposed interfaces diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index be370e485..aa68e593f 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Localization implementation for Duplicati diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index b1e373704..3a8d3857f 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -1,6 +1,6 @@ - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A module for logging troubleshooting data diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 5f6293e85..d6064b891 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 The main Duplicati implementation module diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 44883dd23..a7c9d13c2 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Buildin modules for Duplicati diff --git a/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs b/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs index 8c0f8fe72..a3e5fbae2 100644 --- a/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs +++ b/Duplicati/Library/SQLiteHelper/DatabaseUpgrader.cs @@ -153,7 +153,7 @@ namespace Duplicati.Library.SQLiteHelper //The resource name will be "Duplicati.Library.Main.Database.Database_schema.1.Sample upgrade.sql" //The number indicates the version that will be upgraded to //Could be ""Duplicati.Server.Database.Database_schema.1. Add Notifications.sql"" - if (s.Contains(prefix, StringComparison.Ordinal) && !s.EndsWith(prefix + SCHEMA_NAME)) + if ((s.IndexOf(prefix, 0, StringComparison.Ordinal) >= 0) && !s.EndsWith(prefix + SCHEMA_NAME)) { try { diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index 4cbf3ff84..eeb399d68 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 SQLiteHelper for Duplicati diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index bbc91a9e8..a36a95f2f 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A disk snapshot implementation for Duplicati diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index d8395514d..6d56f475d 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Usage reporter for Duplicati diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 4b4203cec..9993760f6 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A collection of utility functions used extensively in Duplicati diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 78a288271..2bbcbbfcc 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 A license text reader for Duplicati diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index e9dbd012a..48d78e993 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Serialization module for Duplicati diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index f9a8e2de7..d46230c8e 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 The Server Duplicati implementation Duplicati.Server.Implementation diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index bd271e01f..4e297af54 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Duplicati.Service.Implementation diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index 874ff2b1d..78b679de1 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Dummy Tools copy library diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 0363469b1..960fb61f8 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 LGPL, Copyright © Duplicati Team 2021 Duplicati.WindowsService.Implementation @@ -17,7 +17,7 @@ - - + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj new file mode 100644 index 000000000..5552b657b --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -0,0 +1,15 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + AutoUpdater tool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.AutoUpdater/Program.cs b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Program.cs new file mode 100644 index 000000000..4a1ef94a7 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.AutoUpdater.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.AutoUpdater.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj new file mode 100644 index 000000000..259dbde01 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -0,0 +1,15 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + A backend debugging tool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTester/Program.cs b/Executables/net48/Duplicati.CommandLine.BackendTester/Program.cs new file mode 100644 index 000000000..b16773448 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.BackendTester/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.BackendTester.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.BackendTester.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj new file mode 100644 index 000000000..d5834aba5 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -0,0 +1,16 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + Tool for file-level access to remote destinations + + + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTool/Program.cs b/Executables/net48/Duplicati.CommandLine.BackendTool/Program.cs new file mode 100644 index 000000000..aacea31c5 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.BackendTool/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.BackendTool.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.BackendTool.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj new file mode 100644 index 000000000..e00389342 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -0,0 +1,15 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + Configuration Import Tool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Program.cs b/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Program.cs new file mode 100644 index 000000000..2d9f8b5c7 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.ConfigurationImporter.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.ConfigurationImporter.ConfigurationImporter.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj new file mode 100644 index 000000000..5633c3ca9 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -0,0 +1,15 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + RecoveryTool for Duplicati + + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.RecoveryTool/Program.cs b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Program.cs new file mode 100644 index 000000000..5c7e2848d --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.RecoveryTool.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.RecoveryTool.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj b/Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj new file mode 100644 index 000000000..1254483ed --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj @@ -0,0 +1,15 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + Commandline implementation of Duplicati + + + + + + + + diff --git a/Executables/net48/Duplicati.CommandLine/Program.cs b/Executables/net48/Duplicati.CommandLine/Program.cs new file mode 100644 index 000000000..beda17e05 --- /dev/null +++ b/Executables/net48/Duplicati.CommandLine/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.CommandLine.CLI.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.CommandLine.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj new file mode 100644 index 000000000..85235f1f4 --- /dev/null +++ b/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -0,0 +1,15 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + The Duplicati Tray implementation + ..\..\..\Duplicati\GUI\Duplicati.GUI.TrayIcon\Duplicati.ico + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.GUI.TrayIcon/Program.cs b/Executables/net48/Duplicati.GUI.TrayIcon/Program.cs new file mode 100644 index 000000000..6e4552ba9 --- /dev/null +++ b/Executables/net48/Duplicati.GUI.TrayIcon/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.GUI.TrayIcon.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.GUI.TrayIcon.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.Server/Duplicati.Server.csproj b/Executables/net48/Duplicati.Server/Duplicati.Server.csproj new file mode 100644 index 000000000..8a627ad94 --- /dev/null +++ b/Executables/net48/Duplicati.Server/Duplicati.Server.csproj @@ -0,0 +1,16 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + The Server Duplicati implementation + Duplicati.Server + + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.Server/Program.cs b/Executables/net48/Duplicati.Server/Program.cs new file mode 100644 index 000000000..834667b9e --- /dev/null +++ b/Executables/net48/Duplicati.Server/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.Server.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.Server.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj b/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj new file mode 100644 index 000000000..dc36f40d7 --- /dev/null +++ b/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj @@ -0,0 +1,15 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + WindowsService for Duplicati + Duplicati.WindowsService + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.WindowsService/Program.cs b/Executables/net48/Duplicati.WindowsService/Program.cs new file mode 100644 index 000000000..c7ba47cbc --- /dev/null +++ b/Executables/net48/Duplicati.WindowsService/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.WindowsService.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.WindowsService.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net48/Duplicati_Service/Duplicati.Service.csproj b/Executables/net48/Duplicati_Service/Duplicati.Service.csproj new file mode 100644 index 000000000..2be8dfeb7 --- /dev/null +++ b/Executables/net48/Duplicati_Service/Duplicati.Service.csproj @@ -0,0 +1,14 @@ + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + Service controller for Duplicati + + + + + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati_Service/Program.cs b/Executables/net48/Duplicati_Service/Program.cs new file mode 100644 index 000000000..53eeb44b6 --- /dev/null +++ b/Executables/net48/Duplicati_Service/Program.cs @@ -0,0 +1,9 @@ +namespace Duplicati.Service.Net5 +{ + // Wrapper class to keep code independent + public static class Program + { + public static int Main(string[] args) + => Duplicati.Service.Program.Main(args); + } +} \ No newline at end of file diff --git a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 9bad589f6..a8f1cc3b1 100644 --- a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -5,7 +5,7 @@ net5.0 LGPL, Copyright © Duplicati Team 2021 The Duplicati Tray implementation - ..\..\..\Duplicati\GUI\Duplicati.ico + ..\..\..\Duplicati\GUI\Duplicati.GUI.TrayIcon\Duplicati.ico diff --git a/Installer/Windows/UpdateVersion/UpdateVersion.csproj b/Installer/Windows/UpdateVersion/UpdateVersion.csproj index 4b2fbf8ad..26ae94ab3 100644 --- a/Installer/Windows/UpdateVersion/UpdateVersion.csproj +++ b/Installer/Windows/UpdateVersion/UpdateVersion.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 2.0.0.7 LGPL, Copyright � Duplicati Team 2015 diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/thirdparty/UnixSupport/UnixSupport.csproj index ad63ee160..486f772ab 100644 --- a/thirdparty/UnixSupport/UnixSupport.csproj +++ b/thirdparty/UnixSupport/UnixSupport.csproj @@ -1,7 +1,7 @@  - netstandard2.1 + netstandard2.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2015 UnixSupport From b550e61d9bd832ede657d598d7fce5bf5ddcd6e0 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sat, 3 Apr 2021 21:47:54 +0200 Subject: [PATCH 150/253] Re-added compatibility analyzers --- BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj | 9 ++++++++- BuildTools/DependencyFinder/DependencyFinder.csproj | 9 ++++++++- BuildTools/GnupgSigningTool/GnupgSigningTool.csproj | 9 ++++++++- BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj | 9 ++++++++- .../AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj | 7 +++++++ .../Duplicati.CommandLine.BackendTester.csproj | 7 +++++++ .../BackendTool/Duplicati.CommandLine.BackendTool.csproj | 7 +++++++ .../Duplicati.CommandLine.ConfigurationImporter.csproj | 7 +++++++ .../Duplicati.CommandLine.RecoveryTool.csproj | 7 +++++++ .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 7 +++++++ .../AutoUpdater/Duplicati.Library.AutoUpdater.csproj | 7 +++++++ .../Duplicati.Library.Backend.AlternativeFTP.csproj | 7 +++++++ .../AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj | 7 +++++++ .../Backblaze/Duplicati.Library.Backend.Backblaze.csproj | 7 +++++++ .../Backend/Box/Duplicati.Library.Backend.Box.csproj | 7 +++++++ .../Duplicati.Library.Backend.CloudFiles.csproj | 7 +++++++ .../Dropbox/Duplicati.Library.Backend.Dropbox.csproj | 7 +++++++ .../Backend/FTP/Duplicati.Library.Backend.FTP.csproj | 7 +++++++ .../Backend/File/Duplicati.Library.Backend.File.csproj | 7 +++++++ .../Duplicati.Library.Backend.GoogleServices.csproj | 7 +++++++ .../Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj | 7 +++++++ .../Duplicati.Library.Backend.Jottacloud.csproj | 7 +++++++ .../Backend/Mega/Duplicati.Library.Backend.Mega.csproj | 7 +++++++ .../OAuthHelper/Duplicati.Library.OAuthHelper.csproj | 7 +++++++ .../OneDrive/Duplicati.Library.Backend.OneDrive.csproj | 7 +++++++ .../OpenStack/Duplicati.Library.Backend.OpenStack.csproj | 7 +++++++ .../Rclone/Duplicati.Library.Backend.Rclone.csproj | 7 +++++++ .../Backend/S3/Duplicati.Library.Backend.S3.csproj | 7 +++++++ .../Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj | 7 +++++++ .../Duplicati.Library.Backend.SharePoint.csproj | 7 +++++++ .../Backend/Sia/Duplicati.Library.Backend.Sia.csproj | 7 +++++++ .../TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj | 7 +++++++ .../Duplicati.Library.Backend.Tardigrade.csproj | 7 +++++++ .../Duplicati.Library.Backend.TencentCOS.csproj | 8 ++++++++ .../WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj | 7 +++++++ Duplicati/Library/Common/Duplicati.Library.Common.csproj | 6 ++++++ .../Compression/Duplicati.Library.Compression.csproj | 7 +++++++ .../DynamicLoader/Duplicati.Library.DynamicLoader.csproj | 7 +++++++ .../Encryption/Duplicati.Library.Encryption.csproj | 7 +++++++ .../Library/Interface/Duplicati.Library.Interface.csproj | 7 +++++++ .../Localization/Duplicati.Library.Localization.csproj | 7 +++++++ .../Library/Logging/Duplicati.Library.Logging.csproj | 8 ++++++++ Duplicati/Library/Main/Duplicati.Library.Main.csproj | 7 +++++++ .../Builtin/Duplicati.Library.Modules.Builtin.csproj | 7 +++++++ .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 7 +++++++ .../Library/Snapshots/Duplicati.Library.Snapshots.csproj | 9 ++++++++- .../UsageReporter/Duplicati.Library.UsageReporter.csproj | 7 +++++++ .../Library/Utility/Duplicati.Library.Utility.csproj | 7 +++++++ Duplicati/License/Duplicati.License.csproj | 7 +++++++ .../Duplicati.Server.Serialization.csproj | 7 +++++++ Duplicati/Server/Duplicati.Server.csproj | 7 +++++++ Duplicati/Service/Duplicati.Service.csproj | 7 +++++++ Duplicati/Tools/Duplicati.Tools.csproj | 7 +++++++ Duplicati/UnitTest/Duplicati.UnitTest.csproj | 7 +++++++ Duplicati/WindowsService/WindowsService.csproj | 8 ++++++++ .../Duplicati.CommandLine.AutoUpdater.csproj | 6 ++++++ .../Duplicati.CommandLine.BackendTester.csproj | 7 +++++++ .../Duplicati.CommandLine.BackendTool.csproj | 6 ++++++ .../Duplicati.CommandLine.ConfigurationImporter.csproj | 7 +++++++ .../Duplicati.CommandLine.RecoveryTool.csproj | 7 +++++++ .../Duplicati.CommandLine/Duplicati.CommandLine.csproj | 7 +++++++ .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 7 +++++++ .../net48/Duplicati.Server/Duplicati.Server.csproj | 6 ++++++ .../Duplicati.WindowsService.csproj | 7 +++++++ .../net48/Duplicati_Service/Duplicati.Service.csproj | 7 +++++++ .../Duplicati.CommandLine.AutoUpdater.csproj | 6 ++++++ .../Duplicati.CommandLine.BackendTester.csproj | 7 +++++++ .../Duplicati.CommandLine.BackendTool.csproj | 6 ++++++ .../Duplicati.CommandLine.ConfigurationImporter.csproj | 7 +++++++ .../Duplicati.CommandLine.RecoveryTool.csproj | 7 +++++++ .../Duplicati.CommandLine/Duplicati.CommandLine.csproj | 7 +++++++ .../Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 7 +++++++ .../net5/Duplicati.Server/Duplicati.Server.csproj | 6 ++++++ .../Duplicati.WindowsService.csproj | 7 +++++++ .../net5/Duplicati_Service/Duplicati.Service.csproj | 7 +++++++ Installer/Windows/UpdateVersion/UpdateVersion.csproj | 9 ++++++++- Tools/SQLiteTool/SQLiteTool.csproj | 9 ++++++++- Tools/ZipFileDebugger/ZipFileDebugger.csproj | 9 ++++++++- thirdparty/UnixSupport/UnixSupport.csproj | 9 ++++++++- 79 files changed, 558 insertions(+), 9 deletions(-) diff --git a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj index f99c18099..acd98ecac 100644 --- a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj +++ b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj @@ -5,7 +5,7 @@ net5.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 Duplicati.BuildTools.AutoUpdateBuilder Duplicati Team Duplicati Team @@ -26,4 +26,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/BuildTools/DependencyFinder/DependencyFinder.csproj b/BuildTools/DependencyFinder/DependencyFinder.csproj index b2d393b4f..58bed04ec 100644 --- a/BuildTools/DependencyFinder/DependencyFinder.csproj +++ b/BuildTools/DependencyFinder/DependencyFinder.csproj @@ -5,7 +5,7 @@ net5.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 Duplicati.BuildTools.DependencyFinder Duplicati Team Duplicati Team @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj index a1c84cf38..a478b97c3 100644 --- a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj +++ b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj @@ -4,7 +4,7 @@ net5.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 GnupgSigningTool Duplicati Team Duplicati Team @@ -18,4 +18,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj index 9455f79a1..72ea2d403 100644 --- a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj +++ b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj @@ -5,7 +5,7 @@ net5.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 Duplicati.BuildTools.UpdateVersionStamp Duplicati Team Duplicati Team @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index 903945950..b20d98842 100644 --- a/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Duplicati/CommandLine/AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -13,4 +13,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 4de7a6bf0..e976309b6 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -81,4 +81,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index b6f5452b4..2e8d804b8 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -68,4 +68,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index e25a87f59..8f2ef415d 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 3e7df6992..1c53e2cf2 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -73,4 +73,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index ac7a8b1d6..58aaed530 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -139,4 +139,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 7fb91f7f9..474ad660b 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -26,4 +26,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index ad57b7276..aa3121d96 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj index 976f062b6..7807d49a5 100644 --- a/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj +++ b/Duplicati/Library/Backend/AzureBlob/Duplicati.Library.Backend.AzureBlob.csproj @@ -26,5 +26,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj index 3ba889fe9..6dc28bfde 100644 --- a/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj +++ b/Duplicati/Library/Backend/Backblaze/Duplicati.Library.Backend.Backblaze.csproj @@ -16,5 +16,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj index 2148f61a8..6ac3082d2 100644 --- a/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj +++ b/Duplicati/Library/Backend/Box/Duplicati.Library.Backend.Box.csproj @@ -17,5 +17,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index 0edee68e9..35b4d9b0d 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj index 3cde2222c..5ed63c06a 100644 --- a/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj +++ b/Duplicati/Library/Backend/Dropbox/Duplicati.Library.Backend.Dropbox.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index 1fc87ad77..e2af3070a 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -13,4 +13,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index 59a60d0c1..06d0927ff 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj index 472013ec6..838b88126 100644 --- a/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj +++ b/Duplicati/Library/Backend/GoogleServices/Duplicati.Library.Backend.GoogleServices.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj index 439650bfa..2a8321585 100644 --- a/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj +++ b/Duplicati/Library/Backend/HubiC/Duplicati.Library.Backend.HubiC.csproj @@ -14,4 +14,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj index a6a6b37d8..a18810944 100644 --- a/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj +++ b/Duplicati/Library/Backend/Jottacloud/Duplicati.Library.Backend.Jottacloud.csproj @@ -13,4 +13,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj index 8039ee179..4b51e6028 100644 --- a/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj +++ b/Duplicati/Library/Backend/Mega/Duplicati.Library.Backend.Mega.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj index b7ccd34eb..07ec7e4c1 100644 --- a/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj +++ b/Duplicati/Library/Backend/OAuthHelper/Duplicati.Library.OAuthHelper.csproj @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index 622d85f21..f6363f4b8 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -18,4 +18,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj index 24551a7ff..3344e120f 100644 --- a/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj +++ b/Duplicati/Library/Backend/OpenStack/Duplicati.Library.Backend.OpenStack.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj index 5a44fcde9..38f4d05cc 100644 --- a/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj +++ b/Duplicati/Library/Backend/Rclone/Duplicati.Library.Backend.Rclone.csproj @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index 02e8135b1..d2e9eda24 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -21,4 +21,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index d49762cda..686cff3df 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index 7b6e34fd0..a37b67a58 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -23,4 +23,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj index 6143a9a2d..cfbda4a0e 100644 --- a/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj +++ b/Duplicati/Library/Backend/Sia/Duplicati.Library.Backend.Sia.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 32be2a2b6..099f37fd7 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj index 3476fc4df..9eb1f11d0 100644 --- a/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj +++ b/Duplicati/Library/Backend/Tardigrade/Duplicati.Library.Backend.Tardigrade.csproj @@ -17,5 +17,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj index dd85c0385..3b98c482c 100644 --- a/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj +++ b/Duplicati/Library/Backend/TencentCOS/Duplicati.Library.Backend.TencentCOS.csproj @@ -20,4 +20,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index 1acd3b8cc..e447fab2a 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -13,4 +13,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 4770b267a..6ef3565a6 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -25,5 +25,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index 2b78e9016..de9d44c0e 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -23,4 +23,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 43d58998f..52b1b1c43 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -13,4 +13,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index 83ae624c4..f350ee834 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index f4a2aa007..1c11a459d 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -10,4 +10,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index aa68e593f..d8774b9f0 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -18,4 +18,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index 3a8d3857f..cf5de33ef 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -4,4 +4,12 @@ LGPL, Copyright © Duplicati Team 2021 A module for logging troubleshooting data + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index d6064b891..18d1ce246 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -54,4 +54,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index a7c9d13c2..e1a757697 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -32,4 +32,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index eeb399d68..8b455cb76 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -42,4 +42,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index a36a95f2f..e2d629f25 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -36,5 +36,12 @@ PreserveNewest - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj index 6d56f475d..ea775e50c 100644 --- a/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj +++ b/Duplicati/Library/UsageReporter/Duplicati.Library.UsageReporter.csproj @@ -16,5 +16,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 9993760f6..5c399904c 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -17,4 +17,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 2bbcbbfcc..5d01c30e9 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -345,4 +345,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 48d78e993..3f924e161 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -11,4 +11,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index d46230c8e..075abe447 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -124,4 +124,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index 4e297af54..77c73281b 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -11,4 +11,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index 78b679de1..1ba07522a 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -56,4 +56,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index fb78e4bb8..714e5fecb 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -102,4 +102,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 960fb61f8..58d921991 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -20,4 +20,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index 5552b657b..1c69409d5 100644 --- a/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -11,5 +11,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj index 259dbde01..d704d0857 100644 --- a/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -11,5 +11,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj index d5834aba5..ec44fa040 100644 --- a/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -12,5 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index e00389342..7bab10e57 100644 --- a/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Executables/net48/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -11,5 +11,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 5633c3ca9..30dd26ba8 100644 --- a/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj b/Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj index 1254483ed..e6d790698 100644 --- a/Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj +++ b/Executables/net48/Duplicati.CommandLine/Duplicati.CommandLine.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 85235f1f4..da3facd1e 100644 --- a/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -11,5 +11,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.Server/Duplicati.Server.csproj b/Executables/net48/Duplicati.Server/Duplicati.Server.csproj index 8a627ad94..005c812eb 100644 --- a/Executables/net48/Duplicati.Server/Duplicati.Server.csproj +++ b/Executables/net48/Duplicati.Server/Duplicati.Server.csproj @@ -12,5 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj b/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj index dc36f40d7..f0fedaa58 100644 --- a/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj +++ b/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati_Service/Duplicati.Service.csproj b/Executables/net48/Duplicati_Service/Duplicati.Service.csproj index 2be8dfeb7..a7658fc77 100644 --- a/Executables/net48/Duplicati_Service/Duplicati.Service.csproj +++ b/Executables/net48/Duplicati_Service/Duplicati.Service.csproj @@ -11,4 +11,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index df8d7918e..e254cb1a0 100644 --- a/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -11,5 +11,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj index 7ea2aa927..c69a8a191 100644 --- a/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj index f14021666..6f9403514 100644 --- a/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -12,5 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index c5c439198..06811ba04 100644 --- a/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 6581fe9d1..b72482467 100644 --- a/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj index f75a9f86c..4c86b2311 100644 --- a/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj +++ b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index a8f1cc3b1..ffdf470b1 100644 --- a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -12,4 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.Server/Duplicati.Server.csproj b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj index cc432a9ec..c87e770eb 100644 --- a/Executables/net5/Duplicati.Server/Duplicati.Server.csproj +++ b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj @@ -12,5 +12,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj b/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj index 359c8035a..c7cb6a9f9 100644 --- a/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj +++ b/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj @@ -11,5 +11,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + \ No newline at end of file diff --git a/Executables/net5/Duplicati_Service/Duplicati.Service.csproj b/Executables/net5/Duplicati_Service/Duplicati.Service.csproj index a21d6c4ff..96feb1b5e 100644 --- a/Executables/net5/Duplicati_Service/Duplicati.Service.csproj +++ b/Executables/net5/Duplicati_Service/Duplicati.Service.csproj @@ -11,4 +11,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Installer/Windows/UpdateVersion/UpdateVersion.csproj b/Installer/Windows/UpdateVersion/UpdateVersion.csproj index 26ae94ab3..33f02c494 100644 --- a/Installer/Windows/UpdateVersion/UpdateVersion.csproj +++ b/Installer/Windows/UpdateVersion/UpdateVersion.csproj @@ -4,7 +4,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright � Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 UpdateVersion UpdateVersion Duplicati Team @@ -12,4 +12,11 @@ UpdateVersion + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Tools/SQLiteTool/SQLiteTool.csproj b/Tools/SQLiteTool/SQLiteTool.csproj index c684f3d13..8dc5ee11a 100644 --- a/Tools/SQLiteTool/SQLiteTool.csproj +++ b/Tools/SQLiteTool/SQLiteTool.csproj @@ -5,7 +5,7 @@ net5.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 Duplicati.Tools.SQLiteTool Duplicati Team Duplicati Team @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Tools/ZipFileDebugger/ZipFileDebugger.csproj b/Tools/ZipFileDebugger/ZipFileDebugger.csproj index be01c9117..e7014b6ce 100644 --- a/Tools/ZipFileDebugger/ZipFileDebugger.csproj +++ b/Tools/ZipFileDebugger/ZipFileDebugger.csproj @@ -5,7 +5,7 @@ net5.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 Duplicati.Tools.ZipFileDebugger Duplicati Team Duplicati Team @@ -19,4 +19,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/thirdparty/UnixSupport/UnixSupport.csproj index 486f772ab..aac290b92 100644 --- a/thirdparty/UnixSupport/UnixSupport.csproj +++ b/thirdparty/UnixSupport/UnixSupport.csproj @@ -3,7 +3,7 @@ netstandard2.0 2.0.0.7 - LGPL, Copyright © Duplicati Team 2015 + LGPL, Copyright © Duplicati Team 2021 UnixSupport Duplicati Team Duplicati Team @@ -16,4 +16,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file From 4911cfdaa407a08b953dea1e1fd7531dcd5a8563 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhede Date: Sat, 3 Apr 2021 21:50:52 +0200 Subject: [PATCH 151/253] Reworked AlphaFS and AlphaVSS to use pre-built versions targeting `netstandard2.0` to avoid excessive warnings on build. Still needs to include he native files. --- .../Common/Duplicati.Library.Common.csproj | 15 +- .../Library/Common/IO/SystemIOWindows.cs | 4 +- thirdparty/alphafs/AlphaFS.dll | Bin 0 -> 378368 bytes thirdparty/alphafs/Homepage.txt | 1 + thirdparty/alphafs/License.txt | 19 ++ thirdparty/alphafs/build-info.txt | 1 + thirdparty/alphafs/licensedata.json | 7 + thirdparty/alphavss/AlphaVSS.Common.dll | Bin 0 -> 71168 bytes thirdparty/alphavss/Homepage.txt | 2 +- thirdparty/alphavss/License.txt | 203 +++++++++++++++++- thirdparty/alphavss/build-diff.patch | 87 ++++++++ thirdparty/alphavss/build-info.txt | 5 + thirdparty/alphavss/licensedata.json | 4 +- .../runtimes/win-x64/AlphaVSS.x64.dll | Bin 0 -> 325120 bytes .../alphavss/runtimes/win-x64/Ijwhost.dll | Bin 0 -> 342392 bytes .../runtimes/win-x86/AlphaVSS.x86.dll | Bin 0 -> 289792 bytes .../alphavss/runtimes/win-x86/Ijwhost.dll | Bin 0 -> 257912 bytes 17 files changed, 335 insertions(+), 13 deletions(-) create mode 100644 thirdparty/alphafs/AlphaFS.dll create mode 100644 thirdparty/alphafs/Homepage.txt create mode 100644 thirdparty/alphafs/License.txt create mode 100644 thirdparty/alphafs/build-info.txt create mode 100644 thirdparty/alphafs/licensedata.json create mode 100644 thirdparty/alphavss/AlphaVSS.Common.dll create mode 100644 thirdparty/alphavss/build-diff.patch create mode 100644 thirdparty/alphavss/build-info.txt create mode 100644 thirdparty/alphavss/runtimes/win-x64/AlphaVSS.x64.dll create mode 100644 thirdparty/alphavss/runtimes/win-x64/Ijwhost.dll create mode 100644 thirdparty/alphavss/runtimes/win-x86/AlphaVSS.x86.dll create mode 100644 thirdparty/alphavss/runtimes/win-x86/Ijwhost.dll diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 6ef3565a6..0fa7fbfc8 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -7,9 +7,19 @@ + + + ..\..\..\thirdparty\alphafs\AlphaFS.dll + + + ..\..\..\thirdparty\alphavss\AlphaVSS.Common.dll + + + + + - - @@ -24,7 +34,6 @@ - all diff --git a/Duplicati/Library/Common/IO/SystemIOWindows.cs b/Duplicati/Library/Common/IO/SystemIOWindows.cs index 4758ba1cf..4f118ca3b 100644 --- a/Duplicati/Library/Common/IO/SystemIOWindows.cs +++ b/Duplicati/Library/Common/IO/SystemIOWindows.cs @@ -520,11 +520,11 @@ namespace Duplicati.Library.Common.IO if (asDir) { - Alphaleonis.Win32.Filesystem.Directory.CreateSymbolicLink(PrefixWithUNC(symlinkfile), target, AlphaFS.PathFormat.LongFullPath); + AlphaFS.Directory.CreateSymbolicLink(PrefixWithUNC(symlinkfile), target, AlphaFS.PathFormat.LongFullPath); } else { - Alphaleonis.Win32.Filesystem.File.CreateSymbolicLink(PrefixWithUNC(symlinkfile), target, AlphaFS.PathFormat.LongFullPath); + AlphaFS.File.CreateSymbolicLink(PrefixWithUNC(symlinkfile), target, AlphaFS.PathFormat.LongFullPath); } //Sadly we do not get a notification if the creation fails :( diff --git a/thirdparty/alphafs/AlphaFS.dll b/thirdparty/alphafs/AlphaFS.dll new file mode 100644 index 0000000000000000000000000000000000000000..6b94121b9aa4eddb4ee60720339bf3476bd0ca2c GIT binary patch literal 378368 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�jo?Y4=Bn9r8CbIXe|R-t_4vCm2;{Dxd!CC#5~aa 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 q>BEr$k{5HqRW50Cm2IRpSifeH%% literal 0 HcmV?d00001 diff --git a/thirdparty/alphafs/Homepage.txt b/thirdparty/alphafs/Homepage.txt new file mode 100644 index 000000000..5f2402a99 --- /dev/null +++ b/thirdparty/alphafs/Homepage.txt @@ -0,0 +1 @@ +https://github.com/alphaleonis/AlphaFS \ No newline at end of file diff --git a/thirdparty/alphafs/License.txt b/thirdparty/alphafs/License.txt new file mode 100644 index 000000000..6a5afccb6 --- /dev/null +++ b/thirdparty/alphafs/License.txt @@ -0,0 +1,19 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2008-2018 Peter Palotas, Jeffrey Jangli, Alexandr Normuradov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to +whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/thirdparty/alphafs/build-info.txt b/thirdparty/alphafs/build-info.txt new file mode 100644 index 000000000..2d4317aba --- /dev/null +++ b/thirdparty/alphafs/build-info.txt @@ -0,0 +1 @@ +The build here is taken from 38970857fecc00501431197832fee257f30496f7, and only the netstandard2.0 library is used. \ No newline at end of file diff --git a/thirdparty/alphafs/licensedata.json b/thirdparty/alphafs/licensedata.json new file mode 100644 index 000000000..34c89fb60 --- /dev/null +++ b/thirdparty/alphafs/licensedata.json @@ -0,0 +1,7 @@ +{ + "name": "AlphaFS", + "description": "AlphaFS is a .NET library providing more complete Win32 file system functionality to the .NET platform than the standard System.IO classes.", + "link": "https://github.com/alphaleonis/AlphaFS", + "license": "MIT", + "notes": "" +} \ No newline at end of file diff --git a/thirdparty/alphavss/AlphaVSS.Common.dll b/thirdparty/alphavss/AlphaVSS.Common.dll new file mode 100644 index 0000000000000000000000000000000000000000..99f64d52fdf3e2fec636ade7cbb2f4b9f376d3e7 GIT binary patch literal 71168 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 Nt%ki%M?Huo1ONvOs6hY# literal 0 HcmV?d00001 diff --git a/thirdparty/alphavss/Homepage.txt b/thirdparty/alphavss/Homepage.txt index 7db6cb77a..a7d8f89a1 100644 --- a/thirdparty/alphavss/Homepage.txt +++ b/thirdparty/alphavss/Homepage.txt @@ -1 +1 @@ -http://alphavss.codeplex.com \ No newline at end of file +https://github.com/alphaleonis/AlphaVSS \ No newline at end of file diff --git a/thirdparty/alphavss/License.txt b/thirdparty/alphavss/License.txt index e9c7095ac..67fa08d7c 100644 --- a/thirdparty/alphavss/License.txt +++ b/thirdparty/alphavss/License.txt @@ -1,8 +1,201 @@ -License: The MIT License (MIT) -Copyright (c) 2008 Peter Palotas + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + 1. Definitions. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2008-2019 Peter Palotas + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/thirdparty/alphavss/build-diff.patch b/thirdparty/alphavss/build-diff.patch new file mode 100644 index 000000000..d1fec89fd --- /dev/null +++ b/thirdparty/alphavss/build-diff.patch @@ -0,0 +1,87 @@ +diff --git a/src/AlphaVSS.Common/AlphaVSS.Common.csproj b/src/AlphaVSS.Common/AlphaVSS.Common.csproj +index 4ad0e8f..4039061 100644 +--- a/src/AlphaVSS.Common/AlphaVSS.Common.csproj ++++ b/src/AlphaVSS.Common/AlphaVSS.Common.csproj +@@ -1,7 +1,7 @@ +  + + +- net45;netcoreapp3.1 ++ netstandard2.0 + false + + +@@ -34,6 +34,7 @@ + all + runtime; build; native; contentfiles; analyzers; buildtransitive + ++ + + + +diff --git a/src/AlphaVSS.Common/Classes/VssFactoryProvider.cs b/src/AlphaVSS.Common/Classes/VssFactoryProvider.cs +index be2438a..8aae1f9 100644 +--- a/src/AlphaVSS.Common/Classes/VssFactoryProvider.cs ++++ b/src/AlphaVSS.Common/Classes/VssFactoryProvider.cs +@@ -79,7 +79,7 @@ namespace Alphaleonis.Win32.Vss + if (assemblyName == null) + throw new ArgumentNullException(nameof(assemblyName), $"{nameof(assemblyName)} is null."); + +-#if NETCOREAPP ++// #if NETCOREAPP || NETSTANDARD + Log($"Attempting to locate \"{assemblyName.FullName}\""); + // In .NET Core the native binaries are placed under a runtimes\{rid}\native folder, which is where the platform + // specific binaries are placed in AlphaVSS nuget packages. However the location after building is different if +@@ -99,7 +99,7 @@ namespace Alphaleonis.Win32.Vss + { + // On non-windows systems, the ':' separator is used, but since we only run on windows we don't need to + // take that into consideration. +- searchDirectories = nativeSearchDirectories.Split(';', StringSplitOptions.RemoveEmptyEntries); ++ searchDirectories = nativeSearchDirectories.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + Log($"Using native search directories: {String.Join(", ", searchDirectories.Select(s => $"\"{s}\""))}"); + } + +@@ -116,7 +116,7 @@ namespace Alphaleonis.Win32.Vss + try + { + Log($"Loading \"{fullAssemblyFileName}\"."); +- var result = AssemblyLoadContext.Default.LoadFromAssemblyPath(fullAssemblyFileName); ++ var result = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromAssemblyPath(fullAssemblyFileName); + Log($"Loaded \"{result.FullName}\" from \"{result.Location}\"."); + return result; + } +@@ -133,20 +133,20 @@ namespace Alphaleonis.Win32.Vss + } + + throw new FileNotFoundException($"Failed to find assembly \"{assemblyName.FullName}\""); +-#elif NETFRAMEWORK +- Log($"Attempting to load assembly \"{assemblyName.FullName}\""); +- try +- { +- var result = Assembly.Load(assemblyName); +- Log($"Loaded \"{result.FullName}\" from \"{result.Location}\"."); +- return result; +- } +- catch (Exception ex) +- { +- Log($"Error loading \"{assemblyName.FullName}\"; {ex}"); +- throw; +- } +-#endif ++// #elif NETFRAMEWORK ++// Log($"Attempting to load assembly \"{assemblyName.FullName}\""); ++// try ++// { ++// var result = Assembly.Load(assemblyName); ++// Log($"Loaded \"{result.FullName}\" from \"{result.Location}\"."); ++// return result; ++// } ++// catch (Exception ex) ++// { ++// Log($"Error loading \"{assemblyName.FullName}\"; {ex}"); ++// throw; ++// } ++// #endif + } + } + } diff --git a/thirdparty/alphavss/build-info.txt b/thirdparty/alphavss/build-info.txt new file mode 100644 index 000000000..b1049e90c --- /dev/null +++ b/thirdparty/alphavss/build-info.txt @@ -0,0 +1,5 @@ +The build here is taken from 13462e657f7993da5c80f835d219bbe82079ce75, and only the netstandard2.0 library is used. +The diff shows the changes to the source code. + +The native libraries are extracted from the NuGet package: +https://www.nuget.org/packages/AlphaVSS.Native.NetCore/2.0.0 diff --git a/thirdparty/alphavss/licensedata.json b/thirdparty/alphavss/licensedata.json index ba619b1b4..cc18b8b49 100644 --- a/thirdparty/alphavss/licensedata.json +++ b/thirdparty/alphavss/licensedata.json @@ -1,7 +1,7 @@ { "name": "AlphaVSS", "description": "A library for accessing Windows Shadow Copy service", - "link": "http://alphavss.codeplex.com", - "license": "MIT", + "link": "https://github.com/alphaleonis/AlphaVSS", + "license": "Apache 2.0", "notes": "" } \ No newline at end of file diff --git a/thirdparty/alphavss/runtimes/win-x64/AlphaVSS.x64.dll b/thirdparty/alphavss/runtimes/win-x64/AlphaVSS.x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..a4874cff7937ef9e8bf680654fc66e78ac2e2283 GIT binary patch literal 325120 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

    g9cK=pX1nixOkU9iToR$cYaBMT?ZdPBgOx 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 literal 0 HcmV?d00001 diff --git a/thirdparty/alphavss/runtimes/win-x86/AlphaVSS.x86.dll b/thirdparty/alphavss/runtimes/win-x86/AlphaVSS.x86.dll new file mode 100644 index 0000000000000000000000000000000000000000..f9261fad69115c9d42cd11225a4cdfe116e2e861 GIT binary patch literal 289792 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

    VEQZcFjTdT%Ks`+!&@!QJH<1j`a*(hL26rZb zgAcd@vKU@0I1UZE5C&uhscq#se8u1|46De%%1p;m0>Go}T*mKck=mH2nA` z;Kh4M?d?2j1P{E;{4LrsV zG8r_$Z+xJg4Ll?ZaxbX30Lzy1K!*Q~PxiViw1X>V)PrZ)L4`O!Fs9Dy zM;jQS&H~L6gm?e!^I*^FrMbNW<|3N$Ok9U@X=Lo^YJ;+AKn1heln{AjF%b=Yn zW4PDg6L;ap|J}Pq*sQOY33q$ObRPmw-C0^+C}rtB^qL8@91Ub`Sog`HckVBz90&?`DZ%w=YlgK>_fgx2*^2*k70| z|NkH4*VY3ii2 zn7KP$|Fr(ElkH{UoB92}btq4X5a{+72Ze5y380xMH|y^;k3n$*p3CkOe*G0RBMqJb zb_?i@6X@Otn%e^{&k6{C!6yq!*QJ83|4Vp5Lg2-=KV?8|F!1^LaIN5Jt=_nV?tP#w zVj!gf;V&-8V9~uBMK^fPNq_;grN8@Jc!~0h-s>PeB|67lzkrU?0PP*E1;t6}kKR&H zYxK3qizC-TEszq<_$EDvaoLZW*!csl#%|5A}GhTs>Bg5b0# z1nQie2RZLWJ>;-BkLFqt&~m&op4SH5Wdg6YL096O|6eK+9QNXj0Foxq{KyM0h$dn9 z`pt_VyQ51`i6}UMfYw8RI|~~amo8ljSqcl9O9q7{ z)b%0=*9(AL?+kGWKgi+T=U;%%Ic+&m>IyyupS8P;=d~`#=^CJWLeBp$6$lP{Aqdq0 za&`Cl7s=@Ez5;c(0Ft{KYC(&?OL;&Mq4vL2;KlYk@VEe7wb@MKz35tbo@cM!*hA_}La}hr{WJSTz@xN38^Y?qEZU5KyA91Xaa|rZ;%GBs5JV{`&tP zGfjXC

    =OmN$}LqSu=&1pOgonqZhpe}c( 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 S-N~#m+qn6kTzSF3zyJV@&={Wp literal 0 HcmV?d00001 From 5a034f7b6d9d1d929373227ff6006f701b48145b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 3 Apr 2021 20:38:29 -0700 Subject: [PATCH 152/253] Fix mono.posix to the netstandard version and make it a first class citizen --- Duplicati.sln | 80 +- .../Common/Duplicati.Library.Common.csproj | 7 +- .../Duplicati.Library.SQLiteHelper.csproj | 7 +- Duplicati/Server/Duplicati.Server.csproj | 4 +- {thirdparty => Duplicati}/UnixSupport/File.cs | 688 +++++++++--------- .../UnixSupport/UnixSupport.csproj | 12 +- thirdparty/UnixSupport/README.txt | 3 - thirdparty/UnixSupport/UnixSupport.dll | Bin 8192 -> 0 bytes 8 files changed, 393 insertions(+), 408 deletions(-) rename {thirdparty => Duplicati}/UnixSupport/File.cs (97%) rename {thirdparty => Duplicati}/UnixSupport/UnixSupport.csproj (56%) delete mode 100644 thirdparty/UnixSupport/README.txt delete mode 100644 thirdparty/UnixSupport/UnixSupport.dll diff --git a/Duplicati.sln b/Duplicati.sln index 264aa26c2..4cb910a28 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -103,55 +103,57 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoU EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Tardigrade", "Duplicati\Library\Backend\Tardigrade\Duplicati.Library.Backend.Tardigrade.csproj", "{AE035E01-C917-4F13-A35E-78F21C1A2F17}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.TencentCOS", "Duplicati\Library\Backend\TencentCOS\Duplicati.Library.Backend.TencentCOS.csproj", "{545DD6D4-9476-42D6-B51C-A28E000C489E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.TencentCOS", "Duplicati\Library\Backend\TencentCOS\Duplicati.Library.Backend.TencentCOS.csproj", "{545DD6D4-9476-42D6-B51C-A28E000C489E}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Executables", "Executables", "{FA88A246-EF8E-46E3-90AF-539B8C0A6ADE}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net5", "net5", "{6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net5\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net5\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{95B7DD83-2C5A-4F1E-8EA7-39654B2B236A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Service", "Executables\net5\Duplicati_Service\Duplicati.Service.csproj", "{34149709-F3ED-4FB5-A087-43EB195C948B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Service", "Executables\net5\Duplicati_Service\Duplicati.Service.csproj", "{34149709-F3ED-4FB5-A087-43EB195C948B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTester", "Executables\net5\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTester", "Executables\net5\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{2F1C0C8D-5C15-4BC0-811F-87F2C98D9790}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTool", "Executables\net5\Duplicati.CommandLine.BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTool", "Executables\net5\Duplicati.CommandLine.BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{31FA5B9B-4CD6-4BF3-B7A9-12C1E30DCAF6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.ConfigurationImporter", "Executables\net5\Duplicati.CommandLine.ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{156B9B77-C2B7-4169-8FE7-1171D221446C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.ConfigurationImporter", "Executables\net5\Duplicati.CommandLine.ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{156B9B77-C2B7-4169-8FE7-1171D221446C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.RecoveryTool", "Executables\net5\Duplicati.CommandLine.RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{0FFC557E-1B84-46A2-B6E8-06064FA7EA58}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.RecoveryTool", "Executables\net5\Duplicati.CommandLine.RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{0FFC557E-1B84-46A2-B6E8-06064FA7EA58}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.GUI.TrayIcon", "Executables\net5\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{AF32C621-30DC-40F5-8CE6-DD69053068E9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.GUI.TrayIcon", "Executables\net5\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{AF32C621-30DC-40F5-8CE6-DD69053068E9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Server", "Executables\net5\Duplicati.Server\Duplicati.Server.csproj", "{55EEEBD2-CE45-45D6-9838-958F1C7354E4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Server", "Executables\net5\Duplicati.Server\Duplicati.Server.csproj", "{55EEEBD2-CE45-45D6-9838-958F1C7354E4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsService", "Duplicati\WindowsService\WindowsService.csproj", "{8A651E2D-A7C8-4EC7-B421-7A457654811D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WindowsService", "Duplicati\WindowsService\WindowsService.csproj", "{8A651E2D-A7C8-4EC7-B421-7A457654811D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.WindowsService", "Executables\net5\Duplicati.WindowsService\Duplicati.WindowsService.csproj", "{5D20B150-C445-47BE-8CE8-C9F74F19A4F2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.WindowsService", "Executables\net5\Duplicati.WindowsService\Duplicati.WindowsService.csproj", "{5D20B150-C445-47BE-8CE8-C9F74F19A4F2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Executables\net5\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{0F5A1F4E-25FA-4D02-920D-CA2138498081}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine", "Executables\net5\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{0F5A1F4E-25FA-4D02-920D-CA2138498081}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net48", "net48", "{E858B0D8-ADA9-4288-8C46-1DF696E07046}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Service", "Executables\net48\Duplicati_Service\Duplicati.Service.csproj", "{6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Service", "Executables\net48\Duplicati_Service\Duplicati.Service.csproj", "{6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine", "Executables\net48\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{7A51E705-9D09-434A-8E69-AA6B2C926BD1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine", "Executables\net48\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{7A51E705-9D09-434A-8E69-AA6B2C926BD1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net48\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{A0BF82B2-A742-4DD7-BF68-43967E763EF5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net48\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{A0BF82B2-A742-4DD7-BF68-43967E763EF5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTester", "Executables\net48\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{1B392058-4534-4812-879C-17C548469558}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTester", "Executables\net48\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{1B392058-4534-4812-879C-17C548469558}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.BackendTool", "Executables\net48\Duplicati.CommandLine.BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{F110D89E-23B9-4346-BAD9-BED352CF1CC9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTool", "Executables\net48\Duplicati.CommandLine.BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{F110D89E-23B9-4346-BAD9-BED352CF1CC9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.ConfigurationImporter", "Executables\net48\Duplicati.CommandLine.ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{42876A0B-03DA-4149-9BEF-83372C15C699}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.ConfigurationImporter", "Executables\net48\Duplicati.CommandLine.ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{42876A0B-03DA-4149-9BEF-83372C15C699}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.CommandLine.RecoveryTool", "Executables\net48\Duplicati.CommandLine.RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{F863361E-64E6-4602-ABAF-7300DF79E690}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.RecoveryTool", "Executables\net48\Duplicati.CommandLine.RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{F863361E-64E6-4602-ABAF-7300DF79E690}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.GUI.TrayIcon", "Executables\net48\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{BB8EFA2D-63AA-4629-87D5-460CC9439487}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.GUI.TrayIcon", "Executables\net48\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{BB8EFA2D-63AA-4629-87D5-460CC9439487}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Server", "Executables\net48\Duplicati.Server\Duplicati.Server.csproj", "{26BC9AEE-E156-4246-BFF8-21E3424DC4F7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Server", "Executables\net48\Duplicati.Server\Duplicati.Server.csproj", "{26BC9AEE-E156-4246-BFF8-21E3424DC4F7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.WindowsService", "Executables\net48\Duplicati.WindowsService\Duplicati.WindowsService.csproj", "{E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.WindowsService", "Executables\net48\Duplicati.WindowsService\Duplicati.WindowsService.csproj", "{E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnixSupport", "Duplicati\UnixSupport\UnixSupport.csproj", "{2B605B81-353F-43CD-BF3A-29B3926A204F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -447,25 +449,14 @@ Global {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Release|Any CPU.ActiveCfg = Release|Any CPU {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Release|Any CPU.Build.0 = Release|Any CPU + {2B605B81-353F-43CD-BF3A-29B3926A204F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B605B81-353F-43CD-BF3A-29B3926A204F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B605B81-353F-43CD-BF3A-29B3926A204F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B605B81-353F-43CD-BF3A-29B3926A204F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {8B40BAFE-D862-4397-9495-8F5EAF5CE80C} - EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - Policies = $0 - $0.StandardHeader = $1 - $1.Text = @ Copyright (C) ${Year}, The Duplicati Team\n http://www.duplicati.com, info@duplicati.com\n \n This library is free software; you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as\n published by the Free Software Foundation; either version 2.1 of the\n License, or (at your option) any later version.\n\n This library is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public\n License along with this library; if not, write to the Free Software\n Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - $0.DotNetNamingPolicy = $2 - $2.DirectoryNamespaceAssociation = PrefixedHierarchical - $0.TextStylePolicy = $5 - $5.FileWidth = 80 - $5.TabsToSpaces = True - $5.EolMarker = Windows - $5.scope = text/plain - EndGlobalSection GlobalSection(NestedProjects) = preSolution {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} = {FA88A246-EF8E-46E3-90AF-539B8C0A6ADE} {95B7DD83-2C5A-4F1E-8EA7-39654B2B236A} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} @@ -490,4 +481,19 @@ Global {26BC9AEE-E156-4246-BFF8-21E3424DC4F7} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8B40BAFE-D862-4397-9495-8F5EAF5CE80C} + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + Policies = $0 + $0.StandardHeader = $1 + $1.Text = @ Copyright (C) ${Year}, The Duplicati Team\n http://www.duplicati.com, info@duplicati.com\n \n This library is free software; you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as\n published by the Free Software Foundation; either version 2.1 of the\n License, or (at your option) any later version.\n\n This library is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public\n License along with this library; if not, write to the Free Software\n Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + $0.DotNetNamingPolicy = $2 + $2.DirectoryNamespaceAssociation = PrefixedHierarchical + $0.TextStylePolicy = $5 + $5.FileWidth = 80 + $5.TabsToSpaces = True + $5.EolMarker = Windows + $5.scope = text/plain + EndGlobalSection EndGlobal diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 0fa7fbfc8..953b4471d 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -24,16 +24,11 @@ + - - - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - - - all diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index 8b455cb76..82db7b04d 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -30,17 +30,12 @@ + - - - - ..\..\..\thirdparty\UnixSupport\UnixSupport.dll - - diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 075abe447..293faa017 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -72,6 +72,7 @@ + @@ -107,9 +108,6 @@ - - ..\..\thirdparty\UnixSupport\UnixSupport.dll - ..\..\thirdparty\HttpServer\HttpServer.dll diff --git a/thirdparty/UnixSupport/File.cs b/Duplicati/UnixSupport/File.cs similarity index 97% rename from thirdparty/UnixSupport/File.cs rename to Duplicati/UnixSupport/File.cs index 7a47fdd63..8f0c1645a 100644 --- a/thirdparty/UnixSupport/File.cs +++ b/Duplicati/UnixSupport/File.cs @@ -1,344 +1,344 @@ -using System; -using System.Collections.Generic; -using Mono.Unix.Native; - -namespace UnixSupport -{ - public static class File - { - - private static readonly bool SUPPORTS_LLISTXATTR; - - static File () - { - bool works = false; - try - { - string[] v; - Mono.Unix.Native.Syscall.llistxattr("/", out v); - works = true; - } - catch (EntryPointNotFoundException e) - { - } - catch - { - } - SUPPORTS_LLISTXATTR = works; - } - - ///

    - /// Opens the file and honors advisory locking. - /// - /// A open stream that references the file - /// The full path to the file - public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode) - { - return OpenExclusive(path, mode, (int)Mono.Unix.Native.FilePermissions.DEFFILEMODE); - } - - /// - /// Opens the file and honors advisory locking. - /// - /// A open stream that references the file - /// The full path to the file - /// The file create mode - public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode, int filemode) - { - Flock lck; - lck.l_len = 0; - lck.l_pid = Syscall.getpid(); - lck.l_start = 0; - lck.l_type = LockType.F_WRLCK; - lck.l_whence = SeekFlags.SEEK_SET; - - OpenFlags flags = OpenFlags.O_CREAT; - if (mode == System.IO.FileAccess.Read) - { - lck.l_type = LockType.F_RDLCK; - flags |= OpenFlags.O_RDONLY; - } else if (mode == System.IO.FileAccess.Write) { - flags |= OpenFlags.O_WRONLY; - } else { - flags |= OpenFlags.O_RDWR; - } - - int fd = Syscall.open(path, flags, (Mono.Unix.Native.FilePermissions)filemode); - if (fd > 0) - { - //This does not work on OSX, it gives ENOTTY - //int res = Syscall.fcntl(fd, Mono.Unix.Native.FcntlCommand.F_SETLK, ref lck); - - //This is the same (at least for our purpose, and works on OSX) - int res = Syscall.lockf(fd, LockfCommand.F_TLOCK, 0); - - //If we have the lock, return the stream - if (res == 0) - return new Mono.Unix.UnixStream(fd); - else - { - Mono.Unix.Native.Syscall.close(fd); - throw new LockedFileException(path, mode); - } - } - - throw new BadFileException(path); - } - - [Serializable] - private class BadFileException : System.IO.IOException - { - public BadFileException(string filename) - : base(string.Format("Unable to open the file \"{0}\", error: {1} ({2})", filename, Syscall.GetLastError(), (int)Syscall.GetLastError())) - { - } - } - - [Serializable] - private class LockedFileException : System.IO.IOException - { - public LockedFileException(string filename, System.IO.FileAccess mode) - : base(string.Format("Unable to open the file \"{0}\" in mode {1}, error: {2} ({3})", filename, mode, Syscall.GetLastError(), (int)Syscall.GetLastError())) - { - } - } - - [Serializable] - private class FileAccesException : System.IO.IOException - { - public FileAccesException(string filename, string method) - : base(string.Format("Unable to access the file \"{0}\" with method {1}, error: {2} ({3})", filename, method, Syscall.GetLastError(), (int)Syscall.GetLastError())) - { - } - } - - /// - /// Gets the symlink target for the given path - /// - /// The path to get the symlink target for - /// The symlink target - public static string GetSymlinkTarget(string path) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(2048); //2kb, should cover utf16 * 1023 chars - if (Mono.Unix.Native.Syscall.readlink(path, sb, (ulong)sb.Capacity) >= 0) - return sb.ToString(); - - throw new System.IO.FileLoadException(string.Format("Unable to get symlink for \"{0}\", error: {1} ({2})", path, Syscall.GetLastError(), (int)Syscall.GetLastError())); - } - - /// - /// Creates a new symlink - /// - /// The path to create the symbolic link entry - /// The path the symbolic link points to - public static void CreateSymlink(string path, string target) - { - if (Mono.Unix.Native.Syscall.symlink(target, path) != 0) - throw new System.IO.IOException(string.Format("Unable to create symlink from \"{0}\" to \"{1}\", error: {2} ({3})", path, target, Syscall.GetLastError(), (int)Syscall.GetLastError())); - } - - /// - /// Enum that describes the different filesystem entry types - /// - public enum FileType - { - File, - Directory, - Symlink, - Fifo, - Socket, - CharacterDevice, - BlockDevice, - Unknown - } - - /// - /// Gets the type of the file. - /// - /// The file type - /// The full path to look up - public static FileType GetFileType(string path) - { - - var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); - if (fse.IsRegularFile) - return FileType.File; - else if (fse.IsDirectory) - return FileType.Directory; - else if (fse.IsSymbolicLink) - return FileType.Symlink; - else if (fse.IsFifo) - return FileType.Fifo; - else if (fse.IsSocket) - return FileType.Socket; - else if (fse.IsCharacterDevice) - return FileType.CharacterDevice; - else if (fse.IsBlockDevice) - return FileType.BlockDevice; - else - return FileType.Unknown; - } - - - /// - /// Gets the extended attributes. - /// - /// The extended attributes. - /// The full path to look up - /// A flag indicating if the target is a symlink - /// A flag indicating if a symlink should be followed - public static Dictionary GetExtendedAttributes(string path, bool isSymlink, bool followSymlink) - { - // If we get a symlink that we should not follow, we need llistxattr support - if (isSymlink && !followSymlink && !SUPPORTS_LLISTXATTR) - return null; - - var use_llistxattr = SUPPORTS_LLISTXATTR && !followSymlink; - - string[] values; - var size = use_llistxattr ? Mono.Unix.Native.Syscall.llistxattr(path, out values) : Mono.Unix.Native.Syscall.listxattr(path, out values); - if (size < 0) - { - // In case the underlying filesystem does not support extended attributes, - // we simply return that there are no attributes - var err = Syscall.GetLastError(); - if (err == Errno.EOPNOTSUPP || err == Errno.ENODATA) - return null; - - throw new FileAccesException(path, use_llistxattr ? "llistxattr" : "listxattr"); - } - - var dict = new Dictionary(); - foreach(var s in values) - { - byte[] v; - var n = SUPPORTS_LLISTXATTR ? Mono.Unix.Native.Syscall.lgetxattr(path, s, out v) : Mono.Unix.Native.Syscall.getxattr(path, s, out v); - if (n > 0) - dict.Add(s, v); - } - - return dict; - } - - /// - /// Sets an extended attribute. - /// - /// The full path to set the values for - /// The extended attribute key - /// The value to set - public static void SetExtendedAttribute(string path, string key, byte[] value) - { - Mono.Unix.Native.Syscall.setxattr(path, key, value); - } - - /// - /// Describes the basic user/group/perm tuplet for a file or folder - /// - public struct FileInfo - { - public readonly long UID; - public readonly long GID; - public readonly long Permissions; - public readonly string OwnerName; - public readonly string GroupName; - - internal FileInfo(Mono.Unix.UnixFileSystemInfo fse) - { - UID = fse.OwnerUserId; - GID = fse.OwnerGroupId; - Permissions = (long)fse.FileAccessPermissions; - - try - { - OwnerName = fse.OwnerUser.UserName; - } - catch (ArgumentException) - { - // Could not retrieve user name, possibly the user is not defined on the local system - OwnerName = null; - } - - try - { - GroupName = fse.OwnerGroup.GroupName; - } - catch (ArgumentException) - { - // Could not retrieve group name, possibly the group is not defined on the local system - GroupName = null; - } - } - } - - /// - /// Gets the basic user/group/perm tuplet for a file or folder - /// - /// The basic user/group/perm tuplet for a file or folder - /// The full path to look up - public static FileInfo GetUserGroupAndPermissions(string path) - { - return new FileInfo(Mono.Unix.UnixFileInfo.GetFileSystemEntry(path)); - } - - /// - /// Sets the basic user/group/perm tuplet for a file or folder - /// - /// The full path to look up - /// The owner user id to set - /// The owner group id to set - /// The file access permissions to set - public static void SetUserGroupAndPermissions(string path, long uid, long gid, long permissions) - { - Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).SetOwner(uid, gid); - Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).FileAccessPermissions = (Mono.Unix.FileAccessPermissions)permissions; - } - - /// - /// Gets the UID from a user name - /// - /// The user ID. - /// The user name. - public static long GetUserID(string name) - { - return new Mono.Unix.UnixUserInfo(name).UserId; - } - - /// - /// Gets the GID from a group name - /// - /// The user ID. - /// The group name. - public static long GetGroupID(string name) - { - return new Mono.Unix.UnixGroupInfo(name).GroupId; - } - - /// - /// Gets the number of hard links for a file - /// - /// The hardlink count - /// The full path to look up - public static long GetHardlinkCount(string path) - { - var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); - if (fse.IsRegularFile || fse.IsDirectory) - return fse.LinkCount; - else - return 0; - } - - /// - /// Gets a unique ID for the path inode target, - /// which is the device ID and inode ID - /// joined with a ":" - /// - /// The inode target ID. - /// The full path to look up - public static string GetInodeTargetID(string path) - { - var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); - return fse.Device + ":" + fse.Inode; - } - } -} - +using System; +using System.Collections.Generic; +using Mono.Unix.Native; + +namespace UnixSupport +{ + public static class File + { + + private static readonly bool SUPPORTS_LLISTXATTR; + + static File () + { + bool works = false; + try + { + string[] v; + Mono.Unix.Native.Syscall.llistxattr("/", out v); + works = true; + } + catch (EntryPointNotFoundException e) + { + } + catch + { + } + SUPPORTS_LLISTXATTR = works; + } + + /// + /// Opens the file and honors advisory locking. + /// + /// A open stream that references the file + /// The full path to the file + public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode) + { + return OpenExclusive(path, mode, (int)Mono.Unix.Native.FilePermissions.DEFFILEMODE); + } + + /// + /// Opens the file and honors advisory locking. + /// + /// A open stream that references the file + /// The full path to the file + /// The file create mode + public static System.IO.Stream OpenExclusive(string path, System.IO.FileAccess mode, int filemode) + { + Flock lck; + lck.l_len = 0; + lck.l_pid = Syscall.getpid(); + lck.l_start = 0; + lck.l_type = LockType.F_WRLCK; + lck.l_whence = SeekFlags.SEEK_SET; + + OpenFlags flags = OpenFlags.O_CREAT; + if (mode == System.IO.FileAccess.Read) + { + lck.l_type = LockType.F_RDLCK; + flags |= OpenFlags.O_RDONLY; + } else if (mode == System.IO.FileAccess.Write) { + flags |= OpenFlags.O_WRONLY; + } else { + flags |= OpenFlags.O_RDWR; + } + + int fd = Syscall.open(path, flags, (Mono.Unix.Native.FilePermissions)filemode); + if (fd > 0) + { + //This does not work on OSX, it gives ENOTTY + //int res = Syscall.fcntl(fd, Mono.Unix.Native.FcntlCommand.F_SETLK, ref lck); + + //This is the same (at least for our purpose, and works on OSX) + int res = Syscall.lockf(fd, LockfCommand.F_TLOCK, 0); + + //If we have the lock, return the stream + if (res == 0) + return new Mono.Unix.UnixStream(fd); + else + { + Mono.Unix.Native.Syscall.close(fd); + throw new LockedFileException(path, mode); + } + } + + throw new BadFileException(path); + } + + [Serializable] + private class BadFileException : System.IO.IOException + { + public BadFileException(string filename) + : base(string.Format("Unable to open the file \"{0}\", error: {1} ({2})", filename, Syscall.GetLastError(), (int)Syscall.GetLastError())) + { + } + } + + [Serializable] + private class LockedFileException : System.IO.IOException + { + public LockedFileException(string filename, System.IO.FileAccess mode) + : base(string.Format("Unable to open the file \"{0}\" in mode {1}, error: {2} ({3})", filename, mode, Syscall.GetLastError(), (int)Syscall.GetLastError())) + { + } + } + + [Serializable] + private class FileAccesException : System.IO.IOException + { + public FileAccesException(string filename, string method) + : base(string.Format("Unable to access the file \"{0}\" with method {1}, error: {2} ({3})", filename, method, Syscall.GetLastError(), (int)Syscall.GetLastError())) + { + } + } + + /// + /// Gets the symlink target for the given path + /// + /// The path to get the symlink target for + /// The symlink target + public static string GetSymlinkTarget(string path) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(2048); //2kb, should cover utf16 * 1023 chars + if (Mono.Unix.Native.Syscall.readlink(path, sb, (ulong)sb.Capacity) >= 0) + return sb.ToString(); + + throw new System.IO.FileLoadException(string.Format("Unable to get symlink for \"{0}\", error: {1} ({2})", path, Syscall.GetLastError(), (int)Syscall.GetLastError())); + } + + /// + /// Creates a new symlink + /// + /// The path to create the symbolic link entry + /// The path the symbolic link points to + public static void CreateSymlink(string path, string target) + { + if (Mono.Unix.Native.Syscall.symlink(target, path) != 0) + throw new System.IO.IOException(string.Format("Unable to create symlink from \"{0}\" to \"{1}\", error: {2} ({3})", path, target, Syscall.GetLastError(), (int)Syscall.GetLastError())); + } + + /// + /// Enum that describes the different filesystem entry types + /// + public enum FileType + { + File, + Directory, + Symlink, + Fifo, + Socket, + CharacterDevice, + BlockDevice, + Unknown + } + + /// + /// Gets the type of the file. + /// + /// The file type + /// The full path to look up + public static FileType GetFileType(string path) + { + + var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); + if (fse.IsRegularFile) + return FileType.File; + else if (fse.IsDirectory) + return FileType.Directory; + else if (fse.IsSymbolicLink) + return FileType.Symlink; + else if (fse.IsFifo) + return FileType.Fifo; + else if (fse.IsSocket) + return FileType.Socket; + else if (fse.IsCharacterDevice) + return FileType.CharacterDevice; + else if (fse.IsBlockDevice) + return FileType.BlockDevice; + else + return FileType.Unknown; + } + + + /// + /// Gets the extended attributes. + /// + /// The extended attributes. + /// The full path to look up + /// A flag indicating if the target is a symlink + /// A flag indicating if a symlink should be followed + public static Dictionary GetExtendedAttributes(string path, bool isSymlink, bool followSymlink) + { + // If we get a symlink that we should not follow, we need llistxattr support + if (isSymlink && !followSymlink && !SUPPORTS_LLISTXATTR) + return null; + + var use_llistxattr = SUPPORTS_LLISTXATTR && !followSymlink; + + string[] values; + var size = use_llistxattr ? Mono.Unix.Native.Syscall.llistxattr(path, out values) : Mono.Unix.Native.Syscall.listxattr(path, out values); + if (size < 0) + { + // In case the underlying filesystem does not support extended attributes, + // we simply return that there are no attributes + var err = Syscall.GetLastError(); + if (err == Errno.EOPNOTSUPP || err == Errno.ENODATA) + return null; + + throw new FileAccesException(path, use_llistxattr ? "llistxattr" : "listxattr"); + } + + var dict = new Dictionary(); + foreach(var s in values) + { + byte[] v; + var n = SUPPORTS_LLISTXATTR ? Mono.Unix.Native.Syscall.lgetxattr(path, s, out v) : Mono.Unix.Native.Syscall.getxattr(path, s, out v); + if (n > 0) + dict.Add(s, v); + } + + return dict; + } + + /// + /// Sets an extended attribute. + /// + /// The full path to set the values for + /// The extended attribute key + /// The value to set + public static void SetExtendedAttribute(string path, string key, byte[] value) + { + Mono.Unix.Native.Syscall.setxattr(path, key, value); + } + + /// + /// Describes the basic user/group/perm tuplet for a file or folder + /// + public struct FileInfo + { + public readonly long UID; + public readonly long GID; + public readonly long Permissions; + public readonly string OwnerName; + public readonly string GroupName; + + internal FileInfo(Mono.Unix.UnixFileSystemInfo fse) + { + UID = fse.OwnerUserId; + GID = fse.OwnerGroupId; + Permissions = (long)fse.FileAccessPermissions; + + try + { + OwnerName = fse.OwnerUser.UserName; + } + catch (ArgumentException) + { + // Could not retrieve user name, possibly the user is not defined on the local system + OwnerName = null; + } + + try + { + GroupName = fse.OwnerGroup.GroupName; + } + catch (ArgumentException) + { + // Could not retrieve group name, possibly the group is not defined on the local system + GroupName = null; + } + } + } + + /// + /// Gets the basic user/group/perm tuplet for a file or folder + /// + /// The basic user/group/perm tuplet for a file or folder + /// The full path to look up + public static FileInfo GetUserGroupAndPermissions(string path) + { + return new FileInfo(Mono.Unix.UnixFileInfo.GetFileSystemEntry(path)); + } + + /// + /// Sets the basic user/group/perm tuplet for a file or folder + /// + /// The full path to look up + /// The owner user id to set + /// The owner group id to set + /// The file access permissions to set + public static void SetUserGroupAndPermissions(string path, long uid, long gid, long permissions) + { + Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).SetOwner(uid, gid); + Mono.Unix.UnixFileInfo.GetFileSystemEntry(path).FileAccessPermissions = (Mono.Unix.FileAccessPermissions)permissions; + } + + /// + /// Gets the UID from a user name + /// + /// The user ID. + /// The user name. + public static long GetUserID(string name) + { + return new Mono.Unix.UnixUserInfo(name).UserId; + } + + /// + /// Gets the GID from a group name + /// + /// The user ID. + /// The group name. + public static long GetGroupID(string name) + { + return new Mono.Unix.UnixGroupInfo(name).GroupId; + } + + /// + /// Gets the number of hard links for a file + /// + /// The hardlink count + /// The full path to look up + public static long GetHardlinkCount(string path) + { + var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); + if (fse.IsRegularFile || fse.IsDirectory) + return fse.LinkCount; + else + return 0; + } + + /// + /// Gets a unique ID for the path inode target, + /// which is the device ID and inode ID + /// joined with a ":" + /// + /// The inode target ID. + /// The full path to look up + public static string GetInodeTargetID(string path) + { + var fse = Mono.Unix.UnixFileInfo.GetFileSystemEntry(path); + return fse.Device + ":" + fse.Inode; + } + } +} + diff --git a/thirdparty/UnixSupport/UnixSupport.csproj b/Duplicati/UnixSupport/UnixSupport.csproj similarity index 56% rename from thirdparty/UnixSupport/UnixSupport.csproj rename to Duplicati/UnixSupport/UnixSupport.csproj index aac290b92..59eaaf727 100644 --- a/thirdparty/UnixSupport/UnixSupport.csproj +++ b/Duplicati/UnixSupport/UnixSupport.csproj @@ -1,8 +1,9 @@ - + netstandard2.0 2.0.0.7 + Library LGPL, Copyright © Duplicati Team 2021 UnixSupport Duplicati Team @@ -13,14 +14,7 @@ - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + \ No newline at end of file diff --git a/thirdparty/UnixSupport/README.txt b/thirdparty/UnixSupport/README.txt deleted file mode 100644 index b9345d996..000000000 --- a/thirdparty/UnixSupport/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This project is not really 3rd party. - -It was created solely for use with Duplicati, but it depends on the Mono.Posix.dll file, which is not found on the common Windows developer platform. By creating this mini project, it is possible to reference the functions from Mono.Posix during a Windows build without having access to the Mono.Posix.dll. As this dll is never invoked on Windows, it should have no interest to the Windows developer. diff --git a/thirdparty/UnixSupport/UnixSupport.dll b/thirdparty/UnixSupport/UnixSupport.dll deleted file mode 100644 index 3d04df69f588d8145adba67c0dddf0525d2f3123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 X6g5M@05WIj11bZlY3`_5Lm~tKDbwv2 From 0f675bc4a90065b7ba2ee80e087b6a4420db0b63 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 3 Apr 2021 20:47:40 -0700 Subject: [PATCH 153/253] Include html in output --- Duplicati/Server/Duplicati.Server.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 293faa017..b47b6d03b 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -119,7 +119,10 @@ - + + Always + Always + From 898193fcef577f79f5513d9718641ed462afa2af Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 3 Apr 2021 20:54:47 -0700 Subject: [PATCH 154/253] For now, just interrupt since its better than NOP. --- Duplicati/CommandLine/CLI/Commands.cs | 2 +- Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs | 4 ++-- Duplicati/Library/Main/BackendManager.cs | 4 ++-- Duplicati/Library/Main/ResultClasses.cs | 2 +- Duplicati/Library/Utility/WorkerThread.cs | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Duplicati/CommandLine/CLI/Commands.cs b/Duplicati/CommandLine/CLI/Commands.cs index 74523762c..55fbf233b 100644 --- a/Duplicati/CommandLine/CLI/Commands.cs +++ b/Duplicati/CommandLine/CLI/Commands.cs @@ -115,7 +115,7 @@ namespace Duplicati.CommandLine if (m_thread != null && m_thread.IsAlive) { - m_thread.Abort(); + m_thread.Interrupt(); m_thread.Join(500); } } diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs index 19fd89ec2..d9bae32eb 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HttpServerConnection.cs @@ -211,11 +211,11 @@ namespace Duplicati.GUI.TrayIcon { m_shutdown = true; m_waitLock.Set(); - m_pollThread.Abort(); + m_pollThread.Interrupt(); m_pollThread.Join(TimeSpan.FromSeconds(10)); if (!m_requestThread.Join(TimeSpan.FromSeconds(10))) { - m_requestThread.Abort(); + m_requestThread.Interrupt(); m_requestThread.Join(TimeSpan.FromSeconds(10)); } } diff --git a/Duplicati/Library/Main/BackendManager.cs b/Duplicati/Library/Main/BackendManager.cs index 3882c33e8..c7564f2a5 100644 --- a/Duplicati/Library/Main/BackendManager.cs +++ b/Duplicati/Library/Main/BackendManager.cs @@ -400,7 +400,7 @@ namespace Duplicati.Library.Main if (m_taskControl != null) m_taskControl.StateChangedEvent += (state) => { if (state == TaskControlState.Abort) - m_thread.Abort(); + m_thread.Interrupt(); }; m_queue = new BlockingQueue(options.SynchronousUpload ? 1 : (options.AsynchronousUploadLimit == 0 ? int.MaxValue : options.AsynchronousUploadLimit)); m_thread = new System.Threading.Thread(this.ThreadRun); @@ -1459,7 +1459,7 @@ namespace Duplicati.Library.Main { if (!m_thread.Join(TimeSpan.FromSeconds(10))) { - m_thread.Abort(); + m_thread.Interrupt(); m_thread.Join(TimeSpan.FromSeconds(10)); } diff --git a/Duplicati/Library/Main/ResultClasses.cs b/Duplicati/Library/Main/ResultClasses.cs index 2f3ef85bd..3a8a7a004 100644 --- a/Duplicati/Library/Main/ResultClasses.cs +++ b/Duplicati/Library/Main/ResultClasses.cs @@ -496,7 +496,7 @@ namespace Duplicati.Library.Main // If we are aborted, throw exception if (m_controlState == TaskControlState.Abort) { - System.Threading.Thread.CurrentThread.Abort(); + System.Threading.Thread.CurrentThread.Interrupt(); // For some reason, aborting the current thread does not always throw an exception throw new CancelException(); diff --git a/Duplicati/Library/Utility/WorkerThread.cs b/Duplicati/Library/Utility/WorkerThread.cs index 0c25bdb30..faf6d19e2 100644 --- a/Duplicati/Library/Utility/WorkerThread.cs +++ b/Duplicati/Library/Utility/WorkerThread.cs @@ -232,7 +232,7 @@ namespace Duplicati.Library.Utility { try { - m_thread.Abort(); + m_thread.Interrupt(); m_thread.Join(500); } catch From 7b760ce237d2960b46143cfa38279f6394019c6b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 3 Apr 2021 20:58:34 -0700 Subject: [PATCH 155/253] Fix accidental revert from when master was merged into the netstandard branch --- .../Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index 686cff3df..0405f6842 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -7,7 +7,7 @@ - + From d8ddd6982c097d23e1256b10eca75361cb0c44a2 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 28 Dec 2020 12:18:58 -0800 Subject: [PATCH 156/253] Refactor VolumeHash --- Duplicati/Library/Main/BackendManager.cs | 14 +++++--------- .../Main/Operation/Common/BackendHandler.cs | 4 +--- Duplicati/Library/Main/VolumeHashFactory.cs | 12 ++++++++++++ 3 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 Duplicati/Library/Main/VolumeHashFactory.cs diff --git a/Duplicati/Library/Main/BackendManager.cs b/Duplicati/Library/Main/BackendManager.cs index c7564f2a5..bb32e8362 100644 --- a/Duplicati/Library/Main/BackendManager.cs +++ b/Duplicati/Library/Main/BackendManager.cs @@ -20,8 +20,6 @@ namespace Duplicati.Library.Main ///

    vzx)>Vh2!M zEC#a=gUQEWlGzcg7fd>X$z(9u3?>(Y$-`jsF_Z+^!t4ar1ty)rWHOj+b^_Vb3}!C| zlZT-sNc=IF&Fl=)%j^siQ3kV}p(IEo8O&}5%Ql1Ai^1e!u*hLB`!Segb^)8?0@9@n zW;=t~&R}*jm~4iUAT^7@?88tJB=Q){W_AU!nO#AqDT7I8u!u95oeUG;IWNr zGniZqCJ+07Og;=|KL)cOgW1f!AaQ12unAz&8B8WaNsw$an7tTG9tNvF3}!!uk{~tA zejpQ={XlGGFk2bSb_TPP!DKU-TnrXp3}zn&laHY!NH4QL$Q)%b=?o^5!DNF!sNc~H zW-ssu^?w)pgVZkuiyQ#U9tN`?fMp+p*^j|$7y>|g83I84bmjoC`C!sH0AzwQn4JtJ zo5AE_FnJhEJ_eJ_fgqL4fndF0(iu!9gUMzvxfo0y29uA$By$j0R}feim~;k{$zZY> zOfCkKhr#4yFv%PYRu3kf!DKR+Y=)8`GZ%x|hr#4yFv%PO)&(U&YMjCBWH8wr0upHk zvloNO!(fraVD@7$$s7tc0ZclFg48>M*~w56B+?9KF9ypl2D1-?$;V)k$6z*d7)T{^ z7}zu@2@-Jzi#vlwlEGv%m|P4d4};0aV3Ii;tQSl=gUMtt*$gHZgUQ2S@-diXjsU9% zlg?l=8B8{V$;DvuFqnKC0dmP>Fq=6NtP4y!gURGbkZdxT-3%rdgUQ2S@xx&DV=&1a z1=b5DoufdyoWbm5FgqE{ZibQ|*~MV-#bA-cVDd4TWR3=z!yFA#qYNcMBFOdgIo%v9~I919|y!DKR+YzC8y!Q^2u z$s7k#(+nmTgUQ2S@^KuCX>NrGniZqCJ(29eGO(m29wO`U|nF+8B8XF$!0LQ7)%}plaIk9a|T#F zm~@7cATyJ}>}D{zI0GcI7|cElCLe=I=1j0&FzK8LQsWF}CxgjmFu52^9tO)E2D2Z7 zN#-oDUNGqlCX>NrGniZqCJ$$U>gB^=_G2)~oDJ3mCY`}#GMH=zlZ&%KZdeRv9|n_; z!6b7ISQnUdhLRwa$zXOfm|P4d4H*m!?lKq{JY+C1c+6m6@RY&8;5mbVfik0kfhwbc zfjXmsfhMDYK_sJrK{BI(K`NtxK`x_#K|Z5_K_#PsK|7;?K|iB`!9+#_gUO5r22&Xg z45l+07|dieFj&ZFV6dOjz~CsOfx&S`1A~){1_q}Y4Gbz=G%&c$XkhS?(ZGP2 z$-uyp$-uyt$-tnP$-tnT$-rPSlYzlnCIf@*Oa=yrnG6h$G8q`0WHKDU|?WqhMLpD$iM(Pn7fq`;_o&_h(FpH85lqZfOjx5Fvu}5Fmy69Fn|s$?}EC! z8%p;;>0T(^2c`QN85lqtQYS$96B$9Lw=pnGg4#bB>Ygc3dMYCW1876(G^l&0L)|k2 zO3#Ff&w{F-&B(w2IuKwEH2mg*_jfTc%!A6$htdn6?pVkOiO)q)dNDLymq7VTq2ad- zs&6@zzXHl%3H8S+D7_kL-x?^r7D}&!s$UPKH$dr)P<@-A>NZ2^El_$Z)E(QP@wpvJ z?|`~r!%%k}fzn5z>W@L` z<52npls*a7cM8fs4W-XO>9bJ!9Mrt?PbnSyhfC0Odl~BQD^Pt`q57^t)m?|u zH=y)Qs5!Tw{M%6dccA>cP;>4vGBAJ+W&rK?1Etpoj0_B*gApD=&3^<{{}^iC6R10% zLix|2=01n=UqJP}gwn5|=Dmi-%NwY@Z=v)%sJi!1{s$=i5lVl8(x0L97byJ|N`HgW z-=XvmDE$*k|ANxLq4Xap{TE9A1JR5O4F91tsL3v92cGys)%!u?#~(@uK;W&L!s^qgYv_n{0M0LL_+mP zLFJ>NbPSY^h0<|M3=E(R`teYG2~hDwD4oOv$!Ez>ccm~v>Z4SUdL{;jG*D%wz`&5s z#K0iWz`&3J)t3piKMSfq8yb!|Q2AUY1_sc^_B^P%d?;N2r3<0zilB5c6KG#A149YO z9V`qCr6Bu3^(fRmBl z(F8TO87kibrCXtN8&q9869WTilW_-Byb~(k1?6``=^iNE3#I#@bUzaV1Lz=@2~hq- zsCy?t`IDja6ev9v>h5V!{&Xlk14_??x_dSg0|O{8&w+~1h0^n&^n57209r0Agxb3Z zD!v#hz68o&%EZ7>#=yX^49Z^)rB^`H{YoYV22dJa1xgo83=FHG@@qix&&0s67Rq18 z#J~VL`*l4uoHjt|jZk_MRNZE%d$vINTcPweD7_s@?|{-fq3U-*`MaU?9w@yRO7DZx z`=Rs!D18u0AA-_{q4W_ZNWFX%8Xm`>?mP~)?*x=S2~9tzpy6>Es{ag>KFb7YADx5p z&qL`8ObiU5gHA4j!i|xE;Sw}IUuI%p03Bd=1)9#ULgV!sl)lcyz@W&$z;FX<-%Y4_ zx1jF14Ry~QsQ6tb1_n@BevgTP;Q<2!!+oef9)QFd7#JQx{r3o}|1p$)0;Ru0=^s$~ zCshA0DE~K<{sX1|Lg{}{`ahHgHM~LXW=3X6J;Vg1nVBKwCJQqILpZ2C&J1Z^voS-$ zhaJl2gwkA4nwuF??(#tSyii&YN((VV+Nr|KkaoBkGo(DRgUZ`OX$PpdBQvDlbb`{( zQ1`h&X;-LvHz@56)#m}_dqUNDF+=J>Zz$~pRp$#e*AGhjL)8aB=|CtQ1l1P|r9+q@ zl6q#h50iibn#2&nmyP<|AYj)scIK<$f#(s59G;-TsipmZWsJ_$-EL)E1~=~Ph1 ziJ=Be)`Q7~U~)H@+zTd;f=MS(_lm&i%#roj_~R|cOA{u(eEvKz`9+8VkWdK=cs{80%s3^Ob;tT3!KoN2h! zaHHXN!-Iy$4KEtrGJInA!SI(MlM#o}MHwL@86!0#9U~*78PYaJ9!5b%F-A#78Ae4$ z6-G@)Jx0@v78tEE+G4cN=!DTFqdP{=j6N9sGGa02GnOz`GS)FRGj=fcG7d40GtM+F zHm);nH|{Z>X1vgNmGK7Sea1(OPZ?h^zHj`}_>1vRV`h`LDqJRVCMK$us;VYBCZ;A< zCO#&yCV3`RCNoU7nH(~?XY#{@#Z<}E$~4rpz_ix1*L0!j4$~8+mrb9Uel-;`Gc$8E z3p7hND>v&mTWq$`?6BE0GX`^Ya|3f%^8oW`^Ca_Z^CI&~^9J*F^FH(G=JU*#ny)e6 zYQD$(u=y$Ti{?+vUz@*F`DXsxe1q0D6($Ql3sDO*bp;E33uO&63l9rFiwKKYi#m%A ziKiO}SRAo9XK};gk;QY1Hx?f)ep@hFidafoDqFf)hFC^gW>^+k)>yV#PPCkB zxySOL#+*9Ah2x94j5`9D5w+IBs*??ReGkrQ>%;HYZUhRVOni z7bkD05T|ITB&TerVy9{+BkeAy2~M+|<~!|nI_mV$iBXlsS<2bWImkK3xxu;BdA{=! z=dI2cobNlobLMii-M_it}d~*5j^2bHq)!H@4 zHQF`FHPf}owbHf0wcT~O>uT4Hu3KG?x!!br?)uvGqw6=^|{S;TkE#PZJ*mCw>NGA?h@{X?pE%e?osZE?y2e-?j`Qc z?vvbSyRURV=x(Qa!u_oKCHI@|58Pk5e{}!m{>%NpJBx>ahq#BVhlz)iho47?N2EuV zN1;cVM~z3T$3%}A9*aDdd#v`@=&{@5sK*(P%N{p8?s?1*f8y~_`G@iwk53*yJRb4? z_u%vt^)!)I@Ko{qsI23u?-}4((YWJ(DrR2PQLyk4zQ}pO{=3J~IU| zd|?V@_{tQ{@Qo>wL5w+?fq@||jsbjw*Cj1RhOa6N48OD)8JtuZ7}#_e8QfGE7{qiS zd|e$z1|L-hhATRZ;2Vl=LdBoxFfvS2WnggCWn|c_%D~{O3sHB+fRQ0Xje+5b0V6}6 z8Uw=@14f1tH3kMALkKMarH!Gqmm$QSL_je+3})V$wNn%@Xwp9++=g3@kAj0{`V7#Jdq z7#Vh}F)*Y-#Y>DJ?r4GXCqU_WP;rp|uYmjo^*4zBhyecsn*2XBKIq0ISU83mGcvfT zGcd$M=`3SL1|M}uxM!&|Fu>GxnldsRQD%>S_Pxt7ZS4wp;|i23s~7#M;z7#Nx?AnN-q7#Sip7#OBmFfznz zFfh!4ile)KIaEK$AE_D)3|lN1!8aPg;_r|JBSV=614FtqBSWJW14D^3BSViC14FYj zBg1qph`+aLA^Z&r@55;Pi%9&}?u-n}w3!%88JQWF7)%&h8JHLx7}*(^80;B28JHOC z7`Yjk7;G7N8JHM68TlC)8N3+z8JHM67zG)a7~C0!8JHNt8ATbG7{VCE8JHMq7$q4P z8EP3N8JHNV8KoJR7^)a$8JHL<8RZ$67%CVQ8JHN#8I>8B7|Iw`8JHMK8Pyq>7)ls5 z8JHM~8MPUh7>XEm8JHLf8TA>M7z!8-8JHOI8I2j381fiR8JHMy8O<4(7;+db8JHNd z8Lb(Z7_t~`8JHL{8SNRE7%~_g8JHN-8J!uJ7}6MB8JHMS8QmF}7*ZHL8JHN78NC^p z7?K!$8JHM48T}cU7&;gOL8pN*1~V`*bTfuBFfsHqhBGiR^f5+)PE}%zW?*8N$QaAO z#4wdHo`H#B3S%Mz6T=L~WCkXN>5QoiObl}w(;1i;<}hY5Ffq(#%w}L>Sjw2oz{IeG zF`t2nVJl-H0~5m*#$pC0hRuwn3``807|R)$7&bCiGB7c0V60|fVpz{u%fQ62jID;e7vm>5tr2;)o!CWga|vl*Be4l&MUU}8APIG=%u;Q-@8 z1}296jEh0TKTJy*m>B*uE@xn3_{X@Cfr-J1X*B~AgCo;g1||kqru7U=3@%I?L2=Er z85Gw{TNxM`s+hKeVv}h*!!xFNOj{YAGp%9T%y0mFrYQr%GM;rj+j#c#oZz|0bBpIO z&l{evJpXvudHH$8c@=myd5w6jd7XH@c|&+(dDD3Fc`JCUd7F3{82>VYZu0;QvHfQR z-Q&T?;J^eLNdk>+J1~L9kRUA3=n#Yj8ux*)KqEg87HI4T!UB!{KvV$@gN8bG$I6HfyRI!EYK(rgasP^fv`X$ zKM)pZ%m=~(jqX5Lpm7}t3pAnwVS&bOAS}?R4TJ?6uYs^YBQ+qFKmZHqW`+P31||lD z02T&jhJpYV1{Q{f02T&T27>?=1~vwV02T&zhJXMT1`dXV02T&L289F`1}=sRMl1~6 z3_pxm72j9D0X88nPp82A`A#IrE)Gej7%FbFU-7_l%2GE6XHVGv?iVZ_29%&;PW zg+YYjMgR+gD8qvQ76vhf4FN0+;tU@GSQsQ24g|0;NHR5Xi!y z%CI1ig+YyBLLdu+I>VV1Mg|Rr8!3zonhY;e7#Xw}exxumXftr6GBW5eNTf0{=rUNO zGBW5fM5Hn@=ra_gGBOx2Oh{#9Fl1Pf%E(~Ea3GbD!IP(8Y6=R!-_P}QM(t?7#XY>KBO@+SThKuGcwpPSfn#D*fJ!fGcwpQG^8^! z*fT6hXJl|-IFQcB;K=YGosq$b;YT_ngENCf1|x$DgF^-*gDXQq1|x$T14jl6gF6FD z1`C4+!-Nb*22Tct3>F42296X)25*K38H@}*41dyD7V1-MurTA1?emdnG6ld zj0{-}8!{LfvKeNivoPc^2&6DFE1t4CM?4=`0Kt3I7 z9)<^LEDXI2H_})b`WRj$voQ2CXr!<(OklW>#=;Y1n>!z6|yDU1x08IGi}Fic@M zkjBC=m0?F33&S*qj8sO3=?n#FEDSRkGSXNWW-=(GurSPGNJwL0n9X32#=|0VOY#ykjluggux??g<&bf zg%n1HWeg8e7#Wr`>_}l`SivBW!oskUAt05JVHLxk6h?;C3I7jSL@B7#TJ(n53~VY-YF+$ilFN!6Jo)VJm|~3Jb$F zh65>#4BHtxk{KCxFf?Q^GVElqNM>Z%#c&{*kzqGOLNX)69)^NsMuxo%5y^}U`xqFU zSQz#*SfnsA9AKD{%*b$%;X^Vb!y$$V$&3t#86G4vG8|#>NM>X>%3zSp$Z(9|LIxwl zaR!MLMurm%9~@a2PBPp`W@I?Ua3F(`;WUFq5DUW@29F>XhO-P2K`adC7&3xb7|t_P z1hFt&VCV>9VYtXJBZ!6J62poh7KY0VJAzmkt}xsPWMR0A$FBmL> zSr}e2cm%UBykb}p%EIuPAtIQC;SEDZFbl(5hKgVohIb4d!7L2#8D<2tFnnOx5z4~w zkzqwJ3&SUd9l3F#KfD z2w`FP#b6P_!tk5HBZP(F4?{!<3&UTAj1U%ve+(5NEDZk{Izm7bH#0(57#JB>gs?C$ zG42RqVPIxF5yHa2!gwQug@KjvMF}<76x`kj!+f`4n~Pk76wj6jZhW_E=G$` z76xuck5Co{9>$1J76x9%1=)-Ye2hD?85#H)1F{$y1Q>s0GBOAh;_SQv~LD@<4zj2S1GurQb~286RPm@+1W zvoM%3awM@Zm@`_KvM^XMCYZ7?STa_avM^XNPB3L*ux9*_z`|g|c*2;4!ItrZF$;qo zBZCPGgFT~!2@8V*qeD0ggCk=>I17UlqeBu4gEQj}Qx*mn#s{V>46cknOj#J*7zNB& z7~B~f5?B~K7z2!17(5v(j9D1G7(0wv7`z!57_%_=FdBrjF!(YygtIXCF}}!TWbkLa zk;%vqz<45)ks*+AMA&ecFj0~ZS6`70-VT>G6EDYg{5>YG+ z5sW7ySr{T2UqrGnL@{baurNe3T12og#4z57WMPP9{1M5*5Xbl;f`uWT@kRs-LjvQ8 za2AF{#uE`N3`vX@kt__!j2e+F3@MBfkt__Uj6Wh+7}6LyB3T&H89O3a7%~_$B3T$R z8FxgmFk~^Vh+tvJX1o#3!jQu_BZ7q?m$4#}g&~hIB9et6pV1?dg`t3vBZ7sYknu-2 z3quj3L<9>%G2@PK7KReWiU<~lQpSu37KSp$7vU@n<%|&#EDRNlJ0e*aDj8=)vM^LJ zc0{r;R5N-+urSmxu83q|sAXIc&caZ~_#&H;p`P(ZHX}m=qec`9LnGslY(|DAMui+k zhGs^KC>DkmMvo{KhE~RiC>Dk`#*8QyhIYn?97cu?MvojuhEB#CIgAWlj3;s!8M+yF z$k5MNk;BL^fiWY8kzpcZMHCCeB*utbMuy3Z9=VJR zQy49B85yQBYUDC9OkGHhiONM>Z%#`qwKkzqTd0;p7Hlt^Y|*vS}>!pN|T@kJ6N!)`_mP^r$y04miP ze|?BmVPV+M$PvxLaDY)FnuXyYqee6f!y!hCXcmUUj2_V}3`ZCvqFES@GG;`x zFdSp7h-P6p&e##n!f=9dMl=h+#yBC4h2cBnf;bk2AB-E~SQvgX8pN|O{9-&1$HMTN@j@I6!ym>6aV!jf z89&6aF#Ka=h-YE=&*%`(!oa{J5YNKE$n+qVg@K9bLo5peGm}9a3j+(2LmUeOD-%N; z3j-TdKpYDLJCi^h3j+sJLL3VNCzC=P3j-HZKs*ZrH&a493j+^RLp%!uFH=E03j-h1 z1W>!3X+jMn1882IfkBW-AcKWLh^Zr&kwKU#qneRHgvp|skwKKHqneRHj47g;kwKiv zqneRHf@wxIBZDN^I zP+($d0QEjV=aE8YL_T`D_<&BEg3Mb$#6dD=p?yLw22c+LG))DPlV`XF71ux$e+m`1 zMHBxI6%S$n^>+~F$oYfJV_*RFzacCTS;OE46>kNv(*lWsuslN;RD2eAy%sA-kO4FY zoemXW4;F_CGsrVELB)@t**gO&ev^R-)c=BNc*n3AD*heK{rjQfJdB{}3Yh!fF9} z6BhvA?*U4)FtZ`%n?S|Ym{7yP6Dn@agsh&CAp$BMz=UdV3RFB5tRCiHMuu{zcokS2 zWG4tSGE9Yv_k+b@cE~d zF#JF>-x4a$%ZwTh;ZSiUH1Q^=xH+2mY^b;oGivzkf{G_H!`ui7hpSNWG8A!nhC5L4 zZm>D9@RVnG4HaL2W-lxFK5Pbtt!UyhQ1Me};?_{{`)J|;Q1LHddtv#Ak)Z%8&dGx8 zFGhx5sJI*ps=pRP#f`z@u=rwx-b2p7;DKU}Ji{ZX`dAj!@P7jpFG3S%3;~5714BES zxB^ss4w|?FRD2_vcq~->7@BxFRQxuY_++T~2Q=};P;pjPlQ1Lft>Ssg68QDCy;-PG);m;Tb3J(T`EHw2ZQ1N;+^EIL3Q_$3VK*d+0sgHq*??V%> zgo2d!rY$;mU!hl>9Ni^KdS&#)aTF2oMis()WW z#ckM8!}$+XJP<4nOF!}q!l30G3=9luXyWEj@oKO*!aY$?@d@mV44@HEkn2J9S~*mF zDVq98Q1M-8;_IQ}=h4J3K*gV+iNAn~|3nk#1TE)dU|`?_Ew2Qx4+ptOork%1k2uMPvlHn2FtJt|P~(_nE}`6qQkE58gh4B_t{0@q^Ji{lb_(!lg;3Y8Nb}0vFx*4>yfD1Kz)S=?i zXyP_daRV-p`(feyjv)pr?g|!%rH6M6Wl-@bF4S;nhl=Ne)x*O79m6uHcng}n2cY6J z(Znx8#n*9xW+Gtjk!N@d6+euoo)>)Y9|OY;E>OH9+^GT;e+zaG$ZwE%af6C8aifM$ z8dO{yO}q{&u7f5%3o7o&4Ko{LJ|n|MsCXDy91#vjq2k$Kaaer4W4I3$Zvcyf%m86| zhL2G3sbF!0Ie(zytH9zQwID3dARGUs7Xh%+)MLB+42iR(heUvi_yqb*eYADa45 zsJJi>YPjV=#Wm2xo1x;iXyUV=;z4NQo1x)9h<08g|jEfl;F&<(($at9X5aSWX!;D86k1(EPJi~a7@eJcD#+Qt&Oe{?NOngit zOu|fJOrlH@OyW#ZOp;78OwvqpOtMT0O!7=hOo~h@Ov+4ZOsY&8OzKQpOqxtOOxjF( zOu9@4O!`blOomJ*OvX%ROr}g0Oy*2hOqNVGOx8?xOtwr8O!iCxO#V!POaV+mOo2@K zOnFQNO!-WOO!-VjOnFQ-Ow~*qnAS6GWZJ;AiD?7VW~TK_kC`4ZJz;vx^qlD#(@Ulo zOs|+;Fui7a!Ssgd1=Cxm7fkP%UNC)Nde8KQ=`+(;rq4{@m_9Q(G5a$)GdnT6Fgr7Q zGkY=nFncrmF&|{~XZB+bVD@JYWDZ~sX7*wZVGd>vV-95wXZB)_U=C-FV)kN=W{zTx zW%g%^V~%BxXO3e|VD@58WKLjCVm`>2%$&rW!ko;U$_!eC$G~ug^%eNu3kHUBVAf=Y z*WkO~7;Jp=Q%ZAE?HE)Xi;5B}Ln;eWRa8`*A`Q${RGgjS!x?Ox3kp1Q3vyC(Q}ap^ zOEUBGTvAICGjobDwOB&6pc`d~L);jLxCst%Uk4l#PHwnl%y8(ifQp9|7dsYL<|T(D z7H7L9CYR(FRWdl{6l5gkq~_;k7VCv)<{2C5g%uYwz*KtXrR6ikyGA&>284L}`^CF> z1_$^DdxF>u@xh)h@qUiJuJNJ4t_<;x&OY&;es2CjzK$U2cxNBS;9!P$$50o~ka*WH zSHF<>kjMbALTA_D;P@a{$6$Xys93P8b7+ufNMyXHZ-8r1u)iO~3?J7pS09G>5Pxr1 zm`VuS)yFjqq6A_lL==nlzK(t_jv@X*k?~Nof?eZ1eI4Ch<6R>{T>V^JUE%{AgB*Qb;Xw|P3wCt|I~|vr_~4AhqSTbI%%YOg z#2lB*;_Tqkf`a^_5>R$$z?Ah!%uC5h4K7J6No9x+jtmZQ^^Fhk4|ffMdDq1?%+uKw zRm|7l&ojh72%I5&93x>$LxWv|;vJnsJi|bVIUvY2*cBYv5c7gu14CVdVfg?e1~Uko zT!4>b2q;6v2l@NBGQ@j$I=Ke9dHT49VfNexCQ$PU>PGIrQ{(d2@5s*{_bC-_}k-@%FgWt8WiLo1U3kqLqVYzAL1C`8t)S18RiN~y-q%^ zzEJfcL5_aGpa}N&i}w!=arXChWr#->1p5_L2$Yx5e1N3G*U`_>-8BfCKZ9I@{X>JC zUGXS!_4Dxz4grTU7Hhmie4*JM5(Xgw@y?DuK2DC#-thrJp8lXBm%$~#Gu{!Do&8*c zgTXux|KJc%G3ey#;TY!W9|X$relD&NU^hYv(qOn)u&ZN`vq!vtKrjQSOm~TQ@eFcx z1{b-0{vn=jkzieD{&#l`i3g=*Of!94!Rq6kBI7+A{ak!pVX+z<66EUW3y}nu<-rWd zi4x5MXjueSjzh}V)z?2LGTt@9!!a}%T%te%$=TmGAQV*MfU^iF|2c**#6wlXq9h*d zH&16sDgE{AyxR#Lmh`-S>4#5?;3 zM1n#MWNdISs1gHPj71!hLXmZV^u`BxID)EbSk%XRc>0BaA`%qn&>R7(;e8w;i%Guw?KPcYS&)MI_)6bp3#naKp-yNQfK#9uP!_m*(H6E6V zf?;Z~%9SLh2l#`lym(K)fKX^5i6rV28WQ5~7Y{WQ?D3MsbT?O57jSZh34jufs|z?O zBWZ>f;V?xoo1ntZp+Uj^&`P}|F&$#RuPY>op=w}SQ6>F@Jl#G0K%rBTnC=LxG5mu( zUHw8JNh2W0)y*{sTnhw82K)I0$Ge64fh#bE;K*QiSAVd<5GJ(3_45z%jR&PWhWMZW z=Xj5hkbw9gS6H?JRWBQ5le0l;)gYnpcuq1S;zToH5fiC|d_O$2$f``Z+_|aSSDi>8=$esd*`> zDXv9D`9%SVMTxnf+O-%Y6;zPylb@WJcSOS%BPRz*xDMaEr=VYel zm4J0*mQ+H#jGVcG861Oy{hc9U6YLQj;_vM3>Fn?4>B8WgT2$hl3U0MxiFEyP*-@h2onP}mcWSxZdO2$e}HQcsMYL(umD`|JA>-I zVAl|Yu&0ZwUx=rhrz@zcb8!VVy|7B6+5m3hJAxA8xZg8@8bjQ7(gt6IUC%} z4h5BQ@d4?c`1~@r8`}=~rk!V^`yMi#=5H+^1yKe}%D*%oS zXW#fBS9ees8eBlc2Rr-52e`ze}`W=N(Aa`p7{ z4DodI@r(keF?b4tNJBz0z%eKU9Ov=DA(5b%ad8bn32G-#NbfwDA>P#o(&UHeghX2q zG@j6!(!m}r$ z*xeZ%TCSjGFNO@P0ft4BuWN{hzY9Zrm}gK(C^%C?Y6e(4DIQdKgL=)7){sABA-s(4TZL47XQpm-mD zXGb4U?-$zND@jau_wjdf^ug4K5O?)}bq`UL2L(8X1Yno(kB5f{!kAD$Xj2E&dx3T& z5zcUN_V)$%e_-+E7!U&Td|;@f54dJzh=+=RdKNAqDF$bMSepW5B&@dy&*k7i2@Y{V zX)ieYhdX+PK;7pY?hA9OV|r#zYEWugYEf!la;kp;Xm}CaVsi5IbAc)cH8;G2Bf;kS zdI!0>ggS$p7LG1qZlDMYiS%`K0Wm=Jl#6E&hzaV_fgM|tm=1{qkO)X7z|{}bIEP6> zxxT^fAW6r9f}G4`@E|9wNfw+@T9T4qo(JcjF1^~Ij z+21!9>@*k8U}wi57w|w6NW$O8)!j7&G|1xZ3JxrPAJ=dXPiGHbaQX+0*MPG($c0e# zzMjG0hMm8UtFw=PFgW-@!*-wnDVPzV0WP4Cu#&`de;-#LPd{%^6oT}F=->cXNF0Go z@b?P=N1Q*X&l=6@RI znVnh`P?TQ~Z(v|x$Pf>eaLUX}0S#Z37K57CNr}nX#K;>F&~HpY-h_a>DFJyiP#}PV zE5s4pBEsn#*9uhsIF^=Vq~?`?(rzlcoO6Cks%KttNn%b8s;1DQOsoP%2xkO=`myn# zUZW>8H-b3+o=z_ANc;fDpkP;6@eWcP9E!vPS3Qs-n*pR7T!#C(hPb(c$C^QdHSlop z1a-UeQcHqUlS_*-ODcU6^Agiji%^}3M-d_h@hCC|`7boc2h@6lGDBQ_K_iQ<7!HZb z&r8MY2s8yo4DnEtgIwL=rn#qF4{p!Bg`?x6>gcokE@F_oEPTl8jdi*!!snvH8|7<+`okN zHNgoK+}$qm%}+@MImNNKAT_xJG&kdxlb8+?fevVR`ho2O7g-<&Iyt%V7+4_4 z71W%AMmj{q-^a(zKPcQW2s*9>7KOVAT-<|&90LM;V8eKzBH9Py6eJ({1~`Uzf*V1R zXmX$+hWEcg;Q(nn2Dm!MV>l5i02(Xzbz}f34n>UMfw;lopC2HfdE8FB_`0CliIEp~rDSPv0R)Xfo;=sjVxjtucWpzb1g z2F%?xh(RSZFE24SHN`n6vA9^ppd#7KEXBw$#X!YWg~6s2BBxtYS&*t*YR3Rplv?bV zlapVbn&O!kTvC*pn9JZ8;=|yWmzN)$oL>OWL@xf$pmFX{PZuX2XCH5u%;JK?lH?3f zZgR;__Q)?T3H1bJFStZ}a#2ZqVo`cod@d*-g1M;`nI-W>sU@XFdFZ0aIjMY4| zm4rV1Yzm$0MHhGS0M8n`U`%~GdEt=o1B=IpW9sn4C1ZfYavxk8oE>q=IJx4I@y8|M zPuml*y`&c9(_G6KN1SJ*;h$pc~K%9j|!U>mq18_+=K|B&4&fx5v zpBqq8WCPD=b}%8Q#Nt$B;dsA%$CQ+y)U=?~oYchPRR26IdObt)vh(uG^B6$ph5Nc? z=A@>i7AHeW0(emiDkPyQTv7`_gT{Hul@K-XLKdtBTpUAd8l(~fT>mAP|Bc!Aqiea zf?|ZB8Qci4c8|=|qQs))j7lVPV8%G-gO-|W-_WoL4GEv$y&@1k35m+>KEo2O)N=;2>7O!B!WBwmVgL>f;&GiHLs+Y!8fs} zI3qC!lu(?4LxP~mguyuV=0qX=NJ;Ka04h|4f!9ZPaR=^3*6iNV9uFE|9W2qiuqR4oRF zfI2>~iB0e%JcCD2aFBC+JShHx9o<|VgMu6*!IpqBp(m_Lv}1rXK`O%>gFGGmLhw}A z#-=LxWXyaE5fe7@R?=AUG8? z7ncoog>!x`Gy#AO0}Y1x`h(VOm>YoQ!!z^X@+CRYyp)&Xl30=mu|C|>5418W)W;R7 z16nyi`~+#8L6((erWS*Zgqr6GN#@{QYFc7)YDi*IPAbGqgbU!#^GMApNG$@TOg$UN zk{le%@j&qeH6HApAXj&Icp=#xV&fR%V`YU<4M_x!1&Ku^pf!HrFbvKFmBWxgM9Pan zsp;OSl?=|V6$OcT#hLkeVX2@sbFPJ@i8)Y5qRTNj2c@P5Bo-B?7BM)3X{XY(G!Q2! zH62pSgKY$r7ufTvXHaT-W^qYTVi73EGI)Y&E1%3H2Cyfc9Yc^j39HSW6H6ePKouRx zr{FXT)d=w~Sj0I$FAq{)1b_;1=lr~q#LPStO=wEsnn7-{@x+kD(@elni>@0S4gn=# zZ(`IL8nV!!Kn`;}x>4fB6N$&*9Fm$_07)G-rFq4f z>3OLs3ZUkVj*+RE4m8ywRUURII-m_9qSS&7H8e0XA=*^jia`k%k_|vf3hD|w24_eX z@=YwTfr=?;=^$7T-{8(ib`0S~i3J6zMF`z?;7km%4w5e+c^#IW9ZPc1rC^@R&xN=J zq79y%bxe#bO)SmKjVw*!&IPyL5P@HukzZ5-H3nh^SOHRgM^kI3fR;hf>IqL2J_DX) zf}#-3P-tCdhfhCT4N4+K)YG6^2-H3R2L~k4K}zi+Sow&O(i}s4^uPrUsPd0@^a0K3 zfR^U^fFlLXAkZi_xZQ)4BJefPaki%*t#l$y!PZnG$p9p0fEoah(zpne%Zd_{Q=Jn_ zQq%K`DqSmVOpQ#8EG%>k?9iIGAxP>nQ;V_aGz4jKMpg$h&j_oi306_CwHPKCnqgIJ zjNN22>_!_JVK*F9`WRsGjHw}ZV2<4)BQqmI6YMq_8kks^nqxQ7$iULv&=k9oCWe+K#s&~Go%3^% zT4k`T2NBFnPJ}h*?TG5i85*1nFI6Hbe#D|0W7NAAGzOErbp3dR;ooZ=_a7G}8GXh*4Lt%}72M3VB zprHq-L-BM?OpNh$K1@vT%7QvQu#mxYk_W=QXu;-}d+~UE5#Z_w8eoKl z4q5>C;g4!#3&`44aJt5m_S|r~&lh8?#SEGfOA^yT%U!|S55TiK;5{(lu_%m@RYzA) zBE=MTbOejz8*nl-MYs*k^8v1oXsH!BLO@9uktZC%sUReyD8C#uD}*o;Gd_@$e|$=6 zS!Qx7XgE6@cj7lPz}GJ~GQig_H!`rmlQoPCELHHi6`sa35{olzQu0faKzp}}OHweR z&Dqfx6xN`DNTjesZ z=SbW^W^4*7FYraY5mGUQW;fi|c!w&DOb|{)i)C+&;4y-x>iGC#$Yc$undp|7or+Nl zz;Ys*k?~##+t8dF;Ogj!Q_>w=s6fXOzyo!#aXHrt{F&PlxBnnHBR(9`C-!&p0`-X@ zD?Z?*0Gj(f89ZD-<5_TdG*9>{Iy4g?jtYejh=G*iO8_Q#i&Q^w zxVcsofL2gLMlTUIW4h1}rz9dV!D1HE-QbWc$#EwGMed(c`779yB&k7ZKI(H|v_&|<=s0jZ*K#9e9{85rTMEI?%{u9;vX1AJ{T zBLhCe|8&=s_M8@&l;3{CYViRqv%X$+o_ z5!mp|l8oTYl2m9Jo0yxKhdyZp9{dP#4e|voRs=6<#>i5JVW3JBI#uA{7~lPg9KovDwC(6kQSNF;jY$a@UHttzD&`!sI&=8Cu zfG!;XcJGorQ8_o9!&Kn41W23 zr8zk^IG1dI#-l)!=61xX1kJdEhR8sJ9f(yGC~4jtlr`|l8-g7RO0bYR0kR+kx^fLP zCIm_eu#^T$e!=-^CFO}lslj=P1;rWpC6M8B@Dw5_*zqb&&xOPlAw`goC8Ww2;#TCP zc3=mCoB{HXZ+dPC)Kg)_#gGZvN|1LzLj$0_n3?%`0Y&*`nJKA7AYmLnf(yf3k1SvW zaRYoMAb4N|v2el0xu^s*hJ@u9705h}Pkv$wLOB*O$Ru_Vx|-0u%)CrcbYxbg7BTo2 zq~`esfU0xwEOA$-X` z9)*@5ZxQ1eutH)y16D|cXABJ?R=a}M=z#Jz;h;AnHt3C@W=#NtQ!*>JP?IO4DrrBL5{`6skuoxm7Xb}23JWXG#7w! zlv8G2W?p(geokg`rEh*pW*STqvb6(u7?{8u0$O&9v@Z!_6ybO_F(opvP0WZ@2#ys) zjD{iPR3;Y&&tS)R$1q1vAISE&NCwE(c<^}>uoEld%RnoJbMlk3<16Hg4Ome2Rsqiqf!zy|@N~{ELN)^$;NXRVNLHb*6-PMS&=7NU0ZG%9;7-Mc=nv`r}k%YsA2w6)NhLDWRVn~w!!x)p~B(s#H zWD^x*11zIKNU~T)gOFsgC1IG!My6Q$L2$iB;E{c_P(a99;x!p-LV??Bi7lZZWGz$} zyj_F*Tz!m<^ipzi7{C=%PG%BlL2pTFt{yaRpmFuUJBL7v*NV|)z{~OS3xZRNK$Aci z(x4tmW=?7mOkOW6v$!-d#~E^BTv%|ho^yU~ZhjtvZ)S2)esO+UiJmj)|kQW{49&Wv_F7URi1pXk9g2OmaVAB|qT2TV&v4fR> zI{lz@gH>sMehyX}z&dd|A0(Zb2lGAL{l=tB7Ly?Bri6V%l!1444r3CO)R%U*lo>NhNNlqqAGpZzZQ9V#pLEMc) zK~!b|NDV?3!NRT?q#9zPo=Z_?St@c0@bpL0gC*!t<-S&a{Gv+G;8rSl>9(;AeT2CeDzVAD4!u0hCS z(czk#36E!lLOqbMo~IAEo&%QxIJD~dWTt17l&6A7Y)U`}grT-O5RQcnnPSn08QVy1 z1656!RR<`MfeQIzy&!N*Axtd>7yck|2n#Z32hXbrjgYb$t`X8z0hd}RO`y=c;>0v~ zhK9Dd^dMtZ@OXj=qqVPKB`uazk4r~*W?o8uc`;NP-F2RMpe=62NGS)ZP!BY^hA5F> zqOf#@ZccD&5xCWY8rjewK#|mgoaF{SEDl-_!3;-L=T)4ahu0b`r7CulB68tn3M_Z) zIp-v1=E8#;AzV~hP?Dcslvt2asppuJo?nz%l0itFb1}SZ!)}l(s3V9}B4JmBnQF1C zi!e2?1f5!!nU(g4nmQJ*?=O5rLISjFGh9)SOz&^fCYk5(@S#_i?CE* zkoEhSdFgu28Hss$sfb1rTn6qa@b)K=Qvb5lq8!jp0(c7?u2>H=Y*?%ZYGeL))w5vDrl=Z0k#XC~z!xez|UnwJJX zIx{mrFEIz&Q97VoGXmVo^4xP0slRl|`W19#bly zC_kk%xdc-J6ugOfmDnVZ`jeQ_uxY)_{5(v_kjxTn;RRP%?4IwDT9nEFIt>Zbk#$Z< zP0nF(0S$J6n&qH&DO@dsXR&jBUU3O%E(y}Pg+ya2^7IsBvoP{pS#WBJCukB4JTwa* zPXnn4%g-szP4&zRElx!d56vrvoI;+O0v)|Tk%mojCuZi97C~2|peTUkHpm>ZUw(;W zSz=}mC}Cky#D-)fmP11T#c(7g zpe^H7sn`?+rGmVK!;+xXqa!QLca7%mU6_=)^WhR3T--UKmQG6Dfms$ZjWhfP5MG^R*UlbLPXzRRMb0q0RjFCSr$V^KP|Qbve`<|USv zWaJlthAZ27oGA@aQhM*`Ar72U+C;R^^#j z5>Qga;8`4;nVuJ#2RfQ7Gc6O88A?(a+?~PeOu*x@&{b2=eTPn!L8)nwWWfNI2Gv%e zv-=o)6Z1+FbAnQfQ%k@jx(wlonI(`uCIh5_$N=tIf+iMIQy4tKx?zTcP6J3zEG_|U zXG{m(XaP0?$pmQ1@-Ik*RCkC71}TC&0%8%kZR!ac>`5?$wVV*+AjNv%L4wR=22W6% z2xMS>5i&c$5H@S+n+nQ{@aTan0-XbZyi^PvqM%hP;FB_o!E3ro5=% z&n~m1G9a}mH?tTthJpw+GqhOfO-g~0yK+QmReMaWJyqdeu-mVicfwzXp3P$ zQEFOd1*oxJ%m6EMKnubUNe>i^pjJ3EZ-9DnMVTq744#O@mSD&LO@}C+NCi0vTnI9N zj0Cla5)9$CfQ!AL#JqH*(iM{DAT4v`A~LMF7?f#B;48d}LGg^N!n4@50(4|5M!^9( zJP6d|fHm--nJX_H5?cs=g8ONp!WB}q6hr3H&~IPTgEywYg$FG0f|fnuS%n62e`Z=5 zsDeZ-U_tsJ#UzrrXI_c15d*II69&*gntxtSB}({1e4~dDE7pSqCV0F76cNyrfk^7$ z_D2y^80;I^dNj~#HCVX}8I}XpSzslgWC<&XL8ii#fl^6gNoEqH=L%jYz<}KRK!h`- z4Ug0ngPe~6De)K}`6Iy)+-(EpRM4GZMPMGxb)XI%cr#39ejY4cgU(+C9pVEif82@^ zb5lX1*cf>e*0qFozQAKg$U|%(?}6%;RM0ZhbXdNEU-0rBs1;C4Az=#@gDAj}u|Z*1 zj!34dpvyBr_TW(N4w@*1_Ey~Ti#&>Or~}vB8L7$Hj(I82GkIV~DME{){5*yNa619K z<{Y$f0d&j)C=Y@~?ewZsO7e?pams?uy+M%$4YD8|7^ml0Qj(aQ!BAj?Yy`R@T|0cT zm`*^~Uk!BzwkzxOz}YnwR5^f8qC;w+mK7I68m%dy)9H{_AtNrlL+FMTJV<3_0f>zw z=#gwiYV4*U4!R>?9jt5vSpjW17Zl|e5V8$ko+CG!!5h@D+Xq@<4T^E3BUuoENW}Sh zdTOA87}UkZ;$ZAnhUCMW;Atf|{1cK7?p36Nx)#_?q1fRCCAe}8$Y{_~ay`8OR~1Lc zFi4&30IB619B?=pq>G}E#G8mIHa$MREH&9BHOB>1Q#r;P;P3^uLjd(OG#PNUNGNs} zEOR4L9a824nGTK#;#8sfk${PiBEti6u5!FvkiReF1O$c(a9I@ZSdtTzn29`Cmx3sv z!DTZNAF|dJbUF^`Kpl8Nt_O|N49KZvpcCIf`^!PyOt2-O@)lN2Lr?63X#txBJr)Gi zR)$NXmdEJ2J@Yb4a2g$wT9gZsL^=0Q&pj1%f^=yP9PCw`!xD=?H9x3j<=_I@d1ZvYYtS{&*ulXe(igOrlz7uzv76>f zo@t@IXC+l4p`3~+TM(@YQS zF7zPVg*XfhaCIcpOi%1C^d#GbI1B`x5J8@qUf5meMV@J(P0H8}1j&$RrZ;v2y~#5z zz||3lfgl<3%#6noi1FlyA}%Arryr2%N*w-&9s?Se9(Fkxos*X#Nz*u4akCC_Z6lh?2t zkE8(E23Xq|dR_#q1zeU`6pYjehRK54!3Ef4z%xI2i8){uU_&9}PA~&AAkAl}Aaqm) zS)EHNc%TNe1q|v5!OviZ_zg#6*$t;sutkm~Iq;*TVa~!Lfz-i4(E;zhfY0DSK64t` zFf5V~1F?Gy?jXV*!>SbKe(2~LWWXBj#A{^dfx3tI)#7t4KAnU;K&)=CpCD&k!I&ci$dCcLi3^+{kyRo3u1JUMqMfWu;wij((XkA9 zo_Q&$kWM}HG-B`!0fhz!rRL_Br8?&1fW1LQgWXe0f-|e2U2y6J1au?<9AmJKJ+wZ7 z_v?`)AtS5^1&~yUp#WAQWAx_X=XWEifQ-0cn1QeaNdagR3)ZuCVJWhpxC(X@FKFEs zBo@$hfzH{5X#m@ct^jm0D_#Yl<5}@40G%<5R{{7;Uc4&6$MfP<0Y0f0uL{Vay?B*C z&hN#m1ag!wUM0{|eetS+9`K7-4fL#EylSAw{^C_*2t5H9uOirCz<3qG&IQJ+2!2E` zURChZg7KC z@J79J4AF?kS|Ngirv&L572NmaA(cYtRuB;nICWDcso^x8i1Y?JNDhC@g8~VxiU@zg z)lw^8dmnXmrHDEHN?3(7+P9<^{3x1hSaV zCK+_=p#oBQjk-Pry3P>30;K@5Y{ib|HlnU3*>ouEa^h{N%S^e4Kl1t3$1 z_bWwqV}>z&xe?Z*92t^|ONt_VeHaP~5Id|h@=J44oIs1kA^T7m%8RQY27^1)1xa8z z2G3%MAZ&e4Noop10lHF{WN|=IYBA_cm4Y0YkaJ=IbP*tqzyZYosO89j`*1)#@cKBv z)Z&s<&}DX|IjNwX%m(36#Uj(^t6-fq< zuiR5hP)`NJqt+!Kw6-5qIC$ovYDz23gDemmR}SPJ&7V7 zbS4%)Z=x8i=aTQ2Uy=b@|BBCDkf4ApG}ZG+EDlI5f*rd;iZ;l;P2wHrmztVV3>u2e z1fAFe-b_TIW~4+wqIS5oso-@ju=Bp4>sk=9DGtt%vx^|16S&S0xB)U1?51*rv!XgZODpN6u#)q504$yNjav;(sNK&GMMTn$MAIsni zx~XCv?$oGRRA{wEwNSDG2W0A2RP@XCgznEkfH_JWgsD+K-a&L zpaUsV^^!qdS)3<<;u;4@$8mC~o-IQOZo{B1#i<$U_xSjD=ZXqY%Of_jpj);gBlL!zP)Slarr}Pj^Zxrjq!?lGKXKlK2eB71yAaH$!}U z0az?2v$!N4oT}sFLB}yxWR|4nrNo2U<4|r=YI(yk9sTbR;^|;9Q3I z{5-I9E^99$X1`MF49pkp;sQo+Zo zr4}*7gSJAuf{si=2!Whel3J7-pUO~>2KEC(L0W2F3dAuW8GO+PDkUJDF6cR12yOAX zL}~=>r_3pX?t!x@%g;=u0bnj5JfiHs(x4K>IKJ=9QZ;U zlu15R2~cqd-IIkP0bYdxneIWefFZ3YHI*SWuLyj_cxn;&h?{T*P!SF8c_X^gXj>wJ zD~lnX0PS@3Nd=$n1-?ocRn$GT#3!-11hO3$x|RvNPzhWMAnb+P0~v8*084`pC4|d> z*G7QFT~a}NoPtupSN1`a!aCz{)yU?+1);@!UTS%CECYPt1k?jYz8(+}m9Q~2tV1hs zWx?pt`f zUj(Yvic^zIi!w_p!I?H5-a7~HJVmL=;^UJc{lxgx3g~vh_~iV&63`L3p!}5yx>^Nv zx;45ghWPkgqukU22Yb}`cL*ykb^xEn>wq*42xJ5+G% z@`Q$^y?uO;fxTlGXfz!(28b*694r_>N(~(y>3^(ZjsOu7Mm_ZBV*7_++musa;-+#up?MbQDZ59&|Eu528(!6q;etvllE#G(&sGsLIC zevSdb9{wTtdqc=9^&d8;_2@PzMBL!5bQl^ zk=mh^DC9=m_;BR96laSX*0uoE+~9_8`E z4rrG;vKgV!WdO(xi-M9O2O5PYs2T-VFUUb@??k9Hfy4u}M1Zu^;hsP-$$&=g#%xN( zyVA(2P*+D#8z{mPIZEt*np~=mHk^ zMTq-)`}+9@czS`wT@d2_0p9LDj&5#XaY&O2WRAIykFT$*zZb-uFnbk8$3zg31J~)~ z>EPw&=;`I_;RDv|29nMP5k(*(8APOlh#(LFX61rdU?pWBRw}|QX9ss@Zx7D^SFllj zAX%_FBJ}z@c)9radpP=mwYq?`f-TE|vr51$xMj|c4*q`bzOMd`PGBuye}UD2wS<6F zgS`NjK={KQBmp)$56(iULkSpPM>ls5e^-caz{U_^zB9;Fe-MF)HYaxnw*Vh6FIQhk z1QBaiAjlX`gqK|%{5&099X(yVN%Arx_|riKW`c-f5CQg15yE_D2PZ!dcP}?Ta?MWz znFr+={dkYtW9-`&C2&)3(}-`|r=^8-MZfO88tXu$a&5&lm84z6wi z9)2Dkq=io~$W(C9gG00c#09$_Dd{*mxcGVmc>25eljL+n83c}1P!r7&Tz-KqL5f;; z2X8l5S6^or(t_R*uXdbA%N25NWt(oTU}0ig&C4 zsRNq|j!>}E!QMd%dT$3mXD<(bH)lvOPOSN0i@{+H4i%)b+}FX~)7!_x$Bm4<1hyUQ z;0%z{5vDpjIs`ZccsTkwlV&P7g@C;b4gqjl0hTY|`(PM!|_-Y!1Qp02(mr9fX$2!O3CfTsp0Z%}G> z_V(}~Ef_*UW`Vr}b|J#w&dv@lzP?U=&Tj4`IS%Y^a0r0I0$g4rLI9C`oxC0V0~`bV zogGO_USRVpL9PaeW-=lKd>!0899>Ue2y`u!r>9H2CuF$0D6xnE*O@nvt`^b;bjU7I^fPcUl!10AgJ->x&CF7a3{wpB zU^b|LW^KSrqf(1hKqHyRN9Kw@8ZblQ0RY;C2#Z|sL161=f&+o+yrz zFntpX-~-@T(=pCq$8jVJ_&63a(g4gjxXa_?9US5Vk~4xUbK@Nh3>-pJGtx6c15$D_ z3qqYjGeR>mD?+RCvx}=zGcx?M^Q+QJb29Tnb1Dl%D{?Z+T%1Ca-CaYoD~kPdDhnM< zoQw<%EZkfyEu0NqTug9!3fFNskP~*u@D|)axWDkE6Y#(gGzKvf30Ri=6av-`HJqSh za2)>xK2M5_P=FZ+w--^XfXW}pZ7(<@1vHQdzJCRDq#d3UN6?QqA;Y2At%5rnxsVL5 z%u9yUjxPDhAYX)fLXPSvg4K`=KAujVE}-Krd@_^p`HsNBJmmQUW+>e8xDp;((Serm zV6tQ;JeYQ36CUVrET~#Ehk#_rbOcB%)KGY6AV;NVuw#HHxL5?WP2dYQz#NVFoSP1steYfgMW*cNDIq20DTd8WEUI03Xgr zMvx#G3U>fM9_+wJ2K(IjB+!C9 z$XyQ(pw=vCISV9)p&=LV=LlM*nV*#9n^@qQS5j07TIB|IO>vb|W?o`ZWmsYk&NzT| z4$+(dKC~0fT(``k;u5gIu($=yGH2%DG#iKaz(+fxnB(FEy^0nRFK+oo$*GW~wm8j( zcLC8H4mpw$Y2=%%b2_$YH|q1p%o=X+f#!pv9?BGyL+Q zE&&;loDl@NW6r545p+K6QXBU^N5Q?1xA35M@A3g z_z+J+d&e+PK?Sd>A!@)ejS^faMJ`IPlh;0hl{S=l3Ep_1z!)mH1Xj~f;0mPLl>$>> zWd_^`L_Zg8^pw0dJJ8XFyA%93#9@)Y=Y>dk-Y(E z(J2PY(Jq z2;yzWrok(~)hVqK{Wl33fj=6C&`LU~d4ui3#16j_8pJUF?oc zIcQ~j1abxjwcC<29I&YcElolTD&#{$QJsOJ&=8c-;XMo73L#krr=g&GArSf305k#z zx+x^y*WV@7$JN{bx54&?q$mcLOZb{^_$&f>l}x<`&X7Z0QH^(W#fVT?Bw+6y+HP0hN&TF`En>qv4qP&aDhsMfynyp z9qm<+4|sKO4?`6Ix7;C}1_x*Z5hXAkT^-#$kWGYiYaDZOKy7EF6BM}-^9K&vjK`p&N>n%ZrDfDnz+(w}I08tHqI`9t2 z=|H!Ncm-09PlpC90qh$JB2?zE(r>wHlMJ)tr2-PLu?cGbNf`DbegniDoB? zQin4|x+`^??ZEB;FS`Wm19QR4^~~gsw{juW$yd z0f#HtCy-bGX~r20=FW}*&H?_OkfoyF^}AqQh!vau4gpSn?*4wz4G*~OfqUJ_)4|)x z-Pg;<3$h^r9JAm!1_uH-X2C8+NZ@pzldprnyOXn{PXJ^&H8^s>i2)o#*&xq>{R&Q* z;N1*h7T6MS-T>PKPFKZn7dm@7IC*;oxH$PkOa*H}xCZP;gl4e$V5ftZuH&>Fu`9;O z-NDN}z{}g;6OvQGMuYW%9Rl9mfCv!qP8P6r;HX2&HvSGyZl1ngZeEbJ*kEH2`oMk! zdk-N&bO<;*cscq7c>6-Pz<^Bvn+0|Qm;k#AEC!YZ?_mIY0?Y-MWZ=9BRswcEq^t@u zvR8o|0`36b`wc#28rNn!T;lMZ%21O+K@+o}(@=3~z$Feb2(h`GYHq_~B!!MNrkdLf z>>Wd?U>I~yI>KEPdJx4~WSa$bl?fF*2-dxjWUP3ih3rIpNpW5f*-?x zKP#eV6>yfrw=WT*0elbxUXvl}z$Y;fp$>c$173B=-a_A6igeU6X#5tk7NH1N>3~xl z;$-AJ4hjv#W>D%_1F^-3HhzE@j&ULbHC>KzCIfX0hsH0)sSMOL9TcHNCo_;@&~f!d zCm2E+Ah83^JNV3nC zV`La=7!8e8jO;>9vk4_mO%ssdagt&@+h+j8iq7BA0z8f+5H&#hic|SqZ=a= zQQZPUi5=_^M}rEpBx5r}3zI}W@FY2wYad)IOu%bHh)`%utU@DV6=GM1^%OnV3LK{5 zP>tPa=lopIiI{mMIE_P6fmme%npUE;3yJmk4MTWCpZw-IR)YAl&>l1Cm^guvk!FU4Kz$C zP9LCE5~xSqAem0Mw#8BPKocLP;TQ)4Q8lPQbE;_5m>}PPN=2;oD`k-bI&25ihe4$I z2pY+tMGa^!H^ft&QtoinNozw;5aI2wKw}hD8|0WEV)S8#6Zo7ULRxWWd*oFSpygvA z40lvA2;HLIX8gC$LYosMtp0;g7NM|x4IbONmh0PTW8IUNmhq!+$k8^o#P9O*?R zcVn(}#LTi(vI<9rCB<||aDk8XLRp6fY6_qxK~hY`lLSF-M$L5Kyhbta z!y|p|9br20xB_2YM_GRhnhLQLO_+HHsXC(AQc$wOOdrTK9&uJc-4Ckt2;?GayB;0aFfL@Ri{6Eyte2%hBx&x?ZR zgTb@pU?qNtX=Qf@KUZIOFBf;n*<4^PV6(uMfTw-IEbuHa*l4hU1kFdRP*#CN65`le z$RYR+VK^>m#8pB%fHrv;K<|Xar3kbv7uxE;WjyHcSw~k#$lRtone5=4 zpOXXG^IeQI2H*%j2Oo5=CE|8WaAv_sY#;}Kt};YZOXDPm-RtlZkf9fl;!GuEdLEQ5 zEX*vD%uSLJMHr58DoAlgtZH!Sm}HTbl4fL?L~u-x2!)U_Jt7oB+)0E&>`uh%dkj-? zsK#zIM%{p69Fht|-2f>A!-|WsT830x#fL-2g1}W44#m)VE6KtjEjcO0kcgNes1O!2 z1Qo(!hM+=d@S&;0>Lb|jD29h{sK#zIQn=%AB$5h5%wXJ;f`|+!aAd^$A$I~iF)vR+ zXmA8;@BnSvN7e%>i3s%TVdvpvjC(qQhi^c6JjFcG%-F=-3?AJ`-hp@+p9%)>N#OCx zNk(aA=0?WxiAlzZ@rH&eM)8)(CI;~a2FV5{X^F-LiN>j@N{#R;wMV`*kM!F*!7+)r z{}aV9lzqS?UIYo>G-?mpU<2K654lf~M3YeOVpxkwc z_X1cW&@mPE8HvTv_#j@VLAXgsQKnOVeh%o4R0cF3K`-Ma*(J`PyZIa(b8;ZJE*9f= zyoV!-y(ESnnr=u4fQkoa=MeuOlATWRjkYL$fnIq^qL;CD1I3xW<%1 zS7jjI*Gz(o(2`tyd_{76Zb5t%LwtNiW_(#md=>5@0pWP+6boRx6XO#>b|=T@CK9k4 zp2MkSJJ`R8xcy5ld%z)##~x@prHXZ+iWO1+pyem3*Z}XFfNw6td1pM{QU~0tjeyLI zA`a6Ct}HG|&2?}vKyGV*ZGoJqf^va8(dMJIKxk<;x`&KWHsM1~XTf@tJ<*JW@hR zEuz@DNSC@(Y!#FK24FSI=Y z9gT-ICLomqxZZRuN-uUWL8+6Wm&=oCnWL*C%sR~G3vy* z3~<Pk&d8Y%+Pq(2xr#-@U4si{+@mz zu0g@5GcNJ*NQOalg0ea;o9)qDhwuluUx{?zJ>*(<@HOo5x#*IhOQ_?KFQSL22HiuC zbX&ZAd`^CHwu57dYei;>4~S{wTvUSngiest0}Vh?>FUT}A77N377xB9f)w4L(H%#F z3JgzxoR!NE54pG=?rKmYAAYZWJj4SK?;?2t-g}JCNX$#gNhRJnZqAUhBR)PV%pG=+ z75KcZ{DR=rqO#27)MAIA(!7$)+*GVx0C3>NJLl&WmlTyImyl#L_PPZ*nLJWl)F4@hD8{hc3z7%>9KQ!3 zC1ZRpsJu+c&rQtCgBb^LB7{V71k9nBTA;y-q8jAnlGLKyc<2~}FR11VFasSthB|-& zQwXx(4N}1dn1S*)iZaM>lS4>GW-(+Oj!@^;+1K7N45AdO7uFcZh)A$A!4UI1o=UfCkv&{X%_wAP4(HmxQDirRIUg`GfP* zO3D+9Qb8w(7iZ*`fYx>x6Rpw+t`b>4LewQQEe)Sd43MLs!-|WM^CwU1)NkvIk^JGGq`x6HI{(gDOnP$pIzs z_@dOr;`}^_(kh1V#LSZL{G#mCB8K9U#FA77=fu3^)EuagV{u4gaW+F)aj|1D=+>5G zuw)K+^d|&-sexW{Nq!MST^Lja=<;p`MHC*yK!)_xl6aVSKuHmp50OGP4s?)eesL;; zTV`HjPG(gqLpcudQ|B{T!Fsbz^drK$1p3^s{5ndy0;v(goEQ*)D2i|iOmi&Kk0 zt!7Yh#*hf|PB7TRpb&7&F9LfIH0_;}T9TQchwxHRYH?{!3BprQKFB{{JrGksT&V8U z6wnPf8AbVd`K84-~6&vztjqlUB#&-47uPQ0Yh#)#FJ1%8K5-Oa8ND) z1!R6+Y91uPAb6nQb4*Fe1jR&RPEcxbNq$jkG1xtzk?_(2e{duriv*V><`y8S2rf-d zPEAcoO#zF+jrL2-O+^(6sVsnqxMk*~LahQtVkyLQpZxU92?~r^Mv!(gK7-p~fKl1u7JhSd^X$OFO}-pcQzjDQ@{i zP-(DrjyWZ%MR|!OsXqD1;3CF1v7jI`FCF4+m&~Hn9l?ce?1}HZ{RX|G?c=7kvh=gZShTM1r z8&uX}q<&Dt149s0^1_`1&FFc>C7_m!C!{EaXz@&8$PFtlhH#KHAlX{XkQ-kP&T=5d z@tFu?Ai6wLKs6N1Xk;@W@<<|J_xr*Hz|D(rBtFR1;E)6{oD;#712}gl=jVY-BxvaS zrj{h8B$gzC#r*P1GSe#k^B`dgGCU`>1X2}1(n?}d4muaD3N`3qeP>NB`7%x{%2 z5s*P3Zz3Cl%!e8P7J_L81&j*{2O6?)#i&6I30t(dK}0E%PZ5F)I8p<8!ht0&P>RI5 zC>ESHvCDv#fq<4dMC9f$ROIF`1SgiIIu?U?pkxb4hQY}hskxB!iLg2&ACmQ4E0S|c zQ;-rAB%^>61;~id;>2`lip?)AN`^2!q4^H3DlE0A7}RD5>42G7l%ET)urqT~iy2bO za~V=A5_2>2QX!VWlNPip#Og)V3KW+T{3f7OtT>D?VnECdG2~)Z1g&MU%DGnHmj%_w zkdg}=XrOj1qzHs^OTpos8($0wWpK9v5izJ-P=v#RmH|1Vf+96Hz6=@}I3ofj`hp=A zLgE<`FJLFZbc3S~HQk^jD^RM12*7hkF*w0u2s$R^7nMLn85~nmU=?d-8G3V*0TNK2 zDGc!H23!*7AQfP68L(puKuu|IIZ%+A%utk?Tv}9|S(eI>l3HAn3F?05=Ygz*yO05? z=5S0&fmi8gk1I!-J6oxd= zt#1%%1_%XH1qv9K%wkYI0!fI@If=!^sm0Lr0Oon76f>ZxfhA^`Di|NE5GBlAka@!6Aio$ssKo$EexOVll%HS1kXTYul$lgo0xI#q${5^=QqfC1gb=j# z=AKxRky-@tHlkd_B8cR0ta@DYQm~363u3VoB80GAioH1Vle|6AIXJiG9c%n3n7Yhc<&IYm`AF$Jz+aP zN((^Nr=~CO&;i%OtzfFT00$u%zpLxusO5mCB9^LJ)(E@XAmtmZ!vY#jL=4^pr$TEOkWWB;cF;Hn zQVN8qcFNB$0cC2)P&`B_La8&np?MJNC{HkAP?4Gs^G9AeOfp(sBm2P_U^Ku1y_Lny(iC6MMX z%E%I=cYq=k3>r^|rAkn-ADWj6E-PVTpq^H6YB8u$>6rqmx?vI_`9Z14`DLI)omzri zze9FnGC*ZPX6A$YY{f`IkYo(5LXp(D=A|I<+*347u@;>;i4`Vj7N90@M!1z-{vM(WagIUf|LXoBqpaaIA?(JJBSZb=?jq#22Iptf~v5@lFXb`NGT6f zQ|y*s1j{{`G7!7a#QpP-g(2)>Xi*5x$8fV5@{2OlK~qH#MPN6BryC&rfTH}8)Z`Mk zM9>5dq_G#8S6ZA3_cM6F6h&=jex6TiS!xcbG{Y`Y05KG!Xc)Ap%8#0lZ-it_G4!p?w?3+QY=mywnuXX0ZIcVo=WpGy?>xC(=PHAskacH;|X6 zg3JyBtt(*gPE9Rv%mIz;xTltY+n}J}^UTXjMREy92o?|UO@Hvc1Yi$Ar;QmhV6f za!)M*-9-Ym7$QKlp&R&n4yFrl_7;efgzuvfFYHkh#`@ogdvk5pCOMyfgzKjm_dOd zk0GC-gh7F!n4y%RfT4gPpP>jz7f4+R)ZAo-QidY1>3LussAlFdq=QYVgxZ=5wzY^s zfgy>Zl0kt1mnj7dMGW~2Wek}NDPR}sF)(<8d;;=CB0~y807E`QK0^+J6@wK+AlO$R zpM^3MgH?xv-J8we33fBc&NPNZhD?SWu)p;f7~;dh{1OH?uu4aUVunhFJceWjXNG)+ zT!sR$N<^3>GbDn;1{6X$V0R~h!xSW*16B(OO^^wx40;R<4b7emd0;PtG$w-;=QE@+ zC@^?3_<(~L6u6~e=Yq5*GNgf>3JMrlkmNHYF=R2MG9-h8H5nYlkcff=Y9?5`oFNe$ zVJTo!K@kNCf)tP=xHB2@z`<9+zz`eCkjIe9Pyvo`kcp54P{L3N76C;&C{n{1f*FDt z;u(Ay+!=fsLKxy1{281Wyck>=oWZ;Rh9Cxih5&FRB3#GN(Cv!H=n{r}aD0POAt4J~ z7(5x=7~B}*8NwL+8GIN*8GIRB859^a7^)cz7-|_b8FavAm4ZEw8U)o0h77d~3=Qqn zcZ?%L5Q8g&BWVudE@1FwNN31pC}Cg-_X7t)F+(0hB0~W~F+&D4gMs1%l;ujmv6u!< zj)-hg433>-hD?SuhD>ncRbVIsC;U=|T!vHz21{pf(u8H#T!wrGP)bMxCsJ5u(FJF1 zNW#qlr;`!}M)pK-wq+27(1{F{44^a%%5D`54Auxy1%_M(P)Y@*SV*!5WrI`(U9e3c zSAbGFr1(f=$YEeq1*N+(1`r#ReH9oGW+B-S>JRoCzQQLNB{QZn=rJfTcrXNki?C9L z9B2{%6<3hN0m^vSK~{iDILwR}#!$>q49|X!3@PBK0F{NHY=`h9EHELS1$iBkSqNv+ zG;pZ}DsRdeG8i%$k{L3OyZtxLeA4=6)|GJgg%3xn)S1(!3RCWJD(w$0Z}A_jK}6|Q1P0{kPD6(P%(_nBv3g7DsL1R zK*by)7(n8ntnAF7&7jQyN*$my2Z|4nC?vDPid#@h24(&nhI|H4v8~6z#lX;L%mvNO zRtyRZkX*~fpbLfy48aVb&;ivpp!x|^WD?_8h;ER%MhvwK2-94_MIbpQA_MqDg#lE+p+-DIC8%};MF93_fkg-;;Xon@7AXo0Dd0LBlx;z^ zbs0DYlEC#Eq+$S-vzgEgU4_(I07qxTN=mGTWE4=v3@Rr|z_lQ#0tQvSka`Z{SdimT zodNPJEG>dcEsz&MsSuReKxJ$JLkhV309E{X3}B~HF_1vzILM7<;JO{tb)cLBDHFjq zS5p#3sL=z;4xn5PYRG}gK7w}FQ_pV9a3v;zOs1X#Kvh~gvGc80{xHEsb|Km0HMN&my7VrGVwD@fHt4d$BGOhy~ z{47M)ZzxpV{X)&Y%d4+y&zHpe<=PK(InGoI|39mHH&Ep0iQ>C=C*8Uq*Lpy+LAI3j zc8PAL$bDDFMb%o5PQ<*H73Xc+H|2w2fr*IAz14x&GJo5LbadNYy087N5^I9PPbYZszokZ-*wNe_T;lKdL_Qx{mH5IpCA4Z*%v6Py3Ap+|F^B@ z^fAHzSuek}dFu(9@@0mL%)j^R`xnoiFFppRj@M*NW>HK2 z@+1dGlZF%loiTM`R`iMO*hhP8C_w`1jk**hL?V3mT^FeJ=U<9FyT?5sg{W zAx$r>qkMyUnI5-JV^O~obxx$~-1n#v6T zr!*==YmY5$M+jgIXx7~-xMpiS85vb4AV&$ zPtRKOU_nt+o`_BJ{QI`=)^Tom=;k^1n$-zuzw9X@mr6OAzwsYT-8sdve2&B3`?`CZ zGevf`*eTs_4zjF>-jcCA^5F8yUzH9bN|W+mGVMNgxGU?`ng>xg%Y`+62#EBD-#gs* zZPjmssyop~x_V6g>rO5a(Vkx?y7=C1>8=<2WlNu&db{kAe33|4uiI|5+*)5)}mG_lHR(>`M}JJ zhvhcb%1IW@OIGtda9+evJN?HG{eo*E=6pBhKCg+n%dqeb~X{%rtYoNPhJ73o57orpy1@vc+usGP{RYXI>HU zTO4vD$;IlpcEF!+Po~^=knZ)JD#D^3a4>9(;%t}oQ{R35p>aFYsJ}%d$E)U{;UoWZYQ`eL$36~E#V6{ENK{|6`oR3pJns5olXtFW6B9Yuzl!KG%V*B;P=1|Z zd_Vu0^+$#rZ|c9u;9xQ|8JM-M#oiIrCo0FOL2b zj<0GEsj~@i-1}dj``X9dk(?HvpX`oXzei;17SXE)N_nbpTdb@M>l2S!luWA>v7LOm zYfsNrH8H=W{w7DmBbwVomx!#05UIPSvrm6Y*6a;#XG?S6?qpgdQs8(XVdAE+wB4E8 zwe}v^$r`ZW$rF(`ch@ZqytG+x8vC;!kC*)^j%4)h5ZU-`zjpS&?!zLJ|1jS2*}hC@ z!GtLypYC~uDL&d7%heM5&!=%-$^3QOo`_^N%kXPfo}ahH(EIm2Q{fvz8>X)o`Twjg zkoEudP>sT<_rkGD(iWfn5i1g_MlCArlArs!4F;Z1-4FVRlr6Qijr0^K$Otfv zXS@<0oge?nMdad_=l!3)FW<#xc|=FOo4Ng!+9iFF<8_8&>BWH$9iQfwpKx#cowcCz zp-78LVZ3DcqyTltiQg|66(`6fobDFczU}6u$v`j)nC0)bY8XsAEz%!us$hE}^MF*)?)dHdrhncucg=AT z{h1bqRyoH+%3gW@Ul=dL#CcM9mB>Efmdz!SrHXbFZBm`|B??LtxSU0NStl=Vi!yVX zxVL6${MOF+=_g$7imJPUvL>MpnbGhanHCGq8#eF66y=`Au&@(T#WR+w zt+*sBBDryKLV}TD@s1>6&D-yG`ds)bep2L%*2NR+lj8$3XFZ8swRz*~xETi~is)py zuk60+r{ZvBcap%TB=wrZul9>X1SoX``fGZG$AtWzbnagA>G~)ik%ynff3NvxIC;%E zlVyRAB*L3`f^Ue(teq1YWwC4l(~5>eYi@1%F#SuUjY!SpT-Rft=Qp$-UU@2U$NpR^ zsf-IEv(uH?3(ikJx|!j$r@esMKAxE>g(3^QxQdIH+_X=6Cm_2pLb8-wJCa}ImrMVI zJfRCuqI3T-uDxXTW^$v=S&_}Grd$5L-m5)*tJ^=83(^S!DRKHD4F&(Y7C+!IHDrxp zX%_g*F;98^ED<~7&H3vl-uW7pqagC+k8HJDNj-qEV>r_^K9J4Wr2k>qK&n&uH{4 zn)6*_vrypn_f~38r(ZZOQk8Pjydleb>W=@_>Mz^pKMT4&hg-xjHPO;}Vu|(C=$P{r zf0q_mi0*kP^5+bX;gSd3Qy<taYm(>9UJO&vF!vNKllq#ai1&5|>Soax*l zVzY7My@T%=c;!;dPMv>Q)givPZIwu6hO!uM!{3(e{{-I`*lY`3GS93+l(b_Em zYVG-|%`-Ms-(&mqCrjk%qrg7a2`Pq=-0cp%>whga^uBdoP*(Xze}?n8iEs4L<|=&L`nVaxp8jJB^jq>OHG}15~4&J zgts4fnku9qskQb|Wnkix(6>**MJ|N@+ADPN+EYzl^#E>fPNDhVum2O7*3sGiOMTB- z$Na?+ckiaV#m@YAMnuu)*XkJ#hwd7AZ;VMzEpz!NZ~sc&Tw^+hhOD?ow`~rcBuUKVu$SbH*N3M_KJv1 z4eq|q@m=Q3nQdP28!8zd=dFwod3kce?T2%gFFX|{o|Uy}V?)K%RymRAZy5pERu>Z_ zcSNNamHtcUL~yaOu*%Z~@-<%t}&pX}~dajy7WCg<;?Rmxn7j}FWbd3L7y z!o8$MzNi&bl)j!{Wnec&Mt{uUMI;$b$7}Zg0yl`q{Q{ zX0n5Ai}6n3+8ykoLX9&Sg&9EfLPlW*4pE`*8H_@WdtnSk7~>#}aTLZl31h52hsF+d`^FcDogQNbo#Mh+;yDHX;@gfbdI zjslx<6D9&?fJ{+j5@ui%6>6HvC1B4Ks*owCLqYb1kwqSHUMc5f+{fqD^bW5Y%@SH!vJQ60a$@xn*k>SqfnzF zzhIjUn5D`u*yaFcY4QuUxqw-^{DN&BV3r}jV4Dv=*baVXs0jfu=eBw9Ffa->Iw~}J z@+;(W@qsw95RPDL10PryToX3~BOla&5SW_+paKE>Ab;^Q!nmAZK8#zz&y3=w02E#b zSS?&{2q(<&5U6P(Tp))ih;k^1a&m+0VN?+1R1oD92C?}C+ipPB-B1wafa!ez6?=eU z)dO%qfJ}l!zyp}_H&Ep-B%x;hfeQSAhDO^Ts7$*AM5bK=D$_23Y(={aOq~K$odQgq z0>m;%cq-%ywkv>L!vt0b<}))eFv7HJfQ1FyHDKB`L_to2yS-h5AEbvx7$gb}XqcEd zNQ_^w9U6e`As{mZ+aUoBQyaq12#H|00K|QQ?I}>JQ&2pX0+Y^xO6Q3pwa~> z(giR#&45bJfVgP}Oq&Bt965)y&)^qqcL1jk1yK%u!S)<}!L~Qt(BuH(3xT`}GKw9d zze9!t+1?Hra2RudB^7c7J7l2tb;y8)1UqCzKql}DwnGKlW%vc#EKtnQLE)J|HFQ8S ztYC);zhFB9Oi%}EtPaQ&n4k|-(1%|kml-Aqjhv1UWWgAy${1upXnb^}APYicp(6)b zumq~T1X-{KDp-Ro*a8)7K^E+R3icoiPJs$eK^B|?6`X@CxCAP=1X*wmRB#Ql;1;Oh z7G%LaP{BROf=8f&N00^2Kn2er3toW=UO^VT0~Nf3EcgT}_yk!HS^{*uK^FW1Rrv*3 z5Lz^J`~e9fCygGIq}RhE%)rbq*uw)cqlbqNq#hy$Nsod(9AGhU66J@L&K)k0YzZkR z1Uo#y$sblc_V7T8Ryd!76PyM31v@+-7Ik>=Goxtf@PKH6=JU13|-^ni6hb?Oc@r#c|p-F5`ksYgJ1`32jc3B2tHA8L>}pm5uc@W2W^ ze!)}R1Si;3c1YuO#BSYFi8%61yK%G21Y)9W_AW9MxjihOcn-4Mm{zMCPqG?Og08a zMxmyINbYO1fVVF!SQ!|Enl3`hbZJILh?$K1jI0a{3W-c$bs#$-e3Y2(`2(^|MyTl| zF9Q=a?e_c;%7n&O4>TM0{NaVQOB8Yidl^8H*67JE*vkNk&t3*T%mN4t~L252!d)Jr@ImLNljA(@P;< zP$R$Jiq~pFCLI3U={~IBiML;Ms8&WR&Y84;we`q#+M+13y0_8yhHkIoLszP$mZ_h-L&e(_ySO9UhPvs7(*Tylm2-;1_HIx8-3{ zCj6jgI!GNTm<(XT1|VS;Ho>+CHa1X0KL*53fUr{_R0c?>07R5P1ai1R#z5QqP&T;5 z4`qYf{7^Qy)emKZ+x=iRKR+|SU|Rs(10GI6zzJr9m=*lYVDmt1gdHJZd9d0LPM9GfAQM?ZJ{JI!B4APmOlp8h z6^NfTz*OrSFxAEap%fq#1B8O8Y<&Rcwf;s{RZ}Xbp&X!onul`3J1Ci-C!a1Hux3 zP!Oke=|FfEAoX7$Y##^}0HMI{{R47a3`C#=r1S`c-2#xX4q;Wrhgcfl!bz>UzS;#xL0Q0z|e${MZHYUe^Z}HicYfkV%k4*adYi zC{){_LVuXpn83z$Gk{HixT%{3q-zO8f&;{!0%7y;vcXGx!L~ObPeP)kTL7dg1VqeX zX5(iB8`i?f1}^CoL?I#B3G!-p3pg)waDwt86C)=lIIDrWdmzjKOH>c|1=}9LQy_!| zD#{+f6ujXVYixR#UY?h83=>32S_@EpAlj_m;-fldkVi`dkWYtkZ=l2 zI0w|@feYurgbVlu+Y8{r1u)A%eJ3!6sdL~LY@Y#l7)Z(i%mX!cMZQ_#~K883%_8;76f+> zzhK861osHPV8;;z_YA*a#~B3o3cp~-6$JMVzhK851osKQV8;^#_YJ>b#~TFq3%_8; z7X8lXy{hl3Lq zy&fP%5Zz#99Uc&6p!#G3qHgJc)LJ0XJ#Zu2_P`5;J)k}cAJot`aCHR_hcW6-+O`Am8twqUVA}zh;;s&8 z67T8&^*KO&4X9N6OCynxb)Ko$V0 zHUasGiGv@~i2%6^%wYlV1*qO<0?9LSAi}NZ4@fT)BdAjW zavu{YiT@GG1bG3>TRsF4w8lg8Su0LwzE zM_AVa>~wJFLKqZMunq;JGr<8CgLNq&VvL}W1NALLLFySn&H(izV6+g($H`e zRAfRjkz))O)|_1 z3?R(Js=y%BSjx-5EYv*(WGq+#n^0pe3!6}5Av2p$CbI?u6RQSD6|)9d4+pCPXa<2z zfr*hrn1NM+kr7NX2{W)OFfqysGjM%x zAk4s}z{m)m>kww(V1qJPG#G>#m=zfKSQQuq8#jW0qX_0f1XB^g+zU2f zCz#v{CO3lJ+r5BI0X!W9vTFgG2AB;NQse;h6gj}WgAm?92=6F_cND@q3E`dOKm^QM zaKOld!(tD=VD}4XSb*ER-7i3v9bjP-Y?K8%MHb=CwGdbB0b9D31Eg>d*d1#@(JIRd zHuo;VB2BOrNB9N1-$1Q+0}fPBYH!@g#KyI>KH}diE@iFo7DX>EL z5FuU#HV79i&87h2@Np_I2{y{|2{y`t!d4cX`Gp!&LD>=<=8cV@(g0*?6DvqSuu+yr zfmsMtPYO1%3M%p|un0A#LgYc3Kv`0-QI?5afr$e`Gctk{b1SfbEa4MuwB_Rfr7c~- zMp;BKUPUk;!kJB+pe)SCuE4|u(hC-E;$;+S)I~5=xfGa%8dLe8b_>b!2`ciy{JoKn zj|rK>$Em==$iyVrB*?@M3k*ouFoFHnBnqY)ZQ&uek&jQXaVv7jaqxlFG)clu0INC6 zhs+0sDKsRY%4Infn1o~nn`A-G1G!kRNfzejCPh9bNZR-Tq5goW9tH@-0!k#EH$Y_f z4>0)$MD~FDcs(qj%y0ojTmca`;Ax|Y6V7aWh+tj?IbW#z3@ExAAA+;e8E{s52+6ir zA=&mSnAgM!=7A^$W=1|fE_MYL5XHo+0B>&yHp+4%czg(UD#+_XjfS8IWaJZUG=*e` z9!PfR(SZ0)2kaMccIeRnvvok(sEHBcKv1?5YH9=vwSv-YQzt|ymRW&;3u1%^Sepx& z^Z+GSp{9+3O6>4l{V_@PC;NW0YU}BV!U}Iop5^9{t%)lT4@`YgIUywK-9}5Gc z1c+di5P;*l|21YPTm_e9$B-rQ(Ne6sHE z`1l|m`6|@-66*3AlfU{LoDIcF;Qza7zsF0OmWnkjtlL3VpD4#G1Hcf?0>dUY& zFbFDw$EoLn$%VoStU|I-NkK)yrlmqnb3udMG6GB-3@nTivaB2&ptK;^bXTzHAv*&z zmjD+R7aIc;h~{Kqk^q%ijk2H!YJtPD&N5}=q8Y!>BU zR$!0-scn`7RT|BL4JU@no}NY{uF)+$;QgH>Z0TX)fK0e>O7Jm4W^*J!Q#t$`+>DT! z9|;9fP8K%M@)gL)phls1ei*fQdN5O$uRVXXFCgYXkC8h%`HwP@|$yqaqV% zl7g9^nV(s(Ed+wV%3N631X~-V!KMo}Y6>-Kg4Hz2LevPhHgK~;)^G^61#lzSA>5#G z7a>Fl-T-;74K_+E*!BP%n4HML{{j*8ps_~qaIRpx20I&MI)s%SwB`urmG%%gs{qcL z0djM@1DMQ#iFU{!%mt0&LCgh>&OuowVD;cyAJo5wiu$mE>}7_V0=KUt1}>HYXCZ7W zfs56^SuJo@51cgx&YA;fErGMvz*$@1tUYkn5jg7%oOK1xx&voDfwSJgSzq9+KQLC? zA9x~cgA2CHzy;eiAZb#tJ%ojw5j3Iz38VHLE_UeLWQPn)2_z0|c-fi3t5*cuZD8sD z4J$h{7Y8TI)^-Vm1rl&U1%#ji$TD~YK*r*Qx~B-Uvnq&k2sIXhC(BwVfO@-Z?BHH8 z8#|LwV<8g^9JxIF%BMW%WOhT}= z0VKu@&)|Zs4YG{va7n?|4DfuPLN2pHlO`)}S;1BtkU}JLETplU1DYFTmSkkZW`|&F z1>6J$Q4Um>G@v;~9Oh4u%RpGL)dWOIVK*D(JRDLWT|BTb5^QbY;D>QQK`7WdK^PWZ zpuiIBk>OVmH0Z1)OGsuRm=q_d=mby0!;5N8 z5ch=)EXW`#Kt_Ou^jZx-CAl&qCnU_UNrDvc^D`rC-Bvpc~BH+~kAlJe}0GeVzsfZWuH4sk_<~x37u#K$^N{k#32ZKWho{&Hh z0m7hAM@IToU33Y?#=Y+aXK-8+h)P8`d1<#xbb)NytcHV%={(#8- z0aHB;5Q;^JorPbphk;+P`wzch_YcsJELf)V1{cU7oi{*%2^?710WCu7X(3;K=gpd4Fp>oKxKW81bjF^7c>hXqrlDvPOE~Q zH=v^yx}rjm9x-TUzDEYGUKLZRDpaW|L@65^Kgbd6Yzj@jt^%yw>`b5}0%pSsxwZ{( z7QA$C+rh#n*dz!Vtgr>KL}5z0I#}629ep8ob`CCXZiuO%M9?S;QYXm?2`$0a1|@b5 zXlVX{TZv$R#xG>Sr7|ecdl&>;8$kMH!2t&m0);rt+71^u%LC4G;DY!H|s@7=frRw$U=lBunSc{$~tc#M3IdGmCm4klpH$;XelUY zQDo;0kR5PE;H69Ipnw3yI$~K9D1U>@1h0JU>JS7YP!q^Q5uz9*363NL1Juaz5Nwo% zdB1HBD?1ZEGrX<>O?E&k!nPy!?4Z()0i2?tYuDP2z>NagjwveGb_C>hFbQ(X0Yi3P zK7PR-P`+RhYEp!)iEBH8s=w_BNN3vt@N5gj0X;mt>`)7Oc#xdf!vU|MdpIK5#Xzxy zFc$7UI0Mxpq)>%MXWJ3M9#8~8-3?<0<1`tEfe>?gI6$UB48aibWf#HWS|ZE@MIG3w z5GxvG4cK`>rh(iI^A)Hm4`YMGA?|2x0J*7A78+QfsXl1HA{MKm1{WecA#s5e@8EcX zMKU;^1=~Oav8@J%?0g{ifYJ-t9R@;8pawjI1dkhlQaC7^w>ChU+ME%y_jZ$0u$8~Z+2mFO+hvY z%ywrNBF9f)y-=5d*`NY^D~LE7%PtP7*t&mU@gt!igQrYbkbz;AQ zR)Azn;9T&+BBAaj;Fe1F9gs25mdXl<$#+28Rv=B24G;>vxJsyd2ZXlKL$DKC zun4w=2(Yt)94pj#k_n=Xi=CN|U$FauU>j($QmYLwI}3#0Y9rVd!VhXybw3bnJSzz1 zOMmC)TY2Y=@f;}dXvK&raze7Uih?Mo065KqjQs*yOe@N%!OjU&tO#n^f~EKc!8U(^*#@!%R7QYSJGMqB zv2%f(1acZALIqo61Y0AJYk5dER{>>nkiHZUk)XuR4a!uxLX9tl8ef8p5NdqM$t2jC zBG{S$$*|I(DC<_?fLRQqK@JcDr%jMHSUm);ARt9c<3mUh)nfxLf_fYvxx)q8dF%0j z2wQ-=HQg%m?2zG6(9RA}^SfIGR{ub%9A-9t4$#1vC`WZO3@mK2!VJvpj2tZNOdLqV23(S`qyowv zu%T0a&>A{OMs@+0wLKpEf;}$$pk85*3n<%y*Fu9!X0Vh87r3l#oxlVR^41BUp-vvP3ogO*~ku`>&0GRd&9GcyTg%77}4KcHdp zoN1&Y;U{8T3UwcEqvC|70e1`6;05$5MObJlu4$5X`IC*9P9M!O6}nA=oS`*eu8m8f=HIreft{6lyGNSiqpdz`)YL zz%Ye@fq{*QfdRx13U)MPU}0cjWME`)f8mjKl+#Fm-=bUdmFC#)x6`dTn)hsfY}-$j zolDIRy^Egdz4Mij**%f@2C?5uv<=;_8d>SYE~)F?QywzWKZC*IK*y>&#rv8neOA-+ zey?4d8~Ib)NQ<*$WysUsE5gAKZ_eMm*7SYs+}F2+x*te?Xxgw%Pbfe!R$GTSm^Jwrx@5IzyNqQuvC!tKvBuSAPM0xGK4VkhUVphk1$UGodV6sz!AX0zz90a5KJ>MNPuZB1_3b5 z#GnDDxfm3{G!ugbnC41(@by zC;-z;3>{#ai=hEbGcn8n(_9P_z%&!X4lvEdumManF`NL?Tnq=mG!w%MFwMpA08BG6 z`~cHj3?INW69Y#e)PG=_i9rHPb1?{jX(k2@FwMoF0H&E3EWk7ug8`UkV(F3 zE`|kQnu%ctnC4>G0H&E3PJn4Hh67-liQxg5=3=-3rkNN%fN3s<7hsx+fguRu-ycxE z0F=)GrkNNNz%&sjXiNOI(b1_(eX(omMFwMo_0j8N462LSULj;&+ zVkiL9Tnrgtnu(zSOmi_*fN3U%31FIwp#w}aF)RSnTnsb7G!w%HFwMoV0!%Y8901c? z3_HLy6T<~C&Bbs6OfxY&0MlFyH^4L#!v`?U#qa`5Gchm(L;Vls3qbiCV48_R0Zel- zNPuZ31_Ln7#h?MEnHU_vG#7&fm}X)K0MlFy9$=b@ApuNtF+_lACWZnq&Bc%brkNNT zz%&;_1(;@Hm;k1^7&^c-6T<>9&BZVSOfxZT0MlFyE5I}p!vQeO#jpcRGcjBM(_9QE zz%&!X12E0Sa05&;F?;~iTnsP3G!p|u2-N>jz5tZZ0j8N46u>kWg9MmnVlV*HTnrju znu);yOmi_K>DKxq#s9RQ^xpmYM1&VbSdP`Uz2H$dqQ zC_Mp6&w$bkp!5nTy#Y$^fYJw`^a&_^0ZQM1(hs2Y3n={oO8CjdW ziJ<{Zb1_taX(omVV491e157h9ECAD73^Twq6T=2D&Bd?+OfxYY0MlFyJHRv(!v!$S z#c%>lGch~>(_9QUz%&!X2QbaW@B&OTF)&0y{SV~}K=~YCnu$RHOmi_vfN3TM12E0S zpaG_t7#zSf7lQ?uW?~2c(_9Q5V48^`0Zel-M1W}~h5|6n#gGA}nHU0m&!vZkP#V`X*Gcjxc(_9QIz%&yBLp0R=P`&_^&jF^H7!<%X7lQCC=3;07(@YFAz%&=b1Tf9SumVhTF)RSnObk1~G#A4LFwMkp0!(u;901cy z3^%|u7sCZG&BX8mOmi_j0MkqiKfp8>!v`?U#J~{`^*@+qVvqpSTnqwWnu$RJOmi_P zfN3TM3oy;aU;w6>7(Bo<7lQ+sW@3l{(_9PzV48^`159%X`pPG9TG~kR2fN zG|1#+p*n@0;2b$UdG(Jc#2!rgYK#~LTLE<0`G8<&h0wj5mI0%2hVK0LT!aX2$ zC$Q)RiG%F;{Hmf#7UUe9R$JxWFE*JFOcj(b_d8VkhuzIW`p!0tFuUEVJI+XVer7B4x|=@LFzk@ z;Z{^a8R&I zaHiO{=J~O&ywb_3l6w1FJiLA{GEvcLG%mtnLDeSO{3%4OB6(x(7&N zzK#%Azer+auz>mlEauF>ppcC48(1ugfk6XVEC8a{AeoUtf{}qi&p9Z>7bF(Sz~GUB zq!%O>#lR4NBo+n@tq63nC_*D!F z&MXXDKw%C^Uq&E3SDaZGL=a-2Y{2lsnFTo=nt;?5xUn!4f&329YX%Zy2w-8@z|X*- z2XPX(4Qc>#BZ#k3#PA@Qg<%FrPf~F)SbYHt!xK_(6{AMx}b?b28IeKUr++n zUgKoo3SukJG-G67$Yg}Hhpi#{CcxAQF*0x_F))DCXh78nSVPn*STizgfT}yD3-R$8 zC|^*R31qebNMArEBLmdG28=9>3@lCz3>Y*dJTT?a#bJDYHU|C_b_RYEHU@qp?gF^^ zFnO3gFg}dtVqxGiVPoJjVngWRXF-^QZmtLigGdSogGdNFgNO+mgNTs;LLbabbQ)&2 zBnN|J3I~H^2s?wM2^)i?ktkfRpeP4}XbC5SXbL-ns0kZ`sFC0UYcoc0o9T-XBSW$< zBZC1nE{+K^GF(LBL;V^c2=)sHD4YvGdO@`|w+JJHmIxz*J5(=&2qS}&2qQxRlCPoIP0Hkz+9>(Z=Z1DuL16x`n zB+kpiz-z+Ez-z=7z{ttOz-h!3fRSF=nHbm^g%Rmkl$Al$WEX=d;|>Nkkh{Tg15IbR z*x)c?W8gPoW#AX$2G^;eFolH?oJQ6U^EV+ekRO|%;nxJon-S1HAgFu*iGb1zh(^XB z`$1(jvKWm0!4aDd1_mBWkS+!W2PaH25B;|bCC0!m+k(%Yc)94Orer3;{R7?iey z(rQqe4@&>@fSCIRN?(K0hoCgb?I6qrA{ZDNrb6jyP#UrpgP{S!WnfqbbuWz1V=0*HF7wFmN%tq$cO5q{42b_I3^ObM-Mcf?P7q#}FUyTu}jDPXoD@y2zM;!ImL6 zH8(fEES13y#41iLVPN0@sf;f!NKMX6%S?{XNX$#gNiAYvP-TdZFD^-mFR3g@jnB+W z%a2bYPla6|&meA7mecB13#?QBht#1A_!ZT2X2$1A{0- zd{Jt0BKZDuGmy^Al9JS-Tn2LlJ3f`co*}+CH6uPPGY4cC=+12k29OidGSf?oQseUy zi;D8g;}eV0%Rv3c_)K^p!=zI4$})@c^Kw)3N*EYSAZA0NAwEAZwIZ`5z9cazCzXN0 z2IL;djqos;w9-6q3^6D%#HUuICYP3^!lWRYg{7Iv+3{dO z1~G>CWC$yr0p!8VJkX8ni3ORuxy8EWnR&X&MJ2jLko)0va}0G2bs@otrXnLXu>e_` zp@|uE<$6+SdU|S6Kv8Nj$b&L0{-q@ar6n$@Nu}w*B}JKe>ER3vX)HmBnZ>ED@Q7td zXL3(1@kuN$aV;v!FJfRYWdvVgkCreQ7!EM|q$ZZ3Cs+msK}OKk@g*1%0W5)~sYR6m zsYPk|MY)N2$*IoyrFkW(MGSHv8=WCZ40_YMX9|N7l4wXqQEFm}X9@$u2asrRWpPPr zZb)Wss$;QRW=<-I#h}FKl35IjE{J02dN$|8oSb5Y9Hbl;?2}ns;*pw|!f=@-s3gZZ zv7n^1DAgI7a&LjeeDd?NOAFkfG3=UG0$LaM5F`_pSyWP*m=l^;o|%`zz_5okG!K%I zQs5!z22PF)4Arc`sU(jl2}wyTHu+NmLJa0$?RDS^?iPkTWTW6Rj|0L1F1&7 zdp?|jp_?^0CpEQzVKZ}RUQsF}aXRND78i#zFoXuX2Ej^*9tP+9ki_C_-_%?;Q0CHR zaL#uwN=+A|3<{Ubwt}QdVkm z2?GNcMBXK}BsIAtD76G+Ap?UTL=+J%82W@6;^V%7@XyP(F;7fbwCq7?cmAMWK8cEe++vXelTkMvFlCFj^AIhtYr1A^ul| zioaVjLv}aVRR;x52Lf7d>EY#<-_P4C?7`WLisQ{56Xwp z`A|NLE`ai3bRm=vql=(?7+nnI!{`zyA4Zo#`7pW+%7@YAP(F;VfbwB9=H<-_O@C?7^^L-{&TS{F*|L1}#`Z2+YWp|lZ{HiptB zP}&qqn?Y%FC~X0yEupj(l(vS_Hc;9YO4~tcdnoMyr5&NP6O?v_(k@Wi6-v87X?G~? z0i`{mv=@{Pg3_^2IuJ_7K*Ao2=c5dAZt`~)ap!5kvr0OhZSx&uZpgz{l@ACwQHXF~ZfdI^*dqvu2U zFnS)852F`A`7pWz%7@XNP(F-a3FX7+rBFVMUJT{K=tWRIjGhYR!{}L1K8&6L<-_Rd zP(FB0e%7@W&p?nxU2g--h)1Z79 zJsZl0(JP>Q7`+_IhtaE`d>Fk9%7@WyP(FJCqNjyP!CcHuI z+aDkTfzQS&TuQt0|G&|q`?@o=Asenh>Tg5MgVEcdd>FkQ%7@WApnMp;6Uv9tyP$j+ zy&KAh(R-kL7`+$Dhtd0>d>FkS%7@VhpnMp85Xy(qhoF2IeHhAz(MODNd%7@X{pnMp82g--hccFY3eGkfq(f6Tz7`+wBhtX%Cd>DNe%7@YCpnMp89?FN& z7odC?eG$rs(U+in7=0behtW5nd>DNb%7@XnpnMp86v{sarH@1D6Hxjjls*NePebVk zX!JuUA4Wfd@?rE-C?7^YhVo(bGbkTMKY{XL^j9b!Mt_6yVf0TZA4dO%@?rE}C?7_D zhw@?c4=5i-|AO*i^dBf6Mn8x0Vf0HVA4b1|@?rFAC?7_@f%0MWJ18GUzlZW+^am&( zMt_9zVe}^`A4Y$H@?rD~C?7_@h4NwaXDA;=Gr+cmLTN@cniap1ot3y^3RLNq#^{kwbv1V|;jMa3y3M3q0-#8K5k32rDjj2+zzj zHgW(jID+h$b#TBX4l^H{eIVPMf=h6k3DS#ApR;304t#jX!7;?g!GS3M_$C$=XC&r; z#^yZSbMliCbIA7;Hg}vOgwN&poCdZ6oBQDA6LcwVxQ{utHl@7%vDGs33@YwS+eC(5eI~MTwR1d8y^`IjMQ+B^gLs!2Tyh*a$N) z#0WDmnAo$RtWN^1Q-ZBS0?}V|7#J#SSr|Yxr!E6Sk1Y!Wi00R2V3=de0$zvIrpv%^ z!NHMBZG)N3&R^OMuv&pj0_j-SQw^oGcs)C zW@N~)V_`VJ&B*YYn~~vw9Sg%7Zbk+^9!3Tkdlm)(9!3TW9!7=0Yoq2V`N~kXJJ^u$H;JtkCCClj)mb1A0vYhKO=*RJqv>fKO=)G zKO;kd9Seg7KO;i`KO@5iI~FkgiJy^S1xP(VBSVP*Bf|$f7BJl^z{t>H$HLGdz{s#f zfRRDRo&`*A6<}nj0J&3ukwIFJks$%(20=!KT0uqz4?7lyJA#Z1Mna4XHufwG4nm9! z*+PsA0ro5mIYNvKdxRJn7#vu@^d(_Nh6sBWhASXigppy6JqtsG2qQzcC?f-h0}I0j zQAUQhqKpg{4lE2GL>U=a#26XgIIu8G5o2UHE5^vs;K0IgL5z`sMVyi0hyx3lmK0}X z*yF&$AS2Gm;3Ce*aL0iKOh<|{GCXl$VTb|Ai!(B;0J%Y&k>QOvBf}X77BCH32zkYU zg#ko+N-#1^aA0BZkzi!FF2TsKz=4I~h6E!+fg~eCgaZqho+8P}&;fFfBqPIKNk)bl z4lE1@BpDfgNis47fZQO($Y3nR$l&3?!jL1y$Z%bXk%7UHh2e%2BSVWcBf}R57BIbB z8gw!Q3&Ry@Muzv&j0^&xwJb7>3|_K~3>uCs3_h}q3~jQE3=)nk3{zwo8J@{9GAKB* zF#M5aWC)jIWUz2#VTh1pWSAny$lwA}Bge>aL5`6jz>x(^7b-9^#5l4rY%ynK_+ZY+ zP~yk}Ud!TQ!N@Sdk%a-Yj%0xaBf}C$76#DTl}{Fo3^kxNk(P`MU6zatGaOkMdMp_k z&RH@ttO1#6$;cpN#mLa&$ig6E#mHb{#mKP3kp)bLSTQmj0I9KJWVmF-$WY+O0$wWy zTJtr149F-PxXREH2gG4uVE8bX zg&_kJiBNvTVitxONcul4V`0#6f=V(lFi5;)VOXJx;2+>)Wmo}9L{Om&c~*uDP~w2{ zFDSDzv_RP)Dnf-7)qHhUhFYZf>kRO7=jDJhnN{e&Nf;`3@5p z9A=P+ZWP8|FV0tZ7Lm=#;Ifm61pPNo|7Vs+e#81FzxdqVcOTgp5}5`EIv(|U=Xc%Y zp1tp87QbV)eQ#%<&wpV5`uBSmJb(Xu{@!<$rVQ&C1k^?mEkmGe&DMF<_l=I-cs>M2#=!7>uM|T#1BWotsQPC;!-4ltc^M9|5Qq9+@2cVB2|QjoubRn}+-RQg zwc-zh^8v^5Us)5cfC>RmS3j3^P6?o8ts0>E15{^#@-=t|0|NsCsL}wb17T3v0KyCm z3{Fl?3?JWrVEFd!8^ezuXaj*DwWD}61V%$(*o6Red-;&|7Ym7inf8E@XaI2w(aIUg zR?kEPU}Qv?PlR%&QT6ykX*7IB!v{G8hEsYVvdAL4yc#thYY31Ro)BF$B1x=%kw!2E zN3#R89^(Ih$X;M<^x$yi(02u{a0c~LK}%3TvpSHS|DdraB>#f?s345iPeoEO${Y=W z(GVEMAwZ9QD&^H9)*2fs2r?bY#7aTrkz0$%Y)Hq9kr7!8nLR2$G{O&S)Pn^f?gulm z5`#e=rEx%hG<0Ni+n8;aVN|e3JUVHprdynBatF&`F z#lOV-{TCzGu>L$~`N7-2rR$T=u^kW{G>)ajqk~y5wn$)juwyf00c(Q+Be7`1<^RkK z|Mb;~U#?Kc_h+LyY9fd5KD^G`E^qE?J=MHL=QckYtzm@Y|KGlS8^xnxFq#Iwef#g^8dv|Izrzmj=+&3n&c@WsL40e0~SXp{pOt zeh0Z7-9I2d;=}0bL1qkPjP4(Neh0~+s~^gK2e}>HKOjHi!|3WkW(;MF?jL-92g#wU zAIg3QxgFg6=;}dc3}uY&AAEiX$)T$s%6Op1HKOjHi!|3WkW(;MF?jL-9 z2g#wUAIg3QxgFg6=;}dc3}uY&AAEiX$)T$s%6Op1HKOjHi!|3WkW(;MF z?jL-92g#wUAIg3QxgFg6=;}dc3}uY&AAEiX$)T$s%6Op1< zWsL40e0~SXp{pNme2^dU;o;_AbpPPsS3lhNAV1>6!_B|w{=w&WkQ}=D;l>B~5g#6I{zdl>KEH$H(A5t& zKFE*w@Nn}lx_|KbeN+zr+PKm184aIdmo}{MF(eNJ)e^S#7vii~VGn#&o z(*vpO(eyK#en?F-$m&Pa&uIEVP7kEAN7K(}`XM#VAgdouKcndfIX#fdCN=#as~>D^ zV#ZGfo12l{GwS|F9J80B=l0sm#4u;ghq_#CFRgWI-l$uAX zeq8pGI(|W_dYC&$?T4g0SUAAKh1BpQRXxlen7uF>CQhn(q^gJ61G5)K!^BB7k5u(A zdtmm$XqY&u=8>u%W)I9>7!4CA)jU$w!|Z|C3!`D;q?$*ndYC;hdto$8oK*8jRS&ZV zW-p9}iIZv`sp?_&!0d(5FmY1NBUL@j9+>|UYI>Fdto$8oL)4{UKmX;dtvs#?1j-VaeC1( zdto%a?1k9_vv;J^Bz4w?p<>AR0feNd_aHX@{|_3c01Zok#wuXr6b>xZcL_DpIV|sx zO2h01=_9AU8r2W!s||IJE%mVTHyPx8HvyuTk%1Fz1S10n z!&_zs21W)00}#o2ki(G5;K`83kj9YDz`$?`tj2)Bgu#Hpk^w{~F@W~-S}^c1FfuqZ z7H2!jHH4?`wH5Tkk~d@*liI11TYjal%*CG zXXfYGsvGJVs4JxACFiGP=B3-JhlaT6TBs`&mn7z;BF=4K`re7RfN91`V0{V-HpQvQrA3(~l~BHdf=y9sVQFe{ zNoq4v3A1R8EZGJ z-Ldw-T8ni7>mt@M1h6oGO8f;2RxG%%;KqUr3pJJ-EVo$hu-s#L!19RY3ClB<7c8$> z-mtu5`Gn;&mM>VoVLd|v3xf&+1B1eXhy@J`J}gLBcwr&OB8No{iykbpSRApqVeyK^ KgDkX$opS(86P$zq literal 0 HcmV?d00001 diff --git a/thirdparty/alphavss/runtimes/win-x64/Ijwhost.dll b/thirdparty/alphavss/runtimes/win-x64/Ijwhost.dll new file mode 100644 index 0000000000000000000000000000000000000000..0909a28a449cfcd8ab5065fc814fc9dc9eb13737 GIT binary patch literal 342392 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

    private static readonly string LOGTAG = Logging.Log.LogTagFromType(); - public const string VOLUME_HASH = "SHA256"; - /// /// Class to represent hash failures /// @@ -412,14 +410,14 @@ namespace Duplicati.Library.Main public static string CalculateFileHash(string filename) { using (System.IO.FileStream fs = System.IO.File.OpenRead(filename)) - using (var hasher = HashAlgorithm.Create(VOLUME_HASH)) + using (var hasher = VolumeHashFactory.CreateHasher()) return Convert.ToBase64String(hasher.ComputeHash(fs)); } /// Calculate file hash directly on stream object (for piping) public static string CalculateFileHash(System.IO.Stream stream) { - using (var hasher = HashAlgorithm.Create(VOLUME_HASH)) + using (var hasher = VolumeHashFactory.CreateHasher()) return Convert.ToBase64String(hasher.ComputeHash(stream)); } @@ -428,9 +426,8 @@ namespace Duplicati.Library.Main /// with a callback to retrieve the hash when done. ///
    public static System.Security.Cryptography.CryptoStream GetFileHasherStream - (System.IO.Stream stream, System.Security.Cryptography.CryptoStreamMode mode, out Func getHash) + (System.IO.Stream stream, System.Security.Cryptography.CryptoStreamMode mode, HashAlgorithm hasher, out Func getHash) { - var hasher = HashAlgorithm.Create(VOLUME_HASH); System.Security.Cryptography.CryptoStream retHasherStream = new System.Security.Cryptography.CryptoStream(stream, hasher, mode); getHash = () => @@ -439,7 +436,6 @@ namespace Duplicati.Library.Main && !retHasherStream.HasFlushedFinalBlock) retHasherStream.FlushFinalBlock(); string retHash = Convert.ToBase64String(hasher.Hash); - hasher.Dispose(); return retHash; }; return retHasherStream; @@ -902,10 +898,10 @@ namespace Duplicati.Library.Main dlTarget = new Library.Utility.TempFile(); if (m_backend is Library.Interface.IStreamingBackend && !m_options.DisableStreamingTransfers) { - Func getFileHash; // extended to use stacked streams using (var fs = System.IO.File.OpenWrite(dlTarget)) - using (var hs = GetFileHasherStream(fs, System.Security.Cryptography.CryptoStreamMode.Write, out getFileHash)) + using (var hasher = VolumeHashFactory.CreateHasher()) + using (var hs = GetFileHasherStream(fs, System.Security.Cryptography.CryptoStreamMode.Write, hasher, out var getFileHash)) using (var ss = new ShaderStream(hs, true)) { using (var ts = new ThrottledStream(ss, 0, m_options.MaxDownloadPrSecond)) diff --git a/Duplicati/Library/Main/Operation/Common/BackendHandler.cs b/Duplicati/Library/Main/Operation/Common/BackendHandler.cs index 84fe8ff43..556c7a290 100644 --- a/Duplicati/Library/Main/Operation/Common/BackendHandler.cs +++ b/Duplicati/Library/Main/Operation/Common/BackendHandler.cs @@ -33,8 +33,6 @@ namespace Duplicati.Library.Main.Operation.Common ///
    private static readonly string LOGTAG = Logging.Log.LogTagFromType(); - public const string VOLUME_HASH = "SHA256"; - /// /// Data storage for an ongoing backend operation /// @@ -112,7 +110,7 @@ namespace Duplicati.Library.Main.Operation.Common public static string CalculateFileHash(string filename) { using (System.IO.FileStream fs = System.IO.File.OpenRead(filename)) - using (var hasher = HashAlgorithm.Create(VOLUME_HASH)) + using (var hasher = VolumeHashFactory.CreateHasher()) return Convert.ToBase64String(hasher.ComputeHash(fs)); } diff --git a/Duplicati/Library/Main/VolumeHashFactory.cs b/Duplicati/Library/Main/VolumeHashFactory.cs new file mode 100644 index 000000000..470bd31c7 --- /dev/null +++ b/Duplicati/Library/Main/VolumeHashFactory.cs @@ -0,0 +1,12 @@ +using System.Security.Cryptography; + +namespace Duplicati.Library.Main +{ + static class VolumeHashFactory + { + public static HashAlgorithm CreateHasher() + { + return SHA256.Create(); + } + } +} From ecb0249259818d84d64c4a61e3707991963b2749 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 4 Apr 2021 11:17:13 -0700 Subject: [PATCH 157/253] dotnet no longer provides a method for a string to hashalgorithm * Also fix up not diposing of hashers --- .../CommandLine/RecoveryTool/Recompress.cs | 3 +- Duplicati/CommandLine/RecoveryTool/Restore.cs | 20 +- Duplicati/Library/Backend/Backblaze/B2.cs | 21 ++- .../Library/Backend/CloudFiles/CloudFiles.cs | 7 +- .../Library/Backend/Jottacloud/Jottacloud.cs | 4 +- Duplicati/Library/Main/BackendManager.cs | 2 +- .../Main/Database/LocalRepairDatabase.cs | 14 +- .../Operation/Backup/StreamBlockSplitter.cs | 14 +- .../Operation/Common/IndexVolumeCreator.cs | 175 +++++++++--------- .../Main/Operation/RecreateDatabaseHandler.cs | 23 +-- .../Library/Main/Operation/RepairHandler.cs | 58 +++--- .../Library/Main/Operation/RestoreHandler.cs | 32 ++-- .../Library/Main/Operation/TestHandler.cs | 11 +- Duplicati/Library/Main/Options.cs | 25 +-- Duplicati/Library/Main/Utility.cs | 3 +- .../Library/Utility/HashCalculatingStream.cs | 16 -- Duplicati/Library/Utility/HashFactory.cs | 63 +++++++ Duplicati/Library/Utility/Utility.cs | 15 -- .../Server/WebServer/RESTMethods/Captcha.cs | 4 +- 19 files changed, 254 insertions(+), 256 deletions(-) create mode 100644 Duplicati/Library/Utility/HashFactory.cs diff --git a/Duplicati/CommandLine/RecoveryTool/Recompress.cs b/Duplicati/CommandLine/RecoveryTool/Recompress.cs index c3b25a056..481f31556 100644 --- a/Duplicati/CommandLine/RecoveryTool/Recompress.cs +++ b/Duplicati/CommandLine/RecoveryTool/Recompress.cs @@ -208,8 +208,7 @@ namespace Duplicati.CommandLine.RecoveryTool textJSON = sourceStreamReader.ReadToEnd(); JToken token = JObject.Parse(textJSON); var fileInfoBlocks = new FileInfo(Path.Combine(targetfolder, cmfileNew.Replace("vol/", ""))); - var filehasher = HashAlgorithm.Create(m_Options.FileHashAlgorithm); - + using (var filehasher = HashFactory.CreateHasher(m_Options.FileHashAlgorithm)) using (var fileStream = fileInfoBlocks.Open(FileMode.Open)) { fileStream.Position = 0; diff --git a/Duplicati/CommandLine/RecoveryTool/Restore.cs b/Duplicati/CommandLine/RecoveryTool/Restore.cs index bd18f59a2..b93bf69ba 100644 --- a/Duplicati/CommandLine/RecoveryTool/Restore.cs +++ b/Duplicati/CommandLine/RecoveryTool/Restore.cs @@ -18,10 +18,11 @@ using System; using System.IO; using System.Linq; using System.Collections.Generic; -using Duplicati.Library.Common.IO; -using Duplicati.Library.Common; - +using Duplicati.Library.Common.IO; +using Duplicati.Library.Common; + using System.Security.Cryptography; +using Duplicati.Library.Utility; namespace Duplicati.CommandLine.RecoveryTool { @@ -93,18 +94,19 @@ namespace Duplicati.CommandLine.RecoveryTool return 100; } - var blockhasher = string.IsNullOrWhiteSpace(blockhash_str) ? null : HashAlgorithm.Create(blockhash_str); - var filehasher = string.IsNullOrWhiteSpace(filehash_str) ? null : HashAlgorithm.Create(filehash_str); - - if (blockhasher == null) + + if (string.IsNullOrWhiteSpace(blockhash_str)) throw new Duplicati.Library.Interface.UserInformationException(string.Format("Block hash algorithm not valid: {0}", blockhash_str), "BlockHashAlgorithmNotSupported"); - if (filehasher == null) + if (string.IsNullOrWhiteSpace(filehash_str)) throw new Duplicati.Library.Interface.UserInformationException(string.Format("File hash algorithm not valid: {0}", filehash_str), "FileHashAlgorithmNotSupported"); - var hashesprblock = blocksize / (blockhasher.HashSize / 8); + using (var blockhasher = HashFactory.CreateHasher(blockhash_str)) + using (var filehasher = HashFactory.CreateHasher(filehash_str)) using (var mru = new CompressedFileMRUCache(options)) { + var hashesprblock = blocksize / (blockhasher.HashSize / 8); + Console.WriteLine("Building lookup table for file hashes"); using (HashLookupHelper lookup = new HashLookupHelper(ixfile, mru, (int) blocksize, blockhasher.HashSize / 8)) { diff --git a/Duplicati/Library/Backend/Backblaze/B2.cs b/Duplicati/Library/Backend/Backblaze/B2.cs index 50fb72659..d2dfc0608 100644 --- a/Duplicati/Library/Backend/Backblaze/B2.cs +++ b/Duplicati/Library/Backend/Backblaze/B2.cs @@ -31,10 +31,10 @@ namespace Duplicati.Library.Backend.Backblaze public class B2 : IBackend, IStreamingBackend { private const string B2_ID_OPTION = "b2-accountid"; - private const string B2_KEY_OPTION = "b2-applicationkey"; - private const string B2_PAGESIZE_OPTION = "b2-page-size"; + private const string B2_KEY_OPTION = "b2-applicationkey"; + private const string B2_PAGESIZE_OPTION = "b2-page-size"; private const string B2_DOWNLOAD_URL_OPTION = "b2-download-url"; - + private const string B2_CREATE_BUCKET_TYPE_OPTION = "b2-create-bucket-type"; private const string DEFAULT_BUCKET_TYPE = "allPrivate"; @@ -96,9 +96,9 @@ namespace Duplicati.Library.Backend.Backblaze if (string.IsNullOrEmpty(accountKey)) throw new UserInformationException(Strings.B2.NoB2KeyError, "B2MissingKey"); - m_helper = new B2AuthHelper(accountId, accountKey); - - m_pagesize = DEFAULT_PAGE_SIZE; + m_helper = new B2AuthHelper(accountId, accountKey); + + m_pagesize = DEFAULT_PAGE_SIZE; if (options.ContainsKey(B2_PAGESIZE_OPTION)) { int.TryParse(options[B2_PAGESIZE_OPTION], out m_pagesize); @@ -183,8 +183,8 @@ namespace Duplicati.Library.Backend.Backblaze new CommandLineArgument(B2_KEY_OPTION, CommandLineArgument.ArgumentType.Password, Strings.B2.B2applicationkeyDescriptionShort, Strings.B2.B2applicationkeyDescriptionLong, null, new string[] {"auth-username"}, null), new CommandLineArgument("auth-password", CommandLineArgument.ArgumentType.Password, Strings.B2.AuthPasswordDescriptionShort, Strings.B2.AuthPasswordDescriptionLong), new CommandLineArgument("auth-username", CommandLineArgument.ArgumentType.String, Strings.B2.AuthUsernameDescriptionShort, Strings.B2.AuthUsernameDescriptionLong), - new CommandLineArgument(B2_CREATE_BUCKET_TYPE_OPTION, CommandLineArgument.ArgumentType.String, Strings.B2.B2createbuckettypeDescriptionShort, Strings.B2.B2createbuckettypeDescriptionLong, DEFAULT_BUCKET_TYPE), - new CommandLineArgument(B2_PAGESIZE_OPTION, CommandLineArgument.ArgumentType.Integer, Strings.B2.B2pagesizeDescriptionShort, Strings.B2.B2pagesizeDescriptionLong, DEFAULT_PAGE_SIZE.ToString()), + new CommandLineArgument(B2_CREATE_BUCKET_TYPE_OPTION, CommandLineArgument.ArgumentType.String, Strings.B2.B2createbuckettypeDescriptionShort, Strings.B2.B2createbuckettypeDescriptionLong, DEFAULT_BUCKET_TYPE), + new CommandLineArgument(B2_PAGESIZE_OPTION, CommandLineArgument.ArgumentType.Integer, Strings.B2.B2pagesizeDescriptionShort, Strings.B2.B2pagesizeDescriptionLong, DEFAULT_PAGE_SIZE.ToString()), new CommandLineArgument(B2_DOWNLOAD_URL_OPTION, CommandLineArgument.ArgumentType.String, Strings.B2.B2downloadurlDescriptionShort, Strings.B2.B2downloadurlDescriptionLong), }); @@ -209,7 +209,7 @@ namespace Duplicati.Library.Backend.Backblaze var p = measure.Position; // Compute the hash - using(var hashalg = HashAlgorithm.Create("sha1")) + using(var hashalg = SHA1.Create()) sha1 = Library.Utility.Utility.ByteArrayAsHexString(hashalg.ComputeHash(measure)); measure.Position = p; @@ -219,7 +219,8 @@ namespace Duplicati.Library.Backend.Backblaze // No seeking possible, use a temp file tmp = new TempFile(); using(var sr = System.IO.File.OpenWrite(tmp)) - using(var hc = new HashCalculatingStream(measure, "sha1")) + using(var hasher = HashFactory.CreateHasher("SHA1")) + using(var hc = new HashCalculatingStream(measure, hasher)) { await Utility.Utility.CopyStreamAsync(hc, sr, cancelToken).ConfigureAwait(false); sha1 = hc.GetFinalHashString(); diff --git a/Duplicati/Library/Backend/CloudFiles/CloudFiles.cs b/Duplicati/Library/Backend/CloudFiles/CloudFiles.cs index ece4510e7..50d181e91 100644 --- a/Duplicati/Library/Backend/CloudFiles/CloudFiles.cs +++ b/Duplicati/Library/Backend/CloudFiles/CloudFiles.cs @@ -22,6 +22,7 @@ using Duplicati.Library.Interface; using System; using System.Collections.Generic; using System.Net; +using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; @@ -299,7 +300,8 @@ namespace Duplicati.Library.Backend var areq = new Utility.AsyncHttpRequest(req); using (var resp = areq.GetResponse()) using (var s = areq.GetResponseStream()) - using (var mds = new Utility.MD5CalculatingStream(s)) + using (var hasher = MD5.Create()) + using (var mds = new Utility.HashCalculatingStream(s, hasher)) { string md5Hash = resp.Headers["ETag"]; Utility.Utility.CopyStream(mds, stream, true, m_copybuffer); @@ -351,7 +353,8 @@ namespace Duplicati.Library.Backend Utility.AsyncHttpRequest areq = new Utility.AsyncHttpRequest(req); using (System.IO.Stream s = areq.GetRequestStream(streamLen)) - using (var mds = new Utility.MD5CalculatingStream(s)) + using (var hasher = MD5.Create()) + using (var mds = new Utility.HashCalculatingStream(s, hasher)) { await Utility.Utility.CopyStreamAsync(stream, mds, tryRewindSource: true, cancelToken: cancelToken); fileHash = mds.GetFinalHashString(); diff --git a/Duplicati/Library/Backend/Jottacloud/Jottacloud.cs b/Duplicati/Library/Backend/Jottacloud/Jottacloud.cs index 95dc2762f..127a8180d 100644 --- a/Duplicati/Library/Backend/Jottacloud/Jottacloud.cs +++ b/Duplicati/Library/Backend/Jottacloud/Jottacloud.cs @@ -23,6 +23,7 @@ using Duplicati.Library.Localization.Short; using System; using System.Collections.Generic; using System.Net; +using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; namespace Duplicati.Library.Backend @@ -496,7 +497,8 @@ namespace Duplicati.Library.Backend // No seeking possible, use a temp file tmpFile = new Duplicati.Library.Utility.TempFile(); using (var os = System.IO.File.OpenWrite(tmpFile)) - using (var md5 = new Utility.MD5CalculatingStream(baseStream)) + using(var hasher = MD5.Create()) + using (var md5 = new Utility.HashCalculatingStream(baseStream, hasher)) { await Utility.Utility.CopyStreamAsync(md5, os, true, cancelToken, m_copybuffer); md5Hash = md5.GetFinalHashString(); diff --git a/Duplicati/Library/Main/BackendManager.cs b/Duplicati/Library/Main/BackendManager.cs index bb32e8362..cac424130 100644 --- a/Duplicati/Library/Main/BackendManager.cs +++ b/Duplicati/Library/Main/BackendManager.cs @@ -653,7 +653,7 @@ namespace Duplicati.Library.Main IndexVolumeWriter wr = null; try { - var hashsize = HashAlgorithm.Create(m_options.BlockHashAlgorithm).HashSize / 8; + var hashsize = HashFactory.HashSizeBytes(m_options.BlockHashAlgorithm); wr = new IndexVolumeWriter(m_options); using (var rd = new IndexVolumeReader(p.CompressionModule, item.Indexfile.Item2.LocalFilename, m_options, hashsize)) wr.CopyFrom(rd, x => x == oldname ? newname : x); diff --git a/Duplicati/Library/Main/Database/LocalRepairDatabase.cs b/Duplicati/Library/Main/Database/LocalRepairDatabase.cs index 4cca008bd..8aa4d3629 100644 --- a/Duplicati/Library/Main/Database/LocalRepairDatabase.cs +++ b/Duplicati/Library/Main/Database/LocalRepairDatabase.cs @@ -19,6 +19,7 @@ using System; using System.Linq; using System.Collections.Generic; using System.Security.Cryptography; +using Duplicati.Library.Utility; namespace Duplicati.Library.Main.Database { @@ -340,18 +341,17 @@ namespace Duplicati.Library.Main.Database public void FixMissingBlocklistHashes(string blockhashalgorithm, long blocksize) { - var blockhasher = HashAlgorithm.Create(blockhashalgorithm); - var hashsize = blockhasher.HashSize / 8; var blocklistbuffer = new byte[blocksize]; - blockhasher.Initialize(); - - var sql = string.Format(@"SELECT * FROM (SELECT ""N"".""BlocksetID"", ((""N"".""BlockCount"" + {0} - 1) / {0}) AS ""BlocklistHashCountExpected"", CASE WHEN ""G"".""BlocklistHashCount"" IS NULL THEN 0 ELSE ""G"".""BlocklistHashCount"" END AS ""BlocklistHashCountActual"" FROM (SELECT ""BlocksetID"", COUNT(*) AS ""BlockCount"" FROM ""BlocksetEntry"" GROUP BY ""BlocksetID"") ""N"" LEFT OUTER JOIN (SELECT ""BlocksetID"", COUNT(*) AS ""BlocklistHashCount"" FROM ""BlocklistHash"" GROUP BY ""BlocksetID"") ""G"" ON ""N"".""BlocksetID"" = ""G"".""BlocksetID"" WHERE ""N"".""BlockCount"" > 1) WHERE ""BlocklistHashCountExpected"" != ""BlocklistHashCountActual""", blocksize / hashsize); - var countsql = @"SELECT COUNT(*) FROM (" + sql + @")"; - using(var tr = m_connection.BeginTransaction()) using(var cmd = m_connection.CreateCommand(tr)) + using(var blockhasher = HashFactory.CreateHasher(blockhashalgorithm)) { + var hashsize = blockhasher.HashSize / 8; + + var sql = string.Format(@"SELECT * FROM (SELECT ""N"".""BlocksetID"", ((""N"".""BlockCount"" + {0} - 1) / {0}) AS ""BlocklistHashCountExpected"", CASE WHEN ""G"".""BlocklistHashCount"" IS NULL THEN 0 ELSE ""G"".""BlocklistHashCount"" END AS ""BlocklistHashCountActual"" FROM (SELECT ""BlocksetID"", COUNT(*) AS ""BlockCount"" FROM ""BlocksetEntry"" GROUP BY ""BlocksetID"") ""N"" LEFT OUTER JOIN (SELECT ""BlocksetID"", COUNT(*) AS ""BlocklistHashCount"" FROM ""BlocklistHash"" GROUP BY ""BlocksetID"") ""G"" ON ""N"".""BlocksetID"" = ""G"".""BlocksetID"" WHERE ""N"".""BlockCount"" > 1) WHERE ""BlocklistHashCountExpected"" != ""BlocklistHashCountActual""", blocksize / hashsize); + var countsql = @"SELECT COUNT(*) FROM (" + sql + @")"; + var itemswithnoblocklisthash = cmd.ExecuteScalarInt64(countsql, 0); if (itemswithnoblocklisthash != 0) { diff --git a/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs b/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs index c85a2c5a8..b6296731c 100644 --- a/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs +++ b/Duplicati/Library/Main/Operation/Backup/StreamBlockSplitter.cs @@ -48,21 +48,11 @@ namespace Duplicati.Library.Main.Operation.Backup async self => { var blocksize = options.Blocksize; - var filehasher = HashAlgorithm.Create(options.FileHashAlgorithm); - var blockhasher = HashAlgorithm.Create(options.BlockHashAlgorithm); var emptymetadata = Utility.WrapMetadata(new Dictionary(), options); var maxmetadatasize = (options.Blocksize / (long) options.BlockhashSize) * options.Blocksize; - if (blockhasher == null) - throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); - if (filehasher == null) - throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(options.FileHashAlgorithm), "FileHashAlgorithmNotSupported"); - - if (!blockhasher.CanReuseTransform) - throw new UserInformationException(Strings.Common.InvalidCryptoSystem(options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); - if (!filehasher.CanReuseTransform) - throw new UserInformationException(Strings.Common.InvalidCryptoSystem(options.FileHashAlgorithm), "FileHashAlgorithmNotSupported"); - + using(var filehasher = HashFactory.CreateHasher(options.FileHashAlgorithm)) + using(var blockhasher = HashFactory.CreateHasher(options.BlockHashAlgorithm)) using (var empty_metadata_stream = new MemoryStream(emptymetadata.Blob)) { while (await taskreader.ProgressAsync) diff --git a/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs b/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs index 5ae480594..3a13f85ce 100644 --- a/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs +++ b/Duplicati/Library/Main/Operation/Common/IndexVolumeCreator.cs @@ -1,24 +1,25 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using System.IO; using System.Security.Cryptography; using System.Threading.Tasks; using Duplicati.Library.Main.Volumes; +using Duplicati.Library.Utility; namespace Duplicati.Library.Main.Operation.Common { @@ -36,21 +37,21 @@ namespace Duplicati.Library.Main.Operation.Common /// The blocklist hashes /// private readonly Library.Utility.FileBackedStringList blockListHashes = new Library.Utility.FileBackedStringList(); - - /// - /// Cached copy of the blocklist hash size - /// - private readonly int m_blockhashsize; - - /// - /// Initializes a new instance of the - /// class. - /// - /// The options used in this run. - public TemporaryIndexVolume(Options options) - { + + /// + /// Cached copy of the blocklist hash size + /// + private readonly int m_blockhashsize; + + /// + /// Initializes a new instance of the + /// class. + /// + /// The options used in this run. + public TemporaryIndexVolume(Options options) + { m_blockhashsize = options.BlockhashSize; - } + } /// /// Creates an index volume with the temporary contents @@ -60,71 +61,71 @@ namespace Duplicati.Library.Main.Operation.Common /// Hash of the volume /// Size of the volume public async Task CreateVolume(string blockfilename, string blockHash, long blockSize, Options options, DatabaseCommon database) - { + { var w = new IndexVolumeWriter(options); w.VolumeID = await database.RegisterRemoteVolumeAsync(w.RemoteFilename, RemoteVolumeType.Index, RemoteVolumeState.Temporary); - + w.StartVolume(blockfilename); - foreach (var n in blockHashes) - { + foreach (var n in blockHashes) + { var args = n.Split(new char[] { ':' }, 2); - w.AddBlock(args[1], long.Parse(args[0])); + w.AddBlock(args[1], long.Parse(args[0])); } - w.FinishVolume(blockHash, blockSize); + w.FinishVolume(blockHash, blockSize); - var enumerator = blockListHashes.GetEnumerator(); + var enumerator = blockListHashes.GetEnumerator(); while(enumerator.MoveNext()) { - var hash = enumerator.Current; - enumerator.MoveNext(); - var data = Convert.FromBase64String(enumerator.Current); - + var hash = enumerator.Current; + enumerator.MoveNext(); + var data = Convert.FromBase64String(enumerator.Current); + w.WriteBlocklist(hash, data, 0, data.Length); - } - - w.Close(); - + } + + w.Close(); + return w; - } - - /// - /// Copies all entries from this temporary instance to the target - /// - /// The target volume. - /// Only copies the blocklist hashes - public void CopyTo(TemporaryIndexVolume target, bool onlyBlocklistHashes) - { - if (!onlyBlocklistHashes) - foreach (var n in blockHashes) - target.blockHashes.Add(n); - - foreach (var n in blockListHashes) - target.blockListHashes.Add(n); - } - - /// - /// Adds a single block hash to the index - /// - /// The hash of the block. - /// The size of the block. - public void AddBlock(string hash, long size) - { - blockHashes.Add(size.ToString() + ":" + hash); - } - - /// - /// Adds a block list hash to the index - /// - /// The hash of the block to add. - /// The size of the block. - /// The block contents. - public void AddBlockListHash(string hash, long size, byte[] data) - { - if (size % m_blockhashsize != 0) - throw new ArgumentException($"The {nameof(size)} value is {size}, but it must be evenly divisible by the blockhash size ({m_blockhashsize})", nameof(size)); - blockListHashes.Add(hash); - blockListHashes.Add(Convert.ToBase64String(data, 0, (int)size)); + } + + /// + /// Copies all entries from this temporary instance to the target + /// + /// The target volume. + /// Only copies the blocklist hashes + public void CopyTo(TemporaryIndexVolume target, bool onlyBlocklistHashes) + { + if (!onlyBlocklistHashes) + foreach (var n in blockHashes) + target.blockHashes.Add(n); + + foreach (var n in blockListHashes) + target.blockListHashes.Add(n); + } + + /// + /// Adds a single block hash to the index + /// + /// The hash of the block. + /// The size of the block. + public void AddBlock(string hash, long size) + { + blockHashes.Add(size.ToString() + ":" + hash); + } + + /// + /// Adds a block list hash to the index + /// + /// The hash of the block to add. + /// The size of the block. + /// The block contents. + public void AddBlockListHash(string hash, long size, byte[] data) + { + if (size % m_blockhashsize != 0) + throw new ArgumentException($"The {nameof(size)} value is {size}, but it must be evenly divisible by the blockhash size ({m_blockhashsize})", nameof(size)); + blockListHashes.Add(hash); + blockListHashes.Add(Convert.ToBase64String(data, 0, (int)size)); } } @@ -135,7 +136,7 @@ namespace Duplicati.Library.Main.Operation.Common { public static async Task CreateIndexVolume(string blockname, Options options, Common.DatabaseCommon database) { - using(var h = HashAlgorithm.Create(options.BlockHashAlgorithm)) + using(var h = HashFactory.CreateHasher(options.BlockHashAlgorithm)) { var w = new IndexVolumeWriter(options); w.VolumeID = await database.RegisterRemoteVolumeAsync(w.RemoteFilename, RemoteVolumeType.Index, RemoteVolumeState.Temporary); @@ -159,7 +160,7 @@ namespace Duplicati.Library.Main.Operation.Common w.Close(); - // Register that the index file is tracking the block file + // Register that the index file is tracking the block file await database.AddIndexBlockLinkAsync(w.VolumeID, blockvolume.ID); return w; @@ -168,7 +169,7 @@ namespace Duplicati.Library.Main.Operation.Common /*public static async Task ReCreateIndexVolume(string selfname, Options options, Repair.RepairDatabase database) { - using(var h = System.Security.Cryptography.HashAlgorithm.Create(options.BlockHashAlgorithm)) + using(var h = HashFactory.CreateHasher(options.BlockHashAlgorithm)) { var w = new IndexVolumeWriter(options); w.SetRemoteFilename(selfname); diff --git a/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs b/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs index bc50ed44c..295e8ba2c 100644 --- a/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs +++ b/Duplicati/Library/Main/Operation/RecreateDatabaseHandler.cs @@ -5,6 +5,7 @@ using System.Security.Cryptography; using Duplicati.Library.Interface; using Duplicati.Library.Main.Database; using Duplicati.Library.Main.Volumes; +using Duplicati.Library.Utility; namespace Duplicati.Library.Main.Operation { @@ -324,14 +325,14 @@ namespace Duplicati.Library.Main.Operation if (!m_options.RepairOnlyPaths) { - var hashalg = HashAlgorithm.Create(m_options.BlockHashAlgorithm); - if (hashalg == null) - throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); - var hashsize = hashalg.HashSize / 8; - + var hashsize = 0; //Grab all index files, and update the block table + + using(var hashalg = HashFactory.CreateHasher(m_options.BlockHashAlgorithm)) using(var tr = restoredb.BeginTransaction()) { + hashsize = hashalg.HashSize / 8; + var indexfiles = ( from n in remotefiles where n.FileType == RemoteVolumeType.Index @@ -369,8 +370,8 @@ namespace Duplicati.Library.Main.Operation // No such file if (volumeID < 0) - volumeID = ProbeForMatchingFilename(ref filename, restoredb); - + volumeID = ProbeForMatchingFilename(ref filename, restoredb); + var missing = false; // Still broken, register a missing item if (volumeID < 0) @@ -378,7 +379,7 @@ namespace Duplicati.Library.Main.Operation var p = VolumeBase.ParseFilename(filename); if (p == null) throw new Exception(string.Format("Unable to parse filename: {0}", filename)); - Logging.Log.WriteErrorMessage(LOGTAG, "MissingFileDetected", null, "Remote file referenced as {0} by {1}, but not found in list, registering a missing remote file", filename, sf.Name); + Logging.Log.WriteErrorMessage(LOGTAG, "MissingFileDetected", null, "Remote file referenced as {0} by {1}, but not found in list, registering a missing remote file", filename, sf.Name); missing = true; volumeID = restoredb.RegisterRemoteVolume(filename, p.FileType, RemoteVolumeState.Temporary, tr); } @@ -504,9 +505,9 @@ namespace Duplicati.Library.Main.Operation } } - backend.WaitForComplete(restoredb, null); - - // In some cases we have a stale reference from an index file to a deleted block file + backend.WaitForComplete(restoredb, null); + + // In some cases we have a stale reference from an index file to a deleted block file if (!m_options.UnittestMode) restoredb.CleanupMissingVolumes(); diff --git a/Duplicati/Library/Main/Operation/RepairHandler.cs b/Duplicati/Library/Main/Operation/RepairHandler.cs index 38c06990c..7c6e7491b 100644 --- a/Duplicati/Library/Main/Operation/RepairHandler.cs +++ b/Duplicati/Library/Main/Operation/RepairHandler.cs @@ -6,6 +6,7 @@ using System.Text; using Duplicati.Library.Interface; using Duplicati.Library.Main.Database; using Duplicati.Library.Main.Volumes; +using Duplicati.Library.Utility; namespace Duplicati.Library.Main.Operation { @@ -118,14 +119,8 @@ namespace Duplicati.Library.Main.Operation var tp = FilelistProcessor.RemoteListAnalysis(backend, m_options, db, m_result.BackendWriter, null); var buffer = new byte[m_options.Blocksize]; - var blockhasher = HashAlgorithm.Create(m_options.BlockHashAlgorithm); - var hashsize = blockhasher.HashSize / 8; + var hashsize = HashFactory.HashSizeBytes(m_options.BlockHashAlgorithm); - if (blockhasher == null) - throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); - if (!blockhasher.CanReuseTransform) - throw new UserInformationException(Strings.Common.InvalidCryptoSystem(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); - var progress = 0; var targetProgess = tp.ExtraVolumes.Count() + tp.MissingVolumes.Count() + tp.VerificationRequiredVolumes.Count(); @@ -149,7 +144,7 @@ namespace Duplicati.Library.Main.Operation if (tp.VerificationRequiredVolumes.Any()) { using(var testdb = new LocalTestDatabase(db)) - { + { foreach(var n in tp.VerificationRequiredVolumes) try { @@ -314,27 +309,28 @@ namespace Duplicati.Library.Main.Operation newEntry = w; w.SetRemoteFilename(n.Name); - var h = HashAlgorithm.Create(m_options.BlockHashAlgorithm); + using(var h = HashFactory.CreateHasher(m_options.BlockHashAlgorithm)) { - foreach (var blockvolume in db.GetBlockVolumesFromIndexName(n.Name)) - { - w.StartVolume(blockvolume.Name); - var volumeid = db.GetRemoteVolumeID(blockvolume.Name); + foreach (var blockvolume in db.GetBlockVolumesFromIndexName(n.Name)) + { + w.StartVolume(blockvolume.Name); + var volumeid = db.GetRemoteVolumeID(blockvolume.Name); - foreach (var b in db.GetBlocks(volumeid)) - w.AddBlock(b.Hash, b.Size); + foreach (var b in db.GetBlocks(volumeid)) + w.AddBlock(b.Hash, b.Size); - w.FinishVolume(blockvolume.Hash, blockvolume.Size); + w.FinishVolume(blockvolume.Hash, blockvolume.Size); - if (m_options.IndexfilePolicy == Options.IndexFileStrategy.Full) - foreach (var b in db.GetBlocklists(volumeid, m_options.Blocksize, hashsize)) - { - var bh = Convert.ToBase64String(h.ComputeHash(b.Item2, 0, b.Item3)); - if (bh != b.Item1) - throw new Exception(string.Format("Internal consistency check failed, generated index block has wrong hash, {0} vs {1}", bh, b.Item1)); + if (m_options.IndexfilePolicy == Options.IndexFileStrategy.Full) + foreach (var b in db.GetBlocklists(volumeid, m_options.Blocksize, hashsize)) + { + var bh = Convert.ToBase64String(h.ComputeHash(b.Item2, 0, b.Item3)); + if (bh != b.Item1) + throw new Exception(string.Format("Internal consistency check failed, generated index block has wrong hash, {0} vs {1}", bh, b.Item1)); - w.WriteBlocklist(b.Item1, b.Item2, 0, b.Item3); - } + w.WriteBlocklist(b.Item1, b.Item2, 0, b.Item3); + } + } } w.Close(); @@ -374,12 +370,14 @@ namespace Duplicati.Library.Main.Operation f.Position = offset; if (size == Library.Utility.Utility.ForceStreamRead(f, buffer, size)) { - var newhash = Convert.ToBase64String(blockhasher.ComputeHash(buffer, 0, size)); - if (newhash == hash) - { - if (mbl.SetBlockRestored(hash, size)) - w.AddBlock(hash, buffer, 0, size, Duplicati.Library.Interface.CompressionHint.Default); - break; + using(var blockhasher = HashFactory.CreateHasher(m_options.BlockHashAlgorithm)) { + var newhash = Convert.ToBase64String(blockhasher.ComputeHash(buffer, 0, size)); + if (newhash == hash) + { + if (mbl.SetBlockRestored(hash, size)) + w.AddBlock(hash, buffer, 0, size, Duplicati.Library.Interface.CompressionHint.Default); + break; + } } } } diff --git a/Duplicati/Library/Main/Operation/RestoreHandler.cs b/Duplicati/Library/Main/Operation/RestoreHandler.cs index 6065e90cc..60b85b340 100644 --- a/Duplicati/Library/Main/Operation/RestoreHandler.cs +++ b/Duplicati/Library/Main/Operation/RestoreHandler.cs @@ -25,6 +25,7 @@ using Duplicati.Library.Common.IO; using Duplicati.Library.Main.Database; using Duplicati.Library.Main.Volumes; using System.Security.Cryptography; +using Duplicati.Library.Utility; namespace Duplicati.Library.Main.Operation { @@ -161,8 +162,8 @@ namespace Duplicati.Library.Main.Operation var blocksize = options.Blocksize; var updateCounter = 0L; var fullblockverification = options.FullBlockVerification; - var blockhasher = fullblockverification ? HashAlgorithm.Create(options.BlockHashAlgorithm) : null; - + + using(var blockhasher = HashFactory.CreateHasher(options.BlockHashAlgorithm)) using (var blockmarker = database.CreateBlockMarker()) using(var volumekeeper = database.GetMissingBlockData(blocks, options.Blocksize)) { @@ -199,7 +200,6 @@ namespace Duplicati.Library.Main.Operation var valid = !fullblockverification; if (!valid) { - blockhasher.Initialize(); var key = Convert.ToBase64String(blockhasher.ComputeHash(blockbuffer, 0, size)); if (targetblock.Key == key) valid = true; @@ -318,18 +318,6 @@ namespace Duplicati.Library.Main.Operation Utility.UpdateOptionsFromDb(database, m_options); Utility.VerifyParameters(database, m_options); m_blockbuffer = new byte[m_options.Blocksize]; - - var blockhasher = HashAlgorithm.Create(m_options.BlockHashAlgorithm); - var filehasher = HashAlgorithm.Create(m_options.FileHashAlgorithm); - if (blockhasher == null) - throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); - if (!blockhasher.CanReuseTransform) - throw new UserInformationException(Strings.Common.InvalidCryptoSystem(m_options.BlockHashAlgorithm), "BlockHashAlgorithmNotSupported"); - - if (filehasher == null) - throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(m_options.FileHashAlgorithm), "FileHashAlgorithmNotSupported"); - if (!filehasher.CanReuseTransform) - throw new UserInformationException(Strings.Common.InvalidCryptoSystem(m_options.FileHashAlgorithm), "FileHashAlgorithmNotSupported"); if (!m_options.NoBackendverification) { @@ -349,11 +337,14 @@ namespace Duplicati.Library.Main.Operation //If we are patching an existing target folder, do not touch stuff that is already updated m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Restore_ScanForExistingFiles); + using(var blockhasher = HashFactory.CreateHasher(m_options.BlockHashAlgorithm)) + using(var filehasher = HashFactory.CreateHasher(m_options.FileHashAlgorithm)) using(new Logging.Timer(LOGTAG, "ScanForExistingTargetBlocks", "ScanForExistingTargetBlocks")) ScanForExistingTargetBlocks(database, m_blockbuffer, blockhasher, filehasher, m_options, result); //Look for existing blocks in the original source files only - using(new Logging.Timer(LOGTAG, "ScanForExistingSourceBlocksFast", "ScanForExistingSourceBlocksFast")) + using (var blockhasher = HashFactory.CreateHasher(m_options.BlockHashAlgorithm)) + using (new Logging.Timer(LOGTAG, "ScanForExistingSourceBlocksFast", "ScanForExistingSourceBlocksFast")) if (!m_options.NoLocalBlocks && !string.IsNullOrEmpty(m_options.Restorepath)) { m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Restore_ScanForLocalBlocks); @@ -370,7 +361,8 @@ namespace Duplicati.Library.Main.Operation if (m_options.PatchWithLocalBlocks) { m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Restore_PatchWithLocalBlocks); - using(new Logging.Timer(LOGTAG, "PatchWithLocalBlocks", "PatchWithLocalBlocks")) + using (var blockhasher = HashFactory.CreateHasher(m_options.BlockHashAlgorithm)) + using (new Logging.Timer(LOGTAG, "PatchWithLocalBlocks", "PatchWithLocalBlocks")) ScanForExistingSourceBlocks(database, m_options, m_blockbuffer, blockhasher, result, metadatastorage); } @@ -444,9 +436,6 @@ namespace Duplicati.Library.Main.Operation if (!m_options.SkipMetadata) ApplyStoredMetadata(m_options, metadatastorage); - // Reset the filehasher if it was used to verify existing files - filehasher.Initialize(); - if (m_result.TaskControlRendevouz() == TaskControlState.Stop) return; @@ -455,7 +444,8 @@ namespace Duplicati.Library.Main.Operation if (m_options.PerformRestoredFileVerification) { // After all blocks in the files are restored, verify the file hash - using(new Logging.Timer(LOGTAG, "RestoreVerification", "RestoreVerification")) + using (var filehasher = HashFactory.CreateHasher(m_options.FileHashAlgorithm)) + using (new Logging.Timer(LOGTAG, "RestoreVerification", "RestoreVerification")) foreach(var file in database.GetFilesToRestore(true)) { try diff --git a/Duplicati/Library/Main/Operation/TestHandler.cs b/Duplicati/Library/Main/Operation/TestHandler.cs index fe91afa8f..8e80dbc08 100644 --- a/Duplicati/Library/Main/Operation/TestHandler.cs +++ b/Duplicati/Library/Main/Operation/TestHandler.cs @@ -21,6 +21,7 @@ using System.Linq; using System.Collections.Generic; using Duplicati.Library.Interface; using System.Security.Cryptography; +using Duplicati.Library.Utility; namespace Duplicati.Library.Main.Operation { @@ -200,14 +201,7 @@ namespace Duplicati.Library.Main.Operation /// A value between 0 and 1 that indicates how many blocks are tested in a dblock file public static KeyValuePair>> TestVolumeInternals(LocalTestDatabase db, IRemoteVolume vol, string tf, Options options, double sample_percent) { - var blockhasher = HashAlgorithm.Create(options.BlockHashAlgorithm); - - if (blockhasher == null) - throw new UserInformationException(Strings.Common.InvalidHashAlgorithm(options.BlockHashAlgorithm), "BlockHashAlgorithmInvalid"); - if (!blockhasher.CanReuseTransform) - throw new UserInformationException(Strings.Common.InvalidCryptoSystem(options.BlockHashAlgorithm), "BlockHashAlgorithmInvalid"); - - var hashsize = blockhasher.HashSize / 8; + var hashsize = HashFactory.HashSizeBytes(options.BlockHashAlgorithm); var parsedInfo = Volumes.VolumeBase.ParseFilename(vol.Name); sample_percent = Math.Min(1, Math.Max(sample_percent, 0.01)); @@ -253,6 +247,7 @@ namespace Duplicati.Library.Main.Operation return new KeyValuePair>>(vol.Name, combined.ToList()); case RemoteVolumeType.Blocks: + using (var blockhasher = HashFactory.CreateHasher(options.BlockHashAlgorithm)) using (var bl = db.CreateBlocklist(vol.Name)) using (var rd = new Volumes.BlockVolumeReader(parsedInfo.CompressionModule, tf, options)) { diff --git a/Duplicati/Library/Main/Options.cs b/Duplicati/Library/Main/Options.cs index d19af6baf..bbb8b5a37 100644 --- a/Duplicati/Library/Main/Options.cs +++ b/Duplicati/Library/Main/Options.cs @@ -168,25 +168,6 @@ namespace Duplicati.Library.Main } - private static string[] GetSupportedHashes() - { - var r = new List(); - foreach (var h in new string[] { "SHA1", "MD5", "SHA256", "SHA384", "SHA512" }) - { - try - { - var p = System.Security.Cryptography.HashAlgorithm.Create(h); - if (p != null) - r.Add(h); - } - catch - { - } - } - - return r.ToArray(); - } - private static readonly string DEFAULT_COMPRESSED_EXTENSION_FILE = System.IO.Path.Combine(Duplicati.Library.AutoUpdater.UpdaterManager.InstalledBaseDir, "default_compressed_extensions.txt"); /// @@ -359,8 +340,8 @@ namespace Duplicati.Library.Main new CommandLineArgument("full-remote-verification", CommandLineArgument.ArgumentType.Boolean, Strings.Options.FullremoteverificationShort, Strings.Options.FullremoteverificationLong("no-backend-verification"), "false"), new CommandLineArgument("dry-run", CommandLineArgument.ArgumentType.Boolean, Strings.Options.DryrunShort, Strings.Options.DryrunLong, "false", new string[] { "dryrun" }), - new CommandLineArgument("block-hash-algorithm", CommandLineArgument.ArgumentType.Enumeration, Strings.Options.BlockhashalgorithmShort, Strings.Options.BlockhashalgorithmLong, DEFAULT_BLOCK_HASH_ALGORITHM, null, GetSupportedHashes()), - new CommandLineArgument("file-hash-algorithm", CommandLineArgument.ArgumentType.Enumeration, Strings.Options.FilehashalgorithmShort, Strings.Options.FilehashalgorithmLong, DEFAULT_FILE_HASH_ALGORITHM, null, GetSupportedHashes()), + new CommandLineArgument("block-hash-algorithm", CommandLineArgument.ArgumentType.Enumeration, Strings.Options.BlockhashalgorithmShort, Strings.Options.BlockhashalgorithmLong, DEFAULT_BLOCK_HASH_ALGORITHM, null, HashFactory.GetSupportedHashes()), + new CommandLineArgument("file-hash-algorithm", CommandLineArgument.ArgumentType.Enumeration, Strings.Options.FilehashalgorithmShort, Strings.Options.FilehashalgorithmLong, DEFAULT_FILE_HASH_ALGORITHM, null, HashFactory.GetSupportedHashes()), new CommandLineArgument("no-auto-compact", CommandLineArgument.ArgumentType.Boolean, Strings.Options.NoautocompactShort, Strings.Options.NoautocompactLong, "false"), new CommandLineArgument("small-file-size", CommandLineArgument.ArgumentType.Size, Strings.Options.SmallfilesizeShort, Strings.Options.SmallfilesizeLong), @@ -1300,7 +1281,7 @@ namespace Duplicati.Library.Main get { if (m_cachedBlockHashSize.Key != BlockHashAlgorithm) - m_cachedBlockHashSize = new KeyValuePair(BlockHashAlgorithm, HashAlgorithm.Create(BlockHashAlgorithm).HashSize / 8); + m_cachedBlockHashSize = new KeyValuePair(BlockHashAlgorithm, HashFactory.HashSizeBytes(BlockHashAlgorithm)); return m_cachedBlockHashSize.Value; } diff --git a/Duplicati/Library/Main/Utility.cs b/Duplicati/Library/Main/Utility.cs index b643193eb..1dc6d1b1e 100644 --- a/Duplicati/Library/Main/Utility.cs +++ b/Duplicati/Library/Main/Utility.cs @@ -22,6 +22,7 @@ using System.Security.Cryptography; using Newtonsoft.Json; using System.Text; using Duplicati.Library.Main.Database; +using Duplicati.Library.Utility; namespace Duplicati.Library.Main { @@ -51,7 +52,7 @@ namespace Duplicati.Library.Main using (var ms = new System.IO.MemoryStream()) using (var w = new StreamWriter(ms, Encoding.UTF8)) - using(var filehasher = HashAlgorithm.Create(options.FileHashAlgorithm)) + using(var filehasher = HashFactory.CreateHasher(options.FileHashAlgorithm)) { if (filehasher == null) throw new Duplicati.Library.Interface.UserInformationException(Strings.Common.InvalidHashAlgorithm(options.FileHashAlgorithm), "FileHashAlgorithmNotSupported"); diff --git a/Duplicati/Library/Utility/HashCalculatingStream.cs b/Duplicati/Library/Utility/HashCalculatingStream.cs index 5332baa85..410f3c820 100644 --- a/Duplicati/Library/Utility/HashCalculatingStream.cs +++ b/Duplicati/Library/Utility/HashCalculatingStream.cs @@ -24,17 +24,6 @@ using System.Text; namespace Duplicati.Library.Utility { - /// - /// A special stream that does on-the-fly MD5 calculations - /// - public class MD5CalculatingStream : HashCalculatingStream - { - public MD5CalculatingStream(System.IO.Stream basestream) - : base(basestream, "MD5") - { - } - } - /// /// A special stream that does on-the-fly hash calculations /// @@ -49,11 +38,6 @@ namespace Duplicati.Library.Utility private byte[] m_hashbuffer = null; private int m_hashbufferLength = 0; - public HashCalculatingStream(System.IO.Stream basestream, string hashalgorithm) - : this(basestream, HashAlgorithm.Create(hashalgorithm)) - { - } - public HashCalculatingStream(System.IO.Stream basestream, System.Security.Cryptography.HashAlgorithm algorithm) : base(basestream) { diff --git a/Duplicati/Library/Utility/HashFactory.cs b/Duplicati/Library/Utility/HashFactory.cs new file mode 100644 index 000000000..043b37c67 --- /dev/null +++ b/Duplicati/Library/Utility/HashFactory.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using Crypto = System.Security.Cryptography; +using System.Text; + +namespace Duplicati.Library.Utility +{ + public static class HashFactory + { + public const string MD5 = "MD5"; + public const string SHA1 = "SHA1"; + public const string SHA256 = "SHA256"; + public const string SHA384 = "SHA384"; + public const string SHA512 = "SHA512"; + + public static string[] GetSupportedHashes() + { + var r = new List(); + foreach (var h in new string[] { "SHA1", "MD5", "SHA256", "SHA384", "SHA512" }) + { + try + { + using (var p = CreateHasher(h)) { + if (p != null) + r.Add(h); + } + } + catch + { + } + } + + return r.ToArray(); + } + + public static Crypto.HashAlgorithm CreateHasher(string algorithm) + { + switch (algorithm.ToUpperInvariant()) + { + case "MD5": + return Crypto.MD5.Create(); + case "SHA1": + return Crypto.SHA1.Create(); + case "SHA256": + return Crypto.SHA256.Create(); + case "SHA384": + return Crypto.SHA384.Create(); + case "SHA512": + return Crypto.SHA512.Create(); + default: + throw new ArgumentException("Unknown algorithm: " + algorithm, nameof(algorithm)); + } + } + + public static int HashSizeBytes(string algorithm) + { + using (var hasher = CreateHasher(algorithm)) + { + return hasher.HashSize / 8; + } + } + } +} diff --git a/Duplicati/Library/Utility/Utility.cs b/Duplicati/Library/Utility/Utility.cs index a582fc397..ee9bf66e5 100644 --- a/Duplicati/Library/Utility/Utility.cs +++ b/Duplicati/Library/Utility/Utility.cs @@ -41,11 +41,6 @@ namespace Duplicati.Library.Utility /// private static bool? CachedIsFSCaseSensitive; - /// - /// Gets the hash algorithm used for calculating a hash - /// - private static string BlockHashAlgorithm => "SHA256"; - /// /// The EPOCH offset (unix style) /// @@ -597,16 +592,6 @@ namespace Duplicati.Library.Utility return a1 == a2; } - /// - /// Calculates the hash of a given stream, and returns the results as an base64 encoded string - /// - /// The stream to calculate the hash for - /// The base64 encoded hash - public static string CalculateHash(Stream stream) - { - return Convert.ToBase64String(HashAlgorithm.Create(BlockHashAlgorithm).ComputeHash(stream)); - } - /// /// Reads a file, attempts to detect encoding /// diff --git a/Duplicati/Server/WebServer/RESTMethods/Captcha.cs b/Duplicati/Server/WebServer/RESTMethods/Captcha.cs index de64085c0..41d7a1ac6 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Captcha.cs +++ b/Duplicati/Server/WebServer/RESTMethods/Captcha.cs @@ -118,7 +118,9 @@ namespace Duplicati.Server.WebServer.RESTMethods var bytes = System.Text.Encoding.UTF8.GetBytes(answer + nonce); ms.Write(bytes, 0, bytes.Length); ms.Position = 0; - token = Library.Utility.Utility.Base64PlainToBase64Url(Library.Utility.Utility.CalculateHash(ms)); + using(var hasher = Library.Utility.HashFactory.CreateHasher(Library.Utility.HashFactory.SHA256)){ + token = Library.Utility.Utility.Base64PlainToBase64Url(Convert.ToBase64String(hasher.ComputeHash(ms))); + } } lock (m_lock) From 1b72212533ce32fc1353d438174f00b4a5f03b83 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 10 Apr 2021 13:39:21 -0700 Subject: [PATCH 158/253] Dnslite doesn't work on mac/linux in .net5 --- .../Duplicati.Library.Modules.Builtin.csproj | 4 +- Duplicati/Library/Modules/Builtin/SendMail.cs | 40 +--- Duplicati/License/Duplicati.License.csproj | 8 - thirdparty/DnsLite/DnsLite.cs | 192 ------------------ thirdparty/DnsLite/download.txt | 1 - thirdparty/DnsLite/licensedata.json | 7 - 6 files changed, 5 insertions(+), 247 deletions(-) delete mode 100644 thirdparty/DnsLite/DnsLite.cs delete mode 100644 thirdparty/DnsLite/download.txt delete mode 100644 thirdparty/DnsLite/licensedata.json diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index e1a757697..a38d9c8ed 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -7,6 +7,7 @@ + @@ -24,9 +25,6 @@ - - DnsLite.cs - PreserveNewest diff --git a/Duplicati/Library/Modules/Builtin/SendMail.cs b/Duplicati/Library/Modules/Builtin/SendMail.cs index 107ba4b80..29de81cb2 100644 --- a/Duplicati/Library/Modules/Builtin/SendMail.cs +++ b/Duplicati/Library/Modules/Builtin/SendMail.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Net; using System.Text; using System.Text.RegularExpressions; -using DnsLib; using Duplicati.Library.Interface; using Duplicati.Library.Logging; using Duplicati.Library.Utility; @@ -15,6 +14,7 @@ using System.Net.Sockets; using MailKit.Net.Smtp; using MimeKit; using Duplicati.Library.Modules.Builtin.ResultSerialization; +using DnsClient; namespace Duplicati.Library.Modules.Builtin { @@ -231,42 +231,10 @@ namespace Duplicati.Library.Modules.Builtin List servers = null; if (string.IsNullOrEmpty(m_server)) { - var dnslite = new DnsLib.DnsLite(); - var dnslist = new List(); + var dnsclient = new LookupClient(); + var records = dnsclient.Query(toMailDomain, QueryType.MX).Answers.MxRecords(); - //Grab all IPv4 addresses - foreach (NetworkInterface networkInterface in NetworkInterface.GetAllNetworkInterfaces()) - try - { - foreach (IPAddress dnsAddress in networkInterface.GetIPProperties().DnsAddresses) - if (dnsAddress.AddressFamily == AddressFamily.InterNetwork) - dnslist.Add(dnsAddress.ToString()); - } - catch (Exception ex) { Logging.Log.WriteExplicitMessage(LOGTAG, "DNSServerLookupFailure", ex, "Failed to get DNS servers from network interface"); } - - dnslist = dnslist.Distinct().ToList(); - - // If we have no DNS servers, try Google and OpenDNS - if (dnslist.Count == 0) - { - // https://developers.google.com/speed/public-dns/ - dnslist.Add("8.8.8.8"); - dnslist.Add("8.8.4.4"); - - //http://www.opendns.com/opendns-ip-addresses/ - dnslist.Add("208.67.222.222"); - dnslist.Add("208.67.220.220"); - } - - var records = new List(); - foreach (var s in dnslist) - { - var res = dnslite.getMXRecords(toMailDomain, s); - if (res != null) - records.AddRange(res.OfType()); - } - - servers = records.OrderBy(record => record.preference).Select(x => "smtp://" + x.exchange).Distinct().ToList(); + servers = records.OrderBy(record => record.Preference).Select(x => "smtp://" + x.Exchange).Distinct().ToList(); if (servers.Count == 0) throw new IOException(Strings.SendMail.FailedToLookupMXServer(OPTION_SERVER)); } diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 5d01c30e9..eea8641ae 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -95,14 +95,6 @@ licenses\AWSSDK\license.txt PreserveNewest - - licenses\DnsLite\licensedata.json - PreserveNewest - - - licenses\DnsLite\download.txt - PreserveNewest - licenses\gpg\licensedata.json PreserveNewest diff --git a/thirdparty/DnsLite/DnsLite.cs b/thirdparty/DnsLite/DnsLite.cs deleted file mode 100644 index 93011164a..000000000 --- a/thirdparty/DnsLite/DnsLite.cs +++ /dev/null @@ -1,192 +0,0 @@ -//Dnslite.cs -//From: http://www.csharphelp.com/2005/12/dns-client-utility/ -/** - csc /target:library /out:DnsLib.dll /keyfile:..\..\Duplicati\GUI\Duplicati.snk DnsLite.cs -*/ -using System; -using System.Net; -using System.IO; -using System.Text; -using System.Net.Sockets; -using System.Collections; -namespace DnsLib -{ - public class MXRecord - { - public int preference = -1; - public string exchange = null; - public override string ToString() - { - return "Preference : " + preference + " Exchange : " + exchange; - } - } - public class DnsLite - { - private byte[] data; - private int position, id, length; - private string name; - private ArrayList dnsServers; - private static readonly int DNS_PORT = 53; - readonly Encoding ASCII = Encoding.ASCII; - public DnsLite() - { - id = DateTime.Now.Millisecond * 60; - dnsServers = new ArrayList(); - - } - public void setDnsServers(ArrayList dnsServers) - { - this.dnsServers = dnsServers; - } - public ArrayList getMXRecords(string host) - { - ArrayList mxRecords = null; - for (int i = 0; i < dnsServers.Count; i++) - { - try - { - mxRecords = getMXRecords(host, (string)dnsServers[i]); - break; - } - catch (IOException) - { - continue; - } - } - return mxRecords; - } - private int getNewId() - { - //return a new id - return ++id; - } - public ArrayList getMXRecords(string host, string serverAddress) - { - //opening the UDP socket at DNS server - //use UDPClient, if you are still with Beta1 - UdpClient dnsClient = new UdpClient(serverAddress, DNS_PORT); - //preparing the DNS query packet. - makeQuery(getNewId(), host); - //send the data packet - dnsClient.Send(data, data.Length); - - // 2017-01-09: Fix not sending null to UDPClient.Receive - IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, DNS_PORT); - //receive the data packet from DNS server - data = dnsClient.Receive(ref endpoint); - length = data.Length; - //un pack the byte array & makes an array of MXRecord objects. - return makeResponse(); - } - //for packing the information to the format accepted by server - public void makeQuery(int id, String name) - { - data = new byte[512]; - for (int i = 0; i < 512; ++i) - { - data[i] = 0; - } - data[0] = (byte)(id >> 8); - data[1] = (byte)(id & 0xFF); - data[2] = 1; data[3] = 0; - data[4] = 0; data[5] = 1; - data[6] = 0; data[7] = 0; - data[8] = 0; data[9] = 0; - data[10] = 0; data[11] = 0; - string[] tokens = name.Split(new char[] { '.' }); - string label; - position = 12; - for (int j = 0; j < tokens.Length; j++) - { - label = tokens[j]; - data[position++] = (byte)(label.Length & 0xFF); - byte[] b = ASCII.GetBytes(label); - for (int k = 0; k < b.Length; k++) - { - data[position++] = b[k]; - } - } - data[position++] = 0; data[position++] = 0; - data[position++] = 15; data[position++] = 0; - data[position++] = 1; - } - //for un packing the byte array - public ArrayList makeResponse() - { - ArrayList mxRecords = new ArrayList(); - MXRecord mxRecord; - //NOTE: we are ignoring the unnecessary fields. - // and takes only the data required to build MX records. - int qCount = ((data[4] & 0xFF) << 8) | (data[5] & 0xFF); - if (qCount < 0) - { - throw new IOException("invalid question count"); - } - int aCount = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF); - if (aCount < 0) - { - throw new IOException("invalid answer count"); - } - position = 12; - for (int i = 0; i < qCount; ++i) - { - name = ""; - position = proc(position); - position += 4; - } - for (int i = 0; i < aCount; ++i) - { - name = ""; - position = proc(position); - position += 10; - int pref = (data[position++] << 8) | (data[position++] & 0xFF); - name = ""; - position = proc(position); - mxRecord = new MXRecord(); - mxRecord.preference = pref; - mxRecord.exchange = name; - mxRecords.Add(mxRecord); - } - return mxRecords; - } - private int proc(int position) - { - int len = (data[position++] & 0xFF); - if (len == 0) - { - return position; - } - int offset; - do - { - if ((len & 0xC0) == 0xC0) - { - if (position >= length) - { - return -1; - } - offset = ((len & 0x3F) << 8) | (data[position++] & 0xFF); - proc(offset); - return position; - } - else { - if ((position + len) > length) - { - return -1; - } - name += ASCII.GetString(data, position, len); - position += len; - } - if (position > length) - { - return -1; - } - len = data[position++] & 0xFF; - if (len != 0) { - name += "."; - } - }while (len != 0); - return position; - } - } -} \ No newline at end of file diff --git a/thirdparty/DnsLite/download.txt b/thirdparty/DnsLite/download.txt deleted file mode 100644 index a2794e3d6..000000000 --- a/thirdparty/DnsLite/download.txt +++ /dev/null @@ -1 +0,0 @@ -http://www.csharphelp.com/2005/12/dns-client-utility/ \ No newline at end of file diff --git a/thirdparty/DnsLite/licensedata.json b/thirdparty/DnsLite/licensedata.json deleted file mode 100644 index 1c3d768c7..000000000 --- a/thirdparty/DnsLite/licensedata.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "DNS Client Utility", - "description": "An Library to query DNS records", - "link": "http://www.csharphelp.com/2005/12/dns-client-utility/", - "license": "Unknown", - "notes": "" -} \ No newline at end of file From 6fd696a6619054a1e391493aa10af2a1e46d5947 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 10 Apr 2021 13:41:51 -0700 Subject: [PATCH 159/253] Missed a thread abort --- Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs | 2 +- Duplicati/Server/WebServer/RESTMethods/CommandLine.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs index 4260da6fa..dcaec091e 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/HostedInstanceKeeper.cs @@ -63,7 +63,7 @@ namespace Duplicati.GUI.TrayIcon Duplicati.Server.Program.ApplicationExitEvent.Set(); if (!m_runner.Join(TimeSpan.FromSeconds(10))) { - m_runner.Abort(); + m_runner.Interrupt(); m_runner.Join(TimeSpan.FromSeconds(10)); } } diff --git a/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs b/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs index 624821b49..00e6bb373 100644 --- a/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs +++ b/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs @@ -190,7 +190,7 @@ namespace Duplicati.Server.WebServer.RESTMethods var tr = t.Thread; if (tr != null) - tr.Abort(); + tr.Interrupt(); info.OutputOK(); } From 6f3d293364a7c6aa3230bf4faa06bcdcb2e704d7 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 11 Apr 2021 13:37:21 -0700 Subject: [PATCH 160/253] Fix trayicons opening terminal --- .../net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 2 +- .../net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index da3facd1e..cd4aaad4b 100644 --- a/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Executables/net48/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,7 +1,7 @@  - Exe + WinExe net48 LGPL, Copyright © Duplicati Team 2021 The Duplicati Tray implementation diff --git a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index ffdf470b1..b862e87ae 100644 --- a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,7 +1,7 @@  - Exe + WinExe net5.0 LGPL, Copyright © Duplicati Team 2021 The Duplicati Tray implementation From 7b90ed3c5a88ff96ee1e8d36ab316f5cbeb1d4b5 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 11 Apr 2021 13:37:54 -0700 Subject: [PATCH 161/253] Fix loading backup defaults after assembly rename --- .../Server/WebServer/RESTMethods/BackupDefaults.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs b/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs index fc6725cca..2d3aa63a1 100644 --- a/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs +++ b/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs @@ -16,9 +16,9 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using System.Linq; -using Duplicati.Library.Common.IO; -using Duplicati.Library.Utility; - +using Duplicati.Library.Common.IO; +using Duplicati.Library.Utility; + namespace Duplicati.Server.WebServer.RESTMethods { public class BackupDefaults : IRESTMethodGET @@ -38,13 +38,14 @@ namespace Duplicati.Server.WebServer.RESTMethods { // Add built-in defaults Newtonsoft.Json.Linq.JObject n; - using(var s = new System.IO.StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".newbackup.json"))) + using(var s = new System.IO.StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(typeof(Program), "newbackup.json"))) n = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(s.ReadToEnd()); MergeJsonObjects(o, n); } - catch + catch (Exception e) { + Console.Error.WriteLine(e.Message); } try @@ -59,8 +60,9 @@ namespace Duplicati.Server.WebServer.RESTMethods MergeJsonObjects(o, n); } } - catch + catch (Exception e) { + Console.Error.WriteLine(e.Message); } info.OutputOK(new From 1e64788a6b6be3f98f94fb6f036ebb105503fb75 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 13 Apr 2021 07:48:27 -0700 Subject: [PATCH 162/253] Change console logs to Logger --- Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs b/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs index 2d3aa63a1..521222397 100644 --- a/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs +++ b/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs @@ -23,6 +23,9 @@ namespace Duplicati.Server.WebServer.RESTMethods { public class BackupDefaults : IRESTMethodGET { + + private static readonly string LOGTAG = Library.Logging.Log.LogTagFromType(); + public void GET(string key, RequestInfo info) { // Start with a scratch object @@ -45,7 +48,7 @@ namespace Duplicati.Server.WebServer.RESTMethods } catch (Exception e) { - Console.Error.WriteLine(e.Message); + Library.Logging.Log.WriteErrorMessage(LOGTAG, "BackupDefaultsError", e, "Failed to locate embeded backup defaults"); } try @@ -62,7 +65,7 @@ namespace Duplicati.Server.WebServer.RESTMethods } catch (Exception e) { - Console.Error.WriteLine(e.Message); + Library.Logging.Log.WriteErrorMessage(LOGTAG, "BackupDefaultsError", e, "Failed to process newbackup.json"); } info.OutputOK(new From 82f60d79891f5ae6c7fc867b6ce4165e97235ae7 Mon Sep 17 00:00:00 2001 From: Kenneth Hsu Date: Sun, 23 May 2021 20:20:21 -0700 Subject: [PATCH 163/253] Use consistent target frameworks for entry executables. Previously, we would have inconsistent paths to the executables (net5 vs. net5.0). For example, Executables/net5/Duplicati.CommandLine.BackendTester/bin/Debug/net5.0 Executables/net5/Duplicati.CommandLine/bin/Debug/net5 With these changes, the path to the Duplicati.CommandLine executables becomes Executables/net5/Duplicati.CommandLine/bin/Debug/net5.0 --- .../net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj index 4c86b2311..c40ddb313 100644 --- a/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj +++ b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj @@ -2,7 +2,7 @@ Exe - net5 + net5.0 LGPL, Copyright © Duplicati Team 2021 Commandline implementation of Duplicati From f3b43d2df66385b747bae86ef42a6756b6c5da63 Mon Sep 17 00:00:00 2001 From: Kenneth Hsu Date: Mon, 17 May 2021 11:17:12 -0700 Subject: [PATCH 164/253] Fix GTK build. This fixes #4527. --- .../GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs new file mode 100644 index 000000000..7282f4ba8 --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/ImageLoader.cs @@ -0,0 +1,93 @@ +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Drawing; +using System.Collections.Generic; + +namespace Duplicati.GUI.TrayIcon +{ + public static class ImageLoader + { + private static readonly System.Reflection.Assembly ASSEMBLY = System.Reflection.Assembly.GetExecutingAssembly(); + private static readonly string PREFIX = ASSEMBLY.GetName().Name + "."; + private static readonly Dictionary BITMAPS = new Dictionary(); + private static readonly Dictionary ICONS = new Dictionary(); + private static readonly object LOCK = new object(); + + private static Bitmap LoadImage(string filename) + { + Bitmap bmp; + if (BITMAPS.TryGetValue(filename, out bmp)) + return bmp; + + lock(LOCK) + if (!BITMAPS.TryGetValue(filename, out bmp)) + return BITMAPS[filename] = (Bitmap)Image.FromStream(ASSEMBLY.GetManifestResourceStream(PREFIX + filename)); + + return BITMAPS[filename]; + } + + public static Icon LoadIcon(string filename) + { + return LoadIcon(filename, new Size(32, 32)); + } + + public static Icon LoadIcon(string filename, Size size) + { + Icon ico; + + var cachename = string.Format("{0};{1}x{2}", filename, size.Width, size.Height); + + if (ICONS.TryGetValue(cachename, out ico)) + return ico; + + if (!filename.EndsWith(".ico", StringComparison.OrdinalIgnoreCase)) + using(var ms = new System.IO.MemoryStream()) + { + Icon ic; + using(var bmp = LoadImage(filename)) + ic = Icon.FromHandle(bmp.GetHicon()); + + ms.Position = 0; + lock(LOCK) + if (!ICONS.TryGetValue(cachename, out ico)) + return ICONS[cachename] = ic; + } + + lock(LOCK) + if (!ICONS.TryGetValue(cachename, out ico)) + return ICONS[cachename] = new Icon(ASSEMBLY.GetManifestResourceStream(PREFIX + filename), size); + + return ICONS[cachename]; + } + + + public const string WarningIcon = "TrayResources.WinIcons.TrayNormalWarning.ico"; + public const string NormalIcon = "TrayResources.WinIcons.TrayNormal.ico"; + public const string ErrorIcon = "TrayResources.WinIcons.TrayNormalError.ico"; + public const string PauseIcon = "TrayResources.WinIcons.TrayNormalPause.ico"; + public const string WorkingIcon = "TrayResources.WinIcons.TrayWorking.ico"; + + public static Bitmap Pause { get { return LoadImage("TrayResources.WinIcons.context_menu_pause.ico"); } } + public static Bitmap Play { get { return LoadImage("TrayResources.WinIcons.context_menu_play.ico"); } } + public static Bitmap CloseMenuIcon { get { return LoadImage("TrayResources.WinIcons.context_menu_quit.ico"); } } + public static Bitmap StatusMenuIcon { get { return LoadImage("TrayResources.WinIcons.context_menu_open.ico"); } } + + } +} + From 060b4886dad5d5412db7f236663748ba759dda9f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 2 Jan 2021 22:26:00 -0800 Subject: [PATCH 165/253] Just use the nuget version of the sqlite library This fixes #4526. --- .../Duplicati.Library.SQLiteHelper.csproj | 26 +---- .../Library/SQLiteHelper/SQLiteLoader.cs | 95 +------------------ 2 files changed, 4 insertions(+), 117 deletions(-) diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index 82db7b04d..e9e19868f 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -6,29 +6,6 @@ SQLiteHelper for Duplicati - - - SQLite\win64\System.Data.SQLite.dll - PreserveNewest - - - SQLite\win32\System.Data.SQLite.dll - PreserveNewest - - - SQLite\pinvoke\System.Data.SQLite.dll - PreserveNewest - - - SQLite\win32\SQLite.Interop.dll - PreserveNewest - - - SQLite\win64\SQLite.Interop.dll - PreserveNewest - - - @@ -42,6 +19,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + - \ No newline at end of file + diff --git a/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs b/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs index 4a752af16..59682aeed 100644 --- a/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs +++ b/Duplicati/Library/SQLiteHelper/SQLiteLoader.cs @@ -20,6 +20,7 @@ using System; using System.IO; using Duplicati.Library.Common; +using System.Data.SQLite; namespace Duplicati.Library.SQLiteHelper { @@ -152,83 +153,7 @@ namespace Duplicati.Library.SQLiteHelper { get { - if (m_type != null) - return m_type; - - var filename = "System.Data.SQLite.dll"; - var basePath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "SQLite"); - - // Set this to make SQLite preload automatically - Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory", basePath); - - //Default is to use the pinvoke version which requires a native .dll/.so - var assemblyPath = Path.Combine(basePath, "pinvoke"); - var loadMixedModeAssembly = false; - - if (!Duplicati.Library.Utility.Utility.IsMono) - { - //If we run with MS.Net we can use the mixed mode assemblies - if (Environment.Is64BitProcess) - { - if (File.Exists(Path.Combine(Path.Combine(basePath, "win64"), filename))) - { - assemblyPath = Path.Combine(basePath, "win64"); - loadMixedModeAssembly = true; - } - } - else - { - if (File.Exists(Path.Combine(Path.Combine(basePath, "win32"), filename))) - { - assemblyPath = Path.Combine(basePath, "win32"); - loadMixedModeAssembly = true; - } - } - - // If we have a new path, try to force load the mixed-mode assembly for the current architecture - // This can be avoided if the preload in SQLite works, but it is easy to do it here as well - if (loadMixedModeAssembly) - { - try { PInvoke.LoadLibraryEx(Path.Combine(assemblyPath, "SQLite.Interop.dll"), IntPtr.Zero, 0); } - catch (Exception ex) { Logging.Log.WriteExplicitMessage(LOGTAG, "LoadMixedModeSQLiteError", ex, "Failed to load the mixed mode SQLite database: {0}", Path.Combine(assemblyPath, "SQLite.Interop.dll")); } - } - } - else - { - //On Mono, we try to find the Mono version of SQLite - - //This secret environment variable can be used to support older installations - var envvalue = System.Environment.GetEnvironmentVariable("DISABLE_MONO_DATA_SQLITE"); - if (!Utility.Utility.ParseBool(envvalue, envvalue != null)) - { - foreach (var asmversion in new[] { "4.0.0.0", "2.0.0.0" }) - { - var name = string.Format("Mono.Data.Sqlite, Version={0}, Culture=neutral, PublicKeyToken=0738eb9f132ed756", asmversion); - try - { - Type t = System.Reflection.Assembly.Load(name).GetType("Mono.Data.Sqlite.SqliteConnection"); - if (t != null && t.GetInterface("System.Data.IDbConnection", false) != null) - { - Version v = new Version((string)t.GetProperty("SQLiteVersion").GetValue(null, null)); - if (v >= new Version(3, 6, 3)) - { - return m_type = t; - } - } - } - catch(Exception ex) - { - Logging.Log.WriteExplicitMessage(LOGTAG, "FailedToLoadSQLiteAssembly", ex, "Failed to load the SQLite assembly: {0}", name); - } - } - - Logging.Log.WriteVerboseMessage(LOGTAG, "FailedToLoadSQLite", "Failed to load Mono.Data.Sqlite.SqliteConnection, reverting to built-in."); - } - } - - m_type = System.Reflection.Assembly.LoadFile(Path.Combine(assemblyPath, filename)).GetType("System.Data.SQLite.SQLiteConnection"); - - return m_type; + return typeof(SQLiteConnection); } } @@ -307,20 +232,4 @@ namespace Duplicati.Library.SQLiteHelper } } } - - /// - /// Helper class with PInvoke methods - /// - internal static class PInvoke - { - /// - /// Loads the specified module into the address space of the calling process. - /// - /// The library ex. - /// The filename of the module to load. - /// Reserved for future use. - /// Action to take on load. - [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)] - public static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, uint dwFlags); - } } From 69d90e8fc3ffc51065cb7b101e6378ca862d04c8 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 19 Mar 2021 06:42:02 -0700 Subject: [PATCH 166/253] Rip out libappindicator as it isn't compatible with net5 This fixes #4529. --- .../AppIndicatorRunner.cs | 88 ------------------- .../Duplicati.GUI.TrayIcon.csproj | 25 +++--- .../GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs | 4 + .../GUI/Duplicati.GUI.TrayIcon/Program.cs | 38 +------- 4 files changed, 18 insertions(+), 137 deletions(-) delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs deleted file mode 100644 index 540382e7b..000000000 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AppIndicatorRunner.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -#if __WindowsGTK__ || ENABLE_GTK -using System; -using AppIndicator; -using Gtk; -using System.Collections.Generic; - -using Duplicati.Library.Common.IO; -using Duplicati.Library.Utility; -using Duplicati.Server.Serialization; - - -namespace Duplicati.GUI.TrayIcon -{ - public class AppIndicatorRunner : GtkRunner - { - protected ApplicationIndicator m_appIndicator; - private string m_themeFolder; - - protected override void CreateTrayInstance() - { - m_themeFolder = SystemIO.IO_OS.PathCombine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), @"TrayResources\SVGIcons"); - m_themeFolder = SystemIO.IO_OS.PathCombine(m_themeFolder, "dark"); - - m_appIndicator = new ApplicationIndicator("duplicati", "normal", Category.ApplicationStatus, m_themeFolder); - } - - protected override void Run(string[] args) - { - m_appIndicator.Menu.ShowAll(); - m_appIndicator.Status = Status.Active; - Gtk.Application.Run(); - } - - protected override void SetMenu (IEnumerable items) - { - base.SetMenu(items); - m_appIndicator.Menu = m_popupMenu; - } - - protected override void SetIcon(TrayIcons icon) - { - m_appIndicator.IconName = GetTrayIconFilename(icon); - - switch (icon) - { - case TrayIcons.Paused: - m_appIndicator.IconDesc = "Paused"; - break; - case TrayIcons.Running: - m_appIndicator.IconDesc = "Running"; - break; - case TrayIcons.IdleWarning: - m_appIndicator.IconDesc = "Warning"; - break; - case TrayIcons.IdleError: - m_appIndicator.IconDesc = "Error"; - break; - case TrayIcons.RunningError: - m_appIndicator.IconDesc = "Running"; - break; - case TrayIcons.PausedError: - m_appIndicator.IconDesc = "Paused"; - break; - case TrayIcons.Idle: - default: - m_appIndicator.IconDesc = "Ready"; - break; - } - } - } -} -#endif diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 58aaed530..133a00e23 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -27,23 +27,18 @@ - - ..\..\..\thirdparty\appindicator-sharp\appindicator-sharp.dll - - - ..\..\..\thirdparty\appindicator-sharp\gdk-sharp.dll - - - ..\..\..\thirdparty\appindicator-sharp\gtk-sharp.dll - - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + ..\..\..\thirdparty\MonoMac\MonoMac.dll - - ..\..\..\thirdparty\notify-sharp\notify-sharp.dll - @@ -146,4 +141,4 @@ - \ No newline at end of file + diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs index 3b81a6e68..f5a5f99fa 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + #if __WindowsGTK__ || ENABLE_GTK using System; using System.Collections.Generic; @@ -343,8 +344,11 @@ namespace Duplicati.GUI.TrayIcon break; } + /* + FIXME: Someone would need to port notify-sharp to use Tmds.DBus var notification = new Notifications.Notification(title, message, icon); notification.Show(); + */ } protected void StatusUpdateEvent(object sender, EventArgs a) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs index e2881901b..91df59727 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs @@ -19,7 +19,6 @@ namespace Duplicati.GUI.TrayIcon private const string TOOLKIT_OPTION = "toolkit"; private const string TOOLKIT_WINDOWS_FORMS = "winforms"; private const string TOOLKIT_GTK = "gtk"; - private const string TOOLKIT_GTK_APP_INDICATOR = "gtk-appindicator"; private const string TOOLKIT_COCOA = "cocoa"; private const string TOOLKIT_RUMPS = "rumps"; @@ -50,9 +49,6 @@ namespace Duplicati.GUI.TrayIcon #if __WindowsGTK__ || ENABLE_GTK if (Platform.IsClientPosix) { - if (SupportsAppIndicator) - return TOOLKIT_GTK_APP_INDICATOR; - else return TOOLKIT_GTK; } else @@ -128,8 +124,6 @@ namespace Duplicati.GUI.TrayIcon #if __WindowsGTK__ || ENABLE_GTK else if (TOOLKIT_GTK.Equals(toolkit, StringComparison.OrdinalIgnoreCase)) toolkit = TOOLKIT_GTK; - else if (TOOLKIT_GTK_APP_INDICATOR.Equals(toolkit, StringComparison.OrdinalIgnoreCase)) - toolkit = TOOLKIT_GTK_APP_INDICATOR; #endif else if (TOOLKIT_COCOA.Equals(toolkit, StringComparison.OrdinalIgnoreCase)) toolkit = TOOLKIT_COCOA; @@ -294,13 +288,14 @@ namespace Duplicati.GUI.TrayIcon private static TrayIconBase RunTrayIcon(string toolkit) { + //https://medium.com/@k.l.mueller/cross-platform-tray-bar-applications-with-xamarin-forms-bbd6c1b7f17a + //https://docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/other/gtk?tabs=windows + if (toolkit == TOOLKIT_WINDOWS_FORMS) return GetWinformsInstance(); #if __WindowsGTK__ || ENABLE_GTK else if (toolkit == TOOLKIT_GTK) return GetGtkInstance(); - else if (toolkit == TOOLKIT_GTK_APP_INDICATOR) - return GetAppIndicatorInstance(); #endif else if (toolkit == TOOLKIT_COCOA) return GetCocoaRunnerInstance(); @@ -322,8 +317,6 @@ namespace Duplicati.GUI.TrayIcon #if __MonoCS__ || __WindowsGTK__ || ENABLE_GTK [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetGtkInstance() { return new GtkRunner(); } - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private static TrayIconBase GetAppIndicatorInstance() { return new AppIndicatorRunner(); } #endif [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetCocoaRunnerInstance() { return new CocoaRunner(); } @@ -340,7 +333,7 @@ namespace Duplicati.GUI.TrayIcon private static bool TryGetGtk() { #if __WindowsGTK__ || ENABLE_GTK - return typeof(Gtk.StatusIcon) != null && typeof(Gdk.Image) != null; + return typeof(Gtk.StatusIcon) != null; #else return false; #endif @@ -351,16 +344,6 @@ namespace Duplicati.GUI.TrayIcon { return Platform.IsClientWindows; } - - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private static bool TryGetAppIndicator() - { -#if __WindowsGTK__ || ENABLE_GTK - return typeof(AppIndicator.ApplicationIndicator) != null; -#else - return false; -#endif - } [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static bool TryGetMonoMac() @@ -382,17 +365,6 @@ namespace Duplicati.GUI.TrayIcon } } - private static bool SupportsAppIndicator - { - get - { - try { return TryGetAppIndicator(); } - catch {} - - return false; - } - } - private static bool SupportsCocoa { get @@ -436,8 +408,6 @@ namespace Duplicati.GUI.TrayIcon toolkits.Add(TOOLKIT_WINDOWS_FORMS); if (SupportsGtk) toolkits.Add(TOOLKIT_GTK); - if (SupportsAppIndicator) - toolkits.Add(TOOLKIT_GTK_APP_INDICATOR); if (SupportsCocoa) toolkits.Add(TOOLKIT_COCOA); if (SupportsRumps) From 67eef2c1fd1767a66471a1ccd83af6c7ce062fe3 Mon Sep 17 00:00:00 2001 From: Kenneth Hsu Date: Wed, 26 May 2021 10:02:32 -0700 Subject: [PATCH 167/253] Fix path to GTK tray icons. The use of a backslash as a path separator only works for Windows. This fixes #4528. --- Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs index f5a5f99fa..d7e786256 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/GtkRunner.cs @@ -33,7 +33,7 @@ namespace Duplicati.GUI.TrayIcon /// static GtkRunner() { - m_svgfolder = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), @"TrayResources\SVGIcons"); + m_svgfolder = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "TrayResources", "SVGIcons"); m_svgfolder = System.IO.Path.Combine(m_svgfolder, "dark"); Gtk.Application.Init(); From f2bcf470d2f13ce3bebdef365851dab712e6b060 Mon Sep 17 00:00:00 2001 From: Kenneth Hsu Date: Thu, 10 Jun 2021 10:20:52 -0700 Subject: [PATCH 168/253] Add factory method to get default AmazonS3Config instance. This adds a method to get a default instance of AmazonS3Config. This accomplishes two key things: 1. Previously, the documentation for the default buffer size (8192) was inconsistent with the actual default value (65536). This was due to differences in the property values betwen the instance used to generate the documentation, and that used in the actual backend client. 2. Disables the use of Amazon Resource Names (ARN). This does not seem critical to our application. Moreover, if the UseArnRegion property is not set, accessing it triggers an expensive operation (~30 seconds) to get the region endpoint. This causes the loading of the backend modules to take a long time and run afoul of HTTP request timeouts, causing the application to think that no backends are available. The previous version of the AWSSDK.S3 library that we used did not have this property, so this was not an issue until we started migrating away from .NET Framework. This fixes #4543. --- Duplicati/Library/Backend/S3/S3AwsClient.cs | 23 +++++++++++++++------ Duplicati/Library/Backend/S3/S3Backend.cs | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/Duplicati/Library/Backend/S3/S3AwsClient.cs b/Duplicati/Library/Backend/S3/S3AwsClient.cs index d31266d0d..b4371f09c 100644 --- a/Duplicati/Library/Backend/S3/S3AwsClient.cs +++ b/Duplicati/Library/Backend/S3/S3AwsClient.cs @@ -48,12 +48,9 @@ namespace Duplicati.Library.Backend public S3AwsClient(string awsID, string awsKey, string locationConstraint, string servername, string storageClass, bool useSSL, Dictionary options) { - var cfg = new AmazonS3Config - { - UseHttp = !useSSL, - ServiceURL = (useSSL ? "https://" : "http://") + servername, - BufferSize = (int) Utility.Utility.DEFAULT_BUFFER_SIZE, - }; + var cfg = S3AwsClient.GetDefaultAmazonS3Config(); + cfg.UseHttp = !useSSL; + cfg.ServiceURL = (useSSL ? "https://" : "http://") + servername; foreach (var opt in options.Keys.Where(x => x.StartsWith("s3-ext-", StringComparison.OrdinalIgnoreCase))) { @@ -97,6 +94,20 @@ namespace Duplicati.Library.Backend m_client.PutBucketAsync(request).GetAwaiter().GetResult(); } + internal static AmazonS3Config GetDefaultAmazonS3Config() + { + return new AmazonS3Config() + { + BufferSize = (int) Utility.Utility.DEFAULT_BUFFER_SIZE, + + // If this is not set, accessing the property will trigger an expensive operation (~30 seconds) + // to get the region endpoint. The use of ARNs (Amazon Resource Names) doesn't appear to be + // critical for our usages. + // See: https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html + UseArnRegion = false, + }; + } + public virtual void GetFileStream(string bucketName, string keyName, System.IO.Stream target) { var objectGetRequest = new GetObjectRequest diff --git a/Duplicati/Library/Backend/S3/S3Backend.cs b/Duplicati/Library/Backend/S3/S3Backend.cs index 2470b196d..ca09b881d 100644 --- a/Duplicati/Library/Backend/S3/S3Backend.cs +++ b/Duplicati/Library/Backend/S3/S3Backend.cs @@ -376,7 +376,7 @@ namespace Duplicati.Library.Backend foreach (var s in KNOWN_S3_LOCATIONS) locations.AppendLine(string.Format("{0}: {1}", s.Key, s.Value)); - var defaults = new Amazon.S3.AmazonS3Config(); + var defaults = S3AwsClient.GetDefaultAmazonS3Config(); var exts = typeof(Amazon.S3.AmazonS3Config).GetProperties().Where(x => x.CanRead && x.CanWrite && (x.PropertyType == typeof(string) || x.PropertyType == typeof(bool) || x.PropertyType == typeof(int) || x.PropertyType == typeof(long) || x.PropertyType.IsEnum)) From 30287a3eb4362a8dfde63b467b0c2bb4a6fc5d74 Mon Sep 17 00:00:00 2001 From: Kenneth Hsu Date: Wed, 26 May 2021 09:39:34 -0700 Subject: [PATCH 169/253] Replace manual thread management with Tasks and CancellationToken. This was causing a strange issue when testing the situation where write privileges were removed from the local destination directory. Instead of catching the AccessViolationException and returning the expected exit code of 100, the process would exit with Aborted (core dumped). This concerns #4533. --- Duplicati/CommandLine/CLI/Commands.cs | 29 ++++++++++++++------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Duplicati/CommandLine/CLI/Commands.cs b/Duplicati/CommandLine/CLI/Commands.cs index 55fbf233b..06f0510cc 100644 --- a/Duplicati/CommandLine/CLI/Commands.cs +++ b/Duplicati/CommandLine/CLI/Commands.cs @@ -20,6 +20,8 @@ using System.Linq; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; using Duplicati.Library.Common.IO; using Duplicati.Library.Utility; @@ -34,8 +36,9 @@ namespace Duplicati.CommandLine private readonly System.Threading.ManualResetEvent m_readyEvent; private readonly System.Threading.ManualResetEvent m_finishEvent; private readonly ConsoleOutput m_output; - private System.Threading.Thread m_thread; private readonly TimeSpan m_updateFrequency; + private Task m_task; + private readonly CancellationTokenSource m_cancellationTokenSource; public PeriodicOutput(ConsoleOutput messageSink, TimeSpan updateFrequency) { @@ -43,10 +46,8 @@ namespace Duplicati.CommandLine m_readyEvent = new System.Threading.ManualResetEvent(false); m_finishEvent = new System.Threading.ManualResetEvent(false); m_updateFrequency = updateFrequency; - m_thread = new System.Threading.Thread(this.ThreadMain); - m_thread.IsBackground = true; - m_thread.Name = "Periodic console writer"; - m_thread.Start(); + m_cancellationTokenSource = new CancellationTokenSource(); + m_task = Task.Run(() => this.ThreadMain(m_cancellationTokenSource.Token), m_cancellationTokenSource.Token); } public void SetReady() { m_readyEvent.Set(); } @@ -54,13 +55,13 @@ namespace Duplicati.CommandLine public bool Join(TimeSpan wait) { - if (m_thread != null) - return m_thread.Join(wait); + if (m_task != null) + return this.m_task.Wait(wait); return true; } - private void ThreadMain() + private void ThreadMain(CancellationToken cancellationToken) { m_readyEvent.WaitOne(); if (m_finishEvent.WaitOne(TimeSpan.FromMilliseconds(10), true)) @@ -69,7 +70,7 @@ namespace Duplicati.CommandLine var last_count = -1L; var finished = false; - while (true) + while (!cancellationToken.IsCancellationRequested) { float progress; long filesprocessed; @@ -106,22 +107,22 @@ namespace Duplicati.CommandLine public void Dispose() { - if (m_thread != null) + if (m_task != null) { try { m_finishEvent.Set(); m_readyEvent.Set(); - if (m_thread != null && m_thread.IsAlive) + if (m_task != null) { - m_thread.Interrupt(); - m_thread.Join(500); + m_cancellationTokenSource.Cancel(); + m_task.Wait(500); } } finally { - m_thread = null; + m_task = null; } } } From b400be18dac61d8c910d04164613ba0ab570c71c Mon Sep 17 00:00:00 2001 From: Kenneth Hsu Date: Thu, 27 May 2021 15:47:10 -0700 Subject: [PATCH 170/253] Add GitHub workflow to run tests using .NET 5. This fixes #4537. --- .github/workflows/tests.yml | 71 +++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 000000000..681d74b7c --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,71 @@ +name: Tests + +on: + push: + branches: "*" + pull_request: + branches: "*" + +jobs: + unit_tests: + name: Unit tests + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest, windows-latest, macos-latest ] + + steps: + - name: Set up .NET + uses: actions/setup-dotnet@v1.8.0 + with: + dotnet-version: 5.0.x + + - name: Checkout source + uses: actions/checkout@v2.3.4 + + - name: Restore NuGet dependencies + run: dotnet restore Duplicati.sln + + - name: Build Duplicati + run: dotnet build --no-restore Duplicati.sln + + - name: Run unit tests + run: dotnet test --no-build --verbosity minimal Duplicati.sln + + ui_tests: + name: UI tests + runs-on: ubuntu-latest + + # Some of these steps duplicate those in the unit_tests job above. This + # can be cleaned up using a composite run steps action once it supports + # what we need (https://github.com/actions/runner/issues/646). + steps: + - name: Set up .NET + uses: actions/setup-dotnet@v1.8.0 + with: + dotnet-version: 5.0.x + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.x + + - name: Install dependencies + run: | + pip3 install selenium + pip3 install --upgrade urllib3 + + - name: Checkout source + uses: actions/checkout@v2.3.4 + + - name: Restore NuGet dependencies + run: dotnet restore Duplicati.sln + + - name: Build Duplicati + run: dotnet build --no-restore -p:DefineConstants=ENABLE_GTK Duplicati.sln + + - name: Run UI tests + run: | + ./Executables/net5/Duplicati.Server/bin/Debug/net5.0/Duplicati.Server & + python3 guiTests/guiTest.py From 895ab357a77cba4a52eb028c344488a5db51640e Mon Sep 17 00:00:00 2001 From: Kenneth Hsu Date: Mon, 28 Jun 2021 10:19:20 -0700 Subject: [PATCH 171/253] Restrict branch in GitHub test workflow. --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 681d74b7c..6e760b638 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,9 @@ name: Tests on: push: - branches: "*" + branches: "experiment/net5-split" pull_request: - branches: "*" + branches: "experiment/net5-split" jobs: unit_tests: From 29b1b7097c0d226efbf83bf42e569cda2272e35d Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 1 Mar 2022 20:26:40 -0800 Subject: [PATCH 172/253] Try freebsd build --- .github/workflows/freebsd.yml | 63 +++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .github/workflows/freebsd.yml diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml new file mode 100644 index 000000000..d60a3a50b --- /dev/null +++ b/.github/workflows/freebsd.yml @@ -0,0 +1,63 @@ +name: Freebsd Artifacts + +on: + push: + branches: [ feature/net5-freebsd ] + pull_request: + branches: [ feature/net5-freebsd ] + +jobs: + zip: + runs-on: macos-10.15 + steps: + - uses: actions/checkout@v2 + - name: Build native FreeBSD lib + id: test + uses: vmactions/freebsd-vm@v0.1.5 + with: + usesh: true + sync: sshfs + prepare: pkg install -y curl libinotify git cmake ninja bash + run: | + pwd + ls -lah + whoami + env + freebsd-version + # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz + # See also https://github.com/sec/dotnet-core-freebsd-source-build + # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild + wget http://bit.ly/3hceESr + tar -xzf 3hceESr + dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln + - name: Save Artifacts + uses: actions/upload-artifact@v2 + with: + name: duplicati-freebsd-x64 + path: publish + tests: + runs-on: macos-10.15 + steps: + - uses: actions/checkout@v2 + - name: Build native FreeBSD lib + id: test + uses: vmactions/freebsd-vm@v0.1.5 + with: + usesh: true + sync: sshfs + prepare: pkg install -y curl libinotify git cmake ninja bash + run: | + pwd + ls -lah + whoami + env + freebsd-version + # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz + # See also https://github.com/sec/dotnet-core-freebsd-source-build + # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild + wget http://bit.ly/3hceESr + tar -xzf 3hceESr + dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln + dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln From 2efb2543e14fde717a212ac02485cb19b8a6ace5 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 1 Mar 2022 20:38:35 -0800 Subject: [PATCH 173/253] install wget --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index d60a3a50b..0c68df231 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -17,7 +17,7 @@ jobs: with: usesh: true sync: sshfs - prepare: pkg install -y curl libinotify git cmake ninja bash + prepare: pkg install -y curl libinotify git cmake ninja bash wget run: | pwd ls -lah @@ -46,7 +46,7 @@ jobs: with: usesh: true sync: sshfs - prepare: pkg install -y curl libinotify git cmake ninja bash + prepare: pkg install -y curl libinotify git cmake ninja bash wget run: | pwd ls -lah From e898ea0745f1117dfdd371e3a03a9a684e15836b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 1 Mar 2022 21:10:27 -0800 Subject: [PATCH 174/253] Download outside vm --- .github/workflows/freebsd.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 0c68df231..c70e2a190 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -11,6 +11,11 @@ jobs: runs-on: macos-10.15 steps: - uses: actions/checkout@v2 + - name: Download dotnet + # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz + # See also https://github.com/sec/dotnet-core-freebsd-source-build + # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild + run: curl http://bit.ly/3hceESr -o dn.tgz - name: Build native FreeBSD lib id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -24,11 +29,7 @@ jobs: whoami env freebsd-version - # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz - # See also https://github.com/sec/dotnet-core-freebsd-source-build - # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - wget http://bit.ly/3hceESr - tar -xzf 3hceESr + tar -xzf dn.tgz dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts @@ -40,6 +41,11 @@ jobs: runs-on: macos-10.15 steps: - uses: actions/checkout@v2 + - name: Download dotnet + # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz + # See also https://github.com/sec/dotnet-core-freebsd-source-build + # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild + run: curl http://bit.ly/3hceESr -o dn.tgz - name: Build native FreeBSD lib id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -53,11 +59,7 @@ jobs: whoami env freebsd-version - # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz - # See also https://github.com/sec/dotnet-core-freebsd-source-build - # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - wget http://bit.ly/3hceESr - tar -xzf 3hceESr + tar -xzf dn.tgz dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln From 10a57b9b5f3315bab9eb1709dbb3a163ec0f4ffb Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 1 Mar 2022 21:27:42 -0800 Subject: [PATCH 175/253] Follow redirects --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index c70e2a190..7f9999844 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -15,7 +15,7 @@ jobs: # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl http://bit.ly/3hceESr -o dn.tgz + run: curl -L http://bit.ly/3hceESr -o dn.tgz - name: Build native FreeBSD lib id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -45,7 +45,7 @@ jobs: # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl http://bit.ly/3hceESr -o dn.tgz + run: curl -L http://bit.ly/3hceESr -o dn.tgz - name: Build native FreeBSD lib id: test uses: vmactions/freebsd-vm@v0.1.5 From 692391bd3e4339bdb8c78b47783dcbd2e2e4c9e6 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 07:47:20 -0800 Subject: [PATCH 176/253] tmp --- .github/workflows/freebsd.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 7f9999844..bac22b932 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -29,9 +29,12 @@ jobs: whoami env freebsd-version + pushd /tmp + mkdir dn tar -xzf dn.tgz - dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln - dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln + popd + /tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + /tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: @@ -59,7 +62,10 @@ jobs: whoami env freebsd-version + pushd /tmp + mkdir dn tar -xzf dn.tgz - dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln - dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln - dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln + popd + /tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + /tmp/dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln + /tmp/dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln From d7d9054f36ed8a48edfabc1c2861ef843a963c27 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 08:00:26 -0800 Subject: [PATCH 177/253] var tmp --- .github/workflows/freebsd.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index bac22b932..9451c551c 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -29,12 +29,13 @@ jobs: whoami env freebsd-version - pushd /tmp + pushd /var/tmp mkdir dn + cd dn tar -xzf dn.tgz popd - /tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln - /tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln + /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: @@ -62,10 +63,11 @@ jobs: whoami env freebsd-version - pushd /tmp + pushd /var/tmp mkdir dn + cd dn tar -xzf dn.tgz popd - /tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln - /tmp/dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln - /tmp/dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln From 6498c32a9765aa5e53eee7ab7a2c874d38a904ce Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 08:14:00 -0800 Subject: [PATCH 178/253] No bashisms --- .github/workflows/freebsd.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 9451c551c..05acae12b 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -29,11 +29,12 @@ jobs: whoami env freebsd-version - pushd /var/tmp + BUILD_DIR=`pwd` + cd /var/tmp mkdir dn cd dn - tar -xzf dn.tgz - popd + tar -xzf ${BUILD_DIR}/dn.tgz + cd ${BUILD_DIR} /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts @@ -63,11 +64,12 @@ jobs: whoami env freebsd-version - pushd /var/tmp + BUILD_DIR=`pwd` + cd /var/tmp mkdir dn cd dn - tar -xzf dn.tgz - popd + tar -xzf ${BUILD_DIR}/dn.tgz + cd ${BUILD_DIR} /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln /var/tmp/dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln /var/tmp/dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln From 6dafc9123939d2930c6b9c3472103fb4b0377e3e Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 08:33:39 -0800 Subject: [PATCH 179/253] libunwind --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 05acae12b..6b7cf93a1 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -22,7 +22,7 @@ jobs: with: usesh: true sync: sshfs - prepare: pkg install -y curl libinotify git cmake ninja bash wget + prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget run: | pwd ls -lah @@ -57,7 +57,7 @@ jobs: with: usesh: true sync: sshfs - prepare: pkg install -y curl libinotify git cmake ninja bash wget + prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget run: | pwd ls -lah From c2880f517b6078cf3c85a8296e759ecaffafcbaf Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 17:40:34 -0800 Subject: [PATCH 180/253] icu --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 6b7cf93a1..abced05fa 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -22,7 +22,7 @@ jobs: with: usesh: true sync: sshfs - prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget + prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget icu run: | pwd ls -lah @@ -57,7 +57,7 @@ jobs: with: usesh: true sync: sshfs - prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget + prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget icu run: | pwd ls -lah From 15256c70ef029c73f6e0c29ed3a04c1b66e09e3e Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 18:42:42 -0800 Subject: [PATCH 181/253] comments --- .github/workflows/freebsd.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index abced05fa..7fe6a6f7f 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -33,8 +33,11 @@ jobs: cd /var/tmp mkdir dn cd dn + echo Unpacking .NET tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + echo Nuget Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts @@ -68,8 +71,13 @@ jobs: cd /var/tmp mkdir dn cd dn + echo Unpacking .NET tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + echo Nuget Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + echo Building /var/tmp/dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln + echo Testing /var/tmp/dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln From ea16150d4fde2db4a3ced3b90c977b22e14ff932 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 19:47:56 -0800 Subject: [PATCH 182/253] Native nupkgs --- .github/workflows/freebsd.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 7fe6a6f7f..83d5dde99 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -36,6 +36,11 @@ jobs: echo Unpacking .NET tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} + mkdir /var/tmp/nuget + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg + /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln @@ -74,6 +79,11 @@ jobs: echo Unpacking .NET tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} + mkdir /var/tmp/nuget + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg + /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln From 95ae2fdd19a55ad5f2a4ea93c0c5b1200b5a3463 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 20:27:39 -0800 Subject: [PATCH 183/253] sdk fixups --- .github/workflows/freebsd.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 83d5dde99..9f91da853 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -44,6 +44,7 @@ jobs: export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet build-server shutdown /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 @@ -87,7 +88,9 @@ jobs: export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet build-server shutdown echo Building - /var/tmp/dn/dotnet build --no-restore --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet build --no-restore Duplicati.sln + /var/tmp/dn/dotnet build-server shutdown echo Testing - /var/tmp/dn/dotnet test --no-build --verbosity normal --runtime=freebsd-x64 Duplicati.sln + /var/tmp/dn/dotnet test --no-build --verbosity normal Duplicati.sln From 437f3733731d4ffdd23c6b3984318487618bb694 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 20:46:56 -0800 Subject: [PATCH 184/253] 5.0.9 --- .github/workflows/freebsd.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 9f91da853..4ac5b1bfa 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -12,10 +12,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: Download dotnet - # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L http://bit.ly/3hceESr -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/V5.0.9/dotnet-sdk-5.0.400-freebsd-x64.tar.gz -o dn.tgz - name: Build native FreeBSD lib id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -37,9 +36,10 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg + export VERSION=5.0.9 + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore @@ -56,10 +56,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: Download dotnet - # http://bit.ly/3hceESr = dotnet-sdk-5.0.203-freebsd-x64.tar.gz # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L http://bit.ly/3hceESr -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/V5.0.9/dotnet-sdk-5.0.400-freebsd-x64.tar.gz -o dn.tgz - name: Build native FreeBSD lib id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -81,9 +80,10 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.5.0.6.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.5.0.6.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v5.0.6/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.5.0.6.nupkg + export VERSION=5.0.9 + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore From 996f508e3ae3279f135f0d1a5af330261e50d12d Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 21:07:08 -0800 Subject: [PATCH 185/253] Capitalization --- .github/workflows/freebsd.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 4ac5b1bfa..e9a3ed75d 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -36,10 +36,11 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget + export RVERSION=V5.0.9 export VERSION=5.0.9 - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore @@ -80,10 +81,11 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget + export RVERSION=V5.0.9 export VERSION=5.0.9 - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg - curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v${VERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Nuget Restore From 3ce9965c19b2782119d307693c2ef207800198f8 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 21:12:17 -0800 Subject: [PATCH 186/253] Try bash --- .github/workflows/freebsd.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index e9a3ed75d..6d4b1d67f 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -23,6 +23,9 @@ jobs: sync: sshfs prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget icu run: | + #!/bin/bash + set -x + set -e pwd ls -lah whoami @@ -68,6 +71,9 @@ jobs: sync: sshfs prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget icu run: | + #!/bin/bash + set -x + set -e pwd ls -lah whoami From f5ef2d0ba25c06aa0a59f4eccbd7720e4afb0f1c Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 2 Mar 2022 21:23:19 -0800 Subject: [PATCH 187/253] Do everything in one command To avoid file in use error --- .github/workflows/freebsd.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 6d4b1d67f..8cf041a5e 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -46,9 +46,6 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 - echo Nuget Restore - /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln - /var/tmp/dn/dotnet build-server shutdown /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 @@ -94,11 +91,5 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 - echo Nuget Restore - /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln - /var/tmp/dn/dotnet build-server shutdown - echo Building - /var/tmp/dn/dotnet build --no-restore Duplicati.sln - /var/tmp/dn/dotnet build-server shutdown echo Testing - /var/tmp/dn/dotnet test --no-build --verbosity normal Duplicati.sln + /var/tmp/dn/dotnet test --verbosity normal Duplicati.sln From a432b7fead46ad12af48746b3eb39de3dc902b0f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 19:26:53 -0800 Subject: [PATCH 188/253] move obj folder --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 8cf041a5e..4983d966f 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -46,7 +46,7 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 - /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln + /var/tmp/dn/dotnet publish -p:BaseIntermediateOutputPath=/var/tmp/obj -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: @@ -92,4 +92,4 @@ jobs: /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Testing - /var/tmp/dn/dotnet test --verbosity normal Duplicati.sln + /var/tmp/dn/dotnet test -p:BaseIntermediateOutputPath=/var/tmp/obj --verbosity normal Duplicati.sln From a8182b2c77db3ec8fb29e0aa9cce87a2fd0b613f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 19:43:01 -0800 Subject: [PATCH 189/253] ending slash --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 4983d966f..93243dff4 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -46,7 +46,7 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 - /var/tmp/dn/dotnet publish -p:BaseIntermediateOutputPath=/var/tmp/obj -c Release --runtime=freebsd-x64 -o publish Duplicati.sln + /var/tmp/dn/dotnet publish -p:BaseIntermediateOutputPath=/var/tmp/obj/ -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: @@ -92,4 +92,4 @@ jobs: /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Testing - /var/tmp/dn/dotnet test -p:BaseIntermediateOutputPath=/var/tmp/obj --verbosity normal Duplicati.sln + /var/tmp/dn/dotnet test -p:BaseIntermediateOutputPath=/var/tmp/obj/ --verbosity normal Duplicati.sln From 88955a480db5277c8379c3d68f00eb4810ec98ca Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 19:53:43 -0800 Subject: [PATCH 190/253] Test runtime --- .github/workflows/freebsd.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 93243dff4..e55df4365 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -1,5 +1,4 @@ -name: Freebsd Artifacts - +name: Freebsd on: push: branches: [ feature/net5-freebsd ] @@ -15,7 +14,7 @@ jobs: # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/V5.0.9/dotnet-sdk-5.0.400-freebsd-x64.tar.gz -o dn.tgz - - name: Build native FreeBSD lib + - name: Build id: test uses: vmactions/freebsd-vm@v0.1.5 with: @@ -60,7 +59,7 @@ jobs: # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/V5.0.9/dotnet-sdk-5.0.400-freebsd-x64.tar.gz -o dn.tgz - - name: Build native FreeBSD lib + - name: Run test id: test uses: vmactions/freebsd-vm@v0.1.5 with: @@ -92,4 +91,4 @@ jobs: /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 echo Testing - /var/tmp/dn/dotnet test -p:BaseIntermediateOutputPath=/var/tmp/obj/ --verbosity normal Duplicati.sln + /var/tmp/dn/dotnet test -p:BaseIntermediateOutputPath=/var/tmp/obj/ --runtime=freebsd-x64 --verbosity normal Duplicati.sln From d196e42780396430bbaa009251d3ab0bc62ddc66 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 20:24:15 -0800 Subject: [PATCH 191/253] Remove .net framework executables --- Duplicati.sln | 75 +-------------------------------------------------- 1 file changed, 1 insertion(+), 74 deletions(-) diff --git a/Duplicati.sln b/Duplicati.sln index 836ac8207..8bb2a2767 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -104,7 +104,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Encryptio EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoUpdater", "Duplicati\CommandLine\AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{4D1B198B-F773-44F2-872B-2B283053323C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.Backend.Storj", "Duplicati\Library\Backend\Storj\Duplicati.Library.Backend.Storj.csproj", "{E9AB8491-BD4C-4E4F-84C3-0BD551CC7489}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Storj", "Duplicati\Library\Backend\Storj\Duplicati.Library.Backend.Storj.csproj", "{E9AB8491-BD4C-4E4F-84C3-0BD551CC7489}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.Tardigrade", "Duplicati\Library\Backend\Tardigrade\Duplicati.Library.Backend.Tardigrade.csproj", "{11A8D03B-8CAE-4AD6-A5C6-E15D34DA2BDE}" ProjectSection(ProjectDependencies) = postProject @@ -139,28 +139,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.WindowsService", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine", "Executables\net5\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{0F5A1F4E-25FA-4D02-920D-CA2138498081}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net48", "net48", "{E858B0D8-ADA9-4288-8C46-1DF696E07046}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Service", "Executables\net48\Duplicati_Service\Duplicati.Service.csproj", "{6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine", "Executables\net48\Duplicati.CommandLine\Duplicati.CommandLine.csproj", "{7A51E705-9D09-434A-8E69-AA6B2C926BD1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.AutoUpdater", "Executables\net48\Duplicati.CommandLine.AutoUpdater\Duplicati.CommandLine.AutoUpdater.csproj", "{A0BF82B2-A742-4DD7-BF68-43967E763EF5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTester", "Executables\net48\Duplicati.CommandLine.BackendTester\Duplicati.CommandLine.BackendTester.csproj", "{1B392058-4534-4812-879C-17C548469558}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.BackendTool", "Executables\net48\Duplicati.CommandLine.BackendTool\Duplicati.CommandLine.BackendTool.csproj", "{F110D89E-23B9-4346-BAD9-BED352CF1CC9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.ConfigurationImporter", "Executables\net48\Duplicati.CommandLine.ConfigurationImporter\Duplicati.CommandLine.ConfigurationImporter.csproj", "{42876A0B-03DA-4149-9BEF-83372C15C699}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.CommandLine.RecoveryTool", "Executables\net48\Duplicati.CommandLine.RecoveryTool\Duplicati.CommandLine.RecoveryTool.csproj", "{F863361E-64E6-4602-ABAF-7300DF79E690}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.GUI.TrayIcon", "Executables\net48\Duplicati.GUI.TrayIcon\Duplicati.GUI.TrayIcon.csproj", "{BB8EFA2D-63AA-4629-87D5-460CC9439487}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Server", "Executables\net48\Duplicati.Server\Duplicati.Server.csproj", "{26BC9AEE-E156-4246-BFF8-21E3424DC4F7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.WindowsService", "Executables\net48\Duplicati.WindowsService\Duplicati.WindowsService.csproj", "{E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnixSupport", "Duplicati\UnixSupport\UnixSupport.csproj", "{2B605B81-353F-43CD-BF3A-29B3926A204F}" EndProject Global @@ -421,46 +399,6 @@ Global {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Debug|Any CPU.Build.0 = Debug|Any CPU {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F5A1F4E-25FA-4D02-920D-CA2138498081}.Release|Any CPU.Build.0 = Release|Any CPU - {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B}.Release|Any CPU.Build.0 = Release|Any CPU - {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A51E705-9D09-434A-8E69-AA6B2C926BD1}.Release|Any CPU.Build.0 = Release|Any CPU - {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0BF82B2-A742-4DD7-BF68-43967E763EF5}.Release|Any CPU.Build.0 = Release|Any CPU - {1B392058-4534-4812-879C-17C548469558}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B392058-4534-4812-879C-17C548469558}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B392058-4534-4812-879C-17C548469558}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B392058-4534-4812-879C-17C548469558}.Release|Any CPU.Build.0 = Release|Any CPU - {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F110D89E-23B9-4346-BAD9-BED352CF1CC9}.Release|Any CPU.Build.0 = Release|Any CPU - {42876A0B-03DA-4149-9BEF-83372C15C699}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42876A0B-03DA-4149-9BEF-83372C15C699}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42876A0B-03DA-4149-9BEF-83372C15C699}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42876A0B-03DA-4149-9BEF-83372C15C699}.Release|Any CPU.Build.0 = Release|Any CPU - {F863361E-64E6-4602-ABAF-7300DF79E690}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F863361E-64E6-4602-ABAF-7300DF79E690}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F863361E-64E6-4602-ABAF-7300DF79E690}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F863361E-64E6-4602-ABAF-7300DF79E690}.Release|Any CPU.Build.0 = Release|Any CPU - {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB8EFA2D-63AA-4629-87D5-460CC9439487}.Release|Any CPU.Build.0 = Release|Any CPU - {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {26BC9AEE-E156-4246-BFF8-21E3424DC4F7}.Release|Any CPU.Build.0 = Release|Any CPU - {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9}.Release|Any CPU.Build.0 = Release|Any CPU {2B605B81-353F-43CD-BF3A-29B3926A204F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2B605B81-353F-43CD-BF3A-29B3926A204F}.Debug|Any CPU.Build.0 = Debug|Any CPU {2B605B81-353F-43CD-BF3A-29B3926A204F}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -481,17 +419,6 @@ Global {55EEEBD2-CE45-45D6-9838-958F1C7354E4} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {5D20B150-C445-47BE-8CE8-C9F74F19A4F2} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {0F5A1F4E-25FA-4D02-920D-CA2138498081} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} - {E858B0D8-ADA9-4288-8C46-1DF696E07046} = {FA88A246-EF8E-46E3-90AF-539B8C0A6ADE} - {6C3CD6B6-2A2D-4266-AE16-5F24EA48844B} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {7A51E705-9D09-434A-8E69-AA6B2C926BD1} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {A0BF82B2-A742-4DD7-BF68-43967E763EF5} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {1B392058-4534-4812-879C-17C548469558} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {F110D89E-23B9-4346-BAD9-BED352CF1CC9} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {42876A0B-03DA-4149-9BEF-83372C15C699} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {F863361E-64E6-4602-ABAF-7300DF79E690} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {BB8EFA2D-63AA-4629-87D5-460CC9439487} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {26BC9AEE-E156-4246-BFF8-21E3424DC4F7} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} - {E7E7C3BF-9724-4DE9-A61B-87BE69A1A9D9} = {E858B0D8-ADA9-4288-8C46-1DF696E07046} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8B40BAFE-D862-4397-9495-8F5EAF5CE80C} From 0093561ec625cded12d6b83c053b535281ccb0a1 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 21:31:10 -0800 Subject: [PATCH 192/253] Update github actions --- .github/workflows/artifacts.yml | 4 +-- .github/workflows/ci.yml | 36 --------------------------- .github/workflows/freebsd.yml | 9 +++++-- .github/workflows/tests.yml | 43 ++++++--------------------------- 4 files changed, 16 insertions(+), 76 deletions(-) delete mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 35ef0a3cf..394fb6921 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -2,9 +2,9 @@ name: Artifacts on: push: - branches: [ net5 ] + branches: "**net5**" pull_request: - branches: [ net5 ] + branches: "**net5**" jobs: zip: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 269e09899..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Unit - -on: - push: - branches: [ net5 ] - pull_request: - branches: [ net5 ] - -jobs: - Tests: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ ubuntu-latest, windows-latest, macos-latest ] - - steps: - - uses: actions/checkout@v2 - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: 5.0.101 - - name: Restore dependencies - run: dotnet restore Duplicati.sln - - name: Build - run: dotnet build --no-restore Duplicati.sln - - name: Test - run: dotnet test --no-build --verbosity normal Duplicati.sln - - Selenium: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Selenium - run: pipeline/selenium/test.sh - \ No newline at end of file diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index e55df4365..c5f13b94f 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -1,9 +1,9 @@ name: Freebsd on: push: - branches: [ feature/net5-freebsd ] + branches: "**net5**" pull_request: - branches: [ feature/net5-freebsd ] + branches: "**net5**" jobs: zip: @@ -45,6 +45,9 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 + echo Restore + /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + echo Publish /var/tmp/dn/dotnet publish -p:BaseIntermediateOutputPath=/var/tmp/obj/ -c Release --runtime=freebsd-x64 -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 @@ -90,5 +93,7 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ export DOTNET_CLI_TELEMETRY_OPTOUT=1 + echo Restore + /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Testing /var/tmp/dn/dotnet test -p:BaseIntermediateOutputPath=/var/tmp/obj/ --runtime=freebsd-x64 --verbosity normal Duplicati.sln diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6e760b638..1d05db34e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,9 @@ name: Tests on: push: - branches: "experiment/net5-split" + branches: "**net5**" pull_request: - branches: "experiment/net5-split" + branches: "**net5**" jobs: unit_tests: @@ -33,39 +33,10 @@ jobs: - name: Run unit tests run: dotnet test --no-build --verbosity minimal Duplicati.sln - ui_tests: - name: UI tests + selenium: runs-on: ubuntu-latest - - # Some of these steps duplicate those in the unit_tests job above. This - # can be cleaned up using a composite run steps action once it supports - # what we need (https://github.com/actions/runner/issues/646). steps: - - name: Set up .NET - uses: actions/setup-dotnet@v1.8.0 - with: - dotnet-version: 5.0.x - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.x - - - name: Install dependencies - run: | - pip3 install selenium - pip3 install --upgrade urllib3 - - - name: Checkout source - uses: actions/checkout@v2.3.4 - - - name: Restore NuGet dependencies - run: dotnet restore Duplicati.sln - - - name: Build Duplicati - run: dotnet build --no-restore -p:DefineConstants=ENABLE_GTK Duplicati.sln - - - name: Run UI tests - run: | - ./Executables/net5/Duplicati.Server/bin/Debug/net5.0/Duplicati.Server & - python3 guiTests/guiTest.py + - uses: actions/checkout@v2 + - name: Selenium + run: pipeline/selenium/test.sh + From 26dea45698929802385d3fafc2a4e5cd073e3442 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 21:50:24 -0800 Subject: [PATCH 193/253] Fix bad merge of firefox options --- guiTests/guiTest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiTests/guiTest.py b/guiTests/guiTest.py index 34ae60466..8290e64e1 100644 --- a/guiTests/guiTest.py +++ b/guiTests/guiTest.py @@ -15,8 +15,8 @@ print("Using LOCAL webdriver") profile = webdriver.FirefoxProfile() profile.set_preference("intl.accept_languages", "en") options = Options() -options.set_headless(headless=True) -driver = webdriver.Firefox(profile, firefox_options=options) +options.headless = True +driver = webdriver.Firefox(profile, options=options) def write_random_file(size, filename): if not os.path.exists(os.path.dirname(filename)): From 1a5cca1bf744f18f980dff874d79e04ff567b81d Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 21:56:58 -0800 Subject: [PATCH 194/253] Fix extracting version for installers --- Executables/net5/Duplicati.Server/Duplicati.Server.csproj | 1 + Installer/Windows/MSI/build.sh | 2 +- Installer/debian/build.sh | 2 +- Installer/fedora/build.sh | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Executables/net5/Duplicati.Server/Duplicati.Server.csproj b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj index c87e770eb..1857a5870 100644 --- a/Executables/net5/Duplicati.Server/Duplicati.Server.csproj +++ b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj @@ -6,6 +6,7 @@ LGPL, Copyright © Duplicati Team 2021 The Server Duplicati implementation Duplicati.Server + 3.0.0.0 diff --git a/Installer/Windows/MSI/build.sh b/Installer/Windows/MSI/build.sh index 5265bf030..a0498f4bd 100644 --- a/Installer/Windows/MSI/build.sh +++ b/Installer/Windows/MSI/build.sh @@ -3,7 +3,7 @@ SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) -VERSION=`grep '' < $SCRIPTDIR/../../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\([^\.]*\.[^\.]*\.[^\.]*\).*<\/Version>.*/\1/'` +VERSION=`grep '' < $SCRIPTDIR/../../../Executables/net5/Duplicati.Server/Duplicati.Server.csproj | sed 's/.*\([^\.]*\.[^\.]*\.[^\.]*\).*<\/Version>.*/\1/'` VERSION=${VERSION//$'\r\n'} echo "Building version: ($VERSION)" diff --git a/Installer/debian/build.sh b/Installer/debian/build.sh index 7d49c98c3..d4ce97805 100755 --- a/Installer/debian/build.sh +++ b/Installer/debian/build.sh @@ -5,7 +5,7 @@ SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) docker build $SCRIPTDIR/docker -t duplicati-debian -VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>.*/\1/'` +VERSION=`grep '' < $SCRIPTDIR/../../Executables/net5/Duplicati.Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>.*/\1/'` VERSION=${VERSION//$'\r\n'} echo "Building version: ($VERSION)" diff --git a/Installer/fedora/build.sh b/Installer/fedora/build.sh index 8365e6f18..5a2b1549a 100755 --- a/Installer/fedora/build.sh +++ b/Installer/fedora/build.sh @@ -5,9 +5,9 @@ SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) docker build $SCRIPTDIR/docker -t duplicati-fedora -VERSION=`grep '' < $SCRIPTDIR/../../Duplicati/Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>.*/\1/'` +VERSION=`grep '' < $SCRIPTDIR/../../Executables/net5/Duplicati.Server/Duplicati.Server.csproj | sed 's/.*\(.*\)<\/Version>.*/\1/'` VERSION=${VERSION//$'\r\n'} echo "Building version: ($VERSION)" export MSYS_NO_PATHCONV=1 -docker run --rm -eVERSION=$VERSION -v $SCRIPTDIR/../../:/sources duplicati-fedora \ No newline at end of file +docker run --rm -eVERSION=$VERSION -v $SCRIPTDIR/../../:/sources duplicati-fedora \ No newline at end of file From db30c5df85aaee9fe40bd4a1d76cf25f476813f1 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 22:11:17 -0800 Subject: [PATCH 195/253] Try to get freebsd to play nice --- .github/workflows/freebsd.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index c5f13b94f..bac0b85e9 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -30,6 +30,8 @@ jobs: whoami env freebsd-version + + export DOTNET_CLI_TELEMETRY_OPTOUT=1 BUILD_DIR=`pwd` cd /var/tmp mkdir dn @@ -44,11 +46,14 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ - export DOTNET_CLI_TELEMETRY_OPTOUT=1 + + cp -R `pwd` /var/tmp/build + cd /var/tmp/build + echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Publish - /var/tmp/dn/dotnet publish -p:BaseIntermediateOutputPath=/var/tmp/obj/ -c Release --runtime=freebsd-x64 -o publish Duplicati.sln + /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o ${BUILD_DIR}/publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 with: @@ -78,6 +83,8 @@ jobs: whoami env freebsd-version + + export DOTNET_CLI_TELEMETRY_OPTOUT=1 BUILD_DIR=`pwd` cd /var/tmp mkdir dn @@ -92,8 +99,11 @@ jobs: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ - export DOTNET_CLI_TELEMETRY_OPTOUT=1 + + cp -R `pwd` /var/tmp/build + cd /var/tmp/build + echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Testing - /var/tmp/dn/dotnet test -p:BaseIntermediateOutputPath=/var/tmp/obj/ --runtime=freebsd-x64 --verbosity normal Duplicati.sln + /var/tmp/dn/dotnet test --runtime=freebsd-x64 --verbosity normal Duplicati.sln From 02f58d5186874e1df800a512800f37862eb4ed0f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 3 Mar 2022 22:32:56 -0800 Subject: [PATCH 196/253] Copy publish folder after finishing build --- .github/workflows/freebsd.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index bac0b85e9..f93d9ffc1 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -53,7 +53,9 @@ jobs: echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Publish - /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o ${BUILD_DIR}/publish Duplicati.sln + /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln + + cp -R ./publish ${BUILD_DIR}/publish - name: Save Artifacts uses: actions/upload-artifact@v2 with: From 80b19b9f8cf3e4383cc5304f1eae5ae48a41f0a5 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 4 Mar 2022 23:13:36 -0800 Subject: [PATCH 197/253] Try to add freebsd native lib packages --- .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 8 ++++++-- Duplicati/Library/SQLiteHelper/packages.config | 8 -------- Duplicati/UnixSupport/UnixSupport.csproj | 4 ++++ 3 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 Duplicati/Library/SQLiteHelper/packages.config diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index e9e19868f..27c980a60 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -4,7 +4,10 @@ netstandard2.0 LGPL, Copyright © Duplicati Team 2021 SQLiteHelper for Duplicati - + + https://staticwell.com/nuget/index.json + + @@ -19,7 +22,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + + diff --git a/Duplicati/Library/SQLiteHelper/packages.config b/Duplicati/Library/SQLiteHelper/packages.config deleted file mode 100644 index e88fdce35..000000000 --- a/Duplicati/Library/SQLiteHelper/packages.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Duplicati/UnixSupport/UnixSupport.csproj b/Duplicati/UnixSupport/UnixSupport.csproj index 59eaaf727..3a5395118 100644 --- a/Duplicati/UnixSupport/UnixSupport.csproj +++ b/Duplicati/UnixSupport/UnixSupport.csproj @@ -11,10 +11,14 @@ UnixSupport for Duplicati UnixSupport UnixSupport + + https://staticwell.com/nuget/index.json + + \ No newline at end of file From 7419df0979dec2c6d588717140516e4c47104067 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 5 Mar 2022 10:17:28 -0800 Subject: [PATCH 198/253] use nuget.config to add freebsd repository --- .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 3 --- Duplicati/UnixSupport/UnixSupport.csproj | 3 --- nuget.config | 6 ++++++ 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index 27c980a60..5654f2cb8 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -4,9 +4,6 @@ netstandard2.0 LGPL, Copyright © Duplicati Team 2021 SQLiteHelper for Duplicati - - https://staticwell.com/nuget/index.json - diff --git a/Duplicati/UnixSupport/UnixSupport.csproj b/Duplicati/UnixSupport/UnixSupport.csproj index 3a5395118..3657110e3 100644 --- a/Duplicati/UnixSupport/UnixSupport.csproj +++ b/Duplicati/UnixSupport/UnixSupport.csproj @@ -11,9 +11,6 @@ UnixSupport for Duplicati UnixSupport UnixSupport - - https://staticwell.com/nuget/index.json - diff --git a/nuget.config b/nuget.config index 397b203da..1b587ea8a 100644 --- a/nuget.config +++ b/nuget.config @@ -3,4 +3,10 @@ + + + + \ No newline at end of file From cd71fde1588c4172fcab082abeaf9936bcad5e88 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 8 Mar 2022 20:13:53 -0800 Subject: [PATCH 199/253] Go back to unmangled version --- .../SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index 5654f2cb8..ff68d95fc 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -19,8 +19,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + From eba9f4545ca0aa3cd064caf3d43631dc4681b9be Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 12 Mar 2022 20:28:49 -0800 Subject: [PATCH 200/253] More meesage for unit test --- Duplicati/UnitTest/BackendToolTests.cs | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Duplicati/UnitTest/BackendToolTests.cs b/Duplicati/UnitTest/BackendToolTests.cs index 6c4b17122..d617b5c71 100755 --- a/Duplicati/UnitTest/BackendToolTests.cs +++ b/Duplicati/UnitTest/BackendToolTests.cs @@ -14,7 +14,7 @@ namespace Duplicati.UnitTest [Test] [Category("BackendTool")] public void Get() - { + { // Files to create in MB. int[] fileSizes = {10, 20, 30}; foreach (int size in fileSizes) @@ -31,8 +31,8 @@ namespace Duplicati.UnitTest using (Controller c = new Controller(backendURL, options, null)) { var backupResults = c.Backup(new[] {DATAFOLDER}); - Assert.AreEqual(0, backupResults.Errors.Count()); - Assert.AreEqual(0, backupResults.Warnings.Count()); + Assert.AreEqual(0, backupResults.Errors.Count(), $"Errors: {String.Join(", ", backupResults.Errors)}"); + Assert.AreEqual(0, backupResults.Warnings.Count(), $"Warnings: {String.Join(", ", backupResults.Warnings)}"); } // Get the backend files using absolute paths @@ -41,8 +41,8 @@ namespace Duplicati.UnitTest foreach (var targetFile in Directory.GetFiles(TARGETFOLDER)) { // Absolute path - var downloadFileName = Path.Combine(absoluteDownloadFolder, Path.GetFileName(targetFile)); - var status = CommandLine.BackendTool.Program.RealMain(new[] { "GET", $"{backendURL}", $"{downloadFileName}" }); + var downloadFileName = Path.Combine(absoluteDownloadFolder, Path.GetFileName(targetFile)); + var status = CommandLine.BackendTool.Program.RealMain(new[] { "GET", $"{backendURL}", $"{downloadFileName}" }); Assert.AreEqual(0, status); Assert.IsTrue(File.Exists(downloadFileName)); TestUtils.AssertFilesAreEqual(targetFile, downloadFileName, false, downloadFileName); @@ -53,22 +53,22 @@ namespace Duplicati.UnitTest Directory.CreateDirectory(relativeDownloadFolder); var originalCurrentDirectory = Directory.GetCurrentDirectory(); Directory.SetCurrentDirectory(relativeDownloadFolder); - try - { - foreach (var targetFile in Directory.GetFiles(TARGETFOLDER)) - { - // Relative path - var downloadFileName = Path.GetFileName(targetFile); - var status = CommandLine.BackendTool.Program.RealMain(new[] { "GET", $"{backendURL}", $"{downloadFileName}" }); - Assert.AreEqual(0, status); - Assert.IsTrue(File.Exists(downloadFileName)); - TestUtils.AssertFilesAreEqual(targetFile, downloadFileName, false, downloadFileName); + try + { + foreach (var targetFile in Directory.GetFiles(TARGETFOLDER)) + { + // Relative path + var downloadFileName = Path.GetFileName(targetFile); + var status = CommandLine.BackendTool.Program.RealMain(new[] { "GET", $"{backendURL}", $"{downloadFileName}" }); + Assert.AreEqual(0, status); + Assert.IsTrue(File.Exists(downloadFileName)); + TestUtils.AssertFilesAreEqual(targetFile, downloadFileName, false, downloadFileName); } } finally - { + { Directory.SetCurrentDirectory(originalCurrentDirectory); } - } - } + } + } } \ No newline at end of file From 081502fc2a85b1a7de0a9a77df917669442044dc Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 12 Mar 2022 21:30:16 -0800 Subject: [PATCH 201/253] Logs Stop writing test data to home folder by default Store logs in github for inspection Be a little less verbose --- .github/workflows/freebsd.yml | 8 +++++++- Duplicati/UnitTest/BasicSetupHelper.cs | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index f93d9ffc1..a10d4e673 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -108,4 +108,10 @@ jobs: echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Testing - /var/tmp/dn/dotnet test --runtime=freebsd-x64 --verbosity normal Duplicati.sln + /var/tmp/dn/dotnet test --runtime=freebsd-x64 --verbosity minimal Duplicati.sln + - name: Archive Test Logs + if: always() + uses: actions/upload-artifact@v2 + with: + name: test-logs + path: Duplicati/UnitTest/bin/Debug/net5.0/duplicati_testdata/logfile.log \ No newline at end of file diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index accc49944..a65181542 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -32,7 +32,7 @@ namespace Duplicati.UnitTest /// protected static readonly string BASEFOLDER = string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("UNITTEST_BASEFOLDER")) - ? Path.Combine(Library.Utility.Utility.HOME_PATH, "duplicati_testdata") + ? "duplicati_testdata" : Environment.GetEnvironmentVariable("UNITTEST_BASEFOLDER"); /// From 7a4c7b36b8bf49b2a7fb68e588606f83b9ce06bb Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 12 Mar 2022 22:01:12 -0800 Subject: [PATCH 202/253] Change directory of unittest data in CI --- .github/workflows/freebsd.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index a10d4e673..cfb5d4f32 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -108,10 +108,11 @@ jobs: echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Testing + export UNITTEST_BASEFOLDER=${BUILD_DIR}/duplicati_testdata /var/tmp/dn/dotnet test --runtime=freebsd-x64 --verbosity minimal Duplicati.sln - name: Archive Test Logs if: always() uses: actions/upload-artifact@v2 with: name: test-logs - path: Duplicati/UnitTest/bin/Debug/net5.0/duplicati_testdata/logfile.log \ No newline at end of file + path: duplicati_testdata/logfile.log \ No newline at end of file From c2a3987f3ab50286ae660e81e82ff3d7a59e7310 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 12 Mar 2022 22:31:25 -0800 Subject: [PATCH 203/253] Symlink logs --- .github/workflows/freebsd.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index cfb5d4f32..dcadb0233 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -108,7 +108,11 @@ jobs: echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Testing - export UNITTEST_BASEFOLDER=${BUILD_DIR}/duplicati_testdata + mkdir ${BUILD_DIR}/duplicati_testdata + mkdir /var/tmp/duplicati_testdata + touch ${BUILD_DIR}/duplicati_testdata/logfile.log + ln -s ${BUILD_DIR}/duplicati_testdata/logfile.log /var/tmp/duplicati_testdata/logfile.log + export UNITTEST_BASEFOLDER=/var/tmp/duplicati_testdata /var/tmp/dn/dotnet test --runtime=freebsd-x64 --verbosity minimal Duplicati.sln - name: Archive Test Logs if: always() From dfd210125e9508d20b192a29371ff523746ab758 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 13 Mar 2022 10:02:13 -0700 Subject: [PATCH 204/253] Move logs to folder --- .github/workflows/freebsd.yml | 11 ++++++----- Duplicati/UnitTest/BasicSetupHelper.cs | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index dcadb0233..5f22ace07 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -52,6 +52,8 @@ jobs: echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln + echo Build + /var/tmp/dn/dotnet build Duplicati.sln echo Publish /var/tmp/dn/dotnet publish -c Release --runtime=freebsd-x64 -o publish Duplicati.sln @@ -108,10 +110,9 @@ jobs: echo Restore /var/tmp/dn/dotnet restore --runtime=freebsd-x64 Duplicati.sln echo Testing - mkdir ${BUILD_DIR}/duplicati_testdata - mkdir /var/tmp/duplicati_testdata - touch ${BUILD_DIR}/duplicati_testdata/logfile.log - ln -s ${BUILD_DIR}/duplicati_testdata/logfile.log /var/tmp/duplicati_testdata/logfile.log + mkdir -p ${BUILD_DIR}/duplicati_testdata/logs + mkdir -p /var/tmp/duplicati_testdata + ln -s ${BUILD_DIR}/duplicati_testdata/logs /var/tmp/duplicati_testdata/logs export UNITTEST_BASEFOLDER=/var/tmp/duplicati_testdata /var/tmp/dn/dotnet test --runtime=freebsd-x64 --verbosity minimal Duplicati.sln - name: Archive Test Logs @@ -119,4 +120,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: test-logs - path: duplicati_testdata/logfile.log \ No newline at end of file + path: duplicati_testdata/logs/logfile.log \ No newline at end of file diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index a65181542..4feeae112 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -52,7 +52,7 @@ namespace Duplicati.UnitTest /// /// The log file for manual examination /// - protected readonly string LOGFILE = Path.Combine(BASEFOLDER, "logfile.log"); + protected readonly string LOGFILE = Path.Combine(BASEFOLDER, "logs/logfile.log"); /// /// The database is fixed so it does not mess up the system where the test is performed /// From 20214f6c00a8241519076319d494b73acd407fa7 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 13 Mar 2022 10:22:32 -0700 Subject: [PATCH 205/253] Don't delete logs after test --- Duplicati/UnitTest/BasicSetupHelper.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index 4feeae112..01703b486 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -104,6 +104,10 @@ namespace Duplicati.UnitTest systemIO.DirectoryCreate(this.DATAFOLDER); systemIO.DirectoryCreate(this.TARGETFOLDER); systemIO.DirectoryCreate(this.RESTOREFOLDER); + if (systemIO.FileExists(this.LOGFILE)) + { + systemIO.FileDelete(this.LOGFILE); + } } [TearDown] @@ -121,10 +125,6 @@ namespace Duplicati.UnitTest { systemIO.DirectoryDelete(this.RESTOREFOLDER, true); } - if (systemIO.FileExists(this.LOGFILE)) - { - systemIO.FileDelete(this.LOGFILE); - } if (systemIO.FileExists(this.DBFILE)) { systemIO.FileDelete(this.DBFILE); From 71faeb9a0ef828a1c2b40637560438bdb55f2b96 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 14 Mar 2022 21:07:07 -0700 Subject: [PATCH 206/253] Try gzipping the logs --- .github/workflows/freebsd.yml | 2 +- Duplicati/UnitTest/BasicSetupHelper.cs | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 5f22ace07..4642c0d3e 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -120,4 +120,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: test-logs - path: duplicati_testdata/logs/logfile.log \ No newline at end of file + path: duplicati_testdata/logs/* \ No newline at end of file diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index 01703b486..12503c508 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -98,16 +98,14 @@ namespace Duplicati.UnitTest // No-op by default. } + private static int count = 1; + [SetUp] public virtual void SetUp() { systemIO.DirectoryCreate(this.DATAFOLDER); systemIO.DirectoryCreate(this.TARGETFOLDER); - systemIO.DirectoryCreate(this.RESTOREFOLDER); - if (systemIO.FileExists(this.LOGFILE)) - { - systemIO.FileDelete(this.LOGFILE); - } + systemIO.DirectoryCreate(this.RESTOREFOLDER); } [TearDown] @@ -133,6 +131,18 @@ namespace Duplicati.UnitTest { systemIO.FileDelete($"{this.DBFILE}-journal"); } + if (systemIO.FileExists(this.LOGFILE)) + { + var source = new System.IO.FileStream(this.LOGFILE, System.IO.FileMode.Open, System.IO.FileAccess.Read); + var dest = new System.IO.FileStream($"{this.LOGFILE}.{count++}.gz", System.IO.FileMode.Create, System.IO.FileAccess.Write); + var gzip = new System.IO.Compression.GZipStream(dest, System.IO.Compression.CompressionMode.Compress); + source.CopyTo(gzip); + gzip.Flush(); + source.Close(); + gzip.Close(); + dest.Close(); + systemIO.FileDelete(this.LOGFILE); + } } protected virtual Dictionary TestOptions From 06bca4b5d8f53befb97f1b26be5b5fbb66955734 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 10 Apr 2022 20:52:01 -0700 Subject: [PATCH 207/253] Try making test path absolute --- Duplicati/UnitTest/BasicSetupHelper.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index 12503c508..b379cb014 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -30,10 +30,11 @@ namespace Duplicati.UnitTest /// /// The base folder where all data is trashed around /// - protected static readonly string BASEFOLDER = + protected static readonly string BASEFOLDER = Path.GetFullPath( string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("UNITTEST_BASEFOLDER")) ? "duplicati_testdata" - : Environment.GetEnvironmentVariable("UNITTEST_BASEFOLDER"); + : Environment.GetEnvironmentVariable("UNITTEST_BASEFOLDER") + ); /// /// The folder path that serves as the backup destination From 02af15d4a40716cbba7b6a7616d1d57c2f63e964 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 12 Apr 2022 21:08:46 -0700 Subject: [PATCH 208/253] Try .net6 on freebsd --- .github/workflows/freebsd.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 4642c0d3e..49b34455e 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -13,7 +13,7 @@ jobs: - name: Download dotnet # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/V5.0.9/dotnet-sdk-5.0.400-freebsd-x64.tar.gz -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.100-rtm.21527.11/dotnet-sdk-6.0.100-freebsd-x64.tar.gz -o dn.tgz - name: Build id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -40,8 +40,8 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - export RVERSION=V5.0.9 - export VERSION=5.0.9 + export RVERSION=v6.0.100-rtm.21527.11 + export VERSION=6.0.0 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg @@ -70,7 +70,7 @@ jobs: - name: Download dotnet # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/V5.0.9/dotnet-sdk-5.0.400-freebsd-x64.tar.gz -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.100-rtm.21527.11/dotnet-sdk-6.0.100-freebsd-x64.tar.gz -o dn.tgz - name: Run test id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -97,8 +97,8 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - export RVERSION=V5.0.9 - export VERSION=5.0.9 + export RVERSION=v6.0.100-rtm.21527.11 + export VERSION=6.0.0 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg @@ -120,4 +120,4 @@ jobs: uses: actions/upload-artifact@v2 with: name: test-logs - path: duplicati_testdata/logs/* \ No newline at end of file + path: duplicati_testdata/logs/* From 8c518f7d3a63e1d4b0d44ff1cc8759d74359f058 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 12 Apr 2022 21:43:50 -0700 Subject: [PATCH 209/253] .net6 --- .gitattributes | 3 +- .github/workflows/artifacts.yml | 2 +- .github/workflows/tests.yml | 2 +- .../AutoUpdateBuilder.csproj | 2 +- .../DependencyFinder/DependencyFinder.csproj | 2 +- .../GnupgSigningTool/GnupgSigningTool.csproj | 2 +- .../UpdateVersionStamp.csproj | 2 +- ...Duplicati.CommandLine.BackendTester.csproj | 190 ++--- .../Duplicati.CommandLine.BackendTool.csproj | 160 ++-- .../CLI/Duplicati.CommandLine.csproj | 200 ++--- .../Duplicati.CommandLine.RecoveryTool.csproj | 174 ++--- .../Duplicati.Library.AutoUpdater.csproj | 70 +- ...cati.Library.Backend.AlternativeFTP.csproj | 52 +- ...uplicati.Library.Backend.CloudFiles.csproj | 42 +- .../FTP/Duplicati.Library.Backend.FTP.csproj | 46 +- .../Duplicati.Library.Backend.File.csproj | 42 +- .../Duplicati.Library.Backend.OneDrive.csproj | 54 +- .../S3/Duplicati.Library.Backend.S3.csproj | 60 +- .../Duplicati.Library.Backend.SSHv2.csproj | 54 +- ...uplicati.Library.Backend.SharePoint.csproj | 64 +- ...Duplicati.Library.Backend.TahoeLAFS.csproj | 52 +- .../Duplicati.Library.Backend.WEBDAV.csproj | 44 +- .../Common/Duplicati.Library.Common.csproj | 78 +- .../Duplicati.Library.Compression.csproj | 64 +- .../Duplicati.Library.DynamicLoader.csproj | 44 +- .../Duplicati.Library.Encryption.csproj | 50 +- .../Duplicati.Library.Interface.csproj | 38 +- .../Duplicati.Library.Localization.csproj | 54 +- .../Logging/Duplicati.Library.Logging.csproj | 28 +- .../Main/Duplicati.Library.Main.csproj | 126 ++-- .../Duplicati.Library.Modules.Builtin.csproj | 76 +- .../Duplicati.Library.SQLiteHelper.csproj | 52 +- .../Duplicati.Library.Snapshots.csproj | 80 +- .../Utility/Duplicati.Library.Utility.csproj | 52 +- Duplicati/License/Duplicati.License.csproj | 692 +++++++++--------- .../Duplicati.Server.Serialization.csproj | 40 +- Duplicati/Server/Duplicati.Server.csproj | 282 +++---- Duplicati/Service/Duplicati.Service.csproj | 40 +- Duplicati/Tools/Duplicati.Tools.csproj | 130 ++-- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 2 +- .../WindowsService/WindowsService.csproj | 60 +- .../Duplicati.CommandLine.AutoUpdater.csproj | 40 +- ...Duplicati.CommandLine.BackendTester.csproj | 42 +- .../Duplicati.CommandLine.BackendTool.csproj | 42 +- .../Duplicati.CommandLine.RecoveryTool.csproj | 42 +- .../Duplicati.Server/Duplicati.Server.csproj | 42 +- .../Duplicati.WindowsService.csproj | 42 +- .../Duplicati.Service.csproj | 40 +- .../Duplicati.CommandLine.AutoUpdater.csproj | 40 +- ...Duplicati.CommandLine.BackendTester.csproj | 42 +- .../Duplicati.CommandLine.BackendTool.csproj | 42 +- ...i.CommandLine.ConfigurationImporter.csproj | 2 +- .../Duplicati.CommandLine.RecoveryTool.csproj | 42 +- .../Duplicati.CommandLine.csproj | 2 +- .../Duplicati.GUI.TrayIcon.csproj | 2 +- .../Duplicati.Server/Duplicati.Server.csproj | 44 +- .../Duplicati.WindowsService.csproj | 42 +- .../Duplicati.Service.csproj | 40 +- .../UpdateVersion/UpdateVersion.csproj | 42 +- Tools/SQLiteTool/SQLiteTool.csproj | 50 +- Tools/ZipFileDebugger/ZipFileDebugger.csproj | 56 +- pipeline/linuxZip/docker/Dockerfile | 2 +- pipeline/selenium/docker/Dockerfile | 2 +- 63 files changed, 2024 insertions(+), 2023 deletions(-) diff --git a/.gitattributes b/.gitattributes index 159224359..33fcf131b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,5 @@ +*.csproj text *.sh text eol=lf #The #! in rules won't work if CRLF /Installer/debian/docker/debian/* text eol=lf -/Installer/fedora/*.sh text eol=lf \ No newline at end of file +/Installer/fedora/*.sh text eol=lf diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 394fb6921..e2ed81635 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -22,7 +22,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v1 with: - dotnet-version: 5.0.101 + dotnet-version: 6.0.x - name: Restore dependencies run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln - name: Package diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1d05db34e..77ce60a93 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,7 +19,7 @@ jobs: - name: Set up .NET uses: actions/setup-dotnet@v1.8.0 with: - dotnet-version: 5.0.x + dotnet-version: 6.0.x - name: Checkout source uses: actions/checkout@v2.3.4 diff --git a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj index acd98ecac..4d984a2e1 100644 --- a/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj +++ b/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2021 diff --git a/BuildTools/DependencyFinder/DependencyFinder.csproj b/BuildTools/DependencyFinder/DependencyFinder.csproj index 58bed04ec..83cabf9cb 100644 --- a/BuildTools/DependencyFinder/DependencyFinder.csproj +++ b/BuildTools/DependencyFinder/DependencyFinder.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2021 diff --git a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj index a478b97c3..f7d6338a4 100644 --- a/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj +++ b/BuildTools/GnupgSigningTool/GnupgSigningTool.csproj @@ -1,7 +1,7 @@ - net5.0 + net6.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2021 diff --git a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj index 72ea2d403..3749c72d0 100644 --- a/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj +++ b/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 2.0.0.7 LGPL, Copyright © Duplicati Team 2021 diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 6bbe7c7ab..fc20b9460 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -1,95 +1,95 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A backend debugging tool for Duplicati - Duplicati.CommandLine.BackendTester.Implementation - Duplicati.CommandLine.BackendTester - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A backend debugging tool for Duplicati + Duplicati.CommandLine.BackendTester.Implementation + Duplicati.CommandLine.BackendTester + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 297d6fae3..ebaab8c7f 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -1,80 +1,80 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Duplicati.CommandLine.BackendTool.Implementation - Duplicati.CommandLine.BackendTool - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.CommandLine.BackendTool.Implementation + Duplicati.CommandLine.BackendTool + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj index e74cf98bd..864bc196b 100644 --- a/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj @@ -1,101 +1,101 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A commandline version of Duplicati - Duplicati.CommandLine.Implementation - TrayWarning.ico - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A commandline version of Duplicati + Duplicati.CommandLine.Implementation + TrayWarning.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 074648ff4..c1948aa2d 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -1,87 +1,87 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - RecoveryTool for Duplicati - Duplicati.CommandLine.RecoveryTool.Implementation - Duplicati.CommandLine.RecoveryTooln - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + RecoveryTool for Duplicati + Duplicati.CommandLine.RecoveryTool.Implementation + Duplicati.CommandLine.RecoveryTooln + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj index 474ad660b..378082a01 100644 --- a/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj +++ b/Duplicati/Library/AutoUpdater/Duplicati.Library.AutoUpdater.csproj @@ -1,36 +1,36 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - AutoUpdater library for Duplicati - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + AutoUpdater library for Duplicati + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj index aa3121d96..384221a1f 100644 --- a/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj +++ b/Duplicati/Library/Backend/AlternativeFTP/Duplicati.Library.Backend.AlternativeFTP.csproj @@ -1,27 +1,27 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - An alternative FTP backend for Duplicati - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + An alternative FTP backend for Duplicati + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj index 35b4d9b0d..827e9ed43 100644 --- a/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj +++ b/Duplicati/Library/Backend/CloudFiles/Duplicati.Library.Backend.CloudFiles.csproj @@ -1,22 +1,22 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - CloudFiles backend for Duplicati - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + CloudFiles backend for Duplicati + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj index e2af3070a..2ff15c95b 100644 --- a/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj +++ b/Duplicati/Library/Backend/FTP/Duplicati.Library.Backend.FTP.csproj @@ -1,23 +1,23 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A FTP backend for Duplicati - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A FTP backend for Duplicati + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj index 06d0927ff..ac1045b11 100644 --- a/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj +++ b/Duplicati/Library/Backend/File/Duplicati.Library.Backend.File.csproj @@ -1,22 +1,22 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - File backend for Duplicati - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + File backend for Duplicati + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj index f6363f4b8..54a8c9400 100644 --- a/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj +++ b/Duplicati/Library/Backend/OneDrive/Duplicati.Library.Backend.OneDrive.csproj @@ -1,28 +1,28 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - OneDrive backend for Duplicati - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + OneDrive backend for Duplicati + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj index d2e9eda24..972233161 100644 --- a/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj +++ b/Duplicati/Library/Backend/S3/Duplicati.Library.Backend.S3.csproj @@ -1,31 +1,31 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - S3 backend for Duplicati - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + S3 backend for Duplicati + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj index b344dd394..0216289c4 100644 --- a/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj +++ b/Duplicati/Library/Backend/SSHv2/Duplicati.Library.Backend.SSHv2.csproj @@ -1,27 +1,27 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - SSHv2 backend for Duplicati - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + SSHv2 backend for Duplicati + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj index a37b67a58..5f8c6c600 100644 --- a/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj +++ b/Duplicati/Library/Backend/SharePoint/Duplicati.Library.Backend.SharePoint.csproj @@ -1,33 +1,33 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A SharePoint Online Backend for Duplicati (includes OneDrive for Business support) - - - - - - - - - - - - - - - - ..\..\..\..\thirdparty\SharePointPnP-Sites-Core\SharePointPnP.Client.dll - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A SharePoint Online Backend for Duplicati (includes OneDrive for Business support) + + + + + + + + + + + + + + + + ..\..\..\..\thirdparty\SharePointPnP-Sites-Core\SharePointPnP.Client.dll + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj index 099f37fd7..7b21981f4 100644 --- a/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj +++ b/Duplicati/Library/Backend/TahoeLAFS/Duplicati.Library.Backend.TahoeLAFS.csproj @@ -1,27 +1,27 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - TahoeLAFS backend for Duplicati - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + TahoeLAFS backend for Duplicati + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj index e447fab2a..f0bf373ac 100644 --- a/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj +++ b/Duplicati/Library/Backend/WEBDAV/Duplicati.Library.Backend.WEBDAV.csproj @@ -1,23 +1,23 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - WEBDAV backend for Duplicati - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + WEBDAV backend for Duplicati + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Common/Duplicati.Library.Common.csproj b/Duplicati/Library/Common/Duplicati.Library.Common.csproj index 776ba2a6e..e0129da45 100644 --- a/Duplicati/Library/Common/Duplicati.Library.Common.csproj +++ b/Duplicati/Library/Common/Duplicati.Library.Common.csproj @@ -1,39 +1,39 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Library.IO - - - - - - ..\..\..\thirdparty\alphafs\AlphaFS.dll - - - ..\..\..\thirdparty\alphavss\AlphaVSS.Common.dll - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Library.IO + + + + + + ..\..\..\thirdparty\alphafs\AlphaFS.dll + + + ..\..\..\thirdparty\alphavss\AlphaVSS.Common.dll + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj index de9d44c0e..820e3ca7b 100644 --- a/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj +++ b/Duplicati/Library/Compression/Duplicati.Library.Compression.csproj @@ -1,33 +1,33 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Compression implementation for Duplicati - - - - - - - - - ..\..\..\thirdparty\ManagedLZMA\managed-lzma.dll - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Compression implementation for Duplicati + + + + + + + + + ..\..\..\thirdparty\ManagedLZMA\managed-lzma.dll + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj index 52b1b1c43..58c825de9 100644 --- a/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj +++ b/Duplicati/Library/DynamicLoader/Duplicati.Library.DynamicLoader.csproj @@ -1,23 +1,23 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Dynamic Loader for Duplicati - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Dynamic Loader for Duplicati + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj index f350ee834..147cd2f1e 100644 --- a/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj +++ b/Duplicati/Library/Encryption/Duplicati.Library.Encryption.csproj @@ -1,26 +1,26 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Encryption implementation for Duplicati - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Encryption implementation for Duplicati + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj index 1c11a459d..52665cf78 100644 --- a/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj +++ b/Duplicati/Library/Interface/Duplicati.Library.Interface.csproj @@ -1,20 +1,20 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - The Duplicati library with all publicly exposed interfaces - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + The Duplicati library with all publicly exposed interfaces + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj index d8774b9f0..b2a01f864 100644 --- a/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj +++ b/Duplicati/Library/Localization/Duplicati.Library.Localization.csproj @@ -1,28 +1,28 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Localization implementation for Duplicati - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Localization implementation for Duplicati + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj index cf5de33ef..00dcde864 100644 --- a/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj +++ b/Duplicati/Library/Logging/Duplicati.Library.Logging.csproj @@ -1,15 +1,15 @@ - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A module for logging troubleshooting data - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A module for logging troubleshooting data + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Main/Duplicati.Library.Main.csproj b/Duplicati/Library/Main/Duplicati.Library.Main.csproj index 18d1ce246..d6b2338b2 100644 --- a/Duplicati/Library/Main/Duplicati.Library.Main.csproj +++ b/Duplicati/Library/Main/Duplicati.Library.Main.csproj @@ -1,64 +1,64 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - The main Duplicati implementation module - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + The main Duplicati implementation module + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj index 6c54e240c..56a881637 100644 --- a/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj +++ b/Duplicati/Library/Modules/Builtin/Duplicati.Library.Modules.Builtin.csproj @@ -1,39 +1,39 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Buildin modules for Duplicati - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Buildin modules for Duplicati + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj index ff68d95fc..7c07958cd 100644 --- a/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj +++ b/Duplicati/Library/SQLiteHelper/Duplicati.Library.SQLiteHelper.csproj @@ -1,26 +1,26 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - SQLiteHelper for Duplicati - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + SQLiteHelper for Duplicati + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + diff --git a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj index 29a894a43..e5863be6e 100644 --- a/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj +++ b/Duplicati/Library/Snapshots/Duplicati.Library.Snapshots.csproj @@ -1,41 +1,41 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A disk snapshot implementation for Duplicati - - - - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A disk snapshot implementation for Duplicati + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj index 5c399904c..ce326ad8f 100644 --- a/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj +++ b/Duplicati/Library/Utility/Duplicati.Library.Utility.csproj @@ -1,27 +1,27 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A collection of utility functions used extensively in Duplicati - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A collection of utility functions used extensively in Duplicati + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/License/Duplicati.License.csproj b/Duplicati/License/Duplicati.License.csproj index 1d33156dd..aa9b2debb 100644 --- a/Duplicati/License/Duplicati.License.csproj +++ b/Duplicati/License/Duplicati.License.csproj @@ -1,347 +1,347 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - A license text reader for Duplicati - - - - - licenses\alphavss\Homepage.txt - PreserveNewest - - - licenses\gpg\Homepage.txt - PreserveNewest - - - licenses\gpg\License.txt - PreserveNewest - - - licenses\Otp.NET\Homepage.txt - PreserveNewest - - - licenses\Otp.NET\license.txt - PreserveNewest - - - licenses\Otp.NET\licensedata.json - PreserveNewest - - - licenses\SharpCompress\download.txt - PreserveNewest - - - licenses\SharpCompress\License.txt - PreserveNewest - - - licenses\SQLite\Homepage.txt - PreserveNewest - - - licenses\SQLite\License.txt - PreserveNewest - - - licenses\Tencentyun\download.txt - - - licenses\Tencentyun\LICENSE.txt - - - licenses\TLSharp\Homepage.txt - - - licenses\TLSharp\License.txt - - - licenses\TLSharp\licensedata.json - - - licenses\uplink.NET\Homepage.txt - - - licenses\uplink.NET\license.txt - - - licenses\license.txt - PreserveNewest - - - PreserveNewest - - - PreserveNewest - licenses\SSH.NET\Homepage.txt - - - PreserveNewest - licenses\SSH.NET\License.txt - - - PreserveNewest - licenses\Json.NET\Homepage.txt - - - PreserveNewest - licenses\Json.NET\License.txt - - - licenses\alphavss\licensedata.json - PreserveNewest - - - licenses\AWSSDK\licensedata.json - PreserveNewest - - - licenses\AWSSDK\download.txt - PreserveNewest - - - licenses\AWSSDK\license.txt - PreserveNewest - - - licenses\gpg\licensedata.json - PreserveNewest - - - licenses\HttpServer\licensedata.json - PreserveNewest - - - licenses\HttpServer\Homepage.txt - PreserveNewest - - - licenses\HttpServer\license.txt - PreserveNewest - - - licenses\Json.NET\licensedata.json - PreserveNewest - - - licenses\ManagedLZMA\licensedata.json - PreserveNewest - - - licenses\ManagedLZMA\download.txt - PreserveNewest - - - licenses\ManagedLZMA\license.txt - PreserveNewest - - - licenses\MonoMac\licensedata.json - PreserveNewest - - - licenses\MonoMac\download.txt - PreserveNewest - - - licenses\MonoMac\license.txt - PreserveNewest - - - licenses\SQLite\licensedata.json - PreserveNewest - - - licenses\SSH.NET\licensedata.json - PreserveNewest - - - changelog.txt - PreserveNewest - - - licenses\WindowsAzure\download.txt - PreserveNewest - - - licenses\WindowsAzure\license.txt - PreserveNewest - - - licenses\WindowsAzure\licensedata.json - PreserveNewest - - - licenses\SharePointPnP-Sites-Core\download.txt - PreserveNewest - - - licenses\SharePointPnP-Sites-Core\license.txt - PreserveNewest - - - licenses\SharePointPnP-Sites-Core\licensedata.json - PreserveNewest - - - PreserveNewest - - - licenses\agsXMPP\download.txt - PreserveNewest - - - licenses\agsXMPP\license.txt - PreserveNewest - - - licenses\agsXMPP\licensedata.json - PreserveNewest - - - licenses\SharpAESCrypt\download.txt - PreserveNewest - - - licenses\SharpAESCrypt\License.txt - PreserveNewest - - - licenses\SharpAESCrypt\licensedata.json - PreserveNewest - - - licenses\MegaApi\Homepage.txt - PreserveNewest - - - licenses\MegaApi\licensedata.json - PreserveNewest - - - licenses\MegaApi\license.txt - PreserveNewest - - - licenses\AngularJS\Homepage.txt - PreserveNewest - - - licenses\AngularJS\License.txt - PreserveNewest - - - licenses\AngularJS\licensedata.json - PreserveNewest - - - licenses\jQuery\Homepage.txt - PreserveNewest - - - licenses\jQuery\License.txt - PreserveNewest - - - licenses\jQuery\licensedata.json - PreserveNewest - - - licenses\CoCoL\download.txt - PreserveNewest - - - licenses\CoCoL\license.txt - PreserveNewest - - - licenses\CoCoL\licensedata.json - PreserveNewest - - - licenses\rumps\download.txt - PreserveNewest - - - licenses\rumps\License.txt - PreserveNewest - - - licenses\rumps\licensedata.json - PreserveNewest - - - licenses\FluentFTP\Homepage.txt - PreserveNewest - - - licenses\FluentFTP\License.txt - PreserveNewest - - - licenses\FluentFTP\licensedata.json - PreserveNewest - - - licenses\MailKit\Homepage.txt - PreserveNewest - - - licenses\MailKit\license.txt - PreserveNewest - - - licenses\MailKit\licensedata.json - PreserveNewest - - - licenses\MimeKit\Homepage.txt - PreserveNewest - - - licenses\MimeKit\license.txt - PreserveNewest - - - licenses\MimeKit\licensedata.json - PreserveNewest - - - licenses\AngularGettext\Homepage.txt - PreserveNewest - - - licenses\AngularGettext\License.txt - PreserveNewest - - - licenses\AngularGettext\licensedata.json - PreserveNewest - - - licenses\SharpCompress\licensedata.json - PreserveNewest - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + A license text reader for Duplicati + + + + + licenses\alphavss\Homepage.txt + PreserveNewest + + + licenses\gpg\Homepage.txt + PreserveNewest + + + licenses\gpg\License.txt + PreserveNewest + + + licenses\Otp.NET\Homepage.txt + PreserveNewest + + + licenses\Otp.NET\license.txt + PreserveNewest + + + licenses\Otp.NET\licensedata.json + PreserveNewest + + + licenses\SharpCompress\download.txt + PreserveNewest + + + licenses\SharpCompress\License.txt + PreserveNewest + + + licenses\SQLite\Homepage.txt + PreserveNewest + + + licenses\SQLite\License.txt + PreserveNewest + + + licenses\Tencentyun\download.txt + + + licenses\Tencentyun\LICENSE.txt + + + licenses\TLSharp\Homepage.txt + + + licenses\TLSharp\License.txt + + + licenses\TLSharp\licensedata.json + + + licenses\uplink.NET\Homepage.txt + + + licenses\uplink.NET\license.txt + + + licenses\license.txt + PreserveNewest + + + PreserveNewest + + + PreserveNewest + licenses\SSH.NET\Homepage.txt + + + PreserveNewest + licenses\SSH.NET\License.txt + + + PreserveNewest + licenses\Json.NET\Homepage.txt + + + PreserveNewest + licenses\Json.NET\License.txt + + + licenses\alphavss\licensedata.json + PreserveNewest + + + licenses\AWSSDK\licensedata.json + PreserveNewest + + + licenses\AWSSDK\download.txt + PreserveNewest + + + licenses\AWSSDK\license.txt + PreserveNewest + + + licenses\gpg\licensedata.json + PreserveNewest + + + licenses\HttpServer\licensedata.json + PreserveNewest + + + licenses\HttpServer\Homepage.txt + PreserveNewest + + + licenses\HttpServer\license.txt + PreserveNewest + + + licenses\Json.NET\licensedata.json + PreserveNewest + + + licenses\ManagedLZMA\licensedata.json + PreserveNewest + + + licenses\ManagedLZMA\download.txt + PreserveNewest + + + licenses\ManagedLZMA\license.txt + PreserveNewest + + + licenses\MonoMac\licensedata.json + PreserveNewest + + + licenses\MonoMac\download.txt + PreserveNewest + + + licenses\MonoMac\license.txt + PreserveNewest + + + licenses\SQLite\licensedata.json + PreserveNewest + + + licenses\SSH.NET\licensedata.json + PreserveNewest + + + changelog.txt + PreserveNewest + + + licenses\WindowsAzure\download.txt + PreserveNewest + + + licenses\WindowsAzure\license.txt + PreserveNewest + + + licenses\WindowsAzure\licensedata.json + PreserveNewest + + + licenses\SharePointPnP-Sites-Core\download.txt + PreserveNewest + + + licenses\SharePointPnP-Sites-Core\license.txt + PreserveNewest + + + licenses\SharePointPnP-Sites-Core\licensedata.json + PreserveNewest + + + PreserveNewest + + + licenses\agsXMPP\download.txt + PreserveNewest + + + licenses\agsXMPP\license.txt + PreserveNewest + + + licenses\agsXMPP\licensedata.json + PreserveNewest + + + licenses\SharpAESCrypt\download.txt + PreserveNewest + + + licenses\SharpAESCrypt\License.txt + PreserveNewest + + + licenses\SharpAESCrypt\licensedata.json + PreserveNewest + + + licenses\MegaApi\Homepage.txt + PreserveNewest + + + licenses\MegaApi\licensedata.json + PreserveNewest + + + licenses\MegaApi\license.txt + PreserveNewest + + + licenses\AngularJS\Homepage.txt + PreserveNewest + + + licenses\AngularJS\License.txt + PreserveNewest + + + licenses\AngularJS\licensedata.json + PreserveNewest + + + licenses\jQuery\Homepage.txt + PreserveNewest + + + licenses\jQuery\License.txt + PreserveNewest + + + licenses\jQuery\licensedata.json + PreserveNewest + + + licenses\CoCoL\download.txt + PreserveNewest + + + licenses\CoCoL\license.txt + PreserveNewest + + + licenses\CoCoL\licensedata.json + PreserveNewest + + + licenses\rumps\download.txt + PreserveNewest + + + licenses\rumps\License.txt + PreserveNewest + + + licenses\rumps\licensedata.json + PreserveNewest + + + licenses\FluentFTP\Homepage.txt + PreserveNewest + + + licenses\FluentFTP\License.txt + PreserveNewest + + + licenses\FluentFTP\licensedata.json + PreserveNewest + + + licenses\MailKit\Homepage.txt + PreserveNewest + + + licenses\MailKit\license.txt + PreserveNewest + + + licenses\MailKit\licensedata.json + PreserveNewest + + + licenses\MimeKit\Homepage.txt + PreserveNewest + + + licenses\MimeKit\license.txt + PreserveNewest + + + licenses\MimeKit\licensedata.json + PreserveNewest + + + licenses\AngularGettext\Homepage.txt + PreserveNewest + + + licenses\AngularGettext\License.txt + PreserveNewest + + + licenses\AngularGettext\licensedata.json + PreserveNewest + + + licenses\SharpCompress\licensedata.json + PreserveNewest + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj index 3f924e161..3fac9c63b 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj +++ b/Duplicati/Server/Duplicati.Server.Serialization/Duplicati.Server.Serialization.csproj @@ -1,21 +1,21 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Serialization module for Duplicati - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Serialization module for Duplicati + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 4253a3e10..2248fb935 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -1,141 +1,141 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - The Server Duplicati implementation - Duplicati.Server.Implementation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\thirdparty\HttpServer\HttpServer.dll - - - - - - - - - - - Always - Always - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + The Server Duplicati implementation + Duplicati.Server.Implementation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\..\thirdparty\HttpServer\HttpServer.dll + + + + + + + + + + + Always + Always + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index 77c73281b..72ac037d3 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,21 +1,21 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Duplicati.Service.Implementation - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.Service.Implementation + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/Tools/Duplicati.Tools.csproj b/Duplicati/Tools/Duplicati.Tools.csproj index 1ba07522a..b7deee249 100644 --- a/Duplicati/Tools/Duplicati.Tools.csproj +++ b/Duplicati/Tools/Duplicati.Tools.csproj @@ -1,66 +1,66 @@ - - - - netstandard2.0 - - LGPL, Copyright © Duplicati Team 2021 - Dummy Tools copy library - - - - - utility-scripts\DuplicatiVerify.ps1 - PreserveNewest - - - utility-scripts\DuplicatiVerify.py - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - utility-scripts\pause-resume.py - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + + LGPL, Copyright © Duplicati Team 2021 + Dummy Tools copy library + + + + + utility-scripts\DuplicatiVerify.ps1 + PreserveNewest + + + utility-scripts\DuplicatiVerify.py + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + utility-scripts\pause-resume.py + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 4a24ee16f..404455c67 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 false false diff --git a/Duplicati/WindowsService/WindowsService.csproj b/Duplicati/WindowsService/WindowsService.csproj index 58d921991..ed7e0baaf 100644 --- a/Duplicati/WindowsService/WindowsService.csproj +++ b/Duplicati/WindowsService/WindowsService.csproj @@ -1,31 +1,31 @@ - - - - netstandard2.0 - LGPL, Copyright © Duplicati Team 2021 - Duplicati.WindowsService.Implementation - - - - - - - - - - Runner.cs - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.WindowsService.Implementation + + + + + + + + + + Runner.cs + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index 1c69409d5..cd7fb9ac8 100644 --- a/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Executables/net48/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -1,21 +1,21 @@ - - - - Exe - net48 - LGPL, Copyright © Duplicati Team 2021 - AutoUpdater tool for Duplicati - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + AutoUpdater tool for Duplicati + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj index d704d0857..52afbe81d 100644 --- a/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Executables/net48/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -1,22 +1,22 @@ - - - - Exe - net48 - LGPL, Copyright © Duplicati Team 2021 - A backend debugging tool for Duplicati - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + A backend debugging tool for Duplicati + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj index ec44fa040..d62f844e9 100644 --- a/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Executables/net48/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -1,22 +1,22 @@ - - - - Exe - net48 - LGPL, Copyright © Duplicati Team 2021 - Tool for file-level access to remote destinations - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + Tool for file-level access to remote destinations + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 30dd26ba8..00bae5287 100644 --- a/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Executables/net48/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -1,22 +1,22 @@ - - - - Exe - net48 - LGPL, Copyright © Duplicati Team 2021 - RecoveryTool for Duplicati - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + RecoveryTool for Duplicati + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.Server/Duplicati.Server.csproj b/Executables/net48/Duplicati.Server/Duplicati.Server.csproj index 005c812eb..7d7999728 100644 --- a/Executables/net48/Duplicati.Server/Duplicati.Server.csproj +++ b/Executables/net48/Duplicati.Server/Duplicati.Server.csproj @@ -1,22 +1,22 @@ - - - - Exe - net48 - LGPL, Copyright © Duplicati Team 2021 - The Server Duplicati implementation - Duplicati.Server - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + The Server Duplicati implementation + Duplicati.Server + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj b/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj index f0fedaa58..c0d954503 100644 --- a/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj +++ b/Executables/net48/Duplicati.WindowsService/Duplicati.WindowsService.csproj @@ -1,22 +1,22 @@ - - - - Exe - net48 - LGPL, Copyright © Duplicati Team 2021 - WindowsService for Duplicati - Duplicati.WindowsService - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + WindowsService for Duplicati + Duplicati.WindowsService + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net48/Duplicati_Service/Duplicati.Service.csproj b/Executables/net48/Duplicati_Service/Duplicati.Service.csproj index a7658fc77..367776447 100644 --- a/Executables/net48/Duplicati_Service/Duplicati.Service.csproj +++ b/Executables/net48/Duplicati_Service/Duplicati.Service.csproj @@ -1,21 +1,21 @@ - - - - Exe - net48 - LGPL, Copyright © Duplicati Team 2021 - Service controller for Duplicati - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net48 + LGPL, Copyright © Duplicati Team 2021 + Service controller for Duplicati + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj index e254cb1a0..9aabe8c38 100644 --- a/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj +++ b/Executables/net5/Duplicati.CommandLine.AutoUpdater/Duplicati.CommandLine.AutoUpdater.csproj @@ -1,21 +1,21 @@ - - - - Exe - net5.0 - LGPL, Copyright © Duplicati Team 2021 - AutoUpdater tool for Duplicati - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + LGPL, Copyright © Duplicati Team 2021 + AutoUpdater tool for Duplicati + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj index c69a8a191..85101f4d2 100644 --- a/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Executables/net5/Duplicati.CommandLine.BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -1,22 +1,22 @@ - - - - Exe - net5.0 - LGPL, Copyright © Duplicati Team 2021 - A backend debugging tool for Duplicati - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + LGPL, Copyright © Duplicati Team 2021 + A backend debugging tool for Duplicati + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj index 6f9403514..49a9b3630 100644 --- a/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Executables/net5/Duplicati.CommandLine.BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -1,22 +1,22 @@ - - - - Exe - net5.0 - LGPL, Copyright © Duplicati Team 2021 - Tool for file-level access to remote destinations - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + LGPL, Copyright © Duplicati Team 2021 + Tool for file-level access to remote destinations + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index 06811ba04..cea39d064 100644 --- a/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Executables/net5/Duplicati.CommandLine.ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 Configuration Import Tool for Duplicati diff --git a/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index b72482467..eae38e4ff 100644 --- a/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Executables/net5/Duplicati.CommandLine.RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -1,22 +1,22 @@ - - - - Exe - net5.0 - LGPL, Copyright © Duplicati Team 2021 - RecoveryTool for Duplicati - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + LGPL, Copyright © Duplicati Team 2021 + RecoveryTool for Duplicati + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj index c40ddb313..2f4b691c6 100644 --- a/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj +++ b/Executables/net5/Duplicati.CommandLine/Duplicati.CommandLine.csproj @@ -2,7 +2,7 @@ Exe - net5.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 Commandline implementation of Duplicati diff --git a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index b862e87ae..37a5b0c64 100644 --- a/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Executables/net5/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -2,7 +2,7 @@ WinExe - net5.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 The Duplicati Tray implementation ..\..\..\Duplicati\GUI\Duplicati.GUI.TrayIcon\Duplicati.ico diff --git a/Executables/net5/Duplicati.Server/Duplicati.Server.csproj b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj index 1857a5870..4473f50ee 100644 --- a/Executables/net5/Duplicati.Server/Duplicati.Server.csproj +++ b/Executables/net5/Duplicati.Server/Duplicati.Server.csproj @@ -1,23 +1,23 @@ - - - - Exe - net5.0 - LGPL, Copyright © Duplicati Team 2021 - The Server Duplicati implementation - Duplicati.Server - 3.0.0.0 - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + LGPL, Copyright © Duplicati Team 2021 + The Server Duplicati implementation + Duplicati.Server + 3.0.0.0 + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj b/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj index c7cb6a9f9..8d8ec11ec 100644 --- a/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj +++ b/Executables/net5/Duplicati.WindowsService/Duplicati.WindowsService.csproj @@ -1,22 +1,22 @@ - - - - Exe - net5.0 - LGPL, Copyright © Duplicati Team 2021 - WindowsService for Duplicati - Duplicati.WindowsService - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + LGPL, Copyright © Duplicati Team 2021 + WindowsService for Duplicati + Duplicati.WindowsService + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Executables/net5/Duplicati_Service/Duplicati.Service.csproj b/Executables/net5/Duplicati_Service/Duplicati.Service.csproj index 96feb1b5e..755d33e0a 100644 --- a/Executables/net5/Duplicati_Service/Duplicati.Service.csproj +++ b/Executables/net5/Duplicati_Service/Duplicati.Service.csproj @@ -1,21 +1,21 @@ - - - - net5.0 - Exe - LGPL, Copyright © Duplicati Team 2021 - Service controller for Duplicati - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + net6.0 + Exe + LGPL, Copyright © Duplicati Team 2021 + Service controller for Duplicati + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Installer/Windows/UpdateVersion/UpdateVersion.csproj b/Installer/Windows/UpdateVersion/UpdateVersion.csproj index 33f02c494..8d2a60039 100644 --- a/Installer/Windows/UpdateVersion/UpdateVersion.csproj +++ b/Installer/Windows/UpdateVersion/UpdateVersion.csproj @@ -1,22 +1,22 @@ - - - - netstandard2.0 - 2.0.0.7 - - LGPL, Copyright © Duplicati Team 2021 - UpdateVersion - UpdateVersion - Duplicati Team - UpdateVersion - UpdateVersion - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + netstandard2.0 + 2.0.0.7 + + LGPL, Copyright © Duplicati Team 2021 + UpdateVersion + UpdateVersion + Duplicati Team + UpdateVersion + UpdateVersion + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Tools/SQLiteTool/SQLiteTool.csproj b/Tools/SQLiteTool/SQLiteTool.csproj index 8dc5ee11a..6c33f1729 100644 --- a/Tools/SQLiteTool/SQLiteTool.csproj +++ b/Tools/SQLiteTool/SQLiteTool.csproj @@ -1,26 +1,26 @@ - - - - Exe - net5.0 - - 2.0.0.7 - LGPL, Copyright © Duplicati Team 2021 - Duplicati.Tools.SQLiteTool - Duplicati Team - Duplicati Team - SQLiteTool - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + + 2.0.0.7 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.Tools.SQLiteTool + Duplicati Team + Duplicati Team + SQLiteTool + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/Tools/ZipFileDebugger/ZipFileDebugger.csproj b/Tools/ZipFileDebugger/ZipFileDebugger.csproj index e7014b6ce..f8c24f046 100644 --- a/Tools/ZipFileDebugger/ZipFileDebugger.csproj +++ b/Tools/ZipFileDebugger/ZipFileDebugger.csproj @@ -1,29 +1,29 @@ - - - - Exe - net5.0 - - 2.0.0.7 - LGPL, Copyright © Duplicati Team 2021 - Duplicati.Tools.ZipFileDebugger - Duplicati Team - Duplicati Team - ZipFileDebugger - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + Exe + net6.0 + + 2.0.0.7 + LGPL, Copyright © Duplicati Team 2021 + Duplicati.Tools.ZipFileDebugger + Duplicati Team + Duplicati Team + ZipFileDebugger + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/pipeline/linuxZip/docker/Dockerfile b/pipeline/linuxZip/docker/Dockerfile index fd46d58e3..c1147db2c 100644 --- a/pipeline/linuxZip/docker/Dockerfile +++ b/pipeline/linuxZip/docker/Dockerfile @@ -5,7 +5,7 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y curl zip RUN curl -sL -o ~/packages-microsoft-prod.deb https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb RUN dpkg -i ~/packages-microsoft-prod.deb -RUN apt-get update && apt-get install -y dotnet-sdk-5.0 +RUN apt-get update && apt-get install -y dotnet-sdk-6.0 ADD runner.sh / CMD /runner.sh \ No newline at end of file diff --git a/pipeline/selenium/docker/Dockerfile b/pipeline/selenium/docker/Dockerfile index 0f2f6780d..8d9b72f8f 100644 --- a/pipeline/selenium/docker/Dockerfile +++ b/pipeline/selenium/docker/Dockerfile @@ -3,7 +3,7 @@ FROM selenium/standalone-firefox ENV DEBIAN_FRONTEND=noninteractive RUN wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O ~/packages-microsoft-prod.deb RUN sudo dpkg -i ~/packages-microsoft-prod.deb -RUN sudo apt-get update && sudo apt-get install -y python3-pip dotnet-sdk-5.0 +RUN sudo apt-get update && sudo apt-get install -y python3-pip dotnet-sdk-6.0 RUN pip3 install selenium ADD runner.sh / From 1af776a4d630331c0142a019dc39688af6766d07 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 12 Apr 2022 21:51:56 -0700 Subject: [PATCH 210/253] missed some .net6 --- Installer/debian/docker/Dockerfile | 2 +- Installer/debian/docker/debian/control | 2 +- Installer/fedora/docker/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Installer/debian/docker/Dockerfile b/Installer/debian/docker/Dockerfile index 4ed3afd41..84f50069c 100644 --- a/Installer/debian/docker/Dockerfile +++ b/Installer/debian/docker/Dockerfile @@ -14,7 +14,7 @@ RUN set -uex; \ RUN apt-get update && apt-get install -y curl RUN curl -sL -o ~/packages-microsoft-prod.deb https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb RUN dpkg -i ~/packages-microsoft-prod.deb -RUN apt-get update && apt-get install -y dotnet-sdk-5.0 +RUN apt-get update && apt-get install -y dotnet-sdk-6.0 ADD debian /deb/debian RUN chmod -x /deb/debian/duplicati.install diff --git a/Installer/debian/docker/debian/control b/Installer/debian/docker/debian/control index fc2efc922..077ac30b6 100644 --- a/Installer/debian/docker/debian/control +++ b/Installer/debian/docker/debian/control @@ -2,7 +2,7 @@ Source: duplicati Section: utils Priority: extra Maintainer: Kenneth Skovhede -Build-Depends: debhelper (>= 8.0.0), dotnet-sdk-5.0 +Build-Depends: debhelper (>= 8.0.0), dotnet-sdk-6.0 Standards-Version: 3.9.4 Homepage: http://www.duplicati.com Vcs-Git: https://github.com/duplicati/duplicati.git diff --git a/Installer/fedora/docker/Dockerfile b/Installer/fedora/docker/Dockerfile index e94c92208..f436cae29 100644 --- a/Installer/fedora/docker/Dockerfile +++ b/Installer/fedora/docker/Dockerfile @@ -9,7 +9,7 @@ RUN dnf -y upgrade #RUN curl --output /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/33/prod.repo RUN dnf check-update -RUN dnf -y --allowerasing install @"Minimal Install" @buildsys-build yum-utils rpm-sign gnupg rpmdevtools desktop-file-utils dos2unix dotnet-sdk-5.0 +RUN dnf -y --allowerasing install @"Minimal Install" @buildsys-build yum-utils rpm-sign gnupg rpmdevtools desktop-file-utils dos2unix dotnet-sdk-6.0 ADD buildroot /buildroot From 80de20b5572b8f4918268da7e72422092a4484b5 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 12 Apr 2022 22:02:34 -0700 Subject: [PATCH 211/253] More freebsd swap --- .github/workflows/freebsd.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 49b34455e..879e8bdc2 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -30,6 +30,14 @@ jobs: whoami env freebsd-version + df -h + dmesg | grep memory + swapinfo + dd if=/dev/zero of=/root/swap1 bs=1m count=2048 + chmod 0600 /root/swap1 + swapon /root/swap1 + df -h + swapinfo export DOTNET_CLI_TELEMETRY_OPTOUT=1 BUILD_DIR=`pwd` @@ -87,6 +95,14 @@ jobs: whoami env freebsd-version + df -h + dmesg | grep memory + swapinfo + dd if=/dev/zero of=/root/swap1 bs=1m count=2048 + chmod 0600 /root/swap1 + swapon /root/swap1 + df -h + swapinfo export DOTNET_CLI_TELEMETRY_OPTOUT=1 BUILD_DIR=`pwd` From d8fb30298d383e7387425619f82794c892d23ca1 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 12 Apr 2022 22:28:44 -0700 Subject: [PATCH 212/253] Swapfile hardmode --- .github/workflows/freebsd.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 879e8bdc2..83688aabd 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -35,7 +35,8 @@ jobs: swapinfo dd if=/dev/zero of=/root/swap1 bs=1m count=2048 chmod 0600 /root/swap1 - swapon /root/swap1 + mdconfig -a -t vnode -f /root/swap1 -u 0 + swapon /dev/md0 df -h swapinfo @@ -100,7 +101,8 @@ jobs: swapinfo dd if=/dev/zero of=/root/swap1 bs=1m count=2048 chmod 0600 /root/swap1 - swapon /root/swap1 + mdconfig -a -t vnode -f /root/swap1 -u 0 + swapon /dev/md0 df -h swapinfo From b3826237d553913e2fb8ed5b0c10b7b0b2274eeb Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 1 May 2022 22:14:39 -0700 Subject: [PATCH 213/253] Update unittest libs --- Duplicati/UnitTest/Duplicati.UnitTest.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index 404455c67..03c5c7b59 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -9,9 +9,9 @@ - - - + + + From 6d617f32fcf394da7d34cd7cbe55177859fde600 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 1 May 2022 22:15:44 -0700 Subject: [PATCH 214/253] .net6.0.3 for freebsd --- .github/workflows/freebsd.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 83688aabd..a62a689bb 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -49,11 +49,12 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - export RVERSION=v6.0.100-rtm.21527.11 - export VERSION=6.0.0 + export RVERSION=v6.0.3 + export VERSION=6.0.3 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Crossgen2.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Crossgen2.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ cp -R `pwd` /var/tmp/build @@ -115,11 +116,12 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - export RVERSION=v6.0.100-rtm.21527.11 - export VERSION=6.0.0 + export RVERSION=v6.0.3 + export VERSION=6.0.3 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg + curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Crossgen2.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Crossgen2.freebsd-x64.${VERSION}.nupkg /var/tmp/dn/dotnet nuget add source /var/tmp/nuget/ cp -R `pwd` /var/tmp/build From 9dfec79a649925f4436dd37be954fa2cdfe5f61d Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 1 May 2022 22:17:50 -0700 Subject: [PATCH 215/253] Missed a spot --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index a62a689bb..20e2812de 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -13,7 +13,7 @@ jobs: - name: Download dotnet # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.100-rtm.21527.11/dotnet-sdk-6.0.100-freebsd-x64.tar.gz -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.3/dotnet-sdk-6.0.201-freebsd-x64.tar.gz -o dn.tgz - name: Build id: test uses: vmactions/freebsd-vm@v0.1.5 @@ -80,7 +80,7 @@ jobs: - name: Download dotnet # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.100-rtm.21527.11/dotnet-sdk-6.0.100-freebsd-x64.tar.gz -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.3/dotnet-sdk-6.0.201-freebsd-x64.tar.gz -o dn.tgz - name: Run test id: test uses: vmactions/freebsd-vm@v0.1.5 From e66fc1ddc86fd08b452c25320e95aeab681d04df Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 1 May 2022 22:55:03 -0700 Subject: [PATCH 216/253] Test name logging. --- Duplicati/UnitTest/BasicSetupHelper.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index b379cb014..5ea42faac 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -104,6 +104,7 @@ namespace Duplicati.UnitTest [SetUp] public virtual void SetUp() { + TestContext.Progress.WriteLine("Setup {0}", TestContext.CurrentContext.Test.Name); systemIO.DirectoryCreate(this.DATAFOLDER); systemIO.DirectoryCreate(this.TARGETFOLDER); systemIO.DirectoryCreate(this.RESTOREFOLDER); @@ -112,6 +113,7 @@ namespace Duplicati.UnitTest [TearDown] public virtual void TearDown() { + TestContext.Progress.WriteLine("TearDown {0}", TestContext.CurrentContext.Test.Name); if (systemIO.DirectoryExists(this.DATAFOLDER)) { systemIO.DirectoryDelete(this.DATAFOLDER, true); From dc5750e6ab51cb430357334185b32ba280a79021 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 5 May 2022 20:05:40 -0700 Subject: [PATCH 217/253] Pin ubuntu to previous LTS Ubuntu 22 is not yet supported by .net6 due to openSSL changes. --- Installer/debian/docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Installer/debian/docker/Dockerfile b/Installer/debian/docker/Dockerfile index 84f50069c..049814cd4 100644 --- a/Installer/debian/docker/Dockerfile +++ b/Installer/debian/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:latest +FROM ubuntu:20.04 ENV DEBIAN_FRONTEND noninteractive @@ -21,4 +21,4 @@ RUN chmod -x /deb/debian/duplicati.install RUN chmod -x /deb/debian/docs ADD runner.sh / -CMD /runner.sh \ No newline at end of file +CMD /runner.sh From c38e654db93a7b59873712a5adc36fc47ef174bf Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 5 May 2022 20:16:54 -0700 Subject: [PATCH 218/253] Upgrade fedora to latest .net6 is only on 34+ so jump to the latest fedora --- Installer/fedora/docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Installer/fedora/docker/Dockerfile b/Installer/fedora/docker/Dockerfile index f436cae29..1c256066d 100644 --- a/Installer/fedora/docker/Dockerfile +++ b/Installer/fedora/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:33 +FROM fedora:36 # Install common build tools RUN dnf -y install deltarpm @@ -14,4 +14,4 @@ RUN dnf -y --allowerasing install @"Minimal Install" @buildsys-build yum-utils r ADD buildroot /buildroot ADD runner.sh / -CMD /runner.sh \ No newline at end of file +CMD /runner.sh From 5956b771f04527c07493a6dc96b14c3575fb193b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 5 May 2022 22:30:15 -0700 Subject: [PATCH 219/253] Cleanup inconsistent overrides of test SetUp and TearDown. Also add some memory usage diagnostics --- Duplicati/UnitTest/BasicSetupHelper.cs | 40 +++++++++++++------ Duplicati/UnitTest/BorderTests.cs | 5 +-- .../UnitTest/CommandLineOperationsTests.cs | 8 ++-- Duplicati/UnitTest/DisruptionTests.cs | 4 +- Duplicati/UnitTest/GeneralBlackBoxTesting.cs | 11 ++--- Duplicati/UnitTest/RecoveryToolTests.cs | 7 +--- Duplicati/UnitTest/RepairHandlerTests.cs | 4 +- 7 files changed, 45 insertions(+), 34 deletions(-) diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index 5ea42faac..19f67c818 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -22,6 +22,7 @@ using System.IO.Compression; using Duplicati.Library.Common; using Duplicati.Library.Common.IO; using Duplicati.Library.Utility; +using System.Timers; namespace Duplicati.UnitTest { @@ -81,29 +82,39 @@ namespace Duplicati.UnitTest } [OneTimeSetUp] - public virtual void OneTimeSetUp() - { + public void BasicHelperOneTimeSetUp() + { + TestContext.Progress.WriteLine("One Time Setup {0}", TestContext.CurrentContext.Test.Name); if (DEBUG_OUTPUT) { Console.SetOut(TestContext.Progress); } systemIO.DirectoryCreate(BASEFOLDER); - this.TearDown(); - this.OneTimeTearDown(); - } - - [OneTimeTearDown] - public virtual void OneTimeTearDown() - { - // No-op by default. + this.BasicHelperTearDown(); } private static int count = 1; + + private static Timer SetupTimer() { + var timer = new Timer(); + + timer.Interval = 10000; + timer.Elapsed += delegate(object obj, ElapsedEventArgs e){ + var nogc = GC.GetTotalMemory(false)/1000/1000; + var yesgc = GC.GetTotalMemory(true)/1000/1000; + TestContext.Progress.WriteLine("Memory: {0} -> {1}", nogc, yesgc); + }; + timer.AutoReset = true; + return timer; + } + private Timer memoryTimer = SetupTimer(); + [SetUp] - public virtual void SetUp() + public void BasicHelperSetUp() { + memoryTimer.Enabled = true; TestContext.Progress.WriteLine("Setup {0}", TestContext.CurrentContext.Test.Name); systemIO.DirectoryCreate(this.DATAFOLDER); systemIO.DirectoryCreate(this.TARGETFOLDER); @@ -111,9 +122,12 @@ namespace Duplicati.UnitTest } [TearDown] - public virtual void TearDown() + public void BasicHelperTearDown() { - TestContext.Progress.WriteLine("TearDown {0}", TestContext.CurrentContext.Test.Name); + memoryTimer.Enabled = false; + if( TestContext.CurrentContext.Test.MethodName != null){ + TestContext.Progress.WriteLine("TearDown {0} {1}", TestContext.CurrentContext.Test.MethodName, GC.GetTotalMemory(true)/1000/1000); + } if (systemIO.DirectoryExists(this.DATAFOLDER)) { systemIO.DirectoryDelete(this.DATAFOLDER, true); diff --git a/Duplicati/UnitTest/BorderTests.cs b/Duplicati/UnitTest/BorderTests.cs index 1c4ceaf9e..6ac557c91 100644 --- a/Duplicati/UnitTest/BorderTests.cs +++ b/Duplicati/UnitTest/BorderTests.cs @@ -27,10 +27,9 @@ namespace Duplicati.UnitTest { private readonly string recreatedDatabaseFile = Path.Combine(BASEFOLDER, "recreated-database.sqlite"); - public override void TearDown() + [TearDown] + public void TearDown() { - base.TearDown(); - if (File.Exists(this.recreatedDatabaseFile)) { File.Delete(this.recreatedDatabaseFile); diff --git a/Duplicati/UnitTest/CommandLineOperationsTests.cs b/Duplicati/UnitTest/CommandLineOperationsTests.cs index 695221ea9..bd5c8aedd 100644 --- a/Duplicati/UnitTest/CommandLineOperationsTests.cs +++ b/Duplicati/UnitTest/CommandLineOperationsTests.cs @@ -54,10 +54,9 @@ namespace Duplicati.UnitTest } } - public override void SetUp() + [SetUp] + public void SetUp() { - base.SetUp(); - if (!systemIO.FileExists(zipAlternativeFilepath)) { var url = $"{S3_URL}{this.zipFilename}"; @@ -102,7 +101,8 @@ namespace Duplicati.UnitTest } } - public override void OneTimeTearDown() + [OneTimeTearDown] + public void OneTimeTearDown() { if (systemIO.DirectoryExists(this.SOURCEFOLDER)) { diff --git a/Duplicati/UnitTest/DisruptionTests.cs b/Duplicati/UnitTest/DisruptionTests.cs index f9f0953b9..f0018e541 100644 --- a/Duplicati/UnitTest/DisruptionTests.cs +++ b/Duplicati/UnitTest/DisruptionTests.cs @@ -45,9 +45,9 @@ namespace Duplicati.UnitTest return await backupTask.ConfigureAwait(false); } - public override void SetUp() + [SetUp] + public void SetUp() { - base.SetUp(); this.ModifySourceFiles(); } diff --git a/Duplicati/UnitTest/GeneralBlackBoxTesting.cs b/Duplicati/UnitTest/GeneralBlackBoxTesting.cs index 50a955957..e97beff6f 100644 --- a/Duplicati/UnitTest/GeneralBlackBoxTesting.cs +++ b/Duplicati/UnitTest/GeneralBlackBoxTesting.cs @@ -62,10 +62,10 @@ namespace Duplicati.UnitTest } } - public override void OneTimeSetUp() - { - base.OneTimeSetUp(); - + [OneTimeSetUp] + public void OneTimeSetUp() + { + this.OneTimeTearDown(); using (WebClient client = new WebClient()) { client.DownloadFile($"https://testfiles.duplicati.com/{this.zipFilename}", this.zipFilepath); @@ -74,7 +74,8 @@ namespace Duplicati.UnitTest System.IO.Compression.ZipFile.ExtractToDirectory(this.zipFilepath, BASEFOLDER); } - public override void OneTimeTearDown() + [OneTimeTearDown] + public void OneTimeTearDown() { if (Directory.Exists(SOURCE_FOLDERS)) { diff --git a/Duplicati/UnitTest/RecoveryToolTests.cs b/Duplicati/UnitTest/RecoveryToolTests.cs index b81d7b25a..873fd5c10 100644 --- a/Duplicati/UnitTest/RecoveryToolTests.cs +++ b/Duplicati/UnitTest/RecoveryToolTests.cs @@ -14,14 +14,13 @@ namespace Duplicati.UnitTest private string originalCurrentDirectory; [SetUp] - public override void SetUp() + public void SetUp() { - base.SetUp(); this.originalCurrentDirectory = Directory.GetCurrentDirectory(); } [TearDown] - public override void TearDown() + public void TearDown() { // Since the RecoveryTool changes the current directory, we will reset it so that // the teardown methods do not complain about the paths being used by another process. @@ -29,8 +28,6 @@ namespace Duplicati.UnitTest { Directory.SetCurrentDirectory(this.originalCurrentDirectory); } - - base.TearDown(); } [Test] diff --git a/Duplicati/UnitTest/RepairHandlerTests.cs b/Duplicati/UnitTest/RepairHandlerTests.cs index fcaf7348d..451406090 100644 --- a/Duplicati/UnitTest/RepairHandlerTests.cs +++ b/Duplicati/UnitTest/RepairHandlerTests.cs @@ -14,9 +14,9 @@ namespace Duplicati.UnitTest [TestFixture] public class RepairHandlerTests : BasicSetupHelper { - public override void SetUp() + [SetUp] + public void SetUp() { - base.SetUp(); File.WriteAllBytes(Path.Combine(this.DATAFOLDER, "file"), new byte[] {0}); } From 3172ec3a4bdae12f26b4bd30be397af9952cfa42 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 6 May 2022 21:46:17 -0700 Subject: [PATCH 220/253] More logging in tests --- Duplicati/UnitTest/BasicSetupHelper.cs | 6 ++--- Duplicati/UnitTest/CompressionTests.cs | 2 +- Duplicati/UnitTest/DeleteHandlerTests.cs | 2 +- Duplicati/UnitTest/IOTests.cs | 22 +++++++++---------- Duplicati/UnitTest/ImportExportTests.cs | 2 +- .../ResultFormatSerializerProviderTest.cs | 2 +- Duplicati/UnitTest/UriUtilityTests.cs | 14 ++++++------ Duplicati/UnitTest/UtilityTests.cs | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index 19f67c818..a94bb561b 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -104,7 +104,7 @@ namespace Duplicati.UnitTest timer.Elapsed += delegate(object obj, ElapsedEventArgs e){ var nogc = GC.GetTotalMemory(false)/1000/1000; var yesgc = GC.GetTotalMemory(true)/1000/1000; - TestContext.Progress.WriteLine("Memory: {0} -> {1}", nogc, yesgc); + TestContext.Progress.WriteLine("Memory: {0}MB -> {1}MB", nogc, yesgc); }; timer.AutoReset = true; return timer; @@ -115,7 +115,7 @@ namespace Duplicati.UnitTest public void BasicHelperSetUp() { memoryTimer.Enabled = true; - TestContext.Progress.WriteLine("Setup {0}", TestContext.CurrentContext.Test.Name); + TestContext.Progress.WriteLine("Setup {0} {1}MB", TestContext.CurrentContext.Test.Name, GC.GetTotalMemory(true)/1000/1000); systemIO.DirectoryCreate(this.DATAFOLDER); systemIO.DirectoryCreate(this.TARGETFOLDER); systemIO.DirectoryCreate(this.RESTOREFOLDER); @@ -126,7 +126,7 @@ namespace Duplicati.UnitTest { memoryTimer.Enabled = false; if( TestContext.CurrentContext.Test.MethodName != null){ - TestContext.Progress.WriteLine("TearDown {0} {1}", TestContext.CurrentContext.Test.MethodName, GC.GetTotalMemory(true)/1000/1000); + TestContext.Progress.WriteLine("TearDown {0} {1}MB", TestContext.CurrentContext.Test.MethodName, GC.GetTotalMemory(true)/1000/1000); } if (systemIO.DirectoryExists(this.DATAFOLDER)) { diff --git a/Duplicati/UnitTest/CompressionTests.cs b/Duplicati/UnitTest/CompressionTests.cs index 19e90d56d..327d5158b 100644 --- a/Duplicati/UnitTest/CompressionTests.cs +++ b/Duplicati/UnitTest/CompressionTests.cs @@ -23,7 +23,7 @@ using NUnit.Framework; namespace Duplicati.UnitTest { [Category("Compression")] - public class CompressionTests + public class CompressionTests : BasicSetupHelper { [TestCase("zip")] [TestCase("7z")] diff --git a/Duplicati/UnitTest/DeleteHandlerTests.cs b/Duplicati/UnitTest/DeleteHandlerTests.cs index e472ca401..a4f47ad92 100644 --- a/Duplicati/UnitTest/DeleteHandlerTests.cs +++ b/Duplicati/UnitTest/DeleteHandlerTests.cs @@ -9,7 +9,7 @@ using NUnit.Framework; namespace Duplicati.UnitTest { - public class DeleteHandlerTests + public class DeleteHandlerTests : BasicSetupHelper { private class Fileset : IListResultFileset, IEquatable { diff --git a/Duplicati/UnitTest/IOTests.cs b/Duplicati/UnitTest/IOTests.cs index 5c834c385..0ac436831 100644 --- a/Duplicati/UnitTest/IOTests.cs +++ b/Duplicati/UnitTest/IOTests.cs @@ -20,21 +20,21 @@ using NUnit.Framework; using Duplicati.Library.Common.IO; using Duplicati.Library.Utility; -using Duplicati.Library.Common; +using Duplicati.Library.Common; using System.Collections.Generic; -namespace Duplicati.UnitTest +namespace Duplicati.UnitTest { [Category("IO")] - public class IOTests + public class IOTests : BasicSetupHelper { - public static string LongPath(string pathRoot) + public static string LongPath(string pathRoot) { string subFolder = "test"; return pathRoot + new StringBuilder().Insert(0, subFolder + Util.DirectorySeparatorString, 100); } - + [Test] public void TestGetPathRootWithLongPath() { @@ -45,7 +45,7 @@ namespace Duplicati.UnitTest } [Test] - public void TestUncBehaviourOfGetPathRoot() + public void TestUncBehaviourOfGetPathRoot() { if (!Platform.IsClientWindows) { @@ -88,7 +88,7 @@ namespace Duplicati.UnitTest var pathRoot = Platform.IsClientWindows ? "C:\\" : "/"; var longPath = LongPath(pathRoot); - if (SystemIO.IO_OS.DirectoryExists(longPath)) + if (SystemIO.IO_OS.DirectoryExists(longPath)) { return; } @@ -96,9 +96,9 @@ namespace Duplicati.UnitTest //In particular don't throw PathTooLongException Assert.Throws(() => SystemIO.IO_OS.GetDirectories(longPath)); } - + [Test] - public void TestAddExtendedDevicePathPrefixInWindowsClient() + public void TestAddExtendedDevicePathPrefixInWindowsClient() { if (!Platform.IsClientWindows) { @@ -206,7 +206,7 @@ namespace Duplicati.UnitTest } [Test] - public void TestPathGetFullPathInWindowsClient() + public void TestPathGetFullPathInWindowsClient() { if (!Platform.IsClientWindows) { @@ -277,7 +277,7 @@ namespace Duplicati.UnitTest }; foreach (var path in testCasesWherePathGetFullGivesSameResultsAsDotNet) { - var actual = SystemIO.IO_WIN.PathGetFullPath(path); + var actual = SystemIO.IO_WIN.PathGetFullPath(path); var expected = System.IO.Path.GetFullPath(path); Assert.AreEqual(expected, actual, $"Path: {path}"); } diff --git a/Duplicati/UnitTest/ImportExportTests.cs b/Duplicati/UnitTest/ImportExportTests.cs index 9d0a05c7a..13abdaa20 100644 --- a/Duplicati/UnitTest/ImportExportTests.cs +++ b/Duplicati/UnitTest/ImportExportTests.cs @@ -29,7 +29,7 @@ using Backup = Duplicati.Server.Database.Backup; namespace Duplicati.UnitTest { - public class ImportExportTests + public class ImportExportTests : BasicSetupHelper { private string serverDatafolder; diff --git a/Duplicati/UnitTest/ResultFormatSerializerProviderTest.cs b/Duplicati/UnitTest/ResultFormatSerializerProviderTest.cs index e99036a24..b9a61cc0a 100644 --- a/Duplicati/UnitTest/ResultFormatSerializerProviderTest.cs +++ b/Duplicati/UnitTest/ResultFormatSerializerProviderTest.cs @@ -5,7 +5,7 @@ using NUnit.Framework; namespace Duplicati.UnitTest { [TestFixture] - public class ResultFormatSerializerProviderTest + public class ResultFormatSerializerProviderTest : BasicSetupHelper { [Test] [Category("Serialization")] diff --git a/Duplicati/UnitTest/UriUtilityTests.cs b/Duplicati/UnitTest/UriUtilityTests.cs index 8997ec934..d5e838e74 100644 --- a/Duplicati/UnitTest/UriUtilityTests.cs +++ b/Duplicati/UnitTest/UriUtilityTests.cs @@ -17,11 +17,11 @@ using NUnit.Framework; using System.Collections.Specialized; - -namespace Duplicati.UnitTest -{ - public class UriUtilityTests - { + +namespace Duplicati.UnitTest +{ + public class UriUtilityTests : BasicSetupHelper + { [Test] [Category("UriUtility")] public static void TestBuildUriQuery() @@ -65,5 +65,5 @@ namespace Duplicati.UnitTest Assert.AreEqual("/a", Library.Utility.UrlPath.Create(path1).Append(null).ToString()); Assert.AreEqual("/b/", Library.Utility.UrlPath.Create(string.Empty).Append(path2).ToString()); } - } -} + } +} diff --git a/Duplicati/UnitTest/UtilityTests.cs b/Duplicati/UnitTest/UtilityTests.cs index b0ce308e7..1779de033 100644 --- a/Duplicati/UnitTest/UtilityTests.cs +++ b/Duplicati/UnitTest/UtilityTests.cs @@ -27,7 +27,7 @@ using System.Threading.Tasks; namespace Duplicati.UnitTest { - public class UtilityTests + public class UtilityTests : BasicSetupHelper { [Test] [Category("Utility")] From 817b1d5bc2c35ee1e306881a1bae361e8be7a904 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 6 May 2022 21:52:19 -0700 Subject: [PATCH 221/253] Try to debug time discrepency --- Duplicati/Library/Common/IO/SystemIOLinux.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Duplicati/Library/Common/IO/SystemIOLinux.cs b/Duplicati/Library/Common/IO/SystemIOLinux.cs index 1acb95b47..2b77df643 100644 --- a/Duplicati/Library/Common/IO/SystemIOLinux.cs +++ b/Duplicati/Library/Common/IO/SystemIOLinux.cs @@ -55,6 +55,11 @@ namespace Duplicati.Library.Common.IO public void FileSetLastWriteTimeUtc(string path, DateTime time) { File.SetLastWriteTimeUtc(path, time); + + var gtime = FileGetLastWriteTimeUtc(path); + if(gtime != time) { + Console.Error.WriteLine($"DISS: {path} {gtime.ToFileTimeUtc() - time.ToFileTimeUtc()}"); + } } public void FileSetCreationTimeUtc(string path, DateTime time) From cfa41434ad6478dc0453d9de2f6c9edc63c2e8f5 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 13 May 2022 07:54:24 -0700 Subject: [PATCH 222/253] Add process memory usage and print more often --- Duplicati/UnitTest/BasicSetupHelper.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Duplicati/UnitTest/BasicSetupHelper.cs b/Duplicati/UnitTest/BasicSetupHelper.cs index a94bb561b..5d6a2f026 100644 --- a/Duplicati/UnitTest/BasicSetupHelper.cs +++ b/Duplicati/UnitTest/BasicSetupHelper.cs @@ -16,6 +16,7 @@ // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using NUnit.Framework; +using System.Diagnostics; using System.IO; using System.Collections.Generic; using System.IO.Compression; @@ -100,11 +101,14 @@ namespace Duplicati.UnitTest private static Timer SetupTimer() { var timer = new Timer(); - timer.Interval = 10000; + timer.Interval = 2000; timer.Elapsed += delegate(object obj, ElapsedEventArgs e){ var nogc = GC.GetTotalMemory(false)/1000/1000; var yesgc = GC.GetTotalMemory(true)/1000/1000; - TestContext.Progress.WriteLine("Memory: {0}MB -> {1}MB", nogc, yesgc); + + var me = Process.GetCurrentProcess(); + var process = me.WorkingSet64/1000/1000; + TestContext.Progress.WriteLine("Memory: {0}MB -> {1}MB ({2}MB)", nogc, yesgc, process); }; timer.AutoReset = true; return timer; @@ -115,7 +119,8 @@ namespace Duplicati.UnitTest public void BasicHelperSetUp() { memoryTimer.Enabled = true; - TestContext.Progress.WriteLine("Setup {0} {1}MB", TestContext.CurrentContext.Test.Name, GC.GetTotalMemory(true)/1000/1000); + var me = Process.GetCurrentProcess(); + TestContext.Progress.WriteLine("Setup {0} {1}MB {2}MB", TestContext.CurrentContext.Test.Name, GC.GetTotalMemory(true)/1000/1000, me.WorkingSet64/1000/1000); systemIO.DirectoryCreate(this.DATAFOLDER); systemIO.DirectoryCreate(this.TARGETFOLDER); systemIO.DirectoryCreate(this.RESTOREFOLDER); @@ -126,7 +131,8 @@ namespace Duplicati.UnitTest { memoryTimer.Enabled = false; if( TestContext.CurrentContext.Test.MethodName != null){ - TestContext.Progress.WriteLine("TearDown {0} {1}MB", TestContext.CurrentContext.Test.MethodName, GC.GetTotalMemory(true)/1000/1000); + var me = Process.GetCurrentProcess(); + TestContext.Progress.WriteLine("TearDown {0} {1}MB {2}MB", TestContext.CurrentContext.Test.MethodName, GC.GetTotalMemory(true)/1000/1000, me.WorkingSet64/1000/1000); } if (systemIO.DirectoryExists(this.DATAFOLDER)) { From 961b443f1f670ba24380dc1bf40ae24e83fcc0f5 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 13 May 2022 08:15:43 -0700 Subject: [PATCH 223/253] 20G Swap for freebsd YOLO --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 20e2812de..85d9e2227 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -33,7 +33,7 @@ jobs: df -h dmesg | grep memory swapinfo - dd if=/dev/zero of=/root/swap1 bs=1m count=2048 + dd if=/dev/zero of=/root/swap1 bs=1m count=20480 chmod 0600 /root/swap1 mdconfig -a -t vnode -f /root/swap1 -u 0 swapon /dev/md0 @@ -100,7 +100,7 @@ jobs: df -h dmesg | grep memory swapinfo - dd if=/dev/zero of=/root/swap1 bs=1m count=2048 + dd if=/dev/zero of=/root/swap1 bs=1m count=20480 chmod 0600 /root/swap1 mdconfig -a -t vnode -f /root/swap1 -u 0 swapon /dev/md0 From 86ceb95e28c36e8468e0c611ef56dc049f8fed45 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 2 Sep 2022 08:50:08 -0700 Subject: [PATCH 224/253] Proof of concept to support Avalonia --- .../Assets/icons/icon.png | Bin 0 -> 24921 bytes .../Duplicati.GUI.TrayIcon/AvaloniaRunner.cs | 179 ++++++++++++++++++ .../Duplicati.GUI.TrayIcon.csproj | 23 ++- .../GUI/Duplicati.GUI.TrayIcon/Program.cs | 12 +- 4 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/icon.png create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/icon.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0deedde6b410c343363e0bc9ce6b8956691f569a GIT binary patch literal 24921 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 C{&c_q literal 0 HcmV?d00001 diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs new file mode 100644 index 000000000..653d69daf --- /dev/null +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs @@ -0,0 +1,179 @@ +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using System.Reflection; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml.Styling; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using Avalonia.Themes.Fluent; +using Duplicati.Server.Serialization.Interface; + +namespace Duplicati.GUI.TrayIcon +{ + public class AvaloniaRunner : TrayIconBase + { + public override void Init(string[] args) + { + //Init + + //Initialize and Run is called next + base.Init(args); + } + + + + protected override void UpdateUIState(Action action) + { + action.Invoke(); + } + + protected override void RegisterStatusUpdateCallback() + { + Program.Connection.OnStatusUpdated += delegate (IServerStatus status) + { + this.OnStatusUpdated(status); + }; + } + + #region implemented abstract members of Duplicati.GUI.TrayIcon.TrayIconBase + protected override void Run(string[] args) + { + + + Avalonia.Controls.AppBuilderBase.Configure() + .UsePlatformDetect() + .LogToTrace().StartWithClassicDesktopLifetime(args); + } + + protected override IMenuItem CreateMenuItem(string text, MenuIcons icon, Action callback, IList subitems) + { + return new Win32MenuItem(text, icon, callback, subitems); + } + + protected override void NotifyUser(string title, string message, NotificationType type) + { + var icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; + + switch (type) + { + case NotificationType.Information: + icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; + break; + case NotificationType.Warning: + icon = Win32NativeNotifyIcon.InfoFlags.NIIF_WARNING; + break; + case NotificationType.Error: + icon = Win32NativeNotifyIcon.InfoFlags.NIIF_ERROR; + break; + } + + //m_ntfIcon.ShowBalloonTip(title, message, icon); + } + + protected override void Exit() + { + //m_ntfIcon.Delete(); + //m_window.DestroyWindow(); + } + + protected override void SetIcon(TrayIcons icon) + { + //There are calls before NotifyIcons is created + //if (m_ntfIcon == null) + // return; + + //switch (icon) + //{ + // case TrayIcons.IdleError: + // m_ntfIcon?.SetIcon(Win32IconLoader.TrayErrorIcon); + // break; + // case TrayIcons.Paused: + // case TrayIcons.PausedError: + // m_ntfIcon?.SetIcon(Win32IconLoader.TrayPauseIcon); + // break; + // case TrayIcons.Running: + // case TrayIcons.RunningError: + // m_ntfIcon?.SetIcon(Win32IconLoader.TrayWorkingIcon); + // break; + // case TrayIcons.Idle: + // m_ntfIcon?.SetIcon(Win32IconLoader.TrayNormalIcon); + // break; + // default: + // m_ntfIcon?.SetIcon(Win32IconLoader.TrayNormalIcon); + // break; + //} + } + + protected override void SetMenu(System.Collections.Generic.IEnumerable items) + { + //m_TrayContextMenu = new List(); + + //foreach(var item in items) + // m_TrayContextMenu.Add((Win32MenuItem)item); + } + + public override void Dispose() + { + } + #endregion + } + + public class AvaloniaApp : Application + { + public override void Initialize() + { + //AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.ShutdownMode = ShutdownMode.OnExplicitShutdown; + + var light = new FluentTheme(new Uri($"avares://{Assembly.GetExecutingAssembly().GetName()}")) { Mode = FluentThemeMode.Light }; + Styles.Add(light); + + var assets = AvaloniaLocator.Current.GetService(); + var bitmap = new Bitmap(assets.Open(new Uri($"avares://{Assembly.GetExecutingAssembly().FullName}/Assets/icons/icon.png"))); + var icon = new WindowIcon(bitmap); + var trayIcon = new Avalonia.Controls.TrayIcon(); + trayIcon.Icon = icon; //desktop.MainWindow.Icon; + trayIcon.ToolTipText = "Test"; + var menu = new NativeMenu(); + var item = new NativeMenuItem("Quit"); + item.Click += (_sender, _args) => + { + desktop.Shutdown(); + }; + menu.Add(item); + trayIcon.Menu = menu; + + // Register tray icons to be removed on application shutdown + var icons = new Avalonia.Controls.TrayIcons(); + icons.Add(trayIcon); + Avalonia.Controls.TrayIcon.SetIcons(Application.Current, icons); + } + + base.OnFrameworkInitializationCompleted(); + } + } +} diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 892f10380..753497902 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -1,12 +1,15 @@  - netstandard2.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 The Duplicati Tray implementation Duplicati.GUI.TrayIcon.Implementation Duplicati.GUI.TrayIcon Duplicati.ico + + copyused + true @@ -41,6 +44,24 @@ + + + + + + + + + + + + + + + + diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs index 91df59727..266e25a01 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs @@ -21,6 +21,7 @@ namespace Duplicati.GUI.TrayIcon private const string TOOLKIT_GTK = "gtk"; private const string TOOLKIT_COCOA = "cocoa"; private const string TOOLKIT_RUMPS = "rumps"; + private const string TOOLKIT_AVALONIA = "avalonia"; private const string HOSTURL_OPTION = "hosturl"; private const string NOHOSTEDSERVER_OPTION = "no-hosted-server"; @@ -42,6 +43,9 @@ namespace Duplicati.GUI.TrayIcon private static string GetDefaultToolKit() { +#if !__LEGACY_TOOLKITS__ + return TOOLKIT_AVALONIA; +#endif // No longer using Cocoa directly as it fails on 32bit as well if (Platform.IsClientOSX) return TOOLKIT_RUMPS; @@ -301,7 +305,9 @@ namespace Duplicati.GUI.TrayIcon return GetCocoaRunnerInstance(); else if (toolkit == TOOLKIT_RUMPS) return GetRumpsRunnerInstance(); - else + else if (toolkit == TOOLKIT_AVALONIA) + return GetAvaloniaRunnerInstance(); + else throw new UserInformationException(string.Format("The selected toolkit '{0}' is invalid", toolkit), "TrayIconInvalidToolKit"); } @@ -321,7 +327,9 @@ namespace Duplicati.GUI.TrayIcon [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetCocoaRunnerInstance() { return new CocoaRunner(); } - private static TrayIconBase GetRumpsRunnerInstance() { return new RumpsRunner(); } + private static TrayIconBase GetRumpsRunnerInstance() { return new RumpsRunner(); } + private static TrayIconBase GetAvaloniaRunnerInstance() { return new AvaloniaRunner(); } + //The functions below simply load the requested type, // and if the type is not present, calling the function will result in an exception. From 8055cfb4f0d15f1d6c3f1fe95635e271f3b200d4 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 28 Sep 2022 20:44:09 -0700 Subject: [PATCH 225/253] Working minimal avalonia tray icon --- .../Assets/icons/icon.png | Bin 24921 -> 0 bytes .../Assets/icons/normal-error.png | Bin 0 -> 778 bytes .../Assets/icons/normal-pause.png | Bin 0 -> 631 bytes .../Assets/icons/normal-running.png | Bin 0 -> 690 bytes .../Assets/icons/normal.png | Bin 0 -> 626 bytes .../Duplicati.GUI.TrayIcon/AvaloniaRunner.cs | 203 ++++++++++++++---- 6 files changed, 158 insertions(+), 45 deletions(-) delete mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/icon.png create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-error.png create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-pause.png create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-running.png create mode 100644 Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal.png diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/icon.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/icon.png deleted file mode 100644 index 0deedde6b410c343363e0bc9ce6b8956691f569a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24921 zcmeAS@N?(olHy`uVBq!ia0y~yU}6Aa4mJh`hA$OYelajGuoOFahH!9jaMW<5bTBY5 za29w(7BevL9RXp+soH$f3=9mCC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2 zNHH)dFnGE+hE&XXbGLks=+~XcKc1fwyj{F1de#>;jV7k1roFDNiw!p(k4V~c@yP5W zTe5w8_84{=cAo4tT()|no9~;hSV8HC6-<|2Go9YF`}v&T$8|V%l%}1V8NBcP_1Ake zs-OL|ZI4Zx_w(#}i4G3|o&{Cw!^IceuB#8{ox)i5dG(T?HztYw(__5yPISNAjhlaN z-TJe2?b-FZXZNpTy2d2W{CZZr=YIPY9VzO{FIZeYMF<)&NZj~y>-YD+4FLr!x31t^ z&hdjIf=4IwU+MR3--4B$9rr^RIx583+!!9uicfAh=>E&FfV@h!n8RTBWHJB%pNQXWOo|CU0(dImhbumTon9cjwqT+2|Fww{*>oz81K>lGl3s znx*^7m{+DKO{i}-sbbo}nBL1Mc(b32;bdAn!*#~vY;!xJ%eHh}%KNMNF3Q<+yOh_i zYXO(m+N<8p(pdGbH#7D4;@2TYj(3+`&57PUCHM8Tz};z`pMP&Xy&`t+gk`bT&3+fV zrx$QFwii}$y0C~cOq$Dgc;|=nTvij$X{>tZn|d~5RhC;|r17j%vo4B+e&w>#Js-4E z<@R;G-7!fAji3u53?61P`-&gVmn%_v z+c~Xl;q48cA^bKMcE0#7@4IA&(Tgocs}`=C#@qdDQ{BVtbL+dGZOZ<=Y{BJM9X}6j zZ(tATZxAsMWthaf>_N#zIk6I@wVhMT7vJ7+vP8a2<8GU*SLJ&}$K_L|Zd(_1|M;QOFe3gBjeQr>69OJ%5W@k`@>5?a}A>~jMjdMv%M^Y(sy;`iDANDwC#%FnH|x%3SAqp!lcqQPC?t zzj&CJpILVLL35Lj>#a#%8|yB<)~WiIuT%XpPU=-w^SKw14}>24T_7y@aW)r&r#SZy zqjT$WT^&^tq76vT_)|S`&jKcgOAj3$Y`5_KkruON4L7??rJQr0O@Bn?c7-5;`MJ@XTlnYyQs$oj z&v^H?d_Jw-?~VFQ=UJyVbj%N7=$PNt@SZVT=)kPMSDB9+ep%7I((*}4?}Pi@i4qcO z39}@YeNKPQt=aP|xFK;{jh2V1{m$2ZOXmo?8O>CgTJle6>aFj#FRyLMR`;H_zx(^Y z&(Yh~ROlzaeW%KLhcAYiC9JdKha+plkEaauNt?bk_{(S4nCMm@f5D3tCbp&TAKC``_|j z^%t|SeIMs5OjG$Mv4i1<|1xQ@kKJ4hAGO&2u%uVTAFG@9#-oQhZO-Wq;dKge7j1*j zvK`vOb7n$k=In@V#f|2=&-3i2FA35N^7Rzr^e|KNRGXwCJ-6xL>83r=Vf)VS=KnWG zRsY}QkVPl=x7?o2RM&i2dV}(0-foabDh!!^XiwP4`K3(d+=G|T4L%*w{`~Gxz64v^ zi36MFcJGxmGRXZrS?_nv)TWf+NiM-%DalPP$z3kV&$p}H+n317E%#4U-tMcr5bxJa zk1e6zjl~ylFq|~3tV^3{V%V^{;M)81Ck}rLSTkecX1$~%h0}#JSDtd2oca9D&FF|k zVeOQJo74Weznj*SqU5<=}C_AI-(xq*5G3A!Tv_{!&8x9j_HovL^5XV#c}5c&`~r?tgp)2wq2mn7Ah z_cO1$e0M_PO&+^H#XYnC-goidy=3>!Ee1Ty#yLV<(Gh~nqvQWf_F3X#qLOiI>VlPa zp4rTtS>gK6&Q{kQ*);v#=_?5b&mQ=B;P1=~pCh`W43`AW&N=K~pR#CUTylTPp_})Y z@A-bg$K<*8Ws?ny#lnufymkKf^Y4*LQ@ti;cvu}hu+F7>FSGRYGmo!Y??1VVKkl4| z*8yFN)128K6;66tS$kIRV*1a(=U?tDTH9v)u=v08`HPn?-<`64PWQfE+07fAcAY-Y zcJi1??^n)QuV#OfwVvR$@y%5B8NaW;Ps=*rc)f7j?sHwdd@kRXF*)2S68PZ1z~4%` zb82bgn>YDJKR#?W^wFN{`}5ca9;d+DJ8xfiwO_3&HQD5v`Nb{98`Cc?a(S#LW>ce` zZ(m^S`!#d^!R>N0cx@)XYjd%3W^LH=tk~l8&tsRaH6T*o`IsN~ z_we^J*A zODwkCC*@MBdHUBEb(f7e#9KEcPjmYqKI86Qrfji2C+Eb+9a`3Z&o{kTo>`sY^QD^| z9?>Oj!VS)i?2V^NShgPuJU0JpY}?sg8ri!qyxs6Q=RRMysa<1Ru64!B@An_yZO>Dk z`sUB3BeEgfbNFngtz&b!wJ3P*oSx0|>Z90xPyH@;YRc()@6`PhUvj+fWh^_Q7L$@4 zFn>$NS8M&xM|#CKetq2fGE0fEM)F7KE-8Ub-@G$BCzb4!`N1sk&303w!JixYhHp>V z2ZY?b{QX0mgo8$&@ahhMzMC_mCWS`@URrCe+-E&~ZnW8^e}~O4U2Nf$VQ*nAk?ys-AcuCLa_o=r$)~}R&PJgrBQ_Xh6usgzaO2C4n_4!LQZLN9zSa&_{Is9>h;>B zaw5#w=l-qbv-|FTW8#kc4`aEH>Lfi4JY*<+_{!1vJ)I)c4Zo~7KhaAi;_JKaml;Va z1qKE3x56SW`J^8?BzQ3L+INfn%1VEgV_rBnMc zQEvak8mY1zU-uv4jmeE$Si~7c8CsQkHXk_8S;xL^jpW%c|94G(q*wcw?`>D6q>I;~ z8-b;Hp1*ScRv7lz{N^#!^E^F^F`vP>(f1{X-XbQ2|E>jk|BnBbtvHald1lSU^BWEY z?sqPql_=HHo$K^*Lfs10#Zu*Y&sWZ`>1_4CKez9L7L!VD$?PfjA02Q$aIucf^sRyL z`M-kf^M1ZvBk@$e>-LdTi*F=)i`SpD&=yI%a3y%dp+LKN-*xQxAH8Qhb3k(UWi@$&T!7F}Y%jxfX z>*AQx7^DC2>9l&YI@EPB^gsA~bpMWB{O)np=Ba!6J{Ygjo;XQhp;GC0?{AUc|Gob6 zdiL_5?U`%uFN{A_DYN15`vXBUO8%X(SNl*t$Mjfj@Wpfs_qb~Dj}75pHy={FxXEDI z(%p3@G4(5V?fuu!J?G4{*$uMOJ(=Ot`Lzec|M1)>zVh(QpZC>Fv3HIe z@GM%IxM*qO+2_;Oi1$q|I3Tz=^7p;fSJwSJasC2xL!w1+)z+j16^ob@_ScB-xOKjP zdHI}!TeS0!^DR$ZzkqM!A+?RCG|F7;*G;ls6VP(dIBj$4Q71Fq>htF>9B!0)z-Zs> z_3)ykX?+aSpCjiR7W?h$>U@5$Ba!V(a+1Rm3zscAi+0zY^jwx|T=44Tn;RRtzH;CH zV*Ev7PUF7*-;yC*-CPZS3Y0#$&w2iTpG5Votv$2<@^WMxmN{+K8Sb(n`JlhC$j3tl zKEM3!_zZshSo{1BPp!rV!HTQr7X(>^Fg)3JxbgSLLht*9oA)1_aX#j8_zpkrZM5!aElv=vq9H^3WxwP{5iIWiv4Yco9+*&_D?VQ&9|7_QOh=y=Ab2Z%gRzBzM z;hMq=&)20N`8fTz=(^xD6Fm1At#YkZdH+?WR-;ViRl2`}MEd;x-HlQEo4o!7Gfvpu z#%zDIf2#~nbF+Ot^Wpx#lb#3UwLCKWSmgVD@}Y~#S5lldDuwO&wkWyHt&BPY$coC>icM_p^ta@U!_{UIevGSZC&&G1Mhw(zvDBd zcAQw>Fll}W!;^InEu@=wT*`mcDN}V)-_YpJ*F5*Hd*V~%+Z^|Ix^Mpa*fl4{>VAKR z+PON$|14%d1p_`!Zi{)YcU`;TtAycH&FOdB5>vk2me=DF)aHI&x&K5R&*dj4vj6wj z3HN`}PGK$J7x=2Z;EDWKh9~PxEpGq)_WF$DRMW*Xf8H-oc7OEp#`+(kKA+mpo!XgeSFlO8Q~h>za^!hO znbNz>Gxz?O&Gu0%_K&O8;uX8p)&G33JM=MVztcal^r{6X?7na)9FMKIf9>^eKa0$g zx3^StqIZ7@j^BPLuWAPuwjDS79VY!Y;V?KJ^Wnlbqb1T+0`fNh!tL2u`8>(|egOJcY~AKN3YmF zu12YU($_D1-=h4NEM=IVY@#w{qm6opKqL<`AYoi(Rh_+p35oE z%>O^QUeUl^n8xbS7{oY%d0mA{=&UZoyT2>nym4SvdE5u7Rb0yj zDo$00P0B72J6|MjyW{Viwq0%3o~&~@8?Jp5KPlF^jP2dOOCn}ERj0F8xFzs>nD>2+ z%JdgL^NxaCax3Kim)mQ0{E!w{&++<^{v=f$>oaTe?>35lyVESsl=o3l^`xQI?DUPh zVz=_E3!hw5VJEKJo8bE8h=b^p`Ve(%Nm7UK044baFe$Thxl$d__ zvEy?_0ZmRpJucR{Z5>+_rur1!58WK`_1ot-XI=I-#?pJ6C&es~Ye?v2Sa(RW^LO@x z{S6Zte0_cEc@5UvIvIM4*H6?*o1tdB?q{!jKhrO!@ZS?AJ>mHJk}X-_L-~XH#>EYs zXV))o@IL*U$8!7gj+c9tj*2oa`*HHuzgHSUC-W{|@=`c@{PVo8QdvqL)E8VU4x02e zgdyeL!UM$zK3uyO5Wjn4&BM+03vW+w)_8YGy?Ex^qXxatcK+M-qx(tIJ7u*^Dd(8q z+}U)`dxk&&pUngRut{f2%FeHeJ7De5p7+*yqmbX8LcXK1zm}P={wpc4x+AImYm0}< z^fk5bP2cUznRT7FS;*ot)AQexr>1CsWk|X9_P~$6eU>+`9O&cKerf-5ipjDsnHM)1 zEL>4%;!@;WI6V$rpUI#5EOd;e>aoqTDK^WZ_neXBo^$JFbJ&^MDZ6}EUz*@|+Np4M zz?pLq)k=@npA?Vx-?HXZ_6*_1!!;i6n`Uq|ocSrIC%1FSB+hI5{s&22`e}06taDn% zk^LTe-BUsePE_9isC>oug<)Y_FyjQt$Bn{w4}DC(rkVmnAHYetxx2xbT|#M4Kf{3V+uf zKYVw;tnQ-Q7d-8jZPveR)G?*)vRJ%JQ}K)GbseeI|Nj5YwJ)0ZW-*h(UbTlGC2uXr zOc(5$`eVwu<*uidC92-(Pnzyk{U!ZJ;qyvfV@Zok?IkLwS1@?2e_v^NgUeN-^wHG1 zr=K(@PMWaoyXeVc;d4Lp-+0`~p7Hw63D-^C=l;Dk=9}?S^#G&sK8HPGe0WXPjp+ zy|;N{&cf9WRWWQk?#;Q)jvVFa>R8i9atOwpJUs# z)AmN+5y?uYs(F9gyPYFm{Sw!VNcP)%=XFnm(1Fi;oKEuXlKOEzSp4P$<@3s6*N(1_ z`DUQo>@l(Ir?6(q#!p#pGWGke8^pW(?WlBQZP=g2kbFljXNH(_|E?3qOY8)7ue#YQ zF+D!FOSaR zF>49SgGz%&7Jt@;`dv)Nt2qt+Nc{irFWKg}#HIM3>l5K*zpo|hnF@^Lj#+t@1u#CC zznS6s=hs@rs=T_Mt5)sU6GX9mOeqQezCnZw< z^3{X>i3cLKv%7n*UODrNr2OSV7cY|!{w`5w38zkql)pUs?W_E5UO}d+@<)Gr46L4gG3`6>6dFxdm+l?-7lB|5>y64aD_i3w6 z3K(qpxpg~>pWz3o4^^LE`!28x?iAI!D_13c=;ggvubw4b<|}@sfA34})BO>tBGzjZ z<&-Y%+U1+QGx?jtq|P<3XXZ2AW15#ycb2h?bylFlM5<8vcIs+oAzG3UOVaK zBYmZ}UEyVm-yhuEs^+7c9W^MYn%9aIy19{$Pd$VRxJD3`FKng>rDTA|06?d!935ML6>S7V%dB@ z7|L=S|N180#cKVY?+L%;%bYG`{?KeQwyoCtpmfgcZI#(Bc~ORUXBkf2m9zP<;pRTQ zOTt~ZW^8-+&-KXM!+L)W7e*9b$Xs$*<-z#_Mh~(bJQv(d5fo*3xAXl!a~`%IHoxp+ z)|k$9IkNZCyT3EOuC-5!s;t&~$#0Lat96YZ}-Ji5k zNo?8L{G}Zgm+Ly@kejYe;{p<%_}0JEB5}}(gPve+2#NI zlopRg!>QixqF(JUD&d^&n4OU!pf!2A{I>P7ao+& zQSF%Am^MXG%JkVe=>rz#>|){HA6|*R_epnRM5W8@e;ppj-rU+I+29ha?EBT)Lrv() z^}I#<%9OuGn+L`3o;Ww!Y(wo|udHzW#bsZO%5tKZSB5O8EI-8bpyc-H6%O=~sVtlb@a^vqiayFlDRll%IYt!#^@p5YU`X}C{ zDCF_Ew`*$umxk^C%(VJ`?M&0p@e3EOGkdY++cw@Ga_81GuDNY=QCpN@Zn^OXQFHcN z6D`vJgx3$#n|NQw&`~sS-mJi@$4g!iH9a+WF`Du z-M{(8%<70=hxTWzxGff~9ipskvSaJYVSI zQWUso;k={8atQ|yZ{Pgs?DM7>i2?n_4j-=hn7>gMWtjW;*U$Pro79)z|Furv)5Ys> z%i~!G6qPomK2;L4`NMwi|M~eVZtu~%eD*$j3`5SjlEZZYj2A4|&HvAD@up;1Oxf)3 zJUkljgw(&6zY`Js=)Y)XW2^t&vwQacpVI67Jblwk(F2hOKF`d#!avL9USaA1|H4QU zUdvB4tJrr%S!c+X9Z_1cyIyc&?TlrvUk_aDvHF;_i`TkiS8w);*v&e^zS9}!vu|Ts zpR&kt{|mcKkB>cicz^Zn3!eK_5|4*$?(Eod%HW0h#|*!JFZWx%z4m;?%#s|nsI7(9 zxPBN5oOWpjIkj+I{{6$QPp5p9dt}LY_`<1rB_-LbwLcEZ)F0kEr|R_OnYZq|$eH8L zSZj1~Mz|J()w!#i>l^Z%`3`<~xNxuRW&sVIZ&^Ihx6K$@heuy~t=k4j9pJ!5EN=X-Jeu&=mQlvv9@>*Sl;af^O))GsT1|6J!mILjXk2UdsQY!5!oPPvunwVVIL zl^vqn418=E1O!iRS+q*7=Gk-qq6g{g{oH?aH%ea;+_5->VaxfiqI=dnPw=^Y_02)s zHyif3Dk(V{>drpNcm7BvY%PFz{P{Ea{}`=>zFYsS}r4 zRqyHrCqCe{{Iq$_r_KKb)))MB*4nDJ^vo!$h?F1#EEUK)t9d>tzF06uxM4>JgIG9FNS(mUn!XNe>Zp3f%}aY z>)3Mp*BQJmj%Nt@{_VN1%CG?XmM4R1Y*enAT``e$#`q}5YwzuqmxYK`C-g?P(d7G9^jdGV(^{%`d1_!r% zeJdz^sdKU*>Oud7Q@Q)0o5>3JznJjH)Y zetmASmoalO(}LX4JpP{WsyU1TmlzxbC(cQfkg0omUb61Z&N|l~hW|$nm#(nYVz~9} zm;AmJr~ZDf58!X;@Hl74v#kDWn0-3?7uJ6cv*b8dGi1zu?anaq5!dzJS=%}%&ReVD z>Y~!ib2;hR_IC@e-&k4KYSU=a%O1dZ!R)#%!@`Kp*KVcX^_3>=*0DZQc>TU_=zqbw z)<5w!Io|iBL>Y36?=nAF%5dRxz2L++d!32y=Emj^7oI+PDcG>qok2pCA+3XT0lEM1okr%k&QcXYML9oDT9;Q<{{&Ebe2lnO^1etMB(c zF}-roVlz|SThoArvAL%jiwn)7Be?Hy&gncaUjN|&^8!f*C8f&aTbyOSzO@(D{hS&* zU!KW!51VES(*c$~hJQS34n>AMv{0CH&h0KAlgU+P1*J*TyLNv`I(Btl{vF0s4f88` zC!G(Ut@YsbfuuRlf2A{T^fAeaFuN#JK9_6SQaJ{}i8ZDVHV8`={`pzgGOM?^_;r+> z7=v=-eMapDc}CNjehXHt5^sB&SJApqvq4Fz^6iGxbxyAG@z=ioz^K z|8*ZY8I^3mKS@q`*$$ga2OthP?{rZqt?qG|&vf&yYDxB*b8ip+3}EnK_{Y1ab8~yq zgZV3;O$d&WU9Q^T>cZuGeW9>K@h#E1mR*b*Ma2mZ#J&0X7~UP4xxPN+z|J>;wi!0I z?*8SaYu^2Hb>TXG1230k&UP_h6VT!*e(%k% z3TI{pR~N1}*-qofv+g&1KYD*(S8?u}DKWQ7kFlI%f5*OTa_Z6U#3-MCkMv)dR<*sB zD7$f}@5!a@E-o&6G~Na}zg@L7C*n`vbc4VJauv&r*`J=$eaEnNk@J5 z{SeFIvpg9*CnIx4z@7=>=^}!fHl?$#e|&zvcgeza*Su$}b*N7$cIQ9w?eZGl zEjPKouv%T2I-!@ffiZ^fkHqptoISF-i(WryeqmK26w7Zh>xh+!vu| zPPa4}ns&V^VU|03^Q1;D&*h{CSBxc#UtQN&_ipmJWj31+seSbN%Fxllp;P(KQEq46 zw&?=58|BXK-=@(a*C6%4-eUI8CGCk9s_*FV**uQES$%xJyt6HXlG3G|0}IsyF6L{@ zwy(OM+mZCZx$W@~Q zN=i%;Y|An?zIp1t*JUN!zYAHyaZ2Tv0_Jqre=lL_pIVyuC-Q#sgOKyx8Z1g8+dHSV zHTyZcxNLH{yl(ED!ea`rw&#^dE43EC{kvhQe%dN_g|*`UXF2;lI(`3e zt&bITnRS$us%MmS?DEZy-26avyCP45?T47`c%SWx2R2(U|E~$XRLd|~?~kUfo6lG4 z61Paf?uts4AD%OnlqQ9m>HlxoKgU`uNOQa5y@gY4OE1-)e93F$FBSIP`awsr<&V$i zDOY3u@fjZ2;OG?`^ zH-2et-_sJ|&E3y<=_<1T<2)9=uf`df{f#npSLIi}Furqs!#-nQX6>xRcHK1{D>dts zlpaMT|K-cGU#j2x)%s3b#z#YkU3vEP?dQe++X?qQ-SK+5$co&yHsS#@3^Y$J0?qEG|r#7kT)Qih~%yLJT&tpAoFtg%bzogOU z8v8>(k8R;`a#eH+;6EJCXNne?z3L2i-MDz#v)A1n9>=cwd>rl1KahAJ zB>yO(b@7=U&(=4_|M5Mo5+Cwld0yo<{wr!7k+_lfNoi8*FIk(@rysU&2tU97I@5#yACi0P z4?nn|f6r-uv;PN~Q)>gRD8jA@=dbPhM62@# z9n;!7r?onIf9>k<;CpFUv}yX`?>(E!jW6X2eW=u5%k1L4+u-f#?a5J!>la!b<(m2G zow(q{IaiaXEI;^({Xx!+?W;H2GN^qpw(0u?4v+h8dp5OCH<&A?$0fMF>(wKDB_+$% zzdtnZ{StTkfWeDD$_<|zn(uDgb$iFn`%9j$IJ~#*rNv=|C^^NTNjLAY2?`4CZ+*OU zO4<64LP;tm>liv1=gHsrE>*3v*l*9J>=}H$;|J4ZkO!(;~aI?-^JyV`_}`3aeVTOvhpkuoHb{?vl-au z{mkuJWphszKD{_T96yJ0=U)3~VDMioxSwtd^WSj^D( zqp;vao6wu}JEkAbW>~Du>cCmBbNVzN>oZTf^A8$ax-TlFDrCc;nGi;To>5 zm~~5=LCNCo|8=6FUz1YU-2UDc?9QmPc>A`aqa&sHlALKAU;cIm3*i^hnB2wQ{T&@5J(u47-79l%^au&y22Y>ze@aS0 z30}Lte=Vvgjb=TNa^Uhb=f`RF%!i9M-*q@XW18a{n_1g_C@Cr3)CvoG`t-x9ZE}n; zZ&Zt1?+bphexjnUcq?Uw!0Mh!jh(DYN=lLHQDJYNehA}k5PD#uKat<&^R6wvzl|Fr zcA9+^6r6ZSRCn!{qKeh52XYpi$h~su9rH`uvSqgq-xk&6O>QlHt*@lisvR|Jo;$<* z??R<7)^K0i#ucxTCET?m+7$Ow?vmex~Vqc(L&~ZB>wq3@_HQqm3WZMa@*;ViK zm6SG#U;Y-tP_v5tL55Aq|L^nvNa~;5a>9UTQL13>2W60a|LHgNtJoh%Twlo3yid6A z>m;9UrK5^xzl#eB-t^a+`Jt#H={?f{mb9I{S5hxjJeq2|SLL(jvfL!`m9OJnTvF;g zm$B)$o4<)==wXcU*LqX_p)*b>GjNN}l6m!lf)mA5q-{kRc7M}jSXR|}<@0f%_@L3u&JiPwJo#J9;zx(3p2U}YP=euq% ztWp+DXZdEpbN6p|M@Pw(Z>8FMW%iw9$w^pnn7v~7Q?jJ6+3?Si-ZgGO|SH1V6aX~oVDw> zxS-(66>neL+A{q(aU_!Yz|={3rg2jDl|?S!-QUsS;eItY&fWR0+4lD34WeonPUo`N zPy27G%WS>M^gqbftjn9e?~&Ojx8idMgGl+>kCPY}%0j?CnY%IbCX;@P7 zl)Qbe%E;hk2=U6XW&Ji^8P2dTXV55@Ubx~?>2pSgWw}YW(thWQ2ntTLHPiiig?R(R z9Hs@Aa$5=tTc@*>d*bX~N$j`LkmxX#`3ZSVCxGI88%7?v{>?B!Y@+O_MP1H_@*(++CK z@zu+w%QE;VJTdFa+-(=a+R)L_!JRF(=hf2>wpX1KSQ|ux7!{P1E=iWozFs+(>Bpyc z_h*=tv+kHwRK7ye$neXLco&x?!JuUtue0+v*H$sSy6fg?@~)_Kj_jqYAi2$9`#w&Y zet0@lcKLtB2}}nJkW{@&Ymiqlv5X-e4z1xa6cQYNh z_7>!rbe+0yaqAW3ZvWTcBgzmRBf>DPiowOj#p-eM@&C`Be#m|E{f~T;2E!F*P)H<7 zPd}G_ILZI^|9{G>;3y8j8>WAEFNym+aNZvH+HC#8!spxg_TS%9@)4XeQ}yk9?k+oL zpLhRsvPCk3-BA`hrdM~|?(ND7Y`?#nw*ln3cWbNjze+8-`kY;D!Vzcv1J9m*w*C`W z`X7{M&MZsi{_$h2<=g!mOQRdxqklhoSN+M)?#%xqzgpLq{@AeXdj9?;8|&Jq3&=C*Z~xkMm-T>mUbM&3NjVV~+mrLJeFY@}U*6KKdus2m z-`loRG~@HngYTFUbT9l2t(~=Y-v6BA_f~)d#y9`|_w4Z9Z{MX#zb*NHSe=!j;stAj z<@=9)doNy&U=tLa_~+V=V(a|7#ogBp${(F!$e66pdSKer_nT|~e)@JFVo2!ccfTa9 zx95BiQeyqHNjd+{Zib4B-re&1f395HX0N)G3zT78t+%gves*`=JJU1CB?W2s@39`3 zU2#Jq z=kIMx30{2N;ClJ9v%kd|{xim;Z+P-^_w7Hsz=jd+m-!iYZvN6ZHl>Qu#l_{u zh99}l{yt8#cdC^Y*M7StgkcTyt@&5(cO9F1JJRO4{MtI(sUEv{b(NGRi3|Di+SDCp zRhcEVr)`&f#l5qQx}ppW^@a1f_k4emyCg_A{)I3ns88vUSpBx&d_&<$>$t-z4f(rl zcWh;PV3)A__JXb1Vw;olPAf}&<#2Fu;kvnt|JkQw_wzm}U&(J|&EwBo%W#8ni|z9D zviWz5mA4qY)xQajT(029=ib`4-02K!MHv|Oe-Ns;?Ee1K#q9sT zuH09jZ2}4+uFJ;e@duxY%Ks94l{H7{z}9VC4d#uOaZURxzw_IhiYeTjab=o=l2TB? zv;VKl>?;1`*R@nJ{#blnAoW)-z>*}QgrUB2o5iQ0en`XXjb`^G9DIPuVi z!k0C2f6t|Rs@dp&zs)kIr~T~jvh3CD408@PXzwvG_^yBd-<4eqC*5q>K*|I5=L+}7 zn9p7oTUyuh+wj9Q`NmtX89kWH3@+y~@3t@KpLqG(pSg*WHzt0YB_=3%GWVp5Fn|5y zkZbi8=lcuZGp0XI+_-P=*6Yj+AGGHjZH$@y|HJxkH$;HLx)1lq`f2Nhc``;V? zFpnYbv$n*R{~QV1D-TpUblz^;wl>;r&m!wk=3`6=Z9F==mA|%kba>=N8a-#6x8vg@ zvFnEmAM(!G{l7*2VA<;o#tSW*FCGYtlZrO3=liQZ*J;TPCLRvgT>XbGE-stS&0<~u z>BDwE^_R7C>kHBz%eEeO|ET-&jP8&84;IP`GQ(x{|Gm?m;5G5a)PjxW6FWLQzTMiA z!^j_7Jth4n%htOBAfRt`c^xdfFyA<`r@lr?NE! z1t<30-ce$w{mkyA>XG0Bkw5m_@Q>c3ceGq|!=+-el_LIkzo<^zKW$1pwJi}##6xSCz;!5hCPnNIauGZQ`*f4`i20FV}9uEKQmhPOLQ=|SMg5qG1>UzX7x+E8l|PSAuJso9`9Dj zS#*7u|F6BW?>t)s{}~25ulTUFpR+~hr5A{Cyn1dLV07`wqV)HRe|L0F`L^Ptl%I=> zigMSg>Sa=8dHajc?$+mHzIFRe8gGHlxhDI@582lH)Dq0j1s%NC{C3sjh3n^@X!rkj zxW7P2N$KUb(*`}8pZ|TkthiD0!0X&S-{T%6%!&QS^!U5epUVyE8T&uIlsKI5>FD+1 z2Q%Zps?O=?==k5$>p4mNe^%9-pMUomNLnzxXg1zeulOP0^ZLfm)r$Z6f26#2ieEG1 zw@B|->leijczB$p**iNt!Xk5)T0EL=ob);B$1Sc0mUFuQ9X{Y~@%lwdYss4dre1&$8*U)+h(1ZX)Y^yQ>;WQZ|P?Ly&M%%7AMXxSePN$ zUjKDEkL9P$b#0=8f-gH{HG8=8=gR%8zR+1Qb)6hTgWChg2Pz9rtzU3*ncK88l?}Su z;uov$nAi#l2u}2w*`Fy>{QBX<pZI&{4J1l0iCaEtdM~7@_uY0+N5_+W zrSfM||Lw0kziNB@g1paGJeQZOO0!^IHs{EO#pe}cLayCf_&T`Y-`dNI|DQ_PH*>2l{~Gsu(W-Z6c04ot z<@@If&$r#Yt3PgvUN&uwfA%EClV7H8vOnkK$b9Ll!}dgW!?&mAUo1WGqr_BENhvb# z>h1HNU&&tITy)P^wrYRoO_{HA?Trggon*-Nl$`#z$nDAemuCz!9PenAAC44I%ni>t zY#>?kW2KM9^Qcw7`aQypm6RsAPU=(xh2ZvgJ6o@Qj(_*%|(g_w&H=m!?9-{BNuY~ z<+GgC80^37|B~d}vzU~Wlo)SqDpKs8w|Dx{^Y@PbYRykubn5HU&b7Qdo!uJO^Ypi-T@1=-~%aX`N3+IKt-*ckt`uqor!{w77PbxQ_ zdnn_{t?bdEMMK{|n?+ zKi_}ml=-~0tGCZz-jbaj@bb-pm%Y~{8XD#>|7qf}6Uy)o3@z9C-M^sffCh-lI>2$N znqNsqpV!J%aN?XxTe8(>Pv3w3*i!C@{|{}hovCmA+I>&u<`s#OtlfX*3j!~ArZ{aA zV_>LluxD^*nd_15bWy2m_cyh;o4t?p_I8Aq9OiQ65TBZGE757A(whPvZ5d9h(Ca*x z&)ohfIC0XN75cT}np&q%&(vEOVYn=neQw+PHyJY8Q+7Y+XmAN;_O&j5^Ru{1q*VHP z!0sx^+t>7#mz{OLvM%b>v8C@fm0k@BI_Xkya$BzTx#SnAjL#rn0$YFqde2C zZ~iVWmsA<&u-*|ZQJOjF+}nn~pSaGMrzjX$Jcw~|QTe}y`5fCjZmWqtr>52&YCTYR z!1KVQhGI~2c!TT@K?9izjR!GCdbi~nx2W*caPE-P;Ij}H6g+8ryYY6Tbi-E0=Rz}L zbQsEBbJqx4h%eU=5ERTjt@a@Nz}d6=^)q(HFub`Y{zI$4P=FV#&91v4{*lke+ZWGO zbGzAzFzo)yxQb`p zzWZ}@sgn-Fw`;QL>l-rTd&c!l`b^nOC$=x%^N0QX^!ZaKH^?(ONB_80ePHW>X34V} zd%1pA$E}!e8*g9EpCD9VU?8)Cv5F~hPI0mBxt*2D9}+*mE`2cb+5X9YQ$CwpU#?=D z&wP&I*n_-=6t3s&@9G}-B`nRq`BORGpC?a-qvyEh8?%Qs_n)!O3ak==INq-I-Ms_i z4U-H1?ca4$pK}lEAK4$=A2#OS^gK7aqxfLnq3G*3|E*Vh!1!Ronc693E3-Fzfa$Dx z=Xt<+$@4um_5}gY?7C7GCmyK(@V$NY*6Ye!?mV57`LiHt!a2<+?<*J9eT(^b=WxNY z`)QB%{Lwh~I95|Z@Iku+^UR-$xBuQ^{lmbq{J-)xt?B+ekNgzt&vSp>{QS{#KH)c& zmXrSVYdA`?oKf9upYVHs96Q_c-_6^U#Qk|5`9c-mdTz&1u~^u0+3P(v3U}p0nvA(` zcx|vx*&RQ-LHY9U!ssd4>TDm^P1ygu_1Defm&NA~S<183`uQdKN9FPltG{_OsP2i|0LXrsOa48+CC%o=5AQ{>>AAm45!) zdE2>fUQf(@xu+&%*FQ#;zibn2&;Pkyoy*3y?D_me`I~h~0{@{2%dGz0!6(-$ch*<^ zlT?|j#A1JI|K|1AJ^zPH$+0u^fW_dpx_2=)`up3KaXgzNFZ74MZ}#=?mp}GzoStKA z=i1o_l`WnbWms^eLoo4rrKH=s`2yUL+v0eP z78=;^{`~*y)zv?3Ch{qtxcj-t_FNQeVbBX-IFswmBwCV{G=91t*#m{@ZUB_5c38z3lF#ciCnBH!TsZ61b53wP(Ts1<8=xD_a9=vVr?KzsW3@Lrty^t8JYM@*`K5oFam(-a%PVDh=j2WGIo$@}iZc>P^CgI(pP9F~_}$&lH;T_6 z_PufP;zQjT_M*kQ1-n^o_DFi`Ru+seB)`Y4fuW2i|VY*;~&# zwKQ~d-M-!BQ*!Uy9+)!U9#$WA+lxED1n!?Wab>qu!`{zeq3eHt&xTTP6 z_+eX~3&X`W(f=23f1UN3&-LP>UF$aI@69}%*>-4WPY%oS)RcST*RGWE&a1fm)%x|P zwqwiBm&lrIb-bzcK;z+x>60CJ3%tygqFXZg4lKX;XVTiJxFi4G-~aP&I!}Vq#G)U| zo-W<;|F&9`)MBfX3}3UJ+1>SUF#T7%UjCYtZ-hUIs`c~zF&TWbq5T2?YI*jk#L>uR^Ve9gi&FE**p@0_u?;*|HN8-H)C)mf!+ z#gp&A@w+TpIXOL7wyeor8BurGUTlin`LAVr%g$d}a_>WUSl+$IQGy(bm(;4`{s~(> zT&|{WdAYQpI5D$iMbgpI`ztdeZ!g+t^&r_QbK{0MzN=yf8)cvE^3g0{n=U)+%^J%s z{}b*mwLQ}L}!7oFPE zH}~!N&(^Y5I%}s-b`aU>o$#PFmE}R2$)`^T-fj*5H;J*Q-?DFWW~FAd8C(6!jKs_@ z`~Ubgvp-`vdmz2BecAupJ_odG74>Gw>;9g3Kl4Ir=H5B1Yc6*lP)mHtu%<-Xz&u?q zdixop{knqfPg)-D*j~G?^G?UL*ZT3P&!73ZdWrp8dH`swRjI3KnqSAUn&U$ye~ z>vF3*oA$(&-Mx21O-GjDda{*tzSqa@33D25toZ!n`c*5wUClxN$$N#)sG1 zazjx4%TE2SSJP@<_wKE({^QrKSbD&$J#inOj^R8Z#Y;~ro}XUcC9Yq4<$cMH#LB%f zi-d20LT$&buUrePW*suPd^G9s1fSaIJF7DG9Txeyen;NP)#-fy&d2|r%h&u*;<>?k|=|JPi;N%?1 zO{G&x61P0c2|KuG_8-6Y#QoEs6*xsK-l6pC-=U133+}%xIP|H?vSRSZN0*Oo9?JjyMDTHXa8o9V@jK^-hH0qzS6trctXX8Ro;Pq-!k6Y&lPLE z`03!OY^n9U7uWpn-g) z&pptmcXr~&lbjNgA-3lw_Z7&p$Exe*cDDQ^(-}dGny2SXR zNcuzTxwyR#mz`D>7LadzxOt9E)g;@ucb`2nQ?Z_89a`mk*xS@RCSG*Y&3{fEB6F;M zyqdmh{qMQ2E~$Rizr7=Q!PBpsUVl4gmiUsPWEZc5zt5((Cl9M#{?xa&fB&(HL-P(d zfb#FDSJU6G$;eyvvU+iLY{#{q+=?<**RGWXdH?R4*c)Ew*vi-$#MLT^`Q=j{|ed2B_{`A@3or|k} z>eSiaE56rnXD`bR@Rh9Al9^P#y=h)~xY*qbHNiG=`|E2;Dsq!bwiMNr>`<6FW5#Ts zp5=e*BBJ!$Uzr>*s6A=jsJ6W^`_!k5{|Bv3b$`A7cD`K4#ZNP*SM0w2^_5G*-ve21 zk8qrL)8_E$o!^DedEI6SQ*R#-yLS3*#*^b_iIuDjAGY{C5VlRe^YeqR4XuQW?1? z>)dbo)SMJLkfhL){ps(7llxgz-@jwAeZOr5V;|E^tBDao`s#r{4Y#-)tWW$sX*-j2 zsq)Elvkp(Yopp2D)2LNm>Gvo9O3Ck8>o4=D{rvvaS9AaOHyF%4@_f5b9)}9pB(qAf z9nt1O+^?R_l{nGvd+3{Ld~4P76c?3rz3nEhH@`G`&3Y{!6l&FfiB<4d+cC?V=5FcN z71rv{PddN;x6iq6^O>$Kc*ekCY_wBx!k*p2U-sO7;&$K$ON#vKr(#Z9m=xB`bGKcy zAa3ome9vQ-E9D&3E6<s+{>V`q6%awM;u67<^c9zq8P()$ySFJqf4kz>B86CHo=5-1 zHKt}WY<=Tjp*&f-Y5&pKedRwUMjST!x%0MG#@C{`>gA40j#gdyExmugNBHhzjl6Mp z85mQ_oCCT)8yT?ad{W-nmino9`%SAi>!&|H&~AHbzsKUUD|lu8{Bt^6qB`O0zn2qU z@*a$TsB^yloxf4<=`YXoHdi-t{#oCgzH8C}+k2_8OKz)gSbyA-ujbBapYC!G=LKrV zmQA|9|EqSR+=SQ3HjTpE`i65}M*Nvj?`e+WuTmplO;3E)IDgVS{hN7CyC#P?K$ZA2e~<~%?>33#{3G$%I7s+_@#T-) z^_~#@;oPg@{1Uds&2yORcVo`JH602oTy*QRj{n_sP-O%E*SxJpdryjoEAl#~O?oa@ z6MEqAit;acub*;WxwD>qV%1Nfq9;$!bOp=~UE{**d6ik!LGgoJg2dKHFY^K()8;Ds z4_p@}|9jFE`6A>+kXw`Yyy_iO7_$S9?_2NSduuh@vxTpoDTds&X|M`@%JGW*uJ;Pj zghxi7RK;gHNHv{NIUn1x`ouSD#zR_551d^wvA^od3wOhS2C1JCj%R1>HTYD>VftyK zxW!xNs@4-OQxEjU{PNzx_0@X^gGIa6>c1=E54s1OeiJw6pSfZS!xe#B&IcIp>`$KU zQp&QAXOH>blm4B1xX<|{R=s=AD(A?X>Hny%?-JvcYZtD*^xY?LNNsgv*qQZpGZ@Mk zvoB4b8riy1QD7za;o|**TVu|47v1Wbm8;)!Lf~}c|3f*cMN41XH)da+ymmF0v$Mh+ z?oY+>d^Y}7r(S+ualO{5W5OxceV)Jg?{_fY{#d?zt%5nrp}h)r-#PwGyBza=vqp=@ z@}&;yFV_a>?YH`ne|@cj8H-c=g?ZJsuVnY$e_GOcT~gF($?>%-zHY1w(-L3D_`vyI zTDhBJHb;x3W7WIuN#|EqH2(-~%W`i!?y?sJ*v`8j5Bv{*V;zMFsK&$R8k z!smRM9<11+`2A5`8cB%f(#>?3< zKQ@G$KQMC4;ApAbX8--`4Ra^+V9UQ9;pPq;iPwVOR6e)AT`IQY*zDT{oVTT!9`eqf z|J$f3)K9#+Sh_`E*^@{AbLy9ev)|LV-Lz9t;NHfsJJ~nR*{1Bx(z@Z6`N#c>3W{s5 zcF!&pjFx74s2e^1_jS|D&#r$p)z51aaJpagrhb0KQtiHSYqqq^CE70oXZg78Fm@I z)q&ET5))?|Pv>2|`sR*()23>Bt?YRgyeUEMue0H<%t^WQ=dNZQ4{XeF;7%?Z{NA(y*-CRS`OJil>Tm)dq4bVsW}!9^(UxZ>R!1~bG3}=@+T|AIlZR0nwG{ktKTd6dv4dBg&$uU z$Flq8Mr`FMwLcu-2kjU=T)(qU-67+*$*ifTRy}on^Z(!3_hDKL!ktqNo9pT?{d?c+ z;w6czo@^_^gTB9XGkW{^z;@HeH?ox!?S3cE(ZAodK#iU4)}BL6wN?+S%}AxC=b_&G)^FEwWS2pRRXO|8wPuO8PFoJUyLWzR)#0 z-dUUKW=ETZvDf&h>xxYazNuuv@q;@MA-J4Cw6Jr%lcsRpo2>0w~GeKy19 zFniwmy+uoz4D6m+oLlyEY0gcFuBC_mzba?qDf}Jm|66?#?=$z)bhP5*jH2R&l8p-ZgY?CUw5rg!h4S^$F&39<)S(|`_(7K3!KQEtE<0!Va4_7 zCzmh_b!lG!F9Mxyqnj#$mVH(xa()xWhc1$8SOt>3m)2o+BeZ(-Wabs=_Sar zb<@p7&zJ9*Q<=r(c7FLE?!_sN5Bm7(8z;PJ)K3eG5v;9G+){JleThY4r6q5Qe*7M9 zkf&*uYdqrW^T4V)#fJvU2mpZ?6_#S@kuo>lQu#vumae#cxnW;>^fzQ3ZH z7NEBHp1g~b9_>=y|Iu1^^Ts`M*cJ(^uJf^CI9PTh_dx7^ladMHO6#;{OjPXXKe!|+ zckAn;kJBD~KgN0Gl3w!g-g@^9Zd$GfNU%db<%q|0vXak=oR=+&-&f@Kr<95$5h z3DE;?H>G-W%=f23=emb~I`r4IgSJ!83&78CV zmL!)mvPE-VXg-$Nkb8gs%w<*VvwP1hdi+5l``-)INt5^enIYxm+hf!9t8|n2);;H6 zeHWCwTqz(KZLhOy;m>6iHg*4hy!deI$cv1pKVB3#8W|dz&y?{0ZM$*HoKu+%iW4@n z+PGK|(ShjTUc#Kv4(U2fyIf}SN%@V!dWNR=nR5@QR~_5&`C;uG$qUij>#G!w$@0Iw zyfy^Vbr7oxQ{T|~^o!uF2DdbY1wTG8r4-lsB!rph~ei?qZqVHV(9 zyCO9gG>W$2>9(kCxjUz=x^(lqg8fbD&US})OKe%Xfm&RXeC)~6-vY@ZbWsLM7KM6^~N&mgr!kuKGk&$xa0!+cwI z8!kw+WX`~9zd zcqZ?Uem10g!LjglRLIdc<*W~%buscj%lBMymGSq7?>kGGylu~=-&mt?<7vsvpV3M! z28q`H!iDnIt*Nz?9&woYCx zE9q7CD0oTziTZ8YeNm+fL6e*RFE;mE|JUJ2_iV)$gXdCL)*J2D?g?4Pcx99Q#97q= z-l~7=@{D7J52)`wUG;)x?VM|sMdB?2$JV;un3$?$Q{rlu|H?sZj zQogRVP4YrGIm=EaQOAF_isMr1Re|U=ZrnEaNpWgU>+Tf~o z-H;<3cAxyz<}mEJ-WA9=5!fZdlT^Z};QkXZfBlo-R0*xyzh; zSAgHstG;X#H!~Rd+kVJ>u+8Mp+UE`Ijn^-K*na5Pi+vw=S{C2juxnQD>+Hy#i>92) zuv6uJcF|sB@$U2~=bUS|yt6#V{d;$3zq;?=$bjb|TW0qdIGZrk`~NyuKA~t<;}Yfx zJHwdbkIkO^xQx*{;PA{tbMGFI-8C^K{p`cW+u1j({&Q))UX}K@ru@Ce?S0h^>gBSD zN|{d>BrPrd{JB45*!gSfcHtl5 zPv#WFnjSDTu}<46`g2QO{Mp~rbOZheM6eVGcYivt(9W#(gS1jrtWS`cl% zh$o!&k6nTIs?YD1%~5M)J`j9hzw%R)$DZsCF>5%sTAuW}B9LMmz$C)-p0TabFeJ5( zr&Q%l-IZ^LZD0E5W!N@7)A<#8y8Fi7WZqO)@wc07)(a?Yo-bd2aOOY5cYiL=zgV{+ zTwQZP-NAPkdR_J`=85R8+PjI#G;_VwjCQTn&MP)qF_bX62grVz9-!US!mxx{p{3WV zA#HnOw)UsY-}lZ=5sxoB;uK~kqEjMreda&Iu-Yu~{JC;vvtPHT z7aJOVZ!f>H_xHJawa3YQk8`5pPEG6mnm3tc)x4d7>P(6)m6sR=4(Vy%Wjk|r=IQ%? z4(e3DS9#Ru&d9J0GORl1NT^j~tH3i)b_b5#YYL=4IBTC?q2rl2DLzMH>v!*0s}}uS zlfSZLxKkAV6N&!#fBnjP2YLQ~ zH2i9HpmAz%V7un7BX4#Ka4KH%vSM($vGhRhfma!?vi~rC)l#sW_v!fRML+q1OE|Cp z6mqI?2B}DG`&zwHbKd(8GSgRTO4!c-AENLR?l96LrP$8oxA?h_qF}>U+aIC z`}iKb@$+S8WB7G*iQO!*_)WuL?>?HvN$BQDe-w z`+1q)8h0NRUyj7Slb@Hi3jE^R4XSVT@75Zw^5Q+a-COO7sQkl}_&MU%TdX8v(}Yx8 z3|!q9S~i?!+|Ky8({r2c%U%BqLhC>O$nH^BD_!)$V5*p6izL{0)eP5l-%kEtIfvQZ zWS+0WgRE;Adx zt6I|gWXa~u%zDKP7TGF}P8`XgR9QRk8fVR-^d4*Zd&}=~T0n-$K9;S2y_Qq2!pj_# zUe=wL6?dvwCS}2wF?av&6*m2IZ--l3Df(a9-DmF$DYghG{h7vS_$U9w-5A3K2mj~_ zI?YfjW@y=PonZod&4KqVJ3jC}klZh<*dpM>63X|1>)-!HLsOF{?WBFUGN+59Ho&(rXcLO4;_H z>CF=c28KX^Z=Tie1afgilIn-# z1g6cs|5!fgT$r=a! zue%noXt3O4=3zX%;^v>&1A-yPAF5vQVpeqV_$%M{bgI$x%xaM989ZJ6T-G@yGywqU C{&c_q diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-error.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-error.png new file mode 100644 index 0000000000000000000000000000000000000000..6662de009ca82075ab9596f1d340027c15e9cc6f GIT binary patch literal 778 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?a29w(7Beu2se&-0XOPMV z1_lPn64!{5;QX|b^2DN42FH~Aq*MjZ+{E+}rLn>}PnX%D} z*-^k@?*u=^ut|2)7=v$i2nhIOPCVzfx~8GEOsOpD4*QZz$NVmo2(~oDB~NXha!Wpp z%||vp!A))U&Aoe{G%<>|J$_e~e*f&7b7$fVtrQKLwnlU_A4k&yM)4_YEuZ%} z?s~BBT}xg3bVd(Jz3B>5=k$JJEaH>tG#5Cy#WC#Z^+pu~yK@Wr&(cWG?U#(_KZZ6}|+FxFu{`vYd&g{;XUE{4ZA)F&@qJ&77Be$--z>6N8W&`yP zAMQ@N{O+0V1rPtDK?`J)j<_x0^ZmlYzbE4M~svR2~$%D~Uz`+y`T32kq_=-^i*gzx5$gYyWi%>2PWhk3U}SsCwaZi zc$wu_jg^n(mb`y#cl=gH=DQC}hZdXE#=h`av+wMzIwQtTc`kPaYvYE(pnY?%8qKUf i{^z!RhCLGx!|sd0vFm*1US?omVDNPHb6Mw<&;$Sx4pA}y literal 0 HcmV?d00001 diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-pause.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..bd63b240466b78e32f7f3a9df5fdb8e0ef0fa684 GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?a29w(7Beu2se&-0XOPMV z1_lPn64!{5;QX|b^2DN42FH~Aq*MjZ+{E!fbF0{$duv_)yto`;)m^2Qp~cLs9-TTtdh-2~>i)A{%zl|ueXuyGa69+?$$`wV z(=R3G2?pfNk?<`K?p}MJheLty`H6F%ESe|x)jRAL7YI5qRaan5{xQK%x@>8G*2*Qh z?r)FvUbW7vV{Oh~RsZ=}=Sz-=Iy||yddD=4x+jGxEE21{gKqFKFArKi!!)wHrzFuA)xs%Yl+$Co-tgT$Y8)su~(XFfVuE+aE^NrM`YrEC< zF6`>#UUjcU%+5LTv<>UZys6W#xD-W)bxeIScZZqbJnx%3eV1$oxm&4^*uEG_Y~pBGMl|t z|I656mQ@_JR{q>9@6PMtH)iwInr16&EOzFeuyBW!)RdOo#WkNcIxhZ`!Q^yh{Vlg+ kKZ?)HU%S$tMS|fy+mCIR#g*6@7#J8lUHx3vIVCg!0Fj~%fB*mh literal 0 HcmV?d00001 diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-running.png b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Assets/icons/normal-running.png new file mode 100644 index 0000000000000000000000000000000000000000..26802de481305a076221c35b69fc4b996db66f9e GIT binary patch literal 690 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?a29w(7Beu2se&-0XOPMV z1_lPn64!{5;QX|b^2DN42FH~Aq*MjZ+{ET%U zau8YC;wvnBQ=*`t`L4yx6Iq9zEfVgQZqCcPladh=b0gx8Pmi>U-=({Gd=nmA3lyI5 zvG#NSoUPaYX}fmBeJaw-{J(c!{rCI&=Sr;3uDx{Pd037}j(ma4^0v-^nZ>#CFO;0` z=6_tO$vjbMnf8J?8#SCC$k;F$Dym&(yY^)}Gn38xXf2;pV$NFr4Qvx931wxU+H%Nf zx$K;O!AnIRnSDCco^&$j{yRD5+1pwy!n*ZOZwXuEwBuxIX6>EZJqpH$LYV9tqz}D5 z`FZ!!pv|T#$K#&foU%;lyz~K91E!PS-bX{;c-b}n+*KyY(Y#zyEJEDv_T?1M91SHF zp~pOY!Agd;bMJ5Ab6xXm``((PyL>Y|5hW;h zRKDfL#r_7_vsb?c8i%~zUb(h8xxQ48bt<3Fy2cY{oKE~vIy1HJBjbk&O&vz>XWClo zOn+6nLjPlfo!B>}Gx-nSvI|-e#OP}lK5tGslb;4f{XZF7w+_GyI8k| vgY$O3iqe!{eo?7w{`dXd{(nI&mjQ#WkOo`F@@^&u1_lOCS3j3^P6J4mJh`hKCF@W-u@?a29w(7Beu2se&-0XOPMV z1_lPn64!{5;QX|b^2DN42FH~Aq*MjZ+{E~)iP-CR z*g(K+$%)xNGBvr;JupdK-KBDjRZQZ$#``DipnW^4>R<4P|`y7aAKa zEPJD(Cz$YZiu}>%=fB_lKKF5W=u_U6toIH?W!yga{ja88%HzId@eMpYsquei2eBzA z$H*lFo_DNlzRT>M$$gN<1^*8n=gFxogUMcqUf%cs1P#!$p+m?p?alWJ1#SQpLh6^^5??h z;}aDPiuc^nG({c=}Vh~&-BQDKF5A^n!=HH zvkW9ACWU!99Lc`ED&U&R#%UtHOJ;nMNNtx|U%Q4^b^@VwdXnu+ajN?;@7?2 zX0|-@Z^1Pm)wubI>(#zwUURGI;Zt@fneyzWs#KzBuGi0vOeqm{CX9-&!gH0A|5`sg ef9=Y9CLV@08(uZ menuItems = Enumerable.Empty(); + public override void Init(string[] args) { //Init @@ -56,32 +60,41 @@ namespace Duplicati.GUI.TrayIcon #region implemented abstract members of Duplicati.GUI.TrayIcon.TrayIconBase protected override void Run(string[] args) { + var lifetime = new ClassicDesktopStyleApplicationLifetime() + { + Args = args, + ShutdownMode = ShutdownMode.OnExplicitShutdown + }; - - Avalonia.Controls.AppBuilderBase.Configure() + var builder = Avalonia.Controls.AppBuilderBase.Configure() .UsePlatformDetect() - .LogToTrace().StartWithClassicDesktopLifetime(args); + .LogToTrace().SetupWithLifetime(lifetime); + + application = builder.Instance as AvaloniaApp; + application.SetMenu(menuItems); + + lifetime.Start(args); } protected override IMenuItem CreateMenuItem(string text, MenuIcons icon, Action callback, IList subitems) { - return new Win32MenuItem(text, icon, callback, subitems); + return new AvaloniaMenuItem(text, icon, callback, subitems); } protected override void NotifyUser(string title, string message, NotificationType type) { - var icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; + //var icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; switch (type) { case NotificationType.Information: - icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; + //icon = Win32NativeNotifyIcon.InfoFlags.NIIF_INFO; break; case NotificationType.Warning: - icon = Win32NativeNotifyIcon.InfoFlags.NIIF_WARNING; + //icon = Win32NativeNotifyIcon.InfoFlags.NIIF_WARNING; break; case NotificationType.Error: - icon = Win32NativeNotifyIcon.InfoFlags.NIIF_ERROR; + //icon = Win32NativeNotifyIcon.InfoFlags.NIIF_ERROR; break; } @@ -90,44 +103,18 @@ namespace Duplicati.GUI.TrayIcon protected override void Exit() { - //m_ntfIcon.Delete(); - //m_window.DestroyWindow(); + this.application?.Shutdown(); } protected override void SetIcon(TrayIcons icon) { - //There are calls before NotifyIcons is created - //if (m_ntfIcon == null) - // return; - - //switch (icon) - //{ - // case TrayIcons.IdleError: - // m_ntfIcon?.SetIcon(Win32IconLoader.TrayErrorIcon); - // break; - // case TrayIcons.Paused: - // case TrayIcons.PausedError: - // m_ntfIcon?.SetIcon(Win32IconLoader.TrayPauseIcon); - // break; - // case TrayIcons.Running: - // case TrayIcons.RunningError: - // m_ntfIcon?.SetIcon(Win32IconLoader.TrayWorkingIcon); - // break; - // case TrayIcons.Idle: - // m_ntfIcon?.SetIcon(Win32IconLoader.TrayNormalIcon); - // break; - // default: - // m_ntfIcon?.SetIcon(Win32IconLoader.TrayNormalIcon); - // break; - //} + this.application?.SetIcon(icon); } - protected override void SetMenu(System.Collections.Generic.IEnumerable items) + protected override void SetMenu(IEnumerable items) { - //m_TrayContextMenu = new List(); - - //foreach(var item in items) - // m_TrayContextMenu.Add((Win32MenuItem)item); + this.menuItems = items.Select(i => (AvaloniaMenuItem)i); + this.application?.SetMenu(menuItems); } public override void Dispose() @@ -136,27 +123,153 @@ namespace Duplicati.GUI.TrayIcon #endregion } + public class AvaloniaMenuItem : IMenuItem + { + + public string Text { get; private set; } + public Action Callback { get; private set; } + public IList SubItems { get; private set; } + public bool Enabled { get; private set; } + + public AvaloniaMenuItem(string text, MenuIcons icon, Action callback, IList subitems) + { + if (subitems != null && subitems.Count > 0) + throw new NotImplementedException("So far not needed."); + + this.Text = text; + this.Callback = callback; + this.SubItems = subitems; + this.Enabled = true; + SetIcon(icon); + } + + #region IMenuItem implementation + public void SetText(string text) + { + this.Text = text; + } + + public void SetIcon(MenuIcons icon) + { + switch (icon) + { + case MenuIcons.Pause: + //this.Icon = Win32IconLoader.MenuPauseIcon; + break; + case MenuIcons.Quit: + //this.Icon = Win32IconLoader.MenuQuitIcon; + break; + case MenuIcons.Resume: + //this.Icon = Win32IconLoader.MenuPlayIcon; + break; + case MenuIcons.Status: + //this.Icon = Win32IconLoader.MenuOpenIcon; + break; + case MenuIcons.None: + default: + //this.Icon = new SafeIconHandle(IntPtr.Zero); + break; + } + } + + public void SetEnabled(bool isEnabled) + { + this.Enabled = isEnabled; + } + + public void SetDefault(bool value) + { + //TODO-DNC Cosmetic, not needed + } + #endregion + + public NativeMenuItem GetNativeItem() + { + var item = new NativeMenuItem(Text); + item.IsEnabled = Enabled; + item.Click += (_sender, _args) => + { + Callback(); + }; + return item; + } + } + public class AvaloniaApp : Application { + private Avalonia.Controls.TrayIcon trayIcon; + public override void Initialize() { //AvaloniaXamlLoader.Load(this); } + public void SetIcon(TrayIcons icon) + { + //There are calls before the icon is created + if (this.trayIcon == null) + return; + + switch (icon) + { + case TrayIcons.IdleError: + this.trayIcon.Icon = LoadIcon("normal-error.png"); + break; + case TrayIcons.Paused: + case TrayIcons.PausedError: + this.trayIcon.Icon = LoadIcon("normal-pause.png"); + break; + case TrayIcons.Running: + case TrayIcons.RunningError: + this.trayIcon.Icon = LoadIcon("normal-running.png"); + break; + case TrayIcons.Idle: + default: + this.trayIcon.Icon = LoadIcon("normal.png"); + break; + } + } + + public void SetMenu(IEnumerable menuItems) + { + var menu = new NativeMenu(); + foreach (var item in menuItems) + { + menu.Add(item.GetNativeItem()); + } + trayIcon.Menu = menu; + } + + public void Shutdown() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + desktop.Shutdown(); + } + else + { + throw new Exception("Unsupported Lifetime"); + } + } + + private WindowIcon LoadIcon(string iconName) + { + var assets = AvaloniaLocator.Current.GetService(); + var bitmap = new Bitmap(assets.Open(new Uri($"avares://{Assembly.GetExecutingAssembly().FullName}/Assets/icons/" + iconName))); + return new WindowIcon(bitmap); + } + public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - desktop.ShutdownMode = ShutdownMode.OnExplicitShutdown; - var light = new FluentTheme(new Uri($"avares://{Assembly.GetExecutingAssembly().GetName()}")) { Mode = FluentThemeMode.Light }; Styles.Add(light); - var assets = AvaloniaLocator.Current.GetService(); - var bitmap = new Bitmap(assets.Open(new Uri($"avares://{Assembly.GetExecutingAssembly().FullName}/Assets/icons/icon.png"))); - var icon = new WindowIcon(bitmap); + var icon = LoadIcon("normal.png"); var trayIcon = new Avalonia.Controls.TrayIcon(); - trayIcon.Icon = icon; //desktop.MainWindow.Icon; + this.trayIcon = trayIcon; + trayIcon.Icon = icon; trayIcon.ToolTipText = "Test"; var menu = new NativeMenu(); var item = new NativeMenuItem("Quit"); From 0a35243b07f2caa8311c0472f5298f2e46131b19 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 28 Sep 2022 21:47:22 -0700 Subject: [PATCH 226/253] macos-12 --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 85d9e2227..c2376b953 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -7,7 +7,7 @@ on: jobs: zip: - runs-on: macos-10.15 + runs-on: macos-12 steps: - uses: actions/checkout@v2 - name: Download dotnet @@ -74,7 +74,7 @@ jobs: name: duplicati-freebsd-x64 path: publish tests: - runs-on: macos-10.15 + runs-on: macos-12 steps: - uses: actions/checkout@v2 - name: Download dotnet From afa322cc59f44bff72ec3980c83185f0a8240879 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 28 Sep 2022 21:54:03 -0700 Subject: [PATCH 227/253] Update freebsd action --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index c2376b953..30e0c8ae9 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -16,7 +16,7 @@ jobs: run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.3/dotnet-sdk-6.0.201-freebsd-x64.tar.gz -o dn.tgz - name: Build id: test - uses: vmactions/freebsd-vm@v0.1.5 + uses: vmactions/freebsd-vm@v0 with: usesh: true sync: sshfs @@ -83,7 +83,7 @@ jobs: run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.3/dotnet-sdk-6.0.201-freebsd-x64.tar.gz -o dn.tgz - name: Run test id: test - uses: vmactions/freebsd-vm@v0.1.5 + uses: vmactions/freebsd-vm@v0 with: usesh: true sync: sshfs From 173b6f8ef05ead17182287661982b10ac10eeceb Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 28 Sep 2022 21:54:20 -0700 Subject: [PATCH 228/253] Update freebsd .net version --- .github/workflows/freebsd.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 30e0c8ae9..d92a193bf 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -13,7 +13,7 @@ jobs: - name: Download dotnet # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.3/dotnet-sdk-6.0.201-freebsd-x64.tar.gz -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.401-11/dotnet-sdk-6.0.401-freebsd-x64.tar.gz -o dn.tgz - name: Build id: test uses: vmactions/freebsd-vm@v0 @@ -49,8 +49,8 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - export RVERSION=v6.0.3 - export VERSION=6.0.3 + export RVERSION=v6.0.401-11 + export VERSION=6.0.401 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg @@ -80,7 +80,7 @@ jobs: - name: Download dotnet # See also https://github.com/sec/dotnet-core-freebsd-source-build # See also https://github.com/Thefrank/dotnet-freebsd-crossbuild - run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.3/dotnet-sdk-6.0.201-freebsd-x64.tar.gz -o dn.tgz + run: curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/v6.0.401-11/dotnet-sdk-6.0.401-freebsd-x64.tar.gz -o dn.tgz - name: Run test id: test uses: vmactions/freebsd-vm@v0 @@ -116,8 +116,8 @@ jobs: tar -xzf ${BUILD_DIR}/dn.tgz cd ${BUILD_DIR} mkdir /var/tmp/nuget - export RVERSION=v6.0.3 - export VERSION=6.0.3 + export RVERSION=v6.0.401-11 + export VERSION=6.0.401 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg From bf3e6337b0aeebf5c1f1caee183cfc699650cb7f Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 28 Sep 2022 22:15:13 -0700 Subject: [PATCH 229/253] Try without sshfs --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index d92a193bf..2b9fc3aaa 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -19,7 +19,7 @@ jobs: uses: vmactions/freebsd-vm@v0 with: usesh: true - sync: sshfs + # sync: sshfs prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget icu run: | #!/bin/bash @@ -86,7 +86,7 @@ jobs: uses: vmactions/freebsd-vm@v0 with: usesh: true - sync: sshfs + # sync: sshfs prepare: pkg install -y curl libinotify libunwind git cmake ninja bash wget icu run: | #!/bin/bash From 052b169e9e4fa670c326eac9cdf6bad278af9ca1 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 29 Sep 2022 21:01:39 -0700 Subject: [PATCH 230/253] Fix verson number --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index 2b9fc3aaa..e66958967 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -50,7 +50,7 @@ jobs: cd ${BUILD_DIR} mkdir /var/tmp/nuget export RVERSION=v6.0.401-11 - export VERSION=6.0.401 + export VERSION=6.0.9 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg @@ -117,7 +117,7 @@ jobs: cd ${BUILD_DIR} mkdir /var/tmp/nuget export RVERSION=v6.0.401-11 - export VERSION=6.0.401 + export VERSION=6.0.9 curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.AspNetCore.App.Runtime.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Host.freebsd-x64.${VERSION}.nupkg curl -L https://github.com/Thefrank/dotnet-freebsd-crossbuild/releases/download/${RVERSION}/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg -o /var/tmp/nuget/Microsoft.NETCore.App.Runtime.freebsd-x64.${VERSION}.nupkg From ae70cf344da09d4d22a1fc45be66edf3b7702270 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 29 Sep 2022 21:36:51 -0700 Subject: [PATCH 231/253] give up on freebsd --- .github/workflows/freebsd.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml index e66958967..977a0a9ea 100644 --- a/.github/workflows/freebsd.yml +++ b/.github/workflows/freebsd.yml @@ -1,9 +1,9 @@ name: Freebsd on: push: - branches: "**net5**" + branches: "**freebsd**" pull_request: - branches: "**net5**" + branches: "**freebsd**" jobs: zip: From 3f9263892bad34995c497ade122fa1ab61ad1827 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 6 Nov 2022 22:05:36 -0800 Subject: [PATCH 232/253] Disable encryption of database due to closed source --- Duplicati/Server/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati/Server/Program.cs b/Duplicati/Server/Program.cs index c2c731da2..a905d5968 100644 --- a/Duplicati/Server/Program.cs +++ b/Duplicati/Server/Program.cs @@ -637,7 +637,7 @@ namespace Duplicati.Server if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(DatabasePath))) System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(DatabasePath)); -#if DEBUG +#if DEBUG || !SQLLITE_WITH_CLOSED_SOURCE_ENCRYPTION //Default is to not use encryption for debugging var useDatabaseEncryption = commandlineOptions.ContainsKey("unencrypted-database") && !Library.Utility.Utility.ParseBool(commandlineOptions["unencrypted-database"], true); #else From 08472517b9d671068c7def9703a91863b4f20a7b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 12 Nov 2022 10:38:06 -0800 Subject: [PATCH 233/253] Fix tray icon issues on MacOS --- Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs index 41c0011a3..c8a40f692 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/AvaloniaRunner.cs @@ -232,7 +232,9 @@ namespace Duplicati.GUI.TrayIcon public void SetMenu(IEnumerable menuItems) { - var menu = new NativeMenu(); + // Reuse the menu on Mac + var menu = trayIcon.Menu ?? new NativeMenu(); + menu.Items.Clear(); foreach (var item in menuItems) { menu.Add(item.GetNativeItem()); @@ -271,7 +273,8 @@ namespace Duplicati.GUI.TrayIcon this.trayIcon = trayIcon; trayIcon.Icon = icon; trayIcon.ToolTipText = "Test"; - var menu = new NativeMenu(); + //The menu already exists on Mac but is nullable... + var menu = trayIcon.Menu ?? new NativeMenu(); var item = new NativeMenuItem("Quit"); item.Click += (_sender, _args) => { From ab805b2173cf0115ef62b60736c860bf991ca6fe Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 13 Nov 2022 10:08:35 -0800 Subject: [PATCH 234/253] Take 1 at Duplicati DMG --- .github/workflows/artifacts.yml | 20 ++ Installer/OSX/{ => dmg}/Duplicati.icns | Bin Installer/OSX/{ => dmg}/Info.plist | 4 +- Installer/OSX/dmg/build.sh | 12 ++ Installer/OSX/dmg/make-dmg.sh | 118 +++++++++++ Installer/OSX/{ => dmg}/template.dmg.bz2 | Bin Installer/OSX/make-dmg.sh | 237 ----------------------- 7 files changed, 153 insertions(+), 238 deletions(-) rename Installer/OSX/{ => dmg}/Duplicati.icns (100%) rename Installer/OSX/{ => dmg}/Info.plist (88%) create mode 100644 Installer/OSX/dmg/build.sh create mode 100644 Installer/OSX/dmg/make-dmg.sh rename Installer/OSX/{ => dmg}/template.dmg.bz2 (100%) delete mode 100755 Installer/OSX/make-dmg.sh diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index e2ed81635..cdfce5be6 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -83,3 +83,23 @@ jobs: with: name: duplicati-win-x64-msi path: duplicati-win-x64.msi + dmg: + runs-on: macos-latest + needs: zip + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Download zip + uses: actions/download-artifact@v2 + with: + name: duplicati-osx-x64 + path: bin + - name: Build DMG + shell: bash + run: | + Installer/OSX/dmg/build.sh + - name: Save Artifacts + uses: actions/upload-artifact@v2 + with: + name: Duplicati.dmg + path: Duplicati.dmg diff --git a/Installer/OSX/Duplicati.icns b/Installer/OSX/dmg/Duplicati.icns similarity index 100% rename from Installer/OSX/Duplicati.icns rename to Installer/OSX/dmg/Duplicati.icns diff --git a/Installer/OSX/Info.plist b/Installer/OSX/dmg/Info.plist similarity index 88% rename from Installer/OSX/Info.plist rename to Installer/OSX/dmg/Info.plist index 72f6c37df..21d44ef69 100644 --- a/Installer/OSX/Info.plist +++ b/Installer/OSX/dmg/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - duplicati + Duplicati.GUI.TrayIcon CFBundleIconFile Duplicati.icns CFBundleIdentifier @@ -24,6 +24,8 @@ Duplicati CFBundleShortVersionString !LONG_VERSION! + NSPrincipalClass + NSApplication LSUIElement diff --git a/Installer/OSX/dmg/build.sh b/Installer/OSX/dmg/build.sh new file mode 100644 index 000000000..0c2777a8c --- /dev/null +++ b/Installer/OSX/dmg/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash +#This is a helper to make the macos app. It assumes a bin folder exists a the root of the project with an unzipped install + +SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) + +VERSION=`grep '' < $SCRIPTDIR/../../../Executables/net5/Duplicati.Server/Duplicati.Server.csproj | sed 's/.*\([^\.]*\.[^\.]*\.[^\.]*\).*<\/Version>.*/\1/'` +VERSION=${VERSION//$'\r\n'} +echo "Building version: ($VERSION)" +export VERSION_NUMBER=VERSION + +$SCRIPTDIR/make-dmg.sh $SCRIPTDIR/../../../bin/ + diff --git a/Installer/OSX/dmg/make-dmg.sh b/Installer/OSX/dmg/make-dmg.sh new file mode 100644 index 000000000..84fbd7406 --- /dev/null +++ b/Installer/OSX/dmg/make-dmg.sh @@ -0,0 +1,118 @@ +#!/bin/sh +# +SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) +SRC=$1 + +WC_DMG=wc.dmg +WC_DIR=wc +TEMPLATE_DMG=template.dmg +OUTPUT_DMG=Duplicati.dmg +UNWANTED_FILES="win-tools control_dir Duplicati.sqlite Duplicati-server.sqlite run-script-example.bat lvm-scripts Duplicati.debug.log" + +TEMPLATE_DMG_BZ2=$(echo "$SCRIPTDIR/$TEMPLATE_DMG.bz2") +DELETE_DMG=0 + +if [ -f "$SCRIPTDIR/$TEMPLATE_DMG_BZ2" ]; then + if [ -f "$SCRIPTDIR/$TEMPLATE_DMG" ]; then + rm -rf "$SCRIPTDIR/$TEMPLATE_DMG" + fi + + bzip2 --decompress --keep --quiet "$SCRIPTDIR/$TEMPLATE_DMG_BZ2" + DELETE_DMG=1 +fi + +if [ ! -f "$SCRIPTDIR/$TEMPLATE_DMG" ]; then + echo "Template file $TEMPLATE_DMG not found" + exit +fi + +if [ ! -d "$SRC" ]; then + echo "Please supply a source directory as the first argument" + exit +fi + +OUTPUT_DMG="$SRC/../$OUTPUT_DMG" + +if [ -z ${VERSION_NUMBER+x} ]; then + echo "Please set the VERSION_NUMBER environment variable before calling" + VERSION_NUMBER=0.0.0 +fi + +VERSION_NAME="Duplicati" +if [ -e "${OUTPUT_DMG}" ]; then + rm -rf "${OUTPUT_DMG}" +fi + +# Remove any existing work copy +if [ -e "Duplicati.app" ]; then + sudo rm -rf "Duplicati.app" +fi + +# Create folder structure +mkdir "Duplicati.app" +mkdir "Duplicati.app/Contents" +mkdir "Duplicati.app/Contents/MacOS" +mkdir "Duplicati.app/Contents/Resources" + +# Extract the zip into the Resouces folder +cp -r $SRC "Duplicati.app/Contents/Resources" + +# Install the Info.plist and icon, patch the plist file as well +PLIST=$(cat "$SCRIPTDIR/Info.plist") +PLIST=${PLIST//!LONG_VERSION!/${VERSION_NUMBER}} +echo ${PLIST} > "Duplicati.app/Contents/Info.plist" +cp "$SCRIPTDIR/Duplicati.icns" "Duplicati.app/Contents/Resources" + +chmod +x "Duplicati.app/Contents/MacOS/Duplicati.GUI.TrayIcon" + +# Remove some of the files that we do not like +for FILE in $UNWANTED_FILES +do + if [ -e "Duplicati.app/Contents/Resources/${FILE}" ] + then + rm -rf "Duplicati.app/Contents/Resources/${FILE}" + fi +done + +# Set permissions +sudo chown -R root:admin "Duplicati.app" + +# Prepare a new dmg +echo "Building dmg" +if [ "$DELETE_DMG" -eq "1" ] +then + # If we have just extracted the dmg, use that as working copy + WC_DMG=$SCRIPTDIR/$TEMPLATE_DMG +else + # Otherwise we want a copy so we kan keep the original fresh + cp "$SCRIPTDIR/$TEMPLATE_DMG" "$WC_DMG" +fi + +# Make a mount point and mount the new dmg +mkdir -p "$WC_DIR" +hdiutil attach "$WC_DMG" -noautoopen -quiet -mountpoint "$WC_DIR" + +# Change the dmg name +echo "Setting dmg name to $VERSION_NAME" +diskutil quiet rename wc "$VERSION_NAME" + +# Make the Duplicati.app structure, root folder should exist +if [ -e "$WC_DIR/Duplicati.app" ] +then + rm -rf "$WC_DIR/Duplicati.app" +fi + +# Move in the prepared folder +sudo mv "Duplicati.app" "$WC_DIR/Duplicati.app" + +# Unmount the dmg +hdiutil detach "$WC_DIR" -quiet -force + +# Compress the dmg +hdiutil convert "$WC_DMG" -quiet -format UDZO -imagekey zlib-level=9 -o "${OUTPUT_DMG}" + +# Clean up +rm -rf "$WC_DMG" +rm -rf "$WC_DIR" + +echo "Done, created ${OUTPUT_DMG}" diff --git a/Installer/OSX/template.dmg.bz2 b/Installer/OSX/dmg/template.dmg.bz2 similarity index 100% rename from Installer/OSX/template.dmg.bz2 rename to Installer/OSX/dmg/template.dmg.bz2 diff --git a/Installer/OSX/make-dmg.sh b/Installer/OSX/make-dmg.sh deleted file mode 100755 index 0b090ab75..000000000 --- a/Installer/OSX/make-dmg.sh +++ /dev/null @@ -1,237 +0,0 @@ -#!/bin/sh -# -# DMG building script adopted from: -# http://el-tramo.be/git/fancy-dmg/plain/Makefile -# - -WC_DMG=wc.dmg -WC_DIR=wc -TEMPLATE_DMG=template.dmg -OUTPUT_DMG=Duplicati.dmg -OUTPUT_PKG=Duplicati.pkg -UNWANTED_FILES="appindicator-sharp.dll SQLite win-tools control_dir Duplicati.sqlite Duplicati-server.sqlite run-script-example.bat lvm-scripts Duplicati.debug.log SVGIcons storj_uplink.dll libstorj_uplink.so win-x64 win-x86" - -# These are set via the macos-gatekeeper file -CODESIGN_IDENTITY= -NOTARIZE_USERNAME= -NOTARIZE_PASSWORD= -GATEKEEPER_SETTINGS_FILE="${HOME}/.config/signkeys/Duplicati/macos-gatekeeper" - -if [ -f "${GATEKEEPER_SETTINGS_FILE}" ]; then - source "${GATEKEEPER_SETTINGS_FILE}" -fi - - -TEMPLATE_DMG_BZ2=$(echo "$TEMPLATE_DMG.bz2") -DELETE_DMG=0 - -if [ -f "$TEMPLATE_DMG_BZ2" ]; then - if [ -f "$TEMPLATE_DMG" ]; then - rm -rf "$TEMPLATE_DMG" - fi - - bzip2 --decompress --keep --quiet "$TEMPLATE_DMG_BZ2" - DELETE_DMG=1 -fi - -if [ ! -f "$TEMPLATE_DMG" ]; then - echo "Template file $TEMPLATE_DMG not found" - exit -fi - -if [ ! -f "$1" ]; then - echo "Please supply a packaged zip file as the first input argument" - exit -fi - -ZIPNAME=$(basename "$1") -VERSION_NUMBER=$(echo "$ZIPNAME" | awk -F- '{print $2}' | awk -F_ '{print $1}') - -VERSION_NAME="Duplicati" -if [ -e "${OUTPUT_DMG}" ]; then - rm -rf "${OUTPUT_DMG}" -fi - -if [ -e "${OUTPUT_PKG}" ]; then - rm -rf "${OUTPUT_PKG}" -fi - -# Remove any existing work copy -if [ -e "Duplicati.app" ]; then - sudo rm -rf "Duplicati.app" -fi - -# Create folder structure -mkdir "Duplicati.app" -mkdir "Duplicati.app/Contents" -mkdir "Duplicati.app/Contents/MacOS" -mkdir "Duplicati.app/Contents/Resources" - -# Extract the zip into the Resouces folder -unzip -q "$1" -d "Duplicati.app/Contents/Resources" - -# Install the Info.plist and icon, patch the plist file as well -PLIST=$(cat "Info.plist") -PLIST=${PLIST//!LONG_VERSION!/${VERSION_NUMBER}} -echo ${PLIST} > "Duplicati.app/Contents/Info.plist" -cp "Duplicati.icns" "Duplicati.app/Contents/Resources" - -for n in "../oem" "../../oem" "../../../oem" -do - if [ -d $n ]; then - echo "Installing OEM files" - cp -R $n Duplicati.app/Contents/Resources/webroot/ - fi -done - -for n in "oem-app-name.txt" "oem-update-url.txt" "oem-update-key.txt" "oem-update-readme.txt" "oem-update-installid.txt" -do - for p in "../$n" "../../$n" "../../../$n" - do - if [ -f $p ]; then - echo "Installing OEM override file" - cp $p Duplicati.app/Contents/Resources - fi - done -done - - -# Install the LauncAgent if anyone needs it -cp -R "daemon" "Duplicati.app/Contents/Resources" - -# Build launchers -cd "launchers" -bash "compile.sh" -cd .. - -# Install launchers -mv "launchers/bin/duplicati" "Duplicati.app/Contents/MacOS/duplicati" -mv "launchers/bin/duplicati-cli" "Duplicati.app/Contents/MacOS/duplicati-cli" -mv "launchers/bin/duplicati-server" "Duplicati.app/Contents/MacOS/duplicati-server" -cp "uninstall.sh" "Duplicati.app/Contents/MacOS/" - -chmod +x "Duplicati.app/Contents/MacOS/duplicati" -chmod +x "Duplicati.app/Contents/MacOS/duplicati-cli" -chmod +x "Duplicati.app/Contents/MacOS/duplicati-server" -chmod +x "Duplicati.app/Contents/MacOS/uninstall.sh" - -# Remove some of the files that we do not like -for FILE in $UNWANTED_FILES -do - if [ -e "Duplicati.app/Contents/Resources/${FILE}" ] - then - rm -rf "Duplicati.app/Contents/Resources/${FILE}" - fi -done - -# Codesign the app bundle -if [ "x${CODESIGN_IDENTITY}" != "x" ]; then - echo "Codesigning application bundle" - - #Do a poke to get sudo prompt up before the long-running sign-process - UNUSED=$(sudo ls) - - # Codesign all resources in bundle (i.e. the actual code) - # Not required, but nice-to-have - find "Duplicati.app/Contents/Resources" -type f -print0 | xargs -0 codesign -s "${CODESIGN_IDENTITY}" - - # These files have dependencies, so we need to sign them in the correct order - for file in "duplicati-cli" "duplicati-server" "uninstall.sh"; do - codesign -f --options=runtime -s "${CODESIGN_IDENTITY}" "Duplicati.app/Contents/MacOS/${file}" - done - - # Then sign the whole package - codesign -f --options=runtime -s "${CODESIGN_IDENTITY}" "Duplicati.app" -else - echo "No codesign identity supplied, skipping bundle signing" -fi - -# Set permissions -sudo chown -R root:admin "Duplicati.app" -sudo chown -R root:wheel "daemon/com.duplicati.app.launchagent.plist" -sudo chmod -R 644 "daemon/com.duplicati.app.launchagent.plist" -sudo chmod +x daemon-scripts/postinstall -sudo chmod +x daemon-scripts/preinstall -sudo chmod +x app-scripts/postinstall -sudo chmod +x app-scripts/preinstall - - -if [ -f "DuplicatiApp.pkg" ]; then - rm -rf "DuplicatiApp.pkg" -fi - -if [ -f "DuplicatiDaemon.pkg" ]; then - rm -rf "DuplicatiDaemon.pkg" -fi - -# Make a PKG file, commented out lines can be uncommented to re-generate the lists -#pkgbuild --analyze --root "./Duplicati.app" --install-location /Applications/Duplicati.app "InstallerComponent.plist" -pkgbuild --scripts app-scripts --identifier com.duplicati.app --root "./Duplicati.app" --install-location /Applications/Duplicati.app --component-plist "InstallerComponent.plist" "DuplicatiApp.pkg" -pkgbuild --scripts daemon-scripts --identifier com.duplicati.app.daemon --root "./daemon" --install-location /Library/LaunchAgents "DuplicatiDaemon.pkg" - -#productbuild --synthesize --package "DuplicatiApp.pkg" "Distribution.xml" -productbuild --distribution "Distribution.xml" --package-path "." --resources "." "${OUTPUT_PKG}" - -# Alternate to allow fixing the package -#productbuild --distribution "Distribution.xml" --package-path . "DuplicatiTmp.pkg" -#pkgutil --expand "DuplicatiTmp.pkg" "DuplicatiIntermediate" -#pkgutil --flatten "DuplicatiIntermediate" "Duplicati.pkg" -#rm -rf "DuplicatiTmp.pkg" - -rm -rf "DuplicatiApp.pkg" -rm -rf "DuplicatiDaemon.pkg" - -if [ "x${CODESIGN_IDENTITY}" != "x" ]; then - echo "Codesigning installer package" - productsign --sign "${CODESIGN_IDENTITY}" "${OUTPUT_PKG}" "${OUTPUT_PKG}.signed" - mv "${OUTPUT_PKG}.signed" "${OUTPUT_PKG}" -else - echo "No codesign identity supplied, skipping package signing" -fi - -# Prepare a new dmg -echo "Building dmg" -if [ "$DELETE_DMG" -eq "1" ] -then - # If we have just extracted the dmg, use that as working copy - WC_DMG=$TEMPLATE_DMG -else - # Otherwise we want a copy so we kan keep the original fresh - cp "$TEMPLATE_DMG" "$WC_DMG" -fi - -# Make a mount point and mount the new dmg -mkdir -p "$WC_DIR" -hdiutil attach "$WC_DMG" -noautoopen -quiet -mountpoint "$WC_DIR" - -# Change the dmg name -echo "Setting dmg name to $VERSION_NAME" -diskutil quiet rename wc "$VERSION_NAME" - -# Make the Duplicati.app structure, root folder should exist -if [ -e "$WC_DIR/Duplicati.app" ] -then - rm -rf "$WC_DIR/Duplicati.app" -fi - -# Move in the prepared folder -sudo mv "Duplicati.app" "$WC_DIR/Duplicati.app" - -# Unmount the dmg -hdiutil detach "$WC_DIR" -quiet -force - -# Compress the dmg -hdiutil convert "$WC_DMG" -quiet -format UDZO -imagekey zlib-level=9 -o "${OUTPUT_DMG}" - -# Clean up -rm -rf "$WC_DMG" -rm -rf "$WC_DIR" - -if [ "x${CODESIGN_IDENTITY}" != "x" ]; then - echo "Codesigning DMG image" - codesign -f --options=runtime -s "${CODESIGN_IDENTITY}" "${OUTPUT_DMG}" -else - echo "No codesign identity supplied, skipping DMG signing" -fi - -echo "Done, created ${OUTPUT_DMG}" From 71796c6ebf8e12495f36fe34a09f9d0b49aa3866 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 13 Nov 2022 10:26:20 -0800 Subject: [PATCH 235/253] Fix executable bit --- Installer/OSX/dmg/build.sh | 0 Installer/OSX/dmg/make-dmg.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 Installer/OSX/dmg/build.sh mode change 100644 => 100755 Installer/OSX/dmg/make-dmg.sh diff --git a/Installer/OSX/dmg/build.sh b/Installer/OSX/dmg/build.sh old mode 100644 new mode 100755 diff --git a/Installer/OSX/dmg/make-dmg.sh b/Installer/OSX/dmg/make-dmg.sh old mode 100644 new mode 100755 From 4501dff4d3291e92331f0b47257d57b5854256ba Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 13 Nov 2022 10:44:50 -0800 Subject: [PATCH 236/253] Fix Path --- Installer/OSX/dmg/make-dmg.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/OSX/dmg/make-dmg.sh b/Installer/OSX/dmg/make-dmg.sh index 84fbd7406..7477cb1d4 100755 --- a/Installer/OSX/dmg/make-dmg.sh +++ b/Installer/OSX/dmg/make-dmg.sh @@ -9,7 +9,7 @@ TEMPLATE_DMG=template.dmg OUTPUT_DMG=Duplicati.dmg UNWANTED_FILES="win-tools control_dir Duplicati.sqlite Duplicati-server.sqlite run-script-example.bat lvm-scripts Duplicati.debug.log" -TEMPLATE_DMG_BZ2=$(echo "$SCRIPTDIR/$TEMPLATE_DMG.bz2") +TEMPLATE_DMG_BZ2=$(echo "$TEMPLATE_DMG.bz2") DELETE_DMG=0 if [ -f "$SCRIPTDIR/$TEMPLATE_DMG_BZ2" ]; then From 2e2da4fde7f25521496536c712dd9fe1731d4c49 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 13 Nov 2022 13:32:47 -0800 Subject: [PATCH 237/253] Fix file placement and plist generation --- Installer/OSX/dmg/make-dmg.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Installer/OSX/dmg/make-dmg.sh b/Installer/OSX/dmg/make-dmg.sh index 7477cb1d4..1fb993ae7 100755 --- a/Installer/OSX/dmg/make-dmg.sh +++ b/Installer/OSX/dmg/make-dmg.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) SRC=$1 @@ -54,13 +54,19 @@ mkdir "Duplicati.app/Contents" mkdir "Duplicati.app/Contents/MacOS" mkdir "Duplicati.app/Contents/Resources" -# Extract the zip into the Resouces folder -cp -r $SRC "Duplicati.app/Contents/Resources" +# Extract the zip into the MacOS folder +cp -r $SRC "Duplicati.app/Contents/MacOS" # Install the Info.plist and icon, patch the plist file as well +echo Patching "$SCRIPTDIR/Info.plist" PLIST=$(cat "$SCRIPTDIR/Info.plist") PLIST=${PLIST//!LONG_VERSION!/${VERSION_NUMBER}} -echo ${PLIST} > "Duplicati.app/Contents/Info.plist" + +echo PATCHED BEGIN +echo "${PLIST}" +echo PATCHED END + +echo "${PLIST}" > "Duplicati.app/Contents/Info.plist" cp "$SCRIPTDIR/Duplicati.icns" "Duplicati.app/Contents/Resources" chmod +x "Duplicati.app/Contents/MacOS/Duplicati.GUI.TrayIcon" From aeb4402a5482c6d4e7219604fadbb08d683bbe51 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 13 Nov 2022 13:51:37 -0800 Subject: [PATCH 238/253] Resize the DMG before populating it --- Installer/OSX/dmg/make-dmg.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Installer/OSX/dmg/make-dmg.sh b/Installer/OSX/dmg/make-dmg.sh index 1fb993ae7..0258977ce 100755 --- a/Installer/OSX/dmg/make-dmg.sh +++ b/Installer/OSX/dmg/make-dmg.sh @@ -61,11 +61,6 @@ cp -r $SRC "Duplicati.app/Contents/MacOS" echo Patching "$SCRIPTDIR/Info.plist" PLIST=$(cat "$SCRIPTDIR/Info.plist") PLIST=${PLIST//!LONG_VERSION!/${VERSION_NUMBER}} - -echo PATCHED BEGIN -echo "${PLIST}" -echo PATCHED END - echo "${PLIST}" > "Duplicati.app/Contents/Info.plist" cp "$SCRIPTDIR/Duplicati.icns" "Duplicati.app/Contents/Resources" @@ -96,6 +91,7 @@ fi # Make a mount point and mount the new dmg mkdir -p "$WC_DIR" +hdiutil resize -size 300M "$WC_DMG" hdiutil attach "$WC_DMG" -noautoopen -quiet -mountpoint "$WC_DIR" # Change the dmg name From bb3ab13a8e9748ee10855064708e6c46fd2663e9 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 18 Nov 2022 21:41:41 -0800 Subject: [PATCH 239/253] Cleanup osx build --- Installer/OSX/dmg/build.sh | 2 +- Installer/OSX/dmg/make-dmg.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Installer/OSX/dmg/build.sh b/Installer/OSX/dmg/build.sh index 0c2777a8c..575089239 100755 --- a/Installer/OSX/dmg/build.sh +++ b/Installer/OSX/dmg/build.sh @@ -6,7 +6,7 @@ SCRIPTDIR=$( cd "$(dirname "$0")" ; pwd -P ) VERSION=`grep '' < $SCRIPTDIR/../../../Executables/net5/Duplicati.Server/Duplicati.Server.csproj | sed 's/.*\([^\.]*\.[^\.]*\.[^\.]*\).*<\/Version>.*/\1/'` VERSION=${VERSION//$'\r\n'} echo "Building version: ($VERSION)" -export VERSION_NUMBER=VERSION +export VERSION_NUMBER=$VERSION $SCRIPTDIR/make-dmg.sh $SCRIPTDIR/../../../bin/ diff --git a/Installer/OSX/dmg/make-dmg.sh b/Installer/OSX/dmg/make-dmg.sh index 0258977ce..b89b8b5b0 100755 --- a/Installer/OSX/dmg/make-dmg.sh +++ b/Installer/OSX/dmg/make-dmg.sh @@ -69,9 +69,9 @@ chmod +x "Duplicati.app/Contents/MacOS/Duplicati.GUI.TrayIcon" # Remove some of the files that we do not like for FILE in $UNWANTED_FILES do - if [ -e "Duplicati.app/Contents/Resources/${FILE}" ] + if [ -e "Duplicati.app/Contents/MacOS/${FILE}" ] then - rm -rf "Duplicati.app/Contents/Resources/${FILE}" + rm -rf "Duplicati.app/Contents/MacOS/${FILE}" fi done From 69ccc12e7d57bcd0506496050a1a5136020dbbf3 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 18 Nov 2022 21:55:46 -0800 Subject: [PATCH 240/253] Reorganize the backends to be referenced via a single csproj For my sanity --- Duplicati.sln | 51 ++++++++++++++++++ ...Duplicati.CommandLine.BackendTester.csproj | 53 +------------------ .../Duplicati.CommandLine.BackendTool.csproj | 51 +----------------- .../CLI/Duplicati.CommandLine.csproj | 45 +--------------- .../Duplicati.CommandLine.RecoveryTool.csproj | 51 +----------------- .../Duplicati.GUI.TrayIcon.csproj | 51 +----------------- Duplicati/Server/Duplicati.Server.csproj | 53 +------------------ Duplicati/UnitTest/Duplicati.UnitTest.csproj | 45 +--------------- 8 files changed, 60 insertions(+), 340 deletions(-) diff --git a/Duplicati.sln b/Duplicati.sln index ee7fd75de..5891e7de5 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -146,6 +146,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backend.I {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} = {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backends", "Backends", "{E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Helper Libraries", "Helper Libraries", "{566EBBDA-19A4-4056-A615-D901D57D2439}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Implementation", "Implementation", "{D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backends", "Duplicati\Library\Backends\Duplicati.Library.Backends.csproj", "{5290E237-C2CD-48F2-99D2-817F9C2163C8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -412,11 +420,50 @@ Global {6B594D23-B629-465C-B799-70EE9E56C218}.Debug|Any CPU.Build.0 = Debug|Any CPU {6B594D23-B629-465C-B799-70EE9E56C218}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B594D23-B629-465C-B799-70EE9E56C218}.Release|Any CPU.Build.0 = Release|Any CPU + {5290E237-C2CD-48F2-99D2-817F9C2163C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5290E237-C2CD-48F2-99D2-817F9C2163C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5290E237-C2CD-48F2-99D2-817F9C2163C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5290E237-C2CD-48F2-99D2-817F9C2163C8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {FC9B7611-836F-4127-8B44-A7C31F506807} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {F61679A9-E5DE-468A-B5A4-05F92D0143D2} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {19ECCE09-B5EB-406C-8C57-BAC66997D469} = {566EBBDA-19A4-4056-A615-D901D57D2439} + {C03F6DFD-805A-4BE0-9338-64870ADDB4A2} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {81765A64-3661-4E3E-B850-2F6F87A51F74} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {BAE27510-8B5D-44B2-B33E-372A98908041} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {1BFAE226-8364-4086-825C-BB83F6F3EE4C} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {E7280DCA-7776-4A73-B9B5-41FD77FC8799} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {0CA86ECF-5BEC-4909-B4F6-110A03B30B92} = {566EBBDA-19A4-4056-A615-D901D57D2439} + {C0270709-2A40-43B5-8CF1-69581B9FA2A1} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {CCD76347-7DC7-4B42-B7E1-E500E624CAC3} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {FF2BF37C-E502-4C98-BEA0-701671DDFA08} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {19E661D2-C5DA-4F35-B3EE-7586E5734B5F} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {17566860-3D98-4604-AA5B-47661F75609F} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {2C838169-B187-4B09-8768-1C24C2521C8D} = {566EBBDA-19A4-4056-A615-D901D57D2439} + {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {5489181D-950C-44AF-873C-45EB0A3B6BD2} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {D9E4E686-423C-48EC-A392-404E7C00860C} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {D60AD540-0E7D-40CE-83AE-D26E01FFE9B8} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {4A010589-76E6-4F05-A5C4-4598D5DF11F8} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {61C43D61-4368-4942-84A3-1EB623F4EF2A} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {6643A5AE-AB38-453F-ADCE-408E35A81A83} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {3FF7DD0B-5284-4BF9-97D9-1E4417FDABB2} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {59C8BBC5-6E42-46FB-AB3E-6C183A82459A} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {3F47CB0C-CEE1-447F-9C26-7F8E419E3E3F} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {B20A7CEE-9C5B-47B9-8B76-BC85ADFE8493} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {2CD5DBC3-3DA6-432D-BA97-F0B8D24501C2} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {32A74526-3E5F-413A-8CB4-1EFDAD4C8B91} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {851A1CB8-3CEB-41B4-956F-34D760D2A8E5} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {B93E3BF0-DAA7-49B7-B07D-0559C5816735} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {4D1B198B-F773-44F2-872B-2B283053323C} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} + {E9AB8491-BD4C-4E4F-84C3-0BD551CC7489} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {11A8D03B-8CAE-4AD6-A5C6-E15D34DA2BDE} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {545DD6D4-9476-42D6-B51C-A28E000C489E} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} = {FA88A246-EF8E-46E3-90AF-539B8C0A6ADE} {95B7DD83-2C5A-4F1E-8EA7-39654B2B236A} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {34149709-F3ED-4FB5-A087-43EB195C948B} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} @@ -426,8 +473,12 @@ Global {0FFC557E-1B84-46A2-B6E8-06064FA7EA58} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {AF32C621-30DC-40F5-8CE6-DD69053068E9} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {55EEEBD2-CE45-45D6-9838-958F1C7354E4} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {8A651E2D-A7C8-4EC7-B421-7A457654811D} = {566EBBDA-19A4-4056-A615-D901D57D2439} {5D20B150-C445-47BE-8CE8-C9F74F19A4F2} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} {0F5A1F4E-25FA-4D02-920D-CA2138498081} = {6B46F6B1-1898-49B8-ADA7-5CAF68EB77E3} + {2B605B81-353F-43CD-BF3A-29B3926A204F} = {566EBBDA-19A4-4056-A615-D901D57D2439} + {6B594D23-B629-465C-B799-70EE9E56C218} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} + {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} = {FA88A246-EF8E-46E3-90AF-539B8C0A6ADE} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8B40BAFE-D862-4397-9495-8F5EAF5CE80C} diff --git a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj index 4d5d35b08..70fa36cb5 100644 --- a/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj +++ b/Duplicati/CommandLine/BackendTester/Duplicati.CommandLine.BackendTester.csproj @@ -8,27 +8,8 @@ Duplicati.CommandLine.BackendTester - - - - - - - - - - - - - - - - - - - - - + + @@ -39,28 +20,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -69,14 +28,6 @@ - - - - - - - - diff --git a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj index 5b3be3b8e..5d22d1d1d 100644 --- a/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj +++ b/Duplicati/CommandLine/BackendTool/Duplicati.CommandLine.BackendTool.csproj @@ -8,38 +8,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -50,24 +19,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj index 864bc196b..30d17c679 100644 --- a/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj +++ b/Duplicati/CommandLine/CLI/Duplicati.CommandLine.csproj @@ -8,19 +8,8 @@ TrayWarning.ico - - - - - - - - - - - - - + + @@ -41,50 +30,20 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj index 7078bc173..4be6f704e 100644 --- a/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj +++ b/Duplicati/CommandLine/RecoveryTool/Duplicati.CommandLine.RecoveryTool.csproj @@ -11,43 +11,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -60,19 +24,6 @@ - - - - - - - - - - - - - diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index d2c5c8bd1..a9c566447 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -63,38 +63,9 @@ - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - @@ -133,30 +104,10 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 90ef9c2d4..39b012ba0 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -19,48 +19,13 @@ - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - @@ -88,28 +53,12 @@ - - - - - - - - - - - - - - - - diff --git a/Duplicati/UnitTest/Duplicati.UnitTest.csproj b/Duplicati/UnitTest/Duplicati.UnitTest.csproj index d83485a2a..e6f6f9a4c 100644 --- a/Duplicati/UnitTest/Duplicati.UnitTest.csproj +++ b/Duplicati/UnitTest/Duplicati.UnitTest.csproj @@ -19,36 +19,9 @@ - - - - - - - - - - - - - - + - - - - - - - - - - - - - - @@ -77,30 +50,14 @@ - - - - - - - - - - - - - - - - From 83cc35664bb6904bc5239706bc4d8f0aee131567 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 18 Nov 2022 21:56:01 -0800 Subject: [PATCH 241/253] Missing file --- .../Duplicati.Library.Backends.csproj | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Duplicati/Library/Backends/Duplicati.Library.Backends.csproj diff --git a/Duplicati/Library/Backends/Duplicati.Library.Backends.csproj b/Duplicati/Library/Backends/Duplicati.Library.Backends.csproj new file mode 100644 index 000000000..3554b3db8 --- /dev/null +++ b/Duplicati/Library/Backends/Duplicati.Library.Backends.csproj @@ -0,0 +1,36 @@ + + + netstandard2.0 + LGPL, Copyright © Duplicati Team 2021 + Central reference to all backends + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 235568dade345bde3b307c76af0ba2bfb4916c3e Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 30 Dec 2022 10:59:29 -0800 Subject: [PATCH 242/253] First pass at introducing kestrel and refactoring to make the RESTAPI be its own package. --- .../Database/Backup.cs | 300 +- .../Database/Connection.cs | 2523 +++++++++-------- .../Database schema/1. Add Notifications.sql | 28 +- .../Database schema/2. Add UIStorage.sql | 18 +- .../3. Add temp file storage.sql | 22 +- .../4. Add autoincrement to backup id.sql | 0 .../5. Extend notification table.sql | 0 .../6. Add Description to Backup.sql | 0 .../Database/Database schema/Schema.sql | 316 +-- .../DatabaseConnectionSchemaMarker.cs | 12 + .../Database/Filter.cs | 62 +- .../Database/Notification.cs | 78 +- .../Database/Schedule.cs | 158 +- .../Database/ServerSettings.cs | 1093 +++---- .../Database/Setting.cs | 52 +- .../Database/TempFile.cs | 62 +- .../Duplicati.Library.RestAPI.csproj | 35 + .../EventPollNotify.cs | 154 +- Duplicati.Library.RestAPI/FIXMEGlobal.cs | 97 + .../LiveControls.cs | 803 +++--- .../LogWriteHandler.cs | 702 ++--- .../RESTMethods/Acknowledgements.cs | 100 +- .../RESTMethods/Backup.cs | 1465 +++++----- .../RESTMethods/BackupDefaults.cs | 273 +- .../RESTMethods/Backups.cs | 599 ++-- .../RESTMethods/BugReport.cs | 115 +- .../RESTMethods/Captcha.cs | 336 +-- .../RESTMethods/Changelog.cs | 149 +- .../RESTMethods/CommandLine.cs | 567 ++-- .../RESTMethods/Filesystem.cs | 540 ++-- .../RESTMethods/Help.cs | 200 +- .../RESTMethods/HyperV.cs | 174 +- .../RESTMethods/IRESTMethod.cs | 112 +- .../RESTMethods/Licenses.cs | 60 +- .../RESTMethods/LogData.cs | 235 +- .../RESTMethods/MSSQL.cs | 170 +- .../RESTMethods/Notification.cs | 121 +- .../RESTMethods/Notifications.cs | 59 +- .../RESTMethods/ProgressState.cs | 91 +- .../RESTMethods/RemoteOperation.cs | 374 +-- .../RESTMethods/RequestInfo.cs | 218 +- .../RESTMethods/ServerSetting.cs | 223 +- .../RESTMethods/ServerSettings.cs | 253 +- .../RESTMethods/ServerState.cs | 199 +- .../RESTMethods/SystemInfo.cs | 249 +- .../RESTMethods/SystemWideSettings.cs | 88 +- .../RESTMethods/Tags.cs | 109 +- .../RESTMethods/Task.cs | 223 +- .../RESTMethods/Tasks.cs | 73 +- .../RESTMethods/UISettings.cs | 155 +- .../RESTMethods/Updates.cs | 113 +- .../RESTMethods/WebModule.cs | 82 +- .../RESTMethods/WebModules.cs | 60 +- .../Runner.cs | 1931 ++++++------- .../Scheduler.cs | 819 +++--- .../Serializable/ImportExportStructure.cs | 60 +- .../Serializable/ServerSettings.cs | 477 ++-- .../Serializable/ServerStatus.cs | 293 +- .../Serializable/TreeNode.cs | 120 +- .../SpecialFolders.cs | 376 +-- .../Strings.cs | 114 +- .../UpdatePollThread.cs | 473 +-- .../WebServer/AuthenticationHandler.cs | 677 ++--- .../WebServer/BodyWriter.cs | 194 +- .../WebServer/CaptchaUtil.cs | 258 +- .../WebServer/IndexHtmlHandler.cs | 154 +- .../WebServer/RESTHandler.cs | 517 ++-- .../WebServer/Server.cs | 909 +++--- .../SynologyAuthenticationHandler.cs | 578 ++-- .../newbackup.json | 28 +- Duplicati.sln | 13 + ...i.CommandLine.ConfigurationImporter.csproj | 2 +- Duplicati/Server/Duplicati.Server.csproj | 9 +- Duplicati/Server/Program.cs | 60 +- Duplicati/Service/Duplicati.Service.csproj | 2 +- .../Duplicati.WebserverCore.csproj | 15 + Duplicati/WebserverCore/DuplicatiWebserver.cs | 14 + Duplicati/WebserverCore/RestHandlerCore.cs | 56 + Duplicati/WebserverCore/TestMiddleware.cs | 37 + 79 files changed, 11412 insertions(+), 11074 deletions(-) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Backup.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Connection.cs (94%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Database schema/1. Add Notifications.sql (95%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Database schema/2. Add UIStorage.sql (94%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Database schema/3. Add temp file storage.sql (95%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Database schema/4. Add autoincrement to backup id.sql (100%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Database schema/5. Extend notification table.sql (100%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Database schema/6. Add Description to Backup.sql (100%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Database schema/Schema.sql (96%) create mode 100644 Duplicati.Library.RestAPI/Database/DatabaseConnectionSchemaMarker.cs rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Filter.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Notification.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Schedule.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/ServerSettings.cs (95%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/Setting.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Database/TempFile.cs (97%) create mode 100644 Duplicati.Library.RestAPI/Duplicati.Library.RestAPI.csproj rename {Duplicati/Server => Duplicati.Library.RestAPI}/EventPollNotify.cs (97%) create mode 100644 Duplicati.Library.RestAPI/FIXMEGlobal.cs rename {Duplicati/Server => Duplicati.Library.RestAPI}/LiveControls.cs (96%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/LogWriteHandler.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Acknowledgements.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Backup.cs (87%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/BackupDefaults.cs (96%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Backups.cs (87%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/BugReport.cs (93%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Captcha.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Changelog.cs (94%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/CommandLine.cs (92%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Filesystem.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Help.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/HyperV.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/IRESTMethod.cs (96%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Licenses.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/LogData.cs (94%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/MSSQL.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Notification.cs (86%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Notifications.cs (90%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/ProgressState.cs (91%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/RemoteOperation.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/RequestInfo.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/ServerSetting.cs (85%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/ServerSettings.cs (89%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/ServerState.cs (89%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/SystemInfo.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/SystemWideSettings.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Tags.cs (90%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Task.cs (88%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Tasks.cs (88%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/UISettings.cs (86%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/Updates.cs (84%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/WebModule.cs (97%) rename {Duplicati/Server/WebServer => Duplicati.Library.RestAPI}/RESTMethods/WebModules.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Runner.cs (92%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Scheduler.cs (94%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Serializable/ImportExportStructure.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Serializable/ServerSettings.cs (95%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Serializable/ServerStatus.cs (76%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Serializable/TreeNode.cs (96%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/SpecialFolders.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/Strings.cs (98%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/UpdatePollThread.cs (79%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/WebServer/AuthenticationHandler.cs (95%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/WebServer/BodyWriter.cs (96%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/WebServer/CaptchaUtil.cs (98%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/WebServer/IndexHtmlHandler.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/WebServer/RESTHandler.cs (95%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/WebServer/Server.cs (93%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/WebServer/SynologyAuthenticationHandler.cs (97%) rename {Duplicati/Server => Duplicati.Library.RestAPI}/newbackup.json (96%) create mode 100644 Duplicati/WebserverCore/Duplicati.WebserverCore.csproj create mode 100644 Duplicati/WebserverCore/DuplicatiWebserver.cs create mode 100644 Duplicati/WebserverCore/RestHandlerCore.cs create mode 100644 Duplicati/WebserverCore/TestMiddleware.cs diff --git a/Duplicati/Server/Database/Backup.cs b/Duplicati.Library.RestAPI/Database/Backup.cs similarity index 97% rename from Duplicati/Server/Database/Backup.cs rename to Duplicati.Library.RestAPI/Database/Backup.cs index 117253942..f5221817e 100644 --- a/Duplicati/Server/Database/Backup.cs +++ b/Duplicati.Library.RestAPI/Database/Backup.cs @@ -1,150 +1,150 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using Duplicati.Server.Serialization.Interface; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; - -namespace Duplicati.Server.Database -{ - public class Backup : IBackup - { - // Sensitive information that may be stored in TargetUrl - private readonly string[] UrlPasswords = { - "authid", - "auth-password", - "sia-password", - "tardigrade-secret", - "tardigrade-shared-access", - }; - - // Sensitive information that may be stored in Settings - private readonly string[] SettingPasswords = { - "passphrase", - "--authid", - "--send-mail-password", - "--send-xmpp-password", - }; - - public Backup() - { - this.ID = null; - } - - internal void LoadChildren(Connection con) - { - if (this.IsTemporary) - { - this.Sources = new string[0]; - this.Settings = new ISetting[0]; - this.Filters = new IFilter[0]; - this.Metadata = new Dictionary(); - } - else - { - var id = long.Parse(this.ID); - this.Sources = con.GetSources(id); - this.Settings = con.GetSettings(id); - this.Filters = con.GetFilters(id); - this.Metadata = con.GetMetadata(id); - } - } - - /// - /// The backup ID - /// - public string ID { get; set; } - /// - /// The backup name - /// - public string Name { get; set; } - /// - /// The backup description - /// - public string Description { get; set; } - /// - /// The backup tags - /// - public string[] Tags { get; set; } - /// - /// The backup target url - /// - public string TargetURL { get; set; } - /// - /// The path to the local database - /// - public string DBPath { get; internal set; } - - /// - /// The backup source folders and files - /// - public string[] Sources { get; set; } - - /// - /// The backup settings - /// - public ISetting[] Settings { get; set; } - - /// - /// The filters applied to the source files - /// - public IFilter[] Filters { get; set; } - - /// - /// The backup metadata - /// - public IDictionary Metadata { get; set; } - - /// - /// Gets a value indicating if this instance is not persisted to the database - /// - public bool IsTemporary { get { return ID != null && ID.IndexOf("-", StringComparison.Ordinal) > 0; } } - - /// - /// Sanitizes the backup TargetUrl from any fields in the PasswordFields list. - /// - public void SanitizeTargetUrl() - { - var url = new Duplicati.Library.Utility.Uri(this.TargetURL); - NameValueCollection filteredParameters = new NameValueCollection(); - if (url.Query != null) - { - // We cannot use url.QueryParameters since it contains decoded parameter values, which - // breaks assumptions made by the decode_uri function in AppUtils.js. Since we are simply - // removing password parameters, we will leave the parameters as they are in the target URL. - filteredParameters = Library.Utility.Uri.ParseQueryString(url.Query, false); - foreach (string field in this.UrlPasswords) - { - filteredParameters.Remove(field); - } - } - url = url.SetQuery(Duplicati.Library.Utility.Uri.BuildUriQuery(filteredParameters)); - this.TargetURL = url.ToString(); - } - - /// - /// Sanitizes the settings from any fields in the PasswordFields list. - /// - public void SanitizeSettings() - { - this.Settings = this.Settings.Where((setting) => !SettingPasswords.Contains(setting.Name)).ToArray(); - } - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using Duplicati.Server.Serialization.Interface; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; + +namespace Duplicati.Server.Database +{ + public class Backup : IBackup + { + // Sensitive information that may be stored in TargetUrl + private readonly string[] UrlPasswords = { + "authid", + "auth-password", + "sia-password", + "tardigrade-secret", + "tardigrade-shared-access", + }; + + // Sensitive information that may be stored in Settings + private readonly string[] SettingPasswords = { + "passphrase", + "--authid", + "--send-mail-password", + "--send-xmpp-password", + }; + + public Backup() + { + this.ID = null; + } + + internal void LoadChildren(Connection con) + { + if (this.IsTemporary) + { + this.Sources = new string[0]; + this.Settings = new ISetting[0]; + this.Filters = new IFilter[0]; + this.Metadata = new Dictionary(); + } + else + { + var id = long.Parse(this.ID); + this.Sources = con.GetSources(id); + this.Settings = con.GetSettings(id); + this.Filters = con.GetFilters(id); + this.Metadata = con.GetMetadata(id); + } + } + + /// + /// The backup ID + /// + public string ID { get; set; } + /// + /// The backup name + /// + public string Name { get; set; } + /// + /// The backup description + /// + public string Description { get; set; } + /// + /// The backup tags + /// + public string[] Tags { get; set; } + /// + /// The backup target url + /// + public string TargetURL { get; set; } + /// + /// The path to the local database + /// + public string DBPath { get; internal set; } + + /// + /// The backup source folders and files + /// + public string[] Sources { get; set; } + + /// + /// The backup settings + /// + public ISetting[] Settings { get; set; } + + /// + /// The filters applied to the source files + /// + public IFilter[] Filters { get; set; } + + /// + /// The backup metadata + /// + public IDictionary Metadata { get; set; } + + /// + /// Gets a value indicating if this instance is not persisted to the database + /// + public bool IsTemporary { get { return ID != null && ID.IndexOf("-", StringComparison.Ordinal) > 0; } } + + /// + /// Sanitizes the backup TargetUrl from any fields in the PasswordFields list. + /// + public void SanitizeTargetUrl() + { + var url = new Duplicati.Library.Utility.Uri(this.TargetURL); + NameValueCollection filteredParameters = new NameValueCollection(); + if (url.Query != null) + { + // We cannot use url.QueryParameters since it contains decoded parameter values, which + // breaks assumptions made by the decode_uri function in AppUtils.js. Since we are simply + // removing password parameters, we will leave the parameters as they are in the target URL. + filteredParameters = Library.Utility.Uri.ParseQueryString(url.Query, false); + foreach (string field in this.UrlPasswords) + { + filteredParameters.Remove(field); + } + } + url = url.SetQuery(Duplicati.Library.Utility.Uri.BuildUriQuery(filteredParameters)); + this.TargetURL = url.ToString(); + } + + /// + /// Sanitizes the settings from any fields in the PasswordFields list. + /// + public void SanitizeSettings() + { + this.Settings = this.Settings.Where((setting) => !SettingPasswords.Contains(setting.Name)).ToArray(); + } + } +} + diff --git a/Duplicati/Server/Database/Connection.cs b/Duplicati.Library.RestAPI/Database/Connection.cs similarity index 94% rename from Duplicati/Server/Database/Connection.cs rename to Duplicati.Library.RestAPI/Database/Connection.cs index ce9ed53da..4fd7b1f90 100644 --- a/Duplicati/Server/Database/Connection.cs +++ b/Duplicati.Library.RestAPI/Database/Connection.cs @@ -1,1261 +1,1262 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Linq; -using Duplicati.Server.Serialization.Interface; -using System.Text; - -namespace Duplicati.Server.Database -{ - public class Connection : IDisposable - { - private readonly System.Data.IDbConnection m_connection; - private System.Data.IDbCommand m_errorcmd; - public readonly object m_lock = new object(); - public const int ANY_BACKUP_ID = -1; - public const int SERVER_SETTINGS_ID = -2; - private readonly Dictionary m_temporaryBackups = new Dictionary(); - - public Connection(System.Data.IDbConnection connection) - { - m_connection = connection; - m_errorcmd = m_connection.CreateCommand(); - m_errorcmd.CommandText = @"INSERT INTO ""ErrorLog"" (""BackupID"", ""Message"", ""Exception"", ""Timestamp"") VALUES (?,?,?,?)"; - for(var i = 0; i < 4; i++) - m_errorcmd.Parameters.Add(m_errorcmd.CreateParameter()); - - this.ApplicationSettings = new ServerSettings(this); - } - - internal void LogError(string backupid, string message, Exception ex) - { - lock(m_lock) - { - if (!long.TryParse(backupid, out long id)) - id = -1; - ((System.Data.IDbDataParameter)m_errorcmd.Parameters[0]).Value = id; - ((System.Data.IDbDataParameter)m_errorcmd.Parameters[1]).Value = message; - ((System.Data.IDbDataParameter)m_errorcmd.Parameters[2]).Value = ex?.ToString(); - ((System.Data.IDbDataParameter)m_errorcmd.Parameters[3]).Value = Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(DateTime.UtcNow); - m_errorcmd.ExecuteNonQuery(); - } - } - - internal void ExecuteWithCommand(Action f) - { - lock(m_lock) - using(var cmd = m_connection.CreateCommand()) - f(cmd); - } - - internal Serializable.ImportExportStructure PrepareBackupForExport(IBackup backup) - { - var scheduleId = GetScheduleIDsFromTags(new string[] { "ID=" + backup.ID }); - return new Serializable.ImportExportStructure() { - CreatedByVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), - Backup = (Database.Backup)backup, - Schedule = (Database.Schedule)(scheduleId.Any() ? GetSchedule(scheduleId.First()) : null), - DisplayNames = SpecialFolders.GetSourceNames(backup) - }; - } - - public string RegisterTemporaryBackup(IBackup backup) - { - lock(m_lock) - { - if (backup == null) - throw new ArgumentNullException(nameof(backup)); - if (backup.ID != null) - throw new ArgumentException("Backup is already active, cannot make temporary"); - - backup.ID = Guid.NewGuid().ToString("D"); - m_temporaryBackups.Add(backup.ID, (Backup)backup); - return backup.ID; - } - } - - public void UnregisterTemporaryBackup(IBackup backup) - { - lock(m_lock) - m_temporaryBackups.Remove(backup.ID); - } - - public void UpdateTemporaryBackup(IBackup backup) - { - lock(m_lock) - if (m_temporaryBackups.Remove(backup.ID)) - m_temporaryBackups.Add(backup.ID, (Backup)backup); - } - - public IBackup GetTemporaryBackup(string id) - { - if (string.IsNullOrEmpty(id)) - return null; - - lock(m_lock) - { - Backup b; - m_temporaryBackups.TryGetValue(id, out b); - return b; - } - } - - public ServerSettings ApplicationSettings { get; private set; } - - internal IDictionary GetMetadata(long id) - { - lock(m_lock) - return ReadFromDb( - (rd) => new KeyValuePair( - ConvertToString(rd, 0), - ConvertToString(rd, 1) - ), - @"SELECT ""Name"", ""Value"" FROM ""Metadata"" WHERE ""BackupID"" = ? ", id) - .ToDictionary((k) => k.Key, (k) => k.Value); - } - - internal void SetMetadata(IDictionary values, long id, System.Data.IDbTransaction transaction) - { - lock(m_lock) - using(var tr = transaction == null ? m_connection.BeginTransaction() : null) - { - OverwriteAndUpdateDb( - tr, - @"DELETE FROM ""Metadata"" WHERE ""BackupID"" = ?", new object[] { id }, - values ?? new Dictionary(), - @"INSERT INTO ""Metadata"" (""BackupID"", ""Name"", ""Value"") VALUES (?, ?, ?)", - (f) => new object[] { id, f.Key, f.Value } - ); - - if (tr != null) - tr.Commit(); - } - } - - internal IFilter[] GetFilters(long id) - { - lock(m_lock) - return ReadFromDb( - (rd) => (IFilter)new Filter() { - Order = ConvertToInt64(rd, 0), - Include = ConvertToBoolean(rd, 1), - Expression = ConvertToString(rd, 2) ?? "" - }, - @"SELECT ""Order"", ""Include"", ""Expression"" FROM ""Filter"" WHERE ""BackupID"" = ? ORDER BY ""Order"" ", id) - .ToArray(); - } - - internal void SetFilters(IEnumerable values, long id, System.Data.IDbTransaction transaction = null) - { - lock(m_lock) - using(var tr = transaction == null ? m_connection.BeginTransaction() : null) - { - OverwriteAndUpdateDb( - tr, - @"DELETE FROM ""Filter"" WHERE ""BackupID"" = ?", new object[] { id }, - values, - @"INSERT INTO ""Filter"" (""BackupID"", ""Order"", ""Include"", ""Expression"") VALUES (?, ?, ?, ?)", - (f) => new object[] { id, f.Order, f.Include, f.Expression } - ); - - if (tr != null) - tr.Commit(); - } - } - - public ISetting[] GetSettings(long id) - { - lock(m_lock) - return ReadFromDb( - (rd) => (ISetting)new Setting() { - Filter = ConvertToString(rd, 0) ?? "", - Name = ConvertToString(rd, 1) ?? "", - Value = ConvertToString(rd, 2) ?? "" - //TODO: Attach the argument information - }, - @"SELECT ""Filter"", ""Name"", ""Value"" FROM ""Option"" WHERE ""BackupID"" = ?", id) - .ToArray(); - } - - internal void SetSettings(IEnumerable values, long id, System.Data.IDbTransaction transaction = null) - { - lock(m_lock) - using(var tr = transaction == null ? m_connection.BeginTransaction() : null) - { - OverwriteAndUpdateDb( - tr, - @"DELETE FROM ""Option"" WHERE ""BackupID"" = ?", new object[] { id }, - values, - @"INSERT INTO ""Option"" (""BackupID"", ""Filter"", ""Name"", ""Value"") VALUES (?, ?, ?, ?)", - (f) => { - if (Duplicati.Server.WebServer.Server.PASSWORD_PLACEHOLDER.Equals(f.Value)) - throw new Exception("Attempted to save a property with the placeholder password"); - return new object[] { id, f.Filter ?? "", f.Name, f.Value ?? "" }; - } - ); - - if (tr != null) - tr.Commit(); - } - } - - internal string[] GetSources(long id) - { - lock(m_lock) - return ReadFromDb( - (rd) => ConvertToString(rd, 0), - @"SELECT ""Path"" FROM ""Source"" WHERE ""BackupID"" = ?", id) - .ToArray(); - } - - internal void SetSources(IEnumerable values, long id, System.Data.IDbTransaction transaction) - { - lock(m_lock) - using(var tr = transaction == null ? m_connection.BeginTransaction() : null) - { - OverwriteAndUpdateDb( - tr, - @"DELETE FROM ""Source"" WHERE ""BackupID"" = ?", new object[] { id }, - values, - @"INSERT INTO ""Source"" (""BackupID"", ""Path"") VALUES (?, ?)", - (f) => new object[] { id, f } - ); - - if (tr != null) - tr.Commit(); - } - } - - internal long[] GetBackupIDsForTags(string[] tags) - { - if (tags == null || tags.Length == 0) - return new long[0]; - - if (tags.Length == 1 && tags[0].StartsWith("ID=", StringComparison.Ordinal)) - return new long[] { long.Parse(tags[0].Substring("ID=".Length)) }; - - lock(m_lock) - using(var cmd = m_connection.CreateCommand()) - { - var sb = new StringBuilder(); - - foreach(var t in tags) - { - if (sb.Length != 0) - sb.Append(" OR "); - sb.Append(@" ("","" || ""Tags"" || "","" LIKE ""%,"" || ? || "",%"") "); - - var p = cmd.CreateParameter(); - p.Value = t; - cmd.Parameters.Add(p); - } - - cmd.CommandText = @"SELECT ""ID"" FROM ""Backup"" WHERE " + sb; - - return Read(cmd, (rd) => ConvertToInt64(rd, 0)).ToArray(); - } - } - - internal IBackup GetBackup(string id) - { - if (string.IsNullOrWhiteSpace(id)) - throw new ArgumentNullException(nameof(id)); - - return long.TryParse(id, out long lid) ? GetBackup(lid) : GetTemporaryBackup(id); - } - - internal IBackup GetBackup(long id) - { - lock(m_lock) - { - var bk = ReadFromDb( - (rd) => new Backup { - ID = ConvertToInt64(rd, 0).ToString(), - Name = ConvertToString(rd, 1), - Description = ConvertToString(rd, 2), - Tags = (ConvertToString(rd, 3) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), - TargetURL = ConvertToString(rd, 4), - DBPath = ConvertToString(rd, 5), - }, - @"SELECT ""ID"", ""Name"", ""Description"", ""Tags"", ""TargetURL"", ""DBPath"" FROM ""Backup"" WHERE ID = ?", id) - .FirstOrDefault(); - - if (bk != null) - bk.LoadChildren(this); - - return bk; - } - } - - internal ISchedule GetSchedule(long id) - { - lock(m_lock) - { - var bk = ReadFromDb( - (rd) => new Schedule { - ID = ConvertToInt64(rd, 0), - Tags = (ConvertToString(rd, 1) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), - Time = ConvertToDateTime(rd, 2), - Repeat = ConvertToString(rd, 3), - LastRun = ConvertToDateTime(rd, 4), - Rule = ConvertToString(rd, 5), - }, - @"SELECT ""ID"", ""Tags"", ""Time"", ""Repeat"", ""LastRun"", ""Rule"" FROM ""Schedule"" WHERE ID = ?", id) - .FirstOrDefault(); - - return bk; - } - } - - internal Boolean IsUnencryptedOrPassphraseStored(long id) - { - lock (m_lock) - { - var usesEncryption = ReadFromDb( - (rd) => ConvertToBoolean(rd, 0), - @"SELECT VALUE != """" FROM ""Option"" WHERE BackupID = ? AND NAME='encryption-module'", id) - .FirstOrDefault(); - - if (!usesEncryption) - { - return true; - } - - return ReadFromDb( - (rd) => ConvertToBoolean(rd, 0), - @"SELECT VALUE != """" FROM ""Option"" WHERE BackupID = ? AND NAME='passphrase'", id) - .FirstOrDefault(); - } - } - - internal long[] GetScheduleIDsFromTags(string[] tags) - { - if (tags == null || tags.Length == 0) - return new long[0]; - - lock(m_lock) - using(var cmd = m_connection.CreateCommand()) - { - var sb = new StringBuilder(); - - foreach(var t in tags) - { - if (sb.Length != 0) - sb.Append(" OR "); - sb.Append(@" ("","" || ""Tags"" || "","" LIKE ""%,"" || ? || "",%"") "); - - var p = cmd.CreateParameter(); - p.Value = t; - cmd.Parameters.Add(p); - } - - cmd.CommandText = @"SELECT ""ID"" FROM ""Schedule"" WHERE " + sb; - - return Read(cmd, (rd) => ConvertToInt64(rd, 0)).ToArray(); - } - } - - public void AddOrUpdateBackupAndSchedule(IBackup item, ISchedule schedule) - { - AddOrUpdateBackup(item, true, schedule); - } - - public string ValidateBackup(IBackup item, ISchedule schedule) - { - if (string.IsNullOrWhiteSpace(item.Name)) - return "Missing a name"; - - if (string.IsNullOrWhiteSpace(item.TargetURL)) - return "Missing a target"; - - if (item.Sources == null || item.Sources.Any(x => string.IsNullOrWhiteSpace(x)) || item.Sources.Length == 0) - return "Invalid source list"; - - var disabled_encryption = false; - var passphrase = string.Empty; - var gpgAsymmetricEncryption = false; - if (item.Settings != null) - { - foreach (var s in item.Settings) - - if (string.Equals(s.Name, "--no-encryption", StringComparison.OrdinalIgnoreCase)) - disabled_encryption = string.IsNullOrWhiteSpace(s.Value) || Library.Utility.Utility.ParseBool(s.Value, false); - else if (string.Equals(s.Name, "passphrase", StringComparison.OrdinalIgnoreCase)) - passphrase = s.Value; - else if (string.Equals(s.Name, "keep-versions", StringComparison.OrdinalIgnoreCase)) - { - int i; - if (!int.TryParse(s.Value, out i) || i <= 0) - return "Retention value must be a positive integer"; - } - else if (string.Equals(s.Name, "keep-time", StringComparison.OrdinalIgnoreCase)) - { - try - { - var ts = Library.Utility.Timeparser.ParseTimeSpan(s.Value); - if (ts <= TimeSpan.FromMinutes(5)) - return "Retention value must be more than 5 minutes"; - } - catch - { - return "Retention value must be a valid timespan"; - } - } - else if (string.Equals(s.Name, "dblock-size", StringComparison.OrdinalIgnoreCase)) - { - try - { - var ds = Library.Utility.Sizeparser.ParseSize(s.Value); - if (ds < 1024 * 1024) - return "DBlock size must be at least 1MB"; - } - catch - { - return "DBlock value must be a valid size string"; - } - } - else if (string.Equals(s.Name, "--blocksize", StringComparison.OrdinalIgnoreCase)) - { - try - { - var ds = Library.Utility.Sizeparser.ParseSize(s.Value); - if (ds < 1024 || ds > int.MaxValue) - return "The blocksize must be at least 1KB"; - } - catch - { - return "The blocksize value must be a valid size string"; - } - } - else if (string.Equals(s.Name, "--prefix", StringComparison.OrdinalIgnoreCase)) - { - if (!string.IsNullOrWhiteSpace(s.Value) && s.Value.Contains("-")) - return "The prefix cannot contain hyphens (-)"; - } - else if (string.Equals(s.Name, "--gpg-encryption-command", StringComparison.OrdinalIgnoreCase)) { - gpgAsymmetricEncryption = string.Equals(s.Value, "--encrypt", StringComparison.OrdinalIgnoreCase); - } - } - - if (!disabled_encryption && !gpgAsymmetricEncryption && string.IsNullOrWhiteSpace(passphrase)) - return "Missing passphrase"; - - if (schedule != null) - { - try - { - var ts = Library.Utility.Timeparser.ParseTimeSpan(schedule.Repeat); - if (ts <= TimeSpan.FromMinutes(5)) - return "Schedule repetition time must be more than 5 minutes"; - } - catch - { - return "Schedule repetition value must be a valid timespan"; - } - - } - - return null; - } - - internal void UpdateBackupDBPath(IBackup item, string path) - { - lock (m_lock) - { - using (var tr = m_connection.BeginTransaction()) - { - using (var cmd = m_connection.CreateCommand()) - { - cmd.Transaction = tr; - cmd.Parameters.Add(cmd.CreateParameter()); - ((System.Data.IDbDataParameter) cmd.Parameters[0]).Value = path; - cmd.Parameters.Add(cmd.CreateParameter()); - ((System.Data.IDbDataParameter) cmd.Parameters[1]).Value = item.ID; - - cmd.CommandText = @"UPDATE ""Backup"" SET ""DBPath""=? WHERE ""ID""=?"; - cmd.ExecuteNonQuery(); - tr.Commit(); - } - } - } - - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - } - - private void AddOrUpdateBackup(IBackup item, bool updateSchedule, ISchedule schedule) - { - lock(m_lock) - { - bool update = item.ID != null; - if (!update && item.DBPath == null) - { - var folder = Program.DataFolder; - if (!System.IO.Directory.Exists(folder)) - System.IO.Directory.CreateDirectory(folder); - - for(var i = 0; i < 100; i++) - { - var guess = System.IO.Path.Combine(folder, System.IO.Path.ChangeExtension(Duplicati.Library.Main.DatabaseLocator.GenerateRandomName(), ".sqlite")); - if (!System.IO.File.Exists(guess)) - { - ((Backup)item).DBPath = guess; - break; - } - } - - if (item.DBPath == null) - throw new Exception("Unable to generate a unique database file name"); - } - - using(var tr = m_connection.BeginTransaction()) - { - OverwriteAndUpdateDb( - tr, - null, - new object[] { long.Parse(item.ID ?? "-1") }, - new IBackup[] { item }, - update ? - @"UPDATE ""Backup"" SET ""Name""=?, ""Description""=?, ""Tags""=?, ""TargetURL""=? WHERE ""ID""=?" : - @"INSERT INTO ""Backup"" (""Name"", ""Description"", ""Tags"", ""TargetURL"", ""DBPath"") VALUES (?,?,?,?,?)", - (n) => { - - if (n.TargetURL.IndexOf(Duplicati.Server.WebServer.Server.PASSWORD_PLACEHOLDER, StringComparison.Ordinal) >= 0) - throw new Exception("Attempted to save a backup with the password placeholder"); - if (update && long.Parse(n.ID) <= 0) - throw new Exception("Invalid update, cannot update application settings through update method"); - - return new object[] { - n.Name, - n.Description ?? "" , // Description is optional but the column is set to NOT NULL, an additional check is welcome - string.Join(",", n.Tags ?? new string[0]), - n.TargetURL, - update ? item.ID : n.DBPath - }; - }); - - if (!update) - using(var cmd = m_connection.CreateCommand()) - { - cmd.Transaction = tr; - cmd.CommandText = @"SELECT last_insert_rowid();"; - item.ID = ExecuteScalarInt64(cmd).ToString(); - } - - var id = long.Parse(item.ID); - - if (long.Parse(item.ID) <= 0) - throw new Exception("Invalid addition, cannot update application settings through update method"); - - SetSources(item.Sources, id, tr); - SetSettings(item.Settings, id, tr); - SetFilters(item.Filters, id, tr); - SetMetadata(item.Metadata, id, tr); - - if (updateSchedule) - { - var tags = new string[] { "ID=" + item.ID }; - var existing = GetScheduleIDsFromTags(tags); - if (schedule == null && existing.Any()) - DeleteFromDb("Schedule", existing.First(), tr); - else if (schedule != null) - { - if (existing.Any()) - { - var cur = GetSchedule(existing.First()); - cur.AllowedDays = schedule.AllowedDays; - cur.Repeat = schedule.Repeat; - cur.Tags = schedule.Tags; - cur.Time = schedule.Time; - - schedule = cur; - } - else - { - schedule.ID = -1; - } - - schedule.Tags = tags; - AddOrUpdateSchedule(schedule, tr); - } - } - - tr.Commit(); - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - } - } - } - - internal void AddOrUpdateSchedule(ISchedule item) - { - lock(m_lock) - using(var tr = m_connection.BeginTransaction()) - { - AddOrUpdateSchedule(item, tr); - tr.Commit(); - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - } - } - - private void AddOrUpdateSchedule(ISchedule item, System.Data.IDbTransaction tr) - { - lock(m_lock) - { - bool update = item.ID >= 0; - OverwriteAndUpdateDb( - tr, - null, - new object[] { item.ID }, - new ISchedule[] { item }, - update ? - @"UPDATE ""Schedule"" SET ""Tags""=?, ""Time""=?, ""Repeat""=?, ""LastRun""=?, ""Rule""=? WHERE ""ID""=?" : - @"INSERT INTO ""Schedule"" (""Tags"", ""Time"", ""Repeat"", ""LastRun"", ""Rule"") VALUES (?,?,?,?,?)", - (n) => new object[] { - string.Join(",", n.Tags), - Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(n.Time), - n.Repeat, - Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(n.LastRun), - n.Rule ?? "", - update ? (object)item.ID : null - }); - - if (!update) - using(var cmd = m_connection.CreateCommand()) - { - cmd.Transaction = tr; - cmd.CommandText = @"SELECT last_insert_rowid();"; - item.ID = ExecuteScalarInt64(cmd); - } - } - } - - public void DeleteBackup(long ID) - { - if (ID < 0) - return; - - lock(m_lock) - { - using(var tr = m_connection.BeginTransaction()) - { - var existing = GetScheduleIDsFromTags(new string[] { "ID=" + ID.ToString() }); - if (existing.Any()) - DeleteFromDb("Schedule", existing.First(), tr); - - DeleteFromDb("ErrorLog", ID, "BackupID", tr); - DeleteFromDb("Filter", ID, "BackupID", tr); - DeleteFromDb("Log", ID, "BackupID", tr); - DeleteFromDb("Metadata", ID, "BackupID", tr); - DeleteFromDb("Option", ID, "BackupID", tr); - DeleteFromDb("Source", ID, "BackupID", tr); - - DeleteFromDb("Backup", ID, tr); - - tr.Commit(); - } - } - - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - } - - public void DeleteBackup(IBackup backup) - { - if (backup.IsTemporary) - UnregisterTemporaryBackup(backup); - else - DeleteBackup(long.Parse(backup.ID)); - } - - public void DeleteSchedule(long ID) - { - if (ID < 0) - return; - - lock(m_lock) - DeleteFromDb("Schedule", ID); - - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - } - - public void DeleteSchedule(ISchedule schedule) - { - DeleteSchedule(schedule.ID); - } - - public IBackup[] Backups - { - get - { - lock(m_lock) - { - var lst = ReadFromDb( - (rd) => (IBackup)new Backup() { - ID = ConvertToInt64(rd, 0).ToString(), - Name = ConvertToString(rd, 1), - Description = ConvertToString(rd, 2), - Tags = (ConvertToString(rd, 3) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), - TargetURL = ConvertToString(rd, 4), - DBPath = ConvertToString(rd, 5), - }, - @"SELECT ""ID"", ""Name"", ""Description"", ""Tags"", ""TargetURL"", ""DBPath"" FROM ""Backup"" ") - .ToArray(); - - foreach(var n in lst) - n.Metadata = GetMetadata(long.Parse(n.ID)); - - - return lst; - } - } - } - - public ISchedule[] Schedules - { - get - { - lock(m_lock) - return ReadFromDb( - (rd) => (ISchedule)new Schedule() { - ID = ConvertToInt64(rd, 0), - Tags = (ConvertToString(rd, 1) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), - Time = ConvertToDateTime(rd, 2), - Repeat = ConvertToString(rd, 3), - LastRun = ConvertToDateTime(rd, 4), - Rule = ConvertToString(rd, 5), - }, - @"SELECT ""ID"", ""Tags"", ""Time"", ""Repeat"", ""LastRun"", ""Rule"" FROM ""Schedule"" ") - .ToArray(); - } - } - - - public IFilter[] Filters - { - get { return GetFilters(ANY_BACKUP_ID); } - set { SetFilters(value, ANY_BACKUP_ID); } - } - - public ISetting[] Settings - { - get { return GetSettings(ANY_BACKUP_ID); } - set { SetSettings(value, ANY_BACKUP_ID); } - } - - public INotification[] GetNotifications() - { - lock(m_lock) - return ReadFromDb(null).Cast().ToArray(); - } - - public bool DismissNotification(long id) - { - lock(m_lock) - { - var notifications = GetNotifications(); - var cur = notifications.FirstOrDefault(x => x.ID == id); - if (cur == null) - return false; - - DeleteFromDb(typeof(Notification).Name, id); - Program.DataConnection.ApplicationSettings.UnackedError = notifications.Any(x => x.ID != id && x.Type == Duplicati.Server.Serialization.NotificationType.Error); - Program.DataConnection.ApplicationSettings.UnackedWarning = notifications.Any(x => x.ID != id && x.Type == Duplicati.Server.Serialization.NotificationType.Warning); - } - - System.Threading.Interlocked.Increment(ref Program.LastNotificationUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - - return true; - } - - public void RegisterNotification(Serialization.NotificationType type, string title, string message, Exception ex, string backupid, string action, string logid, string messageid, string logtag, Func conflicthandler) - { - lock(m_lock) - { - var notification = new Notification() - { - ID = -1, - Type = type, - Title = title, - Message = message, - Exception = ex == null ? "" : ex.ToString(), - BackupID = backupid, - Action = action ?? "", - Timestamp = DateTime.UtcNow, - LogEntryID = logid, - MessageID = messageid, - MessageLogTag = logtag - }; - - var conflictResult = conflicthandler(notification, GetNotifications()); - if (conflictResult == null) - return; - - if (conflictResult != notification) - DeleteFromDb(typeof(Notification).Name, conflictResult.ID); - - OverwriteAndUpdateDb(null, null, null, new Notification[] { notification }, false); - - if (type == Duplicati.Server.Serialization.NotificationType.Error) - Program.DataConnection.ApplicationSettings.UnackedError = true; - else if (type == Duplicati.Server.Serialization.NotificationType.Warning) - Program.DataConnection.ApplicationSettings.UnackedWarning = true; - } - - System.Threading.Interlocked.Increment(ref Program.LastNotificationUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - } - - //Workaround to clean up the database after invalid settings update - public void FixInvalidBackupId() - { - using(var cmd = m_connection.CreateCommand()) - using (var tr = m_connection.BeginTransaction()) - { - cmd.Transaction = tr; - cmd.Parameters.Add(cmd.CreateParameter()); - ((System.Data.IDbDataParameter)cmd.Parameters[0]).Value = -1; - cmd.CommandText = @"DELETE FROM ""Option"" WHERE ""BackupID"" = ?"; - cmd.ExecuteNonQuery(); - cmd.CommandText = @"DELETE FROM ""Metadata"" WHERE ""BackupID"" = ?"; - cmd.ExecuteNonQuery(); - cmd.CommandText = @"DELETE FROM ""Filter"" WHERE ""BackupID"" = ?"; - cmd.ExecuteNonQuery(); - cmd.CommandText = @"DELETE FROM ""Source"" WHERE ""BackupID"" = ?"; - cmd.ExecuteNonQuery(); - - cmd.Parameters.Clear(); - cmd.Parameters.Add(cmd.CreateParameter()); - - ((System.Data.IDbDataParameter)cmd.Parameters[0]).Value = "ID=-1"; - cmd.CommandText = @"DELETE FROM ""Schedule"" WHERE ""Tags"" = ?"; - cmd.ExecuteNonQuery(); - tr.Commit(); - } - - ApplicationSettings.FixedInvalidBackupId = true; - } - - public string[] GetUISettingsSchemes() - { - lock(m_lock) - return ReadFromDb( - (rd) => ConvertToString(rd, 0) ?? "", - @"SELECT DISTINCT ""Scheme"" FROM ""UIStorage""") - .ToArray(); - } - - public IDictionary GetUISettings(string scheme) - { - lock(m_lock) - return ReadFromDb( - (rd) => new KeyValuePair( - ConvertToString(rd, 0) ?? "", - ConvertToString(rd, 1) ?? "" - ), - @"SELECT ""Key"", ""Value"" FROM ""UIStorage"" WHERE ""Scheme"" = ?", - scheme) - .GroupBy(x => x.Key) - .ToDictionary(x => x.Key, x => x.Last().Value); - } - - public void SetUISettings(string scheme, IDictionary values, System.Data.IDbTransaction transaction = null) - { - lock(m_lock) - using(var tr = transaction == null ? m_connection.BeginTransaction() : null) - { - OverwriteAndUpdateDb( - tr, - @"DELETE FROM ""UIStorage"" WHERE ""Scheme"" = ?", new object[] { scheme }, - values, - @"INSERT INTO ""UIStorage"" (""Scheme"", ""Key"", ""Value"") VALUES (?, ?, ?)", - (f) => { - return new object[] { scheme, f.Key ?? "", f.Value ?? "" }; - } - ); - - if (tr != null) - tr.Commit(); - } - } - - public void UpdateUISettings(string scheme, IDictionary values, System.Data.IDbTransaction transaction = null) - { - lock (m_lock) - using (var tr = transaction == null ? m_connection.BeginTransaction() : null) - { - OverwriteAndUpdateDb( - tr, - @"DELETE FROM ""UIStorage"" WHERE ""Scheme"" = ? AND ""Key"" IN (?)", new object[] { scheme, values.Keys }, - values.Where(x => x.Value != null), - @"INSERT INTO ""UIStorage"" (""Scheme"", ""Key"", ""Value"") VALUES (?, ?, ?)", - (f) => - { - return new object[] { scheme, f.Key ?? "", f.Value ?? "" }; - } - ); - - if (tr != null) - tr.Commit(); - } - } - - public TempFile[] GetTempFiles() - { - lock(m_lock) - return ReadFromDb(null).ToArray(); - } - - public void DeleteTempFile(long id) - { - lock(m_lock) - DeleteFromDb(typeof(TempFile).Name, id); - } - - public long RegisterTempFile(string origin, string path, DateTime expires) - { - var tempfile = new TempFile() { - Timestamp = DateTime.Now, - Origin = origin, - Path = path, - Expires = expires - }; - - OverwriteAndUpdateDb(null, null, null, new TempFile[] { tempfile }, false); - - return tempfile.ID; - } - - public void PurgeLogData(DateTime purgeDate) - { - var t = Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(purgeDate); - - using(var tr = m_connection.BeginTransaction()) - using(var cmd = m_connection.CreateCommand()) - { - cmd.Transaction = tr; - cmd.CommandText = @"DELETE FROM ""ErrorLog"" WHERE ""Timestamp"" < ?"; - cmd.Parameters.Add(cmd.CreateParameter()); - ((System.Data.IDataParameter)cmd.Parameters[0]).Value = t; - cmd.ExecuteNonQuery(); - - tr.Commit(); - } - } - - private static DateTime ConvertToDateTime(System.Data.IDataReader rd, int index) - { - var unixTime = ConvertToInt64(rd, index); - return unixTime == 0 ? new DateTime(0) : Library.Utility.Utility.EPOCH.AddSeconds(unixTime); - } - - private static bool ConvertToBoolean(System.Data.IDataReader rd, int index) - { - return ConvertToInt64(rd, index) == 1; - } - - private static string ConvertToString(System.Data.IDataReader rd, int index) - { - var r = rd.GetValue(index); - return r == null || r == DBNull.Value ? null : r.ToString(); - } - - private static long ConvertToInt64(System.Data.IDataReader rd, int index) - { - try - { - if (!rd.IsDBNull(index)) - return rd.GetInt64(index); - } - catch - { - } - - return -1; - } - - private static long ExecuteScalarInt64(System.Data.IDbCommand cmd, long defaultValue = -1) - { - using(var rd = cmd.ExecuteReader()) - return rd.Read() ? ConvertToInt64(rd, 0) : defaultValue; - } - - private static string ExecuteScalarString(System.Data.IDbCommand cmd) - { - using(var rd = cmd.ExecuteReader()) - return rd.Read() ? ConvertToString(rd, 0) : null; - - } - - private object ConvertToEnum(Type enumType, System.Data.IDataReader rd, int index, object @default) - { - try - { - return Enum.Parse(enumType, ConvertToString(rd, index)); - } - catch - { - } - - return @default; - } - - // Overloaded function for legacy functionality - private bool DeleteFromDb(string tablename, long id, System.Data.IDbTransaction transaction = null) - { - return DeleteFromDb(tablename, id, "ID", transaction); - } - - // New function that allows to delete rows from tables with arbitrary identifier values (e.g. ID or BackupID) - private bool DeleteFromDb(string tablename, long id, string identifier, System.Data.IDbTransaction transaction = null) - { - if (transaction == null) - { - using(var tr = m_connection.BeginTransaction()) - { - var r = DeleteFromDb(tablename, id, tr); - tr.Commit(); - return r; - } - } - else - { - using(var cmd = m_connection.CreateCommand()) - { - cmd.Transaction = transaction; - cmd.CommandText = string.Format(@"DELETE FROM ""{0}"" WHERE ""{1}""=?", tablename, identifier); - var p = cmd.CreateParameter(); - p.Value = id; - cmd.Parameters.Add(p); - - var r = cmd.ExecuteNonQuery(); - // Roll back the transaction if more than 1 ID was deleted. Multiple "BackupID" rows being deleted isn't a problem. - if (identifier == "ID" && r > 1) - throw new Exception(string.Format("Too many records attempted deleted from table {0} for id {1}: {2}", tablename, id, r)); - return r == 1; - } - } - } - - private static IEnumerable Read(System.Data.IDbCommand cmd, Func f) - { - using(var rd = cmd.ExecuteReader()) - while(rd.Read()) - yield return f(rd); - } - - private static IEnumerable Read(System.Data.IDataReader rd, Func f) - { - while(rd.Read()) - yield return f(); - } - - private System.Reflection.PropertyInfo[] GetORMFields() - { - var flags = - System.Reflection.BindingFlags.FlattenHierarchy | - System.Reflection.BindingFlags.Instance | - System.Reflection.BindingFlags.Public; - - var supportedPropertyTypes = new Type[] { - typeof(long), - typeof(string), - typeof(bool), - typeof(DateTime) - }; - - return - (from n in typeof(T).GetProperties(flags) - where supportedPropertyTypes.Contains(n.PropertyType) || n.PropertyType.IsEnum - select n).ToArray(); - } - - private IEnumerable ReadFromDb(string whereclause, params object[] args) - { - var properties = GetORMFields(); - - var sql = string.Format( - @"SELECT ""{0}"" FROM ""{1}"" {2} {3}", - string.Join(@""", """, properties.Select(x => x.Name)), - typeof(T).Name, - string.IsNullOrWhiteSpace(whereclause) ? "" : " WHERE ", - whereclause ?? "" - ); - - return ReadFromDb((rd) => { - var item = Activator.CreateInstance(); - for(var i = 0; i < properties.Length; i++) - { - var prop = properties[i]; - - if (prop.PropertyType.IsEnum) - prop.SetValue(item, ConvertToEnum(prop.PropertyType, rd, i, Enum.GetValues(prop.PropertyType).GetValue(0)), null); - else if (prop.PropertyType == typeof(string)) - prop.SetValue(item, ConvertToString(rd, i), null); - else if (prop.PropertyType == typeof(long)) - prop.SetValue(item, ConvertToInt64(rd, i), null); - else if (prop.PropertyType == typeof(bool)) - prop.SetValue(item, ConvertToBoolean(rd, i), null); - else if (prop.PropertyType == typeof(DateTime)) - prop.SetValue(item, ConvertToDateTime(rd, i), null); - } - - return item; - }, sql, args); - } - - private void OverwriteAndUpdateDb(System.Data.IDbTransaction transaction, string deleteSql, object[] deleteArgs, IEnumerable values, bool updateExisting) - { - var properties = GetORMFields(); - var idfield = properties.FirstOrDefault(x => x.Name == "ID"); - properties = properties.Where(x => x.Name != "ID").ToArray(); - - string sql; - - if (updateExisting) - { - sql = string.Format( - @"UPDATE ""{0}"" SET {1} WHERE ""ID""=?", - typeof(T).Name, - string.Join(@", ", properties.Select(x => string.Format(@"""{0}""=?", x.Name))) - ); - - properties = properties.Union(new System.Reflection.PropertyInfo[] { idfield }).ToArray(); - } - else - { - - sql = string.Format( - @"INSERT INTO ""{0}"" (""{1}"") VALUES ({2})", - typeof(T).Name, - string.Join(@""", """, properties.Select(x => x.Name)), - string.Join(@", ", properties.Select(x => "?")) - ); - } - - OverwriteAndUpdateDb(transaction, deleteSql, deleteArgs, values, sql, (item) => - { - return properties.Select((x) => - { - var val = x.GetValue(item, null); - - if (x.PropertyType.IsEnum) - val = val.ToString(); - else if (x.PropertyType == typeof(DateTime)) - val = Library.Utility.Utility.NormalizeDateTimeToEpochSeconds((DateTime)val); - - return val; - }).ToArray(); - }); - - if (!updateExisting && values.Count() == 1 && idfield != null) - using(var cmd = m_connection.CreateCommand()) - { - cmd.Transaction = transaction; - cmd.CommandText = @"SELECT last_insert_rowid();"; - if (idfield.PropertyType == typeof(string)) - idfield.SetValue(values.First(), ExecuteScalarString(cmd), null); - else - idfield.SetValue(values.First(), ExecuteScalarInt64(cmd), null); - } - } - - private IEnumerable ReadFromDb(Func f, string sql, params object[] args) - { - using(var cmd = m_connection.CreateCommand()) - { - cmd.CommandText = sql; - if (args != null) - foreach(var a in args) - { - var p = cmd.CreateParameter(); - p.Value = a; - cmd.Parameters.Add(p); - } - - return Read(cmd, f).ToArray(); - } - } - - private void OverwriteAndUpdateDb(System.Data.IDbTransaction transaction, string deleteSql, object[] deleteArgs, IEnumerable values, string insertSql, Func f) - { - using(var cmd = m_connection.CreateCommand()) - { - cmd.Transaction = transaction; - - if (!string.IsNullOrEmpty(deleteSql)) - { - cmd.CommandText = deleteSql; - if (deleteArgs != null) - foreach(var a in deleteArgs) - { - var p = cmd.CreateParameter(); - p.Value = a; - cmd.Parameters.Add(p); - } - - cmd.ExecuteNonQuery(); - cmd.Parameters.Clear(); - } - - cmd.CommandText = insertSql; - - foreach(var n in values) - { - var r = f(n); - if (r == null) - continue; - - while (cmd.Parameters.Count < r.Length) - cmd.Parameters.Add(cmd.CreateParameter()); - - for(var i = 0; i < r.Length; i++) - ((System.Data.IDbDataParameter)cmd.Parameters[i]).Value = r[i]; - - cmd.ExecuteNonQuery(); - } - } - } - - #region IDisposable implementation - public void Dispose() - { - if (m_errorcmd != null) - try { if (m_errorcmd != null) m_errorcmd.Dispose(); } - catch { } - finally { m_errorcmd = null; } - - - try - { - if (m_connection != null) - m_connection.Dispose(); - } - catch - { - } - } - #endregion - } - -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using System.Linq; +using Duplicati.Server.Serialization.Interface; +using System.Text; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.Database +{ + public class Connection : IDisposable + { + private readonly System.Data.IDbConnection m_connection; + private System.Data.IDbCommand m_errorcmd; + public readonly object m_lock = new object(); + public const int ANY_BACKUP_ID = -1; + public const int SERVER_SETTINGS_ID = -2; + private readonly Dictionary m_temporaryBackups = new Dictionary(); + + public Connection(System.Data.IDbConnection connection) + { + m_connection = connection; + m_errorcmd = m_connection.CreateCommand(); + m_errorcmd.CommandText = @"INSERT INTO ""ErrorLog"" (""BackupID"", ""Message"", ""Exception"", ""Timestamp"") VALUES (?,?,?,?)"; + for(var i = 0; i < 4; i++) + m_errorcmd.Parameters.Add(m_errorcmd.CreateParameter()); + + this.ApplicationSettings = new ServerSettings(this); + } + + public void LogError(string backupid, string message, Exception ex) + { + lock(m_lock) + { + if (!long.TryParse(backupid, out long id)) + id = -1; + ((System.Data.IDbDataParameter)m_errorcmd.Parameters[0]).Value = id; + ((System.Data.IDbDataParameter)m_errorcmd.Parameters[1]).Value = message; + ((System.Data.IDbDataParameter)m_errorcmd.Parameters[2]).Value = ex?.ToString(); + ((System.Data.IDbDataParameter)m_errorcmd.Parameters[3]).Value = Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(DateTime.UtcNow); + m_errorcmd.ExecuteNonQuery(); + } + } + + internal void ExecuteWithCommand(Action f) + { + lock(m_lock) + using(var cmd = m_connection.CreateCommand()) + f(cmd); + } + + internal Serializable.ImportExportStructure PrepareBackupForExport(IBackup backup) + { + var scheduleId = GetScheduleIDsFromTags(new string[] { "ID=" + backup.ID }); + return new Serializable.ImportExportStructure() { + CreatedByVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), + Backup = (Database.Backup)backup, + Schedule = (Database.Schedule)(scheduleId.Any() ? GetSchedule(scheduleId.First()) : null), + DisplayNames = SpecialFolders.GetSourceNames(backup) + }; + } + + public string RegisterTemporaryBackup(IBackup backup) + { + lock(m_lock) + { + if (backup == null) + throw new ArgumentNullException(nameof(backup)); + if (backup.ID != null) + throw new ArgumentException("Backup is already active, cannot make temporary"); + + backup.ID = Guid.NewGuid().ToString("D"); + m_temporaryBackups.Add(backup.ID, (Backup)backup); + return backup.ID; + } + } + + public void UnregisterTemporaryBackup(IBackup backup) + { + lock(m_lock) + m_temporaryBackups.Remove(backup.ID); + } + + public void UpdateTemporaryBackup(IBackup backup) + { + lock(m_lock) + if (m_temporaryBackups.Remove(backup.ID)) + m_temporaryBackups.Add(backup.ID, (Backup)backup); + } + + public IBackup GetTemporaryBackup(string id) + { + if (string.IsNullOrEmpty(id)) + return null; + + lock(m_lock) + { + Backup b; + m_temporaryBackups.TryGetValue(id, out b); + return b; + } + } + + public ServerSettings ApplicationSettings { get; private set; } + + internal IDictionary GetMetadata(long id) + { + lock(m_lock) + return ReadFromDb( + (rd) => new KeyValuePair( + ConvertToString(rd, 0), + ConvertToString(rd, 1) + ), + @"SELECT ""Name"", ""Value"" FROM ""Metadata"" WHERE ""BackupID"" = ? ", id) + .ToDictionary((k) => k.Key, (k) => k.Value); + } + + internal void SetMetadata(IDictionary values, long id, System.Data.IDbTransaction transaction) + { + lock(m_lock) + using(var tr = transaction == null ? m_connection.BeginTransaction() : null) + { + OverwriteAndUpdateDb( + tr, + @"DELETE FROM ""Metadata"" WHERE ""BackupID"" = ?", new object[] { id }, + values ?? new Dictionary(), + @"INSERT INTO ""Metadata"" (""BackupID"", ""Name"", ""Value"") VALUES (?, ?, ?)", + (f) => new object[] { id, f.Key, f.Value } + ); + + if (tr != null) + tr.Commit(); + } + } + + internal IFilter[] GetFilters(long id) + { + lock(m_lock) + return ReadFromDb( + (rd) => (IFilter)new Filter() { + Order = ConvertToInt64(rd, 0), + Include = ConvertToBoolean(rd, 1), + Expression = ConvertToString(rd, 2) ?? "" + }, + @"SELECT ""Order"", ""Include"", ""Expression"" FROM ""Filter"" WHERE ""BackupID"" = ? ORDER BY ""Order"" ", id) + .ToArray(); + } + + internal void SetFilters(IEnumerable values, long id, System.Data.IDbTransaction transaction = null) + { + lock(m_lock) + using(var tr = transaction == null ? m_connection.BeginTransaction() : null) + { + OverwriteAndUpdateDb( + tr, + @"DELETE FROM ""Filter"" WHERE ""BackupID"" = ?", new object[] { id }, + values, + @"INSERT INTO ""Filter"" (""BackupID"", ""Order"", ""Include"", ""Expression"") VALUES (?, ?, ?, ?)", + (f) => new object[] { id, f.Order, f.Include, f.Expression } + ); + + if (tr != null) + tr.Commit(); + } + } + + public ISetting[] GetSettings(long id) + { + lock(m_lock) + return ReadFromDb( + (rd) => (ISetting)new Setting() { + Filter = ConvertToString(rd, 0) ?? "", + Name = ConvertToString(rd, 1) ?? "", + Value = ConvertToString(rd, 2) ?? "" + //TODO: Attach the argument information + }, + @"SELECT ""Filter"", ""Name"", ""Value"" FROM ""Option"" WHERE ""BackupID"" = ?", id) + .ToArray(); + } + + internal void SetSettings(IEnumerable values, long id, System.Data.IDbTransaction transaction = null) + { + lock(m_lock) + using(var tr = transaction == null ? m_connection.BeginTransaction() : null) + { + OverwriteAndUpdateDb( + tr, + @"DELETE FROM ""Option"" WHERE ""BackupID"" = ?", new object[] { id }, + values, + @"INSERT INTO ""Option"" (""BackupID"", ""Filter"", ""Name"", ""Value"") VALUES (?, ?, ?, ?)", + (f) => { + if (Duplicati.Server.WebServer.Server.PASSWORD_PLACEHOLDER.Equals(f.Value)) + throw new Exception("Attempted to save a property with the placeholder password"); + return new object[] { id, f.Filter ?? "", f.Name, f.Value ?? "" }; + } + ); + + if (tr != null) + tr.Commit(); + } + } + + internal string[] GetSources(long id) + { + lock(m_lock) + return ReadFromDb( + (rd) => ConvertToString(rd, 0), + @"SELECT ""Path"" FROM ""Source"" WHERE ""BackupID"" = ?", id) + .ToArray(); + } + + internal void SetSources(IEnumerable values, long id, System.Data.IDbTransaction transaction) + { + lock(m_lock) + using(var tr = transaction == null ? m_connection.BeginTransaction() : null) + { + OverwriteAndUpdateDb( + tr, + @"DELETE FROM ""Source"" WHERE ""BackupID"" = ?", new object[] { id }, + values, + @"INSERT INTO ""Source"" (""BackupID"", ""Path"") VALUES (?, ?)", + (f) => new object[] { id, f } + ); + + if (tr != null) + tr.Commit(); + } + } + + internal long[] GetBackupIDsForTags(string[] tags) + { + if (tags == null || tags.Length == 0) + return new long[0]; + + if (tags.Length == 1 && tags[0].StartsWith("ID=", StringComparison.Ordinal)) + return new long[] { long.Parse(tags[0].Substring("ID=".Length)) }; + + lock(m_lock) + using(var cmd = m_connection.CreateCommand()) + { + var sb = new StringBuilder(); + + foreach(var t in tags) + { + if (sb.Length != 0) + sb.Append(" OR "); + sb.Append(@" ("","" || ""Tags"" || "","" LIKE ""%,"" || ? || "",%"") "); + + var p = cmd.CreateParameter(); + p.Value = t; + cmd.Parameters.Add(p); + } + + cmd.CommandText = @"SELECT ""ID"" FROM ""Backup"" WHERE " + sb; + + return Read(cmd, (rd) => ConvertToInt64(rd, 0)).ToArray(); + } + } + + internal IBackup GetBackup(string id) + { + if (string.IsNullOrWhiteSpace(id)) + throw new ArgumentNullException(nameof(id)); + + return long.TryParse(id, out long lid) ? GetBackup(lid) : GetTemporaryBackup(id); + } + + internal IBackup GetBackup(long id) + { + lock(m_lock) + { + var bk = ReadFromDb( + (rd) => new Backup { + ID = ConvertToInt64(rd, 0).ToString(), + Name = ConvertToString(rd, 1), + Description = ConvertToString(rd, 2), + Tags = (ConvertToString(rd, 3) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), + TargetURL = ConvertToString(rd, 4), + DBPath = ConvertToString(rd, 5), + }, + @"SELECT ""ID"", ""Name"", ""Description"", ""Tags"", ""TargetURL"", ""DBPath"" FROM ""Backup"" WHERE ID = ?", id) + .FirstOrDefault(); + + if (bk != null) + bk.LoadChildren(this); + + return bk; + } + } + + internal ISchedule GetSchedule(long id) + { + lock(m_lock) + { + var bk = ReadFromDb( + (rd) => new Schedule { + ID = ConvertToInt64(rd, 0), + Tags = (ConvertToString(rd, 1) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), + Time = ConvertToDateTime(rd, 2), + Repeat = ConvertToString(rd, 3), + LastRun = ConvertToDateTime(rd, 4), + Rule = ConvertToString(rd, 5), + }, + @"SELECT ""ID"", ""Tags"", ""Time"", ""Repeat"", ""LastRun"", ""Rule"" FROM ""Schedule"" WHERE ID = ?", id) + .FirstOrDefault(); + + return bk; + } + } + + internal Boolean IsUnencryptedOrPassphraseStored(long id) + { + lock (m_lock) + { + var usesEncryption = ReadFromDb( + (rd) => ConvertToBoolean(rd, 0), + @"SELECT VALUE != """" FROM ""Option"" WHERE BackupID = ? AND NAME='encryption-module'", id) + .FirstOrDefault(); + + if (!usesEncryption) + { + return true; + } + + return ReadFromDb( + (rd) => ConvertToBoolean(rd, 0), + @"SELECT VALUE != """" FROM ""Option"" WHERE BackupID = ? AND NAME='passphrase'", id) + .FirstOrDefault(); + } + } + + internal long[] GetScheduleIDsFromTags(string[] tags) + { + if (tags == null || tags.Length == 0) + return new long[0]; + + lock(m_lock) + using(var cmd = m_connection.CreateCommand()) + { + var sb = new StringBuilder(); + + foreach(var t in tags) + { + if (sb.Length != 0) + sb.Append(" OR "); + sb.Append(@" ("","" || ""Tags"" || "","" LIKE ""%,"" || ? || "",%"") "); + + var p = cmd.CreateParameter(); + p.Value = t; + cmd.Parameters.Add(p); + } + + cmd.CommandText = @"SELECT ""ID"" FROM ""Schedule"" WHERE " + sb; + + return Read(cmd, (rd) => ConvertToInt64(rd, 0)).ToArray(); + } + } + + public void AddOrUpdateBackupAndSchedule(IBackup item, ISchedule schedule) + { + AddOrUpdateBackup(item, true, schedule); + } + + public string ValidateBackup(IBackup item, ISchedule schedule) + { + if (string.IsNullOrWhiteSpace(item.Name)) + return "Missing a name"; + + if (string.IsNullOrWhiteSpace(item.TargetURL)) + return "Missing a target"; + + if (item.Sources == null || item.Sources.Any(x => string.IsNullOrWhiteSpace(x)) || item.Sources.Length == 0) + return "Invalid source list"; + + var disabled_encryption = false; + var passphrase = string.Empty; + var gpgAsymmetricEncryption = false; + if (item.Settings != null) + { + foreach (var s in item.Settings) + + if (string.Equals(s.Name, "--no-encryption", StringComparison.OrdinalIgnoreCase)) + disabled_encryption = string.IsNullOrWhiteSpace(s.Value) || Library.Utility.Utility.ParseBool(s.Value, false); + else if (string.Equals(s.Name, "passphrase", StringComparison.OrdinalIgnoreCase)) + passphrase = s.Value; + else if (string.Equals(s.Name, "keep-versions", StringComparison.OrdinalIgnoreCase)) + { + int i; + if (!int.TryParse(s.Value, out i) || i <= 0) + return "Retention value must be a positive integer"; + } + else if (string.Equals(s.Name, "keep-time", StringComparison.OrdinalIgnoreCase)) + { + try + { + var ts = Library.Utility.Timeparser.ParseTimeSpan(s.Value); + if (ts <= TimeSpan.FromMinutes(5)) + return "Retention value must be more than 5 minutes"; + } + catch + { + return "Retention value must be a valid timespan"; + } + } + else if (string.Equals(s.Name, "dblock-size", StringComparison.OrdinalIgnoreCase)) + { + try + { + var ds = Library.Utility.Sizeparser.ParseSize(s.Value); + if (ds < 1024 * 1024) + return "DBlock size must be at least 1MB"; + } + catch + { + return "DBlock value must be a valid size string"; + } + } + else if (string.Equals(s.Name, "--blocksize", StringComparison.OrdinalIgnoreCase)) + { + try + { + var ds = Library.Utility.Sizeparser.ParseSize(s.Value); + if (ds < 1024 || ds > int.MaxValue) + return "The blocksize must be at least 1KB"; + } + catch + { + return "The blocksize value must be a valid size string"; + } + } + else if (string.Equals(s.Name, "--prefix", StringComparison.OrdinalIgnoreCase)) + { + if (!string.IsNullOrWhiteSpace(s.Value) && s.Value.Contains("-")) + return "The prefix cannot contain hyphens (-)"; + } + else if (string.Equals(s.Name, "--gpg-encryption-command", StringComparison.OrdinalIgnoreCase)) { + gpgAsymmetricEncryption = string.Equals(s.Value, "--encrypt", StringComparison.OrdinalIgnoreCase); + } + } + + if (!disabled_encryption && !gpgAsymmetricEncryption && string.IsNullOrWhiteSpace(passphrase)) + return "Missing passphrase"; + + if (schedule != null) + { + try + { + var ts = Library.Utility.Timeparser.ParseTimeSpan(schedule.Repeat); + if (ts <= TimeSpan.FromMinutes(5)) + return "Schedule repetition time must be more than 5 minutes"; + } + catch + { + return "Schedule repetition value must be a valid timespan"; + } + + } + + return null; + } + + internal void UpdateBackupDBPath(IBackup item, string path) + { + lock (m_lock) + { + using (var tr = m_connection.BeginTransaction()) + { + using (var cmd = m_connection.CreateCommand()) + { + cmd.Transaction = tr; + cmd.Parameters.Add(cmd.CreateParameter()); + ((System.Data.IDbDataParameter) cmd.Parameters[0]).Value = path; + cmd.Parameters.Add(cmd.CreateParameter()); + ((System.Data.IDbDataParameter) cmd.Parameters[1]).Value = item.ID; + + cmd.CommandText = @"UPDATE ""Backup"" SET ""DBPath""=? WHERE ""ID""=?"; + cmd.ExecuteNonQuery(); + tr.Commit(); + } + } + } + + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + private void AddOrUpdateBackup(IBackup item, bool updateSchedule, ISchedule schedule) + { + lock(m_lock) + { + bool update = item.ID != null; + if (!update && item.DBPath == null) + { + var folder = FIXMEGlobal.DataFolder; + if (!System.IO.Directory.Exists(folder)) + System.IO.Directory.CreateDirectory(folder); + + for(var i = 0; i < 100; i++) + { + var guess = System.IO.Path.Combine(folder, System.IO.Path.ChangeExtension(Duplicati.Library.Main.DatabaseLocator.GenerateRandomName(), ".sqlite")); + if (!System.IO.File.Exists(guess)) + { + ((Backup)item).DBPath = guess; + break; + } + } + + if (item.DBPath == null) + throw new Exception("Unable to generate a unique database file name"); + } + + using(var tr = m_connection.BeginTransaction()) + { + OverwriteAndUpdateDb( + tr, + null, + new object[] { long.Parse(item.ID ?? "-1") }, + new IBackup[] { item }, + update ? + @"UPDATE ""Backup"" SET ""Name""=?, ""Description""=?, ""Tags""=?, ""TargetURL""=? WHERE ""ID""=?" : + @"INSERT INTO ""Backup"" (""Name"", ""Description"", ""Tags"", ""TargetURL"", ""DBPath"") VALUES (?,?,?,?,?)", + (n) => { + + if (n.TargetURL.IndexOf(Duplicati.Server.WebServer.Server.PASSWORD_PLACEHOLDER, StringComparison.Ordinal) >= 0) + throw new Exception("Attempted to save a backup with the password placeholder"); + if (update && long.Parse(n.ID) <= 0) + throw new Exception("Invalid update, cannot update application settings through update method"); + + return new object[] { + n.Name, + n.Description ?? "" , // Description is optional but the column is set to NOT NULL, an additional check is welcome + string.Join(",", n.Tags ?? new string[0]), + n.TargetURL, + update ? item.ID : n.DBPath + }; + }); + + if (!update) + using(var cmd = m_connection.CreateCommand()) + { + cmd.Transaction = tr; + cmd.CommandText = @"SELECT last_insert_rowid();"; + item.ID = ExecuteScalarInt64(cmd).ToString(); + } + + var id = long.Parse(item.ID); + + if (long.Parse(item.ID) <= 0) + throw new Exception("Invalid addition, cannot update application settings through update method"); + + SetSources(item.Sources, id, tr); + SetSettings(item.Settings, id, tr); + SetFilters(item.Filters, id, tr); + SetMetadata(item.Metadata, id, tr); + + if (updateSchedule) + { + var tags = new string[] { "ID=" + item.ID }; + var existing = GetScheduleIDsFromTags(tags); + if (schedule == null && existing.Any()) + DeleteFromDb("Schedule", existing.First(), tr); + else if (schedule != null) + { + if (existing.Any()) + { + var cur = GetSchedule(existing.First()); + cur.AllowedDays = schedule.AllowedDays; + cur.Repeat = schedule.Repeat; + cur.Tags = schedule.Tags; + cur.Time = schedule.Time; + + schedule = cur; + } + else + { + schedule.ID = -1; + } + + schedule.Tags = tags; + AddOrUpdateSchedule(schedule, tr); + } + } + + tr.Commit(); + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + } + } + + internal void AddOrUpdateSchedule(ISchedule item) + { + lock(m_lock) + using(var tr = m_connection.BeginTransaction()) + { + AddOrUpdateSchedule(item, tr); + tr.Commit(); + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + } + + private void AddOrUpdateSchedule(ISchedule item, System.Data.IDbTransaction tr) + { + lock(m_lock) + { + bool update = item.ID >= 0; + OverwriteAndUpdateDb( + tr, + null, + new object[] { item.ID }, + new ISchedule[] { item }, + update ? + @"UPDATE ""Schedule"" SET ""Tags""=?, ""Time""=?, ""Repeat""=?, ""LastRun""=?, ""Rule""=? WHERE ""ID""=?" : + @"INSERT INTO ""Schedule"" (""Tags"", ""Time"", ""Repeat"", ""LastRun"", ""Rule"") VALUES (?,?,?,?,?)", + (n) => new object[] { + string.Join(",", n.Tags), + Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(n.Time), + n.Repeat, + Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(n.LastRun), + n.Rule ?? "", + update ? (object)item.ID : null + }); + + if (!update) + using(var cmd = m_connection.CreateCommand()) + { + cmd.Transaction = tr; + cmd.CommandText = @"SELECT last_insert_rowid();"; + item.ID = ExecuteScalarInt64(cmd); + } + } + } + + public void DeleteBackup(long ID) + { + if (ID < 0) + return; + + lock(m_lock) + { + using(var tr = m_connection.BeginTransaction()) + { + var existing = GetScheduleIDsFromTags(new string[] { "ID=" + ID.ToString() }); + if (existing.Any()) + DeleteFromDb("Schedule", existing.First(), tr); + + DeleteFromDb("ErrorLog", ID, "BackupID", tr); + DeleteFromDb("Filter", ID, "BackupID", tr); + DeleteFromDb("Log", ID, "BackupID", tr); + DeleteFromDb("Metadata", ID, "BackupID", tr); + DeleteFromDb("Option", ID, "BackupID", tr); + DeleteFromDb("Source", ID, "BackupID", tr); + + DeleteFromDb("Backup", ID, tr); + + tr.Commit(); + } + } + + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + public void DeleteBackup(IBackup backup) + { + if (backup.IsTemporary) + UnregisterTemporaryBackup(backup); + else + DeleteBackup(long.Parse(backup.ID)); + } + + public void DeleteSchedule(long ID) + { + if (ID < 0) + return; + + lock(m_lock) + DeleteFromDb("Schedule", ID); + + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + public void DeleteSchedule(ISchedule schedule) + { + DeleteSchedule(schedule.ID); + } + + public IBackup[] Backups + { + get + { + lock(m_lock) + { + var lst = ReadFromDb( + (rd) => (IBackup)new Backup() { + ID = ConvertToInt64(rd, 0).ToString(), + Name = ConvertToString(rd, 1), + Description = ConvertToString(rd, 2), + Tags = (ConvertToString(rd, 3) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), + TargetURL = ConvertToString(rd, 4), + DBPath = ConvertToString(rd, 5), + }, + @"SELECT ""ID"", ""Name"", ""Description"", ""Tags"", ""TargetURL"", ""DBPath"" FROM ""Backup"" ") + .ToArray(); + + foreach(var n in lst) + n.Metadata = GetMetadata(long.Parse(n.ID)); + + + return lst; + } + } + } + + public ISchedule[] Schedules + { + get + { + lock(m_lock) + return ReadFromDb( + (rd) => (ISchedule)new Schedule() { + ID = ConvertToInt64(rd, 0), + Tags = (ConvertToString(rd, 1) ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), + Time = ConvertToDateTime(rd, 2), + Repeat = ConvertToString(rd, 3), + LastRun = ConvertToDateTime(rd, 4), + Rule = ConvertToString(rd, 5), + }, + @"SELECT ""ID"", ""Tags"", ""Time"", ""Repeat"", ""LastRun"", ""Rule"" FROM ""Schedule"" ") + .ToArray(); + } + } + + + public IFilter[] Filters + { + get { return GetFilters(ANY_BACKUP_ID); } + set { SetFilters(value, ANY_BACKUP_ID); } + } + + public ISetting[] Settings + { + get { return GetSettings(ANY_BACKUP_ID); } + set { SetSettings(value, ANY_BACKUP_ID); } + } + + public INotification[] GetNotifications() + { + lock(m_lock) + return ReadFromDb(null).Cast().ToArray(); + } + + public bool DismissNotification(long id) + { + lock(m_lock) + { + var notifications = GetNotifications(); + var cur = notifications.FirstOrDefault(x => x.ID == id); + if (cur == null) + return false; + + DeleteFromDb(typeof(Notification).Name, id); + FIXMEGlobal.DataConnection.ApplicationSettings.UnackedError = notifications.Any(x => x.ID != id && x.Type == Duplicati.Server.Serialization.NotificationType.Error); + FIXMEGlobal.DataConnection.ApplicationSettings.UnackedWarning = notifications.Any(x => x.ID != id && x.Type == Duplicati.Server.Serialization.NotificationType.Warning); + } + + FIXMEGlobal.IncrementLastNotificationUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + return true; + } + + public void RegisterNotification(Serialization.NotificationType type, string title, string message, Exception ex, string backupid, string action, string logid, string messageid, string logtag, Func conflicthandler) + { + lock(m_lock) + { + var notification = new Notification() + { + ID = -1, + Type = type, + Title = title, + Message = message, + Exception = ex == null ? "" : ex.ToString(), + BackupID = backupid, + Action = action ?? "", + Timestamp = DateTime.UtcNow, + LogEntryID = logid, + MessageID = messageid, + MessageLogTag = logtag + }; + + var conflictResult = conflicthandler(notification, GetNotifications()); + if (conflictResult == null) + return; + + if (conflictResult != notification) + DeleteFromDb(typeof(Notification).Name, conflictResult.ID); + + OverwriteAndUpdateDb(null, null, null, new Notification[] { notification }, false); + + if (type == Duplicati.Server.Serialization.NotificationType.Error) + FIXMEGlobal.DataConnection.ApplicationSettings.UnackedError = true; + else if (type == Duplicati.Server.Serialization.NotificationType.Warning) + FIXMEGlobal.DataConnection.ApplicationSettings.UnackedWarning = true; + } + + FIXMEGlobal.IncrementLastNotificationUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + //Workaround to clean up the database after invalid settings update + public void FixInvalidBackupId() + { + using(var cmd = m_connection.CreateCommand()) + using (var tr = m_connection.BeginTransaction()) + { + cmd.Transaction = tr; + cmd.Parameters.Add(cmd.CreateParameter()); + ((System.Data.IDbDataParameter)cmd.Parameters[0]).Value = -1; + cmd.CommandText = @"DELETE FROM ""Option"" WHERE ""BackupID"" = ?"; + cmd.ExecuteNonQuery(); + cmd.CommandText = @"DELETE FROM ""Metadata"" WHERE ""BackupID"" = ?"; + cmd.ExecuteNonQuery(); + cmd.CommandText = @"DELETE FROM ""Filter"" WHERE ""BackupID"" = ?"; + cmd.ExecuteNonQuery(); + cmd.CommandText = @"DELETE FROM ""Source"" WHERE ""BackupID"" = ?"; + cmd.ExecuteNonQuery(); + + cmd.Parameters.Clear(); + cmd.Parameters.Add(cmd.CreateParameter()); + + ((System.Data.IDbDataParameter)cmd.Parameters[0]).Value = "ID=-1"; + cmd.CommandText = @"DELETE FROM ""Schedule"" WHERE ""Tags"" = ?"; + cmd.ExecuteNonQuery(); + tr.Commit(); + } + + ApplicationSettings.FixedInvalidBackupId = true; + } + + public string[] GetUISettingsSchemes() + { + lock(m_lock) + return ReadFromDb( + (rd) => ConvertToString(rd, 0) ?? "", + @"SELECT DISTINCT ""Scheme"" FROM ""UIStorage""") + .ToArray(); + } + + public IDictionary GetUISettings(string scheme) + { + lock(m_lock) + return ReadFromDb( + (rd) => new KeyValuePair( + ConvertToString(rd, 0) ?? "", + ConvertToString(rd, 1) ?? "" + ), + @"SELECT ""Key"", ""Value"" FROM ""UIStorage"" WHERE ""Scheme"" = ?", + scheme) + .GroupBy(x => x.Key) + .ToDictionary(x => x.Key, x => x.Last().Value); + } + + public void SetUISettings(string scheme, IDictionary values, System.Data.IDbTransaction transaction = null) + { + lock(m_lock) + using(var tr = transaction == null ? m_connection.BeginTransaction() : null) + { + OverwriteAndUpdateDb( + tr, + @"DELETE FROM ""UIStorage"" WHERE ""Scheme"" = ?", new object[] { scheme }, + values, + @"INSERT INTO ""UIStorage"" (""Scheme"", ""Key"", ""Value"") VALUES (?, ?, ?)", + (f) => { + return new object[] { scheme, f.Key ?? "", f.Value ?? "" }; + } + ); + + if (tr != null) + tr.Commit(); + } + } + + public void UpdateUISettings(string scheme, IDictionary values, System.Data.IDbTransaction transaction = null) + { + lock (m_lock) + using (var tr = transaction == null ? m_connection.BeginTransaction() : null) + { + OverwriteAndUpdateDb( + tr, + @"DELETE FROM ""UIStorage"" WHERE ""Scheme"" = ? AND ""Key"" IN (?)", new object[] { scheme, values.Keys }, + values.Where(x => x.Value != null), + @"INSERT INTO ""UIStorage"" (""Scheme"", ""Key"", ""Value"") VALUES (?, ?, ?)", + (f) => + { + return new object[] { scheme, f.Key ?? "", f.Value ?? "" }; + } + ); + + if (tr != null) + tr.Commit(); + } + } + + public TempFile[] GetTempFiles() + { + lock(m_lock) + return ReadFromDb(null).ToArray(); + } + + public void DeleteTempFile(long id) + { + lock(m_lock) + DeleteFromDb(typeof(TempFile).Name, id); + } + + public long RegisterTempFile(string origin, string path, DateTime expires) + { + var tempfile = new TempFile() { + Timestamp = DateTime.Now, + Origin = origin, + Path = path, + Expires = expires + }; + + OverwriteAndUpdateDb(null, null, null, new TempFile[] { tempfile }, false); + + return tempfile.ID; + } + + public void PurgeLogData(DateTime purgeDate) + { + var t = Library.Utility.Utility.NormalizeDateTimeToEpochSeconds(purgeDate); + + using(var tr = m_connection.BeginTransaction()) + using(var cmd = m_connection.CreateCommand()) + { + cmd.Transaction = tr; + cmd.CommandText = @"DELETE FROM ""ErrorLog"" WHERE ""Timestamp"" < ?"; + cmd.Parameters.Add(cmd.CreateParameter()); + ((System.Data.IDataParameter)cmd.Parameters[0]).Value = t; + cmd.ExecuteNonQuery(); + + tr.Commit(); + } + } + + private static DateTime ConvertToDateTime(System.Data.IDataReader rd, int index) + { + var unixTime = ConvertToInt64(rd, index); + return unixTime == 0 ? new DateTime(0) : Library.Utility.Utility.EPOCH.AddSeconds(unixTime); + } + + private static bool ConvertToBoolean(System.Data.IDataReader rd, int index) + { + return ConvertToInt64(rd, index) == 1; + } + + private static string ConvertToString(System.Data.IDataReader rd, int index) + { + var r = rd.GetValue(index); + return r == null || r == DBNull.Value ? null : r.ToString(); + } + + private static long ConvertToInt64(System.Data.IDataReader rd, int index) + { + try + { + if (!rd.IsDBNull(index)) + return rd.GetInt64(index); + } + catch + { + } + + return -1; + } + + private static long ExecuteScalarInt64(System.Data.IDbCommand cmd, long defaultValue = -1) + { + using(var rd = cmd.ExecuteReader()) + return rd.Read() ? ConvertToInt64(rd, 0) : defaultValue; + } + + private static string ExecuteScalarString(System.Data.IDbCommand cmd) + { + using(var rd = cmd.ExecuteReader()) + return rd.Read() ? ConvertToString(rd, 0) : null; + + } + + private object ConvertToEnum(Type enumType, System.Data.IDataReader rd, int index, object @default) + { + try + { + return Enum.Parse(enumType, ConvertToString(rd, index)); + } + catch + { + } + + return @default; + } + + // Overloaded function for legacy functionality + private bool DeleteFromDb(string tablename, long id, System.Data.IDbTransaction transaction = null) + { + return DeleteFromDb(tablename, id, "ID", transaction); + } + + // New function that allows to delete rows from tables with arbitrary identifier values (e.g. ID or BackupID) + private bool DeleteFromDb(string tablename, long id, string identifier, System.Data.IDbTransaction transaction = null) + { + if (transaction == null) + { + using(var tr = m_connection.BeginTransaction()) + { + var r = DeleteFromDb(tablename, id, tr); + tr.Commit(); + return r; + } + } + else + { + using(var cmd = m_connection.CreateCommand()) + { + cmd.Transaction = transaction; + cmd.CommandText = string.Format(@"DELETE FROM ""{0}"" WHERE ""{1}""=?", tablename, identifier); + var p = cmd.CreateParameter(); + p.Value = id; + cmd.Parameters.Add(p); + + var r = cmd.ExecuteNonQuery(); + // Roll back the transaction if more than 1 ID was deleted. Multiple "BackupID" rows being deleted isn't a problem. + if (identifier == "ID" && r > 1) + throw new Exception(string.Format("Too many records attempted deleted from table {0} for id {1}: {2}", tablename, id, r)); + return r == 1; + } + } + } + + private static IEnumerable Read(System.Data.IDbCommand cmd, Func f) + { + using(var rd = cmd.ExecuteReader()) + while(rd.Read()) + yield return f(rd); + } + + private static IEnumerable Read(System.Data.IDataReader rd, Func f) + { + while(rd.Read()) + yield return f(); + } + + private System.Reflection.PropertyInfo[] GetORMFields() + { + var flags = + System.Reflection.BindingFlags.FlattenHierarchy | + System.Reflection.BindingFlags.Instance | + System.Reflection.BindingFlags.Public; + + var supportedPropertyTypes = new Type[] { + typeof(long), + typeof(string), + typeof(bool), + typeof(DateTime) + }; + + return + (from n in typeof(T).GetProperties(flags) + where supportedPropertyTypes.Contains(n.PropertyType) || n.PropertyType.IsEnum + select n).ToArray(); + } + + private IEnumerable ReadFromDb(string whereclause, params object[] args) + { + var properties = GetORMFields(); + + var sql = string.Format( + @"SELECT ""{0}"" FROM ""{1}"" {2} {3}", + string.Join(@""", """, properties.Select(x => x.Name)), + typeof(T).Name, + string.IsNullOrWhiteSpace(whereclause) ? "" : " WHERE ", + whereclause ?? "" + ); + + return ReadFromDb((rd) => { + var item = Activator.CreateInstance(); + for(var i = 0; i < properties.Length; i++) + { + var prop = properties[i]; + + if (prop.PropertyType.IsEnum) + prop.SetValue(item, ConvertToEnum(prop.PropertyType, rd, i, Enum.GetValues(prop.PropertyType).GetValue(0)), null); + else if (prop.PropertyType == typeof(string)) + prop.SetValue(item, ConvertToString(rd, i), null); + else if (prop.PropertyType == typeof(long)) + prop.SetValue(item, ConvertToInt64(rd, i), null); + else if (prop.PropertyType == typeof(bool)) + prop.SetValue(item, ConvertToBoolean(rd, i), null); + else if (prop.PropertyType == typeof(DateTime)) + prop.SetValue(item, ConvertToDateTime(rd, i), null); + } + + return item; + }, sql, args); + } + + private void OverwriteAndUpdateDb(System.Data.IDbTransaction transaction, string deleteSql, object[] deleteArgs, IEnumerable values, bool updateExisting) + { + var properties = GetORMFields(); + var idfield = properties.FirstOrDefault(x => x.Name == "ID"); + properties = properties.Where(x => x.Name != "ID").ToArray(); + + string sql; + + if (updateExisting) + { + sql = string.Format( + @"UPDATE ""{0}"" SET {1} WHERE ""ID""=?", + typeof(T).Name, + string.Join(@", ", properties.Select(x => string.Format(@"""{0}""=?", x.Name))) + ); + + properties = properties.Union(new System.Reflection.PropertyInfo[] { idfield }).ToArray(); + } + else + { + + sql = string.Format( + @"INSERT INTO ""{0}"" (""{1}"") VALUES ({2})", + typeof(T).Name, + string.Join(@""", """, properties.Select(x => x.Name)), + string.Join(@", ", properties.Select(x => "?")) + ); + } + + OverwriteAndUpdateDb(transaction, deleteSql, deleteArgs, values, sql, (item) => + { + return properties.Select((x) => + { + var val = x.GetValue(item, null); + + if (x.PropertyType.IsEnum) + val = val.ToString(); + else if (x.PropertyType == typeof(DateTime)) + val = Library.Utility.Utility.NormalizeDateTimeToEpochSeconds((DateTime)val); + + return val; + }).ToArray(); + }); + + if (!updateExisting && values.Count() == 1 && idfield != null) + using(var cmd = m_connection.CreateCommand()) + { + cmd.Transaction = transaction; + cmd.CommandText = @"SELECT last_insert_rowid();"; + if (idfield.PropertyType == typeof(string)) + idfield.SetValue(values.First(), ExecuteScalarString(cmd), null); + else + idfield.SetValue(values.First(), ExecuteScalarInt64(cmd), null); + } + } + + private IEnumerable ReadFromDb(Func f, string sql, params object[] args) + { + using(var cmd = m_connection.CreateCommand()) + { + cmd.CommandText = sql; + if (args != null) + foreach(var a in args) + { + var p = cmd.CreateParameter(); + p.Value = a; + cmd.Parameters.Add(p); + } + + return Read(cmd, f).ToArray(); + } + } + + private void OverwriteAndUpdateDb(System.Data.IDbTransaction transaction, string deleteSql, object[] deleteArgs, IEnumerable values, string insertSql, Func f) + { + using(var cmd = m_connection.CreateCommand()) + { + cmd.Transaction = transaction; + + if (!string.IsNullOrEmpty(deleteSql)) + { + cmd.CommandText = deleteSql; + if (deleteArgs != null) + foreach(var a in deleteArgs) + { + var p = cmd.CreateParameter(); + p.Value = a; + cmd.Parameters.Add(p); + } + + cmd.ExecuteNonQuery(); + cmd.Parameters.Clear(); + } + + cmd.CommandText = insertSql; + + foreach(var n in values) + { + var r = f(n); + if (r == null) + continue; + + while (cmd.Parameters.Count < r.Length) + cmd.Parameters.Add(cmd.CreateParameter()); + + for(var i = 0; i < r.Length; i++) + ((System.Data.IDbDataParameter)cmd.Parameters[i]).Value = r[i]; + + cmd.ExecuteNonQuery(); + } + } + } + + #region IDisposable implementation + public void Dispose() + { + if (m_errorcmd != null) + try { if (m_errorcmd != null) m_errorcmd.Dispose(); } + catch { } + finally { m_errorcmd = null; } + + + try + { + if (m_connection != null) + m_connection.Dispose(); + } + catch + { + } + } + #endregion + } + +} + diff --git a/Duplicati/Server/Database/Database schema/1. Add Notifications.sql b/Duplicati.Library.RestAPI/Database/Database schema/1. Add Notifications.sql similarity index 95% rename from Duplicati/Server/Database/Database schema/1. Add Notifications.sql rename to Duplicati.Library.RestAPI/Database/Database schema/1. Add Notifications.sql index 578ef8ee8..9dc3c8b75 100644 --- a/Duplicati/Server/Database/Database schema/1. Add Notifications.sql +++ b/Duplicati.Library.RestAPI/Database/Database schema/1. Add Notifications.sql @@ -1,14 +1,14 @@ -/* -Notifications not yet acknowledged by the user -*/ -CREATE TABLE "Notification" ( - "ID" INTEGER PRIMARY KEY, - "Type" TEXT NOT NULL, - "Title" TEXT NOT NULL, - "Message" TEXT NOT NULL, - "Exception" TEXT NOT NULL, - "BackupID" TEXT NULL, - "Action" TEXT NOT NULL, - "Timestamp" INTEGER NOT NULL -); - +/* +Notifications not yet acknowledged by the user +*/ +CREATE TABLE "Notification" ( + "ID" INTEGER PRIMARY KEY, + "Type" TEXT NOT NULL, + "Title" TEXT NOT NULL, + "Message" TEXT NOT NULL, + "Exception" TEXT NOT NULL, + "BackupID" TEXT NULL, + "Action" TEXT NOT NULL, + "Timestamp" INTEGER NOT NULL +); + diff --git a/Duplicati/Server/Database/Database schema/2. Add UIStorage.sql b/Duplicati.Library.RestAPI/Database/Database schema/2. Add UIStorage.sql similarity index 94% rename from Duplicati/Server/Database/Database schema/2. Add UIStorage.sql rename to Duplicati.Library.RestAPI/Database/Database schema/2. Add UIStorage.sql index 2c33babc2..b0339749a 100644 --- a/Duplicati/Server/Database/Database schema/2. Add UIStorage.sql +++ b/Duplicati.Library.RestAPI/Database/Database schema/2. Add UIStorage.sql @@ -1,9 +1,9 @@ -/* -Key/value storage for frontends -*/ -CREATE TABLE "UIStorage" ( - "Scheme" TEXT NOT NULL, - "Key" TEXT NOT NULL, - "Value" TEXT NOT NULL -); - +/* +Key/value storage for frontends +*/ +CREATE TABLE "UIStorage" ( + "Scheme" TEXT NOT NULL, + "Key" TEXT NOT NULL, + "Value" TEXT NOT NULL +); + diff --git a/Duplicati/Server/Database/Database schema/3. Add temp file storage.sql b/Duplicati.Library.RestAPI/Database/Database schema/3. Add temp file storage.sql similarity index 95% rename from Duplicati/Server/Database/Database schema/3. Add temp file storage.sql rename to Duplicati.Library.RestAPI/Database/Database schema/3. Add temp file storage.sql index 1f77cd181..67d71370a 100644 --- a/Duplicati/Server/Database/Database schema/3. Add temp file storage.sql +++ b/Duplicati.Library.RestAPI/Database/Database schema/3. Add temp file storage.sql @@ -1,11 +1,11 @@ -/* -Long-term temporary file records -*/ -CREATE TABLE "TempFile" ( - "ID" INTEGER PRIMARY KEY, - "Origin" TEXT NOT NULL, - "Path" TEXT NOT NULL, - "Timestamp" INTEGER NOT NULL, - "Expires" INTEGER NOT NULL -); - +/* +Long-term temporary file records +*/ +CREATE TABLE "TempFile" ( + "ID" INTEGER PRIMARY KEY, + "Origin" TEXT NOT NULL, + "Path" TEXT NOT NULL, + "Timestamp" INTEGER NOT NULL, + "Expires" INTEGER NOT NULL +); + diff --git a/Duplicati/Server/Database/Database schema/4. Add autoincrement to backup id.sql b/Duplicati.Library.RestAPI/Database/Database schema/4. Add autoincrement to backup id.sql similarity index 100% rename from Duplicati/Server/Database/Database schema/4. Add autoincrement to backup id.sql rename to Duplicati.Library.RestAPI/Database/Database schema/4. Add autoincrement to backup id.sql diff --git a/Duplicati/Server/Database/Database schema/5. Extend notification table.sql b/Duplicati.Library.RestAPI/Database/Database schema/5. Extend notification table.sql similarity index 100% rename from Duplicati/Server/Database/Database schema/5. Extend notification table.sql rename to Duplicati.Library.RestAPI/Database/Database schema/5. Extend notification table.sql diff --git a/Duplicati/Server/Database/Database schema/6. Add Description to Backup.sql b/Duplicati.Library.RestAPI/Database/Database schema/6. Add Description to Backup.sql similarity index 100% rename from Duplicati/Server/Database/Database schema/6. Add Description to Backup.sql rename to Duplicati.Library.RestAPI/Database/Database schema/6. Add Description to Backup.sql diff --git a/Duplicati/Server/Database/Database schema/Schema.sql b/Duplicati.Library.RestAPI/Database/Database schema/Schema.sql similarity index 96% rename from Duplicati/Server/Database/Database schema/Schema.sql rename to Duplicati.Library.RestAPI/Database/Database schema/Schema.sql index 97c237ae2..b05876d22 100644 --- a/Duplicati/Server/Database/Database schema/Schema.sql +++ b/Duplicati.Library.RestAPI/Database/Database schema/Schema.sql @@ -1,158 +1,158 @@ -/* - * The primary table that stores all backups. - * - * The name and tag are free form user strings. - * The tags are comma separated - * the TargetURL is the url to remote storage, - * and the DBPath is the path to the local database - */ -CREATE TABLE "Backup" ( - "ID" INTEGER PRIMARY KEY AUTOINCREMENT, - "Name" TEXT NOT NULL, - "Description" TEXT NOT NULL DEFAULT '', - "Tags" TEXT NOT NULL, - "TargetURL" TEXT NOT NULL, - "DBPath" TEXT NOT NULL -); - -/* - * The table that stores all schedules - * - * Tags is a comma separated parsed field that indicates - * which backups to run when activated. - * special tags are ID:1 which means backup with ID = 1 - * - * Time is the scheduled time, and lastRun is the last time the backup was executed - * - * Rule is a special parsed field - */ -CREATE TABLE "Schedule" ( - "ID" INTEGER PRIMARY KEY, - "Tags" TEXT NOT NULL, - "Time" INTEGER NOT NULL, - "Repeat" TEXT NOT NULL, - "LastRun" INTEGER NOT NULL, - "Rule" TEXT NOT NULL -); - -/* - * The source table is a list of source folders and files - */ -CREATE TABLE "Source" ( - "BackupID" INTEGER NOT NULL, - "Path" TEXT NOT NULL -); - -/* - * The filter table contains all filters associated with a backup. - * The special backupID -1 means "applied to all backups" - * The expression is the filter, if the filter is a regular - * expression, it is surrounded by hard brackets [ ] - */ -CREATE TABLE "Filter" ( - "BackupID" INTEGER NOT NULL, - "Order" INTEGER NOT NULL, - "Include" INTEGER NOT NULL, - "Expression" TEXT NOT NULL -); - -/* - * All options are stored in this table - * - * The special backupID -1 means "applied to all backups". - * - * The filter is used to indicate what the option applies to, - * for instance backend:s3 will only apply to backends of type S3 - * - * The name and value are the option name and value - */ -CREATE TABLE "Option" ( - "BackupID" INTEGER NOT NULL, - "Filter" TEXT NOT NULL, - "Name" TEXT NOT NULL, - "Value" TEXT NOT NULL -); - -/* - * Recorded metadata about a backup - * This table contains metadata, such as when the backup was last started, - * how long it took, how many files there were, how big the backup set was, - * how much data was uploaded, downloaded, how fast, how much space is left, - * and similar data. Programs can use this information to improve the display, - * but cannot count on these values being present - */ -CREATE TABLE "Metadata" ( - "BackupID" INTEGER NOT NULL, - "Name" TEXT NOT NULL, - "Value" TEXT NOT NULL -); - -/* - * The log of operations initiated by the scheduler/user - */ -CREATE TABLE "Log" ( - "BackupID" INTEGER NOT NULL, - "Description" TEXT NOT NULL, - "Start" INTEGER NOT NULL, - "Finish" INTEGER NOT NULL, - "Result" TEXT NOT NULL, - "SuggestedIcon" TEXT NOT NULL -); - -/* - * The log of errors - */ -CREATE TABLE "ErrorLog" ( - "BackupID" INTEGER, - "Message" TEXT NOT NULL, - "Exception" TEXT, - "Timestamp" INTEGER NOT NULL -); - -/* -Internal version tracking -*/ -CREATE TABLE "Version" ( - "ID" INTEGER PRIMARY KEY, - "Version" INTEGER NOT NULL -); - -/* -Notifications not yet acknowledged by the user -*/ -CREATE TABLE "Notification" ( - "ID" INTEGER PRIMARY KEY, - "Type" TEXT NOT NULL, - "Title" TEXT NOT NULL, - "Message" TEXT NOT NULL, - "Exception" TEXT NOT NULL, - "BackupID" TEXT NULL, - "Action" TEXT NOT NULL, - "Timestamp" INTEGER NOT NULL, - "LogEntryID" TEXT NULL, - "MessageID" TEXT NULL, - "MessageLogTag" TEXT NULL -); - -/* -Key/value storage for frontends -*/ -CREATE TABLE "UIStorage" ( - "Scheme" TEXT NOT NULL, - "Key" TEXT NOT NULL, - "Value" TEXT NOT NULL -); - -/* -Long-term temporary file records -*/ -CREATE TABLE "TempFile" ( - "ID" INTEGER PRIMARY KEY, - "Origin" TEXT NOT NULL, - "Path" TEXT NOT NULL, - "Timestamp" INTEGER NOT NULL, - "Expires" INTEGER NOT NULL -); - -INSERT INTO "Version" ("Version") VALUES (6); - +/* + * The primary table that stores all backups. + * + * The name and tag are free form user strings. + * The tags are comma separated + * the TargetURL is the url to remote storage, + * and the DBPath is the path to the local database + */ +CREATE TABLE "Backup" ( + "ID" INTEGER PRIMARY KEY AUTOINCREMENT, + "Name" TEXT NOT NULL, + "Description" TEXT NOT NULL DEFAULT '', + "Tags" TEXT NOT NULL, + "TargetURL" TEXT NOT NULL, + "DBPath" TEXT NOT NULL +); + +/* + * The table that stores all schedules + * + * Tags is a comma separated parsed field that indicates + * which backups to run when activated. + * special tags are ID:1 which means backup with ID = 1 + * + * Time is the scheduled time, and lastRun is the last time the backup was executed + * + * Rule is a special parsed field + */ +CREATE TABLE "Schedule" ( + "ID" INTEGER PRIMARY KEY, + "Tags" TEXT NOT NULL, + "Time" INTEGER NOT NULL, + "Repeat" TEXT NOT NULL, + "LastRun" INTEGER NOT NULL, + "Rule" TEXT NOT NULL +); + +/* + * The source table is a list of source folders and files + */ +CREATE TABLE "Source" ( + "BackupID" INTEGER NOT NULL, + "Path" TEXT NOT NULL +); + +/* + * The filter table contains all filters associated with a backup. + * The special backupID -1 means "applied to all backups" + * The expression is the filter, if the filter is a regular + * expression, it is surrounded by hard brackets [ ] + */ +CREATE TABLE "Filter" ( + "BackupID" INTEGER NOT NULL, + "Order" INTEGER NOT NULL, + "Include" INTEGER NOT NULL, + "Expression" TEXT NOT NULL +); + +/* + * All options are stored in this table + * + * The special backupID -1 means "applied to all backups". + * + * The filter is used to indicate what the option applies to, + * for instance backend:s3 will only apply to backends of type S3 + * + * The name and value are the option name and value + */ +CREATE TABLE "Option" ( + "BackupID" INTEGER NOT NULL, + "Filter" TEXT NOT NULL, + "Name" TEXT NOT NULL, + "Value" TEXT NOT NULL +); + +/* + * Recorded metadata about a backup + * This table contains metadata, such as when the backup was last started, + * how long it took, how many files there were, how big the backup set was, + * how much data was uploaded, downloaded, how fast, how much space is left, + * and similar data. Programs can use this information to improve the display, + * but cannot count on these values being present + */ +CREATE TABLE "Metadata" ( + "BackupID" INTEGER NOT NULL, + "Name" TEXT NOT NULL, + "Value" TEXT NOT NULL +); + +/* + * The log of operations initiated by the scheduler/user + */ +CREATE TABLE "Log" ( + "BackupID" INTEGER NOT NULL, + "Description" TEXT NOT NULL, + "Start" INTEGER NOT NULL, + "Finish" INTEGER NOT NULL, + "Result" TEXT NOT NULL, + "SuggestedIcon" TEXT NOT NULL +); + +/* + * The log of errors + */ +CREATE TABLE "ErrorLog" ( + "BackupID" INTEGER, + "Message" TEXT NOT NULL, + "Exception" TEXT, + "Timestamp" INTEGER NOT NULL +); + +/* +Internal version tracking +*/ +CREATE TABLE "Version" ( + "ID" INTEGER PRIMARY KEY, + "Version" INTEGER NOT NULL +); + +/* +Notifications not yet acknowledged by the user +*/ +CREATE TABLE "Notification" ( + "ID" INTEGER PRIMARY KEY, + "Type" TEXT NOT NULL, + "Title" TEXT NOT NULL, + "Message" TEXT NOT NULL, + "Exception" TEXT NOT NULL, + "BackupID" TEXT NULL, + "Action" TEXT NOT NULL, + "Timestamp" INTEGER NOT NULL, + "LogEntryID" TEXT NULL, + "MessageID" TEXT NULL, + "MessageLogTag" TEXT NULL +); + +/* +Key/value storage for frontends +*/ +CREATE TABLE "UIStorage" ( + "Scheme" TEXT NOT NULL, + "Key" TEXT NOT NULL, + "Value" TEXT NOT NULL +); + +/* +Long-term temporary file records +*/ +CREATE TABLE "TempFile" ( + "ID" INTEGER PRIMARY KEY, + "Origin" TEXT NOT NULL, + "Path" TEXT NOT NULL, + "Timestamp" INTEGER NOT NULL, + "Expires" INTEGER NOT NULL +); + +INSERT INTO "Version" ("Version") VALUES (6); + diff --git a/Duplicati.Library.RestAPI/Database/DatabaseConnectionSchemaMarker.cs b/Duplicati.Library.RestAPI/Database/DatabaseConnectionSchemaMarker.cs new file mode 100644 index 000000000..110f8477f --- /dev/null +++ b/Duplicati.Library.RestAPI/Database/DatabaseConnectionSchemaMarker.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Duplicati.Library.RestAPI.Database +{ + public static class DatabaseConnectionSchemaMarker + { + } +} diff --git a/Duplicati/Server/Database/Filter.cs b/Duplicati.Library.RestAPI/Database/Filter.cs similarity index 97% rename from Duplicati/Server/Database/Filter.cs rename to Duplicati.Library.RestAPI/Database/Filter.cs index 7f14e2bda..60733d83c 100644 --- a/Duplicati/Server/Database/Filter.cs +++ b/Duplicati.Library.RestAPI/Database/Filter.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.Database -{ - public class Filter : Duplicati.Server.Serialization.Interface.IFilter - { - public long Order { get; set; } - - public bool Include { get; set; } - - public string Expression { get; set; } - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; + +namespace Duplicati.Server.Database +{ + public class Filter : Duplicati.Server.Serialization.Interface.IFilter + { + public long Order { get; set; } + + public bool Include { get; set; } + + public string Expression { get; set; } + } +} + diff --git a/Duplicati/Server/Database/Notification.cs b/Duplicati.Library.RestAPI/Database/Notification.cs similarity index 97% rename from Duplicati/Server/Database/Notification.cs rename to Duplicati.Library.RestAPI/Database/Notification.cs index 22b507701..328951d94 100644 --- a/Duplicati/Server/Database/Notification.cs +++ b/Duplicati.Library.RestAPI/Database/Notification.cs @@ -1,39 +1,39 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.Database -{ - public class Notification : Server.Serialization.Interface.INotification - { - #region INotification implementation - public long ID { get; set; } - public Duplicati.Server.Serialization.NotificationType Type { get; set; } - public string Title { get; set; } - public string Message { get; set; } - public string Exception { get; set; } - public string BackupID { get; set; } - public string Action { get; set; } - public DateTime Timestamp { get; set; } - public string LogEntryID { get; set; } - public string MessageID { get; set; } - public string MessageLogTag { get; set; } - #endregion - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; + +namespace Duplicati.Server.Database +{ + public class Notification : Server.Serialization.Interface.INotification + { + #region INotification implementation + public long ID { get; set; } + public Duplicati.Server.Serialization.NotificationType Type { get; set; } + public string Title { get; set; } + public string Message { get; set; } + public string Exception { get; set; } + public string BackupID { get; set; } + public string Action { get; set; } + public DateTime Timestamp { get; set; } + public string LogEntryID { get; set; } + public string MessageID { get; set; } + public string MessageLogTag { get; set; } + #endregion + } +} + diff --git a/Duplicati/Server/Database/Schedule.cs b/Duplicati.Library.RestAPI/Database/Schedule.cs similarity index 97% rename from Duplicati/Server/Database/Schedule.cs rename to Duplicati.Library.RestAPI/Database/Schedule.cs index 7df817d40..4f38a5978 100644 --- a/Duplicati/Server/Database/Schedule.cs +++ b/Duplicati.Library.RestAPI/Database/Schedule.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using Duplicati.Server.Serialization.Interface; - -namespace Duplicati.Server.Database -{ - public class Schedule : ISchedule - { - public long ID { get; set; } - public string[] Tags { get; set; } - public DateTime Time { get; set; } - public string Repeat { get; set; } - public DateTime LastRun { get; set; } - public string Rule { get; set; } - - public DayOfWeek[] AllowedDays - { - get - { - if (string.IsNullOrEmpty(this.Rule)) - return null; - - var days = (from n in this.Rule.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries) - where n.StartsWith("AllowedWeekDays=", StringComparison.OrdinalIgnoreCase) - select n.Substring("AllowedWeekDays=".Length).Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)) - .FirstOrDefault(); - - - if (days == null) - return null; - - return (from n in days - where Enum.TryParse(n, true, out _) - select (DayOfWeek)Enum.Parse(typeof(DayOfWeek), n, true)) - .ToArray(); - } - set - { - - var parts = - string.IsNullOrEmpty(this.Rule) ? - new string[0] : - (from n in this.Rule.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries) - where !n.StartsWith("AllowedWeekDays=", StringComparison.OrdinalIgnoreCase) - select n); - - if (value != null && value.Length != 0) - parts = parts.Union(new string[] { - "AllowedWeekDays=" + - string.Join( - ",", - (from n in value - select Enum.GetName(typeof(DayOfWeek), n)).Distinct() - ) - }).Distinct(); - - this.Rule = string.Join(";", parts); - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using Duplicati.Server.Serialization.Interface; + +namespace Duplicati.Server.Database +{ + public class Schedule : ISchedule + { + public long ID { get; set; } + public string[] Tags { get; set; } + public DateTime Time { get; set; } + public string Repeat { get; set; } + public DateTime LastRun { get; set; } + public string Rule { get; set; } + + public DayOfWeek[] AllowedDays + { + get + { + if (string.IsNullOrEmpty(this.Rule)) + return null; + + var days = (from n in this.Rule.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries) + where n.StartsWith("AllowedWeekDays=", StringComparison.OrdinalIgnoreCase) + select n.Substring("AllowedWeekDays=".Length).Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)) + .FirstOrDefault(); + + + if (days == null) + return null; + + return (from n in days + where Enum.TryParse(n, true, out _) + select (DayOfWeek)Enum.Parse(typeof(DayOfWeek), n, true)) + .ToArray(); + } + set + { + + var parts = + string.IsNullOrEmpty(this.Rule) ? + new string[0] : + (from n in this.Rule.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries) + where !n.StartsWith("AllowedWeekDays=", StringComparison.OrdinalIgnoreCase) + select n); + + if (value != null && value.Length != 0) + parts = parts.Union(new string[] { + "AllowedWeekDays=" + + string.Join( + ",", + (from n in value + select Enum.GetName(typeof(DayOfWeek), n)).Distinct() + ) + }).Distinct(); + + this.Rule = string.Join(";", parts); + } + } + } +} + diff --git a/Duplicati/Server/Database/ServerSettings.cs b/Duplicati.Library.RestAPI/Database/ServerSettings.cs similarity index 95% rename from Duplicati/Server/Database/ServerSettings.cs rename to Duplicati.Library.RestAPI/Database/ServerSettings.cs index f39379867..92b02bcfa 100644 --- a/Duplicati/Server/Database/ServerSettings.cs +++ b/Duplicati.Library.RestAPI/Database/ServerSettings.cs @@ -1,208 +1,209 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Security.Cryptography.X509Certificates; -using Duplicati.Library.Common; +// Copyright (C) 2015, The Duplicati Team -namespace Duplicati.Server.Database -{ - public class ServerSettings - { - private static class CONST - { - public const string STARTUP_DELAY = "startup-delay"; - public const string DOWNLOAD_SPEED_LIMIT = "max-download-speed"; - public const string UPLOAD_SPEED_LIMIT = "max-upload-speed"; - public const string THREAD_PRIORITY = "thread-priority"; - public const string LAST_WEBSERVER_PORT = "last-webserver-port"; - public const string IS_FIRST_RUN = "is-first-run"; - public const string SERVER_PORT_CHANGED = "server-port-changed"; - public const string SERVER_PASSPHRASE = "server-passphrase"; - public const string SERVER_PASSPHRASE_SALT = "server-passphrase-salt"; - public const string SERVER_PASSPHRASETRAYICON = "server-passphrase-trayicon"; - public const string SERVER_PASSPHRASETRAYICONHASH = "server-passphrase-trayicon-hash"; - public const string UPDATE_CHECK_LAST = "last-update-check"; - public const string UPDATE_CHECK_INTERVAL = "update-check-interval"; - public const string UPDATE_CHECK_NEW_VERSION = "update-check-latest"; - public const string UNACKED_ERROR = "unacked-error"; - public const string UNACKED_WARNING = "unacked-warning"; - public const string SERVER_LISTEN_INTERFACE = "server-listen-interface"; - public const string SERVER_SSL_CERTIFICATE = "server-ssl-certificate"; - public const string HAS_FIXED_INVALID_BACKUPID = "has-fixed-invalid-backup-id"; - public const string UPDATE_CHANNEL = "update-channel"; +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Collections.Generic; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using Duplicati.Library.Common; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.Database +{ + public class ServerSettings + { + private static class CONST + { + public const string STARTUP_DELAY = "startup-delay"; + public const string DOWNLOAD_SPEED_LIMIT = "max-download-speed"; + public const string UPLOAD_SPEED_LIMIT = "max-upload-speed"; + public const string THREAD_PRIORITY = "thread-priority"; + public const string LAST_WEBSERVER_PORT = "last-webserver-port"; + public const string IS_FIRST_RUN = "is-first-run"; + public const string SERVER_PORT_CHANGED = "server-port-changed"; + public const string SERVER_PASSPHRASE = "server-passphrase"; + public const string SERVER_PASSPHRASE_SALT = "server-passphrase-salt"; + public const string SERVER_PASSPHRASETRAYICON = "server-passphrase-trayicon"; + public const string SERVER_PASSPHRASETRAYICONHASH = "server-passphrase-trayicon-hash"; + public const string UPDATE_CHECK_LAST = "last-update-check"; + public const string UPDATE_CHECK_INTERVAL = "update-check-interval"; + public const string UPDATE_CHECK_NEW_VERSION = "update-check-latest"; + public const string UNACKED_ERROR = "unacked-error"; + public const string UNACKED_WARNING = "unacked-warning"; + public const string SERVER_LISTEN_INTERFACE = "server-listen-interface"; + public const string SERVER_SSL_CERTIFICATE = "server-ssl-certificate"; + public const string HAS_FIXED_INVALID_BACKUPID = "has-fixed-invalid-backup-id"; + public const string UPDATE_CHANNEL = "update-channel"; public const string USAGE_REPORTER_LEVEL = "usage-reporter-level"; public const string HAS_ASKED_FOR_PASSWORD_PROTECTION = "has-asked-for-password-protection"; - public const string DISABLE_TRAY_ICON_LOGIN = "disable-tray-icon-login"; - public const string SERVER_ALLOWED_HOSTNAMES = "allowed-hostnames"; - } - - private readonly Dictionary settings; - private readonly Connection databaseConnection; - private Library.AutoUpdater.UpdateInfo m_latestUpdate; - - internal ServerSettings(Connection con) - { - settings = new Dictionary(); - databaseConnection = con; - ReloadSettings(); - } - - public void ReloadSettings() - { - lock(databaseConnection.m_lock) - { - settings.Clear(); - foreach(var n in typeof(CONST).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Static).Select(x => (string)x.GetValue(null))) - settings[n] = null; - foreach(var n in databaseConnection.GetSettings(Connection.SERVER_SETTINGS_ID)) - settings[n.Name] = n.Value; - } - } - - public void UpdateSettings(Dictionary newsettings, bool clearExisting) - { - if (newsettings == null) - throw new ArgumentNullException(); - - lock(databaseConnection.m_lock) - { - m_latestUpdate = null; - if (clearExisting) - settings.Clear(); - - foreach(var k in newsettings) - if (!clearExisting && newsettings[k.Key] == null && k.Key.StartsWith("--", StringComparison.Ordinal)) - settings.Remove(k.Key); - else - settings[k.Key] = newsettings[k.Key]; - - } - - SaveSettings(); - - if (newsettings.Keys.Contains(CONST.SERVER_PASSPHRASE)) - GenerateWebserverPasswordTrayIcon(); - } - - private void SaveSettings() - { - databaseConnection.SetSettings( - from n in settings - select (Duplicati.Server.Serialization.Interface.ISetting)new Setting() { - Filter = "", - Name = n.Key, - Value = n.Value - }, Database.Connection.SERVER_SETTINGS_ID); - - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - - // In case the usage reporter is enabled or disabled, refresh now - Program.StartOrStopUsageReporter(); - // If throttle options were changed, update now - Program.UpdateThrottleSpeeds(); - } - - public string StartupDelayDuration - { - get - { - return settings[CONST.STARTUP_DELAY]; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.STARTUP_DELAY] = value; - SaveSettings(); - } - } - - public System.Threading.ThreadPriority? ThreadPriorityOverride - { - get - { - var tp = settings[CONST.THREAD_PRIORITY]; - if (string.IsNullOrEmpty(tp)) - return null; - - System.Threading.ThreadPriority r; - if (Enum.TryParse(tp, true, out r)) - return r; - - return null; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.THREAD_PRIORITY] = value.HasValue ? Enum.GetName(typeof(System.Threading.ThreadPriority), value.Value) : null; - } - } - - public string DownloadSpeedLimit - { - get - { - return settings[CONST.DOWNLOAD_SPEED_LIMIT]; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.DOWNLOAD_SPEED_LIMIT] = value; - SaveSettings(); - } - } - - public string UploadSpeedLimit - { - get - { - return settings[CONST.UPLOAD_SPEED_LIMIT]; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.UPLOAD_SPEED_LIMIT] = value; - SaveSettings(); - } - } - - public bool IsFirstRun - { - get - { - return Duplicati.Library.Utility.Utility.ParseBoolOption(settings, CONST.IS_FIRST_RUN); - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.IS_FIRST_RUN] = value.ToString(); - SaveSettings(); - } + public const string DISABLE_TRAY_ICON_LOGIN = "disable-tray-icon-login"; + public const string SERVER_ALLOWED_HOSTNAMES = "allowed-hostnames"; + } + + private readonly Dictionary settings; + private readonly Connection databaseConnection; + private Library.AutoUpdater.UpdateInfo m_latestUpdate; + + internal ServerSettings(Connection con) + { + settings = new Dictionary(); + databaseConnection = con; + ReloadSettings(); + } + + public void ReloadSettings() + { + lock(databaseConnection.m_lock) + { + settings.Clear(); + foreach(var n in typeof(CONST).GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Static).Select(x => (string)x.GetValue(null))) + settings[n] = null; + foreach(var n in databaseConnection.GetSettings(Connection.SERVER_SETTINGS_ID)) + settings[n.Name] = n.Value; + } + } + + public void UpdateSettings(Dictionary newsettings, bool clearExisting) + { + if (newsettings == null) + throw new ArgumentNullException(); + + lock(databaseConnection.m_lock) + { + m_latestUpdate = null; + if (clearExisting) + settings.Clear(); + + foreach(var k in newsettings) + if (!clearExisting && newsettings[k.Key] == null && k.Key.StartsWith("--", StringComparison.Ordinal)) + settings.Remove(k.Key); + else + settings[k.Key] = newsettings[k.Key]; + + } + + SaveSettings(); + + if (newsettings.Keys.Contains(CONST.SERVER_PASSPHRASE)) + GenerateWebserverPasswordTrayIcon(); + } + + private void SaveSettings() + { + databaseConnection.SetSettings( + from n in settings + select (Duplicati.Server.Serialization.Interface.ISetting)new Setting() { + Filter = "", + Name = n.Key, + Value = n.Value + }, Database.Connection.SERVER_SETTINGS_ID); + + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + // In case the usage reporter is enabled or disabled, refresh now + FIXMEGlobal.StartOrStopUsageReporter(); + // If throttle options were changed, update now + FIXMEGlobal.UpdateThrottleSpeeds(); + } + + public string StartupDelayDuration + { + get + { + return settings[CONST.STARTUP_DELAY]; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.STARTUP_DELAY] = value; + SaveSettings(); + } + } + + public System.Threading.ThreadPriority? ThreadPriorityOverride + { + get + { + var tp = settings[CONST.THREAD_PRIORITY]; + if (string.IsNullOrEmpty(tp)) + return null; + + System.Threading.ThreadPriority r; + if (Enum.TryParse(tp, true, out r)) + return r; + + return null; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.THREAD_PRIORITY] = value.HasValue ? Enum.GetName(typeof(System.Threading.ThreadPriority), value.Value) : null; + } + } + + public string DownloadSpeedLimit + { + get + { + return settings[CONST.DOWNLOAD_SPEED_LIMIT]; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.DOWNLOAD_SPEED_LIMIT] = value; + SaveSettings(); + } + } + + public string UploadSpeedLimit + { + get + { + return settings[CONST.UPLOAD_SPEED_LIMIT]; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.UPLOAD_SPEED_LIMIT] = value; + SaveSettings(); + } + } + + public bool IsFirstRun + { + get + { + return Duplicati.Library.Utility.Utility.ParseBoolOption(settings, CONST.IS_FIRST_RUN); + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.IS_FIRST_RUN] = value.ToString(); + SaveSettings(); + } } public bool HasAskedForPasswordProtection { get - { - return Duplicati.Library.Utility.Utility.ParseBoolOption(settings, CONST.HAS_ASKED_FOR_PASSWORD_PROTECTION); + { + return Duplicati.Library.Utility.Utility.ParseBoolOption(settings, CONST.HAS_ASKED_FOR_PASSWORD_PROTECTION); } set { @@ -212,352 +213,352 @@ namespace Duplicati.Server.Database } } - public bool UnackedError - { - get - { - return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.UNACKED_ERROR], false); - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.UNACKED_ERROR] = value.ToString(); - SaveSettings(); - } - } - - public bool UnackedWarning - { - get - { - return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.UNACKED_WARNING], false); - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.UNACKED_WARNING] = value.ToString(); - SaveSettings(); - } - } - - public bool ServerPortChanged - { - get - { - return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.SERVER_PORT_CHANGED], false); - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.SERVER_PORT_CHANGED] = value.ToString(); - SaveSettings(); - } - } - - public bool DisableTrayIconLogin - { - get - { - return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.DISABLE_TRAY_ICON_LOGIN], false); - } - set - { - lock (databaseConnection.m_lock) - settings[CONST.DISABLE_TRAY_ICON_LOGIN] = value.ToString(); - SaveSettings(); - } - } - - public int LastWebserverPort - { - get - { - var tp = settings[CONST.LAST_WEBSERVER_PORT]; - int p; - if (string.IsNullOrEmpty(tp) || !int.TryParse(tp, out p)) - return -1; - - return p; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.LAST_WEBSERVER_PORT] = value.ToString(); - SaveSettings(); - } - } - - public string WebserverPassword - { - get - { - return settings[CONST.SERVER_PASSPHRASE]; - } - } - - public string WebserverPasswordSalt - { - get - { - return settings[CONST.SERVER_PASSPHRASE_SALT]; - } - } - - public void SetWebserverPassword(string password) - { - if (string.IsNullOrWhiteSpace(password)) - { - lock(databaseConnection.m_lock) - { - settings[CONST.SERVER_PASSPHRASE] = ""; - settings[CONST.SERVER_PASSPHRASE_SALT] = ""; - } - } - else - { - var prng = RandomNumberGenerator.Create(); - var buf = new byte[32]; - prng.GetBytes(buf); - var salt = Convert.ToBase64String(buf); - - var sha256 = System.Security.Cryptography.SHA256.Create(); - var str = System.Text.Encoding.UTF8.GetBytes(password); - - sha256.TransformBlock(str, 0, str.Length, str, 0); - sha256.TransformFinalBlock(buf, 0, buf.Length); - var pwd = Convert.ToBase64String(sha256.Hash); - - lock(databaseConnection.m_lock) - { - settings[CONST.SERVER_PASSPHRASE] = pwd; - settings[CONST.SERVER_PASSPHRASE_SALT] = salt; - } - } - - SaveSettings(); - } - - public void SetAllowedHostnames(string allowedHostnames) - { - lock (databaseConnection.m_lock) - settings[CONST.SERVER_ALLOWED_HOSTNAMES] = allowedHostnames; - - SaveSettings(); - } - - public string WebserverPasswordTrayIcon => settings[CONST.SERVER_PASSPHRASETRAYICON]; - - public string WebserverPasswordTrayIconHash => settings[CONST.SERVER_PASSPHRASETRAYICONHASH]; - - public string AllowedHostnames => settings[CONST.SERVER_ALLOWED_HOSTNAMES]; - - public void GenerateWebserverPasswordTrayIcon() - { - var password = ""; - var pwd = ""; - - if (!string.IsNullOrEmpty(settings[CONST.SERVER_PASSPHRASE])) - { - password = Guid.NewGuid().ToString(); - var buf = Convert.FromBase64String(settings[CONST.SERVER_PASSPHRASE_SALT]); - - var sha256 = System.Security.Cryptography.SHA256.Create(); - var str = System.Text.Encoding.UTF8.GetBytes(password); - - sha256.TransformBlock(str, 0, str.Length, str, 0); - sha256.TransformFinalBlock(buf, 0, buf.Length); - pwd = Convert.ToBase64String(sha256.Hash); - } - - lock (databaseConnection.m_lock) - { - settings[CONST.SERVER_PASSPHRASETRAYICON] = password; - settings[CONST.SERVER_PASSPHRASETRAYICONHASH] = pwd; - } - - SaveSettings(); - } - - public DateTime LastUpdateCheck - { - get - { - long t; - if (long.TryParse(settings[CONST.UPDATE_CHECK_LAST], out t)) - return new DateTime(t, DateTimeKind.Utc); - else - return new DateTime(0, DateTimeKind.Utc); - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.UPDATE_CHECK_LAST] = value.ToUniversalTime().Ticks.ToString(); - SaveSettings(); - } - } - - public string UpdateCheckInterval - { - get - { - var tp = settings[CONST.UPDATE_CHECK_INTERVAL]; - if (string.IsNullOrWhiteSpace(tp)) - tp = "1W"; - - return tp; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.UPDATE_CHECK_INTERVAL] = value; - SaveSettings(); - Program.UpdatePoller.Reschedule(); - } - } - - public DateTime NextUpdateCheck - { - get - { - try - { - return Duplicati.Library.Utility.Timeparser.ParseTimeInterval(UpdateCheckInterval, LastUpdateCheck); - } - catch - { - return LastUpdateCheck.AddDays(7); - } - } - } - - public Library.AutoUpdater.UpdateInfo UpdatedVersion - { - get - { - if (string.IsNullOrWhiteSpace(settings[CONST.UPDATE_CHECK_NEW_VERSION])) - return null; - - try - { - if (m_latestUpdate != null) - return m_latestUpdate; - - using(var tr = new System.IO.StringReader(settings[CONST.UPDATE_CHECK_NEW_VERSION])) - return m_latestUpdate = Server.Serialization.Serializer.Deserialize(tr); - } - catch - { - } - - return null; - } - set - { - string result = null; - if (value != null) - { - var sb = new System.Text.StringBuilder(); - using(var tw = new System.IO.StringWriter(sb)) - Server.Serialization.Serializer.SerializeJson(tw, value); - - result = sb.ToString(); - } - - m_latestUpdate = value; - lock(databaseConnection.m_lock) - settings[CONST.UPDATE_CHECK_NEW_VERSION] = result; - - SaveSettings(); - } - } - - public string ServerListenInterface - { - get - { - return settings[CONST.SERVER_LISTEN_INTERFACE]; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.SERVER_LISTEN_INTERFACE] = value; - SaveSettings(); - } - } - - public X509Certificate2 ServerSSLCertificate - { - get - { - if (String.IsNullOrEmpty(settings[CONST.SERVER_SSL_CERTIFICATE])) - return null; - - if (Platform.IsClientWindows) - return new X509Certificate2(Convert.FromBase64String(settings[CONST.SERVER_SSL_CERTIFICATE])); - else - return new X509Certificate2(Convert.FromBase64String(settings[CONST.SERVER_SSL_CERTIFICATE]), ""); - } - set - { - if (value == null) - { - lock (databaseConnection.m_lock) - settings[CONST.SERVER_SSL_CERTIFICATE] = String.Empty; - } - else - { - if (Platform.IsClientWindows) - lock (databaseConnection.m_lock) - settings[CONST.SERVER_SSL_CERTIFICATE] = Convert.ToBase64String(value.Export(X509ContentType.Pkcs12)); - else - lock (databaseConnection.m_lock) - settings[CONST.SERVER_SSL_CERTIFICATE] = Convert.ToBase64String(value.Export(X509ContentType.Pkcs12, "")); - } - SaveSettings(); - } - } - - public bool FixedInvalidBackupId - { - get - { - return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.HAS_FIXED_INVALID_BACKUPID], false); - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.HAS_FIXED_INVALID_BACKUPID] = value.ToString(); - SaveSettings(); - } - } - - public string UpdateChannel - { - get - { - return settings[CONST.UPDATE_CHANNEL]; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.UPDATE_CHANNEL] = value; - SaveSettings(); - } - } - - public string UsageReporterLevel - { - get - { - return settings[CONST.USAGE_REPORTER_LEVEL]; - } - set - { - lock(databaseConnection.m_lock) - settings[CONST.USAGE_REPORTER_LEVEL] = value; - SaveSettings(); - } - } - } -} - + public bool UnackedError + { + get + { + return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.UNACKED_ERROR], false); + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.UNACKED_ERROR] = value.ToString(); + SaveSettings(); + } + } + + public bool UnackedWarning + { + get + { + return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.UNACKED_WARNING], false); + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.UNACKED_WARNING] = value.ToString(); + SaveSettings(); + } + } + + public bool ServerPortChanged + { + get + { + return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.SERVER_PORT_CHANGED], false); + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.SERVER_PORT_CHANGED] = value.ToString(); + SaveSettings(); + } + } + + public bool DisableTrayIconLogin + { + get + { + return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.DISABLE_TRAY_ICON_LOGIN], false); + } + set + { + lock (databaseConnection.m_lock) + settings[CONST.DISABLE_TRAY_ICON_LOGIN] = value.ToString(); + SaveSettings(); + } + } + + public int LastWebserverPort + { + get + { + var tp = settings[CONST.LAST_WEBSERVER_PORT]; + int p; + if (string.IsNullOrEmpty(tp) || !int.TryParse(tp, out p)) + return -1; + + return p; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.LAST_WEBSERVER_PORT] = value.ToString(); + SaveSettings(); + } + } + + public string WebserverPassword + { + get + { + return settings[CONST.SERVER_PASSPHRASE]; + } + } + + public string WebserverPasswordSalt + { + get + { + return settings[CONST.SERVER_PASSPHRASE_SALT]; + } + } + + public void SetWebserverPassword(string password) + { + if (string.IsNullOrWhiteSpace(password)) + { + lock(databaseConnection.m_lock) + { + settings[CONST.SERVER_PASSPHRASE] = ""; + settings[CONST.SERVER_PASSPHRASE_SALT] = ""; + } + } + else + { + var prng = RandomNumberGenerator.Create(); + var buf = new byte[32]; + prng.GetBytes(buf); + var salt = Convert.ToBase64String(buf); + + var sha256 = System.Security.Cryptography.SHA256.Create(); + var str = System.Text.Encoding.UTF8.GetBytes(password); + + sha256.TransformBlock(str, 0, str.Length, str, 0); + sha256.TransformFinalBlock(buf, 0, buf.Length); + var pwd = Convert.ToBase64String(sha256.Hash); + + lock(databaseConnection.m_lock) + { + settings[CONST.SERVER_PASSPHRASE] = pwd; + settings[CONST.SERVER_PASSPHRASE_SALT] = salt; + } + } + + SaveSettings(); + } + + public void SetAllowedHostnames(string allowedHostnames) + { + lock (databaseConnection.m_lock) + settings[CONST.SERVER_ALLOWED_HOSTNAMES] = allowedHostnames; + + SaveSettings(); + } + + public string WebserverPasswordTrayIcon => settings[CONST.SERVER_PASSPHRASETRAYICON]; + + public string WebserverPasswordTrayIconHash => settings[CONST.SERVER_PASSPHRASETRAYICONHASH]; + + public string AllowedHostnames => settings[CONST.SERVER_ALLOWED_HOSTNAMES]; + + public void GenerateWebserverPasswordTrayIcon() + { + var password = ""; + var pwd = ""; + + if (!string.IsNullOrEmpty(settings[CONST.SERVER_PASSPHRASE])) + { + password = Guid.NewGuid().ToString(); + var buf = Convert.FromBase64String(settings[CONST.SERVER_PASSPHRASE_SALT]); + + var sha256 = System.Security.Cryptography.SHA256.Create(); + var str = System.Text.Encoding.UTF8.GetBytes(password); + + sha256.TransformBlock(str, 0, str.Length, str, 0); + sha256.TransformFinalBlock(buf, 0, buf.Length); + pwd = Convert.ToBase64String(sha256.Hash); + } + + lock (databaseConnection.m_lock) + { + settings[CONST.SERVER_PASSPHRASETRAYICON] = password; + settings[CONST.SERVER_PASSPHRASETRAYICONHASH] = pwd; + } + + SaveSettings(); + } + + public DateTime LastUpdateCheck + { + get + { + long t; + if (long.TryParse(settings[CONST.UPDATE_CHECK_LAST], out t)) + return new DateTime(t, DateTimeKind.Utc); + else + return new DateTime(0, DateTimeKind.Utc); + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.UPDATE_CHECK_LAST] = value.ToUniversalTime().Ticks.ToString(); + SaveSettings(); + } + } + + public string UpdateCheckInterval + { + get + { + var tp = settings[CONST.UPDATE_CHECK_INTERVAL]; + if (string.IsNullOrWhiteSpace(tp)) + tp = "1W"; + + return tp; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.UPDATE_CHECK_INTERVAL] = value; + SaveSettings(); + FIXMEGlobal.UpdatePoller.Reschedule(); + } + } + + public DateTime NextUpdateCheck + { + get + { + try + { + return Duplicati.Library.Utility.Timeparser.ParseTimeInterval(UpdateCheckInterval, LastUpdateCheck); + } + catch + { + return LastUpdateCheck.AddDays(7); + } + } + } + + public Library.AutoUpdater.UpdateInfo UpdatedVersion + { + get + { + if (string.IsNullOrWhiteSpace(settings[CONST.UPDATE_CHECK_NEW_VERSION])) + return null; + + try + { + if (m_latestUpdate != null) + return m_latestUpdate; + + using(var tr = new System.IO.StringReader(settings[CONST.UPDATE_CHECK_NEW_VERSION])) + return m_latestUpdate = Server.Serialization.Serializer.Deserialize(tr); + } + catch + { + } + + return null; + } + set + { + string result = null; + if (value != null) + { + var sb = new System.Text.StringBuilder(); + using(var tw = new System.IO.StringWriter(sb)) + Server.Serialization.Serializer.SerializeJson(tw, value); + + result = sb.ToString(); + } + + m_latestUpdate = value; + lock(databaseConnection.m_lock) + settings[CONST.UPDATE_CHECK_NEW_VERSION] = result; + + SaveSettings(); + } + } + + public string ServerListenInterface + { + get + { + return settings[CONST.SERVER_LISTEN_INTERFACE]; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.SERVER_LISTEN_INTERFACE] = value; + SaveSettings(); + } + } + + public X509Certificate2 ServerSSLCertificate + { + get + { + if (String.IsNullOrEmpty(settings[CONST.SERVER_SSL_CERTIFICATE])) + return null; + + if (Platform.IsClientWindows) + return new X509Certificate2(Convert.FromBase64String(settings[CONST.SERVER_SSL_CERTIFICATE])); + else + return new X509Certificate2(Convert.FromBase64String(settings[CONST.SERVER_SSL_CERTIFICATE]), ""); + } + set + { + if (value == null) + { + lock (databaseConnection.m_lock) + settings[CONST.SERVER_SSL_CERTIFICATE] = String.Empty; + } + else + { + if (Platform.IsClientWindows) + lock (databaseConnection.m_lock) + settings[CONST.SERVER_SSL_CERTIFICATE] = Convert.ToBase64String(value.Export(X509ContentType.Pkcs12)); + else + lock (databaseConnection.m_lock) + settings[CONST.SERVER_SSL_CERTIFICATE] = Convert.ToBase64String(value.Export(X509ContentType.Pkcs12, "")); + } + SaveSettings(); + } + } + + public bool FixedInvalidBackupId + { + get + { + return Duplicati.Library.Utility.Utility.ParseBool(settings[CONST.HAS_FIXED_INVALID_BACKUPID], false); + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.HAS_FIXED_INVALID_BACKUPID] = value.ToString(); + SaveSettings(); + } + } + + public string UpdateChannel + { + get + { + return settings[CONST.UPDATE_CHANNEL]; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.UPDATE_CHANNEL] = value; + SaveSettings(); + } + } + + public string UsageReporterLevel + { + get + { + return settings[CONST.USAGE_REPORTER_LEVEL]; + } + set + { + lock(databaseConnection.m_lock) + settings[CONST.USAGE_REPORTER_LEVEL] = value; + SaveSettings(); + } + } + } +} + diff --git a/Duplicati/Server/Database/Setting.cs b/Duplicati.Library.RestAPI/Database/Setting.cs similarity index 97% rename from Duplicati/Server/Database/Setting.cs rename to Duplicati.Library.RestAPI/Database/Setting.cs index 84150bf1a..0fe096389 100644 --- a/Duplicati/Server/Database/Setting.cs +++ b/Duplicati.Library.RestAPI/Database/Setting.cs @@ -1,26 +1,26 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.Database -{ - public class Setting : Duplicati.Server.Serialization.Implementations.Setting - { - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; + +namespace Duplicati.Server.Database +{ + public class Setting : Duplicati.Server.Serialization.Implementations.Setting + { + } +} + diff --git a/Duplicati/Server/Database/TempFile.cs b/Duplicati.Library.RestAPI/Database/TempFile.cs similarity index 97% rename from Duplicati/Server/Database/TempFile.cs rename to Duplicati.Library.RestAPI/Database/TempFile.cs index b652a2920..ecbf2cfe8 100644 --- a/Duplicati/Server/Database/TempFile.cs +++ b/Duplicati.Library.RestAPI/Database/TempFile.cs @@ -1,31 +1,31 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.Database -{ - public class TempFile - { - public long ID { get; set; } - public string Origin { get; set; } - public string Path { get; set; } - public DateTime Timestamp { get; set; } - public DateTime Expires { get; set; } - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; + +namespace Duplicati.Server.Database +{ + public class TempFile + { + public long ID { get; set; } + public string Origin { get; set; } + public string Path { get; set; } + public DateTime Timestamp { get; set; } + public DateTime Expires { get; set; } + } +} + diff --git a/Duplicati.Library.RestAPI/Duplicati.Library.RestAPI.csproj b/Duplicati.Library.RestAPI/Duplicati.Library.RestAPI.csproj new file mode 100644 index 000000000..f350e3e34 --- /dev/null +++ b/Duplicati.Library.RestAPI/Duplicati.Library.RestAPI.csproj @@ -0,0 +1,35 @@ + + + + net6.0 + + + + + + + + + + + + + + + + + ..\thirdparty\HttpServer\HttpServer.dll + + + + + + + + + + + + + + diff --git a/Duplicati/Server/EventPollNotify.cs b/Duplicati.Library.RestAPI/EventPollNotify.cs similarity index 97% rename from Duplicati/Server/EventPollNotify.cs rename to Duplicati.Library.RestAPI/EventPollNotify.cs index 015e05af5..777dc4a1e 100644 --- a/Duplicati/Server/EventPollNotify.cs +++ b/Duplicati.Library.RestAPI/EventPollNotify.cs @@ -1,77 +1,77 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Duplicati.Server -{ - /// - /// This class handles synchronized waiting for events - /// - public class EventPollNotify - { - /// - /// The lock that grants exclusive access to control structures - /// - private readonly object m_lock = new object(); - /// - /// The current eventID - /// - private long m_eventNo = 0; - /// - /// The list of subscribed waiting threads - /// - private readonly Queue m_waitQueue = new Queue(); - - /// - /// An eventhandler for subscribing to event updates without blocking - /// - public event EventHandler NewEvent; - - /// - /// Gets the current event ID - /// - public long EventNo { get { return m_eventNo; } } - - /// - /// Call to wait for an event that is newer than the current known event - /// - /// The last known event id - /// The number of milliseconds to block - /// The current event id - public long Wait(long eventId, int milliseconds) - { - System.Threading.ManualResetEvent mre; - lock (m_lock) - { - //If a newer event has already occured, return immediately - if (eventId != m_eventNo) - return m_eventNo; - - //Otherwise register this thread as waiting - mre = new System.Threading.ManualResetEvent(false); - m_waitQueue.Enqueue(mre); - } - - //Wait until we are signalled or the time has elapsed - mre.WaitOne(milliseconds, false); - return m_eventNo; - } - - /// - /// Signals that an event has occurred and notifies all waiting threads - /// - public void SignalNewEvent() - { - lock (m_lock) - { - m_eventNo++; - while (m_waitQueue.Count > 0) - m_waitQueue.Dequeue().Set(); - } - - if (NewEvent != null) - NewEvent(this, null); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Duplicati.Server +{ + /// + /// This class handles synchronized waiting for events + /// + public class EventPollNotify + { + /// + /// The lock that grants exclusive access to control structures + /// + private readonly object m_lock = new object(); + /// + /// The current eventID + /// + private long m_eventNo = 0; + /// + /// The list of subscribed waiting threads + /// + private readonly Queue m_waitQueue = new Queue(); + + /// + /// An eventhandler for subscribing to event updates without blocking + /// + public event EventHandler NewEvent; + + /// + /// Gets the current event ID + /// + public long EventNo { get { return m_eventNo; } } + + /// + /// Call to wait for an event that is newer than the current known event + /// + /// The last known event id + /// The number of milliseconds to block + /// The current event id + public long Wait(long eventId, int milliseconds) + { + System.Threading.ManualResetEvent mre; + lock (m_lock) + { + //If a newer event has already occured, return immediately + if (eventId != m_eventNo) + return m_eventNo; + + //Otherwise register this thread as waiting + mre = new System.Threading.ManualResetEvent(false); + m_waitQueue.Enqueue(mre); + } + + //Wait until we are signalled or the time has elapsed + mre.WaitOne(milliseconds, false); + return m_eventNo; + } + + /// + /// Signals that an event has occurred and notifies all waiting threads + /// + public void SignalNewEvent() + { + lock (m_lock) + { + m_eventNo++; + while (m_waitQueue.Count > 0) + m_waitQueue.Dequeue().Set(); + } + + if (NewEvent != null) + NewEvent(this, null); + } + } +} diff --git a/Duplicati.Library.RestAPI/FIXMEGlobal.cs b/Duplicati.Library.RestAPI/FIXMEGlobal.cs new file mode 100644 index 000000000..2a8fc3148 --- /dev/null +++ b/Duplicati.Library.RestAPI/FIXMEGlobal.cs @@ -0,0 +1,97 @@ + +using Duplicati.Server; +using System; +using System.Collections.Generic; + +namespace Duplicati.Library.RestAPI +{ + /** + * In the absense of dependancy injection, there is a significant amount of variables exposed through Program as globals. + * This causes a problem decoupling classes and leads to circular dependancies. + */ + public static class FIXMEGlobal + { + + /// + /// This is the only access to the database + /// + public static Server.Database.Connection DataConnection; + + /// + /// The controller interface for pause/resume and throttle options + /// + public static LiveControls LiveControl; + + /// + /// A delegate method for creating a copy of the current progress state + /// + public static Func GenerateProgressState; + + /// + /// The status event signaler, used to control long polling of status updates + /// + public static readonly EventPollNotify StatusEventNotifyer = new EventPollNotify(); + + /// + /// This is the working thread + /// + public static Duplicati.Library.Utility.WorkerThread WorkThread; + + public static Func PeekLastDataUpdateID; + public static Func PeekLastNotificationUpdateID; + + public static Action IncrementLastDataUpdateID; + + public static Action IncrementLastNotificationUpdateID; + + public static Action StartOrStopUsageReporter; + + public static Action UpdateThrottleSpeeds; + + /// + /// Gets the folder where Duplicati data is stored + /// + public static string DataFolder; + + /// + /// This is the scheduling thread + /// + public static Scheduler Scheduler; + + /// + /// The log redirect handler + /// + public static readonly LogWriteHandler LogHandler = new LogWriteHandler(); + + public static Func, Server.Database.Connection> GetDatabaseConnection; + + /// + /// The update poll thread. + /// + public static UpdatePollThread UpdatePoller; + + + /// + /// Used to check the origin of the web server (e.g. Tray icon or a stand alone Server) + /// + public static string Origin = "Server"; + + + /// + /// The application exit event + /// + public static System.Threading.ManualResetEvent ApplicationExitEvent; + + + /// + /// List of completed task results + /// + public static readonly List> TaskResultCache = new List>(); + + + /// + /// This is the lock to be used before manipulating the shared resources + /// + public static readonly object MainLock = new object(); + } +} diff --git a/Duplicati/Server/LiveControls.cs b/Duplicati.Library.RestAPI/LiveControls.cs similarity index 96% rename from Duplicati/Server/LiveControls.cs rename to Duplicati.Library.RestAPI/LiveControls.cs index bc261f57c..1a51636a3 100644 --- a/Duplicati/Server/LiveControls.cs +++ b/Duplicati.Library.RestAPI/LiveControls.cs @@ -1,403 +1,404 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Collections.Generic; -using System.Text; +#region Disclaimer / License +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +#endregion +using System; +using System.Collections.Generic; +using System.Text; using Duplicati.Library.Common; +using Duplicati.Library.RestAPI; -namespace Duplicati.Server -{ - /// - /// This class keeps track of the users modifications regarding - /// throttling and pause/resume - /// - public class LiveControls - { - /// - /// The tag used for logging - /// - private static readonly string LOGTAG = Duplicati.Library.Logging.Log.LogTagFromType(); - - /// - /// An event that is activated when the pause state changes - /// - public event EventHandler StateChanged; - - /// - /// An event that is activated when the thread priority changes - /// - public event EventHandler ThreadPriorityChanged; - - /// - /// An event that is activated when the throttle speed changes - /// - public event EventHandler ThrottleSpeedChanged; - - /// - /// The possible states for the live control - /// - public enum LiveControlState - { - /// - /// Indicates that the backups are running - /// - Running, - /// - /// Indicates that the backups are currently suspended - /// - Paused - } - - /// - /// The current control state - /// - private LiveControlState m_state; - - /// - /// A value that indicates if the current pause state is caused by being suspended - /// - private bool m_pausedForSuspend = false; - - /// - /// The time to pause for, used to ensure that a user set pause can override the suspend pause - /// - private DateTime m_suspendMinimumPause = new DateTime(0); - - /// - /// Gets the current state for the control - /// - public LiveControlState State { get { return m_state; } } - - /// - /// The internal variable that tracks the the priority - /// - private System.Threading.ThreadPriority? m_priority; - - /// - /// The internal variable that tracks the upload limit - /// - private long? m_uploadLimit; - - /// - /// The internal variable that tracks the download limit - /// - private long? m_downloadLimit; - - /// - /// The object that ensures concurrent operations - /// - private readonly object m_lock = new object(); - - /// - /// Gets the current overridden thread priority - /// - public System.Threading.ThreadPriority? ThreadPriority - { - get { return m_priority; } - set - { - if (m_priority != value) - { - m_priority = value; - if (ThreadPriorityChanged != null) - ThreadPriorityChanged(this, null); - } - } - } - - /// - /// Gets the current upload limit in bps - /// - public long? UploadLimit - { - get { return m_uploadLimit; } - set - { - if (m_uploadLimit != value) - { - m_uploadLimit = value; - if (ThrottleSpeedChanged != null) - ThrottleSpeedChanged(this, null); - } - } - } - - /// - /// Gets the download limit in bps - /// - public long? DownloadLimit - { - get { return m_downloadLimit; } - set - { - if (m_downloadLimit != value) - { - m_downloadLimit = value; - if (ThrottleSpeedChanged != null) - ThrottleSpeedChanged(this, null); - } - } - } - - /// - /// The timer that is activated after a pause period. - /// - private readonly System.Threading.Timer m_waitTimer; - - /// - /// The time that the current pause is expected to expire - /// - private DateTime m_waitTimeExpiration = new DateTime(0); - - /// - /// Constructs a new instance of the LiveControl - /// - public LiveControls(Database.ServerSettings settings) - { - m_state = LiveControlState.Running; - m_waitTimer = new System.Threading.Timer(m_waitTimer_Tick, this, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); - - if (!string.IsNullOrEmpty(settings.StartupDelayDuration) && settings.StartupDelayDuration != "0") - { - long milliseconds = 0; - try { milliseconds = (long)Duplicati.Library.Utility.Timeparser.ParseTimeSpan(settings.StartupDelayDuration).TotalMilliseconds; } - catch {} - - if (milliseconds > 0) - { - m_waitTimeExpiration = DateTime.Now.AddMilliseconds(milliseconds); - m_waitTimer.Change(milliseconds, System.Threading.Timeout.Infinite); - m_state = LiveControlState.Paused; - } - } - - m_priority = settings.ThreadPriorityOverride; - if (!string.IsNullOrEmpty(settings.DownloadSpeedLimit)) - try - { - m_downloadLimit = Library.Utility.Sizeparser.ParseSize(settings.DownloadSpeedLimit, "kb"); - } - catch (Exception ex) - { - Library.Logging.Log.WriteErrorMessage(LOGTAG, "ParseDownloadLimitError", ex, "Failed to parse download limit: {0}", settings.DownloadSpeedLimit); - } - - if (!string.IsNullOrEmpty(settings.UploadSpeedLimit)) - try - { - m_uploadLimit = Library.Utility.Sizeparser.ParseSize(settings.UploadSpeedLimit, "kb"); - } - catch (Exception ex) - { - Library.Logging.Log.WriteErrorMessage(LOGTAG, "ParseUploadLimitError", ex, "Failed to parse upload limit: {0}", settings.UploadSpeedLimit); - } - - try - { - if (!Platform.IsClientPosix) - RegisterHibernateMonitor(); - } - catch { } - } - - /// - /// Event that occurs when the timeout duration is exceeded - /// - /// The sender of the event - private void m_waitTimer_Tick(object sender) - { - lock (m_lock) - Resume(); - } - - /// - /// Internal helper to reset the timeout timer - /// - /// The time to wait - private void ResetTimer(string timeout) - { - lock (m_lock) - if (!string.IsNullOrEmpty(timeout)) - { - long milliseconds = (long)Duplicati.Library.Utility.Timeparser.ParseTimeSpan(timeout).TotalMilliseconds; - m_waitTimeExpiration = DateTime.Now.AddMilliseconds(milliseconds); - m_waitTimer.Change(milliseconds, System.Threading.Timeout.Infinite); - } - else - { - m_waitTimeExpiration = new DateTime(0); - m_waitTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); - } - } - - /// - /// Internal helper to set the pause mode - /// - private void SetPauseMode() - { - lock (m_lock) - { - if (m_state == LiveControlState.Running) - { - m_state = LiveControlState.Paused; - if (StateChanged != null) - StateChanged(this, null); - } - } - } - - /// - /// Pauses the backups until resumed - /// - public void Pause() - { - lock(m_lock) - { - var fireEvent = m_waitTimeExpiration.Ticks != 0 && m_state == LiveControlState.Paused && StateChanged != null; - - ResetTimer(null); - - if (fireEvent) - StateChanged(this, null); - else - SetPauseMode(); - } - } - - /// - /// Resumes a backups to the running state - /// - public void Resume() - { - lock (m_lock) - { - if (m_state == LiveControlState.Paused) - { - //Make sure that the timer is cleared - ResetTimer(null); - - m_state = LiveControlState.Running; - if (StateChanged != null) - StateChanged(this, null); - } - } - } - - /// - /// Suspends the backups for a given period - /// - /// The duration to wait - public void Pause(string timeout) - { - Pause(Duplicati.Library.Utility.Timeparser.ParseTimeSpan(timeout)); - } - - /// - /// Suspends the backups for a given period - /// - /// The duration to wait - public void Pause(TimeSpan timeout) - { - lock (m_lock) - { - m_waitTimeExpiration = DateTime.Now.AddMilliseconds((long)timeout.TotalMilliseconds); - m_waitTimer.Change((long)timeout.TotalMilliseconds, System.Threading.Timeout.Infinite); - - //We change the time, so we issue a new event - if (m_state == LiveControlState.Paused && StateChanged != null) - StateChanged(this, null); - else - SetPauseMode(); - } - } - - /// - /// Gets the time the current pause is expected to end - /// - public DateTime EstimatedPauseEnd { get { return m_waitTimeExpiration; } } - - /// - /// Method for calling a Win32 API - /// - private void RegisterHibernateMonitor() - { - Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); - } - - /// - /// A monitor for detecting when the system hibernates or resumes - /// - /// Unused sender parameter - /// The event information - private void SystemEvents_PowerModeChanged(object sender, object _e) - { - Microsoft.Win32.PowerModeChangedEventArgs e = _e as Microsoft.Win32.PowerModeChangedEventArgs; - if (e == null) - return; - - if (e.Mode == Microsoft.Win32.PowerModes.Suspend) - { - //If we are running, register as being paused due to suspending - if (this.m_state == LiveControlState.Running) - { - this.SetPauseMode(); - m_pausedForSuspend = true; - m_suspendMinimumPause = new DateTime(0); - } - else - { - if (m_waitTimeExpiration.Ticks != 0) - { - m_pausedForSuspend = true; - m_suspendMinimumPause = this.EstimatedPauseEnd; - ResetTimer(null); - } - - } - } - else if (e.Mode == Microsoft.Win32.PowerModes.Resume) - { - //If we have been been paused due to suspending, we un-pause now - if (m_pausedForSuspend) - { - long delayTicks = (m_suspendMinimumPause - DateTime.Now).Ticks; - - var appset = Program.DataConnection.ApplicationSettings; - if (!string.IsNullOrEmpty(appset.StartupDelayDuration) && appset.StartupDelayDuration != "0") - try { delayTicks = Math.Max(delayTicks, Library.Utility.Timeparser.ParseTimeSpan(appset.StartupDelayDuration).Ticks); } - catch { } - - if (delayTicks > 0) - { - this.Pause(TimeSpan.FromTicks(delayTicks)); - } - else - { - this.Resume(); - } - } - - m_pausedForSuspend = false; - m_suspendMinimumPause = new DateTime(0); - } - } - - } -} +namespace Duplicati.Server +{ + /// + /// This class keeps track of the users modifications regarding + /// throttling and pause/resume + /// + public class LiveControls + { + /// + /// The tag used for logging + /// + private static readonly string LOGTAG = Duplicati.Library.Logging.Log.LogTagFromType(); + + /// + /// An event that is activated when the pause state changes + /// + public event EventHandler StateChanged; + + /// + /// An event that is activated when the thread priority changes + /// + public event EventHandler ThreadPriorityChanged; + + /// + /// An event that is activated when the throttle speed changes + /// + public event EventHandler ThrottleSpeedChanged; + + /// + /// The possible states for the live control + /// + public enum LiveControlState + { + /// + /// Indicates that the backups are running + /// + Running, + /// + /// Indicates that the backups are currently suspended + /// + Paused + } + + /// + /// The current control state + /// + private LiveControlState m_state; + + /// + /// A value that indicates if the current pause state is caused by being suspended + /// + private bool m_pausedForSuspend = false; + + /// + /// The time to pause for, used to ensure that a user set pause can override the suspend pause + /// + private DateTime m_suspendMinimumPause = new DateTime(0); + + /// + /// Gets the current state for the control + /// + public LiveControlState State { get { return m_state; } } + + /// + /// The internal variable that tracks the the priority + /// + private System.Threading.ThreadPriority? m_priority; + + /// + /// The internal variable that tracks the upload limit + /// + private long? m_uploadLimit; + + /// + /// The internal variable that tracks the download limit + /// + private long? m_downloadLimit; + + /// + /// The object that ensures concurrent operations + /// + private readonly object m_lock = new object(); + + /// + /// Gets the current overridden thread priority + /// + public System.Threading.ThreadPriority? ThreadPriority + { + get { return m_priority; } + set + { + if (m_priority != value) + { + m_priority = value; + if (ThreadPriorityChanged != null) + ThreadPriorityChanged(this, null); + } + } + } + + /// + /// Gets the current upload limit in bps + /// + public long? UploadLimit + { + get { return m_uploadLimit; } + set + { + if (m_uploadLimit != value) + { + m_uploadLimit = value; + if (ThrottleSpeedChanged != null) + ThrottleSpeedChanged(this, null); + } + } + } + + /// + /// Gets the download limit in bps + /// + public long? DownloadLimit + { + get { return m_downloadLimit; } + set + { + if (m_downloadLimit != value) + { + m_downloadLimit = value; + if (ThrottleSpeedChanged != null) + ThrottleSpeedChanged(this, null); + } + } + } + + /// + /// The timer that is activated after a pause period. + /// + private readonly System.Threading.Timer m_waitTimer; + + /// + /// The time that the current pause is expected to expire + /// + private DateTime m_waitTimeExpiration = new DateTime(0); + + /// + /// Constructs a new instance of the LiveControl + /// + public LiveControls(Database.ServerSettings settings) + { + m_state = LiveControlState.Running; + m_waitTimer = new System.Threading.Timer(m_waitTimer_Tick, this, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); + + if (!string.IsNullOrEmpty(settings.StartupDelayDuration) && settings.StartupDelayDuration != "0") + { + long milliseconds = 0; + try { milliseconds = (long)Duplicati.Library.Utility.Timeparser.ParseTimeSpan(settings.StartupDelayDuration).TotalMilliseconds; } + catch {} + + if (milliseconds > 0) + { + m_waitTimeExpiration = DateTime.Now.AddMilliseconds(milliseconds); + m_waitTimer.Change(milliseconds, System.Threading.Timeout.Infinite); + m_state = LiveControlState.Paused; + } + } + + m_priority = settings.ThreadPriorityOverride; + if (!string.IsNullOrEmpty(settings.DownloadSpeedLimit)) + try + { + m_downloadLimit = Library.Utility.Sizeparser.ParseSize(settings.DownloadSpeedLimit, "kb"); + } + catch (Exception ex) + { + Library.Logging.Log.WriteErrorMessage(LOGTAG, "ParseDownloadLimitError", ex, "Failed to parse download limit: {0}", settings.DownloadSpeedLimit); + } + + if (!string.IsNullOrEmpty(settings.UploadSpeedLimit)) + try + { + m_uploadLimit = Library.Utility.Sizeparser.ParseSize(settings.UploadSpeedLimit, "kb"); + } + catch (Exception ex) + { + Library.Logging.Log.WriteErrorMessage(LOGTAG, "ParseUploadLimitError", ex, "Failed to parse upload limit: {0}", settings.UploadSpeedLimit); + } + + try + { + if (!Platform.IsClientPosix) + RegisterHibernateMonitor(); + } + catch { } + } + + /// + /// Event that occurs when the timeout duration is exceeded + /// + /// The sender of the event + private void m_waitTimer_Tick(object sender) + { + lock (m_lock) + Resume(); + } + + /// + /// Internal helper to reset the timeout timer + /// + /// The time to wait + private void ResetTimer(string timeout) + { + lock (m_lock) + if (!string.IsNullOrEmpty(timeout)) + { + long milliseconds = (long)Duplicati.Library.Utility.Timeparser.ParseTimeSpan(timeout).TotalMilliseconds; + m_waitTimeExpiration = DateTime.Now.AddMilliseconds(milliseconds); + m_waitTimer.Change(milliseconds, System.Threading.Timeout.Infinite); + } + else + { + m_waitTimeExpiration = new DateTime(0); + m_waitTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); + } + } + + /// + /// Internal helper to set the pause mode + /// + private void SetPauseMode() + { + lock (m_lock) + { + if (m_state == LiveControlState.Running) + { + m_state = LiveControlState.Paused; + if (StateChanged != null) + StateChanged(this, null); + } + } + } + + /// + /// Pauses the backups until resumed + /// + public void Pause() + { + lock(m_lock) + { + var fireEvent = m_waitTimeExpiration.Ticks != 0 && m_state == LiveControlState.Paused && StateChanged != null; + + ResetTimer(null); + + if (fireEvent) + StateChanged(this, null); + else + SetPauseMode(); + } + } + + /// + /// Resumes a backups to the running state + /// + public void Resume() + { + lock (m_lock) + { + if (m_state == LiveControlState.Paused) + { + //Make sure that the timer is cleared + ResetTimer(null); + + m_state = LiveControlState.Running; + if (StateChanged != null) + StateChanged(this, null); + } + } + } + + /// + /// Suspends the backups for a given period + /// + /// The duration to wait + public void Pause(string timeout) + { + Pause(Duplicati.Library.Utility.Timeparser.ParseTimeSpan(timeout)); + } + + /// + /// Suspends the backups for a given period + /// + /// The duration to wait + public void Pause(TimeSpan timeout) + { + lock (m_lock) + { + m_waitTimeExpiration = DateTime.Now.AddMilliseconds((long)timeout.TotalMilliseconds); + m_waitTimer.Change((long)timeout.TotalMilliseconds, System.Threading.Timeout.Infinite); + + //We change the time, so we issue a new event + if (m_state == LiveControlState.Paused && StateChanged != null) + StateChanged(this, null); + else + SetPauseMode(); + } + } + + /// + /// Gets the time the current pause is expected to end + /// + public DateTime EstimatedPauseEnd { get { return m_waitTimeExpiration; } } + + /// + /// Method for calling a Win32 API + /// + private void RegisterHibernateMonitor() + { + Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(SystemEvents_PowerModeChanged); + } + + /// + /// A monitor for detecting when the system hibernates or resumes + /// + /// Unused sender parameter + /// The event information + private void SystemEvents_PowerModeChanged(object sender, object _e) + { + Microsoft.Win32.PowerModeChangedEventArgs e = _e as Microsoft.Win32.PowerModeChangedEventArgs; + if (e == null) + return; + + if (e.Mode == Microsoft.Win32.PowerModes.Suspend) + { + //If we are running, register as being paused due to suspending + if (this.m_state == LiveControlState.Running) + { + this.SetPauseMode(); + m_pausedForSuspend = true; + m_suspendMinimumPause = new DateTime(0); + } + else + { + if (m_waitTimeExpiration.Ticks != 0) + { + m_pausedForSuspend = true; + m_suspendMinimumPause = this.EstimatedPauseEnd; + ResetTimer(null); + } + + } + } + else if (e.Mode == Microsoft.Win32.PowerModes.Resume) + { + //If we have been been paused due to suspending, we un-pause now + if (m_pausedForSuspend) + { + long delayTicks = (m_suspendMinimumPause - DateTime.Now).Ticks; + + var appset = FIXMEGlobal.DataConnection.ApplicationSettings; + if (!string.IsNullOrEmpty(appset.StartupDelayDuration) && appset.StartupDelayDuration != "0") + try { delayTicks = Math.Max(delayTicks, Library.Utility.Timeparser.ParseTimeSpan(appset.StartupDelayDuration).Ticks); } + catch { } + + if (delayTicks > 0) + { + this.Pause(TimeSpan.FromTicks(delayTicks)); + } + else + { + this.Resume(); + } + } + + m_pausedForSuspend = false; + m_suspendMinimumPause = new DateTime(0); + } + } + + } +} diff --git a/Duplicati/Server/LogWriteHandler.cs b/Duplicati.Library.RestAPI/LogWriteHandler.cs similarity index 97% rename from Duplicati/Server/LogWriteHandler.cs rename to Duplicati.Library.RestAPI/LogWriteHandler.cs index 640886f66..1f84c8bbb 100644 --- a/Duplicati/Server/LogWriteHandler.cs +++ b/Duplicati.Library.RestAPI/LogWriteHandler.cs @@ -1,351 +1,351 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using Duplicati.Library.Logging; -using System.Collections.Generic; -using Duplicati.Library.Interface; - -namespace Duplicati.Server -{ - /// - /// Class that handles logging from the server, - /// and provides an entry point for the runner - /// to redirect log output to a file - /// - public class LogWriteHandler : ILogDestination, IDisposable - { - /// - /// The number of messages to keep when inactive - /// - private const int INACTIVE_SIZE = 30; - /// - /// The number of messages to keep when active - /// - private const int ACTIVE_SIZE = 5000; - - /// - /// The context key used for conveying the backup ID - /// - public const string LOG_EXTRA_BACKUPID = "BackupID"; - /// - /// The context key used for conveying the task ID - /// - public const string LOG_EXTRA_TASKID = "TaskID"; - - /// - /// Represents a single log event - /// - public struct LogEntry - { - /// - /// A unique ID that sequentially increments - /// - private static long _id; - - /// - /// The time the message was logged - /// - public readonly DateTime When; - - /// - /// The ID assigned to the message - /// - public readonly long ID; - - /// - /// The logged message - /// - public readonly string Message; - - /// - /// The log tag - /// - public readonly string Tag; - - /// - /// The message ID - /// - public readonly string MessageID; - - /// - /// The message ID - /// - public readonly string ExceptionID; - - /// - /// The message type - /// - public readonly LogMessageType Type; - - /// - /// Exception data attached to the message - /// - public readonly Exception Exception; - - /// - /// The backup ID, if any - /// - public readonly string BackupID; - - /// - /// The task ID, if any - /// - public readonly string TaskID; - - /// - /// Initializes a new instance of the struct. - /// - /// The log entry to store - public LogEntry(Duplicati.Library.Logging.LogEntry entry) - { - this.ID = System.Threading.Interlocked.Increment(ref _id); - this.When = entry.When; - this.Message = entry.FormattedMessage; - this.Type = entry.Level; - this.Exception = entry.Exception; - this.Tag = entry.FilterTag; - this.MessageID = entry.Id; - this.BackupID = entry[LOG_EXTRA_BACKUPID]; - this.TaskID = entry[LOG_EXTRA_TASKID]; - - if (entry.Exception == null) - this.ExceptionID = null; - else if (entry.Exception is UserInformationException exception) - this.ExceptionID = exception.HelpID; - else - this.ExceptionID = entry.Exception.GetType().FullName; - - } - } - - /// - /// Basic implementation of a ring-buffer - /// - private class RingBuffer : IEnumerable - { - private readonly T[] m_buffer; - private int m_head; - private int m_tail; - private int m_length; - private int m_key; - private readonly object m_lock = new object(); - - public RingBuffer(int size, IEnumerable initial = null) - { - m_buffer = new T[size]; - if (initial != null) - foreach(var t in initial) - this.Enqueue(t); - } - - public int Length { get { return m_length; } } - - public void Enqueue(T item) - { - lock(m_lock) - { - m_key++; - m_buffer[m_head] = item; - m_head = (m_head + 1) % m_buffer.Length; - if (m_length == m_buffer.Length) - m_tail = (m_tail + 1) % m_buffer.Length; - else - m_length++; - } - } - - #region IEnumerable implementation - public IEnumerator GetEnumerator() - { - var k = m_key; - for(var i = 0; i < m_length; i++) - if (m_key != k) - throw new InvalidOperationException("Buffer was modified while reading"); - else - yield return m_buffer[(m_tail + i) % m_buffer.Length]; - } - #endregion - #region IEnumerable implementation - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - #endregion - - public T[] FlatArray(Func filter = null) - { - lock(m_lock) - if (filter == null) - return this.ToArray(); - else - return this.Where(filter).ToArray(); - } - - public int Size { get { return m_buffer.Length; } } - } - - private readonly DateTime[] m_timeouts; - private readonly object m_lock = new object(); - private volatile bool m_anytimeouts = false; - private RingBuffer m_buffer; - - private ILogDestination m_serverfile; - private LogMessageType m_serverloglevel; - private LogMessageType m_logLevel; - - public LogWriteHandler() - { - var fields = Enum.GetValues(typeof(LogMessageType)); - m_timeouts = new DateTime[fields.Length]; - m_buffer = new RingBuffer(INACTIVE_SIZE); - } - - public void RenewTimeout(LogMessageType type) - { - lock(m_lock) - { - m_timeouts[(int)type] = DateTime.Now.AddSeconds(30); - m_anytimeouts = true; - if (m_buffer == null || m_buffer.Size == INACTIVE_SIZE) - m_buffer = new RingBuffer(ACTIVE_SIZE, m_buffer); - } - } - - public void SetServerFile(string path, LogMessageType level) - { - var dir = System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(path)); - if (!System.IO.Directory.Exists(dir)) - System.IO.Directory.CreateDirectory(dir); - - m_serverfile = new StreamLogDestination(path); - m_serverloglevel = level; - - UpdateLogLevel(); - } - - public LogEntry[] AfterTime(DateTime offset, LogMessageType level) - { - RenewTimeout(level); - UpdateLogLevel(); - - offset = offset.ToUniversalTime(); - lock(m_lock) - { - if (m_buffer == null) - return new LogEntry[0]; - - return m_buffer.FlatArray((x) => x.When > offset && x.Type >= level ); - } - } - - public LogEntry[] AfterID(long id, LogMessageType level, int pagesize) - { - RenewTimeout(level); - UpdateLogLevel(); - - lock(m_lock) - { - if (m_buffer == null) - return new LogEntry[0]; - - var buffer = m_buffer.FlatArray((x) => x.ID > id && x.Type >= level ); - // Return the newest entries - if (buffer.Length > pagesize) { - var index = buffer.Length - pagesize; - return buffer.Skip(index).Take(pagesize).ToArray(); - } - else { - return buffer; - } - } - } - - private int[] GetActiveTimeouts() - { - var i = 0; - return (from n in m_timeouts - let ix = i++ - where n > DateTime.Now - select ix).ToArray(); - } - - private void UpdateLogLevel() - { - m_logLevel = - (LogMessageType)(GetActiveTimeouts().Union(new int[] { (int)m_serverloglevel }).Min()); - } - - - #region ILog implementation - - public void WriteMessage(Duplicati.Library.Logging.LogEntry entry) - { - if (entry.Level < m_logLevel) - return; - - if (m_serverfile != null && entry.Level >= m_serverloglevel) - try - { - m_serverfile.WriteMessage(entry); - } - catch - { - } - - lock(m_lock) - { - if (m_anytimeouts) - { - var q = GetActiveTimeouts(); - - if (q.Length == 0) - { - UpdateLogLevel(); - m_anytimeouts = false; - if (m_buffer == null || m_buffer.Size != INACTIVE_SIZE) - m_buffer = new RingBuffer(INACTIVE_SIZE, m_buffer); - - } - } - - if (m_buffer != null) - m_buffer.Enqueue(new LogEntry(entry)); - } - - } - - #endregion - - #region IDisposable implementation - - public void Dispose() - { - if (m_serverfile != null) - { - var sf = m_serverfile; - m_serverfile = null; - if (sf is IDisposable disposable) - disposable.Dispose(); - } - } - - #endregion - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using Duplicati.Library.Logging; +using System.Collections.Generic; +using Duplicati.Library.Interface; + +namespace Duplicati.Server +{ + /// + /// Class that handles logging from the server, + /// and provides an entry point for the runner + /// to redirect log output to a file + /// + public class LogWriteHandler : ILogDestination, IDisposable + { + /// + /// The number of messages to keep when inactive + /// + private const int INACTIVE_SIZE = 30; + /// + /// The number of messages to keep when active + /// + private const int ACTIVE_SIZE = 5000; + + /// + /// The context key used for conveying the backup ID + /// + public const string LOG_EXTRA_BACKUPID = "BackupID"; + /// + /// The context key used for conveying the task ID + /// + public const string LOG_EXTRA_TASKID = "TaskID"; + + /// + /// Represents a single log event + /// + public struct LogEntry + { + /// + /// A unique ID that sequentially increments + /// + private static long _id; + + /// + /// The time the message was logged + /// + public readonly DateTime When; + + /// + /// The ID assigned to the message + /// + public readonly long ID; + + /// + /// The logged message + /// + public readonly string Message; + + /// + /// The log tag + /// + public readonly string Tag; + + /// + /// The message ID + /// + public readonly string MessageID; + + /// + /// The message ID + /// + public readonly string ExceptionID; + + /// + /// The message type + /// + public readonly LogMessageType Type; + + /// + /// Exception data attached to the message + /// + public readonly Exception Exception; + + /// + /// The backup ID, if any + /// + public readonly string BackupID; + + /// + /// The task ID, if any + /// + public readonly string TaskID; + + /// + /// Initializes a new instance of the struct. + /// + /// The log entry to store + public LogEntry(Duplicati.Library.Logging.LogEntry entry) + { + this.ID = System.Threading.Interlocked.Increment(ref _id); + this.When = entry.When; + this.Message = entry.FormattedMessage; + this.Type = entry.Level; + this.Exception = entry.Exception; + this.Tag = entry.FilterTag; + this.MessageID = entry.Id; + this.BackupID = entry[LOG_EXTRA_BACKUPID]; + this.TaskID = entry[LOG_EXTRA_TASKID]; + + if (entry.Exception == null) + this.ExceptionID = null; + else if (entry.Exception is UserInformationException exception) + this.ExceptionID = exception.HelpID; + else + this.ExceptionID = entry.Exception.GetType().FullName; + + } + } + + /// + /// Basic implementation of a ring-buffer + /// + private class RingBuffer : IEnumerable + { + private readonly T[] m_buffer; + private int m_head; + private int m_tail; + private int m_length; + private int m_key; + private readonly object m_lock = new object(); + + public RingBuffer(int size, IEnumerable initial = null) + { + m_buffer = new T[size]; + if (initial != null) + foreach(var t in initial) + this.Enqueue(t); + } + + public int Length { get { return m_length; } } + + public void Enqueue(T item) + { + lock(m_lock) + { + m_key++; + m_buffer[m_head] = item; + m_head = (m_head + 1) % m_buffer.Length; + if (m_length == m_buffer.Length) + m_tail = (m_tail + 1) % m_buffer.Length; + else + m_length++; + } + } + + #region IEnumerable implementation + public IEnumerator GetEnumerator() + { + var k = m_key; + for(var i = 0; i < m_length; i++) + if (m_key != k) + throw new InvalidOperationException("Buffer was modified while reading"); + else + yield return m_buffer[(m_tail + i) % m_buffer.Length]; + } + #endregion + #region IEnumerable implementation + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + #endregion + + public T[] FlatArray(Func filter = null) + { + lock(m_lock) + if (filter == null) + return this.ToArray(); + else + return this.Where(filter).ToArray(); + } + + public int Size { get { return m_buffer.Length; } } + } + + private readonly DateTime[] m_timeouts; + private readonly object m_lock = new object(); + private volatile bool m_anytimeouts = false; + private RingBuffer m_buffer; + + private ILogDestination m_serverfile; + private LogMessageType m_serverloglevel; + private LogMessageType m_logLevel; + + public LogWriteHandler() + { + var fields = Enum.GetValues(typeof(LogMessageType)); + m_timeouts = new DateTime[fields.Length]; + m_buffer = new RingBuffer(INACTIVE_SIZE); + } + + public void RenewTimeout(LogMessageType type) + { + lock(m_lock) + { + m_timeouts[(int)type] = DateTime.Now.AddSeconds(30); + m_anytimeouts = true; + if (m_buffer == null || m_buffer.Size == INACTIVE_SIZE) + m_buffer = new RingBuffer(ACTIVE_SIZE, m_buffer); + } + } + + public void SetServerFile(string path, LogMessageType level) + { + var dir = System.IO.Path.GetDirectoryName(System.IO.Path.GetFullPath(path)); + if (!System.IO.Directory.Exists(dir)) + System.IO.Directory.CreateDirectory(dir); + + m_serverfile = new StreamLogDestination(path); + m_serverloglevel = level; + + UpdateLogLevel(); + } + + public LogEntry[] AfterTime(DateTime offset, LogMessageType level) + { + RenewTimeout(level); + UpdateLogLevel(); + + offset = offset.ToUniversalTime(); + lock(m_lock) + { + if (m_buffer == null) + return new LogEntry[0]; + + return m_buffer.FlatArray((x) => x.When > offset && x.Type >= level ); + } + } + + public LogEntry[] AfterID(long id, LogMessageType level, int pagesize) + { + RenewTimeout(level); + UpdateLogLevel(); + + lock(m_lock) + { + if (m_buffer == null) + return new LogEntry[0]; + + var buffer = m_buffer.FlatArray((x) => x.ID > id && x.Type >= level ); + // Return the newest entries + if (buffer.Length > pagesize) { + var index = buffer.Length - pagesize; + return buffer.Skip(index).Take(pagesize).ToArray(); + } + else { + return buffer; + } + } + } + + private int[] GetActiveTimeouts() + { + var i = 0; + return (from n in m_timeouts + let ix = i++ + where n > DateTime.Now + select ix).ToArray(); + } + + private void UpdateLogLevel() + { + m_logLevel = + (LogMessageType)(GetActiveTimeouts().Union(new int[] { (int)m_serverloglevel }).Min()); + } + + + #region ILog implementation + + public void WriteMessage(Duplicati.Library.Logging.LogEntry entry) + { + if (entry.Level < m_logLevel) + return; + + if (m_serverfile != null && entry.Level >= m_serverloglevel) + try + { + m_serverfile.WriteMessage(entry); + } + catch + { + } + + lock(m_lock) + { + if (m_anytimeouts) + { + var q = GetActiveTimeouts(); + + if (q.Length == 0) + { + UpdateLogLevel(); + m_anytimeouts = false; + if (m_buffer == null || m_buffer.Size != INACTIVE_SIZE) + m_buffer = new RingBuffer(INACTIVE_SIZE, m_buffer); + + } + } + + if (m_buffer != null) + m_buffer.Enqueue(new LogEntry(entry)); + } + + } + + #endregion + + #region IDisposable implementation + + public void Dispose() + { + if (m_serverfile != null) + { + var sf = m_serverfile; + m_serverfile = null; + if (sf is IDisposable disposable) + disposable.Dispose(); + } + } + + #endregion + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Acknowledgements.cs b/Duplicati.Library.RestAPI/RESTMethods/Acknowledgements.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/Acknowledgements.cs rename to Duplicati.Library.RestAPI/RESTMethods/Acknowledgements.cs index 6ca1bd459..488cb7456 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Acknowledgements.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Acknowledgements.cs @@ -1,53 +1,53 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; using Duplicati.Library.Common.IO; using Duplicati.Library.Utility; -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Acknowledgements : IRESTMethodGET, IRESTMethodDocumented - { - private class GetResponse - { - public string Status; - public string Acknowledgements; - } - - public void GET(string key, RequestInfo info) - { - var path = SystemIO.IO_OS.PathCombine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "acknowledgements.txt"); - info.OutputOK(new GetResponse() { - Status = "OK", - Acknowledgements = System.IO.File.ReadAllText(path) - }); - } - public string Description { get { return "Gets all acknowledgements"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(GetResponse)), - }; - } - } - } -} - +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Acknowledgements : IRESTMethodGET, IRESTMethodDocumented + { + private class GetResponse + { + public string Status; + public string Acknowledgements; + } + + public void GET(string key, RequestInfo info) + { + var path = SystemIO.IO_OS.PathCombine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "acknowledgements.txt"); + info.OutputOK(new GetResponse() { + Status = "OK", + Acknowledgements = System.IO.File.ReadAllText(path) + }); + } + public string Description { get { return "Gets all acknowledgements"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(GetResponse)), + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Backup.cs b/Duplicati.Library.RestAPI/RESTMethods/Backup.cs similarity index 87% rename from Duplicati/Server/WebServer/RESTMethods/Backup.cs rename to Duplicati.Library.RestAPI/RESTMethods/Backup.cs index 926e7ba80..232c428a2 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Backup.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Backup.cs @@ -1,732 +1,733 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using Duplicati.Server.Serialization; -using System.IO; -using System.Linq; -using Duplicati.Server.Serialization.Interface; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Backup : IRESTMethodGET, IRESTMethodPUT, IRESTMethodPOST, IRESTMethodDELETE, IRESTMethodDocumented - { - public class GetResponse - { - public class GetResponseData - { - public Serialization.Interface.ISchedule Schedule; - public Serialization.Interface.IBackup Backup; - public Dictionary DisplayNames; - } - - public bool success; - - public GetResponseData data; - } - - private void SearchFiles(IBackup backup, string filterstring, RequestInfo info) - { - var filter = filterstring; - var timestring = info.Request.QueryString["time"].Value; - var allversion = Duplicati.Library.Utility.Utility.ParseBool(info.Request.QueryString["all-versions"].Value, false); - - if (string.IsNullOrWhiteSpace(timestring) && !allversion) - { - info.ReportClientError("Invalid or missing time", System.Net.HttpStatusCode.BadRequest); - return; - } - - var prefixonly = Duplicati.Library.Utility.Utility.ParseBool(info.Request.QueryString["prefix-only"].Value, false); - var foldercontents = Duplicati.Library.Utility.Utility.ParseBool(info.Request.QueryString["folder-contents"].Value, false); - var time = new DateTime(); - if (!allversion) - time = Duplicati.Library.Utility.Timeparser.ParseTimeInterval(timestring, DateTime.Now); - - var r = Runner.Run(Runner.CreateListTask(backup, new string[] { filter }, prefixonly, allversion, foldercontents, time), false) as Duplicati.Library.Interface.IListResults; - - var result = new Dictionary(); - - foreach(HttpServer.HttpInputItem n in info.Request.QueryString) - result[n.Name] = n.Value; - - result["Filesets"] = r.Filesets; - result["Files"] = r.Files - // Group directories first - support either directory separator here as we may be restoring data from an alternate platform - .OrderByDescending(f => (f.Path.StartsWith("/", StringComparison.Ordinal) && f.Path.EndsWith("/", StringComparison.Ordinal)) || (!f.Path.StartsWith("/", StringComparison.Ordinal) && f.Path.EndsWith("\\", StringComparison.Ordinal))) - // Sort both groups (directories and files) alphabetically - .ThenBy(f => f.Path); - - info.OutputOK(result); - - } - - private void ListFileSets(IBackup backup, RequestInfo info) - { - var input = info.Request.QueryString; - var extra = new Dictionary - { - ["list-sets-only"] = "true" - }; - if (input["include-metadata"].Value != null) - extra["list-sets-only"] = (!Library.Utility.Utility.ParseBool(input["include-metadata"].Value, false)).ToString(); - if (input["from-remote-only"].Value != null) - extra["no-local-db"] = Library.Utility.Utility.ParseBool(input["from-remote-only"].Value, false).ToString(); - - var r = Runner.Run(Runner.CreateTask(DuplicatiOperation.List, backup, extra), false) as Duplicati.Library.Interface.IListResults; - - if (r.EncryptedFiles && backup.Settings.Any(x => string.Equals("--no-encryption", x.Name, StringComparison.OrdinalIgnoreCase))) - info.ReportServerError("encrypted-storage"); - else - info.OutputOK(r.Filesets); - } - - private void FetchLogData(IBackup backup, RequestInfo info) - { - using(var con = Duplicati.Library.SQLiteHelper.SQLiteLoader.LoadConnection(backup.DBPath)) - using(var cmd = con.CreateCommand()) - info.OutputOK(LogData.DumpTable(cmd, "LogData", "ID", info.Request.QueryString["offset"].Value, info.Request.QueryString["pagesize"].Value)); - } - - private void FetchRemoteLogData(IBackup backup, RequestInfo info) - { - using(var con = Duplicati.Library.SQLiteHelper.SQLiteLoader.LoadConnection(backup.DBPath)) - using(var cmd = con.CreateCommand()) - { - var dt = LogData.DumpTable(cmd, "RemoteOperation", "ID", info.Request.QueryString["offset"].Value, info.Request.QueryString["pagesize"].Value); - - // Unwrap raw data to a string - foreach(var n in dt) - try { n["Data"] = System.Text.Encoding.UTF8.GetString((byte[])n["Data"]); } - catch { } - - info.OutputOK(dt); - } - } - private void IsDBUsedElseWhere(IBackup backup, RequestInfo info) - { - info.OutputOK(new { inuse = Library.Main.DatabaseLocator.IsDatabasePathInUse(backup.DBPath) }); - } - - public static void RemovePasswords(IBackup backup) - { - backup.SanitizeSettings(); - backup.SanitizeTargetUrl(); - } - - private void Export(IBackup backup, RequestInfo info) - { - var cmdline = Library.Utility.Utility.ParseBool(info.Request.QueryString["cmdline"].Value, false); - var argsonly = Library.Utility.Utility.ParseBool(info.Request.QueryString["argsonly"].Value, false); - var exportPasswords = Library.Utility.Utility.ParseBool(info.Request.QueryString["export-passwords"].Value, false); - if (!exportPasswords) - { - Backup.RemovePasswords(backup); - } - - if (cmdline) - { - info.OutputOK(new { Command = Runner.GetCommandLine(Runner.CreateTask(DuplicatiOperation.Backup, backup)) }); - } - else if (argsonly) - { - var parts = Runner.GetCommandLineParts(Runner.CreateTask(DuplicatiOperation.Backup, backup)); - - info.OutputOK(new { - Backend = parts.First(), - Arguments = parts.Skip(1).Where(x => !x.StartsWith("--", StringComparison.Ordinal)), - Options = parts.Skip(1).Where(x => x.StartsWith("--", StringComparison.Ordinal)) - }); - } - else - { - var passphrase = info.Request.QueryString["passphrase"].Value; - byte[] data = Backup.ExportToJSON(backup, passphrase); - - string filename = Library.Utility.Uri.UrlEncode(backup.Name) + "-duplicati-config.json"; - if (!string.IsNullOrWhiteSpace(passphrase)) - { - filename += ".aes"; - } - - info.Response.ContentLength = data.Length; - info.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename)); - info.Response.ContentType = "application/octet-stream"; - - info.BodyWriter.SetOK(); - info.Response.SendHeaders(); - info.Response.SendBody(data); - } - } - - public static byte[] ExportToJSON(IBackup backup, string passphrase) - { - Serializable.ImportExportStructure ipx = Program.DataConnection.PrepareBackupForExport(backup); - - byte[] data; - using (MemoryStream ms = new System.IO.MemoryStream()) - { - using (StreamWriter sw = new System.IO.StreamWriter(ms)) - { - Serializer.SerializeJson(sw, ipx, true); - - if (!string.IsNullOrWhiteSpace(passphrase)) - { - ms.Position = 0; - using (MemoryStream ms2 = new System.IO.MemoryStream()) - { - using (Library.Encryption.AESEncryption m = new Duplicati.Library.Encryption.AESEncryption(passphrase, new Dictionary())) - { - m.Encrypt(ms, ms2); - data = ms2.ToArray(); - } - } - } - else - { - data = ms.ToArray(); - } - } - } - - return data; - } - - private void RestoreFiles(IBackup backup, RequestInfo info) - { - var input = info.Request.Form; - - string[] filters = parsePaths(input["paths"].Value ?? string.Empty); - - var passphrase = string.IsNullOrEmpty(input["passphrase"].Value) ? null : input["passphrase"].Value; - - var time = Duplicati.Library.Utility.Timeparser.ParseTimeInterval(input["time"].Value, DateTime.Now); - var restoreTarget = input["restore-path"].Value; - var overwrite = Duplicati.Library.Utility.Utility.ParseBool(input["overwrite"].Value, false); - - var permissions = Duplicati.Library.Utility.Utility.ParseBool(input["permissions"].Value, false); - var skip_metadata = Duplicati.Library.Utility.Utility.ParseBool(input["skip-metadata"].Value, false); - - var task = Runner.CreateRestoreTask(backup, filters, time, restoreTarget, overwrite, permissions, skip_metadata, passphrase); - - Program.WorkThread.AddTask(task); - - info.OutputOK(new { TaskID = task.TaskID }); - } - - private void CreateReport(IBackup backup, RequestInfo info) - { - var task = Runner.CreateTask(DuplicatiOperation.CreateReport, backup); - Program.WorkThread.AddTask(task); - Program.StatusEventNotifyer.SignalNewEvent(); - - info.OutputOK(new { Status = "OK", ID = task.TaskID }); - } - - private void ReportRemoteSize(IBackup backup, RequestInfo info) - { - var task = Runner.CreateTask(DuplicatiOperation.ListRemote, backup); - Program.WorkThread.AddTask(task); - Program.StatusEventNotifyer.SignalNewEvent(); - - info.OutputOK(new { Status = "OK", ID = task.TaskID }); - } - - private void Repair(IBackup backup, RequestInfo info) - { - DoRepair(backup, info, false); - } - - private void RepairUpdate(IBackup backup, RequestInfo info) - { - DoRepair(backup, info, true); - } - - private void Vacuum(IBackup backup, RequestInfo info) - { - var task = Runner.CreateTask(DuplicatiOperation.Vacuum, backup); - Program.WorkThread.AddTask(task); - Program.StatusEventNotifyer.SignalNewEvent(); - - info.OutputOK(new { Status = "OK", ID = task.TaskID }); - } - - private void Verify(IBackup backup, RequestInfo info) - { - var task = Runner.CreateTask(DuplicatiOperation.Verify, backup); - Program.WorkThread.AddTask(task); - Program.StatusEventNotifyer.SignalNewEvent(); - - info.OutputOK(new {Status = "OK", ID = task.TaskID}); - } - - private void Compact(IBackup backup, RequestInfo info) - { - var task = Runner.CreateTask(DuplicatiOperation.Compact, backup); - Program.WorkThread.AddTask(task); - Program.StatusEventNotifyer.SignalNewEvent(); - - info.OutputOK(new { Status = "OK", ID = task.TaskID }); - } - - private string[] parsePaths(string paths) - { - string[] filters; - var rawpaths = (paths ?? string.Empty).Trim(); - - // We send the file list as a JSON array to avoid encoding issues with the path separator - // as it is an allowed character in file and path names. - // We also accept the old way, for compatibility with the greeno theme - if (!string.IsNullOrWhiteSpace(rawpaths) && rawpaths.StartsWith("[", StringComparison.Ordinal) && rawpaths.EndsWith("]", StringComparison.Ordinal)) - filters = Newtonsoft.Json.JsonConvert.DeserializeObject(rawpaths); - else - filters = paths.Split(new string[] { System.IO.Path.PathSeparator.ToString() }, StringSplitOptions.RemoveEmptyEntries); - - return filters; - } - - private void DoRepair(IBackup backup, RequestInfo info, bool repairUpdate) - { - var input = info.Request.Form; - string[] filters = null; - var extra = new Dictionary(); - if (input["only-paths"].Value != null) - extra["repair-only-paths"] = (Library.Utility.Utility.ParseBool(input["only-paths"].Value, false)).ToString(); - if (input["time"].Value != null) - extra["time"] = input["time"].Value; - if (input["version"].Value != null) - extra["version"] = input["version"].Value; - if (input["paths"].Value != null) - filters = parsePaths(input["paths"].Value); - - var task = Runner.CreateTask(repairUpdate ? DuplicatiOperation.RepairUpdate : DuplicatiOperation.Repair, backup, extra, filters); - Program.WorkThread.AddTask(task); - Program.StatusEventNotifyer.SignalNewEvent(); - - info.OutputOK(new {Status = "OK", ID = task.TaskID}); - } - - private void RunBackup(IBackup backup, RequestInfo info) - { - var t = Program.WorkThread.CurrentTask; - var bt = t == null ? null : t.Backup; - if (bt != null && backup.ID == bt.ID) - { - // Already running - } - else if (Program.WorkThread.CurrentTasks.Any(x => { - var bn = x?.Backup; - return bn == null || bn.ID == backup.ID; - })) - { - // Already in queue - } - else - { - Program.WorkThread.AddTask(Runner.CreateTask(DuplicatiOperation.Backup, backup), true); - Program.StatusEventNotifyer.SignalNewEvent(); - } - - info.OutputOK(); - } - - private void IsActive(IBackup backup, RequestInfo info) - { - var t = Program.WorkThread.CurrentTask; - var bt = t?.Backup; - if (bt != null && backup.ID == bt.ID) - { - info.OutputOK(new { Status = "OK", Active = true }); - return; - } - else if (Program.WorkThread.CurrentTasks.Any(x => - { - var bn = x?.Backup; - return bn == null || bn.ID == backup.ID; - })) - { - info.OutputOK(new { Status = "OK", Active = true }); - return; - } - else - { - info.OutputOK(new { Status = "OK", Active = false }); - return; - } - } - - private void UpdateDatabasePath(IBackup backup, RequestInfo info, bool move) - { - var np = info.Request.Form["path"].Value; - if (string.IsNullOrWhiteSpace(np)) - info.ReportClientError("No target path supplied", System.Net.HttpStatusCode.BadRequest); - else if (!Path.IsPathRooted(np)) - info.ReportClientError("Target path is relative, please supply a fully qualified path", System.Net.HttpStatusCode.BadRequest); - else - { - if (move && (File.Exists(np) || Directory.Exists(np))) - info.ReportClientError("A file already exists at the new location", System.Net.HttpStatusCode.Conflict); - else - { - if (move) - File.Move(backup.DBPath, np); - - Program.DataConnection.UpdateBackupDBPath(backup, np); - } - - } - - } - - public void GET(string key, RequestInfo info) - { - var parts = (key ?? "").Split(new char[] { '/' }, 2); - var bk = Program.DataConnection.GetBackup(parts.First()); - if (bk == null) - info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); - else - { - if (parts.Length > 1) - { - var operation = parts.Last().Split(new char[] {'/'}).First().ToLowerInvariant(); - - switch (operation) - { - case "files": - var filter = parts.Last().Split(new char[] { '/' }, 2).Skip(1).FirstOrDefault(); - if (!string.IsNullOrWhiteSpace(info.Request.QueryString["filter"].Value)) - filter = info.Request.QueryString["filter"].Value; - SearchFiles(bk, filter, info); - return; - case "log": - FetchLogData(bk, info); - return; - case "remotelog": - FetchRemoteLogData(bk, info); - return; - case "filesets": - ListFileSets(bk, info); - return; - case "export": - Export(bk, info); - return; - case "isdbusedelsewhere": - IsDBUsedElseWhere(bk, info); - return; - case "isactive": - IsActive(bk, info); - return; - default: - info.ReportClientError(string.Format("Invalid component: {0}", operation), System.Net.HttpStatusCode.BadRequest); - return; - } - - } - - var scheduleId = Program.DataConnection.GetScheduleIDsFromTags(new string[] { "ID=" + bk.ID }); - var schedule = scheduleId.Any() ? Program.DataConnection.GetSchedule(scheduleId.First()) : null; - var sourcenames = SpecialFolders.GetSourceNames(bk); - - //TODO: Filter out the password in both settings and the target url - - info.OutputOK(new GetResponse() - { - success = true, - data = new GetResponse.GetResponseData { - Schedule = schedule, - Backup = bk, - DisplayNames = sourcenames - } - }); - } - } - - public void POST(string key, RequestInfo info) - { - var parts = (key ?? "").Split(new char[] { '/' }, 2); - var bk = Program.DataConnection.GetBackup(parts.First()); - if (bk == null) - info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); - else - { - if (parts.Length > 1) - { - var operation = parts.Last().Split(new char[] { '/' }).First().ToLowerInvariant(); - - switch (operation) - { - case "deletedb": - System.IO.File.Delete(bk.DBPath); - info.OutputOK(); - return; - - case "movedb": - UpdateDatabasePath(bk, info, true); - return; - - case "updatedb": - UpdateDatabasePath(bk, info, false); - return; - - case "restore": - RestoreFiles(bk, info); - return; - - case "createreport": - CreateReport(bk, info); - return; - - case "repair": - Repair(bk, info); - return; - - case "repairupdate": - RepairUpdate(bk, info); - return; - - case "vacuum": - Vacuum(bk, info); - return; - - case "verify": - Verify(bk, info); - return; - - case "compact": - Compact(bk, info); - return; - - case "start": - case "run": - RunBackup(bk, info); - return; - - case "report-remote-size": - ReportRemoteSize(bk, info); - return; - - case "copytotemp": - var ipx = Serializer.Deserialize(new StringReader(Newtonsoft.Json.JsonConvert.SerializeObject(bk))); - - using(var tf = new Duplicati.Library.Utility.TempFile()) - ipx.DBPath = tf; - ipx.ID = null; - - info.OutputOK(new { status = "OK", ID = Program.DataConnection.RegisterTemporaryBackup(ipx) }); - return; - } - } - - info.ReportClientError("Invalid request", System.Net.HttpStatusCode.BadRequest); - } - } - - public void PUT(string key, RequestInfo info) - { - string str = info.Request.Form["data"].Value; - if (string.IsNullOrWhiteSpace(str)) - str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); - - if (string.IsNullOrWhiteSpace(str)) - { - info.ReportClientError("Missing backup object", System.Net.HttpStatusCode.BadRequest); - return; - } - - Backups.AddOrUpdateBackupData data = null; - try - { - data = Serializer.Deserialize(new StringReader(str)); - if (data.Backup == null) - { - info.ReportClientError("Data object had no backup entry", System.Net.HttpStatusCode.BadRequest); - return; - } - - if (!string.IsNullOrEmpty(key)) - data.Backup.ID = key; - - if (string.IsNullOrEmpty(data.Backup.ID)) - { - info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.BadRequest); - return; - } - - - if (data.Backup.IsTemporary) - { - var backup = Program.DataConnection.GetBackup(data.Backup.ID); - if (backup.IsTemporary) - throw new InvalidDataException("External is temporary but internal is not?"); - - Program.DataConnection.UpdateTemporaryBackup(backup); - info.OutputOK(); - } - else - { - lock(Program.DataConnection.m_lock) - { - var backup = Program.DataConnection.GetBackup(data.Backup.ID); - if (backup == null) - { - info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); - return; - } - - if (Program.DataConnection.Backups.Any(x => x.Name.Equals(data.Backup.Name, StringComparison.OrdinalIgnoreCase) && x.ID != data.Backup.ID)) - { - info.ReportClientError("There already exists a backup with the name: " + data.Backup.Name, System.Net.HttpStatusCode.Conflict); - return; - } - - var err = Program.DataConnection.ValidateBackup(data.Backup, data.Schedule); - if (!string.IsNullOrWhiteSpace(err)) - { - info.ReportClientError(err, System.Net.HttpStatusCode.BadRequest); - return; - } - - //TODO: Merge in real passwords where the placeholder is found - Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); - - } - - info.OutputOK(); - } - } - catch (Exception ex) - { - if (data == null) - info.ReportClientError(string.Format("Unable to parse backup or schedule object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); - else - info.ReportClientError(string.Format("Unable to save backup or schedule: {0}", ex.Message), System.Net.HttpStatusCode.InternalServerError); - } - } - - public void DELETE(string key, RequestInfo info) - { - var backup = Program.DataConnection.GetBackup(key); - if (backup == null) - { - info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); - return; - } - - var delete_remote_files = Library.Utility.Utility.ParseBool(info.Request.Param["delete-remote-files"].Value, false); - - if (delete_remote_files) - { - var captcha_token = info.Request.Param["captcha-token"].Value; - var captcha_answer = info.Request.Param["captcha-answer"].Value; - if (string.IsNullOrWhiteSpace(captcha_token) || string.IsNullOrWhiteSpace(captcha_answer)) - { - info.ReportClientError("Missing captcha", System.Net.HttpStatusCode.Unauthorized); - return; - } - - if (!Captcha.SolvedCaptcha(captcha_token, "DELETE /backup/" + backup.ID, captcha_answer)) - { - info.ReportClientError("Invalid captcha", System.Net.HttpStatusCode.Forbidden); - return; - } - } - - if (Program.WorkThread.Active) - { - try - { - //TODO: It's not safe to access the values like this, - //because the runner thread might interfere - var nt = Program.WorkThread.CurrentTask; - if (backup.Equals(nt == null ? null : nt.Backup)) - { - bool force; - if (!bool.TryParse(info.Request.QueryString["force"].Value, out force)) - force = false; - - if (!force) - { - info.OutputError(new { status = "failed", reason = "backup-in-progress" }); - return; - } - - bool hasPaused = Program.LiveControl.State == LiveControls.LiveControlState.Paused; - Program.LiveControl.Pause(); - - for(int i = 0; i < 10; i++) - if (Program.WorkThread.Active) - { - var t = Program.WorkThread.CurrentTask; - if (backup.Equals(t == null ? null : t.Backup)) - System.Threading.Thread.Sleep(1000); - else - break; - } - else - break; - - if (Program.WorkThread.Active) - { - var t = Program.WorkThread.CurrentTask; - if (backup.Equals(t == null ? null : t.Backup)) - { - if (hasPaused) - Program.LiveControl.Resume(); - info.OutputError(new { status = "failed", reason = "backup-unstoppable" }); - return; - } - } - - if (hasPaused) - Program.LiveControl.Resume(); - } - } - catch (Exception ex) - { - info.OutputError(new { status = "error", message = ex.Message }); - return; - } - } - - var extra = new Dictionary(); - if (!string.IsNullOrWhiteSpace(info.Request.Param["delete-local-db"].Value)) - extra["delete-local-db"] = info.Request.Param["delete-local-db"].Value; - if (delete_remote_files) - extra["delete-remote-files"] = "true"; - - var task = Runner.CreateTask(DuplicatiOperation.Delete, backup, extra); - Program.WorkThread.AddTask(task); - Program.StatusEventNotifyer.SignalNewEvent(); - - info.OutputOK(new { Status = "OK", ID = task.TaskID }); - } - public string Description { get { return "Retrieves, updates or deletes an existing backup and schedule"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(GetResponse)), - new KeyValuePair(HttpServer.Method.Put, typeof(Backups.AddOrUpdateBackupData)), - new KeyValuePair(HttpServer.Method.Delete, typeof(long)) - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using Duplicati.Server.Serialization; +using System.IO; +using System.Linq; +using Duplicati.Server.Serialization.Interface; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Backup : IRESTMethodGET, IRESTMethodPUT, IRESTMethodPOST, IRESTMethodDELETE, IRESTMethodDocumented + { + public class GetResponse + { + public class GetResponseData + { + public Serialization.Interface.ISchedule Schedule; + public Serialization.Interface.IBackup Backup; + public Dictionary DisplayNames; + } + + public bool success; + + public GetResponseData data; + } + + private void SearchFiles(IBackup backup, string filterstring, RequestInfo info) + { + var filter = filterstring; + var timestring = info.Request.QueryString["time"].Value; + var allversion = Duplicati.Library.Utility.Utility.ParseBool(info.Request.QueryString["all-versions"].Value, false); + + if (string.IsNullOrWhiteSpace(timestring) && !allversion) + { + info.ReportClientError("Invalid or missing time", System.Net.HttpStatusCode.BadRequest); + return; + } + + var prefixonly = Duplicati.Library.Utility.Utility.ParseBool(info.Request.QueryString["prefix-only"].Value, false); + var foldercontents = Duplicati.Library.Utility.Utility.ParseBool(info.Request.QueryString["folder-contents"].Value, false); + var time = new DateTime(); + if (!allversion) + time = Duplicati.Library.Utility.Timeparser.ParseTimeInterval(timestring, DateTime.Now); + + var r = Runner.Run(Runner.CreateListTask(backup, new string[] { filter }, prefixonly, allversion, foldercontents, time), false) as Duplicati.Library.Interface.IListResults; + + var result = new Dictionary(); + + foreach(HttpServer.HttpInputItem n in info.Request.QueryString) + result[n.Name] = n.Value; + + result["Filesets"] = r.Filesets; + result["Files"] = r.Files + // Group directories first - support either directory separator here as we may be restoring data from an alternate platform + .OrderByDescending(f => (f.Path.StartsWith("/", StringComparison.Ordinal) && f.Path.EndsWith("/", StringComparison.Ordinal)) || (!f.Path.StartsWith("/", StringComparison.Ordinal) && f.Path.EndsWith("\\", StringComparison.Ordinal))) + // Sort both groups (directories and files) alphabetically + .ThenBy(f => f.Path); + + info.OutputOK(result); + + } + + private void ListFileSets(IBackup backup, RequestInfo info) + { + var input = info.Request.QueryString; + var extra = new Dictionary + { + ["list-sets-only"] = "true" + }; + if (input["include-metadata"].Value != null) + extra["list-sets-only"] = (!Library.Utility.Utility.ParseBool(input["include-metadata"].Value, false)).ToString(); + if (input["from-remote-only"].Value != null) + extra["no-local-db"] = Library.Utility.Utility.ParseBool(input["from-remote-only"].Value, false).ToString(); + + var r = Runner.Run(Runner.CreateTask(DuplicatiOperation.List, backup, extra), false) as Duplicati.Library.Interface.IListResults; + + if (r.EncryptedFiles && backup.Settings.Any(x => string.Equals("--no-encryption", x.Name, StringComparison.OrdinalIgnoreCase))) + info.ReportServerError("encrypted-storage"); + else + info.OutputOK(r.Filesets); + } + + private void FetchLogData(IBackup backup, RequestInfo info) + { + using(var con = Duplicati.Library.SQLiteHelper.SQLiteLoader.LoadConnection(backup.DBPath)) + using(var cmd = con.CreateCommand()) + info.OutputOK(LogData.DumpTable(cmd, "LogData", "ID", info.Request.QueryString["offset"].Value, info.Request.QueryString["pagesize"].Value)); + } + + private void FetchRemoteLogData(IBackup backup, RequestInfo info) + { + using(var con = Duplicati.Library.SQLiteHelper.SQLiteLoader.LoadConnection(backup.DBPath)) + using(var cmd = con.CreateCommand()) + { + var dt = LogData.DumpTable(cmd, "RemoteOperation", "ID", info.Request.QueryString["offset"].Value, info.Request.QueryString["pagesize"].Value); + + // Unwrap raw data to a string + foreach(var n in dt) + try { n["Data"] = System.Text.Encoding.UTF8.GetString((byte[])n["Data"]); } + catch { } + + info.OutputOK(dt); + } + } + private void IsDBUsedElseWhere(IBackup backup, RequestInfo info) + { + info.OutputOK(new { inuse = Library.Main.DatabaseLocator.IsDatabasePathInUse(backup.DBPath) }); + } + + public static void RemovePasswords(IBackup backup) + { + backup.SanitizeSettings(); + backup.SanitizeTargetUrl(); + } + + private void Export(IBackup backup, RequestInfo info) + { + var cmdline = Library.Utility.Utility.ParseBool(info.Request.QueryString["cmdline"].Value, false); + var argsonly = Library.Utility.Utility.ParseBool(info.Request.QueryString["argsonly"].Value, false); + var exportPasswords = Library.Utility.Utility.ParseBool(info.Request.QueryString["export-passwords"].Value, false); + if (!exportPasswords) + { + Backup.RemovePasswords(backup); + } + + if (cmdline) + { + info.OutputOK(new { Command = Runner.GetCommandLine(Runner.CreateTask(DuplicatiOperation.Backup, backup)) }); + } + else if (argsonly) + { + var parts = Runner.GetCommandLineParts(Runner.CreateTask(DuplicatiOperation.Backup, backup)); + + info.OutputOK(new { + Backend = parts.First(), + Arguments = parts.Skip(1).Where(x => !x.StartsWith("--", StringComparison.Ordinal)), + Options = parts.Skip(1).Where(x => x.StartsWith("--", StringComparison.Ordinal)) + }); + } + else + { + var passphrase = info.Request.QueryString["passphrase"].Value; + byte[] data = Backup.ExportToJSON(backup, passphrase); + + string filename = Library.Utility.Uri.UrlEncode(backup.Name) + "-duplicati-config.json"; + if (!string.IsNullOrWhiteSpace(passphrase)) + { + filename += ".aes"; + } + + info.Response.ContentLength = data.Length; + info.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename)); + info.Response.ContentType = "application/octet-stream"; + + info.BodyWriter.SetOK(); + info.Response.SendHeaders(); + info.Response.SendBody(data); + } + } + + public static byte[] ExportToJSON(IBackup backup, string passphrase) + { + Serializable.ImportExportStructure ipx = FIXMEGlobal.DataConnection.PrepareBackupForExport(backup); + + byte[] data; + using (MemoryStream ms = new System.IO.MemoryStream()) + { + using (StreamWriter sw = new System.IO.StreamWriter(ms)) + { + Serializer.SerializeJson(sw, ipx, true); + + if (!string.IsNullOrWhiteSpace(passphrase)) + { + ms.Position = 0; + using (MemoryStream ms2 = new System.IO.MemoryStream()) + { + using (Library.Encryption.AESEncryption m = new Duplicati.Library.Encryption.AESEncryption(passphrase, new Dictionary())) + { + m.Encrypt(ms, ms2); + data = ms2.ToArray(); + } + } + } + else + { + data = ms.ToArray(); + } + } + } + + return data; + } + + private void RestoreFiles(IBackup backup, RequestInfo info) + { + var input = info.Request.Form; + + string[] filters = parsePaths(input["paths"].Value ?? string.Empty); + + var passphrase = string.IsNullOrEmpty(input["passphrase"].Value) ? null : input["passphrase"].Value; + + var time = Duplicati.Library.Utility.Timeparser.ParseTimeInterval(input["time"].Value, DateTime.Now); + var restoreTarget = input["restore-path"].Value; + var overwrite = Duplicati.Library.Utility.Utility.ParseBool(input["overwrite"].Value, false); + + var permissions = Duplicati.Library.Utility.Utility.ParseBool(input["permissions"].Value, false); + var skip_metadata = Duplicati.Library.Utility.Utility.ParseBool(input["skip-metadata"].Value, false); + + var task = Runner.CreateRestoreTask(backup, filters, time, restoreTarget, overwrite, permissions, skip_metadata, passphrase); + + FIXMEGlobal.WorkThread.AddTask(task); + + info.OutputOK(new { TaskID = task.TaskID }); + } + + private void CreateReport(IBackup backup, RequestInfo info) + { + var task = Runner.CreateTask(DuplicatiOperation.CreateReport, backup); + FIXMEGlobal.WorkThread.AddTask(task); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + info.OutputOK(new { Status = "OK", ID = task.TaskID }); + } + + private void ReportRemoteSize(IBackup backup, RequestInfo info) + { + var task = Runner.CreateTask(DuplicatiOperation.ListRemote, backup); + FIXMEGlobal.WorkThread.AddTask(task); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + info.OutputOK(new { Status = "OK", ID = task.TaskID }); + } + + private void Repair(IBackup backup, RequestInfo info) + { + DoRepair(backup, info, false); + } + + private void RepairUpdate(IBackup backup, RequestInfo info) + { + DoRepair(backup, info, true); + } + + private void Vacuum(IBackup backup, RequestInfo info) + { + var task = Runner.CreateTask(DuplicatiOperation.Vacuum, backup); + FIXMEGlobal.WorkThread.AddTask(task); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + info.OutputOK(new { Status = "OK", ID = task.TaskID }); + } + + private void Verify(IBackup backup, RequestInfo info) + { + var task = Runner.CreateTask(DuplicatiOperation.Verify, backup); + FIXMEGlobal.WorkThread.AddTask(task); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + info.OutputOK(new {Status = "OK", ID = task.TaskID}); + } + + private void Compact(IBackup backup, RequestInfo info) + { + var task = Runner.CreateTask(DuplicatiOperation.Compact, backup); + FIXMEGlobal.WorkThread.AddTask(task); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + info.OutputOK(new { Status = "OK", ID = task.TaskID }); + } + + private string[] parsePaths(string paths) + { + string[] filters; + var rawpaths = (paths ?? string.Empty).Trim(); + + // We send the file list as a JSON array to avoid encoding issues with the path separator + // as it is an allowed character in file and path names. + // We also accept the old way, for compatibility with the greeno theme + if (!string.IsNullOrWhiteSpace(rawpaths) && rawpaths.StartsWith("[", StringComparison.Ordinal) && rawpaths.EndsWith("]", StringComparison.Ordinal)) + filters = Newtonsoft.Json.JsonConvert.DeserializeObject(rawpaths); + else + filters = paths.Split(new string[] { System.IO.Path.PathSeparator.ToString() }, StringSplitOptions.RemoveEmptyEntries); + + return filters; + } + + private void DoRepair(IBackup backup, RequestInfo info, bool repairUpdate) + { + var input = info.Request.Form; + string[] filters = null; + var extra = new Dictionary(); + if (input["only-paths"].Value != null) + extra["repair-only-paths"] = (Library.Utility.Utility.ParseBool(input["only-paths"].Value, false)).ToString(); + if (input["time"].Value != null) + extra["time"] = input["time"].Value; + if (input["version"].Value != null) + extra["version"] = input["version"].Value; + if (input["paths"].Value != null) + filters = parsePaths(input["paths"].Value); + + var task = Runner.CreateTask(repairUpdate ? DuplicatiOperation.RepairUpdate : DuplicatiOperation.Repair, backup, extra, filters); + FIXMEGlobal.WorkThread.AddTask(task); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + info.OutputOK(new {Status = "OK", ID = task.TaskID}); + } + + private void RunBackup(IBackup backup, RequestInfo info) + { + var t = FIXMEGlobal.WorkThread.CurrentTask; + var bt = t == null ? null : t.Backup; + if (bt != null && backup.ID == bt.ID) + { + // Already running + } + else if (FIXMEGlobal.WorkThread.CurrentTasks.Any(x => { + var bn = x?.Backup; + return bn == null || bn.ID == backup.ID; + })) + { + // Already in queue + } + else + { + FIXMEGlobal.WorkThread.AddTask(Runner.CreateTask(DuplicatiOperation.Backup, backup), true); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + info.OutputOK(); + } + + private void IsActive(IBackup backup, RequestInfo info) + { + var t = FIXMEGlobal.WorkThread.CurrentTask; + var bt = t?.Backup; + if (bt != null && backup.ID == bt.ID) + { + info.OutputOK(new { Status = "OK", Active = true }); + return; + } + else if (FIXMEGlobal.WorkThread.CurrentTasks.Any(x => + { + var bn = x?.Backup; + return bn == null || bn.ID == backup.ID; + })) + { + info.OutputOK(new { Status = "OK", Active = true }); + return; + } + else + { + info.OutputOK(new { Status = "OK", Active = false }); + return; + } + } + + private void UpdateDatabasePath(IBackup backup, RequestInfo info, bool move) + { + var np = info.Request.Form["path"].Value; + if (string.IsNullOrWhiteSpace(np)) + info.ReportClientError("No target path supplied", System.Net.HttpStatusCode.BadRequest); + else if (!Path.IsPathRooted(np)) + info.ReportClientError("Target path is relative, please supply a fully qualified path", System.Net.HttpStatusCode.BadRequest); + else + { + if (move && (File.Exists(np) || Directory.Exists(np))) + info.ReportClientError("A file already exists at the new location", System.Net.HttpStatusCode.Conflict); + else + { + if (move) + File.Move(backup.DBPath, np); + + FIXMEGlobal.DataConnection.UpdateBackupDBPath(backup, np); + } + + } + + } + + public void GET(string key, RequestInfo info) + { + var parts = (key ?? "").Split(new char[] { '/' }, 2); + var bk = FIXMEGlobal.DataConnection.GetBackup(parts.First()); + if (bk == null) + info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); + else + { + if (parts.Length > 1) + { + var operation = parts.Last().Split(new char[] {'/'}).First().ToLowerInvariant(); + + switch (operation) + { + case "files": + var filter = parts.Last().Split(new char[] { '/' }, 2).Skip(1).FirstOrDefault(); + if (!string.IsNullOrWhiteSpace(info.Request.QueryString["filter"].Value)) + filter = info.Request.QueryString["filter"].Value; + SearchFiles(bk, filter, info); + return; + case "log": + FetchLogData(bk, info); + return; + case "remotelog": + FetchRemoteLogData(bk, info); + return; + case "filesets": + ListFileSets(bk, info); + return; + case "export": + Export(bk, info); + return; + case "isdbusedelsewhere": + IsDBUsedElseWhere(bk, info); + return; + case "isactive": + IsActive(bk, info); + return; + default: + info.ReportClientError(string.Format("Invalid component: {0}", operation), System.Net.HttpStatusCode.BadRequest); + return; + } + + } + + var scheduleId = FIXMEGlobal.DataConnection.GetScheduleIDsFromTags(new string[] { "ID=" + bk.ID }); + var schedule = scheduleId.Any() ? FIXMEGlobal.DataConnection.GetSchedule(scheduleId.First()) : null; + var sourcenames = SpecialFolders.GetSourceNames(bk); + + //TODO: Filter out the password in both settings and the target url + + info.OutputOK(new GetResponse() + { + success = true, + data = new GetResponse.GetResponseData { + Schedule = schedule, + Backup = bk, + DisplayNames = sourcenames + } + }); + } + } + + public void POST(string key, RequestInfo info) + { + var parts = (key ?? "").Split(new char[] { '/' }, 2); + var bk = FIXMEGlobal.DataConnection.GetBackup(parts.First()); + if (bk == null) + info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); + else + { + if (parts.Length > 1) + { + var operation = parts.Last().Split(new char[] { '/' }).First().ToLowerInvariant(); + + switch (operation) + { + case "deletedb": + System.IO.File.Delete(bk.DBPath); + info.OutputOK(); + return; + + case "movedb": + UpdateDatabasePath(bk, info, true); + return; + + case "updatedb": + UpdateDatabasePath(bk, info, false); + return; + + case "restore": + RestoreFiles(bk, info); + return; + + case "createreport": + CreateReport(bk, info); + return; + + case "repair": + Repair(bk, info); + return; + + case "repairupdate": + RepairUpdate(bk, info); + return; + + case "vacuum": + Vacuum(bk, info); + return; + + case "verify": + Verify(bk, info); + return; + + case "compact": + Compact(bk, info); + return; + + case "start": + case "run": + RunBackup(bk, info); + return; + + case "report-remote-size": + ReportRemoteSize(bk, info); + return; + + case "copytotemp": + var ipx = Serializer.Deserialize(new StringReader(Newtonsoft.Json.JsonConvert.SerializeObject(bk))); + + using(var tf = new Duplicati.Library.Utility.TempFile()) + ipx.DBPath = tf; + ipx.ID = null; + + info.OutputOK(new { status = "OK", ID = FIXMEGlobal.DataConnection.RegisterTemporaryBackup(ipx) }); + return; + } + } + + info.ReportClientError("Invalid request", System.Net.HttpStatusCode.BadRequest); + } + } + + public void PUT(string key, RequestInfo info) + { + string str = info.Request.Form["data"].Value; + if (string.IsNullOrWhiteSpace(str)) + str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); + + if (string.IsNullOrWhiteSpace(str)) + { + info.ReportClientError("Missing backup object", System.Net.HttpStatusCode.BadRequest); + return; + } + + Backups.AddOrUpdateBackupData data = null; + try + { + data = Serializer.Deserialize(new StringReader(str)); + if (data.Backup == null) + { + info.ReportClientError("Data object had no backup entry", System.Net.HttpStatusCode.BadRequest); + return; + } + + if (!string.IsNullOrEmpty(key)) + data.Backup.ID = key; + + if (string.IsNullOrEmpty(data.Backup.ID)) + { + info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.BadRequest); + return; + } + + + if (data.Backup.IsTemporary) + { + var backup = FIXMEGlobal.DataConnection.GetBackup(data.Backup.ID); + if (backup.IsTemporary) + throw new InvalidDataException("External is temporary but internal is not?"); + + FIXMEGlobal.DataConnection.UpdateTemporaryBackup(backup); + info.OutputOK(); + } + else + { + lock(FIXMEGlobal.DataConnection.m_lock) + { + var backup = FIXMEGlobal.DataConnection.GetBackup(data.Backup.ID); + if (backup == null) + { + info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); + return; + } + + if (FIXMEGlobal.DataConnection.Backups.Any(x => x.Name.Equals(data.Backup.Name, StringComparison.OrdinalIgnoreCase) && x.ID != data.Backup.ID)) + { + info.ReportClientError("There already exists a backup with the name: " + data.Backup.Name, System.Net.HttpStatusCode.Conflict); + return; + } + + var err = FIXMEGlobal.DataConnection.ValidateBackup(data.Backup, data.Schedule); + if (!string.IsNullOrWhiteSpace(err)) + { + info.ReportClientError(err, System.Net.HttpStatusCode.BadRequest); + return; + } + + //TODO: Merge in real passwords where the placeholder is found + FIXMEGlobal.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); + + } + + info.OutputOK(); + } + } + catch (Exception ex) + { + if (data == null) + info.ReportClientError(string.Format("Unable to parse backup or schedule object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); + else + info.ReportClientError(string.Format("Unable to save backup or schedule: {0}", ex.Message), System.Net.HttpStatusCode.InternalServerError); + } + } + + public void DELETE(string key, RequestInfo info) + { + var backup = FIXMEGlobal.DataConnection.GetBackup(key); + if (backup == null) + { + info.ReportClientError("Invalid or missing backup id", System.Net.HttpStatusCode.NotFound); + return; + } + + var delete_remote_files = Library.Utility.Utility.ParseBool(info.Request.Param["delete-remote-files"].Value, false); + + if (delete_remote_files) + { + var captcha_token = info.Request.Param["captcha-token"].Value; + var captcha_answer = info.Request.Param["captcha-answer"].Value; + if (string.IsNullOrWhiteSpace(captcha_token) || string.IsNullOrWhiteSpace(captcha_answer)) + { + info.ReportClientError("Missing captcha", System.Net.HttpStatusCode.Unauthorized); + return; + } + + if (!Captcha.SolvedCaptcha(captcha_token, "DELETE /backup/" + backup.ID, captcha_answer)) + { + info.ReportClientError("Invalid captcha", System.Net.HttpStatusCode.Forbidden); + return; + } + } + + if (FIXMEGlobal.WorkThread.Active) + { + try + { + //TODO: It's not safe to access the values like this, + //because the runner thread might interfere + var nt = FIXMEGlobal.WorkThread.CurrentTask; + if (backup.Equals(nt == null ? null : nt.Backup)) + { + bool force; + if (!bool.TryParse(info.Request.QueryString["force"].Value, out force)) + force = false; + + if (!force) + { + info.OutputError(new { status = "failed", reason = "backup-in-progress" }); + return; + } + + bool hasPaused = FIXMEGlobal.LiveControl.State == LiveControls.LiveControlState.Paused; + FIXMEGlobal.LiveControl.Pause(); + + for(int i = 0; i < 10; i++) + if (FIXMEGlobal.WorkThread.Active) + { + var t = FIXMEGlobal.WorkThread.CurrentTask; + if (backup.Equals(t == null ? null : t.Backup)) + System.Threading.Thread.Sleep(1000); + else + break; + } + else + break; + + if (FIXMEGlobal.WorkThread.Active) + { + var t = FIXMEGlobal.WorkThread.CurrentTask; + if (backup.Equals(t == null ? null : t.Backup)) + { + if (hasPaused) + FIXMEGlobal.LiveControl.Resume(); + info.OutputError(new { status = "failed", reason = "backup-unstoppable" }); + return; + } + } + + if (hasPaused) + FIXMEGlobal.LiveControl.Resume(); + } + } + catch (Exception ex) + { + info.OutputError(new { status = "error", message = ex.Message }); + return; + } + } + + var extra = new Dictionary(); + if (!string.IsNullOrWhiteSpace(info.Request.Param["delete-local-db"].Value)) + extra["delete-local-db"] = info.Request.Param["delete-local-db"].Value; + if (delete_remote_files) + extra["delete-remote-files"] = "true"; + + var task = Runner.CreateTask(DuplicatiOperation.Delete, backup, extra); + FIXMEGlobal.WorkThread.AddTask(task); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + info.OutputOK(new { Status = "OK", ID = task.TaskID }); + } + public string Description { get { return "Retrieves, updates or deletes an existing backup and schedule"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(GetResponse)), + new KeyValuePair(HttpServer.Method.Put, typeof(Backups.AddOrUpdateBackupData)), + new KeyValuePair(HttpServer.Method.Delete, typeof(long)) + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs b/Duplicati.Library.RestAPI/RESTMethods/BackupDefaults.cs similarity index 96% rename from Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs rename to Duplicati.Library.RestAPI/RESTMethods/BackupDefaults.cs index 521222397..99d7f22b7 100644 --- a/Duplicati/Server/WebServer/RESTMethods/BackupDefaults.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/BackupDefaults.cs @@ -1,136 +1,137 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using Duplicati.Library.Common.IO; -using Duplicati.Library.Utility; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class BackupDefaults : IRESTMethodGET - { - - private static readonly string LOGTAG = Library.Logging.Log.LogTagFromType(); - - public void GET(string key, RequestInfo info) - { - // Start with a scratch object - var o = new Newtonsoft.Json.Linq.JObject(); - - // Add application wide settings - o.Add("ApplicationOptions", new Newtonsoft.Json.Linq.JArray( - from n in Program.DataConnection.Settings - select Newtonsoft.Json.Linq.JObject.FromObject(n) - )); - - try - { - // Add built-in defaults - Newtonsoft.Json.Linq.JObject n; - using(var s = new System.IO.StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(typeof(Program), "newbackup.json"))) - n = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(s.ReadToEnd()); - - MergeJsonObjects(o, n); - } - catch (Exception e) - { - Library.Logging.Log.WriteErrorMessage(LOGTAG, "BackupDefaultsError", e, "Failed to locate embeded backup defaults"); - } - - try - { - // Add install defaults/overrides, if present - var path = SystemIO.IO_OS.PathCombine(Library.AutoUpdater.UpdaterManager.InstalledBaseDir, "newbackup.json"); - if (System.IO.File.Exists(path)) - { - Newtonsoft.Json.Linq.JObject n; - n = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(System.IO.File.ReadAllText(path)); - - MergeJsonObjects(o, n); - } - } - catch (Exception e) - { - Library.Logging.Log.WriteErrorMessage(LOGTAG, "BackupDefaultsError", e, "Failed to process newbackup.json"); - } - - info.OutputOK(new - { - success = true, - data = o - }); - } - - private static void MergeJsonObjects(Newtonsoft.Json.Linq.JObject self, Newtonsoft.Json.Linq.JObject other) - { - foreach(var p in other.Properties()) - { - var sp = self.Property(p.Name); - if (sp == null) - self.Add(p); - else - { - switch (p.Type) - { - // Primitives override - case Newtonsoft.Json.Linq.JTokenType.Boolean: - case Newtonsoft.Json.Linq.JTokenType.Bytes: - case Newtonsoft.Json.Linq.JTokenType.Comment: - case Newtonsoft.Json.Linq.JTokenType.Constructor: - case Newtonsoft.Json.Linq.JTokenType.Date: - case Newtonsoft.Json.Linq.JTokenType.Float: - case Newtonsoft.Json.Linq.JTokenType.Guid: - case Newtonsoft.Json.Linq.JTokenType.Integer: - case Newtonsoft.Json.Linq.JTokenType.String: - case Newtonsoft.Json.Linq.JTokenType.TimeSpan: - case Newtonsoft.Json.Linq.JTokenType.Uri: - case Newtonsoft.Json.Linq.JTokenType.None: - case Newtonsoft.Json.Linq.JTokenType.Null: - case Newtonsoft.Json.Linq.JTokenType.Undefined: - self.Replace(p); - break; - - // Arrays merge - case Newtonsoft.Json.Linq.JTokenType.Array: - if (sp.Type == Newtonsoft.Json.Linq.JTokenType.Array) - sp.Value = new Newtonsoft.Json.Linq.JArray(((Newtonsoft.Json.Linq.JArray)sp.Value).Union((Newtonsoft.Json.Linq.JArray)p.Value)); - else - { - var a = new Newtonsoft.Json.Linq.JArray(sp.Value); - sp.Value = new Newtonsoft.Json.Linq.JArray(a.Union((Newtonsoft.Json.Linq.JArray)p.Value)); - } - - break; - - // Objects merge - case Newtonsoft.Json.Linq.JTokenType.Object: - if (sp.Type == Newtonsoft.Json.Linq.JTokenType.Object) - MergeJsonObjects((Newtonsoft.Json.Linq.JObject)sp.Value, (Newtonsoft.Json.Linq.JObject)p.Value); - else - sp.Value = p.Value; - break; - - // Ignore other stuff - default: - break; - } - } - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using Duplicati.Library.Common.IO; +using Duplicati.Library.RestAPI; +using Duplicati.Library.Utility; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class BackupDefaults : IRESTMethodGET + { + + private static readonly string LOGTAG = Library.Logging.Log.LogTagFromType(); + + public void GET(string key, RequestInfo info) + { + // Start with a scratch object + var o = new Newtonsoft.Json.Linq.JObject(); + + // Add application wide settings + o.Add("ApplicationOptions", new Newtonsoft.Json.Linq.JArray( + from n in FIXMEGlobal.DataConnection.Settings + select Newtonsoft.Json.Linq.JObject.FromObject(n) + )); + + try + { + // Add built-in defaults + Newtonsoft.Json.Linq.JObject n; + using(var s = new System.IO.StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(typeof(FIXMEGlobal), "newbackup.json"))) + n = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(s.ReadToEnd()); + + MergeJsonObjects(o, n); + } + catch (Exception e) + { + Library.Logging.Log.WriteErrorMessage(LOGTAG, "BackupDefaultsError", e, "Failed to locate embeded backup defaults"); + } + + try + { + // Add install defaults/overrides, if present + var path = SystemIO.IO_OS.PathCombine(Library.AutoUpdater.UpdaterManager.InstalledBaseDir, "newbackup.json"); + if (System.IO.File.Exists(path)) + { + Newtonsoft.Json.Linq.JObject n; + n = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(System.IO.File.ReadAllText(path)); + + MergeJsonObjects(o, n); + } + } + catch (Exception e) + { + Library.Logging.Log.WriteErrorMessage(LOGTAG, "BackupDefaultsError", e, "Failed to process newbackup.json"); + } + + info.OutputOK(new + { + success = true, + data = o + }); + } + + private static void MergeJsonObjects(Newtonsoft.Json.Linq.JObject self, Newtonsoft.Json.Linq.JObject other) + { + foreach(var p in other.Properties()) + { + var sp = self.Property(p.Name); + if (sp == null) + self.Add(p); + else + { + switch (p.Type) + { + // Primitives override + case Newtonsoft.Json.Linq.JTokenType.Boolean: + case Newtonsoft.Json.Linq.JTokenType.Bytes: + case Newtonsoft.Json.Linq.JTokenType.Comment: + case Newtonsoft.Json.Linq.JTokenType.Constructor: + case Newtonsoft.Json.Linq.JTokenType.Date: + case Newtonsoft.Json.Linq.JTokenType.Float: + case Newtonsoft.Json.Linq.JTokenType.Guid: + case Newtonsoft.Json.Linq.JTokenType.Integer: + case Newtonsoft.Json.Linq.JTokenType.String: + case Newtonsoft.Json.Linq.JTokenType.TimeSpan: + case Newtonsoft.Json.Linq.JTokenType.Uri: + case Newtonsoft.Json.Linq.JTokenType.None: + case Newtonsoft.Json.Linq.JTokenType.Null: + case Newtonsoft.Json.Linq.JTokenType.Undefined: + self.Replace(p); + break; + + // Arrays merge + case Newtonsoft.Json.Linq.JTokenType.Array: + if (sp.Type == Newtonsoft.Json.Linq.JTokenType.Array) + sp.Value = new Newtonsoft.Json.Linq.JArray(((Newtonsoft.Json.Linq.JArray)sp.Value).Union((Newtonsoft.Json.Linq.JArray)p.Value)); + else + { + var a = new Newtonsoft.Json.Linq.JArray(sp.Value); + sp.Value = new Newtonsoft.Json.Linq.JArray(a.Union((Newtonsoft.Json.Linq.JArray)p.Value)); + } + + break; + + // Objects merge + case Newtonsoft.Json.Linq.JTokenType.Object: + if (sp.Type == Newtonsoft.Json.Linq.JTokenType.Object) + MergeJsonObjects((Newtonsoft.Json.Linq.JObject)sp.Value, (Newtonsoft.Json.Linq.JObject)p.Value); + else + sp.Value = p.Value; + break; + + // Ignore other stuff + default: + break; + } + } + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Backups.cs b/Duplicati.Library.RestAPI/RESTMethods/Backups.cs similarity index 87% rename from Duplicati/Server/WebServer/RESTMethods/Backups.cs rename to Duplicati.Library.RestAPI/RESTMethods/Backups.cs index 91c028013..3bcbfcce1 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Backups.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Backups.cs @@ -1,299 +1,300 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Collections.Generic; -using Duplicati.Server.Serialization; -using System.IO; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Backups : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented - { - public class AddOrUpdateBackupData - { - public Boolean IsUnencryptedOrPassphraseStored { get; set;} - public Database.Schedule Schedule { get; set;} - public Database.Backup Backup { get; set;} - } - - public void GET(string key, RequestInfo info) - { - var schedules = Program.DataConnection.Schedules; - var backups = Program.DataConnection.Backups; - - var all = from n in backups - select new AddOrUpdateBackupData { - IsUnencryptedOrPassphraseStored = Program.DataConnection.IsUnencryptedOrPassphraseStored(long.Parse(n.ID)), - Backup = (Database.Backup)n, - Schedule = - (from x in schedules - where x.Tags != null && x.Tags.Contains("ID=" + n.ID) - select (Database.Schedule)x).FirstOrDefault() - }; - - info.BodyWriter.OutputOK(all.ToArray()); - } - - private void ImportBackup(RequestInfo info) - { - var output_template = ""; - //output_template = ""; - try - { - var input = info.Request.Form; - var cmdline = Library.Utility.Utility.ParseBool(input["cmdline"].Value, false); - var import_metadata = Library.Utility.Utility.ParseBool(input["import_metadata"].Value, false); - var direct = Library.Utility.Utility.ParseBool(input["direct"].Value, false); - output_template = output_template.Replace("CBM", input["callback"].Value); - if (cmdline) - { - info.Response.ContentType = "text/html"; - info.BodyWriter.Write(output_template.Replace("MSG", "Import from commandline not yet implemented")); - } - else - { - var file = info.Request.Form.GetFile("config"); - if (file == null) - throw new Exception("No file uploaded"); - - Serializable.ImportExportStructure ipx = Backups.LoadConfiguration(file.Filename, import_metadata, () => input["passphrase"].Value); - if (direct) - { - lock (Program.DataConnection.m_lock) - { - var basename = ipx.Backup.Name; - var c = 0; - while (c++ < 100 && Program.DataConnection.Backups.Any(x => x.Name.Equals(ipx.Backup.Name, StringComparison.OrdinalIgnoreCase))) - ipx.Backup.Name = basename + " (" + c.ToString() + ")"; - - if (Program.DataConnection.Backups.Any(x => x.Name.Equals(ipx.Backup.Name, StringComparison.OrdinalIgnoreCase))) - { - info.BodyWriter.SetOK(); - info.Response.ContentType = "text/html"; - info.BodyWriter.Write(output_template.Replace("MSG", "There already exists a backup with the name: " + basename.Replace("\'", "\\'"))); - } - - var err = Program.DataConnection.ValidateBackup(ipx.Backup, ipx.Schedule); - if (!string.IsNullOrWhiteSpace(err)) - { - info.ReportClientError(err, System.Net.HttpStatusCode.BadRequest); - return; - } - - Program.DataConnection.AddOrUpdateBackupAndSchedule(ipx.Backup, ipx.Schedule); - } - - info.Response.ContentType = "text/html"; - info.BodyWriter.Write(output_template.Replace("MSG", "OK")); - - } - else - { - using (var sw = new StringWriter()) - { - Serializer.SerializeJson(sw, ipx, true); - output_template = output_template.Replace("'JSO'", sw.ToString()); - } - info.BodyWriter.Write(output_template.Replace("MSG", "Import completed, but a browser issue prevents loading the contents. Try using the direct import method instead.")); - } - } - } - catch (Exception ex) - { - Program.DataConnection.LogError("", "Failed to import backup", ex); - info.Response.ContentType = "text/html"; - info.BodyWriter.Write(output_template.Replace("MSG", ex.Message.Replace("\'", "\\'").Replace("\r", "\\r").Replace("\n", "\\n"))); - } - } - - public static Serializable.ImportExportStructure ImportBackup(string configurationFile, bool importMetadata, Func getPassword, Dictionary advancedOptions) - { - // This removes the ID and DBPath from the backup configuration. - Serializable.ImportExportStructure importedStructure = Backups.LoadConfiguration(configurationFile, importMetadata, getPassword); - - // This will create the Duplicati-server.sqlite database file if it doesn't exist. - using (Duplicati.Server.Database.Connection connection = Program.GetDatabaseConnection(advancedOptions)) - { - if (connection.Backups.Any(x => x.Name.Equals(importedStructure.Backup.Name, StringComparison.OrdinalIgnoreCase))) - { - throw new InvalidOperationException($"A backup with the name {importedStructure.Backup.Name} already exists."); - } - - string error = connection.ValidateBackup(importedStructure.Backup, importedStructure.Schedule); - if (!string.IsNullOrWhiteSpace(error)) - { - throw new InvalidOperationException(error); - } - - // This creates a new ID and DBPath. - connection.AddOrUpdateBackupAndSchedule(importedStructure.Backup, importedStructure.Schedule); - } - - return importedStructure; - } - - private static Serializable.ImportExportStructure LoadConfiguration(string filename, bool importMetadata, Func getPassword) - { - Serializable.ImportExportStructure ipx; - - var buf = new byte[3]; - using (var fs = System.IO.File.OpenRead(filename)) - { - Duplicati.Library.Utility.Utility.ForceStreamRead(fs, buf, buf.Length); - - fs.Position = 0; - if (buf[0] == 'A' && buf[1] == 'E' && buf[2] == 'S') - { - using (var m = new Duplicati.Library.Encryption.AESEncryption(getPassword(), new Dictionary())) - { - using (var m2 = m.Decrypt(fs)) - { - using (var sr = new System.IO.StreamReader(m2)) - { - ipx = Serializer.Deserialize(sr); - } - } - } - } - else - { - using (var sr = new System.IO.StreamReader(fs)) - { - ipx = Serializer.Deserialize(sr); - } - } - } - - if (ipx.Backup == null) - { - throw new Exception("No backup found in document"); - } - - if (ipx.Backup.Metadata == null) - { - ipx.Backup.Metadata = new Dictionary(); - } - - if (!importMetadata) - { - ipx.Backup.Metadata.Clear(); - } - - ipx.Backup.ID = null; - ipx.Backup.DBPath = null; - - if (ipx.Schedule != null) - { - ipx.Schedule.ID = -1; - } - - return ipx; - } - - public void POST(string key, RequestInfo info) - { - if ("import".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - ImportBackup(info); - return; - } - - AddOrUpdateBackupData data = null; - try - { - var str = info.Request.Form["data"].Value; - if (string.IsNullOrWhiteSpace(str)) - str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); - - data = Serializer.Deserialize(new StringReader(str)); - if (data.Backup == null) - { - info.ReportClientError("Data object had no backup entry", System.Net.HttpStatusCode.BadRequest); - return; - } - - data.Backup.ID = null; - - if (Duplicati.Library.Utility.Utility.ParseBool(info.Request.Form["temporary"].Value, false)) - { - using(var tf = new Duplicati.Library.Utility.TempFile()) - data.Backup.DBPath = tf; - - data.Backup.Filters = data.Backup.Filters ?? new Duplicati.Server.Serialization.Interface.IFilter[0]; - data.Backup.Settings = data.Backup.Settings ?? new Duplicati.Server.Serialization.Interface.ISetting[0]; - - Program.DataConnection.RegisterTemporaryBackup(data.Backup); - - info.OutputOK(new { status = "OK", ID = data.Backup.ID }); - } - else - { - if (Library.Utility.Utility.ParseBool(info.Request.Form["existing_db"].Value, false)) - { - data.Backup.DBPath = Library.Main.DatabaseLocator.GetDatabasePath(data.Backup.TargetURL, null, false, false); - if (string.IsNullOrWhiteSpace(data.Backup.DBPath)) - throw new Exception("Unable to find remote db path?"); - } - - - lock(Program.DataConnection.m_lock) - { - if (Program.DataConnection.Backups.Any(x => x.Name.Equals(data.Backup.Name, StringComparison.OrdinalIgnoreCase))) - { - info.ReportClientError("There already exists a backup with the name: " + data.Backup.Name, System.Net.HttpStatusCode.Conflict); - return; - } - - var err = Program.DataConnection.ValidateBackup(data.Backup, data.Schedule); - if (!string.IsNullOrWhiteSpace(err)) - { - info.ReportClientError(err, System.Net.HttpStatusCode.BadRequest); - return; - } - - Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); - } - - info.OutputOK(new { status = "OK", ID = data.Backup.ID }); - } - } - catch (Exception ex) - { - if (data == null) - info.ReportClientError(string.Format("Unable to parse backup or schedule object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); - else - info.ReportClientError(string.Format("Unable to save schedule or backup object: {0}", ex.Message), System.Net.HttpStatusCode.InternalServerError); - } - } - - - public string Description { get { return "Return a list of current backups and their schedules"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(AddOrUpdateBackupData[])), - new KeyValuePair(HttpServer.Method.Post, typeof(AddOrUpdateBackupData)) - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Collections.Generic; +using Duplicati.Server.Serialization; +using System.IO; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Backups : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented + { + public class AddOrUpdateBackupData + { + public Boolean IsUnencryptedOrPassphraseStored { get; set;} + public Database.Schedule Schedule { get; set;} + public Database.Backup Backup { get; set;} + } + + public void GET(string key, RequestInfo info) + { + var schedules = FIXMEGlobal.DataConnection.Schedules; + var backups = FIXMEGlobal.DataConnection.Backups; + + var all = from n in backups + select new AddOrUpdateBackupData { + IsUnencryptedOrPassphraseStored = FIXMEGlobal.DataConnection.IsUnencryptedOrPassphraseStored(long.Parse(n.ID)), + Backup = (Database.Backup)n, + Schedule = + (from x in schedules + where x.Tags != null && x.Tags.Contains("ID=" + n.ID) + select (Database.Schedule)x).FirstOrDefault() + }; + + info.BodyWriter.OutputOK(all.ToArray()); + } + + private void ImportBackup(RequestInfo info) + { + var output_template = ""; + //output_template = ""; + try + { + var input = info.Request.Form; + var cmdline = Library.Utility.Utility.ParseBool(input["cmdline"].Value, false); + var import_metadata = Library.Utility.Utility.ParseBool(input["import_metadata"].Value, false); + var direct = Library.Utility.Utility.ParseBool(input["direct"].Value, false); + output_template = output_template.Replace("CBM", input["callback"].Value); + if (cmdline) + { + info.Response.ContentType = "text/html"; + info.BodyWriter.Write(output_template.Replace("MSG", "Import from commandline not yet implemented")); + } + else + { + var file = info.Request.Form.GetFile("config"); + if (file == null) + throw new Exception("No file uploaded"); + + Serializable.ImportExportStructure ipx = Backups.LoadConfiguration(file.Filename, import_metadata, () => input["passphrase"].Value); + if (direct) + { + lock (FIXMEGlobal.DataConnection.m_lock) + { + var basename = ipx.Backup.Name; + var c = 0; + while (c++ < 100 && FIXMEGlobal.DataConnection.Backups.Any(x => x.Name.Equals(ipx.Backup.Name, StringComparison.OrdinalIgnoreCase))) + ipx.Backup.Name = basename + " (" + c.ToString() + ")"; + + if (FIXMEGlobal.DataConnection.Backups.Any(x => x.Name.Equals(ipx.Backup.Name, StringComparison.OrdinalIgnoreCase))) + { + info.BodyWriter.SetOK(); + info.Response.ContentType = "text/html"; + info.BodyWriter.Write(output_template.Replace("MSG", "There already exists a backup with the name: " + basename.Replace("\'", "\\'"))); + } + + var err = FIXMEGlobal.DataConnection.ValidateBackup(ipx.Backup, ipx.Schedule); + if (!string.IsNullOrWhiteSpace(err)) + { + info.ReportClientError(err, System.Net.HttpStatusCode.BadRequest); + return; + } + + FIXMEGlobal.DataConnection.AddOrUpdateBackupAndSchedule(ipx.Backup, ipx.Schedule); + } + + info.Response.ContentType = "text/html"; + info.BodyWriter.Write(output_template.Replace("MSG", "OK")); + + } + else + { + using (var sw = new StringWriter()) + { + Serializer.SerializeJson(sw, ipx, true); + output_template = output_template.Replace("'JSO'", sw.ToString()); + } + info.BodyWriter.Write(output_template.Replace("MSG", "Import completed, but a browser issue prevents loading the contents. Try using the direct import method instead.")); + } + } + } + catch (Exception ex) + { + FIXMEGlobal.DataConnection.LogError("", "Failed to import backup", ex); + info.Response.ContentType = "text/html"; + info.BodyWriter.Write(output_template.Replace("MSG", ex.Message.Replace("\'", "\\'").Replace("\r", "\\r").Replace("\n", "\\n"))); + } + } + + public static Serializable.ImportExportStructure ImportBackup(string configurationFile, bool importMetadata, Func getPassword, Dictionary advancedOptions) + { + // This removes the ID and DBPath from the backup configuration. + Serializable.ImportExportStructure importedStructure = Backups.LoadConfiguration(configurationFile, importMetadata, getPassword); + + // This will create the Duplicati-server.sqlite database file if it doesn't exist. + using (Duplicati.Server.Database.Connection connection = FIXMEGlobal.GetDatabaseConnection(advancedOptions)) + { + if (connection.Backups.Any(x => x.Name.Equals(importedStructure.Backup.Name, StringComparison.OrdinalIgnoreCase))) + { + throw new InvalidOperationException($"A backup with the name {importedStructure.Backup.Name} already exists."); + } + + string error = connection.ValidateBackup(importedStructure.Backup, importedStructure.Schedule); + if (!string.IsNullOrWhiteSpace(error)) + { + throw new InvalidOperationException(error); + } + + // This creates a new ID and DBPath. + connection.AddOrUpdateBackupAndSchedule(importedStructure.Backup, importedStructure.Schedule); + } + + return importedStructure; + } + + private static Serializable.ImportExportStructure LoadConfiguration(string filename, bool importMetadata, Func getPassword) + { + Serializable.ImportExportStructure ipx; + + var buf = new byte[3]; + using (var fs = System.IO.File.OpenRead(filename)) + { + Duplicati.Library.Utility.Utility.ForceStreamRead(fs, buf, buf.Length); + + fs.Position = 0; + if (buf[0] == 'A' && buf[1] == 'E' && buf[2] == 'S') + { + using (var m = new Duplicati.Library.Encryption.AESEncryption(getPassword(), new Dictionary())) + { + using (var m2 = m.Decrypt(fs)) + { + using (var sr = new System.IO.StreamReader(m2)) + { + ipx = Serializer.Deserialize(sr); + } + } + } + } + else + { + using (var sr = new System.IO.StreamReader(fs)) + { + ipx = Serializer.Deserialize(sr); + } + } + } + + if (ipx.Backup == null) + { + throw new Exception("No backup found in document"); + } + + if (ipx.Backup.Metadata == null) + { + ipx.Backup.Metadata = new Dictionary(); + } + + if (!importMetadata) + { + ipx.Backup.Metadata.Clear(); + } + + ipx.Backup.ID = null; + ipx.Backup.DBPath = null; + + if (ipx.Schedule != null) + { + ipx.Schedule.ID = -1; + } + + return ipx; + } + + public void POST(string key, RequestInfo info) + { + if ("import".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + ImportBackup(info); + return; + } + + AddOrUpdateBackupData data = null; + try + { + var str = info.Request.Form["data"].Value; + if (string.IsNullOrWhiteSpace(str)) + str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); + + data = Serializer.Deserialize(new StringReader(str)); + if (data.Backup == null) + { + info.ReportClientError("Data object had no backup entry", System.Net.HttpStatusCode.BadRequest); + return; + } + + data.Backup.ID = null; + + if (Duplicati.Library.Utility.Utility.ParseBool(info.Request.Form["temporary"].Value, false)) + { + using(var tf = new Duplicati.Library.Utility.TempFile()) + data.Backup.DBPath = tf; + + data.Backup.Filters = data.Backup.Filters ?? new Duplicati.Server.Serialization.Interface.IFilter[0]; + data.Backup.Settings = data.Backup.Settings ?? new Duplicati.Server.Serialization.Interface.ISetting[0]; + + FIXMEGlobal.DataConnection.RegisterTemporaryBackup(data.Backup); + + info.OutputOK(new { status = "OK", ID = data.Backup.ID }); + } + else + { + if (Library.Utility.Utility.ParseBool(info.Request.Form["existing_db"].Value, false)) + { + data.Backup.DBPath = Library.Main.DatabaseLocator.GetDatabasePath(data.Backup.TargetURL, null, false, false); + if (string.IsNullOrWhiteSpace(data.Backup.DBPath)) + throw new Exception("Unable to find remote db path?"); + } + + + lock(FIXMEGlobal.DataConnection.m_lock) + { + if (FIXMEGlobal.DataConnection.Backups.Any(x => x.Name.Equals(data.Backup.Name, StringComparison.OrdinalIgnoreCase))) + { + info.ReportClientError("There already exists a backup with the name: " + data.Backup.Name, System.Net.HttpStatusCode.Conflict); + return; + } + + var err = FIXMEGlobal.DataConnection.ValidateBackup(data.Backup, data.Schedule); + if (!string.IsNullOrWhiteSpace(err)) + { + info.ReportClientError(err, System.Net.HttpStatusCode.BadRequest); + return; + } + + FIXMEGlobal.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); + } + + info.OutputOK(new { status = "OK", ID = data.Backup.ID }); + } + } + catch (Exception ex) + { + if (data == null) + info.ReportClientError(string.Format("Unable to parse backup or schedule object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); + else + info.ReportClientError(string.Format("Unable to save schedule or backup object: {0}", ex.Message), System.Net.HttpStatusCode.InternalServerError); + } + } + + + public string Description { get { return "Return a list of current backups and their schedules"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(AddOrUpdateBackupData[])), + new KeyValuePair(HttpServer.Method.Post, typeof(AddOrUpdateBackupData)) + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/BugReport.cs b/Duplicati.Library.RestAPI/RESTMethods/BugReport.cs similarity index 93% rename from Duplicati/Server/WebServer/RESTMethods/BugReport.cs rename to Duplicati.Library.RestAPI/RESTMethods/BugReport.cs index 61aef7a55..d476d72e9 100644 --- a/Duplicati/Server/WebServer/RESTMethods/BugReport.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/BugReport.cs @@ -1,57 +1,58 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class BugReport : IRESTMethodGET - { - public void GET(string key, RequestInfo info) - { - long id; - long.TryParse(key, out id); - - var tf = Program.DataConnection.GetTempFiles().FirstOrDefault(x => x.ID == id); - if (tf == null) - { - info.ReportClientError("Invalid or missing bugreport id", System.Net.HttpStatusCode.NotFound); - return; - } - - if (!System.IO.File.Exists(tf.Path)) - { - info.ReportClientError("File is missing", System.Net.HttpStatusCode.NotFound); - return; - } - - var filename = "bugreport.zip"; - using(var fs = System.IO.File.OpenRead(tf.Path)) - { - info.Response.ContentLength = fs.Length; - info.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename)); - info.Response.ContentType = "application/octet-stream"; - - info.BodyWriter.SetOK(); - info.Response.SendHeaders(); - fs.CopyTo(info.Response.Body); - info.Response.Send(); - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Linq; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class BugReport : IRESTMethodGET + { + public void GET(string key, RequestInfo info) + { + long id; + long.TryParse(key, out id); + + var tf = FIXMEGlobal.DataConnection.GetTempFiles().FirstOrDefault(x => x.ID == id); + if (tf == null) + { + info.ReportClientError("Invalid or missing bugreport id", System.Net.HttpStatusCode.NotFound); + return; + } + + if (!System.IO.File.Exists(tf.Path)) + { + info.ReportClientError("File is missing", System.Net.HttpStatusCode.NotFound); + return; + } + + var filename = "bugreport.zip"; + using(var fs = System.IO.File.OpenRead(tf.Path)) + { + info.Response.ContentLength = fs.Length; + info.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename)); + info.Response.ContentType = "application/octet-stream"; + + info.BodyWriter.SetOK(); + info.Response.SendHeaders(); + fs.CopyTo(info.Response.Body); + info.Response.Send(); + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Captcha.cs b/Duplicati.Library.RestAPI/RESTMethods/Captcha.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/Captcha.cs rename to Duplicati.Library.RestAPI/RESTMethods/Captcha.cs index 41d7a1ac6..67b708364 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Captcha.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Captcha.cs @@ -1,168 +1,168 @@ -// Copyright (C) 2016, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Captcha : IRESTMethodGET, IRESTMethodPOST - { - private class CaptchaEntry - { - public readonly string Answer; - public readonly string Target; - public int Attempts; - public readonly DateTime Expires; - - public CaptchaEntry(string answer, string target) - { - Answer = answer; - Target = target; - Attempts = 4; - Expires = DateTime.Now.AddMinutes(2); - } - } - - private static readonly object m_lock = new object(); - private static readonly Dictionary m_captchas = new Dictionary(); - - public static bool SolvedCaptcha(string token, string target, string answer) - { - lock(m_lock) - { - CaptchaEntry tp; - m_captchas.TryGetValue(token ?? string.Empty, out tp); - if (tp == null) - return false; - - if (tp.Attempts > 0) - tp.Attempts--; - - return tp.Attempts >= 0 && string.Equals(tp.Answer, answer, StringComparison.OrdinalIgnoreCase) && tp.Target == target && tp.Expires >= DateTime.Now; - } - } - - public void GET(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - info.ReportClientError("Missing token value", System.Net.HttpStatusCode.Unauthorized); - return; - } - else - { - string answer = null; - lock (m_lock) - { - CaptchaEntry tp; - m_captchas.TryGetValue(key, out tp); - if (tp != null && tp.Expires > DateTime.Now) - answer = tp.Answer; - } - - if (string.IsNullOrWhiteSpace(answer)) - { - info.ReportClientError("No such entry", System.Net.HttpStatusCode.NotFound); - return; - } - - using (var bmp = CaptchaUtil.CreateCaptcha(answer)) - using (var ms = new System.IO.MemoryStream()) - { - info.Response.ContentType = "image/jpeg"; - info.Response.ContentLength = ms.Length; - bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); - ms.Position = 0; - - info.Response.ContentType = "image/jpeg"; - info.Response.ContentLength = ms.Length; - info.Response.SendHeaders(); - ms.CopyTo(info.Response.Body); - info.Response.Send(); - } - } - } - - public void POST(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - var target = info.Request.Param["target"].Value; - if (string.IsNullOrWhiteSpace(target)) - { - info.ReportClientError("Missing target parameter", System.Net.HttpStatusCode.BadRequest); - return; - } - - var answer = CaptchaUtil.CreateRandomAnswer(minlength: 6, maxlength: 6); - var nonce = Guid.NewGuid().ToString(); - - string token; - using (var ms = new System.IO.MemoryStream()) - { - var bytes = System.Text.Encoding.UTF8.GetBytes(answer + nonce); - ms.Write(bytes, 0, bytes.Length); - ms.Position = 0; - using(var hasher = Library.Utility.HashFactory.CreateHasher(Library.Utility.HashFactory.SHA256)){ - token = Library.Utility.Utility.Base64PlainToBase64Url(Convert.ToBase64String(hasher.ComputeHash(ms))); - } - } - - lock (m_lock) - { - var expired = m_captchas.Where(x => x.Value.Expires < DateTime.Now).Select(x => x.Key).ToArray(); - foreach (var x in expired) - m_captchas.Remove(x); - - if (m_captchas.Count > 3) - { - info.ReportClientError("Too many captchas, wait 2 minutes and try again", System.Net.HttpStatusCode.ServiceUnavailable); - return; - } - - m_captchas[token] = new CaptchaEntry(answer, target); - } - - info.OutputOK(new - { - token = token - }); - } - else - { - var answer = info.Request.Param["answer"].Value; - var target = info.Request.Param["target"].Value; - if (string.IsNullOrWhiteSpace(answer)) - { - info.ReportClientError("Missing answer parameter", System.Net.HttpStatusCode.BadRequest); - return; - } - if (string.IsNullOrWhiteSpace(target)) - { - info.ReportClientError("Missing target parameter", System.Net.HttpStatusCode.BadRequest); - return; - } - - if (SolvedCaptcha(key, target, answer)) - info.OutputOK(); - else - info.ReportClientError("Incorrect", System.Net.HttpStatusCode.Forbidden); - } - } - } -} +// Copyright (C) 2016, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Collections.Generic; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Captcha : IRESTMethodGET, IRESTMethodPOST + { + private class CaptchaEntry + { + public readonly string Answer; + public readonly string Target; + public int Attempts; + public readonly DateTime Expires; + + public CaptchaEntry(string answer, string target) + { + Answer = answer; + Target = target; + Attempts = 4; + Expires = DateTime.Now.AddMinutes(2); + } + } + + private static readonly object m_lock = new object(); + private static readonly Dictionary m_captchas = new Dictionary(); + + public static bool SolvedCaptcha(string token, string target, string answer) + { + lock(m_lock) + { + CaptchaEntry tp; + m_captchas.TryGetValue(token ?? string.Empty, out tp); + if (tp == null) + return false; + + if (tp.Attempts > 0) + tp.Attempts--; + + return tp.Attempts >= 0 && string.Equals(tp.Answer, answer, StringComparison.OrdinalIgnoreCase) && tp.Target == target && tp.Expires >= DateTime.Now; + } + } + + public void GET(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + info.ReportClientError("Missing token value", System.Net.HttpStatusCode.Unauthorized); + return; + } + else + { + string answer = null; + lock (m_lock) + { + CaptchaEntry tp; + m_captchas.TryGetValue(key, out tp); + if (tp != null && tp.Expires > DateTime.Now) + answer = tp.Answer; + } + + if (string.IsNullOrWhiteSpace(answer)) + { + info.ReportClientError("No such entry", System.Net.HttpStatusCode.NotFound); + return; + } + + using (var bmp = CaptchaUtil.CreateCaptcha(answer)) + using (var ms = new System.IO.MemoryStream()) + { + info.Response.ContentType = "image/jpeg"; + info.Response.ContentLength = ms.Length; + bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); + ms.Position = 0; + + info.Response.ContentType = "image/jpeg"; + info.Response.ContentLength = ms.Length; + info.Response.SendHeaders(); + ms.CopyTo(info.Response.Body); + info.Response.Send(); + } + } + } + + public void POST(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + var target = info.Request.Param["target"].Value; + if (string.IsNullOrWhiteSpace(target)) + { + info.ReportClientError("Missing target parameter", System.Net.HttpStatusCode.BadRequest); + return; + } + + var answer = CaptchaUtil.CreateRandomAnswer(minlength: 6, maxlength: 6); + var nonce = Guid.NewGuid().ToString(); + + string token; + using (var ms = new System.IO.MemoryStream()) + { + var bytes = System.Text.Encoding.UTF8.GetBytes(answer + nonce); + ms.Write(bytes, 0, bytes.Length); + ms.Position = 0; + using(var hasher = Library.Utility.HashFactory.CreateHasher(Library.Utility.HashFactory.SHA256)){ + token = Library.Utility.Utility.Base64PlainToBase64Url(Convert.ToBase64String(hasher.ComputeHash(ms))); + } + } + + lock (m_lock) + { + var expired = m_captchas.Where(x => x.Value.Expires < DateTime.Now).Select(x => x.Key).ToArray(); + foreach (var x in expired) + m_captchas.Remove(x); + + if (m_captchas.Count > 3) + { + info.ReportClientError("Too many captchas, wait 2 minutes and try again", System.Net.HttpStatusCode.ServiceUnavailable); + return; + } + + m_captchas[token] = new CaptchaEntry(answer, target); + } + + info.OutputOK(new + { + token = token + }); + } + else + { + var answer = info.Request.Param["answer"].Value; + var target = info.Request.Param["target"].Value; + if (string.IsNullOrWhiteSpace(answer)) + { + info.ReportClientError("Missing answer parameter", System.Net.HttpStatusCode.BadRequest); + return; + } + if (string.IsNullOrWhiteSpace(target)) + { + info.ReportClientError("Missing target parameter", System.Net.HttpStatusCode.BadRequest); + return; + } + + if (SolvedCaptcha(key, target, answer)) + info.OutputOK(); + else + info.ReportClientError("Incorrect", System.Net.HttpStatusCode.Forbidden); + } + } + } +} diff --git a/Duplicati/Server/WebServer/RESTMethods/Changelog.cs b/Duplicati.Library.RestAPI/RESTMethods/Changelog.cs similarity index 94% rename from Duplicati/Server/WebServer/RESTMethods/Changelog.cs rename to Duplicati.Library.RestAPI/RESTMethods/Changelog.cs index 6adb73f0c..202870ee9 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Changelog.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Changelog.cs @@ -1,74 +1,75 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Changelog : IRESTMethodGET, IRESTMethodDocumented - { - private class GetResponse - { - public string Status; - public string Version; - public string Changelog; - } - - public void GET(string key, RequestInfo info) - { - var fromUpdate = info.Request.QueryString["from-update"].Value; - if (!Library.Utility.Utility.ParseBool(fromUpdate, false)) - { - var path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "changelog.txt"); - info.OutputOK(new GetResponse() { - Status = "OK", - Version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), - Changelog = System.IO.File.ReadAllText(path) - }); - } - else - { - var updateInfo = Program.DataConnection.ApplicationSettings.UpdatedVersion; - if (updateInfo == null) - { - info.ReportClientError("No update found", System.Net.HttpStatusCode.NotFound); - } - else - { - info.OutputOK(new GetResponse() { - Status = "OK", - Version = updateInfo.Version, - Changelog = updateInfo.ChangeInfo - }); - } - } - } - - public string Description { get { return "Gets the current changelog"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(GetResponse)), - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Collections.Generic; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Changelog : IRESTMethodGET, IRESTMethodDocumented + { + private class GetResponse + { + public string Status; + public string Version; + public string Changelog; + } + + public void GET(string key, RequestInfo info) + { + var fromUpdate = info.Request.QueryString["from-update"].Value; + if (!Library.Utility.Utility.ParseBool(fromUpdate, false)) + { + var path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "changelog.txt"); + info.OutputOK(new GetResponse() { + Status = "OK", + Version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), + Changelog = System.IO.File.ReadAllText(path) + }); + } + else + { + var updateInfo = FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion; + if (updateInfo == null) + { + info.ReportClientError("No update found", System.Net.HttpStatusCode.NotFound); + } + else + { + info.OutputOK(new GetResponse() { + Status = "OK", + Version = updateInfo.Version, + Changelog = updateInfo.ChangeInfo + }); + } + } + } + + public string Description { get { return "Gets the current changelog"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(GetResponse)), + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs b/Duplicati.Library.RestAPI/RESTMethods/CommandLine.cs similarity index 92% rename from Duplicati/Server/WebServer/RESTMethods/CommandLine.cs rename to Duplicati.Library.RestAPI/RESTMethods/CommandLine.cs index 00e6bb373..3b2d6a28a 100644 --- a/Duplicati/Server/WebServer/RESTMethods/CommandLine.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/CommandLine.cs @@ -1,283 +1,284 @@ -// Copyright (C) 2017, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class CommandLine : IRESTMethodGET, IRESTMethodPOST - { - private static readonly string LOGTAG = Library.Logging.Log.LogTagFromType(); - - private class LogWriter : System.IO.TextWriter - { - private readonly ActiveRun m_target; - private readonly StringBuilder m_sb = new StringBuilder(); - private int m_newlinechars = 0; - - public LogWriter(ActiveRun target) - { - m_target = target; - } - - public override Encoding Encoding { get { return System.Text.Encoding.UTF8; } } - - public override void Write(char value) - { - lock(m_target.Lock) - { - m_sb.Append(value); - if (NewLine[m_newlinechars] == value) - { - m_newlinechars++; - if (m_newlinechars == NewLine.Length) - WriteLine(string.Empty); - } - else - m_newlinechars = 0; - } - } - - public override void WriteLine(string value) - { - value = value ?? string.Empty; - lock(m_target.Lock) - { - m_target.LastAccess = DateTime.Now; - - //Avoid writing the log if it does not exist - if (m_target.IsLogDisposed) - { - Program.LogHandler.WriteMessage(new Library.Logging.LogEntry("Attempted to write message after closing: {0}", new object[] { value }, Library.Logging.LogMessageType.Warning, LOGTAG, "CommandLineOutputAfterLogClosed", null)); - return; - } - - try - { - if (m_sb.Length != 0) - { - m_target.Log.Add(m_sb + value); - m_sb.Length = 0; - m_newlinechars = 0; - } - else - { - m_target.Log.Add(value); - } - } - catch (Exception ex) - { - // This can happen on a very unlucky race where IsLogDisposed is set right after the check - Program.LogHandler.WriteMessage(new Library.Logging.LogEntry("Failed to forward commandline message: {0}", new object[] { value }, Library.Logging.LogMessageType.Warning, LOGTAG, "CommandLineOutputAfterLogClosed", ex)); - } - } - } - } - - private class ActiveRun - { - public readonly string ID = Guid.NewGuid().ToString(); - public DateTime LastAccess = DateTime.Now; - public readonly Library.Utility.FileBackedStringList Log = new Library.Utility.FileBackedStringList(); - public Runner.IRunnerData Task; - public LogWriter Writer; - public readonly object Lock = new object(); - public bool Finished = false; - public bool Started = false; - public bool IsLogDisposed = false; - public System.Threading.Thread Thread; - } - - private readonly Dictionary m_activeItems = new Dictionary(); - private System.Threading.Tasks.Task m_cleanupTask; - - public void POST(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - string[] args; - using (var sr = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) - args = Newtonsoft.Json.JsonConvert.DeserializeObject(sr.ReadToEnd()); - - var k = new ActiveRun(); - k.Writer = new LogWriter(k); - - m_activeItems[k.ID] = k; - StartCleanupTask(); - - k.Task = Runner.CreateCustomTask((sink) => - { - try - { - k.Thread = System.Threading.Thread.CurrentThread; - k.Started = true; - - var code = Duplicati.CommandLine.Program.RunCommandLine(k.Writer, k.Writer, c => { - k.Task.SetController(c); - c.AppendSink(sink); - }, args); - k.Writer.WriteLine("Return code: {0}", code); - } - catch (Exception ex) - { - var rx = ex; - if (rx is System.Reflection.TargetInvocationException) - rx = rx.InnerException; - - if (rx is Library.Interface.UserInformationException) - k.Log.Add(rx.Message); - else - k.Log.Add(rx.ToString()); - - throw rx; - } - finally - { - k.Finished = true; - k.Thread = null; - } - }); - - Program.WorkThread.AddTask(k.Task); - - info.OutputOK(new - { - ID = k.ID - }); - } - else - { - if (!key.EndsWith("/abort", StringComparison.OrdinalIgnoreCase)) - { - info.ReportClientError("Only abort commands are allowed", System.Net.HttpStatusCode.BadRequest); - return; - } - - key = key.Substring(0, key.Length - "/abort".Length); - if (string.IsNullOrWhiteSpace(key)) - { - info.ReportClientError("No task key found", System.Net.HttpStatusCode.BadRequest); - return; - } - - ActiveRun t; - if (!m_activeItems.TryGetValue(key, out t)) - { - info.OutputError(code: System.Net.HttpStatusCode.NotFound); - return; - } - - var tt = t.Task; - if (tt != null) - tt.Abort(); - - var tr = t.Thread; - if (tr != null) - tr.Interrupt(); - - info.OutputOK(); - } - } - - private void StartCleanupTask() - { - if (m_cleanupTask == null || m_cleanupTask.IsCompleted || m_cleanupTask.IsFaulted || m_cleanupTask.IsCanceled) - m_cleanupTask = RunCleanupAsync(); - } - - private async System.Threading.Tasks.Task RunCleanupAsync() - { - while (m_activeItems.Count > 0) - { - var oldest = m_activeItems.Values - .OrderBy(x => x.LastAccess) - .FirstOrDefault(); - - if (oldest != null) - { - // If the task has finished, we just wait a little to allow the UI to pick it up - var timeout = oldest.Finished ? TimeSpan.FromMinutes(5) : TimeSpan.FromDays(1); - if (DateTime.Now - oldest.LastAccess > timeout) - { - oldest.IsLogDisposed = true; - m_activeItems.Remove(oldest.ID); - oldest.Log.Dispose(); - - // Fix all expired, or stop running - continue; - } - } - - await System.Threading.Tasks.Task.Delay(TimeSpan.FromMinutes(1)).ConfigureAwait(false); - } - } - - public void GET(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - info.OutputOK( - Duplicati.CommandLine.Program.SupportedCommands - ); - } - else - { - ActiveRun t; - if (!m_activeItems.TryGetValue(key, out t)) - { - info.OutputError(code: System.Net.HttpStatusCode.NotFound); - return; - } - - int pagesize; - int offset; - - int.TryParse(info.Request.QueryString["pagesize"].Value, out pagesize); - int.TryParse(info.Request.QueryString["offset"].Value, out offset); - pagesize = Math.Max(10, Math.Min(500, pagesize)); - offset = Math.Max(0, offset); - var items = new List(); - long count; - bool started; - bool finished; - - lock(t.Lock) - { - t.LastAccess = DateTime.Now; - count = t.Log.Count; - offset = Math.Min((int)count, offset); - items.AddRange(t.Log.Skip(offset).Take(pagesize)); - finished = t.Finished; - started = t.Started; - } - - info.OutputOK(new - { - Pagesize = pagesize, - Offset = offset, - Count = count, - Items = items, - Finished = finished, - Started = started - }); - } - } - } -} +// Copyright (C) 2017, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class CommandLine : IRESTMethodGET, IRESTMethodPOST + { + private static readonly string LOGTAG = Library.Logging.Log.LogTagFromType(); + + private class LogWriter : System.IO.TextWriter + { + private readonly ActiveRun m_target; + private readonly StringBuilder m_sb = new StringBuilder(); + private int m_newlinechars = 0; + + public LogWriter(ActiveRun target) + { + m_target = target; + } + + public override Encoding Encoding { get { return System.Text.Encoding.UTF8; } } + + public override void Write(char value) + { + lock(m_target.Lock) + { + m_sb.Append(value); + if (NewLine[m_newlinechars] == value) + { + m_newlinechars++; + if (m_newlinechars == NewLine.Length) + WriteLine(string.Empty); + } + else + m_newlinechars = 0; + } + } + + public override void WriteLine(string value) + { + value = value ?? string.Empty; + lock(m_target.Lock) + { + m_target.LastAccess = DateTime.Now; + + //Avoid writing the log if it does not exist + if (m_target.IsLogDisposed) + { + FIXMEGlobal.LogHandler.WriteMessage(new Library.Logging.LogEntry("Attempted to write message after closing: {0}", new object[] { value }, Library.Logging.LogMessageType.Warning, LOGTAG, "CommandLineOutputAfterLogClosed", null)); + return; + } + + try + { + if (m_sb.Length != 0) + { + m_target.Log.Add(m_sb + value); + m_sb.Length = 0; + m_newlinechars = 0; + } + else + { + m_target.Log.Add(value); + } + } + catch (Exception ex) + { + // This can happen on a very unlucky race where IsLogDisposed is set right after the check + FIXMEGlobal.LogHandler.WriteMessage(new Library.Logging.LogEntry("Failed to forward commandline message: {0}", new object[] { value }, Library.Logging.LogMessageType.Warning, LOGTAG, "CommandLineOutputAfterLogClosed", ex)); + } + } + } + } + + private class ActiveRun + { + public readonly string ID = Guid.NewGuid().ToString(); + public DateTime LastAccess = DateTime.Now; + public readonly Library.Utility.FileBackedStringList Log = new Library.Utility.FileBackedStringList(); + public Runner.IRunnerData Task; + public LogWriter Writer; + public readonly object Lock = new object(); + public bool Finished = false; + public bool Started = false; + public bool IsLogDisposed = false; + public System.Threading.Thread Thread; + } + + private readonly Dictionary m_activeItems = new Dictionary(); + private System.Threading.Tasks.Task m_cleanupTask; + + public void POST(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + string[] args; + using (var sr = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) + args = Newtonsoft.Json.JsonConvert.DeserializeObject(sr.ReadToEnd()); + + var k = new ActiveRun(); + k.Writer = new LogWriter(k); + + m_activeItems[k.ID] = k; + StartCleanupTask(); + + k.Task = Runner.CreateCustomTask((sink) => + { + try + { + k.Thread = System.Threading.Thread.CurrentThread; + k.Started = true; + + var code = Duplicati.CommandLine.Program.RunCommandLine(k.Writer, k.Writer, c => { + k.Task.SetController(c); + c.AppendSink(sink); + }, args); + k.Writer.WriteLine("Return code: {0}", code); + } + catch (Exception ex) + { + var rx = ex; + if (rx is System.Reflection.TargetInvocationException) + rx = rx.InnerException; + + if (rx is Library.Interface.UserInformationException) + k.Log.Add(rx.Message); + else + k.Log.Add(rx.ToString()); + + throw rx; + } + finally + { + k.Finished = true; + k.Thread = null; + } + }); + + FIXMEGlobal.WorkThread.AddTask(k.Task); + + info.OutputOK(new + { + ID = k.ID + }); + } + else + { + if (!key.EndsWith("/abort", StringComparison.OrdinalIgnoreCase)) + { + info.ReportClientError("Only abort commands are allowed", System.Net.HttpStatusCode.BadRequest); + return; + } + + key = key.Substring(0, key.Length - "/abort".Length); + if (string.IsNullOrWhiteSpace(key)) + { + info.ReportClientError("No task key found", System.Net.HttpStatusCode.BadRequest); + return; + } + + ActiveRun t; + if (!m_activeItems.TryGetValue(key, out t)) + { + info.OutputError(code: System.Net.HttpStatusCode.NotFound); + return; + } + + var tt = t.Task; + if (tt != null) + tt.Abort(); + + var tr = t.Thread; + if (tr != null) + tr.Interrupt(); + + info.OutputOK(); + } + } + + private void StartCleanupTask() + { + if (m_cleanupTask == null || m_cleanupTask.IsCompleted || m_cleanupTask.IsFaulted || m_cleanupTask.IsCanceled) + m_cleanupTask = RunCleanupAsync(); + } + + private async System.Threading.Tasks.Task RunCleanupAsync() + { + while (m_activeItems.Count > 0) + { + var oldest = m_activeItems.Values + .OrderBy(x => x.LastAccess) + .FirstOrDefault(); + + if (oldest != null) + { + // If the task has finished, we just wait a little to allow the UI to pick it up + var timeout = oldest.Finished ? TimeSpan.FromMinutes(5) : TimeSpan.FromDays(1); + if (DateTime.Now - oldest.LastAccess > timeout) + { + oldest.IsLogDisposed = true; + m_activeItems.Remove(oldest.ID); + oldest.Log.Dispose(); + + // Fix all expired, or stop running + continue; + } + } + + await System.Threading.Tasks.Task.Delay(TimeSpan.FromMinutes(1)).ConfigureAwait(false); + } + } + + public void GET(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + info.OutputOK( + Duplicati.CommandLine.Program.SupportedCommands + ); + } + else + { + ActiveRun t; + if (!m_activeItems.TryGetValue(key, out t)) + { + info.OutputError(code: System.Net.HttpStatusCode.NotFound); + return; + } + + int pagesize; + int offset; + + int.TryParse(info.Request.QueryString["pagesize"].Value, out pagesize); + int.TryParse(info.Request.QueryString["offset"].Value, out offset); + pagesize = Math.Max(10, Math.Min(500, pagesize)); + offset = Math.Max(0, offset); + var items = new List(); + long count; + bool started; + bool finished; + + lock(t.Lock) + { + t.LastAccess = DateTime.Now; + count = t.Log.Count; + offset = Math.Min((int)count, offset); + items.AddRange(t.Log.Skip(offset).Take(pagesize)); + finished = t.Finished; + started = t.Started; + } + + info.OutputOK(new + { + Pagesize = pagesize, + Offset = offset, + Count = count, + Items = items, + Finished = finished, + Started = started + }); + } + } + } +} diff --git a/Duplicati/Server/WebServer/RESTMethods/Filesystem.cs b/Duplicati.Library.RestAPI/RESTMethods/Filesystem.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/Filesystem.cs rename to Duplicati.Library.RestAPI/RESTMethods/Filesystem.cs index 3c2b25aed..a7a59bbde 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Filesystem.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Filesystem.cs @@ -1,273 +1,273 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Linq; -using System.IO; -using Duplicati.Library.Snapshots; +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using Duplicati.Library.Snapshots; using Duplicati.Library.Common.IO; using Duplicati.Library.Common; -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Filesystem : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - var parts = (key ?? "").Split(new char[] { '/' }); - var path = Duplicati.Library.Utility.Uri.UrlDecode((parts.Length == 2 ? parts.FirstOrDefault() : key ?? "")); - var command = parts.Length == 2 ? parts.Last() : null; - if (string.IsNullOrEmpty(path)) - path = info.Request.QueryString["path"].Value; - - Process(command, path, info); - } - - private void Process(string command, string path, RequestInfo info) - { - if (string.IsNullOrEmpty(path)) - { - info.ReportClientError("No path parameter was found", System.Net.HttpStatusCode.BadRequest); - return; - } - - bool skipFiles = Library.Utility.Utility.ParseBool(info.Request.QueryString["onlyfolders"].Value, false); - bool showHidden = Library.Utility.Utility.ParseBool(info.Request.QueryString["showhidden"].Value, false); - - string specialpath = null; - string specialtoken = null; - - if (path.StartsWith("%", StringComparison.Ordinal)) - { - var ix = path.IndexOf("%", 1, StringComparison.Ordinal); - if (ix > 0) - { - var tk = path.Substring(0, ix + 1); - var node = SpecialFolders.Nodes.FirstOrDefault(x => x.id.Equals(tk, StringComparison.OrdinalIgnoreCase)); - if (node != null) - { - specialpath = node.resolvedpath; - specialtoken = node.id; - } - } - } - - path = SpecialFolders.ExpandEnvironmentVariables(path); - - if (Platform.IsClientPosix && !path.StartsWith("/", StringComparison.Ordinal)) - { - info.ReportClientError("The path parameter must start with a forward-slash", System.Net.HttpStatusCode.BadRequest); - return; - } - - if (!string.IsNullOrWhiteSpace(command)) - { - if ("validate".Equals(command, StringComparison.OrdinalIgnoreCase)) - { - try - { - if (System.IO.Path.IsPathRooted(path) && (System.IO.Directory.Exists(path) || System.IO.File.Exists(path))) - { - info.OutputOK(); - return; - } - } - catch - { - } - - info.ReportServerError("File or folder not found", System.Net.HttpStatusCode.NotFound); - return; - } - else - { - info.ReportClientError(string.Format("No such operation found: {0}", command), System.Net.HttpStatusCode.NotFound); - return; - } - } - - try - { - if (path != "" && path != "/") - path = Util.AppendDirSeparator(path); - - IEnumerable res; - - if (!Platform.IsClientPosix && (path.Equals("/") || path.Equals(""))) - { - res = DriveInfo.GetDrives() - .Where(di => - (di.DriveType == DriveType.Fixed || di.DriveType == DriveType.Network || di.DriveType == DriveType.Removable) - && di.IsReady // Only try to create TreeNode entries for drives who were ready 'now' - ) - .Select(TryCreateTreeNodeForDrive) // This will try to create a TreeNode for selected drives - .Where(tn => tn != null); // This filters out such entries that could not be created - } - else - { - res = ListFolderAsNodes(path, skipFiles, showHidden); - } - - if ((path.Equals("/") || path.Equals("")) && specialtoken == null) - { - // Prepend special folders - res = SpecialFolders.Nodes.Union(res); - } - - if (specialtoken != null) - { - res = res.Select(x => { - x.resolvedpath = x.id; - x.id = specialtoken + x.id.Substring(specialpath.Length); - return x; - }); - } - - // We have to resolve the query before giving it to OutputOK - // If we do not do this, and the query throws an exception when OutputOK resolves it, - // the exception would not be handled properly - res = res.ToList(); - - info.OutputOK(res); - } - catch (Exception ex) - { - info.ReportClientError("Failed to process the path: " + ex.Message, System.Net.HttpStatusCode.InternalServerError); - } - } - - /// - /// Try to create a new TreeNode instance for the given DriveInfo instance. - /// - /// - /// If an exception occurs during creation (most likely the device became unavailable), a null is returned instead. - /// - /// - /// DriveInfo to try create a TreeNode for. Cannot be null. - /// A new TreeNode instance on success; null if an exception occurred during creation. - private static Serializable.TreeNode TryCreateTreeNodeForDrive(DriveInfo driveInfo) - { - if (driveInfo == null) throw new ArgumentNullException(nameof(driveInfo)); - - try - { - // Try to create the TreeNode - // This may still fail as the drive might become unavailable in the meanwhile - return new Serializable.TreeNode - { - id = driveInfo.RootDirectory.FullName, - text = - ( - string.IsNullOrWhiteSpace(driveInfo.VolumeLabel) - ? driveInfo.RootDirectory.FullName.Replace('\\', ' ') - : driveInfo.VolumeLabel + " - " + driveInfo.RootDirectory.FullName.Replace('\\', ' ') - ) + "(" + driveInfo.DriveType + ")", - iconCls = "x-tree-icon-drive" - }; - } - catch - { - // Drive became unavailable in the meanwhile or another exception occurred - // Return a null as fall back - return null; - } - } - - private static IEnumerable ListFolderAsNodes(string entrypath, bool skipFiles, bool showHidden) - { - //Helper function for finding out if a folder has sub elements - Func hasSubElements = (p) => skipFiles ? Directory.EnumerateDirectories(p).Any() : Directory.EnumerateFileSystemEntries(p).Any(); - - //Helper function for dealing with exceptions when accessing off-limits folders - Func isEmptyFolder = (p) => - { - try { return !hasSubElements(p); } - catch { } - return true; - }; - - //Helper function for dealing with exceptions when accessing off-limits folders - Func canAccess = (p) => - { - try { hasSubElements(p); return true; } - catch { } - return false; - }; - - foreach (var s in SystemIO.IO_OS.EnumerateFileSystemEntries(entrypath) - // Group directories first - .OrderByDescending(f => SystemIO.IO_OS.GetFileAttributes(f) & FileAttributes.Directory) - // Sort both groups (directories and files) alphabetically - .ThenBy(f => f)) - { - Serializable.TreeNode tn = null; - try - { - var attr = SystemIO.IO_OS.GetFileAttributes(s); - var isSymlink = SystemIO.IO_OS.IsSymlink(s, attr); - var isFolder = (attr & FileAttributes.Directory) != 0; - var isFile = !isFolder; - var isHidden = (attr & FileAttributes.Hidden) != 0; - - var accessible = isFile || canAccess(s); - var isLeaf = isFile || !accessible || isEmptyFolder(s); - - var rawid = isFolder ? Util.AppendDirSeparator(s) : s; - if (skipFiles && !isFolder) - continue; - - if (!showHidden && isHidden) - continue; - - tn = new Serializable.TreeNode() - { - id = rawid, - text = SystemIO.IO_OS.PathGetFileName(s), - hidden = isHidden, - symlink = isSymlink, - iconCls = isFolder ? (accessible ? (isSymlink ? "x-tree-icon-symlink" : "x-tree-icon-parent") : "x-tree-icon-locked") : "x-tree-icon-leaf", - leaf = isLeaf - }; - } - catch - { - } - - if (tn != null) - yield return tn; - } - } - - public void POST(string key, RequestInfo info) - { - Process(key, info.Request.Form["path"].Value, info); - } - - public string Description { get { return "Enumerates the server filesystem"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(string[])), - }; - } - } - } -} - +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Filesystem : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + var parts = (key ?? "").Split(new char[] { '/' }); + var path = Duplicati.Library.Utility.Uri.UrlDecode((parts.Length == 2 ? parts.FirstOrDefault() : key ?? "")); + var command = parts.Length == 2 ? parts.Last() : null; + if (string.IsNullOrEmpty(path)) + path = info.Request.QueryString["path"].Value; + + Process(command, path, info); + } + + private void Process(string command, string path, RequestInfo info) + { + if (string.IsNullOrEmpty(path)) + { + info.ReportClientError("No path parameter was found", System.Net.HttpStatusCode.BadRequest); + return; + } + + bool skipFiles = Library.Utility.Utility.ParseBool(info.Request.QueryString["onlyfolders"].Value, false); + bool showHidden = Library.Utility.Utility.ParseBool(info.Request.QueryString["showhidden"].Value, false); + + string specialpath = null; + string specialtoken = null; + + if (path.StartsWith("%", StringComparison.Ordinal)) + { + var ix = path.IndexOf("%", 1, StringComparison.Ordinal); + if (ix > 0) + { + var tk = path.Substring(0, ix + 1); + var node = SpecialFolders.Nodes.FirstOrDefault(x => x.id.Equals(tk, StringComparison.OrdinalIgnoreCase)); + if (node != null) + { + specialpath = node.resolvedpath; + specialtoken = node.id; + } + } + } + + path = SpecialFolders.ExpandEnvironmentVariables(path); + + if (Platform.IsClientPosix && !path.StartsWith("/", StringComparison.Ordinal)) + { + info.ReportClientError("The path parameter must start with a forward-slash", System.Net.HttpStatusCode.BadRequest); + return; + } + + if (!string.IsNullOrWhiteSpace(command)) + { + if ("validate".Equals(command, StringComparison.OrdinalIgnoreCase)) + { + try + { + if (System.IO.Path.IsPathRooted(path) && (System.IO.Directory.Exists(path) || System.IO.File.Exists(path))) + { + info.OutputOK(); + return; + } + } + catch + { + } + + info.ReportServerError("File or folder not found", System.Net.HttpStatusCode.NotFound); + return; + } + else + { + info.ReportClientError(string.Format("No such operation found: {0}", command), System.Net.HttpStatusCode.NotFound); + return; + } + } + + try + { + if (path != "" && path != "/") + path = Util.AppendDirSeparator(path); + + IEnumerable res; + + if (!Platform.IsClientPosix && (path.Equals("/") || path.Equals(""))) + { + res = DriveInfo.GetDrives() + .Where(di => + (di.DriveType == DriveType.Fixed || di.DriveType == DriveType.Network || di.DriveType == DriveType.Removable) + && di.IsReady // Only try to create TreeNode entries for drives who were ready 'now' + ) + .Select(TryCreateTreeNodeForDrive) // This will try to create a TreeNode for selected drives + .Where(tn => tn != null); // This filters out such entries that could not be created + } + else + { + res = ListFolderAsNodes(path, skipFiles, showHidden); + } + + if ((path.Equals("/") || path.Equals("")) && specialtoken == null) + { + // Prepend special folders + res = SpecialFolders.Nodes.Union(res); + } + + if (specialtoken != null) + { + res = res.Select(x => { + x.resolvedpath = x.id; + x.id = specialtoken + x.id.Substring(specialpath.Length); + return x; + }); + } + + // We have to resolve the query before giving it to OutputOK + // If we do not do this, and the query throws an exception when OutputOK resolves it, + // the exception would not be handled properly + res = res.ToList(); + + info.OutputOK(res); + } + catch (Exception ex) + { + info.ReportClientError("Failed to process the path: " + ex.Message, System.Net.HttpStatusCode.InternalServerError); + } + } + + /// + /// Try to create a new TreeNode instance for the given DriveInfo instance. + /// + /// + /// If an exception occurs during creation (most likely the device became unavailable), a null is returned instead. + /// + /// + /// DriveInfo to try create a TreeNode for. Cannot be null. + /// A new TreeNode instance on success; null if an exception occurred during creation. + private static Serializable.TreeNode TryCreateTreeNodeForDrive(DriveInfo driveInfo) + { + if (driveInfo == null) throw new ArgumentNullException(nameof(driveInfo)); + + try + { + // Try to create the TreeNode + // This may still fail as the drive might become unavailable in the meanwhile + return new Serializable.TreeNode + { + id = driveInfo.RootDirectory.FullName, + text = + ( + string.IsNullOrWhiteSpace(driveInfo.VolumeLabel) + ? driveInfo.RootDirectory.FullName.Replace('\\', ' ') + : driveInfo.VolumeLabel + " - " + driveInfo.RootDirectory.FullName.Replace('\\', ' ') + ) + "(" + driveInfo.DriveType + ")", + iconCls = "x-tree-icon-drive" + }; + } + catch + { + // Drive became unavailable in the meanwhile or another exception occurred + // Return a null as fall back + return null; + } + } + + private static IEnumerable ListFolderAsNodes(string entrypath, bool skipFiles, bool showHidden) + { + //Helper function for finding out if a folder has sub elements + Func hasSubElements = (p) => skipFiles ? Directory.EnumerateDirectories(p).Any() : Directory.EnumerateFileSystemEntries(p).Any(); + + //Helper function for dealing with exceptions when accessing off-limits folders + Func isEmptyFolder = (p) => + { + try { return !hasSubElements(p); } + catch { } + return true; + }; + + //Helper function for dealing with exceptions when accessing off-limits folders + Func canAccess = (p) => + { + try { hasSubElements(p); return true; } + catch { } + return false; + }; + + foreach (var s in SystemIO.IO_OS.EnumerateFileSystemEntries(entrypath) + // Group directories first + .OrderByDescending(f => SystemIO.IO_OS.GetFileAttributes(f) & FileAttributes.Directory) + // Sort both groups (directories and files) alphabetically + .ThenBy(f => f)) + { + Serializable.TreeNode tn = null; + try + { + var attr = SystemIO.IO_OS.GetFileAttributes(s); + var isSymlink = SystemIO.IO_OS.IsSymlink(s, attr); + var isFolder = (attr & FileAttributes.Directory) != 0; + var isFile = !isFolder; + var isHidden = (attr & FileAttributes.Hidden) != 0; + + var accessible = isFile || canAccess(s); + var isLeaf = isFile || !accessible || isEmptyFolder(s); + + var rawid = isFolder ? Util.AppendDirSeparator(s) : s; + if (skipFiles && !isFolder) + continue; + + if (!showHidden && isHidden) + continue; + + tn = new Serializable.TreeNode() + { + id = rawid, + text = SystemIO.IO_OS.PathGetFileName(s), + hidden = isHidden, + symlink = isSymlink, + iconCls = isFolder ? (accessible ? (isSymlink ? "x-tree-icon-symlink" : "x-tree-icon-parent") : "x-tree-icon-locked") : "x-tree-icon-leaf", + leaf = isLeaf + }; + } + catch + { + } + + if (tn != null) + yield return tn; + } + } + + public void POST(string key, RequestInfo info) + { + Process(key, info.Request.Form["path"].Value, info); + } + + public string Description { get { return "Enumerates the server filesystem"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(string[])), + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Help.cs b/Duplicati.Library.RestAPI/RESTMethods/Help.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/Help.cs rename to Duplicati.Library.RestAPI/RESTMethods/Help.cs index 87433390c..c99f97372 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Help.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Help.cs @@ -1,100 +1,100 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Text; -using Newtonsoft.Json; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Help : IRESTMethodGET - { - public void GET(string key, RequestInfo info) - { - var sb = new StringBuilder(); - if (string.IsNullOrWhiteSpace(key)) - { - foreach(var m in RESTHandler.Modules.Keys.OrderBy(x => x)) - { - var mod = RESTHandler.Modules[m]; - if (mod == this) - continue; - - var desc = mod.GetType().Name; - if (mod is IRESTMethodDocumented documented) - desc = documented.Description; - sb.AppendFormat(ITEM_TEMPLATE, RESTHandler.API_URI_PATH, m, mod.GetType().Name, desc); - } - - - var data = Encoding.UTF8.GetBytes(string.Format(TEMPLATE, "API Information", "", sb)); - - info.Response.ContentType = "text/html"; - info.Response.ContentLength = data.Length; - info.Response.Body.Write(data, 0, data.Length); - info.Response.Send(); - } - else - { - IRESTMethod m; - RESTHandler.Modules.TryGetValue(key, out m); - if (m == null) - { - info.Response.Status = System.Net.HttpStatusCode.NotFound; - info.Response.Reason = "Module not found"; - } - else - { - var desc = ""; - if (m is IRESTMethodDocumented doc) - { - desc = doc.Description; - foreach(var t in doc.Types) - sb.AppendFormat(METHOD_TEMPLATE, t.Key, JsonConvert.SerializeObject(t.Value)); //TODO: Format the type - } - - var data = Encoding.UTF8.GetBytes(string.Format(TEMPLATE, m.GetType().Name, desc, sb)); - - info.Response.ContentType = "text/html"; - info.Response.ContentLength = data.Length; - info.Response.Body.Write(data, 0, data.Length); - info.Response.Send(); - - } - } - } - - private const string TEMPLATE = @" -{0} - -

    {0}

    -

    {1}

    -
      -{2} -
    - -"; - private const string ITEM_TEMPLATE = @" -
  • {2}: {3}
  • -"; - - private const string METHOD_TEMPLATE = @" -{0}:
    {1}
    -"; - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Text; +using Newtonsoft.Json; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Help : IRESTMethodGET + { + public void GET(string key, RequestInfo info) + { + var sb = new StringBuilder(); + if (string.IsNullOrWhiteSpace(key)) + { + foreach(var m in RESTHandler.Modules.Keys.OrderBy(x => x)) + { + var mod = RESTHandler.Modules[m]; + if (mod == this) + continue; + + var desc = mod.GetType().Name; + if (mod is IRESTMethodDocumented documented) + desc = documented.Description; + sb.AppendFormat(ITEM_TEMPLATE, RESTHandler.API_URI_PATH, m, mod.GetType().Name, desc); + } + + + var data = Encoding.UTF8.GetBytes(string.Format(TEMPLATE, "API Information", "", sb)); + + info.Response.ContentType = "text/html"; + info.Response.ContentLength = data.Length; + info.Response.Body.Write(data, 0, data.Length); + info.Response.Send(); + } + else + { + IRESTMethod m; + RESTHandler.Modules.TryGetValue(key, out m); + if (m == null) + { + info.Response.Status = System.Net.HttpStatusCode.NotFound; + info.Response.Reason = "Module not found"; + } + else + { + var desc = ""; + if (m is IRESTMethodDocumented doc) + { + desc = doc.Description; + foreach(var t in doc.Types) + sb.AppendFormat(METHOD_TEMPLATE, t.Key, JsonConvert.SerializeObject(t.Value)); //TODO: Format the type + } + + var data = Encoding.UTF8.GetBytes(string.Format(TEMPLATE, m.GetType().Name, desc, sb)); + + info.Response.ContentType = "text/html"; + info.Response.ContentLength = data.Length; + info.Response.Body.Write(data, 0, data.Length); + info.Response.Send(); + + } + } + } + + private const string TEMPLATE = @" +{0} + +

    {0}

    +

    {1}

    +
      +{2} +
    + +"; + private const string ITEM_TEMPLATE = @" +
  • {2}: {3}
  • +"; + + private const string METHOD_TEMPLATE = @" +{0}:
    {1}
    +"; + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/HyperV.cs b/Duplicati.Library.RestAPI/RESTMethods/HyperV.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/HyperV.cs rename to Duplicati.Library.RestAPI/RESTMethods/HyperV.cs index b5298eab9..477ba28f5 100644 --- a/Duplicati/Server/WebServer/RESTMethods/HyperV.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/HyperV.cs @@ -1,89 +1,89 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using Duplicati.Library.Interface; -using System.Linq; -using System.Security.Principal; -using Duplicati.Library.Snapshots; +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using Duplicati.Library.Interface; +using System.Linq; +using System.Security.Principal; +using Duplicati.Library.Snapshots; using Duplicati.Library.Common; -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class HyperV : IRESTMethodGET, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - // Early exit in case we are non-windows to prevent attempting to load Windows-only components - if (Platform.IsClientWindows) - RealGET(key, info); - else - info.OutputOK(new string[0]); - } - - // Make sure the JIT does not attempt to inline this call and thus load - // referenced types from System.Management here - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private void RealGET(string key, RequestInfo info) - { - var hypervUtility = new HyperVUtility(); - - if (!hypervUtility.IsHyperVInstalled || !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) - { - info.OutputOK(new string[0]); - return; - } - - try - { - if (string.IsNullOrEmpty(key)) - { - hypervUtility.QueryHyperVGuestsInfo(); - info.OutputOK(hypervUtility.Guests.Select(x => new { id = x.ID, name = x.Name }).ToList()); - } - else - { - hypervUtility.QueryHyperVGuestsInfo(true); - var foundVMs = hypervUtility.Guests.FindAll(x => x.ID.Equals(new Guid(key))); - - if (foundVMs.Count == 1) - info.OutputOK(foundVMs[0].DataPaths.Select(x => new { text = x, id = x, cls = "folder", iconCls = "x-tree-icon-leaf", check = "false", leaf = "true" }).ToList()); - else - info.ReportClientError(string.Format("Cannot find VM with ID {0}.", key), System.Net.HttpStatusCode.NotFound); - } - } - catch (Exception ex) - { - info.ReportServerError("Failed to enumerate Hyper-V virtual machines: " + ex.Message); - } - } - - public string Description { get { return "Return a list of Hyper-V virtual machines"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(ICommandLineArgument[])) - }; - } - } - - } -} - +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class HyperV : IRESTMethodGET, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + // Early exit in case we are non-windows to prevent attempting to load Windows-only components + if (Platform.IsClientWindows) + RealGET(key, info); + else + info.OutputOK(new string[0]); + } + + // Make sure the JIT does not attempt to inline this call and thus load + // referenced types from System.Management here + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] + private void RealGET(string key, RequestInfo info) + { + var hypervUtility = new HyperVUtility(); + + if (!hypervUtility.IsHyperVInstalled || !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) + { + info.OutputOK(new string[0]); + return; + } + + try + { + if (string.IsNullOrEmpty(key)) + { + hypervUtility.QueryHyperVGuestsInfo(); + info.OutputOK(hypervUtility.Guests.Select(x => new { id = x.ID, name = x.Name }).ToList()); + } + else + { + hypervUtility.QueryHyperVGuestsInfo(true); + var foundVMs = hypervUtility.Guests.FindAll(x => x.ID.Equals(new Guid(key))); + + if (foundVMs.Count == 1) + info.OutputOK(foundVMs[0].DataPaths.Select(x => new { text = x, id = x, cls = "folder", iconCls = "x-tree-icon-leaf", check = "false", leaf = "true" }).ToList()); + else + info.ReportClientError(string.Format("Cannot find VM with ID {0}.", key), System.Net.HttpStatusCode.NotFound); + } + } + catch (Exception ex) + { + info.ReportServerError("Failed to enumerate Hyper-V virtual machines: " + ex.Message); + } + } + + public string Description { get { return "Return a list of Hyper-V virtual machines"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(ICommandLineArgument[])) + }; + } + } + + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/IRESTMethod.cs b/Duplicati.Library.RestAPI/RESTMethods/IRESTMethod.cs similarity index 96% rename from Duplicati/Server/WebServer/RESTMethods/IRESTMethod.cs rename to Duplicati.Library.RestAPI/RESTMethods/IRESTMethod.cs index 024da32b0..94e7788d4 100644 --- a/Duplicati/Server/WebServer/RESTMethods/IRESTMethod.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/IRESTMethod.cs @@ -1,56 +1,56 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public interface IRESTMethod - { - } - - public interface IRESTMethodDocumented - { - string Description { get; } - IEnumerable> Types { get; } - } - - public interface IRESTMethodGET : IRESTMethod - { - void GET(string key, RequestInfo info); - } - public interface IRESTMethodPUT : IRESTMethod - { - void PUT(string key, RequestInfo info); - } - - public interface IRESTMethodPOST : IRESTMethod - { - void POST(string key, RequestInfo info); - } - - public interface IRESTMethodDELETE : IRESTMethod - { - void DELETE(string key, RequestInfo info); - } - - public interface IRESTMethodPATCH : IRESTMethod - { - void PATCH(string key, RequestInfo info); - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public interface IRESTMethod + { + } + + public interface IRESTMethodDocumented + { + string Description { get; } + IEnumerable> Types { get; } + } + + public interface IRESTMethodGET : IRESTMethod + { + void GET(string key, RequestInfo info); + } + public interface IRESTMethodPUT : IRESTMethod + { + void PUT(string key, RequestInfo info); + } + + public interface IRESTMethodPOST : IRESTMethod + { + void POST(string key, RequestInfo info); + } + + public interface IRESTMethodDELETE : IRESTMethod + { + void DELETE(string key, RequestInfo info); + } + + public interface IRESTMethodPATCH : IRESTMethod + { + void PATCH(string key, RequestInfo info); + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Licenses.cs b/Duplicati.Library.RestAPI/RESTMethods/Licenses.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/Licenses.cs rename to Duplicati.Library.RestAPI/RESTMethods/Licenses.cs index 893a7ae9d..b08749bce 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Licenses.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Licenses.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Licenses : IRESTMethodGET - { - public void GET(string key, RequestInfo info) - { - var path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Duplicati.Library.Utility.Utility.getEntryAssembly().Location), "licenses"); - info.OutputOK(Duplicati.License.LicenseReader.ReadLicenses(path)); - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Licenses : IRESTMethodGET + { + public void GET(string key, RequestInfo info) + { + var path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Duplicati.Library.Utility.Utility.getEntryAssembly().Location), "licenses"); + info.OutputOK(Duplicati.License.LicenseReader.ReadLicenses(path)); + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/LogData.cs b/Duplicati.Library.RestAPI/RESTMethods/LogData.cs similarity index 94% rename from Duplicati/Server/WebServer/RESTMethods/LogData.cs rename to Duplicati.Library.RestAPI/RESTMethods/LogData.cs index f87bbe2cb..d1de17dc6 100644 --- a/Duplicati/Server/WebServer/RESTMethods/LogData.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/LogData.cs @@ -1,117 +1,118 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class LogData : IRESTMethodGET, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - if ("poll".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - var input = info.Request.QueryString; - var level_str = input["level"].Value ?? ""; - var id_str = input["id"].Value ?? ""; - - int pagesize; - if (!int.TryParse(info.Request.QueryString["pagesize"].Value, out pagesize)) - pagesize = 100; - - pagesize = Math.Max(1, Math.Min(500, pagesize)); - - Library.Logging.LogMessageType level; - long id; - - long.TryParse(id_str, out id); - Enum.TryParse(level_str, true, out level); - - info.OutputOK(Program.LogHandler.AfterID(id, level, pagesize)); - } - else - { - - List> res = null; - Program.DataConnection.ExecuteWithCommand(x => - { - res = DumpTable(x, "ErrorLog", "Timestamp", info.Request.QueryString["offset"].Value, info.Request.QueryString["pagesize"].Value); - }); - - info.OutputOK(res); - } - } - - - public static List> DumpTable(System.Data.IDbCommand cmd, string tablename, string pagingfield, string offset_str, string pagesize_str) - { - var result = new List>(); - - long pagesize; - if (!long.TryParse(pagesize_str, out pagesize)) - pagesize = 100; - - pagesize = Math.Max(10, Math.Min(500, pagesize)); - - cmd.CommandText = "SELECT * FROM \"" + tablename + "\""; - long offset = 0; - if (!string.IsNullOrWhiteSpace(offset_str) && long.TryParse(offset_str, out offset) && !string.IsNullOrEmpty(pagingfield)) - { - var p = cmd.CreateParameter(); - p.Value = offset; - cmd.Parameters.Add(p); - - cmd.CommandText += " WHERE \"" + pagingfield + "\" < ?"; - } - - if (!string.IsNullOrEmpty(pagingfield)) - cmd.CommandText += " ORDER BY \"" + pagingfield + "\" DESC"; - cmd.CommandText += " LIMIT " + pagesize.ToString(); - - using(var rd = cmd.ExecuteReader()) - { - var names = new List(); - for(var i = 0; i < rd.FieldCount; i++) - names.Add(rd.GetName(i)); - - while (rd.Read()) - { - var dict = new Dictionary(); - for(int i = 0; i < names.Count; i++) - dict[names[i]] = rd.GetValue(i); - - result.Add(dict); - } - } - - return result; - } - - public string Description { get { return "Retrieves system log data"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(Dictionary[])), - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class LogData : IRESTMethodGET, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + if ("poll".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + var input = info.Request.QueryString; + var level_str = input["level"].Value ?? ""; + var id_str = input["id"].Value ?? ""; + + int pagesize; + if (!int.TryParse(info.Request.QueryString["pagesize"].Value, out pagesize)) + pagesize = 100; + + pagesize = Math.Max(1, Math.Min(500, pagesize)); + + Library.Logging.LogMessageType level; + long id; + + long.TryParse(id_str, out id); + Enum.TryParse(level_str, true, out level); + + info.OutputOK(FIXMEGlobal.LogHandler.AfterID(id, level, pagesize)); + } + else + { + + List> res = null; + FIXMEGlobal.DataConnection.ExecuteWithCommand(x => + { + res = DumpTable(x, "ErrorLog", "Timestamp", info.Request.QueryString["offset"].Value, info.Request.QueryString["pagesize"].Value); + }); + + info.OutputOK(res); + } + } + + + public static List> DumpTable(System.Data.IDbCommand cmd, string tablename, string pagingfield, string offset_str, string pagesize_str) + { + var result = new List>(); + + long pagesize; + if (!long.TryParse(pagesize_str, out pagesize)) + pagesize = 100; + + pagesize = Math.Max(10, Math.Min(500, pagesize)); + + cmd.CommandText = "SELECT * FROM \"" + tablename + "\""; + long offset = 0; + if (!string.IsNullOrWhiteSpace(offset_str) && long.TryParse(offset_str, out offset) && !string.IsNullOrEmpty(pagingfield)) + { + var p = cmd.CreateParameter(); + p.Value = offset; + cmd.Parameters.Add(p); + + cmd.CommandText += " WHERE \"" + pagingfield + "\" < ?"; + } + + if (!string.IsNullOrEmpty(pagingfield)) + cmd.CommandText += " ORDER BY \"" + pagingfield + "\" DESC"; + cmd.CommandText += " LIMIT " + pagesize.ToString(); + + using(var rd = cmd.ExecuteReader()) + { + var names = new List(); + for(var i = 0; i < rd.FieldCount; i++) + names.Add(rd.GetName(i)); + + while (rd.Read()) + { + var dict = new Dictionary(); + for(int i = 0; i < names.Count; i++) + dict[names[i]] = rd.GetValue(i); + + result.Add(dict); + } + } + + return result; + } + + public string Description { get { return "Retrieves system log data"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(Dictionary[])), + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/MSSQL.cs b/Duplicati.Library.RestAPI/RESTMethods/MSSQL.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/MSSQL.cs rename to Duplicati.Library.RestAPI/RESTMethods/MSSQL.cs index 2015fb959..33c64bc12 100644 --- a/Duplicati/Server/WebServer/RESTMethods/MSSQL.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/MSSQL.cs @@ -1,87 +1,87 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using Duplicati.Library.Interface; -using System.Linq; -using System.Security.Principal; -using Duplicati.Library.Snapshots; +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using Duplicati.Library.Interface; +using System.Linq; +using System.Security.Principal; +using Duplicati.Library.Snapshots; using Duplicati.Library.Common; -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class MSSQL : IRESTMethodGET, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - // Early exit in case we are non-windows to prevent attempting to load Windows-only components - if (Platform.IsClientWindows) - RealGET(key, info); - else - info.OutputOK(new string[0]); - } - - // Make sure the JIT does not attempt to inline this call and thus load - // referenced types from System.Management here - [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - private void RealGET(string key, RequestInfo info) - { - var mssqlUtility = new MSSQLUtility(); - - if (!mssqlUtility.IsMSSQLInstalled || !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) - { - info.OutputOK(new string[0]); - return; - } - - try - { - mssqlUtility.QueryDBsInfo(); - - if (string.IsNullOrEmpty(key)) - info.OutputOK(mssqlUtility.DBs.Select(x => new { id = x.ID, name = x.Name }).ToList()); - else - { - var foundDBs = mssqlUtility.DBs.FindAll(x => x.ID.Equals(key, StringComparison.OrdinalIgnoreCase)); - - if (foundDBs.Count == 1) - info.OutputOK(foundDBs[0].DataPaths.Select(x => new { text = x, id = x, cls = "folder", iconCls = "x-tree-icon-leaf", check = "false", leaf = "true" }).ToList()); - else - info.ReportClientError(string.Format("Cannot find DB with ID {0}.", key), System.Net.HttpStatusCode.NotFound); - } - } - catch (Exception ex) - { - info.ReportServerError("Failed to enumerate Microsoft SQL Server databases: " + ex.Message); - } - } - - public string Description { get { return "Return a list of Microsoft SQL Server databases"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(ICommandLineArgument[])) - }; - } - } - - } -} - +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class MSSQL : IRESTMethodGET, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + // Early exit in case we are non-windows to prevent attempting to load Windows-only components + if (Platform.IsClientWindows) + RealGET(key, info); + else + info.OutputOK(new string[0]); + } + + // Make sure the JIT does not attempt to inline this call and thus load + // referenced types from System.Management here + [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] + private void RealGET(string key, RequestInfo info) + { + var mssqlUtility = new MSSQLUtility(); + + if (!mssqlUtility.IsMSSQLInstalled || !new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) + { + info.OutputOK(new string[0]); + return; + } + + try + { + mssqlUtility.QueryDBsInfo(); + + if (string.IsNullOrEmpty(key)) + info.OutputOK(mssqlUtility.DBs.Select(x => new { id = x.ID, name = x.Name }).ToList()); + else + { + var foundDBs = mssqlUtility.DBs.FindAll(x => x.ID.Equals(key, StringComparison.OrdinalIgnoreCase)); + + if (foundDBs.Count == 1) + info.OutputOK(foundDBs[0].DataPaths.Select(x => new { text = x, id = x, cls = "folder", iconCls = "x-tree-icon-leaf", check = "false", leaf = "true" }).ToList()); + else + info.ReportClientError(string.Format("Cannot find DB with ID {0}.", key), System.Net.HttpStatusCode.NotFound); + } + } + catch (Exception ex) + { + info.ReportServerError("Failed to enumerate Microsoft SQL Server databases: " + ex.Message); + } + } + + public string Description { get { return "Return a list of Microsoft SQL Server databases"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(ICommandLineArgument[])) + }; + } + } + + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Notification.cs b/Duplicati.Library.RestAPI/RESTMethods/Notification.cs similarity index 86% rename from Duplicati/Server/WebServer/RESTMethods/Notification.cs rename to Duplicati.Library.RestAPI/RESTMethods/Notification.cs index 14d23bdbc..9473f248b 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Notification.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Notification.cs @@ -1,60 +1,61 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Notification : IRESTMethodGET, IRESTMethodDELETE - { - public void GET(string key, RequestInfo info) - { - long id; - if (!long.TryParse(key, out id)) - { - info.ReportClientError("Invalid ID", System.Net.HttpStatusCode.BadRequest); - return; - } - - var el = Program.DataConnection.GetNotifications().FirstOrDefault(x => x.ID == id); - if (el == null) - info.ReportClientError("No such notification", System.Net.HttpStatusCode.NotFound); - else - info.OutputOK(el); - } - - public void DELETE(string key, RequestInfo info) - { - long id; - if (!long.TryParse(key, out id)) - { - info.ReportClientError("Invalid ID", System.Net.HttpStatusCode.BadRequest); - return; - } - - var el = Program.DataConnection.GetNotifications().FirstOrDefault(x => x.ID == id); - if (el == null) - info.ReportClientError("No such notification", System.Net.HttpStatusCode.NotFound); - else - { - Program.DataConnection.DismissNotification(id); - info.OutputOK(); - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Linq; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Notification : IRESTMethodGET, IRESTMethodDELETE + { + public void GET(string key, RequestInfo info) + { + long id; + if (!long.TryParse(key, out id)) + { + info.ReportClientError("Invalid ID", System.Net.HttpStatusCode.BadRequest); + return; + } + + var el = FIXMEGlobal.DataConnection.GetNotifications().FirstOrDefault(x => x.ID == id); + if (el == null) + info.ReportClientError("No such notification", System.Net.HttpStatusCode.NotFound); + else + info.OutputOK(el); + } + + public void DELETE(string key, RequestInfo info) + { + long id; + if (!long.TryParse(key, out id)) + { + info.ReportClientError("Invalid ID", System.Net.HttpStatusCode.BadRequest); + return; + } + + var el = FIXMEGlobal.DataConnection.GetNotifications().FirstOrDefault(x => x.ID == id); + if (el == null) + info.ReportClientError("No such notification", System.Net.HttpStatusCode.NotFound); + else + { + FIXMEGlobal.DataConnection.DismissNotification(id); + info.OutputOK(); + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Notifications.cs b/Duplicati.Library.RestAPI/RESTMethods/Notifications.cs similarity index 90% rename from Duplicati/Server/WebServer/RESTMethods/Notifications.cs rename to Duplicati.Library.RestAPI/RESTMethods/Notifications.cs index cbc76032d..6578dbf32 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Notifications.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Notifications.cs @@ -1,29 +1,30 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Notifications : IRESTMethodGET - { - public void GET(string key, RequestInfo info) - { - info.OutputOK(Program.DataConnection.GetNotifications()); - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Notifications : IRESTMethodGET + { + public void GET(string key, RequestInfo info) + { + info.OutputOK(FIXMEGlobal.DataConnection.GetNotifications()); + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/ProgressState.cs b/Duplicati.Library.RestAPI/RESTMethods/ProgressState.cs similarity index 91% rename from Duplicati/Server/WebServer/RESTMethods/ProgressState.cs rename to Duplicati.Library.RestAPI/RESTMethods/ProgressState.cs index 4a757df2e..18deb5a70 100644 --- a/Duplicati/Server/WebServer/RESTMethods/ProgressState.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/ProgressState.cs @@ -1,45 +1,46 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class ProgressState : IRESTMethodGET, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - if (Program.GenerateProgressState == null) - info.ReportClientError("No active backup", System.Net.HttpStatusCode.NotFound); - else - info.OutputOK(Program.GenerateProgressState()); - } - - public string Description { get { return "Return the progress of the currently running operation."; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(Serialization.Interface.IProgressEventData)) - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Collections.Generic; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class ProgressState : IRESTMethodGET, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + if (FIXMEGlobal.GenerateProgressState == null) + info.ReportClientError("No active backup", System.Net.HttpStatusCode.NotFound); + else + info.OutputOK(FIXMEGlobal.GenerateProgressState()); + } + + public string Description { get { return "Return the progress of the currently running operation."; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(Serialization.Interface.IProgressEventData)) + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/RemoteOperation.cs b/Duplicati.Library.RestAPI/RESTMethods/RemoteOperation.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/RemoteOperation.cs rename to Duplicati.Library.RestAPI/RESTMethods/RemoteOperation.cs index 6996683f6..7f165af89 100644 --- a/Duplicati/Server/WebServer/RESTMethods/RemoteOperation.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/RemoteOperation.cs @@ -1,187 +1,187 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class RemoteOperation : IRESTMethodGET, IRESTMethodPOST - { - private void LocateDbUri(string uri, RequestInfo info) - { - var path = Library.Main.DatabaseLocator.GetDatabasePath(uri, null, false, false); - info.OutputOK(new { - Exists = !string.IsNullOrWhiteSpace(path), - Path = path - }); - } - - private void CreateFolder(string uri, RequestInfo info) - { - using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) - b.CreateFolder(); - - info.OutputOK(); - } - - private void UploadFile(string uri, RequestInfo info) - { - var data = info.Request.QueryString["data"].Value; - var remotename = info.Request.QueryString["filename"].Value; - - using(var ms = new System.IO.MemoryStream()) - using(var b = Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) - { - using(var tf = new Library.Utility.TempFile()) - { - System.IO.File.WriteAllText(tf, data); - b.PutAsync(remotename, tf, CancellationToken.None).Wait(); - } - } - - info.OutputOK(); - } - - private void ListFolder(string uri, RequestInfo info) - { - using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) - info.OutputOK(b.List()); - } - - private void TestConnection(string url, RequestInfo info) - { - - var modules = (from n in Library.DynamicLoader.GenericLoader.Modules - where n is Library.Interface.IConnectionModule - select n).ToArray(); - - try - { - var uri = new Library.Utility.Uri(url); - var qp = uri.QueryParameters; - - var opts = new Dictionary(); - foreach (var k in qp.Keys.Cast()) - opts[k] = qp[k]; - - foreach (var n in modules) - n.Configure(opts); - - using (var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(url, new Dictionary())) - b.Test(); - - info.OutputOK(); - } - catch (Duplicati.Library.Interface.FolderMissingException) - { - info.ReportServerError("missing-folder"); - } - catch (Duplicati.Library.Utility.SslCertificateValidator.InvalidCertificateException icex) - { - if (string.IsNullOrWhiteSpace(icex.Certificate)) - info.ReportServerError(icex.Message); - else - info.ReportServerError("incorrect-cert:" + icex.Certificate); - } - catch (Duplicati.Library.Utility.HostKeyException hex) - { - if (string.IsNullOrWhiteSpace(hex.ReportedHostKey)) - info.ReportServerError(hex.Message); - else - { - info.ReportServerError(string.Format( - @"incorrect-host-key:""{0}"", accepted-host-key:""{1}""", - hex.ReportedHostKey, - hex.AcceptedHostKey - )); - } - } - finally - { - foreach (var n in modules) - if (n is IDisposable disposable) - disposable.Dispose(); - } - } - - public void GET(string key, RequestInfo info) - { - var parts = (key ?? "").Split(new char[] { '/' }, 2); - - if (parts.Length <= 1) - { - info.ReportClientError("No url or operation supplied", System.Net.HttpStatusCode.BadRequest); - return; - } - - var url = Library.Utility.Uri.UrlDecode(parts.First()); - var operation = parts.Last().ToLowerInvariant(); - - switch (operation) - { - case "dbpath": - LocateDbUri(url, info); - return; - case "list": - ListFolder(url, info); - return; - case "create": - CreateFolder(url, info); - return; - case "test": - TestConnection(url, info); - return; - default: - info.ReportClientError("No such method", System.Net.HttpStatusCode.BadRequest); - return; - } - } - - public void POST(string key, RequestInfo info) - { - string url; - - using(var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) - url = sr.ReadToEnd(); - - switch (key) - { - case "dbpath": - LocateDbUri(url, info); - return; - case "list": - ListFolder(url, info); - return; - case "create": - CreateFolder(url, info); - return; - case "put": - UploadFile(url, info); - return; - case "test": - TestConnection(url, info); - return; - default: - info.ReportClientError("No such method", System.Net.HttpStatusCode.BadRequest); - return; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class RemoteOperation : IRESTMethodGET, IRESTMethodPOST + { + private void LocateDbUri(string uri, RequestInfo info) + { + var path = Library.Main.DatabaseLocator.GetDatabasePath(uri, null, false, false); + info.OutputOK(new { + Exists = !string.IsNullOrWhiteSpace(path), + Path = path + }); + } + + private void CreateFolder(string uri, RequestInfo info) + { + using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) + b.CreateFolder(); + + info.OutputOK(); + } + + private void UploadFile(string uri, RequestInfo info) + { + var data = info.Request.QueryString["data"].Value; + var remotename = info.Request.QueryString["filename"].Value; + + using(var ms = new System.IO.MemoryStream()) + using(var b = Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) + { + using(var tf = new Library.Utility.TempFile()) + { + System.IO.File.WriteAllText(tf, data); + b.PutAsync(remotename, tf, CancellationToken.None).Wait(); + } + } + + info.OutputOK(); + } + + private void ListFolder(string uri, RequestInfo info) + { + using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) + info.OutputOK(b.List()); + } + + private void TestConnection(string url, RequestInfo info) + { + + var modules = (from n in Library.DynamicLoader.GenericLoader.Modules + where n is Library.Interface.IConnectionModule + select n).ToArray(); + + try + { + var uri = new Library.Utility.Uri(url); + var qp = uri.QueryParameters; + + var opts = new Dictionary(); + foreach (var k in qp.Keys.Cast()) + opts[k] = qp[k]; + + foreach (var n in modules) + n.Configure(opts); + + using (var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(url, new Dictionary())) + b.Test(); + + info.OutputOK(); + } + catch (Duplicati.Library.Interface.FolderMissingException) + { + info.ReportServerError("missing-folder"); + } + catch (Duplicati.Library.Utility.SslCertificateValidator.InvalidCertificateException icex) + { + if (string.IsNullOrWhiteSpace(icex.Certificate)) + info.ReportServerError(icex.Message); + else + info.ReportServerError("incorrect-cert:" + icex.Certificate); + } + catch (Duplicati.Library.Utility.HostKeyException hex) + { + if (string.IsNullOrWhiteSpace(hex.ReportedHostKey)) + info.ReportServerError(hex.Message); + else + { + info.ReportServerError(string.Format( + @"incorrect-host-key:""{0}"", accepted-host-key:""{1}""", + hex.ReportedHostKey, + hex.AcceptedHostKey + )); + } + } + finally + { + foreach (var n in modules) + if (n is IDisposable disposable) + disposable.Dispose(); + } + } + + public void GET(string key, RequestInfo info) + { + var parts = (key ?? "").Split(new char[] { '/' }, 2); + + if (parts.Length <= 1) + { + info.ReportClientError("No url or operation supplied", System.Net.HttpStatusCode.BadRequest); + return; + } + + var url = Library.Utility.Uri.UrlDecode(parts.First()); + var operation = parts.Last().ToLowerInvariant(); + + switch (operation) + { + case "dbpath": + LocateDbUri(url, info); + return; + case "list": + ListFolder(url, info); + return; + case "create": + CreateFolder(url, info); + return; + case "test": + TestConnection(url, info); + return; + default: + info.ReportClientError("No such method", System.Net.HttpStatusCode.BadRequest); + return; + } + } + + public void POST(string key, RequestInfo info) + { + string url; + + using(var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) + url = sr.ReadToEnd(); + + switch (key) + { + case "dbpath": + LocateDbUri(url, info); + return; + case "list": + ListFolder(url, info); + return; + case "create": + CreateFolder(url, info); + return; + case "put": + UploadFile(url, info); + return; + case "test": + TestConnection(url, info); + return; + default: + info.ReportClientError("No such method", System.Net.HttpStatusCode.BadRequest); + return; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/RequestInfo.cs b/Duplicati.Library.RestAPI/RESTMethods/RequestInfo.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/RequestInfo.cs rename to Duplicati.Library.RestAPI/RESTMethods/RequestInfo.cs index c80b7edd8..fa38fc5df 100644 --- a/Duplicati/Server/WebServer/RESTMethods/RequestInfo.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/RequestInfo.cs @@ -1,109 +1,109 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class RequestInfo : IDisposable - { - public HttpServer.IHttpRequest Request { get; private set; } - public HttpServer.IHttpResponse Response { get; private set; } - public HttpServer.Sessions.IHttpSession Session { get; private set; } - public BodyWriter BodyWriter { get; private set; } - public RequestInfo(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - Request = request; - Response = response; - Session = session; - BodyWriter = new BodyWriter(response, request); - } - - public void ReportServerError(string message, System.Net.HttpStatusCode code = System.Net.HttpStatusCode.InternalServerError) - { - Response.Status = code; - Response.Reason = message; - - BodyWriter.WriteJsonObject(new { Error = message }); - } - - public void ReportClientError(string message, System.Net.HttpStatusCode code = System.Net.HttpStatusCode.BadRequest) - { - ReportServerError(message, code); - } - - public bool LongPollCheck(EventPollNotify poller, ref long id, out bool isError) - { - HttpServer.HttpInput input = String.Equals(Request.Method, "POST", StringComparison.OrdinalIgnoreCase) ? Request.Form : Request.QueryString; - if (Library.Utility.Utility.ParseBool(input["longpoll"].Value, false)) - { - long lastEventId; - if (!long.TryParse(input["lasteventid"].Value, out lastEventId)) - { - ReportClientError("When activating long poll, the request must include the last event id", System.Net.HttpStatusCode.BadRequest); - isError = true; - return false; - } - - TimeSpan ts; - try { ts = Library.Utility.Timeparser.ParseTimeSpan(input["duration"].Value); } - catch (Exception ex) - { - ReportClientError("Invalid duration: " + ex.Message, System.Net.HttpStatusCode.BadRequest); - isError = true; - return false; - } - - if (ts <= TimeSpan.FromSeconds(10) || ts.TotalMilliseconds > int.MaxValue) - { - ReportClientError("Invalid duration, must be at least 10 seconds, and less than " + int.MaxValue + " milliseconds", System.Net.HttpStatusCode.BadRequest); - isError = true; - return false; - } - - isError = false; - id = poller.Wait(lastEventId, (int)ts.TotalMilliseconds); - return true; - } - - isError = false; - return false; - } - - public void OutputOK(object item = null) - { - BodyWriter.OutputOK(item); - } - - public void OutputError(object item = null, System.Net.HttpStatusCode code = System.Net.HttpStatusCode.InternalServerError, string reason = null) - { - Response.Status = code; - Response.Reason = reason ?? "Error"; - BodyWriter.WriteJsonObject(item); - } - - public void Dispose() - { - if (BodyWriter != null) - { - var bw = BodyWriter; - BodyWriter = null; - bw.Dispose(); - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class RequestInfo : IDisposable + { + public HttpServer.IHttpRequest Request { get; private set; } + public HttpServer.IHttpResponse Response { get; private set; } + public HttpServer.Sessions.IHttpSession Session { get; private set; } + public BodyWriter BodyWriter { get; private set; } + public RequestInfo(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + Request = request; + Response = response; + Session = session; + BodyWriter = new BodyWriter(response, request); + } + + public void ReportServerError(string message, System.Net.HttpStatusCode code = System.Net.HttpStatusCode.InternalServerError) + { + Response.Status = code; + Response.Reason = message; + + BodyWriter.WriteJsonObject(new { Error = message }); + } + + public void ReportClientError(string message, System.Net.HttpStatusCode code = System.Net.HttpStatusCode.BadRequest) + { + ReportServerError(message, code); + } + + public bool LongPollCheck(EventPollNotify poller, ref long id, out bool isError) + { + HttpServer.HttpInput input = String.Equals(Request.Method, "POST", StringComparison.OrdinalIgnoreCase) ? Request.Form : Request.QueryString; + if (Library.Utility.Utility.ParseBool(input["longpoll"].Value, false)) + { + long lastEventId; + if (!long.TryParse(input["lasteventid"].Value, out lastEventId)) + { + ReportClientError("When activating long poll, the request must include the last event id", System.Net.HttpStatusCode.BadRequest); + isError = true; + return false; + } + + TimeSpan ts; + try { ts = Library.Utility.Timeparser.ParseTimeSpan(input["duration"].Value); } + catch (Exception ex) + { + ReportClientError("Invalid duration: " + ex.Message, System.Net.HttpStatusCode.BadRequest); + isError = true; + return false; + } + + if (ts <= TimeSpan.FromSeconds(10) || ts.TotalMilliseconds > int.MaxValue) + { + ReportClientError("Invalid duration, must be at least 10 seconds, and less than " + int.MaxValue + " milliseconds", System.Net.HttpStatusCode.BadRequest); + isError = true; + return false; + } + + isError = false; + id = poller.Wait(lastEventId, (int)ts.TotalMilliseconds); + return true; + } + + isError = false; + return false; + } + + public void OutputOK(object item = null) + { + BodyWriter.OutputOK(item); + } + + public void OutputError(object item = null, System.Net.HttpStatusCode code = System.Net.HttpStatusCode.InternalServerError, string reason = null) + { + Response.Status = code; + Response.Reason = reason ?? "Error"; + BodyWriter.WriteJsonObject(item); + } + + public void Dispose() + { + if (BodyWriter != null) + { + var bw = BodyWriter; + BodyWriter = null; + bw.Dispose(); + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/ServerSetting.cs b/Duplicati.Library.RestAPI/RESTMethods/ServerSetting.cs similarity index 85% rename from Duplicati/Server/WebServer/RESTMethods/ServerSetting.cs rename to Duplicati.Library.RestAPI/RESTMethods/ServerSetting.cs index 9454c15fa..026f00ee2 100644 --- a/Duplicati/Server/WebServer/RESTMethods/ServerSetting.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/ServerSetting.cs @@ -1,111 +1,112 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class ServerSetting : IRESTMethodGET, IRESTMethodPUT, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - info.OutputError(null, System.Net.HttpStatusCode.BadRequest, "Key is missing"); - return; - } - - if (key.Equals("server-ssl-certificate", StringComparison.OrdinalIgnoreCase) || key.Equals("ServerSSLCertificate", StringComparison.OrdinalIgnoreCase)) - { - info.OutputOK(Program.DataConnection.ApplicationSettings.ServerSSLCertificate == null ? "False" : "True"); - return; - } - - if (key.StartsWith("--", StringComparison.Ordinal)) - { - var prop = Program.DataConnection.Settings.FirstOrDefault(x => string.Equals(key, x.Name, StringComparison.OrdinalIgnoreCase)); - info.OutputOK(prop == null ? null : prop.Value); - } - else - { - var prop = typeof(Database.ServerSettings).GetProperty(key); - if (prop == null) - info.OutputError(null, System.Net.HttpStatusCode.NotFound, "Not found"); - else - info.OutputOK(prop.GetValue(Program.DataConnection.ApplicationSettings)); - } - } - - public void PUT(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - info.OutputError(null, System.Net.HttpStatusCode.BadRequest, "Key is missing"); - return; - } - - if (key.Equals("server-ssl-certificate", StringComparison.OrdinalIgnoreCase) || key.Equals("ServerSSLCertificate", StringComparison.OrdinalIgnoreCase)) - { - info.OutputError(null, System.Net.HttpStatusCode.BadRequest, "Can only update SSL certificate from commandline"); - return; - } - - if (key.StartsWith("--", StringComparison.Ordinal)) - { - var settings = Program.DataConnection.Settings.ToList(); - - var prop = settings.FirstOrDefault(x => string.Equals(key, x.Name, StringComparison.OrdinalIgnoreCase)); - if (prop == null) - settings.Add(prop = new Database.Setting() { Name = key, Value = info.Request.Form["data"].Value }); - else - prop.Value = info.Request.Form["data"].Value; - - Program.DataConnection.Settings = settings.ToArray(); - - info.OutputOK(prop == null ? null : prop.Value); - } - else - { - var prop = typeof(Database.ServerSettings).GetProperty(key); - if (prop == null) - info.OutputError(null, System.Net.HttpStatusCode.NotFound, "Not found"); - else - { - var dict = new Dictionary(); - dict[key] = info.Request.Form["data"].Value; - Program.DataConnection.ApplicationSettings.UpdateSettings(dict, false); - info.OutputOK(); - } - } - } - - public string Description { get { return "Return a list of settings for the server"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(string)), - new KeyValuePair(HttpServer.Method.Put, typeof(string)) - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class ServerSetting : IRESTMethodGET, IRESTMethodPUT, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + info.OutputError(null, System.Net.HttpStatusCode.BadRequest, "Key is missing"); + return; + } + + if (key.Equals("server-ssl-certificate", StringComparison.OrdinalIgnoreCase) || key.Equals("ServerSSLCertificate", StringComparison.OrdinalIgnoreCase)) + { + info.OutputOK(FIXMEGlobal.DataConnection.ApplicationSettings.ServerSSLCertificate == null ? "False" : "True"); + return; + } + + if (key.StartsWith("--", StringComparison.Ordinal)) + { + var prop = FIXMEGlobal.DataConnection.Settings.FirstOrDefault(x => string.Equals(key, x.Name, StringComparison.OrdinalIgnoreCase)); + info.OutputOK(prop == null ? null : prop.Value); + } + else + { + var prop = typeof(Database.ServerSettings).GetProperty(key); + if (prop == null) + info.OutputError(null, System.Net.HttpStatusCode.NotFound, "Not found"); + else + info.OutputOK(prop.GetValue(FIXMEGlobal.DataConnection.ApplicationSettings)); + } + } + + public void PUT(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + info.OutputError(null, System.Net.HttpStatusCode.BadRequest, "Key is missing"); + return; + } + + if (key.Equals("server-ssl-certificate", StringComparison.OrdinalIgnoreCase) || key.Equals("ServerSSLCertificate", StringComparison.OrdinalIgnoreCase)) + { + info.OutputError(null, System.Net.HttpStatusCode.BadRequest, "Can only update SSL certificate from commandline"); + return; + } + + if (key.StartsWith("--", StringComparison.Ordinal)) + { + var settings = FIXMEGlobal.DataConnection.Settings.ToList(); + + var prop = settings.FirstOrDefault(x => string.Equals(key, x.Name, StringComparison.OrdinalIgnoreCase)); + if (prop == null) + settings.Add(prop = new Database.Setting() { Name = key, Value = info.Request.Form["data"].Value }); + else + prop.Value = info.Request.Form["data"].Value; + + FIXMEGlobal.DataConnection.Settings = settings.ToArray(); + + info.OutputOK(prop == null ? null : prop.Value); + } + else + { + var prop = typeof(Database.ServerSettings).GetProperty(key); + if (prop == null) + info.OutputError(null, System.Net.HttpStatusCode.NotFound, "Not found"); + else + { + var dict = new Dictionary(); + dict[key] = info.Request.Form["data"].Value; + FIXMEGlobal.DataConnection.ApplicationSettings.UpdateSettings(dict, false); + info.OutputOK(); + } + } + } + + public string Description { get { return "Return a list of settings for the server"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(string)), + new KeyValuePair(HttpServer.Method.Put, typeof(string)) + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/ServerSettings.cs b/Duplicati.Library.RestAPI/RESTMethods/ServerSettings.cs similarity index 89% rename from Duplicati/Server/WebServer/RESTMethods/ServerSettings.cs rename to Duplicati.Library.RestAPI/RESTMethods/ServerSettings.cs index cb09037d8..093e0e6d2 100644 --- a/Duplicati/Server/WebServer/RESTMethods/ServerSettings.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/ServerSettings.cs @@ -1,126 +1,127 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Collections.Generic; -using Duplicati.Server.Database; -using System.IO; -using Duplicati.Server.Serialization; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class ServerSettings : IRESTMethodGET, IRESTMethodPATCH, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - // Join server settings and global settings - var adv_props = - Program.DataConnection.GetSettings(Database.Connection.SERVER_SETTINGS_ID) - .Where(x => !string.IsNullOrWhiteSpace(x.Name)) - .Union( - Program.DataConnection.Settings - .Where(x => !string.IsNullOrWhiteSpace(x.Name) && x.Name.StartsWith("--", StringComparison.Ordinal)) - ); - - var dict = new Dictionary(); - foreach (var n in adv_props) - dict[n.Name] = n.Value; - - string sslcert; - dict.TryGetValue("server-ssl-certificate", out sslcert); - dict["server-ssl-certificate"] = (!string.IsNullOrWhiteSpace(sslcert)).ToString(); - - info.OutputOK(dict); - } - - public void PATCH(string key, RequestInfo info) - { - string str = info.Request.Form["data"].Value; - - if (string.IsNullOrWhiteSpace(str)) - str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); - - if (string.IsNullOrWhiteSpace(str)) - { - info.ReportClientError("Missing data object", System.Net.HttpStatusCode.BadRequest); - return; - } - - Dictionary data = null; - try - { - data = Serializer.Deserialize>(new StringReader(str)); - if (data == null) - { - info.ReportClientError("Data object had no entry", System.Net.HttpStatusCode.BadRequest); - return; - } - - // Split into server settings and global settings - - var serversettings = data.Where(x => !string.IsNullOrWhiteSpace(x.Key)).ToDictionary(x => x.Key, x => x.Key.StartsWith("--", StringComparison.Ordinal) ? null : x.Value); - var globalsettings = data.Where(x => !string.IsNullOrWhiteSpace(x.Key) && x.Key.StartsWith("--", StringComparison.Ordinal)); - - serversettings.Remove("server-ssl-certificate"); - serversettings.Remove("ServerSSLCertificate"); - - if (serversettings.Any()) - Program.DataConnection.ApplicationSettings.UpdateSettings(serversettings, false); - - if (globalsettings.Any()) - { - // Update based on inputs - var existing = Program.DataConnection.Settings.ToDictionary(x => x.Name, x => x); - foreach (var g in globalsettings) - if (g.Value == null) - existing.Remove(g.Key); - else - { - if (existing.ContainsKey(g.Key)) - existing[g.Key].Value = g.Value; - else - existing[g.Key] = new Setting() { Name = g.Key, Value = g.Value }; - } - - Program.DataConnection.Settings = existing.Select(x => x.Value).ToArray(); - } - - info.OutputOK(); - } - catch (Exception ex) - { - if (data == null) - info.ReportClientError(string.Format("Unable to parse data object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); - else - info.ReportClientError(string.Format("Unable to save settings: {0}", ex.Message), System.Net.HttpStatusCode.InternalServerError); - } - } - - public string Description { get { return "Return a list of settings for the server"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(Database.ServerSettings)) - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Collections.Generic; +using Duplicati.Server.Database; +using System.IO; +using Duplicati.Server.Serialization; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class ServerSettings : IRESTMethodGET, IRESTMethodPATCH, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + // Join server settings and global settings + var adv_props = + FIXMEGlobal.DataConnection.GetSettings(Database.Connection.SERVER_SETTINGS_ID) + .Where(x => !string.IsNullOrWhiteSpace(x.Name)) + .Union( + FIXMEGlobal.DataConnection.Settings + .Where(x => !string.IsNullOrWhiteSpace(x.Name) && x.Name.StartsWith("--", StringComparison.Ordinal)) + ); + + var dict = new Dictionary(); + foreach (var n in adv_props) + dict[n.Name] = n.Value; + + string sslcert; + dict.TryGetValue("server-ssl-certificate", out sslcert); + dict["server-ssl-certificate"] = (!string.IsNullOrWhiteSpace(sslcert)).ToString(); + + info.OutputOK(dict); + } + + public void PATCH(string key, RequestInfo info) + { + string str = info.Request.Form["data"].Value; + + if (string.IsNullOrWhiteSpace(str)) + str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); + + if (string.IsNullOrWhiteSpace(str)) + { + info.ReportClientError("Missing data object", System.Net.HttpStatusCode.BadRequest); + return; + } + + Dictionary data = null; + try + { + data = Serializer.Deserialize>(new StringReader(str)); + if (data == null) + { + info.ReportClientError("Data object had no entry", System.Net.HttpStatusCode.BadRequest); + return; + } + + // Split into server settings and global settings + + var serversettings = data.Where(x => !string.IsNullOrWhiteSpace(x.Key)).ToDictionary(x => x.Key, x => x.Key.StartsWith("--", StringComparison.Ordinal) ? null : x.Value); + var globalsettings = data.Where(x => !string.IsNullOrWhiteSpace(x.Key) && x.Key.StartsWith("--", StringComparison.Ordinal)); + + serversettings.Remove("server-ssl-certificate"); + serversettings.Remove("ServerSSLCertificate"); + + if (serversettings.Any()) + FIXMEGlobal.DataConnection.ApplicationSettings.UpdateSettings(serversettings, false); + + if (globalsettings.Any()) + { + // Update based on inputs + var existing = FIXMEGlobal.DataConnection.Settings.ToDictionary(x => x.Name, x => x); + foreach (var g in globalsettings) + if (g.Value == null) + existing.Remove(g.Key); + else + { + if (existing.ContainsKey(g.Key)) + existing[g.Key].Value = g.Value; + else + existing[g.Key] = new Setting() { Name = g.Key, Value = g.Value }; + } + + FIXMEGlobal.DataConnection.Settings = existing.Select(x => x.Value).ToArray(); + } + + info.OutputOK(); + } + catch (Exception ex) + { + if (data == null) + info.ReportClientError(string.Format("Unable to parse data object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); + else + info.ReportClientError(string.Format("Unable to save settings: {0}", ex.Message), System.Net.HttpStatusCode.InternalServerError); + } + } + + public string Description { get { return "Return a list of settings for the server"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(Database.ServerSettings)) + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/ServerState.cs b/Duplicati.Library.RestAPI/RESTMethods/ServerState.cs similarity index 89% rename from Duplicati/Server/WebServer/RESTMethods/ServerState.cs rename to Duplicati.Library.RestAPI/RESTMethods/ServerState.cs index 89c065a72..835790aed 100644 --- a/Duplicati/Server/WebServer/RESTMethods/ServerState.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/ServerState.cs @@ -1,99 +1,100 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class ServerState : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - bool isError; - long id = 0; - long.TryParse(key, out id); - - if (info.LongPollCheck(Program.StatusEventNotifyer, ref id, out isError)) - { - //Make sure we do not report a higher number than the eventnotifier says - var st = new Serializable.ServerStatus(); - st.LastEventID = id; - info.OutputOK(st); - } - else if (!isError) - { - info.OutputOK(new Serializable.ServerStatus()); - } - } - - public void POST(string key, RequestInfo info) - { - var input = info.Request.Form; - switch ((key ?? "").ToLowerInvariant()) - { - case "pause": - if (input.Contains("duration") && !string.IsNullOrWhiteSpace(input["duration"].Value)) - { - TimeSpan ts; - try - { - ts = Library.Utility.Timeparser.ParseTimeSpan(input["duration"].Value); - } - catch (Exception ex) - { - info.ReportClientError(ex.Message, System.Net.HttpStatusCode.BadRequest); - return; - } - if (ts.TotalMilliseconds > 0) - Program.LiveControl.Pause(ts); - else - Program.LiveControl.Pause(); - } - else - { - Program.LiveControl.Pause(); - } - - info.OutputOK(); - return; - - case "resume": - Program.LiveControl.Resume(); - info.OutputOK(); - return; - - default: - info.ReportClientError("No such action", System.Net.HttpStatusCode.NotFound); - return; - } - } - - public string Description { get { return "Return the state of the server. This method can be long-polled."; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(Serializable.ServerStatus)), - new KeyValuePair(HttpServer.Method.Post, typeof(Serializable.ServerStatus)) - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Collections.Generic; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class ServerState : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + bool isError; + long id = 0; + long.TryParse(key, out id); + + if (info.LongPollCheck(FIXMEGlobal.StatusEventNotifyer, ref id, out isError)) + { + //Make sure we do not report a higher number than the eventnotifier says + var st = new Serializable.ServerStatus(); + st.LastEventID = id; + info.OutputOK(st); + } + else if (!isError) + { + info.OutputOK(new Serializable.ServerStatus()); + } + } + + public void POST(string key, RequestInfo info) + { + var input = info.Request.Form; + switch ((key ?? "").ToLowerInvariant()) + { + case "pause": + if (input.Contains("duration") && !string.IsNullOrWhiteSpace(input["duration"].Value)) + { + TimeSpan ts; + try + { + ts = Library.Utility.Timeparser.ParseTimeSpan(input["duration"].Value); + } + catch (Exception ex) + { + info.ReportClientError(ex.Message, System.Net.HttpStatusCode.BadRequest); + return; + } + if (ts.TotalMilliseconds > 0) + FIXMEGlobal.LiveControl.Pause(ts); + else + FIXMEGlobal.LiveControl.Pause(); + } + else + { + FIXMEGlobal.LiveControl.Pause(); + } + + info.OutputOK(); + return; + + case "resume": + FIXMEGlobal.LiveControl.Resume(); + info.OutputOK(); + return; + + default: + info.ReportClientError("No such action", System.Net.HttpStatusCode.NotFound); + return; + } + } + + public string Description { get { return "Return the state of the server. This method can be long-polled."; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(Serializable.ServerStatus)), + new KeyValuePair(HttpServer.Method.Post, typeof(Serializable.ServerStatus)) + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/SystemInfo.cs b/Duplicati.Library.RestAPI/RESTMethods/SystemInfo.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/SystemInfo.cs rename to Duplicati.Library.RestAPI/RESTMethods/SystemInfo.cs index 3932e895a..e077772ca 100644 --- a/Duplicati/Server/WebServer/RESTMethods/SystemInfo.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/SystemInfo.cs @@ -1,126 +1,127 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Collections.Generic; -using Duplicati.Library.Interface; +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Collections.Generic; +using Duplicati.Library.Interface; using Duplicati.Library.Common; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class SystemInfo : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented + { + public string Description { get { return "Gets various system properties"; } } + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, SystemData(null).GetType()) + }; + } + } + + public void GET(string key, RequestInfo info) + { + info.BodyWriter.OutputOK(SystemData(info)); + } + + public void POST(string key, RequestInfo info) + { + switch ((key ?? "").ToLowerInvariant()) + { + case "suppressdonationmessages": + Library.Main.Utility.SuppressDonationMessages = true; + info.OutputOK(); + return; + + case "showdonationmessages": + Library.Main.Utility.SuppressDonationMessages = false; + info.OutputOK(); + return; + + default: + info.ReportClientError("No such action", System.Net.HttpStatusCode.NotFound); + return; + } + } + + private static object SystemData(RequestInfo info) + { + var browserlanguage = RESTHandler.ParseDefaultRequestCulture(info) ?? System.Globalization.CultureInfo.InvariantCulture; + + return new + { + APIVersion = 1, + PasswordPlaceholder = Duplicati.Server.WebServer.Server.PASSWORD_PLACEHOLDER, + ServerVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), + ServerVersionName = Duplicati.License.VersionNumbers.Version, + ServerVersionType = Duplicati.Library.AutoUpdater.UpdaterManager.SelfVersion.ReleaseType, + StartedBy = FIXMEGlobal.Origin, + BaseVersionName = Duplicati.Library.AutoUpdater.UpdaterManager.BaseVersion.Displayname, + DefaultUpdateChannel = Duplicati.Library.AutoUpdater.AutoUpdateSettings.DefaultUpdateChannel, + DefaultUsageReportLevel = Duplicati.Library.UsageReporter.Reporter.DefaultReportLevel, + ServerTime = DateTime.Now, + OSType = Platform.IsClientPosix ? (Platform.IsClientOSX ? "OSX" : "Linux") : "Windows", + DirectorySeparator = System.IO.Path.DirectorySeparatorChar, + PathSeparator = System.IO.Path.PathSeparator, + CaseSensitiveFilesystem = Duplicati.Library.Utility.Utility.IsFSCaseSensitive, + MonoVersion = Duplicati.Library.Utility.Utility.IsMono ? Duplicati.Library.Utility.Utility.MonoVersion.ToString() : null, + MachineName = System.Environment.MachineName, + UserName = System.Environment.UserName, + NewLine = System.Environment.NewLine, + CLRVersion = System.Environment.Version.ToString(), + CLROSInfo = new + { + Platform = System.Environment.OSVersion.Platform.ToString(), + ServicePack = System.Environment.OSVersion.ServicePack, + Version = System.Environment.OSVersion.Version.ToString(), + VersionString = System.Environment.OSVersion.VersionString + }, + Options = Serializable.ServerSettings.Options, + CompressionModules = Serializable.ServerSettings.CompressionModules, + EncryptionModules = Serializable.ServerSettings.EncryptionModules, + BackendModules = Serializable.ServerSettings.BackendModules, + GenericModules = Serializable.ServerSettings.GenericModules, + WebModules = Serializable.ServerSettings.WebModules, + ConnectionModules = Serializable.ServerSettings.ConnectionModules, + ServerModules = Serializable.ServerSettings.ServerModules, + UsingAlternateUpdateURLs = Duplicati.Library.AutoUpdater.AutoUpdateSettings.UsesAlternateURLs, + LogLevels = Enum.GetNames(typeof(Duplicati.Library.Logging.LogMessageType)), + SuppressDonationMessages = Duplicati.Library.Main.Utility.SuppressDonationMessages, + SpecialFolders = from n in SpecialFolders.Nodes select new { ID = n.id, Path = n.resolvedpath }, + BrowserLocale = new + { + Code = browserlanguage.Name, + EnglishName = browserlanguage.EnglishName, + DisplayName = browserlanguage.NativeName + }, + SupportedLocales = + Library.Localization.LocalizationService.SupportedCultures + .Select(x => new { + Code = x, + EnglishName = new System.Globalization.CultureInfo(x).EnglishName, + DisplayName = new System.Globalization.CultureInfo(x).NativeName + } + ), + BrowserLocaleSupported = Library.Localization.LocalizationService.isCultureSupported(browserlanguage) + }; + } + } +} -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class SystemInfo : IRESTMethodGET, IRESTMethodPOST, IRESTMethodDocumented - { - public string Description { get { return "Gets various system properties"; } } - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, SystemData(null).GetType()) - }; - } - } - - public void GET(string key, RequestInfo info) - { - info.BodyWriter.OutputOK(SystemData(info)); - } - - public void POST(string key, RequestInfo info) - { - switch ((key ?? "").ToLowerInvariant()) - { - case "suppressdonationmessages": - Library.Main.Utility.SuppressDonationMessages = true; - info.OutputOK(); - return; - - case "showdonationmessages": - Library.Main.Utility.SuppressDonationMessages = false; - info.OutputOK(); - return; - - default: - info.ReportClientError("No such action", System.Net.HttpStatusCode.NotFound); - return; - } - } - - private static object SystemData(RequestInfo info) - { - var browserlanguage = RESTHandler.ParseDefaultRequestCulture(info) ?? System.Globalization.CultureInfo.InvariantCulture; - - return new - { - APIVersion = 1, - PasswordPlaceholder = Duplicati.Server.WebServer.Server.PASSWORD_PLACEHOLDER, - ServerVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(), - ServerVersionName = Duplicati.License.VersionNumbers.Version, - ServerVersionType = Duplicati.Library.AutoUpdater.UpdaterManager.SelfVersion.ReleaseType, - StartedBy = Duplicati.Server.Program.Origin, - BaseVersionName = Duplicati.Library.AutoUpdater.UpdaterManager.BaseVersion.Displayname, - DefaultUpdateChannel = Duplicati.Library.AutoUpdater.AutoUpdateSettings.DefaultUpdateChannel, - DefaultUsageReportLevel = Duplicati.Library.UsageReporter.Reporter.DefaultReportLevel, - ServerTime = DateTime.Now, - OSType = Platform.IsClientPosix ? (Platform.IsClientOSX ? "OSX" : "Linux") : "Windows", - DirectorySeparator = System.IO.Path.DirectorySeparatorChar, - PathSeparator = System.IO.Path.PathSeparator, - CaseSensitiveFilesystem = Duplicati.Library.Utility.Utility.IsFSCaseSensitive, - MonoVersion = Duplicati.Library.Utility.Utility.IsMono ? Duplicati.Library.Utility.Utility.MonoVersion.ToString() : null, - MachineName = System.Environment.MachineName, - UserName = System.Environment.UserName, - NewLine = System.Environment.NewLine, - CLRVersion = System.Environment.Version.ToString(), - CLROSInfo = new - { - Platform = System.Environment.OSVersion.Platform.ToString(), - ServicePack = System.Environment.OSVersion.ServicePack, - Version = System.Environment.OSVersion.Version.ToString(), - VersionString = System.Environment.OSVersion.VersionString - }, - Options = Serializable.ServerSettings.Options, - CompressionModules = Serializable.ServerSettings.CompressionModules, - EncryptionModules = Serializable.ServerSettings.EncryptionModules, - BackendModules = Serializable.ServerSettings.BackendModules, - GenericModules = Serializable.ServerSettings.GenericModules, - WebModules = Serializable.ServerSettings.WebModules, - ConnectionModules = Serializable.ServerSettings.ConnectionModules, - ServerModules = Serializable.ServerSettings.ServerModules, - UsingAlternateUpdateURLs = Duplicati.Library.AutoUpdater.AutoUpdateSettings.UsesAlternateURLs, - LogLevels = Enum.GetNames(typeof(Duplicati.Library.Logging.LogMessageType)), - SuppressDonationMessages = Duplicati.Library.Main.Utility.SuppressDonationMessages, - SpecialFolders = from n in SpecialFolders.Nodes select new { ID = n.id, Path = n.resolvedpath }, - BrowserLocale = new - { - Code = browserlanguage.Name, - EnglishName = browserlanguage.EnglishName, - DisplayName = browserlanguage.NativeName - }, - SupportedLocales = - Library.Localization.LocalizationService.SupportedCultures - .Select(x => new { - Code = x, - EnglishName = new System.Globalization.CultureInfo(x).EnglishName, - DisplayName = new System.Globalization.CultureInfo(x).NativeName - } - ), - BrowserLocaleSupported = Library.Localization.LocalizationService.isCultureSupported(browserlanguage) - }; - } - } -} - diff --git a/Duplicati/Server/WebServer/RESTMethods/SystemWideSettings.cs b/Duplicati.Library.RestAPI/RESTMethods/SystemWideSettings.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/SystemWideSettings.cs rename to Duplicati.Library.RestAPI/RESTMethods/SystemWideSettings.cs index 853192ce3..1a7ba3056 100644 --- a/Duplicati/Server/WebServer/RESTMethods/SystemWideSettings.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/SystemWideSettings.cs @@ -1,44 +1,44 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using Duplicati.Library.Interface; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class SystemWideSettings : IRESTMethodGET, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - info.OutputOK(new Duplicati.Library.Main.Options(new Dictionary()).SupportedCommands); - } - - public string Description { get { return "Return a list of settings that can be applied to all backups on a system-wide basis"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(ICommandLineArgument[])) - }; - } - } - - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using Duplicati.Library.Interface; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class SystemWideSettings : IRESTMethodGET, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + info.OutputOK(new Duplicati.Library.Main.Options(new Dictionary()).SupportedCommands); + } + + public string Description { get { return "Return a list of settings that can be applied to all backups on a system-wide basis"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(ICommandLineArgument[])) + }; + } + } + + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Tags.cs b/Duplicati.Library.RestAPI/RESTMethods/Tags.cs similarity index 90% rename from Duplicati/Server/WebServer/RESTMethods/Tags.cs rename to Duplicati.Library.RestAPI/RESTMethods/Tags.cs index c2cb447c0..d5d8fd587 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Tags.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Tags.cs @@ -1,54 +1,55 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Tags : IRESTMethodGET, IRESTMethodDocumented - { - public void GET(string key, RequestInfo info) - { - var r = - from n in - Serializable.ServerSettings.CompressionModules - .Union(Serializable.ServerSettings.EncryptionModules) - .Union(Serializable.ServerSettings.BackendModules) - .Union(Serializable.ServerSettings.GenericModules) - select n.Key.ToLower(CultureInfo.InvariantCulture); - - // Append all known tags - r = r.Union(from n in Program.DataConnection.Backups select n.Tags into p from x in p select x.ToLower(CultureInfo.InvariantCulture)); - info.OutputOK(r); - } - - public string Description { get { return "Gets the list of tags"; } } - - public IEnumerable> Types - { - get - { - return new KeyValuePair[] { - new KeyValuePair(HttpServer.Method.Get, typeof(string[])), - }; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Tags : IRESTMethodGET, IRESTMethodDocumented + { + public void GET(string key, RequestInfo info) + { + var r = + from n in + Serializable.ServerSettings.CompressionModules + .Union(Serializable.ServerSettings.EncryptionModules) + .Union(Serializable.ServerSettings.BackendModules) + .Union(Serializable.ServerSettings.GenericModules) + select n.Key.ToLower(CultureInfo.InvariantCulture); + + // Append all known tags + r = r.Union(from n in FIXMEGlobal.DataConnection.Backups select n.Tags into p from x in p select x.ToLower(CultureInfo.InvariantCulture)); + info.OutputOK(r); + } + + public string Description { get { return "Gets the list of tags"; } } + + public IEnumerable> Types + { + get + { + return new KeyValuePair[] { + new KeyValuePair(HttpServer.Method.Get, typeof(string[])), + }; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Task.cs b/Duplicati.Library.RestAPI/RESTMethods/Task.cs similarity index 88% rename from Duplicati/Server/WebServer/RESTMethods/Task.cs rename to Duplicati.Library.RestAPI/RESTMethods/Task.cs index 756dd2e3e..24b3c24f9 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Task.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Task.cs @@ -1,111 +1,112 @@ -#region Disclaimer / License -// Copyright (C) 2019, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Linq; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Task : IRESTMethodGET, IRESTMethodPOST - { - public void GET(string key, RequestInfo info) - { - var parts = (key ?? "").Split(new char[] { '/' }, 2); - long taskid; - if (long.TryParse(parts.FirstOrDefault(), out taskid)) - { - var task = Program.WorkThread.CurrentTask; - var tasks = Program.WorkThread.CurrentTasks; - - if (task != null && task.TaskID == taskid) - { - info.OutputOK(new { Status = "Running" }); - return; - } - - if (tasks.FirstOrDefault(x => x.TaskID == taskid) == null) - { - KeyValuePair[] matches; - lock(Program.MainLock) - matches = Program.TaskResultCache.Where(x => x.Key == taskid).ToArray(); - - if (matches.Length == 0) - info.ReportClientError("No such task found", System.Net.HttpStatusCode.NotFound); - else - info.OutputOK(new { - Status = matches[0].Value == null ? "Completed" : "Failed", - ErrorMessage = matches[0].Value == null ? null : matches[0].Value.Message, - Exception = matches[0].Value == null ? null : matches[0].Value.ToString() - }); - } - else - { - info.OutputOK(new { Status = "Waiting" }); - } - } - else - { - info.ReportClientError("Invalid request", System.Net.HttpStatusCode.BadRequest); - } - } - - public void POST(string key, RequestInfo info) - { - var parts = (key ?? "").Split(new char[] { '/' }, 2); - long taskid; - if (parts.Length == 2 && long.TryParse(parts.First(), out taskid)) - { - var task = Program.WorkThread.CurrentTask; - var tasks = Program.WorkThread.CurrentTasks; - - if (task != null) - tasks.Insert(0, task); - - task = tasks.FirstOrDefault(x => x.TaskID == taskid); - if (task == null) - { - info.ReportClientError("No such task", System.Net.HttpStatusCode.NotFound); - return; - } - - switch (parts.Last().ToLowerInvariant()) - { - case "stopaftercurrentfile": - task.Stop(allowCurrentFileToFinish: true); - info.OutputOK(); - return; - - case "stopnow": - task.Stop(allowCurrentFileToFinish: false); - info.OutputOK(); - return; - - case "abort": - task.Abort(); - info.OutputOK(); - return; - } - } - - info.ReportClientError("Invalid or missing task id", System.Net.HttpStatusCode.NotFound); - } - } -} - +#region Disclaimer / License +// Copyright (C) 2019, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +#endregion +using System; +using System.Linq; +using System.Collections.Generic; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Task : IRESTMethodGET, IRESTMethodPOST + { + public void GET(string key, RequestInfo info) + { + var parts = (key ?? "").Split(new char[] { '/' }, 2); + long taskid; + if (long.TryParse(parts.FirstOrDefault(), out taskid)) + { + var task = FIXMEGlobal.WorkThread.CurrentTask; + var tasks = FIXMEGlobal.WorkThread.CurrentTasks; + + if (task != null && task.TaskID == taskid) + { + info.OutputOK(new { Status = "Running" }); + return; + } + + if (tasks.FirstOrDefault(x => x.TaskID == taskid) == null) + { + KeyValuePair[] matches; + lock(FIXMEGlobal.MainLock) + matches = FIXMEGlobal.TaskResultCache.Where(x => x.Key == taskid).ToArray(); + + if (matches.Length == 0) + info.ReportClientError("No such task found", System.Net.HttpStatusCode.NotFound); + else + info.OutputOK(new { + Status = matches[0].Value == null ? "Completed" : "Failed", + ErrorMessage = matches[0].Value == null ? null : matches[0].Value.Message, + Exception = matches[0].Value == null ? null : matches[0].Value.ToString() + }); + } + else + { + info.OutputOK(new { Status = "Waiting" }); + } + } + else + { + info.ReportClientError("Invalid request", System.Net.HttpStatusCode.BadRequest); + } + } + + public void POST(string key, RequestInfo info) + { + var parts = (key ?? "").Split(new char[] { '/' }, 2); + long taskid; + if (parts.Length == 2 && long.TryParse(parts.First(), out taskid)) + { + var task = FIXMEGlobal.WorkThread.CurrentTask; + var tasks = FIXMEGlobal.WorkThread.CurrentTasks; + + if (task != null) + tasks.Insert(0, task); + + task = tasks.FirstOrDefault(x => x.TaskID == taskid); + if (task == null) + { + info.ReportClientError("No such task", System.Net.HttpStatusCode.NotFound); + return; + } + + switch (parts.Last().ToLowerInvariant()) + { + case "stopaftercurrentfile": + task.Stop(allowCurrentFileToFinish: true); + info.OutputOK(); + return; + + case "stopnow": + task.Stop(allowCurrentFileToFinish: false); + info.OutputOK(); + return; + + case "abort": + task.Abort(); + info.OutputOK(); + return; + } + } + + info.ReportClientError("Invalid or missing task id", System.Net.HttpStatusCode.NotFound); + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Tasks.cs b/Duplicati.Library.RestAPI/RESTMethods/Tasks.cs similarity index 88% rename from Duplicati/Server/WebServer/RESTMethods/Tasks.cs rename to Duplicati.Library.RestAPI/RESTMethods/Tasks.cs index 0309a794a..731cec902 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Tasks.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Tasks.cs @@ -1,36 +1,37 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Tasks : IRESTMethodGET - { - public void GET(string key, RequestInfo info) - { - var cur = Program.WorkThread.CurrentTask; - var n = Program.WorkThread.CurrentTasks; - - if (cur != null) - n.Insert(0, cur); - - info.OutputOK(n); - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; +using System.Collections.Generic; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Tasks : IRESTMethodGET + { + public void GET(string key, RequestInfo info) + { + var cur = FIXMEGlobal.WorkThread.CurrentTask; + var n = FIXMEGlobal.WorkThread.CurrentTasks; + + if (cur != null) + n.Insert(0, cur); + + info.OutputOK(n); + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/UISettings.cs b/Duplicati.Library.RestAPI/RESTMethods/UISettings.cs similarity index 86% rename from Duplicati/Server/WebServer/RESTMethods/UISettings.cs rename to Duplicati.Library.RestAPI/RESTMethods/UISettings.cs index 9966652c9..633ed00b6 100644 --- a/Duplicati/Server/WebServer/RESTMethods/UISettings.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/UISettings.cs @@ -1,77 +1,78 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Generic; -using Duplicati.Server.Serialization; -using System.IO; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class UISettings : IRESTMethodGET, IRESTMethodPOST, IRESTMethodPATCH - { - public void GET(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - info.OutputOK(Program.DataConnection.GetUISettingsSchemes()); - } - else - { - info.OutputOK(Program.DataConnection.GetUISettings(key)); - } - } - - public void POST(string key, RequestInfo info) - { - PATCH(key, info); - } - - public void PATCH(string key, RequestInfo info) - { - if (string.IsNullOrWhiteSpace(key)) - { - info.ReportClientError("Scheme is missing", System.Net.HttpStatusCode.BadRequest); - return; - } - - IDictionary data; - try - { - data = Serializer.Deserialize>(new StreamReader(info.Request.Body)); - } - catch (Exception ex) - { - info.ReportClientError(string.Format("Unable to parse settings object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); - return; - } - - if (data == null) - { - info.ReportClientError("Unable to parse settings object", System.Net.HttpStatusCode.BadRequest); - return; - } - - if (info.Request.Method == "POST") - Program.DataConnection.SetUISettings(key, data); - else - Program.DataConnection.UpdateUISettings(key, data); - info.OutputOK(); - } - - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Generic; +using Duplicati.Server.Serialization; +using System.IO; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class UISettings : IRESTMethodGET, IRESTMethodPOST, IRESTMethodPATCH + { + public void GET(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + info.OutputOK(FIXMEGlobal.DataConnection.GetUISettingsSchemes()); + } + else + { + info.OutputOK(FIXMEGlobal.DataConnection.GetUISettings(key)); + } + } + + public void POST(string key, RequestInfo info) + { + PATCH(key, info); + } + + public void PATCH(string key, RequestInfo info) + { + if (string.IsNullOrWhiteSpace(key)) + { + info.ReportClientError("Scheme is missing", System.Net.HttpStatusCode.BadRequest); + return; + } + + IDictionary data; + try + { + data = Serializer.Deserialize>(new StreamReader(info.Request.Body)); + } + catch (Exception ex) + { + info.ReportClientError(string.Format("Unable to parse settings object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); + return; + } + + if (data == null) + { + info.ReportClientError("Unable to parse settings object", System.Net.HttpStatusCode.BadRequest); + return; + } + + if (info.Request.Method == "POST") + FIXMEGlobal.DataConnection.SetUISettings(key, data); + else + FIXMEGlobal.DataConnection.UpdateUISettings(key, data); + info.OutputOK(); + } + + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/Updates.cs b/Duplicati.Library.RestAPI/RESTMethods/Updates.cs similarity index 84% rename from Duplicati/Server/WebServer/RESTMethods/Updates.cs rename to Duplicati.Library.RestAPI/RESTMethods/Updates.cs index 8e72449a2..a8f5d3f20 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Updates.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Updates.cs @@ -1,56 +1,57 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class Updates : IRESTMethodPOST - { - public void POST(string key, RequestInfo info) - { - switch ((key ?? "").ToLowerInvariant()) - { - case "check": - Program.UpdatePoller.CheckNow(); - info.OutputOK(); - return; - - case "install": - Program.UpdatePoller.InstallUpdate(); - info.OutputOK(); - return; - - case "activate": - if (Program.WorkThread.CurrentTask != null || Program.WorkThread.CurrentTasks.Count != 0) - { - info.ReportServerError("Cannot activate update while task is running or scheduled"); - } - else - { - Program.UpdatePoller.ActivateUpdate(); - info.OutputOK(); - } - return; - - default: - info.ReportClientError("No such action", System.Net.HttpStatusCode.NotFound); - return; - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Duplicati.Library.RestAPI; +using System; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class Updates : IRESTMethodPOST + { + public void POST(string key, RequestInfo info) + { + switch ((key ?? "").ToLowerInvariant()) + { + case "check": + FIXMEGlobal.UpdatePoller.CheckNow(); + info.OutputOK(); + return; + + case "install": + FIXMEGlobal.UpdatePoller.InstallUpdate(); + info.OutputOK(); + return; + + case "activate": + if (FIXMEGlobal.WorkThread.CurrentTask != null || FIXMEGlobal.WorkThread.CurrentTasks.Count != 0) + { + info.ReportServerError("Cannot activate update while task is running or scheduled"); + } + else + { + FIXMEGlobal.UpdatePoller.ActivateUpdate(); + info.OutputOK(); + } + return; + + default: + info.ReportClientError("No such action", System.Net.HttpStatusCode.NotFound); + return; + } + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/WebModule.cs b/Duplicati.Library.RestAPI/RESTMethods/WebModule.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/WebModule.cs rename to Duplicati.Library.RestAPI/RESTMethods/WebModule.cs index bf75c7ed1..f9643eb76 100644 --- a/Duplicati/Server/WebServer/RESTMethods/WebModule.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/WebModule.cs @@ -1,41 +1,41 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class WebModule : IRESTMethodPOST - { - public void POST(string key, RequestInfo info) - { - var m = Duplicati.Library.DynamicLoader.WebLoader.Modules.FirstOrDefault(x => x.Key.Equals(key, StringComparison.OrdinalIgnoreCase)); - if (m == null) - { - info.ReportClientError(string.Format("No such command {0}", key), System.Net.HttpStatusCode.NotFound); - return; - } - - info.OutputOK(new { - Status = "OK", - Result = m.Execute(info.Request.Form.Where(x => !x.Name.Equals("command", StringComparison.OrdinalIgnoreCase) - ).ToDictionary(x => x.Name, x => x.Value)) - }); - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class WebModule : IRESTMethodPOST + { + public void POST(string key, RequestInfo info) + { + var m = Duplicati.Library.DynamicLoader.WebLoader.Modules.FirstOrDefault(x => x.Key.Equals(key, StringComparison.OrdinalIgnoreCase)); + if (m == null) + { + info.ReportClientError(string.Format("No such command {0}", key), System.Net.HttpStatusCode.NotFound); + return; + } + + info.OutputOK(new { + Status = "OK", + Result = m.Execute(info.Request.Form.Where(x => !x.Name.Equals("command", StringComparison.OrdinalIgnoreCase) + ).ToDictionary(x => x.Name, x => x.Value)) + }); + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTMethods/WebModules.cs b/Duplicati.Library.RestAPI/RESTMethods/WebModules.cs similarity index 97% rename from Duplicati/Server/WebServer/RESTMethods/WebModules.cs rename to Duplicati.Library.RestAPI/RESTMethods/WebModules.cs index 6205bd8b2..daa842bcf 100644 --- a/Duplicati/Server/WebServer/RESTMethods/WebModules.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/WebModules.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; - -namespace Duplicati.Server.WebServer.RESTMethods -{ - public class WebModules : IRESTMethodGET - { - public void GET(string key, RequestInfo info) - { - info.OutputOK(Duplicati.Library.DynamicLoader.WebLoader.Modules); - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; + +namespace Duplicati.Server.WebServer.RESTMethods +{ + public class WebModules : IRESTMethodGET + { + public void GET(string key, RequestInfo info) + { + info.OutputOK(Duplicati.Library.DynamicLoader.WebLoader.Modules); + } + } +} + diff --git a/Duplicati/Server/Runner.cs b/Duplicati.Library.RestAPI/Runner.cs similarity index 92% rename from Duplicati/Server/Runner.cs rename to Duplicati.Library.RestAPI/Runner.cs index 33a230381..d4a159f71 100644 --- a/Duplicati/Server/Runner.cs +++ b/Duplicati.Library.RestAPI/Runner.cs @@ -1,965 +1,966 @@ -#region Disclaimer / License -// Copyright (C) 2019, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -#endregion -using System; -using System.Linq; -using System.Collections.Generic; -using Duplicati.Library.Interface; -using Duplicati.Server.Serialization; - -namespace Duplicati.Server -{ - public static class Runner - { - public interface IRunnerData : Duplicati.Server.Serialization.Interface.IQueuedTask - { - Duplicati.Server.Serialization.Interface.IBackup Backup { get; } - IDictionary ExtraOptions { get; } - string[] FilterStrings { get; } - void Stop(bool allowCurrentFileToFinish); - void Abort(); - void Pause(); - void Resume(); - void UpdateThrottleSpeed(); - void SetController(Duplicati.Library.Main.Controller controller); - } - - private class RunnerData : IRunnerData - { - private static long RunnerTaskID = 1; - - public Duplicati.Server.Serialization.DuplicatiOperation Operation { get; internal set; } - public Duplicati.Server.Serialization.Interface.IBackup Backup { get; internal set; } - public IDictionary ExtraOptions { get; internal set; } - public string[] FilterStrings { get; internal set; } - - public string BackupID { get { return Backup.ID; } } - public long TaskID { get { return m_taskID; } } - - internal Duplicati.Library.Main.Controller Controller { get; set; } - - public void SetController(Duplicati.Library.Main.Controller controller) - { - Controller = controller; - } - - public void Stop(bool allowCurrentFileToFinish) - { - var c = Controller; - if (c != null) - c.Stop(allowCurrentFileToFinish); - } - - public void Abort() - { - var c = Controller; - if (c != null) - c.Abort(); - } - - public void Pause() - { - var c = Controller; - if (c != null) - c.Pause(); - } - - public void Resume() - { - var c = Controller; - if (c != null) - c.Resume(); - } - - public long OriginalUploadSpeed { get; set; } - public long OriginalDownloadSpeed { get; set; } - - public void UpdateThrottleSpeed() - { - var controller = this.Controller; - if (controller == null) - return; - - var job_upload_throttle = this.OriginalUploadSpeed <= 0 ? long.MaxValue : this.OriginalUploadSpeed; - var job_download_throttle = this.OriginalDownloadSpeed <= 0 ? long.MaxValue : this.OriginalDownloadSpeed; - - var server_upload_throttle = long.MaxValue; - var server_download_throttle = long.MaxValue; - - try - { - if (!string.IsNullOrWhiteSpace(Program.DataConnection.ApplicationSettings.UploadSpeedLimit)) - server_upload_throttle = Duplicati.Library.Utility.Sizeparser.ParseSize(Program.DataConnection.ApplicationSettings.UploadSpeedLimit, "kb"); - } - catch { } - - try - { - if (!string.IsNullOrWhiteSpace(Program.DataConnection.ApplicationSettings.DownloadSpeedLimit)) - server_download_throttle = Duplicati.Library.Utility.Sizeparser.ParseSize(Program.DataConnection.ApplicationSettings.DownloadSpeedLimit, "kb"); - } - catch { } - - var upload_throttle = Math.Min(job_upload_throttle, server_upload_throttle); - var download_throttle = Math.Min(job_download_throttle, server_download_throttle); - - if (upload_throttle <= 0 || upload_throttle == long.MaxValue) - upload_throttle = 0; - - if (download_throttle <= 0 || download_throttle == long.MaxValue) - download_throttle = 0; - - controller.MaxUploadSpeed = upload_throttle; - controller.MaxDownloadSpeed = download_throttle; - } - - private readonly long m_taskID; - - public RunnerData() - { - m_taskID = System.Threading.Interlocked.Increment(ref RunnerTaskID); - } - } - - private class CustomRunnerTask : RunnerData - { - public readonly Action Run; - - public CustomRunnerTask(Action runner) - : base() - { - if (runner == null) - throw new ArgumentNullException(nameof(runner)); - Run = runner; - Operation = DuplicatiOperation.CustomRunner; - Backup = new Database.Backup(); - } - } - - public static IRunnerData CreateCustomTask(Action runner) - { - return new CustomRunnerTask(runner); - } - - public static IRunnerData CreateTask(Duplicati.Server.Serialization.DuplicatiOperation operation, Duplicati.Server.Serialization.Interface.IBackup backup, IDictionary extraOptions = null, string[] filterStrings = null) - { - return new RunnerData() { - Operation = operation, - Backup = backup, - ExtraOptions = extraOptions, - FilterStrings = filterStrings - }; - } - - public static IRunnerData CreateListTask(Duplicati.Server.Serialization.Interface.IBackup backup, string[] filters, bool onlyPrefix, bool allVersions, bool folderContents, DateTime time) - { - var dict = new Dictionary(); - if (onlyPrefix) - dict["list-prefix-only"] = "true"; - if (allVersions) - dict["all-versions"] = "true"; - if (time.Ticks > 0) - dict["time"] = Duplicati.Library.Utility.Utility.SerializeDateTime(time.ToUniversalTime()); - if (folderContents) - dict["list-folder-contents"] = "true"; - - return CreateTask( - DuplicatiOperation.List, - backup, - dict, - filters); - } - - public static IRunnerData CreateRestoreTask(Duplicati.Server.Serialization.Interface.IBackup backup, string[] filters, - DateTime time, string restoreTarget, bool overwrite, bool restore_permissions, - bool skip_metadata, string passphrase) - { - var dict = new Dictionary - { - ["time"] = Library.Utility.Utility.SerializeDateTime(time.ToUniversalTime()), - ["overwrite"] = overwrite? Boolean.TrueString : Boolean.FalseString, - ["restore-permissions"] = restore_permissions ? Boolean.TrueString : Boolean.FalseString, - ["skip-metadata"] = skip_metadata ? Boolean.TrueString : Boolean.FalseString, - ["allow-passphrase-change"] = Boolean.TrueString - }; - if (!string.IsNullOrWhiteSpace(restoreTarget)) - dict["restore-path"] = SpecialFolders.ExpandEnvironmentVariables(restoreTarget); - if (!(passphrase is null)) - dict["passphrase"] = passphrase; - - return CreateTask( - DuplicatiOperation.Restore, - backup, - dict, - filters); - } - private class MessageSink : Duplicati.Library.Main.IMessageSink - { - private class ProgressState : Server.Serialization.Interface.IProgressEventData - { - private readonly string m_backupID; - private readonly long m_taskID; - - internal Duplicati.Library.Main.BackendActionType m_backendAction; - internal string m_backendPath; - internal long m_backendFileSize; - internal long m_backendFileProgress; - internal long m_backendSpeed; - internal bool m_backendIsBlocking; - - internal string m_currentFilename; - internal long m_currentFilesize; - internal long m_currentFileoffset; - internal bool m_currentFilecomplete; - - internal Duplicati.Library.Main.OperationPhase m_phase; - internal float m_overallProgress; - internal long m_processedFileCount; - internal long m_processedFileSize; - internal long m_totalFileCount; - internal long m_totalFileSize; - internal bool m_stillCounting; - - public ProgressState(long taskId, string backupId) - { - m_backupID = backupId; - m_taskID = taskId; - } - - internal ProgressState Clone() - { - return (ProgressState)this.MemberwiseClone(); - } - - #region IProgressEventData implementation - public string BackupID { get { return m_backupID; } } - public long TaskID { get { return m_taskID; } } - public string BackendAction { get { return m_backendAction.ToString(); } } - public string BackendPath { get { return m_backendPath; } } - public long BackendFileSize { get { return m_backendFileSize; } } - public long BackendFileProgress { get { return m_backendFileProgress; } } - public long BackendSpeed { get { return m_backendSpeed; } } - public bool BackendIsBlocking { get { return m_backendIsBlocking; } } - public string CurrentFilename { get { return m_currentFilename; } } - public long CurrentFilesize { get { return m_currentFilesize; } } - public long CurrentFileoffset { get { return m_currentFileoffset; } } - public bool CurrentFilecomplete { get { return m_currentFilecomplete; } } - public string Phase { get { return m_phase.ToString(); } } - public float OverallProgress { get { return m_overallProgress; } } - public long ProcessedFileCount { get { return m_processedFileCount; } } - public long ProcessedFileSize { get { return m_processedFileSize; } } - public long TotalFileCount { get { return m_totalFileCount; } } - public long TotalFileSize { get { return m_totalFileSize; } } - public bool StillCounting { get { return m_stillCounting; } } - #endregion - } - - private readonly ProgressState m_state; - private Duplicati.Library.Main.IBackendProgress m_backendProgress; - private Duplicati.Library.Main.IOperationProgress m_operationProgress; - private readonly object m_lock = new object(); - - public MessageSink(long taskId, string backupId) - { - m_state = new ProgressState(taskId, backupId); - } - - public Server.Serialization.Interface.IProgressEventData Copy() - { - lock(m_lock) - { - if (m_backendProgress != null) - m_backendProgress.Update(out m_state.m_backendAction, out m_state.m_backendPath, out m_state.m_backendFileSize, out m_state.m_backendFileProgress, out m_state.m_backendSpeed, out m_state.m_backendIsBlocking); - if (m_operationProgress != null) - { - m_operationProgress.UpdateFile(out m_state.m_currentFilename, out m_state.m_currentFilesize, out m_state.m_currentFileoffset, out m_state.m_currentFilecomplete); - m_operationProgress.UpdateOverall(out m_state.m_phase, out m_state.m_overallProgress, out m_state.m_processedFileCount, out m_state.m_processedFileSize, out m_state.m_totalFileCount, out m_state.m_totalFileSize, out m_state.m_stillCounting); - } - - return m_state.Clone(); - } - } - - #region IMessageSink implementation - public void BackendEvent(Duplicati.Library.Main.BackendActionType action, Duplicati.Library.Main.BackendEventType type, string path, long size) - { - lock(m_lock) - { - m_state.m_backendAction = action; - m_state.m_backendPath = path; - if (type == Duplicati.Library.Main.BackendEventType.Started) - m_state.m_backendFileSize = size; - else if (type == Duplicati.Library.Main.BackendEventType.Progress) - m_state.m_backendFileProgress = size; - else - { - m_state.m_backendFileSize = 0; - m_state.m_backendFileProgress = 0; - m_state.m_backendSpeed = 0; - } - } - } - - public void SetBackendProgress(Library.Main.IBackendProgress progress) - { - lock (m_lock) - m_backendProgress = progress; - } - - public void SetOperationProgress(Library.Main.IOperationProgress progress) - { - lock (m_lock) - m_operationProgress = progress; - } - - public void WriteMessage(Library.Logging.LogEntry entry) - { - // Do nothing. Implementation needed for ILogDestination interface. - } - #endregion - } - - public static string GetCommandLine(IRunnerData data) - { - var backup = data.Backup; - - var options = ApplyOptions(backup, GetCommonOptions()); - if (data.ExtraOptions != null) - foreach(var k in data.ExtraOptions) - options[k.Key] = k.Value; - - var cf = Program.DataConnection.Filters; - var bf = backup.Filters; - - var sources = - (from n in backup.Sources - let p = SpecialFolders.ExpandEnvironmentVariables(n) - where !string.IsNullOrWhiteSpace(p) - select p).ToArray(); - - var exe = - System.IO.Path.Combine( - Library.AutoUpdater.UpdaterManager.InstalledBaseDir, - System.IO.Path.GetFileName( - typeof(Duplicati.CommandLine.Commands).Assembly.Location - ) - ); - - var cmd = new System.Text.StringBuilder(); - if (Library.Utility.Utility.IsMono) - cmd.Append("mono "); - - cmd.Append(Library.Utility.Utility.WrapAsCommandLine(new string[] { exe, "backup", backup.TargetURL }, false)); - - cmd.Append(" "); - cmd.Append(Library.Utility.Utility.WrapAsCommandLine(sources, true)); - - // TODO: We should check each option to see if it is a path, and allow expansion on that - foreach(var opt in options) - cmd.AppendFormat(" --{0}={1}", opt.Key, Library.Utility.Utility.WrapCommandLineElement(opt.Value, false)); - - if (cf != null) - foreach(var f in cf) - cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", Library.Utility.Utility.WrapCommandLineElement(f.Expression, true)); - - if (bf != null) - foreach(var f in bf) - cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", Library.Utility.Utility.WrapCommandLineElement(f.Expression, true)); - - return cmd.ToString(); - } - - public static string[] GetCommandLineParts(IRunnerData data) - { - var backup = data.Backup; - - var options = ApplyOptions(backup, GetCommonOptions()); - if (data.ExtraOptions != null) - foreach (var k in data.ExtraOptions) - options[k.Key] = k.Value; - - var cf = Program.DataConnection.Filters; - var bf = backup.Filters; - - var sources = - (from n in backup.Sources - let p = SpecialFolders.ExpandEnvironmentVariables(n) - where !string.IsNullOrWhiteSpace(p) - select p).ToArray(); - - var parts = new List - { - backup.TargetURL - }; - parts.AddRange(sources); - - foreach (var opt in options) - parts.Add(string.Format("--{0}={1}", opt.Key, opt.Value)); - - if (cf != null) - foreach (var f in cf) - parts.Add(string.Format("--{0}={1}", f.Include ? "include" : "exclude", f.Expression)); - - if (bf != null) - foreach (var f in bf) - parts.Add(string.Format("--{0}={1}", f.Include ? "include" : "exclude", f.Expression)); - - return parts.ToArray(); - } - - public static Duplicati.Library.Interface.IBasicResults Run(IRunnerData data, bool fromQueue) - { - if (data is CustomRunnerTask task) - { - try - { - var sink = new MessageSink(task.TaskID, null); - Program.GenerateProgressState = sink.Copy; - Program.StatusEventNotifyer.SignalNewEvent(); - - task.Run(sink); - } - catch(Exception ex) - { - Program.DataConnection.LogError(string.Empty, "Failed while executing custom task", ex); - } - - return null; - } - - var backup = data.Backup; - if (backup.Metadata == null) - { - backup.Metadata = new Dictionary(); - } - - Duplicati.Library.Utility.TempFolder tempfolder = null; - - try - { - var sink = new MessageSink(data.TaskID, backup.ID); - if (fromQueue) - { - Program.GenerateProgressState = () => sink.Copy(); - Program.StatusEventNotifyer.SignalNewEvent(); - } - - var options = ApplyOptions(backup, GetCommonOptions()); - if (data.ExtraOptions != null) - foreach(var k in data.ExtraOptions) - options[k.Key] = k.Value; - - // Pack in the system or task config for easy restore - if (data.Operation == DuplicatiOperation.Backup && options.ContainsKey("store-task-config")) - { - tempfolder = StoreTaskConfigAndGetTempFolder(data, options); - } - - // Attach a log scope that tags all messages to relay the TaskID and BackupID - using (Library.Logging.Log.StartScope(log => { - log[LogWriteHandler.LOG_EXTRA_TASKID] = data.TaskID.ToString(); - log[LogWriteHandler.LOG_EXTRA_BACKUPID] = data.BackupID; - })) - - using(tempfolder) - using(var controller = new Duplicati.Library.Main.Controller(backup.TargetURL, options, sink)) - { - try - { - if (options.ContainsKey("throttle-upload")) - ((RunnerData)data).OriginalUploadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-upload"], "kb"); - } - catch { } - - try - { - if (options.ContainsKey("throttle-download")) - ((RunnerData)data).OriginalDownloadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-download"], "kb"); - } - catch { } - - ((RunnerData)data).Controller = controller; - data.UpdateThrottleSpeed(); - - if (backup.Metadata.ContainsKey("LastCompactFinished")) - controller.LastCompact = Library.Utility.Utility.DeserializeDateTime(backup.Metadata["LastCompactFinished"]); - - if (backup.Metadata.ContainsKey("LastVacuumFinished")) - controller.LastVacuum = Library.Utility.Utility.DeserializeDateTime(backup.Metadata["LastVacuumFinished"]); - - switch (data.Operation) - { - case DuplicatiOperation.Backup: - { - var filter = ApplyFilter(backup, GetCommonFilter()); - var sources = - (from n in backup.Sources - let p = SpecialFolders.ExpandEnvironmentVariables(n) - where !string.IsNullOrWhiteSpace(p) - select p).ToArray(); - - var r = controller.Backup(sources, filter); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.List: - { - var r = controller.List(data.FilterStrings, null); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.Repair: - { - var r = controller.Repair(data.FilterStrings == null ? null : new Library.Utility.FilterExpression(data.FilterStrings)); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.RepairUpdate: - { - var r = controller.UpdateDatabaseWithVersions(); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.Remove: - { - var r = controller.Delete(); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.Restore: - { - var r = controller.Restore(data.FilterStrings); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.Verify: - { - var r = controller.Test(); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.Compact: - { - var r = controller.Compact(); - UpdateMetadata(backup, r); - return r; - } - case DuplicatiOperation.CreateReport: - { - using(var tf = new Duplicati.Library.Utility.TempFile()) - { - var r = controller.CreateLogDatabase(tf); - var tempid = Program.DataConnection.RegisterTempFile("create-bug-report", r.TargetPath, DateTime.Now.AddDays(3)); - - if (string.Equals(tf, r.TargetPath, Library.Utility.Utility.ClientFilenameStringComparison)) - tf.Protected = true; - - Program.DataConnection.RegisterNotification( - NotificationType.Information, - "Bugreport ready", - "Bugreport is ready for download", - null, - null, - "bug-report:created:" + tempid, - null, - "BugreportCreatedReady", - "", - (n, a) => n - ); - - return r; - } - } - - case DuplicatiOperation.ListRemote: - { - var r = controller.ListRemote(); - UpdateMetadata(backup, r); - return r; - } - - case DuplicatiOperation.Delete: - { - if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-remote-files")) - controller.DeleteAllRemoteFiles(); - - if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-local-db")) - { - string dbpath; - options.TryGetValue("dbpath", out dbpath); - - if (!string.IsNullOrWhiteSpace(dbpath) && System.IO.File.Exists(dbpath)) - System.IO.File.Delete(dbpath); - } - Program.DataConnection.DeleteBackup(backup); - Program.Scheduler.Reschedule(); - return null; - } - case DuplicatiOperation.Vacuum: - { - var r = controller.Vacuum(); - UpdateMetadata(backup, r); - return r; - } - default: - //TODO: Log this - return null; - } - } - } - catch (Exception ex) - { - Program.DataConnection.LogError(data.Backup.ID, string.Format("Failed while executing \"{0}\" with id: {1}", data.Operation, data.Backup.ID), ex); - UpdateMetadataError(data.Backup, ex); - Library.UsageReporter.Reporter.Report(ex); - - if (!fromQueue) - throw; - - return null; - } - finally - { - ((RunnerData)data).Controller = null; - } - } - - private static Duplicati.Library.Utility.TempFolder StoreTaskConfigAndGetTempFolder(IRunnerData data, Dictionary options) - { - var all_tasks = string.Equals(options["store-task-config"], "all", StringComparison.OrdinalIgnoreCase) || string.Equals(options["store-task-config"], "*", StringComparison.OrdinalIgnoreCase); - var this_task = Duplicati.Library.Utility.Utility.ParseBool(options["store-task-config"], false); - - options.Remove("store-task-config"); - - Duplicati.Library.Utility.TempFolder tempfolder = null; - if (all_tasks || this_task) - { - tempfolder = new Duplicati.Library.Utility.TempFolder(); - var temppath = System.IO.Path.Combine(tempfolder, "task-setup.json"); - using (var tempfile = Duplicati.Library.Utility.TempFile.WrapExistingFile(temppath)) - { - object taskdata = null; - if (all_tasks) - taskdata = Program.DataConnection.Backups.Where(x => !x.IsTemporary).Select(x => Program.DataConnection.PrepareBackupForExport(Program.DataConnection.GetBackup(x.ID))); - else - taskdata = new[] { Program.DataConnection.PrepareBackupForExport(data.Backup) }; - - using (var fs = System.IO.File.OpenWrite(tempfile)) - using (var sw = new System.IO.StreamWriter(fs, System.Text.Encoding.UTF8)) - Serializer.SerializeJson(sw, taskdata, true); - - tempfile.Protected = true; - - options.TryGetValue("control-files", out string controlfiles); - - if (string.IsNullOrWhiteSpace(controlfiles)) - controlfiles = tempfile; - else - controlfiles += System.IO.Path.PathSeparator + tempfile; - - options["control-files"] = controlfiles; - } - } - return tempfolder; - } - - private static void UpdateMetadataError(Duplicati.Server.Serialization.Interface.IBackup backup, Exception ex) - { - backup.Metadata["LastErrorDate"] = Library.Utility.Utility.SerializeDateTime(DateTime.UtcNow); - backup.Metadata["LastErrorMessage"] = ex.Message; - - if (!backup.IsTemporary) - Program.DataConnection.SetMetadata(backup.Metadata, long.Parse(backup.ID), null); - - string messageid = null; - if (ex is UserInformationException exception) - messageid = exception.HelpID; - - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.DataConnection.RegisterNotification( - NotificationType.Error, - backup.IsTemporary ? - "Error" : string.Format("Error while running {0}", backup.Name), - ex.Message, - ex, - backup.ID, - "backup:show-log", - null, - messageid, - null, - (n, a) => { - return a.FirstOrDefault(x => x.BackupID == backup.ID) ?? n; - } - ); - } - - private static void UpdateMetadataLastCompact(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.ICompactResults r) - { - if (r != null) - { - backup.Metadata["LastCompactDuration"] = r.Duration.ToString(); - backup.Metadata["LastCompactStarted"] = Library.Utility.Utility.SerializeDateTime(r.BeginTime.ToUniversalTime()); - backup.Metadata["LastCompactFinished"] = Library.Utility.Utility.SerializeDateTime(r.EndTime.ToUniversalTime()); - } - } - - private static void UpdateMetadataLastVacuum(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.IVacuumResults r) - { - if (r != null) - { - backup.Metadata["LastVacuumDuration"] = r.Duration.ToString(); - backup.Metadata["LastVacuumStarted"] = Library.Utility.Utility.SerializeDateTime(r.BeginTime.ToUniversalTime()); - backup.Metadata["LastVacuumFinished"] = Library.Utility.Utility.SerializeDateTime(r.EndTime.ToUniversalTime()); - } - } - - private static void UpdateMetadata(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.IParsedBackendStatistics r) - { - if (r != null) - { - backup.Metadata["LastBackupDate"] = Library.Utility.Utility.SerializeDateTime(r.LastBackupDate.ToUniversalTime()); - backup.Metadata["BackupListCount"] = r.BackupListCount.ToString(); - backup.Metadata["TotalQuotaSpace"] = r.TotalQuotaSpace.ToString(); - backup.Metadata["FreeQuotaSpace"] = r.FreeQuotaSpace.ToString(); - backup.Metadata["AssignedQuotaSpace"] = r.AssignedQuotaSpace.ToString(); - - backup.Metadata["TargetFilesSize"] = r.KnownFileSize.ToString(); - backup.Metadata["TargetFilesCount"] = r.KnownFileCount.ToString(); - backup.Metadata["TargetSizeString"] = Duplicati.Library.Utility.Utility.FormatSizeString(r.KnownFileSize); - } - } - - private static void UpdateMetadata(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.IBasicResults result) - { - if (result is IRestoreResults r1) - { - backup.Metadata["LastRestoreDuration"] = r1.Duration.ToString(); - backup.Metadata["LastRestoreStarted"] = Library.Utility.Utility.SerializeDateTime(result.BeginTime.ToUniversalTime()); - backup.Metadata["LastRestoreFinished"] = Library.Utility.Utility.SerializeDateTime(result.EndTime.ToUniversalTime()); - } - - if (result is IParsedBackendStatistics r2) - { - UpdateMetadata(backup, r2); - } - - if (result is IBackendStatsticsReporter r3) - { - if (r3.BackendStatistics is IParsedBackendStatistics statistics) - UpdateMetadata(backup, statistics); - } - - if (result is ICompactResults r4) - { - UpdateMetadataLastCompact(backup, r4); - - if (r4.VacuumResults != null) - UpdateMetadataLastVacuum(backup, r4.VacuumResults); - } - - if (result is IVacuumResults r5) - { - UpdateMetadataLastVacuum(backup, r5); - } - - if (result is IBackupResults r) - { - backup.Metadata["SourceFilesSize"] = r.SizeOfExaminedFiles.ToString(); - backup.Metadata["SourceFilesCount"] = r.ExaminedFiles.ToString(); - backup.Metadata["SourceSizeString"] = Duplicati.Library.Utility.Utility.FormatSizeString(r.SizeOfExaminedFiles); - backup.Metadata["LastBackupStarted"] = Library.Utility.Utility.SerializeDateTime(r.BeginTime.ToUniversalTime()); - backup.Metadata["LastBackupFinished"] = Library.Utility.Utility.SerializeDateTime(r.EndTime.ToUniversalTime()); - backup.Metadata["LastBackupDuration"] = r.Duration.ToString(); - - if (r.CompactResults != null) - UpdateMetadataLastCompact(backup, r.CompactResults); - - if (r.VacuumResults != null) - UpdateMetadataLastVacuum(backup, r.VacuumResults); - - if (r.FilesWithError > 0 || r.Warnings.Any() || r.Errors.Any()) - { - string message; - string titleType; - if (r.FilesWithError > 0) - { - message = $"Errors affected {r.FilesWithError} file(s)."; - titleType = "Error"; - } - else if (r.Errors.Any()) - { - message = r.Errors.Count() == 1 ? r.Errors.Single() : $"Encountered {r.Errors.Count()} errors."; - titleType = "Error"; - } - else - { - message = r.Warnings.Count() == 1 ? r.Warnings.Single() : $"Encountered {r.Warnings.Count()} warnings."; - titleType = "Warning"; - } - - Program.DataConnection.RegisterNotification( - r.FilesWithError == 0 && !r.Errors.Any() ? NotificationType.Warning : NotificationType.Error, - backup.IsTemporary ? "Warning" : $"{titleType} while running {backup.Name}", - message, - null, - backup.ID, - "backup:show-log", - null, - null, - null, - (n, a) => - { - var existing = a.FirstOrDefault(x => x.BackupID == backup.ID); - if (existing == null) - return n; - - if (existing.Type == NotificationType.Error) - return existing; - - return n; - } - ); - } - } - else if (result.ParsedResult != Library.Interface.ParsedResultType.Success) - { - var type = result.ParsedResult == Library.Interface.ParsedResultType.Warning - ? NotificationType.Warning - : NotificationType.Error; - - var title = result.ParsedResult == Library.Interface.ParsedResultType.Warning - ? (backup.IsTemporary ? - "Warning" : string.Format("Warning while running {0}", backup.Name)) - : (backup.IsTemporary ? - "Error" : string.Format("Error while running {0}", backup.Name)); - - var message = result.ParsedResult == Library.Interface.ParsedResultType.Warning - ? string.Format("Got {0} warning(s)", result.Warnings.Count()) - : string.Format("Got {0} error(s)", result.Errors.Count()); - - Program.DataConnection.RegisterNotification( - type, - title, - message, - null, - backup.ID, - "backup:show-log", - null, - null, - "backup:show-log", - (n, a) => n - ); - } - - if (!backup.IsTemporary) - Program.DataConnection.SetMetadata(backup.Metadata, long.Parse(backup.ID), null); - - System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); - Program.StatusEventNotifyer.SignalNewEvent(); - } - - private static bool TestIfOptionApplies() - { - //TODO: Implement to avoid warnings - return true; - } - - private static void DisableModule(string module, Dictionary options) - { - string disabledModules; - string enabledModules; - - if (options.TryGetValue("enable-module", out enabledModules)) - { - var emods = (enabledModules ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - options["enable-module"] = string.Join(",", emods.Where(x => module.Equals(x, StringComparison.OrdinalIgnoreCase))); - } - - options.TryGetValue("disable-module", out disabledModules); - var mods = (disabledModules ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - options["disable-module"] = string.Join(",", mods.Union(new string[] { module }).Distinct(StringComparer.OrdinalIgnoreCase)); - } - - internal static Dictionary ApplyOptions(Duplicati.Server.Serialization.Interface.IBackup backup, Dictionary options) - { - options["backup-name"] = backup.Name; - options["dbpath"] = backup.DBPath; - - // Apply normal options - foreach(var o in backup.Settings) - if (!o.Name.StartsWith("--", StringComparison.Ordinal) && TestIfOptionApplies()) - options[o.Name] = o.Value; - - // Apply override options - foreach(var o in backup.Settings) - if (o.Name.StartsWith("--", StringComparison.Ordinal) && TestIfOptionApplies()) - options[o.Name.Substring(2)] = o.Value; - - - // The server hangs if the module is enabled as there is no console attached - DisableModule("console-password-input", options); - - return options; - } - - private static Library.Utility.IFilter ApplyFilter(Serialization.Interface.IBackup backup, Library.Utility.IFilter filter) - { - var f2 = backup.Filters; - if (f2 != null && f2.Length > 0) - { - var nf = - (from n in f2 - let exp = - n.Expression.StartsWith("[", StringComparison.Ordinal) && n.Expression.EndsWith("]", StringComparison.Ordinal) - ? SpecialFolders.ExpandEnvironmentVariablesRegexp(n.Expression) - : SpecialFolders.ExpandEnvironmentVariables(n.Expression) - orderby n.Order - select (Library.Utility.IFilter)(new Library.Utility.FilterExpression(exp, n.Include))) - .Aggregate((a, b) => Library.Utility.FilterExpression.Combine(a, b)); - - filter = Library.Utility.FilterExpression.Combine(filter, nf); - } - - return filter; - } - - internal static Dictionary GetCommonOptions() - { - return - (from n in Program.DataConnection.Settings - where TestIfOptionApplies() - select n).ToDictionary(k => k.Name.StartsWith("--", StringComparison.Ordinal) ? k.Name.Substring(2) : k.Name, k => k.Value); - } - - private static Duplicati.Library.Utility.IFilter GetCommonFilter() - { - var filters = Program.DataConnection.Filters; - if (filters == null || filters.Length == 0) - return null; - - return - (from n in filters - orderby n.Order - let exp = Environment.ExpandEnvironmentVariables(n.Expression) - select (Duplicati.Library.Utility.IFilter)(new Duplicati.Library.Utility.FilterExpression(exp, n.Include))) - .Aggregate((a, b) => Duplicati.Library.Utility.FilterExpression.Combine(a, b)); - } - } -} - +#region Disclaimer / License +// Copyright (C) 2019, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +#endregion +using System; +using System.Linq; +using System.Collections.Generic; +using Duplicati.Library.Interface; +using Duplicati.Server.Serialization; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server +{ + public static class Runner + { + public interface IRunnerData : Duplicati.Server.Serialization.Interface.IQueuedTask + { + Duplicati.Server.Serialization.Interface.IBackup Backup { get; } + IDictionary ExtraOptions { get; } + string[] FilterStrings { get; } + void Stop(bool allowCurrentFileToFinish); + void Abort(); + void Pause(); + void Resume(); + void UpdateThrottleSpeed(); + void SetController(Duplicati.Library.Main.Controller controller); + } + + private class RunnerData : IRunnerData + { + private static long RunnerTaskID = 1; + + public Duplicati.Server.Serialization.DuplicatiOperation Operation { get; internal set; } + public Duplicati.Server.Serialization.Interface.IBackup Backup { get; internal set; } + public IDictionary ExtraOptions { get; internal set; } + public string[] FilterStrings { get; internal set; } + + public string BackupID { get { return Backup.ID; } } + public long TaskID { get { return m_taskID; } } + + internal Duplicati.Library.Main.Controller Controller { get; set; } + + public void SetController(Duplicati.Library.Main.Controller controller) + { + Controller = controller; + } + + public void Stop(bool allowCurrentFileToFinish) + { + var c = Controller; + if (c != null) + c.Stop(allowCurrentFileToFinish); + } + + public void Abort() + { + var c = Controller; + if (c != null) + c.Abort(); + } + + public void Pause() + { + var c = Controller; + if (c != null) + c.Pause(); + } + + public void Resume() + { + var c = Controller; + if (c != null) + c.Resume(); + } + + public long OriginalUploadSpeed { get; set; } + public long OriginalDownloadSpeed { get; set; } + + public void UpdateThrottleSpeed() + { + var controller = this.Controller; + if (controller == null) + return; + + var job_upload_throttle = this.OriginalUploadSpeed <= 0 ? long.MaxValue : this.OriginalUploadSpeed; + var job_download_throttle = this.OriginalDownloadSpeed <= 0 ? long.MaxValue : this.OriginalDownloadSpeed; + + var server_upload_throttle = long.MaxValue; + var server_download_throttle = long.MaxValue; + + try + { + if (!string.IsNullOrWhiteSpace(FIXMEGlobal.DataConnection.ApplicationSettings.UploadSpeedLimit)) + server_upload_throttle = Duplicati.Library.Utility.Sizeparser.ParseSize(FIXMEGlobal.DataConnection.ApplicationSettings.UploadSpeedLimit, "kb"); + } + catch { } + + try + { + if (!string.IsNullOrWhiteSpace(FIXMEGlobal.DataConnection.ApplicationSettings.DownloadSpeedLimit)) + server_download_throttle = Duplicati.Library.Utility.Sizeparser.ParseSize(FIXMEGlobal.DataConnection.ApplicationSettings.DownloadSpeedLimit, "kb"); + } + catch { } + + var upload_throttle = Math.Min(job_upload_throttle, server_upload_throttle); + var download_throttle = Math.Min(job_download_throttle, server_download_throttle); + + if (upload_throttle <= 0 || upload_throttle == long.MaxValue) + upload_throttle = 0; + + if (download_throttle <= 0 || download_throttle == long.MaxValue) + download_throttle = 0; + + controller.MaxUploadSpeed = upload_throttle; + controller.MaxDownloadSpeed = download_throttle; + } + + private readonly long m_taskID; + + public RunnerData() + { + m_taskID = System.Threading.Interlocked.Increment(ref RunnerTaskID); + } + } + + private class CustomRunnerTask : RunnerData + { + public readonly Action Run; + + public CustomRunnerTask(Action runner) + : base() + { + if (runner == null) + throw new ArgumentNullException(nameof(runner)); + Run = runner; + Operation = DuplicatiOperation.CustomRunner; + Backup = new Database.Backup(); + } + } + + public static IRunnerData CreateCustomTask(Action runner) + { + return new CustomRunnerTask(runner); + } + + public static IRunnerData CreateTask(Duplicati.Server.Serialization.DuplicatiOperation operation, Duplicati.Server.Serialization.Interface.IBackup backup, IDictionary extraOptions = null, string[] filterStrings = null) + { + return new RunnerData() { + Operation = operation, + Backup = backup, + ExtraOptions = extraOptions, + FilterStrings = filterStrings + }; + } + + public static IRunnerData CreateListTask(Duplicati.Server.Serialization.Interface.IBackup backup, string[] filters, bool onlyPrefix, bool allVersions, bool folderContents, DateTime time) + { + var dict = new Dictionary(); + if (onlyPrefix) + dict["list-prefix-only"] = "true"; + if (allVersions) + dict["all-versions"] = "true"; + if (time.Ticks > 0) + dict["time"] = Duplicati.Library.Utility.Utility.SerializeDateTime(time.ToUniversalTime()); + if (folderContents) + dict["list-folder-contents"] = "true"; + + return CreateTask( + DuplicatiOperation.List, + backup, + dict, + filters); + } + + public static IRunnerData CreateRestoreTask(Duplicati.Server.Serialization.Interface.IBackup backup, string[] filters, + DateTime time, string restoreTarget, bool overwrite, bool restore_permissions, + bool skip_metadata, string passphrase) + { + var dict = new Dictionary + { + ["time"] = Library.Utility.Utility.SerializeDateTime(time.ToUniversalTime()), + ["overwrite"] = overwrite? Boolean.TrueString : Boolean.FalseString, + ["restore-permissions"] = restore_permissions ? Boolean.TrueString : Boolean.FalseString, + ["skip-metadata"] = skip_metadata ? Boolean.TrueString : Boolean.FalseString, + ["allow-passphrase-change"] = Boolean.TrueString + }; + if (!string.IsNullOrWhiteSpace(restoreTarget)) + dict["restore-path"] = SpecialFolders.ExpandEnvironmentVariables(restoreTarget); + if (!(passphrase is null)) + dict["passphrase"] = passphrase; + + return CreateTask( + DuplicatiOperation.Restore, + backup, + dict, + filters); + } + private class MessageSink : Duplicati.Library.Main.IMessageSink + { + private class ProgressState : Server.Serialization.Interface.IProgressEventData + { + private readonly string m_backupID; + private readonly long m_taskID; + + internal Duplicati.Library.Main.BackendActionType m_backendAction; + internal string m_backendPath; + internal long m_backendFileSize; + internal long m_backendFileProgress; + internal long m_backendSpeed; + internal bool m_backendIsBlocking; + + internal string m_currentFilename; + internal long m_currentFilesize; + internal long m_currentFileoffset; + internal bool m_currentFilecomplete; + + internal Duplicati.Library.Main.OperationPhase m_phase; + internal float m_overallProgress; + internal long m_processedFileCount; + internal long m_processedFileSize; + internal long m_totalFileCount; + internal long m_totalFileSize; + internal bool m_stillCounting; + + public ProgressState(long taskId, string backupId) + { + m_backupID = backupId; + m_taskID = taskId; + } + + internal ProgressState Clone() + { + return (ProgressState)this.MemberwiseClone(); + } + + #region IProgressEventData implementation + public string BackupID { get { return m_backupID; } } + public long TaskID { get { return m_taskID; } } + public string BackendAction { get { return m_backendAction.ToString(); } } + public string BackendPath { get { return m_backendPath; } } + public long BackendFileSize { get { return m_backendFileSize; } } + public long BackendFileProgress { get { return m_backendFileProgress; } } + public long BackendSpeed { get { return m_backendSpeed; } } + public bool BackendIsBlocking { get { return m_backendIsBlocking; } } + public string CurrentFilename { get { return m_currentFilename; } } + public long CurrentFilesize { get { return m_currentFilesize; } } + public long CurrentFileoffset { get { return m_currentFileoffset; } } + public bool CurrentFilecomplete { get { return m_currentFilecomplete; } } + public string Phase { get { return m_phase.ToString(); } } + public float OverallProgress { get { return m_overallProgress; } } + public long ProcessedFileCount { get { return m_processedFileCount; } } + public long ProcessedFileSize { get { return m_processedFileSize; } } + public long TotalFileCount { get { return m_totalFileCount; } } + public long TotalFileSize { get { return m_totalFileSize; } } + public bool StillCounting { get { return m_stillCounting; } } + #endregion + } + + private readonly ProgressState m_state; + private Duplicati.Library.Main.IBackendProgress m_backendProgress; + private Duplicati.Library.Main.IOperationProgress m_operationProgress; + private readonly object m_lock = new object(); + + public MessageSink(long taskId, string backupId) + { + m_state = new ProgressState(taskId, backupId); + } + + public Server.Serialization.Interface.IProgressEventData Copy() + { + lock(m_lock) + { + if (m_backendProgress != null) + m_backendProgress.Update(out m_state.m_backendAction, out m_state.m_backendPath, out m_state.m_backendFileSize, out m_state.m_backendFileProgress, out m_state.m_backendSpeed, out m_state.m_backendIsBlocking); + if (m_operationProgress != null) + { + m_operationProgress.UpdateFile(out m_state.m_currentFilename, out m_state.m_currentFilesize, out m_state.m_currentFileoffset, out m_state.m_currentFilecomplete); + m_operationProgress.UpdateOverall(out m_state.m_phase, out m_state.m_overallProgress, out m_state.m_processedFileCount, out m_state.m_processedFileSize, out m_state.m_totalFileCount, out m_state.m_totalFileSize, out m_state.m_stillCounting); + } + + return m_state.Clone(); + } + } + + #region IMessageSink implementation + public void BackendEvent(Duplicati.Library.Main.BackendActionType action, Duplicati.Library.Main.BackendEventType type, string path, long size) + { + lock(m_lock) + { + m_state.m_backendAction = action; + m_state.m_backendPath = path; + if (type == Duplicati.Library.Main.BackendEventType.Started) + m_state.m_backendFileSize = size; + else if (type == Duplicati.Library.Main.BackendEventType.Progress) + m_state.m_backendFileProgress = size; + else + { + m_state.m_backendFileSize = 0; + m_state.m_backendFileProgress = 0; + m_state.m_backendSpeed = 0; + } + } + } + + public void SetBackendProgress(Library.Main.IBackendProgress progress) + { + lock (m_lock) + m_backendProgress = progress; + } + + public void SetOperationProgress(Library.Main.IOperationProgress progress) + { + lock (m_lock) + m_operationProgress = progress; + } + + public void WriteMessage(Library.Logging.LogEntry entry) + { + // Do nothing. Implementation needed for ILogDestination interface. + } + #endregion + } + + public static string GetCommandLine(IRunnerData data) + { + var backup = data.Backup; + + var options = ApplyOptions(backup, GetCommonOptions()); + if (data.ExtraOptions != null) + foreach(var k in data.ExtraOptions) + options[k.Key] = k.Value; + + var cf = FIXMEGlobal.DataConnection.Filters; + var bf = backup.Filters; + + var sources = + (from n in backup.Sources + let p = SpecialFolders.ExpandEnvironmentVariables(n) + where !string.IsNullOrWhiteSpace(p) + select p).ToArray(); + + var exe = + System.IO.Path.Combine( + Library.AutoUpdater.UpdaterManager.InstalledBaseDir, + System.IO.Path.GetFileName( + typeof(Duplicati.CommandLine.Commands).Assembly.Location + ) + ); + + var cmd = new System.Text.StringBuilder(); + if (Library.Utility.Utility.IsMono) + cmd.Append("mono "); + + cmd.Append(Library.Utility.Utility.WrapAsCommandLine(new string[] { exe, "backup", backup.TargetURL }, false)); + + cmd.Append(" "); + cmd.Append(Library.Utility.Utility.WrapAsCommandLine(sources, true)); + + // TODO: We should check each option to see if it is a path, and allow expansion on that + foreach(var opt in options) + cmd.AppendFormat(" --{0}={1}", opt.Key, Library.Utility.Utility.WrapCommandLineElement(opt.Value, false)); + + if (cf != null) + foreach(var f in cf) + cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", Library.Utility.Utility.WrapCommandLineElement(f.Expression, true)); + + if (bf != null) + foreach(var f in bf) + cmd.AppendFormat(" --{0}={1}", f.Include ? "include" : "exclude", Library.Utility.Utility.WrapCommandLineElement(f.Expression, true)); + + return cmd.ToString(); + } + + public static string[] GetCommandLineParts(IRunnerData data) + { + var backup = data.Backup; + + var options = ApplyOptions(backup, GetCommonOptions()); + if (data.ExtraOptions != null) + foreach (var k in data.ExtraOptions) + options[k.Key] = k.Value; + + var cf = FIXMEGlobal.DataConnection.Filters; + var bf = backup.Filters; + + var sources = + (from n in backup.Sources + let p = SpecialFolders.ExpandEnvironmentVariables(n) + where !string.IsNullOrWhiteSpace(p) + select p).ToArray(); + + var parts = new List + { + backup.TargetURL + }; + parts.AddRange(sources); + + foreach (var opt in options) + parts.Add(string.Format("--{0}={1}", opt.Key, opt.Value)); + + if (cf != null) + foreach (var f in cf) + parts.Add(string.Format("--{0}={1}", f.Include ? "include" : "exclude", f.Expression)); + + if (bf != null) + foreach (var f in bf) + parts.Add(string.Format("--{0}={1}", f.Include ? "include" : "exclude", f.Expression)); + + return parts.ToArray(); + } + + public static Duplicati.Library.Interface.IBasicResults Run(IRunnerData data, bool fromQueue) + { + if (data is CustomRunnerTask task) + { + try + { + var sink = new MessageSink(task.TaskID, null); + FIXMEGlobal.GenerateProgressState = sink.Copy; + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + task.Run(sink); + } + catch(Exception ex) + { + FIXMEGlobal.DataConnection.LogError(string.Empty, "Failed while executing custom task", ex); + } + + return null; + } + + var backup = data.Backup; + if (backup.Metadata == null) + { + backup.Metadata = new Dictionary(); + } + + Duplicati.Library.Utility.TempFolder tempfolder = null; + + try + { + var sink = new MessageSink(data.TaskID, backup.ID); + if (fromQueue) + { + FIXMEGlobal.GenerateProgressState = () => sink.Copy(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + var options = ApplyOptions(backup, GetCommonOptions()); + if (data.ExtraOptions != null) + foreach(var k in data.ExtraOptions) + options[k.Key] = k.Value; + + // Pack in the system or task config for easy restore + if (data.Operation == DuplicatiOperation.Backup && options.ContainsKey("store-task-config")) + { + tempfolder = StoreTaskConfigAndGetTempFolder(data, options); + } + + // Attach a log scope that tags all messages to relay the TaskID and BackupID + using (Library.Logging.Log.StartScope(log => { + log[LogWriteHandler.LOG_EXTRA_TASKID] = data.TaskID.ToString(); + log[LogWriteHandler.LOG_EXTRA_BACKUPID] = data.BackupID; + })) + + using(tempfolder) + using(var controller = new Duplicati.Library.Main.Controller(backup.TargetURL, options, sink)) + { + try + { + if (options.ContainsKey("throttle-upload")) + ((RunnerData)data).OriginalUploadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-upload"], "kb"); + } + catch { } + + try + { + if (options.ContainsKey("throttle-download")) + ((RunnerData)data).OriginalDownloadSpeed = Duplicati.Library.Utility.Sizeparser.ParseSize(options["throttle-download"], "kb"); + } + catch { } + + ((RunnerData)data).Controller = controller; + data.UpdateThrottleSpeed(); + + if (backup.Metadata.ContainsKey("LastCompactFinished")) + controller.LastCompact = Library.Utility.Utility.DeserializeDateTime(backup.Metadata["LastCompactFinished"]); + + if (backup.Metadata.ContainsKey("LastVacuumFinished")) + controller.LastVacuum = Library.Utility.Utility.DeserializeDateTime(backup.Metadata["LastVacuumFinished"]); + + switch (data.Operation) + { + case DuplicatiOperation.Backup: + { + var filter = ApplyFilter(backup, GetCommonFilter()); + var sources = + (from n in backup.Sources + let p = SpecialFolders.ExpandEnvironmentVariables(n) + where !string.IsNullOrWhiteSpace(p) + select p).ToArray(); + + var r = controller.Backup(sources, filter); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.List: + { + var r = controller.List(data.FilterStrings, null); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.Repair: + { + var r = controller.Repair(data.FilterStrings == null ? null : new Library.Utility.FilterExpression(data.FilterStrings)); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.RepairUpdate: + { + var r = controller.UpdateDatabaseWithVersions(); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.Remove: + { + var r = controller.Delete(); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.Restore: + { + var r = controller.Restore(data.FilterStrings); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.Verify: + { + var r = controller.Test(); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.Compact: + { + var r = controller.Compact(); + UpdateMetadata(backup, r); + return r; + } + case DuplicatiOperation.CreateReport: + { + using(var tf = new Duplicati.Library.Utility.TempFile()) + { + var r = controller.CreateLogDatabase(tf); + var tempid = FIXMEGlobal.DataConnection.RegisterTempFile("create-bug-report", r.TargetPath, DateTime.Now.AddDays(3)); + + if (string.Equals(tf, r.TargetPath, Library.Utility.Utility.ClientFilenameStringComparison)) + tf.Protected = true; + + FIXMEGlobal.DataConnection.RegisterNotification( + NotificationType.Information, + "Bugreport ready", + "Bugreport is ready for download", + null, + null, + "bug-report:created:" + tempid, + null, + "BugreportCreatedReady", + "", + (n, a) => n + ); + + return r; + } + } + + case DuplicatiOperation.ListRemote: + { + var r = controller.ListRemote(); + UpdateMetadata(backup, r); + return r; + } + + case DuplicatiOperation.Delete: + { + if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-remote-files")) + controller.DeleteAllRemoteFiles(); + + if (Library.Utility.Utility.ParseBoolOption(data.ExtraOptions, "delete-local-db")) + { + string dbpath; + options.TryGetValue("dbpath", out dbpath); + + if (!string.IsNullOrWhiteSpace(dbpath) && System.IO.File.Exists(dbpath)) + System.IO.File.Delete(dbpath); + } + FIXMEGlobal.DataConnection.DeleteBackup(backup); + FIXMEGlobal.Scheduler.Reschedule(); + return null; + } + case DuplicatiOperation.Vacuum: + { + var r = controller.Vacuum(); + UpdateMetadata(backup, r); + return r; + } + default: + //TODO: Log this + return null; + } + } + } + catch (Exception ex) + { + FIXMEGlobal.DataConnection.LogError(data.Backup.ID, string.Format("Failed while executing \"{0}\" with id: {1}", data.Operation, data.Backup.ID), ex); + UpdateMetadataError(data.Backup, ex); + Library.UsageReporter.Reporter.Report(ex); + + if (!fromQueue) + throw; + + return null; + } + finally + { + ((RunnerData)data).Controller = null; + } + } + + private static Duplicati.Library.Utility.TempFolder StoreTaskConfigAndGetTempFolder(IRunnerData data, Dictionary options) + { + var all_tasks = string.Equals(options["store-task-config"], "all", StringComparison.OrdinalIgnoreCase) || string.Equals(options["store-task-config"], "*", StringComparison.OrdinalIgnoreCase); + var this_task = Duplicati.Library.Utility.Utility.ParseBool(options["store-task-config"], false); + + options.Remove("store-task-config"); + + Duplicati.Library.Utility.TempFolder tempfolder = null; + if (all_tasks || this_task) + { + tempfolder = new Duplicati.Library.Utility.TempFolder(); + var temppath = System.IO.Path.Combine(tempfolder, "task-setup.json"); + using (var tempfile = Duplicati.Library.Utility.TempFile.WrapExistingFile(temppath)) + { + object taskdata = null; + if (all_tasks) + taskdata = FIXMEGlobal.DataConnection.Backups.Where(x => !x.IsTemporary).Select(x => FIXMEGlobal.DataConnection.PrepareBackupForExport(FIXMEGlobal.DataConnection.GetBackup(x.ID))); + else + taskdata = new[] { FIXMEGlobal.DataConnection.PrepareBackupForExport(data.Backup) }; + + using (var fs = System.IO.File.OpenWrite(tempfile)) + using (var sw = new System.IO.StreamWriter(fs, System.Text.Encoding.UTF8)) + Serializer.SerializeJson(sw, taskdata, true); + + tempfile.Protected = true; + + options.TryGetValue("control-files", out string controlfiles); + + if (string.IsNullOrWhiteSpace(controlfiles)) + controlfiles = tempfile; + else + controlfiles += System.IO.Path.PathSeparator + tempfile; + + options["control-files"] = controlfiles; + } + } + return tempfolder; + } + + private static void UpdateMetadataError(Duplicati.Server.Serialization.Interface.IBackup backup, Exception ex) + { + backup.Metadata["LastErrorDate"] = Library.Utility.Utility.SerializeDateTime(DateTime.UtcNow); + backup.Metadata["LastErrorMessage"] = ex.Message; + + if (!backup.IsTemporary) + FIXMEGlobal.DataConnection.SetMetadata(backup.Metadata, long.Parse(backup.ID), null); + + string messageid = null; + if (ex is UserInformationException exception) + messageid = exception.HelpID; + + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.DataConnection.RegisterNotification( + NotificationType.Error, + backup.IsTemporary ? + "Error" : string.Format("Error while running {0}", backup.Name), + ex.Message, + ex, + backup.ID, + "backup:show-log", + null, + messageid, + null, + (n, a) => { + return a.FirstOrDefault(x => x.BackupID == backup.ID) ?? n; + } + ); + } + + private static void UpdateMetadataLastCompact(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.ICompactResults r) + { + if (r != null) + { + backup.Metadata["LastCompactDuration"] = r.Duration.ToString(); + backup.Metadata["LastCompactStarted"] = Library.Utility.Utility.SerializeDateTime(r.BeginTime.ToUniversalTime()); + backup.Metadata["LastCompactFinished"] = Library.Utility.Utility.SerializeDateTime(r.EndTime.ToUniversalTime()); + } + } + + private static void UpdateMetadataLastVacuum(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.IVacuumResults r) + { + if (r != null) + { + backup.Metadata["LastVacuumDuration"] = r.Duration.ToString(); + backup.Metadata["LastVacuumStarted"] = Library.Utility.Utility.SerializeDateTime(r.BeginTime.ToUniversalTime()); + backup.Metadata["LastVacuumFinished"] = Library.Utility.Utility.SerializeDateTime(r.EndTime.ToUniversalTime()); + } + } + + private static void UpdateMetadata(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.IParsedBackendStatistics r) + { + if (r != null) + { + backup.Metadata["LastBackupDate"] = Library.Utility.Utility.SerializeDateTime(r.LastBackupDate.ToUniversalTime()); + backup.Metadata["BackupListCount"] = r.BackupListCount.ToString(); + backup.Metadata["TotalQuotaSpace"] = r.TotalQuotaSpace.ToString(); + backup.Metadata["FreeQuotaSpace"] = r.FreeQuotaSpace.ToString(); + backup.Metadata["AssignedQuotaSpace"] = r.AssignedQuotaSpace.ToString(); + + backup.Metadata["TargetFilesSize"] = r.KnownFileSize.ToString(); + backup.Metadata["TargetFilesCount"] = r.KnownFileCount.ToString(); + backup.Metadata["TargetSizeString"] = Duplicati.Library.Utility.Utility.FormatSizeString(r.KnownFileSize); + } + } + + private static void UpdateMetadata(Duplicati.Server.Serialization.Interface.IBackup backup, Duplicati.Library.Interface.IBasicResults result) + { + if (result is IRestoreResults r1) + { + backup.Metadata["LastRestoreDuration"] = r1.Duration.ToString(); + backup.Metadata["LastRestoreStarted"] = Library.Utility.Utility.SerializeDateTime(result.BeginTime.ToUniversalTime()); + backup.Metadata["LastRestoreFinished"] = Library.Utility.Utility.SerializeDateTime(result.EndTime.ToUniversalTime()); + } + + if (result is IParsedBackendStatistics r2) + { + UpdateMetadata(backup, r2); + } + + if (result is IBackendStatsticsReporter r3) + { + if (r3.BackendStatistics is IParsedBackendStatistics statistics) + UpdateMetadata(backup, statistics); + } + + if (result is ICompactResults r4) + { + UpdateMetadataLastCompact(backup, r4); + + if (r4.VacuumResults != null) + UpdateMetadataLastVacuum(backup, r4.VacuumResults); + } + + if (result is IVacuumResults r5) + { + UpdateMetadataLastVacuum(backup, r5); + } + + if (result is IBackupResults r) + { + backup.Metadata["SourceFilesSize"] = r.SizeOfExaminedFiles.ToString(); + backup.Metadata["SourceFilesCount"] = r.ExaminedFiles.ToString(); + backup.Metadata["SourceSizeString"] = Duplicati.Library.Utility.Utility.FormatSizeString(r.SizeOfExaminedFiles); + backup.Metadata["LastBackupStarted"] = Library.Utility.Utility.SerializeDateTime(r.BeginTime.ToUniversalTime()); + backup.Metadata["LastBackupFinished"] = Library.Utility.Utility.SerializeDateTime(r.EndTime.ToUniversalTime()); + backup.Metadata["LastBackupDuration"] = r.Duration.ToString(); + + if (r.CompactResults != null) + UpdateMetadataLastCompact(backup, r.CompactResults); + + if (r.VacuumResults != null) + UpdateMetadataLastVacuum(backup, r.VacuumResults); + + if (r.FilesWithError > 0 || r.Warnings.Any() || r.Errors.Any()) + { + string message; + string titleType; + if (r.FilesWithError > 0) + { + message = $"Errors affected {r.FilesWithError} file(s)."; + titleType = "Error"; + } + else if (r.Errors.Any()) + { + message = r.Errors.Count() == 1 ? r.Errors.Single() : $"Encountered {r.Errors.Count()} errors."; + titleType = "Error"; + } + else + { + message = r.Warnings.Count() == 1 ? r.Warnings.Single() : $"Encountered {r.Warnings.Count()} warnings."; + titleType = "Warning"; + } + + FIXMEGlobal.DataConnection.RegisterNotification( + r.FilesWithError == 0 && !r.Errors.Any() ? NotificationType.Warning : NotificationType.Error, + backup.IsTemporary ? "Warning" : $"{titleType} while running {backup.Name}", + message, + null, + backup.ID, + "backup:show-log", + null, + null, + null, + (n, a) => + { + var existing = a.FirstOrDefault(x => x.BackupID == backup.ID); + if (existing == null) + return n; + + if (existing.Type == NotificationType.Error) + return existing; + + return n; + } + ); + } + } + else if (result.ParsedResult != Library.Interface.ParsedResultType.Success) + { + var type = result.ParsedResult == Library.Interface.ParsedResultType.Warning + ? NotificationType.Warning + : NotificationType.Error; + + var title = result.ParsedResult == Library.Interface.ParsedResultType.Warning + ? (backup.IsTemporary ? + "Warning" : string.Format("Warning while running {0}", backup.Name)) + : (backup.IsTemporary ? + "Error" : string.Format("Error while running {0}", backup.Name)); + + var message = result.ParsedResult == Library.Interface.ParsedResultType.Warning + ? string.Format("Got {0} warning(s)", result.Warnings.Count()) + : string.Format("Got {0} error(s)", result.Errors.Count()); + + FIXMEGlobal.DataConnection.RegisterNotification( + type, + title, + message, + null, + backup.ID, + "backup:show-log", + null, + null, + "backup:show-log", + (n, a) => n + ); + } + + if (!backup.IsTemporary) + FIXMEGlobal.DataConnection.SetMetadata(backup.Metadata, long.Parse(backup.ID), null); + + FIXMEGlobal.IncrementLastDataUpdateID(); + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + private static bool TestIfOptionApplies() + { + //TODO: Implement to avoid warnings + return true; + } + + private static void DisableModule(string module, Dictionary options) + { + string disabledModules; + string enabledModules; + + if (options.TryGetValue("enable-module", out enabledModules)) + { + var emods = (enabledModules ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + options["enable-module"] = string.Join(",", emods.Where(x => module.Equals(x, StringComparison.OrdinalIgnoreCase))); + } + + options.TryGetValue("disable-module", out disabledModules); + var mods = (disabledModules ?? "").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + options["disable-module"] = string.Join(",", mods.Union(new string[] { module }).Distinct(StringComparer.OrdinalIgnoreCase)); + } + + internal static Dictionary ApplyOptions(Duplicati.Server.Serialization.Interface.IBackup backup, Dictionary options) + { + options["backup-name"] = backup.Name; + options["dbpath"] = backup.DBPath; + + // Apply normal options + foreach(var o in backup.Settings) + if (!o.Name.StartsWith("--", StringComparison.Ordinal) && TestIfOptionApplies()) + options[o.Name] = o.Value; + + // Apply override options + foreach(var o in backup.Settings) + if (o.Name.StartsWith("--", StringComparison.Ordinal) && TestIfOptionApplies()) + options[o.Name.Substring(2)] = o.Value; + + + // The server hangs if the module is enabled as there is no console attached + DisableModule("console-password-input", options); + + return options; + } + + private static Library.Utility.IFilter ApplyFilter(Serialization.Interface.IBackup backup, Library.Utility.IFilter filter) + { + var f2 = backup.Filters; + if (f2 != null && f2.Length > 0) + { + var nf = + (from n in f2 + let exp = + n.Expression.StartsWith("[", StringComparison.Ordinal) && n.Expression.EndsWith("]", StringComparison.Ordinal) + ? SpecialFolders.ExpandEnvironmentVariablesRegexp(n.Expression) + : SpecialFolders.ExpandEnvironmentVariables(n.Expression) + orderby n.Order + select (Library.Utility.IFilter)(new Library.Utility.FilterExpression(exp, n.Include))) + .Aggregate((a, b) => Library.Utility.FilterExpression.Combine(a, b)); + + filter = Library.Utility.FilterExpression.Combine(filter, nf); + } + + return filter; + } + + internal static Dictionary GetCommonOptions() + { + return + (from n in FIXMEGlobal.DataConnection.Settings + where TestIfOptionApplies() + select n).ToDictionary(k => k.Name.StartsWith("--", StringComparison.Ordinal) ? k.Name.Substring(2) : k.Name, k => k.Value); + } + + private static Duplicati.Library.Utility.IFilter GetCommonFilter() + { + var filters = FIXMEGlobal.DataConnection.Filters; + if (filters == null || filters.Length == 0) + return null; + + return + (from n in filters + orderby n.Order + let exp = Environment.ExpandEnvironmentVariables(n.Expression) + select (Duplicati.Library.Utility.IFilter)(new Duplicati.Library.Utility.FilterExpression(exp, n.Include))) + .Aggregate((a, b) => Duplicati.Library.Utility.FilterExpression.Combine(a, b)); + } + } +} + diff --git a/Duplicati/Server/Scheduler.cs b/Duplicati.Library.RestAPI/Scheduler.cs similarity index 94% rename from Duplicati/Server/Scheduler.cs rename to Duplicati.Library.RestAPI/Scheduler.cs index c5704d1a6..d680a9a61 100644 --- a/Duplicati/Server/Scheduler.cs +++ b/Duplicati.Library.RestAPI/Scheduler.cs @@ -1,409 +1,410 @@ -#region Disclaimer / License -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -// -using Duplicati.Server.Serialization.Interface; - - -#endregion -using System; -using System.Collections.Generic; -using System.Text; -using System.Linq; -using System.Threading; -using Duplicati.Library.Utility; - -namespace Duplicati.Server -{ - /// - /// This class handles scheduled runs of backups - /// - public class Scheduler - { - private static readonly string LOGTAG = Duplicati.Library.Logging.Log.LogTagFromType(); - - /// - /// The thread that runs the scheduler - /// - private readonly Thread m_thread; - /// - /// A termination flag - /// - private volatile bool m_terminate; - /// - /// The worker thread that is invoked to do work - /// - private readonly WorkerThread m_worker; - /// - /// The wait event - /// - private readonly AutoResetEvent m_event; - /// - /// The data synchronization lock - /// - private readonly object m_lock = new object(); - - /// - /// An event that is raised when the schedule changes - /// - public event EventHandler NewSchedule; - - /// - /// The currently scheduled items - /// - private KeyValuePair[] m_schedule; - - /// - /// List of update tasks, used to set the timestamp on the schedule once completed - /// - private readonly Dictionary> m_updateTasks; - - /// - /// Constructs a new scheduler - /// - /// The worker thread - public Scheduler(WorkerThread worker) - { - m_thread = new Thread(new ThreadStart(Runner)); - m_worker = worker; - m_worker.CompletedWork += OnCompleted; - m_worker.StartingWork += OnStartingWork; - m_schedule = new KeyValuePair[0]; - m_terminate = false; - m_event = new AutoResetEvent(false); - m_updateTasks = new Dictionary>(); - m_thread.IsBackground = true; - m_thread.Name = "TaskScheduler"; - m_thread.Start(); - } - - /// - /// Forces the scheduler to re-evaluate the order. - /// Call this method if something changes - /// - public void Reschedule() - { - m_event.Set(); - } - - /// - /// A snapshot copy of the current schedule list - /// - public List> Schedule - { - get - { - lock (m_lock) - return m_schedule.ToList(); - } - } - - /// - /// A snapshot copy of the current worker queue, that is items that are scheduled, but waiting for execution - /// - public List WorkerQueue - { - get - { - return (from t in m_worker.CurrentTasks where t != null select t).ToList(); - } - } - - /// - /// Terminates the thread. Any items still in queue will be removed - /// - /// True if the call should block until the thread has exited, false otherwise - public void Terminate(bool wait) - { - m_terminate = true; - m_event.Set(); - - if (wait) - m_thread.Join(); - } - - /// - /// Returns the next valid date, given the start and the interval - /// - /// The base time - /// The first allowed date - /// The repetition interval - /// The days the backup is allowed to run - /// The next valid date, or throws an exception if no such date can be found - public static DateTime GetNextValidTime(DateTime basetime, DateTime firstdate, string repetition, DayOfWeek[] allowedDays) - { - var res = basetime; - - var i = 50000; - while (res < firstdate && i-- > 0) - res = Timeparser.ParseTimeInterval(repetition, res); - - // If we arrived somewhere after the first allowed date - if (res >= firstdate) - { - var ts = Timeparser.ParseTimeSpan(repetition); - - if (ts.TotalDays >= 1) - { - // We jump in days, so we pick the first valid day after firstdate - - for (var n = 0; n < 8; n++) - if (IsDateAllowed(res, allowedDays)) - break; - else - res = res.AddDays(1); - } - else - { - // We jump less than a day, so we keep adding the repetition until - // we hit a valid day - - i = 50000; - while (!IsDateAllowed(res, allowedDays) && i-- > 0) - res = Timeparser.ParseTimeInterval(repetition, res); - } - } - - if (!IsDateAllowed(res, allowedDays) || res < firstdate) - { - StringBuilder sb = new StringBuilder(); - if (allowedDays != null) - foreach (DayOfWeek w in allowedDays) - { - if (sb.Length != 0) - sb.Append(", "); - sb.Append(w.ToString()); - } - - throw new Exception(Strings.Scheduler.InvalidTimeSetupError(basetime, repetition, sb.ToString())); - } - - return res; - } - - private void OnCompleted(WorkerThread worker, Runner.IRunnerData task) - { - Tuple t = null; - lock(m_lock) - { - if (task != null && m_updateTasks.TryGetValue(task, out t)) - m_updateTasks.Remove(task); - } - - if (t != null) - { - t.Item1.Time = t.Item2; - t.Item1.LastRun = t.Item3; - Program.DataConnection.AddOrUpdateSchedule(t.Item1); - } - - } - - private void OnStartingWork(WorkerThread worker, Runner.IRunnerData task) - { - if (task is null) - { - return; - } - - lock(m_lock) - { - if (m_updateTasks.TryGetValue(task, out Tuple scheduleInfo)) - { - // Item2 is the scheduled start time (Time in the Schedule table). - // Item3 is the actual start time (LastRun in the Schedule table). - m_updateTasks[task] = Tuple.Create(scheduleInfo.Item1, scheduleInfo.Item2, DateTime.UtcNow); - } - } - } - - /// - /// The actual scheduling procedure - /// - private void Runner() - { - var scheduled = new Dictionary>(); - while (!m_terminate) - { - //TODO: As this is executed repeatedly we should cache it - // to avoid frequent db lookups - - //Determine schedule list - var lst = Program.DataConnection.Schedules; - foreach(var sc in lst) - { - if (!string.IsNullOrEmpty(sc.Repeat)) - { - KeyValuePair startkey; - - DateTime last = new DateTime(0, DateTimeKind.Utc); - DateTime start; - var scticks = sc.Time.Ticks; - - if (!scheduled.TryGetValue(sc.ID, out startkey) || startkey.Key != scticks) - { - start = new DateTime(scticks, DateTimeKind.Utc); - last = sc.LastRun; - } - else - { - start = startkey.Value; - } - - try - { - // Recover from timedrift issues by overriding the dates if the last run date is in the future. - if (last > DateTime.UtcNow) - { - start = DateTime.UtcNow; - last = DateTime.UtcNow; - } - start = GetNextValidTime(start, last, sc.Repeat, sc.AllowedDays); - } - catch (Exception ex) - { - Program.DataConnection.LogError(sc.ID.ToString(), "Scheduler failed to find next date", ex); - } - - //If time is exceeded, run it now - if (start <= DateTime.UtcNow) - { - var jobsToRun = new List(); - //TODO: Cache this to avoid frequent lookups - foreach(var id in Program.DataConnection.GetBackupIDsForTags(sc.Tags).Distinct().Select(x => x.ToString())) - { - //See if it is already queued - var tmplst = from n in m_worker.CurrentTasks - where n.Operation == Duplicati.Server.Serialization.DuplicatiOperation.Backup - select n.Backup; - var tastTemp = m_worker.CurrentTask; - if (tastTemp != null && tastTemp.Operation == Duplicati.Server.Serialization.DuplicatiOperation.Backup) - tmplst = tmplst.Union(new [] { tastTemp.Backup }); - - //If it is not already in queue, put it there - if (!tmplst.Any(x => x.ID == id)) - { - var entry = Program.DataConnection.GetBackup(id); - if (entry != null) - { - Dictionary options = Duplicati.Server.Runner.GetCommonOptions(); - Duplicati.Server.Runner.ApplyOptions(entry, options); - if ((new Duplicati.Library.Main.Options(options)).DisableOnBattery && (Duplicati.Library.Utility.Power.PowerSupply.GetSource() == Duplicati.Library.Utility.Power.PowerSupply.Source.Battery)) - { - Duplicati.Library.Logging.Log.WriteInformationMessage(LOGTAG, "BackupDisabledOnBattery", "Scheduled backup disabled while on battery power."); - } - else - { - jobsToRun.Add(Server.Runner.CreateTask(Duplicati.Server.Serialization.DuplicatiOperation.Backup, entry)); - } - } - } - } - - // Calculate next time, by finding the first entry later than now - try - { - start = GetNextValidTime(start, new DateTime(Math.Max(DateTime.UtcNow.AddSeconds(1).Ticks, start.AddSeconds(1).Ticks), DateTimeKind.Utc), sc.Repeat, sc.AllowedDays); - } - catch(Exception ex) - { - Program.DataConnection.LogError(sc.ID.ToString(), "Scheduler failed to find next date", ex); - continue; - } - - Server.Runner.IRunnerData lastJob = jobsToRun.LastOrDefault(); - if (lastJob != null) - { - lock (m_lock) - { - // The actual last run time will be updated when the StartingWork event is raised. - m_updateTasks[lastJob] = new Tuple(sc, start, DateTime.UtcNow); - } - } - - foreach (var job in jobsToRun) - m_worker.AddTask(job); - - if (start < DateTime.UtcNow) - { - //TODO: Report this somehow - continue; - } - } - - scheduled[sc.ID] = new KeyValuePair(scticks, start); - } - } - - var existing = lst.ToDictionary(x => x.ID); - //Sort them, lock as we assign the m_schedule variable - lock(m_lock) - m_schedule = (from n in scheduled - where existing.ContainsKey(n.Key) - orderby n.Value.Value - select new KeyValuePair(n.Value.Value, existing[n.Key])).ToArray(); - - // Remove unused entries - foreach(var c in (from n in scheduled where !existing.ContainsKey(n.Key) select n.Key).ToArray()) - scheduled.Remove(c); - - //Raise event if needed - if (NewSchedule != null) - NewSchedule(this, null); - - int waittime = 0; - - //Figure out a sensible amount of time to sleep the thread - if (scheduled.Count > 0) - { - //When is the next run scheduled? - TimeSpan nextrun = scheduled.Values.Min((x) => x.Value) - DateTime.UtcNow; - if (nextrun.TotalMilliseconds < 0) - continue; - - //Don't sleep for more than 5 minutes - waittime = (int)Math.Min(nextrun.TotalMilliseconds, 60 * 1000 * 5); - } - else - { - //No tasks, check back later - waittime = 60 * 1000; - } - - //Waiting on the event, enables a wakeup call from termination - // never use waittime = 0 - m_event.WaitOne(Math.Max(100, waittime), false); - } - } - - /// - /// Returns true if the time is at an allowed weekday, false otherwise - /// - /// The time to evaluate - /// The allowed days - /// True if the backup is allowed to run, false otherwise - private static bool IsDateAllowed(DateTime time, DayOfWeek[] allowedDays) - { - var localTime = time.ToLocalTime(); - if (allowedDays == null || allowedDays.Length == 0) - return true; - else - return Array.IndexOf(allowedDays, localTime.DayOfWeek) >= 0; - } - - } -} +#region Disclaimer / License +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +using Duplicati.Server.Serialization.Interface; + + +#endregion +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; +using System.Threading; +using Duplicati.Library.Utility; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server +{ + /// + /// This class handles scheduled runs of backups + /// + public class Scheduler + { + private static readonly string LOGTAG = Duplicati.Library.Logging.Log.LogTagFromType(); + + /// + /// The thread that runs the scheduler + /// + private readonly Thread m_thread; + /// + /// A termination flag + /// + private volatile bool m_terminate; + /// + /// The worker thread that is invoked to do work + /// + private readonly WorkerThread m_worker; + /// + /// The wait event + /// + private readonly AutoResetEvent m_event; + /// + /// The data synchronization lock + /// + private readonly object m_lock = new object(); + + /// + /// An event that is raised when the schedule changes + /// + public event EventHandler NewSchedule; + + /// + /// The currently scheduled items + /// + private KeyValuePair[] m_schedule; + + /// + /// List of update tasks, used to set the timestamp on the schedule once completed + /// + private readonly Dictionary> m_updateTasks; + + /// + /// Constructs a new scheduler + /// + /// The worker thread + public Scheduler(WorkerThread worker) + { + m_thread = new Thread(new ThreadStart(Runner)); + m_worker = worker; + m_worker.CompletedWork += OnCompleted; + m_worker.StartingWork += OnStartingWork; + m_schedule = new KeyValuePair[0]; + m_terminate = false; + m_event = new AutoResetEvent(false); + m_updateTasks = new Dictionary>(); + m_thread.IsBackground = true; + m_thread.Name = "TaskScheduler"; + m_thread.Start(); + } + + /// + /// Forces the scheduler to re-evaluate the order. + /// Call this method if something changes + /// + public void Reschedule() + { + m_event.Set(); + } + + /// + /// A snapshot copy of the current schedule list + /// + public List> Schedule + { + get + { + lock (m_lock) + return m_schedule.ToList(); + } + } + + /// + /// A snapshot copy of the current worker queue, that is items that are scheduled, but waiting for execution + /// + public List WorkerQueue + { + get + { + return (from t in m_worker.CurrentTasks where t != null select t).ToList(); + } + } + + /// + /// Terminates the thread. Any items still in queue will be removed + /// + /// True if the call should block until the thread has exited, false otherwise + public void Terminate(bool wait) + { + m_terminate = true; + m_event.Set(); + + if (wait) + m_thread.Join(); + } + + /// + /// Returns the next valid date, given the start and the interval + /// + /// The base time + /// The first allowed date + /// The repetition interval + /// The days the backup is allowed to run + /// The next valid date, or throws an exception if no such date can be found + public static DateTime GetNextValidTime(DateTime basetime, DateTime firstdate, string repetition, DayOfWeek[] allowedDays) + { + var res = basetime; + + var i = 50000; + while (res < firstdate && i-- > 0) + res = Timeparser.ParseTimeInterval(repetition, res); + + // If we arrived somewhere after the first allowed date + if (res >= firstdate) + { + var ts = Timeparser.ParseTimeSpan(repetition); + + if (ts.TotalDays >= 1) + { + // We jump in days, so we pick the first valid day after firstdate + + for (var n = 0; n < 8; n++) + if (IsDateAllowed(res, allowedDays)) + break; + else + res = res.AddDays(1); + } + else + { + // We jump less than a day, so we keep adding the repetition until + // we hit a valid day + + i = 50000; + while (!IsDateAllowed(res, allowedDays) && i-- > 0) + res = Timeparser.ParseTimeInterval(repetition, res); + } + } + + if (!IsDateAllowed(res, allowedDays) || res < firstdate) + { + StringBuilder sb = new StringBuilder(); + if (allowedDays != null) + foreach (DayOfWeek w in allowedDays) + { + if (sb.Length != 0) + sb.Append(", "); + sb.Append(w.ToString()); + } + + throw new Exception(Strings.Scheduler.InvalidTimeSetupError(basetime, repetition, sb.ToString())); + } + + return res; + } + + private void OnCompleted(WorkerThread worker, Runner.IRunnerData task) + { + Tuple t = null; + lock(m_lock) + { + if (task != null && m_updateTasks.TryGetValue(task, out t)) + m_updateTasks.Remove(task); + } + + if (t != null) + { + t.Item1.Time = t.Item2; + t.Item1.LastRun = t.Item3; + FIXMEGlobal.DataConnection.AddOrUpdateSchedule(t.Item1); + } + + } + + private void OnStartingWork(WorkerThread worker, Runner.IRunnerData task) + { + if (task is null) + { + return; + } + + lock(m_lock) + { + if (m_updateTasks.TryGetValue(task, out Tuple scheduleInfo)) + { + // Item2 is the scheduled start time (Time in the Schedule table). + // Item3 is the actual start time (LastRun in the Schedule table). + m_updateTasks[task] = Tuple.Create(scheduleInfo.Item1, scheduleInfo.Item2, DateTime.UtcNow); + } + } + } + + /// + /// The actual scheduling procedure + /// + private void Runner() + { + var scheduled = new Dictionary>(); + while (!m_terminate) + { + //TODO: As this is executed repeatedly we should cache it + // to avoid frequent db lookups + + //Determine schedule list + var lst = FIXMEGlobal.DataConnection.Schedules; + foreach(var sc in lst) + { + if (!string.IsNullOrEmpty(sc.Repeat)) + { + KeyValuePair startkey; + + DateTime last = new DateTime(0, DateTimeKind.Utc); + DateTime start; + var scticks = sc.Time.Ticks; + + if (!scheduled.TryGetValue(sc.ID, out startkey) || startkey.Key != scticks) + { + start = new DateTime(scticks, DateTimeKind.Utc); + last = sc.LastRun; + } + else + { + start = startkey.Value; + } + + try + { + // Recover from timedrift issues by overriding the dates if the last run date is in the future. + if (last > DateTime.UtcNow) + { + start = DateTime.UtcNow; + last = DateTime.UtcNow; + } + start = GetNextValidTime(start, last, sc.Repeat, sc.AllowedDays); + } + catch (Exception ex) + { + FIXMEGlobal.DataConnection.LogError(sc.ID.ToString(), "Scheduler failed to find next date", ex); + } + + //If time is exceeded, run it now + if (start <= DateTime.UtcNow) + { + var jobsToRun = new List(); + //TODO: Cache this to avoid frequent lookups + foreach(var id in FIXMEGlobal.DataConnection.GetBackupIDsForTags(sc.Tags).Distinct().Select(x => x.ToString())) + { + //See if it is already queued + var tmplst = from n in m_worker.CurrentTasks + where n.Operation == Duplicati.Server.Serialization.DuplicatiOperation.Backup + select n.Backup; + var tastTemp = m_worker.CurrentTask; + if (tastTemp != null && tastTemp.Operation == Duplicati.Server.Serialization.DuplicatiOperation.Backup) + tmplst = tmplst.Union(new [] { tastTemp.Backup }); + + //If it is not already in queue, put it there + if (!tmplst.Any(x => x.ID == id)) + { + var entry = FIXMEGlobal.DataConnection.GetBackup(id); + if (entry != null) + { + Dictionary options = Duplicati.Server.Runner.GetCommonOptions(); + Duplicati.Server.Runner.ApplyOptions(entry, options); + if ((new Duplicati.Library.Main.Options(options)).DisableOnBattery && (Duplicati.Library.Utility.Power.PowerSupply.GetSource() == Duplicati.Library.Utility.Power.PowerSupply.Source.Battery)) + { + Duplicati.Library.Logging.Log.WriteInformationMessage(LOGTAG, "BackupDisabledOnBattery", "Scheduled backup disabled while on battery power."); + } + else + { + jobsToRun.Add(Server.Runner.CreateTask(Duplicati.Server.Serialization.DuplicatiOperation.Backup, entry)); + } + } + } + } + + // Calculate next time, by finding the first entry later than now + try + { + start = GetNextValidTime(start, new DateTime(Math.Max(DateTime.UtcNow.AddSeconds(1).Ticks, start.AddSeconds(1).Ticks), DateTimeKind.Utc), sc.Repeat, sc.AllowedDays); + } + catch(Exception ex) + { + FIXMEGlobal.DataConnection.LogError(sc.ID.ToString(), "Scheduler failed to find next date", ex); + continue; + } + + Server.Runner.IRunnerData lastJob = jobsToRun.LastOrDefault(); + if (lastJob != null) + { + lock (m_lock) + { + // The actual last run time will be updated when the StartingWork event is raised. + m_updateTasks[lastJob] = new Tuple(sc, start, DateTime.UtcNow); + } + } + + foreach (var job in jobsToRun) + m_worker.AddTask(job); + + if (start < DateTime.UtcNow) + { + //TODO: Report this somehow + continue; + } + } + + scheduled[sc.ID] = new KeyValuePair(scticks, start); + } + } + + var existing = lst.ToDictionary(x => x.ID); + //Sort them, lock as we assign the m_schedule variable + lock(m_lock) + m_schedule = (from n in scheduled + where existing.ContainsKey(n.Key) + orderby n.Value.Value + select new KeyValuePair(n.Value.Value, existing[n.Key])).ToArray(); + + // Remove unused entries + foreach(var c in (from n in scheduled where !existing.ContainsKey(n.Key) select n.Key).ToArray()) + scheduled.Remove(c); + + //Raise event if needed + if (NewSchedule != null) + NewSchedule(this, null); + + int waittime = 0; + + //Figure out a sensible amount of time to sleep the thread + if (scheduled.Count > 0) + { + //When is the next run scheduled? + TimeSpan nextrun = scheduled.Values.Min((x) => x.Value) - DateTime.UtcNow; + if (nextrun.TotalMilliseconds < 0) + continue; + + //Don't sleep for more than 5 minutes + waittime = (int)Math.Min(nextrun.TotalMilliseconds, 60 * 1000 * 5); + } + else + { + //No tasks, check back later + waittime = 60 * 1000; + } + + //Waiting on the event, enables a wakeup call from termination + // never use waittime = 0 + m_event.WaitOne(Math.Max(100, waittime), false); + } + } + + /// + /// Returns true if the time is at an allowed weekday, false otherwise + /// + /// The time to evaluate + /// The allowed days + /// True if the backup is allowed to run, false otherwise + private static bool IsDateAllowed(DateTime time, DayOfWeek[] allowedDays) + { + var localTime = time.ToLocalTime(); + if (allowedDays == null || allowedDays.Length == 0) + return true; + else + return Array.IndexOf(allowedDays, localTime.DayOfWeek) >= 0; + } + + } +} diff --git a/Duplicati/Server/Serializable/ImportExportStructure.cs b/Duplicati.Library.RestAPI/Serializable/ImportExportStructure.cs similarity index 97% rename from Duplicati/Server/Serializable/ImportExportStructure.cs rename to Duplicati.Library.RestAPI/Serializable/ImportExportStructure.cs index cd1ba632e..d737a721e 100644 --- a/Duplicati/Server/Serializable/ImportExportStructure.cs +++ b/Duplicati.Library.RestAPI/Serializable/ImportExportStructure.cs @@ -1,30 +1,30 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Collections.Generic; - -namespace Duplicati.Server.Serializable -{ - public class ImportExportStructure - { - public string CreatedByVersion { get; set; } - public Duplicati.Server.Database.Schedule Schedule { get; set; } - public Duplicati.Server.Database.Backup Backup { get; set; } - public Dictionary DisplayNames { get; set; } - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System.Collections.Generic; + +namespace Duplicati.Server.Serializable +{ + public class ImportExportStructure + { + public string CreatedByVersion { get; set; } + public Duplicati.Server.Database.Schedule Schedule { get; set; } + public Duplicati.Server.Database.Backup Backup { get; set; } + public Dictionary DisplayNames { get; set; } + } +} + diff --git a/Duplicati/Server/Serializable/ServerSettings.cs b/Duplicati.Library.RestAPI/Serializable/ServerSettings.cs similarity index 95% rename from Duplicati/Server/Serializable/ServerSettings.cs rename to Duplicati.Library.RestAPI/Serializable/ServerSettings.cs index 7571ce820..81dac0261 100644 --- a/Duplicati/Server/Serializable/ServerSettings.cs +++ b/Duplicati.Library.RestAPI/Serializable/ServerSettings.cs @@ -1,238 +1,239 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using Duplicati.Server.Serialization.Interface; - -namespace Duplicati.Server.Serializable -{ - /// - /// The server config - /// - public static class ServerSettings - { - /// - /// Shared implementation for reporting dynamic modules - /// - private class DynamicModule : IDynamicModule - { - /// - /// Constructor for backend interface - /// - public DynamicModule(Duplicati.Library.Interface.IBackend backend) - { - this.Key = backend.ProtocolKey; - this.Description = backend.Description; - this.DisplayName = backend.DisplayName; - if (backend.SupportedCommands != null) - this.Options = backend.SupportedCommands.ToArray(); - } - - /// - /// Constructor for compression module interface - /// - public DynamicModule(Duplicati.Library.Interface.ICompression module) - { - this.Key = module.FilenameExtension; - this.Description = module.Description; - this.DisplayName = module.DisplayName; - if (module.SupportedCommands != null) - this.Options = module.SupportedCommands.ToArray(); - } - - /// - /// Constructor for encryption module interface - /// - public DynamicModule(Duplicati.Library.Interface.IEncryption module) - { - this.Key = module.FilenameExtension; - this.Description = module.Description; - this.DisplayName = module.DisplayName; - if (module.SupportedCommands != null) - this.Options = module.SupportedCommands.ToArray(); - } - - /// - /// Constructor for generic module interface - /// - public DynamicModule(Duplicati.Library.Interface.IGenericModule module) - { - this.Key = module.Key; - this.Description = module.Description; - this.DisplayName = module.DisplayName; - if (module.SupportedCommands != null) - this.Options = module.SupportedCommands.ToArray(); - } - - /// - /// Constructor for webmodule interface - /// - public DynamicModule(Duplicati.Library.Interface.IWebModule module) - { - this.Key = module.Key; - this.Description = module.Description; - this.DisplayName = module.DisplayName; - if (module.SupportedCommands != null) - this.Options = module.SupportedCommands.ToArray(); - } - /// - /// The module key - /// - public string Key { get; private set; } - /// - /// The localized module description - /// - public string Description { get; private set; } - /// - /// Gets the localized display name - /// - /// The display name. - public string DisplayName { get; private set; } - /// - /// The options supported by the module - /// - public Duplicati.Library.Interface.ICommandLineArgument[] Options { get; private set; } - } - - /// - /// Gets all supported options - /// - public static Duplicati.Library.Interface.ICommandLineArgument[] Options - { - get - { - return new Duplicati.Library.Main.Options(new System.Collections.Generic.Dictionary()).SupportedCommands.ToArray(); - } - } - - /// - /// The backend modules known by the server - /// - public static IDynamicModule[] BackendModules - { - get - { - return - (from n in Library.DynamicLoader.BackendLoader.Backends - select new DynamicModule(n)) - .ToArray(); - } - } - /// - /// The encryption modules known by the server - /// - public static IDynamicModule[] EncryptionModules - { - get - { - return - (from n in Library.DynamicLoader.EncryptionLoader.Modules - select new DynamicModule(n)) - .ToArray(); - } - } - - /// - /// The compression modules known by the server - /// - public static IDynamicModule[] CompressionModules - { - get - { - return - (from n in Library.DynamicLoader.CompressionLoader.Modules - select new DynamicModule(n)) - .ToArray(); - } - } - - /// - /// The generic modules known by the server - /// - public static IDynamicModule[] GenericModules - { - get - { - return - (from n in Library.DynamicLoader.GenericLoader.Modules - select new DynamicModule(n)) - .ToArray(); - } - } - - /// - /// The web modules known by the server - /// - public static IDynamicModule[] WebModules - { - get - { - return - (from n in Library.DynamicLoader.WebLoader.Modules - select new DynamicModule(n)) - .ToArray(); - } - } - - /// - /// The web modules known by the server - /// - public static IDynamicModule[] ConnectionModules - { - get - { - return - (from n in Library.DynamicLoader.GenericLoader.Modules - where n is Library.Interface.IConnectionModule - select new DynamicModule(n)) - .ToArray(); - } - } - - /// - /// The server modules known by the server - /// - public static object[] ServerModules - { - get - { - return - (from n in Library.DynamicLoader.GenericLoader.Modules - where n is Library.Interface.IGenericServerModule - select n) - .ToArray(); - } - } - - /// - /// The filters that are applied to all backups - /// - public static IFilter[] Filters - { - get { return Program.DataConnection.Filters; } - } - - /// - /// The settings applied to all backups by default - /// - public static ISetting[] Settings - { - get { return Program.DataConnection.Settings; } - } - } -} +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using Duplicati.Library.RestAPI; +using Duplicati.Server.Serialization.Interface; + +namespace Duplicati.Server.Serializable +{ + /// + /// The server config + /// + public static class ServerSettings + { + /// + /// Shared implementation for reporting dynamic modules + /// + private class DynamicModule : IDynamicModule + { + /// + /// Constructor for backend interface + /// + public DynamicModule(Duplicati.Library.Interface.IBackend backend) + { + this.Key = backend.ProtocolKey; + this.Description = backend.Description; + this.DisplayName = backend.DisplayName; + if (backend.SupportedCommands != null) + this.Options = backend.SupportedCommands.ToArray(); + } + + /// + /// Constructor for compression module interface + /// + public DynamicModule(Duplicati.Library.Interface.ICompression module) + { + this.Key = module.FilenameExtension; + this.Description = module.Description; + this.DisplayName = module.DisplayName; + if (module.SupportedCommands != null) + this.Options = module.SupportedCommands.ToArray(); + } + + /// + /// Constructor for encryption module interface + /// + public DynamicModule(Duplicati.Library.Interface.IEncryption module) + { + this.Key = module.FilenameExtension; + this.Description = module.Description; + this.DisplayName = module.DisplayName; + if (module.SupportedCommands != null) + this.Options = module.SupportedCommands.ToArray(); + } + + /// + /// Constructor for generic module interface + /// + public DynamicModule(Duplicati.Library.Interface.IGenericModule module) + { + this.Key = module.Key; + this.Description = module.Description; + this.DisplayName = module.DisplayName; + if (module.SupportedCommands != null) + this.Options = module.SupportedCommands.ToArray(); + } + + /// + /// Constructor for webmodule interface + /// + public DynamicModule(Duplicati.Library.Interface.IWebModule module) + { + this.Key = module.Key; + this.Description = module.Description; + this.DisplayName = module.DisplayName; + if (module.SupportedCommands != null) + this.Options = module.SupportedCommands.ToArray(); + } + /// + /// The module key + /// + public string Key { get; private set; } + /// + /// The localized module description + /// + public string Description { get; private set; } + /// + /// Gets the localized display name + /// + /// The display name. + public string DisplayName { get; private set; } + /// + /// The options supported by the module + /// + public Duplicati.Library.Interface.ICommandLineArgument[] Options { get; private set; } + } + + /// + /// Gets all supported options + /// + public static Duplicati.Library.Interface.ICommandLineArgument[] Options + { + get + { + return new Duplicati.Library.Main.Options(new System.Collections.Generic.Dictionary()).SupportedCommands.ToArray(); + } + } + + /// + /// The backend modules known by the server + /// + public static IDynamicModule[] BackendModules + { + get + { + return + (from n in Library.DynamicLoader.BackendLoader.Backends + select new DynamicModule(n)) + .ToArray(); + } + } + /// + /// The encryption modules known by the server + /// + public static IDynamicModule[] EncryptionModules + { + get + { + return + (from n in Library.DynamicLoader.EncryptionLoader.Modules + select new DynamicModule(n)) + .ToArray(); + } + } + + /// + /// The compression modules known by the server + /// + public static IDynamicModule[] CompressionModules + { + get + { + return + (from n in Library.DynamicLoader.CompressionLoader.Modules + select new DynamicModule(n)) + .ToArray(); + } + } + + /// + /// The generic modules known by the server + /// + public static IDynamicModule[] GenericModules + { + get + { + return + (from n in Library.DynamicLoader.GenericLoader.Modules + select new DynamicModule(n)) + .ToArray(); + } + } + + /// + /// The web modules known by the server + /// + public static IDynamicModule[] WebModules + { + get + { + return + (from n in Library.DynamicLoader.WebLoader.Modules + select new DynamicModule(n)) + .ToArray(); + } + } + + /// + /// The web modules known by the server + /// + public static IDynamicModule[] ConnectionModules + { + get + { + return + (from n in Library.DynamicLoader.GenericLoader.Modules + where n is Library.Interface.IConnectionModule + select new DynamicModule(n)) + .ToArray(); + } + } + + /// + /// The server modules known by the server + /// + public static object[] ServerModules + { + get + { + return + (from n in Library.DynamicLoader.GenericLoader.Modules + where n is Library.Interface.IGenericServerModule + select n) + .ToArray(); + } + } + + /// + /// The filters that are applied to all backups + /// + public static IFilter[] Filters + { + get { return FIXMEGlobal.DataConnection.Filters; } + } + + /// + /// The settings applied to all backups by default + /// + public static ISetting[] Settings + { + get { return FIXMEGlobal.DataConnection.Settings; } + } + } +} diff --git a/Duplicati/Server/Serializable/ServerStatus.cs b/Duplicati.Library.RestAPI/Serializable/ServerStatus.cs similarity index 76% rename from Duplicati/Server/Serializable/ServerStatus.cs rename to Duplicati.Library.RestAPI/Serializable/ServerStatus.cs index 378225270..ff397d40f 100644 --- a/Duplicati/Server/Serializable/ServerStatus.cs +++ b/Duplicati.Library.RestAPI/Serializable/ServerStatus.cs @@ -1,146 +1,147 @@ -#region "Disclaimer / License" -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -#endregion -using System; -using System.Linq; -using System.Collections.Generic; -using Duplicati.Server.Serialization; - -namespace Duplicati.Server.Serializable -{ - /// - /// This class collects all reportable status properties into a single class that can be exported as JSON - /// - public class ServerStatus : Duplicati.Server.Serialization.Interface.IServerStatus - { - public LiveControlState ProgramState - { - get { return EnumConverter.Convert(Program.LiveControl.State); } - } - - public string UpdatedVersion - { - get - { - var u = Program.DataConnection.ApplicationSettings.UpdatedVersion; - if (u == null) - return null; - - Version v; - if (!Version.TryParse(u.Version, out v)) - return null; - - if (v <= System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) - return null; - - return u.Displayname; - } - } - - public UpdatePollerStates UpdaterState { get { return Program.UpdatePoller.ThreadState; } } - - public bool UpdateReady { get { return Duplicati.Library.AutoUpdater.UpdaterManager.HasUpdateInstalled; } } - - public double UpdateDownloadProgress { get { return Program.UpdatePoller.DownloadProgess; } } - - - public Tuple ActiveTask - { - get - { - var t = Program.WorkThread.CurrentTask; - if (t == null) - return null; - else - return new Tuple(t.TaskID, t.Backup == null ? null : t.Backup.ID); - } - } - - public IList> SchedulerQueueIds - { - get { return (from n in Program.Scheduler.WorkerQueue where n.Backup != null select new Tuple(n.TaskID, n.Backup.ID)).ToList(); } - } - - public IList> ProposedSchedule - { - get - { - return ( - from n in Program.Scheduler.Schedule - let backupid = (from t in n.Value.Tags - where t != null && t.StartsWith("ID=", StringComparison.Ordinal) - select t.Substring("ID=".Length)).FirstOrDefault() - where !string.IsNullOrWhiteSpace(backupid) - select new Tuple(backupid, n.Key) - ).ToList(); - } - } - - public bool HasWarning { get { return Program.DataConnection.ApplicationSettings.UnackedWarning; } } - public bool HasError { get { return Program.DataConnection.ApplicationSettings.UnackedError; } } - - public SuggestedStatusIcon SuggestedStatusIcon - { - get - { - if (this.ActiveTask == null) - { - if (this.ProgramState == LiveControlState.Paused) - return SuggestedStatusIcon.Paused; - - if (this.HasError) - return SuggestedStatusIcon.ReadyError; - if (this.HasWarning) - return SuggestedStatusIcon.ReadyWarning; - - return SuggestedStatusIcon.Ready; - } - else - { - if (this.ProgramState == LiveControlState.Running) - return SuggestedStatusIcon.Active; - else - return SuggestedStatusIcon.ActivePaused; - } - } - } - - public DateTime EstimatedPauseEnd - { - get - { - return Program.LiveControl.EstimatedPauseEnd; - } - } - - private long m_lastEventID = Program.StatusEventNotifyer.EventNo; - - public long LastEventID - { - get { return m_lastEventID; } - set { m_lastEventID = value; } - } - - public long LastDataUpdateID { get { return Program.LastDataUpdateID; } } - - public long LastNotificationUpdateID { get { return Program.LastNotificationUpdateID; } } - - } -} - +#region "Disclaimer / License" +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#endregion +using System; +using System.Linq; +using System.Collections.Generic; +using Duplicati.Server.Serialization; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.Serializable +{ + /// + /// This class collects all reportable status properties into a single class that can be exported as JSON + /// + public class ServerStatus : Duplicati.Server.Serialization.Interface.IServerStatus + { + public LiveControlState ProgramState + { + get { return EnumConverter.Convert(FIXMEGlobal.LiveControl.State); } + } + + public string UpdatedVersion + { + get + { + var u = FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion; + if (u == null) + return null; + + Version v; + if (!Version.TryParse(u.Version, out v)) + return null; + + if (v <= System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) + return null; + + return u.Displayname; + } + } + + public UpdatePollerStates UpdaterState { get { return FIXMEGlobal.UpdatePoller.ThreadState; } } + + public bool UpdateReady { get { return Duplicati.Library.AutoUpdater.UpdaterManager.HasUpdateInstalled; } } + + public double UpdateDownloadProgress { get { return FIXMEGlobal.UpdatePoller.DownloadProgess; } } + + + public Tuple ActiveTask + { + get + { + var t = FIXMEGlobal.WorkThread.CurrentTask; + if (t == null) + return null; + else + return new Tuple(t.TaskID, t.Backup == null ? null : t.Backup.ID); + } + } + + public IList> SchedulerQueueIds + { + get { return (from n in FIXMEGlobal.Scheduler.WorkerQueue where n.Backup != null select new Tuple(n.TaskID, n.Backup.ID)).ToList(); } + } + + public IList> ProposedSchedule + { + get + { + return ( + from n in FIXMEGlobal.Scheduler.Schedule + let backupid = (from t in n.Value.Tags + where t != null && t.StartsWith("ID=", StringComparison.Ordinal) + select t.Substring("ID=".Length)).FirstOrDefault() + where !string.IsNullOrWhiteSpace(backupid) + select new Tuple(backupid, n.Key) + ).ToList(); + } + } + + public bool HasWarning { get { return FIXMEGlobal.DataConnection.ApplicationSettings.UnackedWarning; } } + public bool HasError { get { return FIXMEGlobal.DataConnection.ApplicationSettings.UnackedError; } } + + public SuggestedStatusIcon SuggestedStatusIcon + { + get + { + if (this.ActiveTask == null) + { + if (this.ProgramState == LiveControlState.Paused) + return SuggestedStatusIcon.Paused; + + if (this.HasError) + return SuggestedStatusIcon.ReadyError; + if (this.HasWarning) + return SuggestedStatusIcon.ReadyWarning; + + return SuggestedStatusIcon.Ready; + } + else + { + if (this.ProgramState == LiveControlState.Running) + return SuggestedStatusIcon.Active; + else + return SuggestedStatusIcon.ActivePaused; + } + } + } + + public DateTime EstimatedPauseEnd + { + get + { + return FIXMEGlobal.LiveControl.EstimatedPauseEnd; + } + } + + private long m_lastEventID = FIXMEGlobal.StatusEventNotifyer.EventNo; + + public long LastEventID + { + get { return m_lastEventID; } + set { m_lastEventID = value; } + } + + public long LastDataUpdateID { get { return FIXMEGlobal.PeekLastDataUpdateID(); } } + + public long LastNotificationUpdateID { get { return FIXMEGlobal.PeekLastNotificationUpdateID(); } } + + } +} + diff --git a/Duplicati/Server/Serializable/TreeNode.cs b/Duplicati.Library.RestAPI/Serializable/TreeNode.cs similarity index 96% rename from Duplicati/Server/Serializable/TreeNode.cs rename to Duplicati.Library.RestAPI/Serializable/TreeNode.cs index 39c49d05e..02a107971 100644 --- a/Duplicati/Server/Serializable/TreeNode.cs +++ b/Duplicati.Library.RestAPI/Serializable/TreeNode.cs @@ -1,60 +1,60 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace Duplicati.Server.Serializable -{ - /// - /// Implementation of a ExtJS treenode-like class for easy JSON export - /// - public class TreeNode - { - /// - /// The text displayed for the node - /// - public string text { get; set; } - /// - /// The node id - /// - public string id { get; set; } - /// - /// The class applied to the node - /// - public string cls { get; set; } - /// - /// The class applied to the icon - /// - public string iconCls { get; set; } - /// - /// True if the element should be checked - /// - public bool check { get; set; } - /// - /// True if the element is a leaf node - /// - public bool leaf { get; set; } - /// - /// Gets or sets the current path, if the item is a symbolic path - /// - public string resolvedpath { get; set; } - /// - /// True if the element is hidden - /// - public bool hidden { get; set; } - /// - /// True if the element is a symlink - /// - public bool symlink { get; set; } - - /// - /// Constructs a new TreeNode - /// - public TreeNode() - { - this.cls = "folder"; - this.iconCls = "x-tree-icon-parent"; - this.check = false; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Duplicati.Server.Serializable +{ + /// + /// Implementation of a ExtJS treenode-like class for easy JSON export + /// + public class TreeNode + { + /// + /// The text displayed for the node + /// + public string text { get; set; } + /// + /// The node id + /// + public string id { get; set; } + /// + /// The class applied to the node + /// + public string cls { get; set; } + /// + /// The class applied to the icon + /// + public string iconCls { get; set; } + /// + /// True if the element should be checked + /// + public bool check { get; set; } + /// + /// True if the element is a leaf node + /// + public bool leaf { get; set; } + /// + /// Gets or sets the current path, if the item is a symbolic path + /// + public string resolvedpath { get; set; } + /// + /// True if the element is hidden + /// + public bool hidden { get; set; } + /// + /// True if the element is a symlink + /// + public bool symlink { get; set; } + + /// + /// Constructs a new TreeNode + /// + public TreeNode() + { + this.cls = "folder"; + this.iconCls = "x-tree-icon-parent"; + this.check = false; + } + } +} diff --git a/Duplicati/Server/SpecialFolders.cs b/Duplicati.Library.RestAPI/SpecialFolders.cs similarity index 97% rename from Duplicati/Server/SpecialFolders.cs rename to Duplicati.Library.RestAPI/SpecialFolders.cs index e95940d26..882f88ebc 100644 --- a/Duplicati/Server/SpecialFolders.cs +++ b/Duplicati.Library.RestAPI/SpecialFolders.cs @@ -1,191 +1,191 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Collections.Generic; +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Collections.Generic; using Duplicati.Library.Common.IO; using Duplicati.Library.Common; -namespace Duplicati.Server -{ - public static class SpecialFolders - { - public static readonly Serializable.TreeNode[] Nodes; - private static readonly Dictionary PathMap = new Dictionary(StringComparer.OrdinalIgnoreCase); - private static readonly Dictionary DisplayMap = new Dictionary(StringComparer.OrdinalIgnoreCase); - - public static string ExpandEnvironmentVariables(string path) - { - foreach(var n in Nodes) - if (path.StartsWith(n.id, StringComparison.Ordinal)) - path = path.Replace(n.id, n.resolvedpath); - return Environment.ExpandEnvironmentVariables(path); - } - - public static string ExpandEnvironmentVariablesRegexp(string path) - { - // The double expand is to use both the special folder names, - // which are not in the environment, as well as allow expansion - // of values found in the environment - - return - Library.Utility.Utility.ExpandEnvironmentVariablesRegexp(path, name => - { - var res = string.Empty; - if (name != null && !PathMap.TryGetValue(name, out res)) - res = Environment.GetEnvironmentVariable(name); - - return res; - }); - } - - public static string TranslateToPath(string str) - { - string res; - if (PathMap.TryGetValue(str, out res)) - return res; - - return null; - } - - public static string TranslateToDisplayString(string str) - { - string res; - if (DisplayMap.TryGetValue(str, out res)) - return res; - - return null; - } - - private static void TryAdd(List lst, System.Environment.SpecialFolder folder, string id, string display) - { - try - { - TryAdd(lst, System.Environment.GetFolderPath(folder), id, display); - } - catch - { - } - } - - private static void TryAdd(List lst, string folder, string id, string display) - { - try - { - if (!string.IsNullOrWhiteSpace(folder) && System.IO.Path.IsPathRooted(folder) && System.IO.Directory.Exists(folder)) - { - if (!PathMap.ContainsKey(id)) - { - lst.Add(new Serializable.TreeNode() - { - id = id, - text = display, - leaf = false, - iconCls = "x-tree-icon-special", - resolvedpath = folder - }); - - PathMap[id] = folder; - DisplayMap[id] = display; - } - } - } - catch - { - } - } - - static SpecialFolders() - { - var lst = new List(); - - if (Platform.IsClientWindows) - { - TryAdd(lst, Environment.SpecialFolder.MyDocuments, "%MY_DOCUMENTS%", "My Documents"); - TryAdd(lst, Environment.SpecialFolder.MyMusic, "%MY_MUSIC%", "My Music"); - TryAdd(lst, Environment.SpecialFolder.MyPictures, "%MY_PICTURES%", "My Pictures"); - TryAdd(lst, Environment.SpecialFolder.MyVideos, "%MY_VIDEOS%", "My Videos"); - TryAdd(lst, Environment.SpecialFolder.DesktopDirectory, "%DESKTOP%", "Desktop"); - TryAdd(lst, Environment.SpecialFolder.ApplicationData, "%APPDATA%", "Application Data"); - TryAdd(lst, Environment.SpecialFolder.UserProfile, "%HOME%", "Home"); - - try - { - // In case the UserProfile member points to junk - TryAdd(lst, System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOMEDRIVE"), Environment.GetEnvironmentVariable("HOMEPATH")), "%HOME%", "Home"); - } - catch - { - } - - } - else - { - TryAdd(lst, Environment.SpecialFolder.MyDocuments, "%MY_DOCUMENTS%", "My Documents"); - TryAdd(lst, Environment.SpecialFolder.MyMusic, "%MY_MUSIC%", "My Music"); - TryAdd(lst, Environment.SpecialFolder.MyPictures, "%MY_PICTURES%", "My Pictures"); - TryAdd(lst, Environment.SpecialFolder.DesktopDirectory, "%DESKTOP%", "Desktop"); - TryAdd(lst, Environment.GetEnvironmentVariable("HOME"), "%HOME%", "Home"); - TryAdd(lst, Environment.SpecialFolder.Personal, "%HOME%", "Home"); - } - - Nodes = lst.ToArray(); - } - - internal static Dictionary GetSourceNames(Serialization.Interface.IBackup backup) - { - if (backup.Sources == null || backup.Sources.Length == 0) - return new Dictionary(); - - var sources = backup.Sources.Distinct().Select(x => - { - var sp = SpecialFolders.TranslateToDisplayString(x); - if (sp != null) - return new KeyValuePair(x, sp); - - x = SpecialFolders.ExpandEnvironmentVariables(x); - try - { - var nx = x; - if (nx.EndsWith(Util.DirectorySeparatorString, StringComparison.Ordinal)) - nx = nx.Substring(0, nx.Length - 1); - var n = SystemIO.IO_OS.PathGetFileName(nx); - if (!string.IsNullOrWhiteSpace(n)) - return new KeyValuePair(x, n); - } - catch - { - } - - if (x.EndsWith(Util.DirectorySeparatorString, StringComparison.Ordinal) && x.Length > 1) - return new KeyValuePair(x, x.Substring(0, x.Length - 1).Substring(x.Substring(0, x.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1)); - else - return new KeyValuePair(x, x); - - }); - - // Handle duplicates - var result = new Dictionary(); - foreach(var x in sources) - result[x.Key] = x.Value; - - return result; - } - } -} - +namespace Duplicati.Server +{ + public static class SpecialFolders + { + public static readonly Serializable.TreeNode[] Nodes; + private static readonly Dictionary PathMap = new Dictionary(StringComparer.OrdinalIgnoreCase); + private static readonly Dictionary DisplayMap = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public static string ExpandEnvironmentVariables(string path) + { + foreach(var n in Nodes) + if (path.StartsWith(n.id, StringComparison.Ordinal)) + path = path.Replace(n.id, n.resolvedpath); + return Environment.ExpandEnvironmentVariables(path); + } + + public static string ExpandEnvironmentVariablesRegexp(string path) + { + // The double expand is to use both the special folder names, + // which are not in the environment, as well as allow expansion + // of values found in the environment + + return + Library.Utility.Utility.ExpandEnvironmentVariablesRegexp(path, name => + { + var res = string.Empty; + if (name != null && !PathMap.TryGetValue(name, out res)) + res = Environment.GetEnvironmentVariable(name); + + return res; + }); + } + + public static string TranslateToPath(string str) + { + string res; + if (PathMap.TryGetValue(str, out res)) + return res; + + return null; + } + + public static string TranslateToDisplayString(string str) + { + string res; + if (DisplayMap.TryGetValue(str, out res)) + return res; + + return null; + } + + private static void TryAdd(List lst, System.Environment.SpecialFolder folder, string id, string display) + { + try + { + TryAdd(lst, System.Environment.GetFolderPath(folder), id, display); + } + catch + { + } + } + + private static void TryAdd(List lst, string folder, string id, string display) + { + try + { + if (!string.IsNullOrWhiteSpace(folder) && System.IO.Path.IsPathRooted(folder) && System.IO.Directory.Exists(folder)) + { + if (!PathMap.ContainsKey(id)) + { + lst.Add(new Serializable.TreeNode() + { + id = id, + text = display, + leaf = false, + iconCls = "x-tree-icon-special", + resolvedpath = folder + }); + + PathMap[id] = folder; + DisplayMap[id] = display; + } + } + } + catch + { + } + } + + static SpecialFolders() + { + var lst = new List(); + + if (Platform.IsClientWindows) + { + TryAdd(lst, Environment.SpecialFolder.MyDocuments, "%MY_DOCUMENTS%", "My Documents"); + TryAdd(lst, Environment.SpecialFolder.MyMusic, "%MY_MUSIC%", "My Music"); + TryAdd(lst, Environment.SpecialFolder.MyPictures, "%MY_PICTURES%", "My Pictures"); + TryAdd(lst, Environment.SpecialFolder.MyVideos, "%MY_VIDEOS%", "My Videos"); + TryAdd(lst, Environment.SpecialFolder.DesktopDirectory, "%DESKTOP%", "Desktop"); + TryAdd(lst, Environment.SpecialFolder.ApplicationData, "%APPDATA%", "Application Data"); + TryAdd(lst, Environment.SpecialFolder.UserProfile, "%HOME%", "Home"); + + try + { + // In case the UserProfile member points to junk + TryAdd(lst, System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOMEDRIVE"), Environment.GetEnvironmentVariable("HOMEPATH")), "%HOME%", "Home"); + } + catch + { + } + + } + else + { + TryAdd(lst, Environment.SpecialFolder.MyDocuments, "%MY_DOCUMENTS%", "My Documents"); + TryAdd(lst, Environment.SpecialFolder.MyMusic, "%MY_MUSIC%", "My Music"); + TryAdd(lst, Environment.SpecialFolder.MyPictures, "%MY_PICTURES%", "My Pictures"); + TryAdd(lst, Environment.SpecialFolder.DesktopDirectory, "%DESKTOP%", "Desktop"); + TryAdd(lst, Environment.GetEnvironmentVariable("HOME"), "%HOME%", "Home"); + TryAdd(lst, Environment.SpecialFolder.Personal, "%HOME%", "Home"); + } + + Nodes = lst.ToArray(); + } + + internal static Dictionary GetSourceNames(Serialization.Interface.IBackup backup) + { + if (backup.Sources == null || backup.Sources.Length == 0) + return new Dictionary(); + + var sources = backup.Sources.Distinct().Select(x => + { + var sp = SpecialFolders.TranslateToDisplayString(x); + if (sp != null) + return new KeyValuePair(x, sp); + + x = SpecialFolders.ExpandEnvironmentVariables(x); + try + { + var nx = x; + if (nx.EndsWith(Util.DirectorySeparatorString, StringComparison.Ordinal)) + nx = nx.Substring(0, nx.Length - 1); + var n = SystemIO.IO_OS.PathGetFileName(nx); + if (!string.IsNullOrWhiteSpace(n)) + return new KeyValuePair(x, n); + } + catch + { + } + + if (x.EndsWith(Util.DirectorySeparatorString, StringComparison.Ordinal) && x.Length > 1) + return new KeyValuePair(x, x.Substring(0, x.Length - 1).Substring(x.Substring(0, x.Length - 1).LastIndexOf("/", StringComparison.Ordinal) + 1)); + else + return new KeyValuePair(x, x); + + }); + + // Handle duplicates + var result = new Dictionary(); + foreach(var x in sources) + result[x.Key] = x.Value; + + return result; + } + } +} + diff --git a/Duplicati/Server/Strings.cs b/Duplicati.Library.RestAPI/Strings.cs similarity index 98% rename from Duplicati/Server/Strings.cs rename to Duplicati.Library.RestAPI/Strings.cs index 829d6a3c2..d925113eb 100644 --- a/Duplicati/Server/Strings.cs +++ b/Duplicati.Library.RestAPI/Strings.cs @@ -1,57 +1,57 @@ -using System.Collections.Generic; -using Duplicati.Library.Localization.Short; -using System.Linq; - -namespace Duplicati.Server.Strings { - internal static class Program { - public static string AnotherInstanceDetected { get { return LC.L(@"Another instance is running, and was notified"); } } - public static string DatabaseOpenError(string message) { return LC.L(@"Failed to create, open or upgrade the database. -Error message: {0}", message); } - public static string HelpCommandDescription { get { return LC.L(@"Displays this help"); } } - public static string HelpDisplayDialog { get { return LC.L(@"Supported commandline arguments: - -"); } } - public static string HelpDisplayFormat(string optionname, string optiontext) { return LC.L(@"--{0}: {1}", optionname, optiontext); } - public static string ParametersFileOptionLong2 { get { return LC.L(@"This option can be used to store some or all of the options given to the commandline client. The file must be a plain text file, UTF-8 encoding is preferred. Each line in the file should be of the format --option=value. The special options --{0} and --{1} can be used to override the localpath and the remote destination uri, respectively. The options in this file take precedence over the options provided on the commandline. You cannot specify filters in both the file and on the commandline. Instead, you can use the special --{2}, --{3}, or --{4} options to specify filters inside the parameter file. Each filter must be prefixed with either a + or a -, and multiple filters must be joined with {5} ", "source", "target", "replace-filter", "append-filter", "prepend-filter", System.IO.Path.PathSeparator); } } - public static string ParametersFileOptionShort { get { return LC.L(@"Path to a file with parameters"); } } - public static string FiltersCannotBeUsedWithFileError2 { get { return LC.L(@"Filters cannot be specified on the commandline if filters are also present in the parameter file. Use the special --{0}, --{1}, or --{2} options to specify filters inside the parameter file. Each filter must be prefixed with either a + or a -, and multiple filters must be joined with {3}", "replace-filter", "append-filter", "prepend-filter", System.IO.Path.PathSeparator); } } - public static string FailedToParseParametersFileError(string path, string message) { return LC.L(@"Unable to read the parameters file ""{0}"", reason: {1}", path, message); } - public static string SkippingSourceArgumentsOnNonBackupOperation { get { return @"The --source argument was specified in the parameter file, but the current operation is not a backup operation, so the argument is ignored"; } } - public static string LogfileCommandDescription { get { return LC.L(@"Outputs log information to the file given"); } } - public static string LoglevelCommandDescription { get { return LC.L(@"Determines the amount of information written in the log file"); } } - public static string PortablemodeCommandDescription { get { return LC.L(@"Activates portable mode where the database is placed below the program executable"); } } - public static string SeriousError(string message) { return LC.L(@"A serious error occurred in Duplicati: {0}", message); } - public static string StartupFailure(System.Exception error) { return LC.L(@"Unable to start up, perhaps another process is already running? -Error message: {0}", error); } - public static string UnencrypteddatabaseCommandDescription { get { return LC.L(@"Disables database encryption"); } } - public static string WrongSQLiteVersion(System.Version actualversion, string expectedversion) { return LC.L(@"Unsupported version of SQLite detected ({0}), must be {1} or higher", actualversion, expectedversion); } - public static string WebserverWebrootDescription { get { return LC.L(@"The path to the folder where the static files for the webserver is present. The folder must be located beneath the installation folder"); } } - public static string WebserverPortDescription { get { return LC.L(@"The port the webserver listens on. Multiple values may be supplied with a comma in between."); } } - public static string WebserverCertificateFileDescription { get { return LC.L(@"The certificate and key file in PKCS #12 format the webserver use for SSL. Only RSA/DSA keys are supported."); } } - public static string WebserverCertificatePasswordDescription { get { return LC.L(@"The password for decryption of certificate PKCS #12 file."); } } - public static string WebserverInterfaceDescription { get { return LC.L(@"The interface the webserver listens on. The special values ""*"" and ""any"" means any interface. The special value ""loopback"" means the loopback adapter."); } } - public static string WebserverPasswordDescription { get { return LC.L(@"The password required to access the webserver. This option is saved so you do not need to set it on each run. Setting an empty value disables the password."); } } - public static string WebserverAllowedhostnamesDescription { get { return LC.L(@"The hostnames that are accepted, separated with semicolons. If any of the hostnames are ""*"", all hostnames are allowed and the hostname checking is disabled."); } } - public static string PingpongkeepaliveShort { get { return LC.L(@"Enables the ping-pong responder"); } } - public static string PingpongkeepaliveLong { get { return LC.L(@"When running as a server, the service daemon must verify that the process is responding. If this option is enabled, the server reads stdin and writes a reply to each line read"); } } - public static string LogretentionShort { get { return LC.L(@"Clean up old log data"); } } - public static string LogretentionLong { get { return LC.L(@"Set the time after which log data will be purged from the database."); } } - public static string ServerdatafolderShort { get { return LC.L(@"Sets the folder where settings are stored"); } } - public static string ServerdatafolderLong(string envname) { return LC.L(@"Duplicati needs to store a small database with all settings. Use this option to choose where the settings are stored. This option can also be set with the environment variable {0}.", envname); } - public static string ServerencryptionkeyShort { get { return LC.L(@"Sets the database encryption key"); } } - public static string ServerencryptionkeyLong(string envname, string decryptionoption) { return LC.L(@"This option sets the encryption key used to scramble the local settings database. This option can also be set with the environment variable {0}. Use the option --{1} to disable the database scrambling.", envname, decryptionoption); } - public static string TempdirShort { get { return LC.L(@"Temporary storage folder"); } } - public static string TempdirLong { get { return LC.L(@"This option can be used to supply an alternative folder for temporary storage. By default the system default temporary folder is used. Note that also SQLite will put temporary files in this temporary folder."); } } -} - internal static class Scheduler { - public static string InvalidTimeSetupError(System.DateTime startdate, string interval, string alloweddays) { return LC.L(@"Unable to find a valid date, given the start date {0}, the repetition interval {1} and the allowed days {2}", startdate, interval, alloweddays); } - } - internal static class Server - { - public static string DefectSSLCertInDatabase { get { return @"Unable to create SSL certificate using data from database. Starting without SSL."; } } - public static string StartedServer(string ip, int port) { return LC.L(@"Server has started and is listening on {0}, port {1}", ip, port); } - public static string SSLCertificateFailure(string errormessage) { return LC.L(@"Unable to create SSL certificate using provided parameters. Exception detail: {0}", errormessage); } - public static string ServerStartFailure(IEnumerable portstried) { return LC.L(@"Unable to open a socket for listening, tried ports: {0}", string.Join(",", from n in (portstried ?? new int[0]) select n.ToString())); } - } - -} +using System.Collections.Generic; +using Duplicati.Library.Localization.Short; +using System.Linq; + +namespace Duplicati.Server.Strings { + public static class Program { + public static string AnotherInstanceDetected { get { return LC.L(@"Another instance is running, and was notified"); } } + public static string DatabaseOpenError(string message) { return LC.L(@"Failed to create, open or upgrade the database. +Error message: {0}", message); } + public static string HelpCommandDescription { get { return LC.L(@"Displays this help"); } } + public static string HelpDisplayDialog { get { return LC.L(@"Supported commandline arguments: + +"); } } + public static string HelpDisplayFormat(string optionname, string optiontext) { return LC.L(@"--{0}: {1}", optionname, optiontext); } + public static string ParametersFileOptionLong2 { get { return LC.L(@"This option can be used to store some or all of the options given to the commandline client. The file must be a plain text file, UTF-8 encoding is preferred. Each line in the file should be of the format --option=value. The special options --{0} and --{1} can be used to override the localpath and the remote destination uri, respectively. The options in this file take precedence over the options provided on the commandline. You cannot specify filters in both the file and on the commandline. Instead, you can use the special --{2}, --{3}, or --{4} options to specify filters inside the parameter file. Each filter must be prefixed with either a + or a -, and multiple filters must be joined with {5} ", "source", "target", "replace-filter", "append-filter", "prepend-filter", System.IO.Path.PathSeparator); } } + public static string ParametersFileOptionShort { get { return LC.L(@"Path to a file with parameters"); } } + public static string FiltersCannotBeUsedWithFileError2 { get { return LC.L(@"Filters cannot be specified on the commandline if filters are also present in the parameter file. Use the special --{0}, --{1}, or --{2} options to specify filters inside the parameter file. Each filter must be prefixed with either a + or a -, and multiple filters must be joined with {3}", "replace-filter", "append-filter", "prepend-filter", System.IO.Path.PathSeparator); } } + public static string FailedToParseParametersFileError(string path, string message) { return LC.L(@"Unable to read the parameters file ""{0}"", reason: {1}", path, message); } + public static string SkippingSourceArgumentsOnNonBackupOperation { get { return @"The --source argument was specified in the parameter file, but the current operation is not a backup operation, so the argument is ignored"; } } + public static string LogfileCommandDescription { get { return LC.L(@"Outputs log information to the file given"); } } + public static string LoglevelCommandDescription { get { return LC.L(@"Determines the amount of information written in the log file"); } } + public static string PortablemodeCommandDescription { get { return LC.L(@"Activates portable mode where the database is placed below the program executable"); } } + public static string SeriousError(string message) { return LC.L(@"A serious error occurred in Duplicati: {0}", message); } + public static string StartupFailure(System.Exception error) { return LC.L(@"Unable to start up, perhaps another process is already running? +Error message: {0}", error); } + public static string UnencrypteddatabaseCommandDescription { get { return LC.L(@"Disables database encryption"); } } + public static string WrongSQLiteVersion(System.Version actualversion, string expectedversion) { return LC.L(@"Unsupported version of SQLite detected ({0}), must be {1} or higher", actualversion, expectedversion); } + public static string WebserverWebrootDescription { get { return LC.L(@"The path to the folder where the static files for the webserver is present. The folder must be located beneath the installation folder"); } } + public static string WebserverPortDescription { get { return LC.L(@"The port the webserver listens on. Multiple values may be supplied with a comma in between."); } } + public static string WebserverCertificateFileDescription { get { return LC.L(@"The certificate and key file in PKCS #12 format the webserver use for SSL. Only RSA/DSA keys are supported."); } } + public static string WebserverCertificatePasswordDescription { get { return LC.L(@"The password for decryption of certificate PKCS #12 file."); } } + public static string WebserverInterfaceDescription { get { return LC.L(@"The interface the webserver listens on. The special values ""*"" and ""any"" means any interface. The special value ""loopback"" means the loopback adapter."); } } + public static string WebserverPasswordDescription { get { return LC.L(@"The password required to access the webserver. This option is saved so you do not need to set it on each run. Setting an empty value disables the password."); } } + public static string WebserverAllowedhostnamesDescription { get { return LC.L(@"The hostnames that are accepted, separated with semicolons. If any of the hostnames are ""*"", all hostnames are allowed and the hostname checking is disabled."); } } + public static string PingpongkeepaliveShort { get { return LC.L(@"Enables the ping-pong responder"); } } + public static string PingpongkeepaliveLong { get { return LC.L(@"When running as a server, the service daemon must verify that the process is responding. If this option is enabled, the server reads stdin and writes a reply to each line read"); } } + public static string LogretentionShort { get { return LC.L(@"Clean up old log data"); } } + public static string LogretentionLong { get { return LC.L(@"Set the time after which log data will be purged from the database."); } } + public static string ServerdatafolderShort { get { return LC.L(@"Sets the folder where settings are stored"); } } + public static string ServerdatafolderLong(string envname) { return LC.L(@"Duplicati needs to store a small database with all settings. Use this option to choose where the settings are stored. This option can also be set with the environment variable {0}.", envname); } + public static string ServerencryptionkeyShort { get { return LC.L(@"Sets the database encryption key"); } } + public static string ServerencryptionkeyLong(string envname, string decryptionoption) { return LC.L(@"This option sets the encryption key used to scramble the local settings database. This option can also be set with the environment variable {0}. Use the option --{1} to disable the database scrambling.", envname, decryptionoption); } + public static string TempdirShort { get { return LC.L(@"Temporary storage folder"); } } + public static string TempdirLong { get { return LC.L(@"This option can be used to supply an alternative folder for temporary storage. By default the system default temporary folder is used. Note that also SQLite will put temporary files in this temporary folder."); } } +} + internal static class Scheduler { + public static string InvalidTimeSetupError(System.DateTime startdate, string interval, string alloweddays) { return LC.L(@"Unable to find a valid date, given the start date {0}, the repetition interval {1} and the allowed days {2}", startdate, interval, alloweddays); } + } + internal static class Server + { + public static string DefectSSLCertInDatabase { get { return @"Unable to create SSL certificate using data from database. Starting without SSL."; } } + public static string StartedServer(string ip, int port) { return LC.L(@"Server has started and is listening on {0}, port {1}", ip, port); } + public static string SSLCertificateFailure(string errormessage) { return LC.L(@"Unable to create SSL certificate using provided parameters. Exception detail: {0}", errormessage); } + public static string ServerStartFailure(IEnumerable portstried) { return LC.L(@"Unable to open a socket for listening, tried ports: {0}", string.Join(",", from n in (portstried ?? new int[0]) select n.ToString())); } + } + +} diff --git a/Duplicati/Server/UpdatePollThread.cs b/Duplicati.Library.RestAPI/UpdatePollThread.cs similarity index 79% rename from Duplicati/Server/UpdatePollThread.cs rename to Duplicati.Library.RestAPI/UpdatePollThread.cs index 5a3e546ae..c82bd8d2d 100644 --- a/Duplicati/Server/UpdatePollThread.cs +++ b/Duplicati.Library.RestAPI/UpdatePollThread.cs @@ -1,236 +1,237 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Threading; -using Duplicati.Server.Serialization; - -namespace Duplicati.Server -{ - /// - /// The thread that checks on the update server if new versions are available - /// - public class UpdatePollThread - { - private readonly Thread m_thread; - private volatile bool m_terminated = false; - private volatile bool m_download = false; - private volatile bool m_forceCheck = false; - private readonly object m_lock = new object(); - private readonly AutoResetEvent m_waitSignal; - private double m_downloadProgress; - - public bool IsUpdateRequested { get; private set; } = false; - - public UpdatePollerStates ThreadState { get; private set; } - public double DownloadProgess - { - get { return m_downloadProgress ; } - - private set - { - var oldv = m_downloadProgress; - m_downloadProgress = value; - if ((int)(oldv * 100) != (int)(value * 100)) - Program.StatusEventNotifyer.SignalNewEvent(); - } - } - - public UpdatePollThread() - { - m_waitSignal = new AutoResetEvent(false); - ThreadState = UpdatePollerStates.Waiting; - m_thread = new Thread(Run); - m_thread.IsBackground = true; - m_thread.Name = "UpdatePollThread"; - m_thread.Start(); - } - - public void CheckNow() - { - lock(m_lock) - { - m_forceCheck = true; - m_waitSignal.Set(); - } - } - - public void InstallUpdate() - { - lock(m_lock) - { - m_forceCheck = true; - m_download = true; - m_waitSignal.Set(); - } - } - - public void ActivateUpdate() - { - if (Duplicati.Library.AutoUpdater.UpdaterManager.SetRunUpdate()) - { - IsUpdateRequested = true; - Program.ApplicationExitEvent.Set(); - } - } - - public void Terminate() - { - lock(m_lock) - { - m_terminated = true; - m_waitSignal.Set(); - } - } - - public void Reschedule() - { - m_waitSignal.Set(); - } - - private void Run() - { - // Wait on startup - m_waitSignal.WaitOne(TimeSpan.FromMinutes(1), true); - - while (!m_terminated) - { - var nextCheck = Program.DataConnection.ApplicationSettings.NextUpdateCheck; - - var maxcheck = TimeSpan.FromDays(7); - try - { - maxcheck = Library.Utility.Timeparser.ParseTimeSpan(Program.DataConnection.ApplicationSettings.UpdateCheckInterval); - } - catch - { - } - - // If we have some weirdness, just check now - if (nextCheck - DateTime.UtcNow > maxcheck) - nextCheck = DateTime.UtcNow - TimeSpan.FromSeconds(1); - - if (nextCheck < DateTime.UtcNow || m_forceCheck) - { - lock(m_lock) - m_forceCheck = false; - - ThreadState = UpdatePollerStates.Checking; - Program.StatusEventNotifyer.SignalNewEvent(); - - DateTime started = DateTime.UtcNow; - Program.DataConnection.ApplicationSettings.LastUpdateCheck = started; - nextCheck = Program.DataConnection.ApplicationSettings.NextUpdateCheck; - - Library.AutoUpdater.ReleaseType rt; - if (!Enum.TryParse(Program.DataConnection.ApplicationSettings.UpdateChannel, true, out rt)) - rt = Duplicati.Library.AutoUpdater.ReleaseType.Unknown; - - // Choose the default channel in case we have unknown - rt = rt == Duplicati.Library.AutoUpdater.ReleaseType.Unknown ? Duplicati.Library.AutoUpdater.AutoUpdateSettings.DefaultUpdateChannel : rt; - - try - { - var update = Duplicati.Library.AutoUpdater.UpdaterManager.CheckForUpdate(rt); - if (update != null) - Program.DataConnection.ApplicationSettings.UpdatedVersion = update; - } - catch - { - } - - // It could be that we have registered an update from a more unstable channel, - // but the user has switched to a more stable channel. - // In that case we discard the old update to avoid offering it. - if (Program.DataConnection.ApplicationSettings.UpdatedVersion != null) - { - Library.AutoUpdater.ReleaseType updatert; - var updatertstring = Program.DataConnection.ApplicationSettings.UpdatedVersion.ReleaseType; - if (string.Equals(updatertstring, "preview", StringComparison.OrdinalIgnoreCase)) - updatertstring = Library.AutoUpdater.ReleaseType.Experimental.ToString(); - - if (!Enum.TryParse(updatertstring, true, out updatert)) - updatert = Duplicati.Library.AutoUpdater.ReleaseType.Nightly; - - if (updatert == Duplicati.Library.AutoUpdater.ReleaseType.Unknown) - updatert = Duplicati.Library.AutoUpdater.ReleaseType.Nightly; - - if (updatert > rt) - Program.DataConnection.ApplicationSettings.UpdatedVersion = null; - } - - if (Program.DataConnection.ApplicationSettings.UpdatedVersion != null && Duplicati.Library.AutoUpdater.UpdaterManager.TryParseVersion(Program.DataConnection.ApplicationSettings.UpdatedVersion.Version) > System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) - { - Program.DataConnection.RegisterNotification( - NotificationType.Information, - "Found update", - Program.DataConnection.ApplicationSettings.UpdatedVersion.Displayname, - null, - null, - "update:new", - null, - "NewUpdateFound", - null, - (self, all) => { - return all.FirstOrDefault(x => x.Action == "update:new") ?? self; - } - ); - } - } - - if (m_download) - { - lock(m_lock) - m_download = false; - - var v = Program.DataConnection.ApplicationSettings.UpdatedVersion; - if (v != null) - { - ThreadState = UpdatePollerStates.Downloading; - Program.StatusEventNotifyer.SignalNewEvent(); - - if (Duplicati.Library.AutoUpdater.UpdaterManager.DownloadAndUnpackUpdate(v, (pg) => { DownloadProgess = pg; })) - Program.StatusEventNotifyer.SignalNewEvent(); - } - } - - DownloadProgess = 0; - - if (ThreadState != UpdatePollerStates.Waiting) - { - ThreadState = UpdatePollerStates.Waiting; - Program.StatusEventNotifyer.SignalNewEvent(); - } - - var waitTime = nextCheck - DateTime.UtcNow; - - // Guard against spin-loop - if (waitTime.TotalSeconds < 5) - waitTime = TimeSpan.FromSeconds(5); - - // Guard against year-long waits - // A re-check does not cause an update check - if (waitTime.TotalDays > 1) - waitTime = TimeSpan.FromDays(1); - - m_waitSignal.WaitOne(waitTime, true); - } - } - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Threading; +using Duplicati.Library.RestAPI; +using Duplicati.Server.Serialization; + +namespace Duplicati.Server +{ + /// + /// The thread that checks on the update server if new versions are available + /// + public class UpdatePollThread + { + private readonly Thread m_thread; + private volatile bool m_terminated = false; + private volatile bool m_download = false; + private volatile bool m_forceCheck = false; + private readonly object m_lock = new object(); + private readonly AutoResetEvent m_waitSignal; + private double m_downloadProgress; + + public bool IsUpdateRequested { get; private set; } = false; + + public UpdatePollerStates ThreadState { get; private set; } + public double DownloadProgess + { + get { return m_downloadProgress ; } + + private set + { + var oldv = m_downloadProgress; + m_downloadProgress = value; + if ((int)(oldv * 100) != (int)(value * 100)) + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + } + + public UpdatePollThread() + { + m_waitSignal = new AutoResetEvent(false); + ThreadState = UpdatePollerStates.Waiting; + m_thread = new Thread(Run); + m_thread.IsBackground = true; + m_thread.Name = "UpdatePollThread"; + m_thread.Start(); + } + + public void CheckNow() + { + lock(m_lock) + { + m_forceCheck = true; + m_waitSignal.Set(); + } + } + + public void InstallUpdate() + { + lock(m_lock) + { + m_forceCheck = true; + m_download = true; + m_waitSignal.Set(); + } + } + + public void ActivateUpdate() + { + if (Duplicati.Library.AutoUpdater.UpdaterManager.SetRunUpdate()) + { + IsUpdateRequested = true; + FIXMEGlobal.ApplicationExitEvent.Set(); + } + } + + public void Terminate() + { + lock(m_lock) + { + m_terminated = true; + m_waitSignal.Set(); + } + } + + public void Reschedule() + { + m_waitSignal.Set(); + } + + private void Run() + { + // Wait on startup + m_waitSignal.WaitOne(TimeSpan.FromMinutes(1), true); + + while (!m_terminated) + { + var nextCheck = FIXMEGlobal.DataConnection.ApplicationSettings.NextUpdateCheck; + + var maxcheck = TimeSpan.FromDays(7); + try + { + maxcheck = Library.Utility.Timeparser.ParseTimeSpan(FIXMEGlobal.DataConnection.ApplicationSettings.UpdateCheckInterval); + } + catch + { + } + + // If we have some weirdness, just check now + if (nextCheck - DateTime.UtcNow > maxcheck) + nextCheck = DateTime.UtcNow - TimeSpan.FromSeconds(1); + + if (nextCheck < DateTime.UtcNow || m_forceCheck) + { + lock(m_lock) + m_forceCheck = false; + + ThreadState = UpdatePollerStates.Checking; + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + DateTime started = DateTime.UtcNow; + FIXMEGlobal.DataConnection.ApplicationSettings.LastUpdateCheck = started; + nextCheck = FIXMEGlobal.DataConnection.ApplicationSettings.NextUpdateCheck; + + Library.AutoUpdater.ReleaseType rt; + if (!Enum.TryParse(FIXMEGlobal.DataConnection.ApplicationSettings.UpdateChannel, true, out rt)) + rt = Duplicati.Library.AutoUpdater.ReleaseType.Unknown; + + // Choose the default channel in case we have unknown + rt = rt == Duplicati.Library.AutoUpdater.ReleaseType.Unknown ? Duplicati.Library.AutoUpdater.AutoUpdateSettings.DefaultUpdateChannel : rt; + + try + { + var update = Duplicati.Library.AutoUpdater.UpdaterManager.CheckForUpdate(rt); + if (update != null) + FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion = update; + } + catch + { + } + + // It could be that we have registered an update from a more unstable channel, + // but the user has switched to a more stable channel. + // In that case we discard the old update to avoid offering it. + if (FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion != null) + { + Library.AutoUpdater.ReleaseType updatert; + var updatertstring = FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion.ReleaseType; + if (string.Equals(updatertstring, "preview", StringComparison.OrdinalIgnoreCase)) + updatertstring = Library.AutoUpdater.ReleaseType.Experimental.ToString(); + + if (!Enum.TryParse(updatertstring, true, out updatert)) + updatert = Duplicati.Library.AutoUpdater.ReleaseType.Nightly; + + if (updatert == Duplicati.Library.AutoUpdater.ReleaseType.Unknown) + updatert = Duplicati.Library.AutoUpdater.ReleaseType.Nightly; + + if (updatert > rt) + FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion = null; + } + + if (FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion != null && Duplicati.Library.AutoUpdater.UpdaterManager.TryParseVersion(FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion.Version) > System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) + { + FIXMEGlobal.DataConnection.RegisterNotification( + NotificationType.Information, + "Found update", + FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion.Displayname, + null, + null, + "update:new", + null, + "NewUpdateFound", + null, + (self, all) => { + return all.FirstOrDefault(x => x.Action == "update:new") ?? self; + } + ); + } + } + + if (m_download) + { + lock(m_lock) + m_download = false; + + var v = FIXMEGlobal.DataConnection.ApplicationSettings.UpdatedVersion; + if (v != null) + { + ThreadState = UpdatePollerStates.Downloading; + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + + if (Duplicati.Library.AutoUpdater.UpdaterManager.DownloadAndUnpackUpdate(v, (pg) => { DownloadProgess = pg; })) + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + } + + DownloadProgess = 0; + + if (ThreadState != UpdatePollerStates.Waiting) + { + ThreadState = UpdatePollerStates.Waiting; + FIXMEGlobal.StatusEventNotifyer.SignalNewEvent(); + } + + var waitTime = nextCheck - DateTime.UtcNow; + + // Guard against spin-loop + if (waitTime.TotalSeconds < 5) + waitTime = TimeSpan.FromSeconds(5); + + // Guard against year-long waits + // A re-check does not cause an update check + if (waitTime.TotalDays > 1) + waitTime = TimeSpan.FromDays(1); + + m_waitSignal.WaitOne(waitTime, true); + } + } + } +} + diff --git a/Duplicati/Server/WebServer/AuthenticationHandler.cs b/Duplicati.Library.RestAPI/WebServer/AuthenticationHandler.cs similarity index 95% rename from Duplicati/Server/WebServer/AuthenticationHandler.cs rename to Duplicati.Library.RestAPI/WebServer/AuthenticationHandler.cs index 42537f501..3dd26011d 100644 --- a/Duplicati/Server/WebServer/AuthenticationHandler.cs +++ b/Duplicati.Library.RestAPI/WebServer/AuthenticationHandler.cs @@ -1,338 +1,339 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Concurrent; -using System.Linq; -using HttpServer; -using HttpServer.HttpModules; -using System.Collections.Generic; - -namespace Duplicati.Server.WebServer -{ - internal class AuthenticationHandler : HttpModule - { - private const string AUTH_COOKIE_NAME = "session-auth"; - private const string NONCE_COOKIE_NAME = "session-nonce"; - - private const string XSRF_COOKIE_NAME = "xsrf-token"; - private const string XSRF_HEADER_NAME = "X-XSRF-Token"; - - private const string TRAYICONPASSWORDSOURCE_HEADER = "X-TrayIcon-PasswordSource"; - - public const string LOGIN_SCRIPT_URI = "/login.cgi"; - public const string LOGOUT_SCRIPT_URI = "/logout.cgi"; - public const string CAPTCHA_IMAGE_URI = RESTHandler.API_URI_PATH + "/captcha/"; - - private const int XSRF_TIMEOUT_MINUTES = 10; - private const int AUTH_TIMEOUT_MINUTES = 10; - - private readonly ConcurrentDictionary m_activeTokens = new ConcurrentDictionary(); - private readonly ConcurrentDictionary> m_activeNonces = new ConcurrentDictionary>(); - private readonly ConcurrentDictionary m_activexsrf = new ConcurrentDictionary(); - - readonly System.Security.Cryptography.RandomNumberGenerator m_prng = System.Security.Cryptography.RNGCryptoServiceProvider.Create(); - - private string FindXSRFToken(HttpServer.IHttpRequest request) - { - string xsrftoken = request.Headers[XSRF_HEADER_NAME] ?? ""; - - if (string.IsNullOrWhiteSpace(xsrftoken)) - { - var xsrfq = request.Form[XSRF_HEADER_NAME] ?? request.Form[Duplicati.Library.Utility.Uri.UrlEncode(XSRF_HEADER_NAME)]; - xsrftoken = (xsrfq == null || string.IsNullOrWhiteSpace(xsrfq.Value)) ? "" : xsrfq.Value; - } - - if (string.IsNullOrWhiteSpace(xsrftoken)) - { - var xsrfq = request.QueryString[XSRF_HEADER_NAME] ?? request.QueryString[Duplicati.Library.Utility.Uri.UrlEncode(XSRF_HEADER_NAME)]; - xsrftoken = (xsrfq == null || string.IsNullOrWhiteSpace(xsrfq.Value)) ? "" : xsrfq.Value; - } - - return xsrftoken; - } - - private bool AddXSRFTokenToRespone(HttpServer.IHttpResponse response) - { - if (m_activexsrf.Count > 500) - return false; - - var buf = new byte[32]; - var expires = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); - m_prng.GetBytes(buf); - var token = Convert.ToBase64String(buf); - - m_activexsrf.AddOrUpdate(token, key => expires, (key, existingExpires) => - { - // Simulate the original behavior => if the random token, against all odds, is already used - // we throw an ArgumentException - throw new ArgumentException("An element with the same key already exists in the dictionary."); - }); - - response.Cookies.Add(new HttpServer.ResponseCookie(XSRF_COOKIE_NAME, token, expires)); - return true; - } - - private string FindAuthCookie(HttpServer.IHttpRequest request) - { - var authcookie = request.Cookies[AUTH_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(AUTH_COOKIE_NAME)]; - var authform = request.Form["auth-token"] ?? request.Form[Library.Utility.Uri.UrlEncode("auth-token")]; - var authquery = request.QueryString["auth-token"] ?? request.QueryString[Library.Utility.Uri.UrlEncode("auth-token")]; - - var auth_token = string.IsNullOrWhiteSpace(authcookie?.Value) ? null : authcookie.Value; - if (!string.IsNullOrWhiteSpace(authquery?.Value)) - auth_token = authquery.Value; - if (!string.IsNullOrWhiteSpace(authform?.Value)) - auth_token = authform.Value; - - return auth_token; - } - - private bool HasXSRFCookie(HttpServer.IHttpRequest request) - { - // Clean up expired XSRF cookies - foreach (var k in (from n in m_activexsrf where DateTime.UtcNow > n.Value select n.Key)) - m_activexsrf.TryRemove(k, out _); - - var xsrfcookie = request.Cookies[XSRF_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(XSRF_COOKIE_NAME)]; - var value = xsrfcookie == null ? null : xsrfcookie.Value; - if (string.IsNullOrWhiteSpace(value)) - return false; - - if (m_activexsrf.ContainsKey(value)) - { - m_activexsrf[value] = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); - return true; - } - else if (m_activexsrf.ContainsKey(Library.Utility.Uri.UrlDecode(value))) - { - m_activexsrf[Library.Utility.Uri.UrlDecode(value)] = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); - return true; - } - - return false; - } - - public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - HttpServer.HttpInput input = String.Equals(request.Method, "POST", StringComparison.OrdinalIgnoreCase) ? request.Form : request.QueryString; - - var auth_token = FindAuthCookie(request); - var xsrf_token = FindXSRFToken(request); - - if (!HasXSRFCookie(request)) - { - var cookieAdded = AddXSRFTokenToRespone(response); - - if (!cookieAdded) - { - response.Status = System.Net.HttpStatusCode.ServiceUnavailable; - response.Reason = "Too Many Concurrent Request, try again later"; - return true; - } - } - - if (LOGOUT_SCRIPT_URI.Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase)) - { - if (!string.IsNullOrWhiteSpace(auth_token)) - { - // Remove the active auth token - m_activeTokens.TryRemove(auth_token, out _); - } - - response.Status = System.Net.HttpStatusCode.NoContent; - response.Reason = "OK"; - - return true; - } - else if (LOGIN_SCRIPT_URI.Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase)) - { - // Remove expired nonces - foreach(var k in (from n in m_activeNonces where DateTime.UtcNow > n.Value.Item1 select n.Key)) - m_activeNonces.TryRemove(k, out _); - - if (input["get-nonce"] != null && !string.IsNullOrWhiteSpace(input["get-nonce"].Value)) - { - if (m_activeNonces.Count > 50) - { - response.Status = System.Net.HttpStatusCode.ServiceUnavailable; - response.Reason = "Too many active login attempts"; - return true; - } - - var password = Program.DataConnection.ApplicationSettings.WebserverPassword; - - if (request.Headers[TRAYICONPASSWORDSOURCE_HEADER] == "database") - password = Program.DataConnection.ApplicationSettings.WebserverPasswordTrayIconHash; - - var buf = new byte[32]; - var expires = DateTime.UtcNow.AddMinutes(AUTH_TIMEOUT_MINUTES); - m_prng.GetBytes(buf); - var nonce = Convert.ToBase64String(buf); - - var sha256 = System.Security.Cryptography.SHA256.Create(); - sha256.TransformBlock(buf, 0, buf.Length, buf, 0); - buf = Convert.FromBase64String(password); - sha256.TransformFinalBlock(buf, 0, buf.Length); - var pwd = Convert.ToBase64String(sha256.Hash); - - m_activeNonces.AddOrUpdate(nonce, key => new Tuple(expires, pwd), (key, existingValue) => - { - // Simulate the original behavior => if the nonce, against all odds, is already used - // we throw an ArgumentException - throw new ArgumentException("An element with the same key already exists in the dictionary."); - }); - - response.Cookies.Add(new HttpServer.ResponseCookie(NONCE_COOKIE_NAME, nonce, expires)); - using(var bw = new BodyWriter(response, request)) - { - bw.OutputOK(new { - Status = "OK", - Nonce = nonce, - Salt = Program.DataConnection.ApplicationSettings.WebserverPasswordSalt - }); - } - return true; - } - else - { - if (input["password"] != null && !string.IsNullOrWhiteSpace(input["password"].Value)) - { - var nonce_el = request.Cookies[NONCE_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(NONCE_COOKIE_NAME)]; - var nonce = nonce_el == null || string.IsNullOrWhiteSpace(nonce_el.Value) ? "" : nonce_el.Value; - var urldecoded = nonce == null ? "" : Duplicati.Library.Utility.Uri.UrlDecode(nonce); - if (m_activeNonces.ContainsKey(urldecoded)) - nonce = urldecoded; - - if (!m_activeNonces.ContainsKey(nonce)) - { - response.Status = System.Net.HttpStatusCode.Unauthorized; - response.Reason = "Unauthorized"; - response.ContentType = "application/json"; - return true; - } - - var pwd = m_activeNonces[nonce].Item2; - - // Remove the nonce - m_activeNonces.TryRemove(nonce, out _); - - if (pwd != input["password"].Value) - { - response.Status = System.Net.HttpStatusCode.Unauthorized; - response.Reason = "Unauthorized"; - response.ContentType = "application/json"; - return true; - } - - var buf = new byte[32]; - var expires = DateTime.UtcNow.AddHours(1); - m_prng.GetBytes(buf); - var token = Duplicati.Library.Utility.Utility.Base64UrlEncode(buf); - while (token.Length > 0 && token.EndsWith("=", StringComparison.Ordinal)) - token = token.Substring(0, token.Length - 1); - - m_activeTokens.AddOrUpdate(token, key => expires, (key, existingValue) => - { - // Simulate the original behavior => if the token, against all odds, is already used - // we throw an ArgumentException - throw new ArgumentException("An element with the same key already exists in the dictionary."); - }); - - response.Cookies.Add(new HttpServer.ResponseCookie(AUTH_COOKIE_NAME, token, expires)); - - using(var bw = new BodyWriter(response, request)) - bw.OutputOK(); - - return true; - } - } - } - - var limitedAccess = - request.Uri.AbsolutePath.StartsWith(RESTHandler.API_URI_PATH, StringComparison.OrdinalIgnoreCase) - ; - - // Override to allow the CAPTCHA call to go through - if (request.Uri.AbsolutePath.StartsWith(CAPTCHA_IMAGE_URI, StringComparison.OrdinalIgnoreCase) && request.Method == "GET") - limitedAccess = false; - - if (limitedAccess) - { - if (xsrf_token != null && m_activexsrf.ContainsKey(xsrf_token)) - { - var expires = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); - m_activexsrf[xsrf_token] = expires; - response.Cookies.Add(new ResponseCookie(XSRF_COOKIE_NAME, xsrf_token, expires)); - } - else - { - response.Status = System.Net.HttpStatusCode.BadRequest; - response.Reason = "Missing XSRF Token. Please reload the page"; - - return true; - } - } - - if (string.IsNullOrWhiteSpace(Program.DataConnection.ApplicationSettings.WebserverPassword)) - return false; - - foreach(var k in (from n in m_activeTokens where DateTime.UtcNow > n.Value select n.Key)) - m_activeTokens.TryRemove(k, out _); - - - // If we have a valid token, proceed - if (!string.IsNullOrWhiteSpace(auth_token)) - { - DateTime expires; - var found = m_activeTokens.TryGetValue(auth_token, out expires); - if (!found) - { - auth_token = Duplicati.Library.Utility.Uri.UrlDecode(auth_token); - found = m_activeTokens.TryGetValue(auth_token, out expires); - } - - if (found && DateTime.UtcNow < expires) - { - expires = DateTime.UtcNow.AddHours(1); - - m_activeTokens[auth_token] = expires; - response.Cookies.Add(new ResponseCookie(AUTH_COOKIE_NAME, auth_token, expires)); - return false; - } - } - - if ("/".Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase) || "/index.html".Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase)) - { - response.Redirect("/login.html"); - return true; - } - - if (limitedAccess) - { - response.Status = System.Net.HttpStatusCode.Unauthorized; - response.Reason = "Not logged in"; - response.AddHeader("Location", "login.html"); - - return true; - } - - return false; - } - } -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Concurrent; +using System.Linq; +using HttpServer; +using HttpServer.HttpModules; +using System.Collections.Generic; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer +{ + internal class AuthenticationHandler : HttpModule + { + private const string AUTH_COOKIE_NAME = "session-auth"; + private const string NONCE_COOKIE_NAME = "session-nonce"; + + private const string XSRF_COOKIE_NAME = "xsrf-token"; + private const string XSRF_HEADER_NAME = "X-XSRF-Token"; + + private const string TRAYICONPASSWORDSOURCE_HEADER = "X-TrayIcon-PasswordSource"; + + public const string LOGIN_SCRIPT_URI = "/login.cgi"; + public const string LOGOUT_SCRIPT_URI = "/logout.cgi"; + public const string CAPTCHA_IMAGE_URI = RESTHandler.API_URI_PATH + "/captcha/"; + + private const int XSRF_TIMEOUT_MINUTES = 10; + private const int AUTH_TIMEOUT_MINUTES = 10; + + private readonly ConcurrentDictionary m_activeTokens = new ConcurrentDictionary(); + private readonly ConcurrentDictionary> m_activeNonces = new ConcurrentDictionary>(); + private readonly ConcurrentDictionary m_activexsrf = new ConcurrentDictionary(); + + readonly System.Security.Cryptography.RandomNumberGenerator m_prng = System.Security.Cryptography.RNGCryptoServiceProvider.Create(); + + private string FindXSRFToken(HttpServer.IHttpRequest request) + { + string xsrftoken = request.Headers[XSRF_HEADER_NAME] ?? ""; + + if (string.IsNullOrWhiteSpace(xsrftoken)) + { + var xsrfq = request.Form[XSRF_HEADER_NAME] ?? request.Form[Duplicati.Library.Utility.Uri.UrlEncode(XSRF_HEADER_NAME)]; + xsrftoken = (xsrfq == null || string.IsNullOrWhiteSpace(xsrfq.Value)) ? "" : xsrfq.Value; + } + + if (string.IsNullOrWhiteSpace(xsrftoken)) + { + var xsrfq = request.QueryString[XSRF_HEADER_NAME] ?? request.QueryString[Duplicati.Library.Utility.Uri.UrlEncode(XSRF_HEADER_NAME)]; + xsrftoken = (xsrfq == null || string.IsNullOrWhiteSpace(xsrfq.Value)) ? "" : xsrfq.Value; + } + + return xsrftoken; + } + + private bool AddXSRFTokenToRespone(HttpServer.IHttpResponse response) + { + if (m_activexsrf.Count > 500) + return false; + + var buf = new byte[32]; + var expires = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); + m_prng.GetBytes(buf); + var token = Convert.ToBase64String(buf); + + m_activexsrf.AddOrUpdate(token, key => expires, (key, existingExpires) => + { + // Simulate the original behavior => if the random token, against all odds, is already used + // we throw an ArgumentException + throw new ArgumentException("An element with the same key already exists in the dictionary."); + }); + + response.Cookies.Add(new HttpServer.ResponseCookie(XSRF_COOKIE_NAME, token, expires)); + return true; + } + + private string FindAuthCookie(HttpServer.IHttpRequest request) + { + var authcookie = request.Cookies[AUTH_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(AUTH_COOKIE_NAME)]; + var authform = request.Form["auth-token"] ?? request.Form[Library.Utility.Uri.UrlEncode("auth-token")]; + var authquery = request.QueryString["auth-token"] ?? request.QueryString[Library.Utility.Uri.UrlEncode("auth-token")]; + + var auth_token = string.IsNullOrWhiteSpace(authcookie?.Value) ? null : authcookie.Value; + if (!string.IsNullOrWhiteSpace(authquery?.Value)) + auth_token = authquery.Value; + if (!string.IsNullOrWhiteSpace(authform?.Value)) + auth_token = authform.Value; + + return auth_token; + } + + private bool HasXSRFCookie(HttpServer.IHttpRequest request) + { + // Clean up expired XSRF cookies + foreach (var k in (from n in m_activexsrf where DateTime.UtcNow > n.Value select n.Key)) + m_activexsrf.TryRemove(k, out _); + + var xsrfcookie = request.Cookies[XSRF_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(XSRF_COOKIE_NAME)]; + var value = xsrfcookie == null ? null : xsrfcookie.Value; + if (string.IsNullOrWhiteSpace(value)) + return false; + + if (m_activexsrf.ContainsKey(value)) + { + m_activexsrf[value] = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); + return true; + } + else if (m_activexsrf.ContainsKey(Library.Utility.Uri.UrlDecode(value))) + { + m_activexsrf[Library.Utility.Uri.UrlDecode(value)] = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); + return true; + } + + return false; + } + + public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + HttpServer.HttpInput input = String.Equals(request.Method, "POST", StringComparison.OrdinalIgnoreCase) ? request.Form : request.QueryString; + + var auth_token = FindAuthCookie(request); + var xsrf_token = FindXSRFToken(request); + + if (!HasXSRFCookie(request)) + { + var cookieAdded = AddXSRFTokenToRespone(response); + + if (!cookieAdded) + { + response.Status = System.Net.HttpStatusCode.ServiceUnavailable; + response.Reason = "Too Many Concurrent Request, try again later"; + return true; + } + } + + if (LOGOUT_SCRIPT_URI.Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase)) + { + if (!string.IsNullOrWhiteSpace(auth_token)) + { + // Remove the active auth token + m_activeTokens.TryRemove(auth_token, out _); + } + + response.Status = System.Net.HttpStatusCode.NoContent; + response.Reason = "OK"; + + return true; + } + else if (LOGIN_SCRIPT_URI.Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase)) + { + // Remove expired nonces + foreach(var k in (from n in m_activeNonces where DateTime.UtcNow > n.Value.Item1 select n.Key)) + m_activeNonces.TryRemove(k, out _); + + if (input["get-nonce"] != null && !string.IsNullOrWhiteSpace(input["get-nonce"].Value)) + { + if (m_activeNonces.Count > 50) + { + response.Status = System.Net.HttpStatusCode.ServiceUnavailable; + response.Reason = "Too many active login attempts"; + return true; + } + + var password = FIXMEGlobal.DataConnection.ApplicationSettings.WebserverPassword; + + if (request.Headers[TRAYICONPASSWORDSOURCE_HEADER] == "database") + password = FIXMEGlobal.DataConnection.ApplicationSettings.WebserverPasswordTrayIconHash; + + var buf = new byte[32]; + var expires = DateTime.UtcNow.AddMinutes(AUTH_TIMEOUT_MINUTES); + m_prng.GetBytes(buf); + var nonce = Convert.ToBase64String(buf); + + var sha256 = System.Security.Cryptography.SHA256.Create(); + sha256.TransformBlock(buf, 0, buf.Length, buf, 0); + buf = Convert.FromBase64String(password); + sha256.TransformFinalBlock(buf, 0, buf.Length); + var pwd = Convert.ToBase64String(sha256.Hash); + + m_activeNonces.AddOrUpdate(nonce, key => new Tuple(expires, pwd), (key, existingValue) => + { + // Simulate the original behavior => if the nonce, against all odds, is already used + // we throw an ArgumentException + throw new ArgumentException("An element with the same key already exists in the dictionary."); + }); + + response.Cookies.Add(new HttpServer.ResponseCookie(NONCE_COOKIE_NAME, nonce, expires)); + using(var bw = new BodyWriter(response, request)) + { + bw.OutputOK(new { + Status = "OK", + Nonce = nonce, + Salt = FIXMEGlobal.DataConnection.ApplicationSettings.WebserverPasswordSalt + }); + } + return true; + } + else + { + if (input["password"] != null && !string.IsNullOrWhiteSpace(input["password"].Value)) + { + var nonce_el = request.Cookies[NONCE_COOKIE_NAME] ?? request.Cookies[Library.Utility.Uri.UrlEncode(NONCE_COOKIE_NAME)]; + var nonce = nonce_el == null || string.IsNullOrWhiteSpace(nonce_el.Value) ? "" : nonce_el.Value; + var urldecoded = nonce == null ? "" : Duplicati.Library.Utility.Uri.UrlDecode(nonce); + if (m_activeNonces.ContainsKey(urldecoded)) + nonce = urldecoded; + + if (!m_activeNonces.ContainsKey(nonce)) + { + response.Status = System.Net.HttpStatusCode.Unauthorized; + response.Reason = "Unauthorized"; + response.ContentType = "application/json"; + return true; + } + + var pwd = m_activeNonces[nonce].Item2; + + // Remove the nonce + m_activeNonces.TryRemove(nonce, out _); + + if (pwd != input["password"].Value) + { + response.Status = System.Net.HttpStatusCode.Unauthorized; + response.Reason = "Unauthorized"; + response.ContentType = "application/json"; + return true; + } + + var buf = new byte[32]; + var expires = DateTime.UtcNow.AddHours(1); + m_prng.GetBytes(buf); + var token = Duplicati.Library.Utility.Utility.Base64UrlEncode(buf); + while (token.Length > 0 && token.EndsWith("=", StringComparison.Ordinal)) + token = token.Substring(0, token.Length - 1); + + m_activeTokens.AddOrUpdate(token, key => expires, (key, existingValue) => + { + // Simulate the original behavior => if the token, against all odds, is already used + // we throw an ArgumentException + throw new ArgumentException("An element with the same key already exists in the dictionary."); + }); + + response.Cookies.Add(new HttpServer.ResponseCookie(AUTH_COOKIE_NAME, token, expires)); + + using(var bw = new BodyWriter(response, request)) + bw.OutputOK(); + + return true; + } + } + } + + var limitedAccess = + request.Uri.AbsolutePath.StartsWith(RESTHandler.API_URI_PATH, StringComparison.OrdinalIgnoreCase) + ; + + // Override to allow the CAPTCHA call to go through + if (request.Uri.AbsolutePath.StartsWith(CAPTCHA_IMAGE_URI, StringComparison.OrdinalIgnoreCase) && request.Method == "GET") + limitedAccess = false; + + if (limitedAccess) + { + if (xsrf_token != null && m_activexsrf.ContainsKey(xsrf_token)) + { + var expires = DateTime.UtcNow.AddMinutes(XSRF_TIMEOUT_MINUTES); + m_activexsrf[xsrf_token] = expires; + response.Cookies.Add(new ResponseCookie(XSRF_COOKIE_NAME, xsrf_token, expires)); + } + else + { + response.Status = System.Net.HttpStatusCode.BadRequest; + response.Reason = "Missing XSRF Token. Please reload the page"; + + return true; + } + } + + if (string.IsNullOrWhiteSpace(FIXMEGlobal.DataConnection.ApplicationSettings.WebserverPassword)) + return false; + + foreach(var k in (from n in m_activeTokens where DateTime.UtcNow > n.Value select n.Key)) + m_activeTokens.TryRemove(k, out _); + + + // If we have a valid token, proceed + if (!string.IsNullOrWhiteSpace(auth_token)) + { + DateTime expires; + var found = m_activeTokens.TryGetValue(auth_token, out expires); + if (!found) + { + auth_token = Duplicati.Library.Utility.Uri.UrlDecode(auth_token); + found = m_activeTokens.TryGetValue(auth_token, out expires); + } + + if (found && DateTime.UtcNow < expires) + { + expires = DateTime.UtcNow.AddHours(1); + + m_activeTokens[auth_token] = expires; + response.Cookies.Add(new ResponseCookie(AUTH_COOKIE_NAME, auth_token, expires)); + return false; + } + } + + if ("/".Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase) || "/index.html".Equals(request.Uri.AbsolutePath, StringComparison.OrdinalIgnoreCase)) + { + response.Redirect("/login.html"); + return true; + } + + if (limitedAccess) + { + response.Status = System.Net.HttpStatusCode.Unauthorized; + response.Reason = "Not logged in"; + response.AddHeader("Location", "login.html"); + + return true; + } + + return false; + } + } +} + diff --git a/Duplicati/Server/WebServer/BodyWriter.cs b/Duplicati.Library.RestAPI/WebServer/BodyWriter.cs similarity index 96% rename from Duplicati/Server/WebServer/BodyWriter.cs rename to Duplicati.Library.RestAPI/WebServer/BodyWriter.cs index 9f332c32a..0434bfe8a 100644 --- a/Duplicati/Server/WebServer/BodyWriter.cs +++ b/Duplicati.Library.RestAPI/WebServer/BodyWriter.cs @@ -1,97 +1,97 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using Duplicati.Server.Serialization; - -namespace Duplicati.Server.WebServer -{ - public class BodyWriter : System.IO.StreamWriter, IDisposable - { - private readonly HttpServer.IHttpResponse m_resp; - private readonly string m_jsonp; - private static readonly object SUCCESS_RESPONSE = new { Status = "OK" }; - - // We override the format provider so all JSON output uses US format - public override IFormatProvider FormatProvider - { - get { return System.Globalization.CultureInfo.InvariantCulture; } - } - - public BodyWriter(HttpServer.IHttpResponse resp, HttpServer.IHttpRequest request) - : this(resp, request.QueryString["jsonp"].Value) - { - } - - public BodyWriter(HttpServer.IHttpResponse resp, string jsonp) - : base(resp.Body, resp.Encoding) - { - m_resp = resp; - m_jsonp = jsonp; - if (!m_resp.HeadersSent) - m_resp.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); - } - - protected override void Dispose (bool disposing) - { - if (!m_resp.HeadersSent) - { - base.Flush(); - m_resp.ContentLength = base.BaseStream.Length; - m_resp.Send(); - } - base.Dispose(disposing); - } - - public void SetOK() - { - m_resp.Reason = "OK"; - m_resp.Status = System.Net.HttpStatusCode.OK; - } - - public void OutputOK(object result = null) - { - SetOK(); - WriteJsonObject(result ?? SUCCESS_RESPONSE); - } - - public void WriteJsonObject(object o) - { - if (!m_resp.HeadersSent) - m_resp.ContentType = "application/json"; - - using(this) - { - if (!string.IsNullOrEmpty(m_jsonp)) - { - this.Write(m_jsonp); - this.Write('('); - } - - Serializer.SerializeJson(this, o, true); - - if (!string.IsNullOrEmpty(m_jsonp)) - { - this.Write(')'); - this.Flush(); - } - } - } - } - -} - +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using Duplicati.Server.Serialization; + +namespace Duplicati.Server.WebServer +{ + public class BodyWriter : System.IO.StreamWriter, IDisposable + { + private readonly HttpServer.IHttpResponse m_resp; + private readonly string m_jsonp; + private static readonly object SUCCESS_RESPONSE = new { Status = "OK" }; + + // We override the format provider so all JSON output uses US format + public override IFormatProvider FormatProvider + { + get { return System.Globalization.CultureInfo.InvariantCulture; } + } + + public BodyWriter(HttpServer.IHttpResponse resp, HttpServer.IHttpRequest request) + : this(resp, request.QueryString["jsonp"].Value) + { + } + + public BodyWriter(HttpServer.IHttpResponse resp, string jsonp) + : base(resp.Body, resp.Encoding) + { + m_resp = resp; + m_jsonp = jsonp; + if (!m_resp.HeadersSent) + m_resp.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); + } + + protected override void Dispose (bool disposing) + { + if (!m_resp.HeadersSent) + { + base.Flush(); + m_resp.ContentLength = base.BaseStream.Length; + m_resp.Send(); + } + base.Dispose(disposing); + } + + public void SetOK() + { + m_resp.Reason = "OK"; + m_resp.Status = System.Net.HttpStatusCode.OK; + } + + public void OutputOK(object result = null) + { + SetOK(); + WriteJsonObject(result ?? SUCCESS_RESPONSE); + } + + public void WriteJsonObject(object o) + { + if (!m_resp.HeadersSent) + m_resp.ContentType = "application/json"; + + using(this) + { + if (!string.IsNullOrEmpty(m_jsonp)) + { + this.Write(m_jsonp); + this.Write('('); + } + + Serializer.SerializeJson(this, o, true); + + if (!string.IsNullOrEmpty(m_jsonp)) + { + this.Write(')'); + this.Flush(); + } + } + } + } + +} + diff --git a/Duplicati/Server/WebServer/CaptchaUtil.cs b/Duplicati.Library.RestAPI/WebServer/CaptchaUtil.cs similarity index 98% rename from Duplicati/Server/WebServer/CaptchaUtil.cs rename to Duplicati.Library.RestAPI/WebServer/CaptchaUtil.cs index c7ac7e471..632018de2 100644 --- a/Duplicati/Server/WebServer/CaptchaUtil.cs +++ b/Duplicati.Library.RestAPI/WebServer/CaptchaUtil.cs @@ -1,129 +1,129 @@ -// Copyright (C) 2016, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; - -namespace Duplicati.Server.WebServer -{ - /// - /// Helper class for creating Captcha images - /// - public static class CaptchaUtil - { - /// - /// A lookup string with characters to use - /// - private static readonly string DEFAULT_CHARS = "ACDEFGHJKLMNPQRTUVWXY34679"; - - /// - /// A range of possible brush colors - /// - private static readonly Brush[] BRUSH_COLORS = - typeof(Brushes) - .GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public) - .Where(x => x.PropertyType == typeof(Brush)) - .Select(x => x.GetValue(null, null) as Brush) - .Where(x => x != null) - .ToArray(); - - /// - /// Approximate the size in pixels of text drawn at the given fontsize - /// - private static int ApproxTextWidth(string text, FontFamily fontfamily, int fontsize) - { - using (var font = new Font(fontfamily, fontsize, GraphicsUnit.Pixel)) - using (var graphics = Graphics.FromImage(new Bitmap(1, 1))) { - return (int) graphics.MeasureString(text, font).Width; - } - } - - /// - /// Creates a random answer. - /// - /// The random answer. - /// The list of allowed chars, supply a character multiple times to change frequency. - /// The minimum answer length. - /// The maximum answer length. - public static string CreateRandomAnswer(string allowedchars = null, int minlength = 10, int maxlength = 12) - { - allowedchars = allowedchars ?? DEFAULT_CHARS; - var rnd = new Random(); - var len = rnd.Next(Math.Min(minlength, maxlength), Math.Max(minlength, maxlength) + 1); - if (len <= 0) - throw new ArgumentException($"The values ${minlength} and ${maxlength} gave a final length of {len} and it must be greater than 0"); - - return new string(Enumerable.Range(0, len).Select(x => allowedchars[rnd.Next(0, allowedchars.Length)]).ToArray()); - } - - /// - /// Creates a captcha image. - /// - /// The captcha image. - /// The captcha solution string. - /// The size of the image, omit to get a size based on the string. - /// The size of the font used to create the captcha, in pixels. - public static Bitmap CreateCaptcha(string answer, Size size = default(Size), int fontsize = 40) - { - var fontfamily = FontFamily.GenericSansSerif; - var text_width = ApproxTextWidth(answer, fontfamily, fontsize); - if (size.Width == 0 || size.Height == 0) - size = new Size((int) (text_width * 1.2), (int) (fontsize * 1.2)); - - var bmp = new Bitmap(size.Width, size.Height); - var rnd = new Random(); - var stray_x = fontsize / 2; - var stray_y = size.Height / 4; - var ans_stray_x = fontsize / 3; - var ans_stray_y = size.Height / 6; - using (var graphics = Graphics.FromImage(bmp)) - using (var font1 = new Font(fontfamily, fontsize, GraphicsUnit.Pixel)) - using (var font2 = new Font(fontfamily, fontsize, GraphicsUnit.Pixel)) - using (var font3 = new HatchBrush(HatchStyle.Shingle, Color.GhostWhite, Color.DarkBlue)) - { - graphics.Clear(Color.White); - graphics.TextRenderingHint = TextRenderingHint.AntiAlias; - - // Apply a some background string to make it hard to do OCR - foreach (var color in new[] { Color.Yellow, Color.LightGreen, Color.GreenYellow }) - using (var brush = new SolidBrush(color)) - graphics.DrawString(CreateRandomAnswer(minlength: answer.Length, maxlength: answer.Length), font2, brush, rnd.Next(-stray_x, stray_x), rnd.Next(-stray_y, stray_y)); - - - var spacing = (size.Width / fontsize) + rnd.Next(0, stray_x); - - // Create a vertical background lines - for (var i = rnd.Next(0, stray_x); i < size.Width; i += spacing) - using (var pen = new Pen(BRUSH_COLORS[rnd.Next(0, BRUSH_COLORS.Length)])) - graphics.DrawLine(pen, i + rnd.Next(-stray_x, stray_x), rnd.Next(0, stray_y), i + rnd.Next(-stray_x, stray_x), size.Height - rnd.Next(0, stray_y)); - - spacing = (size.Height / fontsize) + rnd.Next(0, stray_y); - // Create a horizontal background lines - for (var i = rnd.Next(0, stray_y); i < size.Height; i += spacing) - using (var pen = new Pen(BRUSH_COLORS[rnd.Next(0, BRUSH_COLORS.Length)])) - graphics.DrawLine(pen, rnd.Next(0, stray_x), i + rnd.Next(-stray_y, stray_y), size.Width - rnd.Next(0, stray_x), i + rnd.Next(-stray_y, stray_y)); - - // Draw the actual answer - graphics.DrawString(answer, font1, font3, ((size.Width - text_width) / 2) + rnd.Next(-ans_stray_x, ans_stray_x), ((size.Height - fontsize) / 2) + rnd.Next(-ans_stray_y, ans_stray_y)); - - return bmp; - } - } - } -} +// Copyright (C) 2016, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Text; + +namespace Duplicati.Server.WebServer +{ + /// + /// Helper class for creating Captcha images + /// + public static class CaptchaUtil + { + /// + /// A lookup string with characters to use + /// + private static readonly string DEFAULT_CHARS = "ACDEFGHJKLMNPQRTUVWXY34679"; + + /// + /// A range of possible brush colors + /// + private static readonly Brush[] BRUSH_COLORS = + typeof(Brushes) + .GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public) + .Where(x => x.PropertyType == typeof(Brush)) + .Select(x => x.GetValue(null, null) as Brush) + .Where(x => x != null) + .ToArray(); + + /// + /// Approximate the size in pixels of text drawn at the given fontsize + /// + private static int ApproxTextWidth(string text, FontFamily fontfamily, int fontsize) + { + using (var font = new Font(fontfamily, fontsize, GraphicsUnit.Pixel)) + using (var graphics = Graphics.FromImage(new Bitmap(1, 1))) { + return (int) graphics.MeasureString(text, font).Width; + } + } + + /// + /// Creates a random answer. + /// + /// The random answer. + /// The list of allowed chars, supply a character multiple times to change frequency. + /// The minimum answer length. + /// The maximum answer length. + public static string CreateRandomAnswer(string allowedchars = null, int minlength = 10, int maxlength = 12) + { + allowedchars = allowedchars ?? DEFAULT_CHARS; + var rnd = new Random(); + var len = rnd.Next(Math.Min(minlength, maxlength), Math.Max(minlength, maxlength) + 1); + if (len <= 0) + throw new ArgumentException($"The values ${minlength} and ${maxlength} gave a final length of {len} and it must be greater than 0"); + + return new string(Enumerable.Range(0, len).Select(x => allowedchars[rnd.Next(0, allowedchars.Length)]).ToArray()); + } + + /// + /// Creates a captcha image. + /// + /// The captcha image. + /// The captcha solution string. + /// The size of the image, omit to get a size based on the string. + /// The size of the font used to create the captcha, in pixels. + public static Bitmap CreateCaptcha(string answer, Size size = default(Size), int fontsize = 40) + { + var fontfamily = FontFamily.GenericSansSerif; + var text_width = ApproxTextWidth(answer, fontfamily, fontsize); + if (size.Width == 0 || size.Height == 0) + size = new Size((int) (text_width * 1.2), (int) (fontsize * 1.2)); + + var bmp = new Bitmap(size.Width, size.Height); + var rnd = new Random(); + var stray_x = fontsize / 2; + var stray_y = size.Height / 4; + var ans_stray_x = fontsize / 3; + var ans_stray_y = size.Height / 6; + using (var graphics = Graphics.FromImage(bmp)) + using (var font1 = new Font(fontfamily, fontsize, GraphicsUnit.Pixel)) + using (var font2 = new Font(fontfamily, fontsize, GraphicsUnit.Pixel)) + using (var font3 = new HatchBrush(HatchStyle.Shingle, Color.GhostWhite, Color.DarkBlue)) + { + graphics.Clear(Color.White); + graphics.TextRenderingHint = TextRenderingHint.AntiAlias; + + // Apply a some background string to make it hard to do OCR + foreach (var color in new[] { Color.Yellow, Color.LightGreen, Color.GreenYellow }) + using (var brush = new SolidBrush(color)) + graphics.DrawString(CreateRandomAnswer(minlength: answer.Length, maxlength: answer.Length), font2, brush, rnd.Next(-stray_x, stray_x), rnd.Next(-stray_y, stray_y)); + + + var spacing = (size.Width / fontsize) + rnd.Next(0, stray_x); + + // Create a vertical background lines + for (var i = rnd.Next(0, stray_x); i < size.Width; i += spacing) + using (var pen = new Pen(BRUSH_COLORS[rnd.Next(0, BRUSH_COLORS.Length)])) + graphics.DrawLine(pen, i + rnd.Next(-stray_x, stray_x), rnd.Next(0, stray_y), i + rnd.Next(-stray_x, stray_x), size.Height - rnd.Next(0, stray_y)); + + spacing = (size.Height / fontsize) + rnd.Next(0, stray_y); + // Create a horizontal background lines + for (var i = rnd.Next(0, stray_y); i < size.Height; i += spacing) + using (var pen = new Pen(BRUSH_COLORS[rnd.Next(0, BRUSH_COLORS.Length)])) + graphics.DrawLine(pen, rnd.Next(0, stray_x), i + rnd.Next(-stray_y, stray_y), size.Width - rnd.Next(0, stray_x), i + rnd.Next(-stray_y, stray_y)); + + // Draw the actual answer + graphics.DrawString(answer, font1, font3, ((size.Width - text_width) / 2) + rnd.Next(-ans_stray_x, ans_stray_x), ((size.Height - fontsize) / 2) + rnd.Next(-ans_stray_y, ans_stray_y)); + + return bmp; + } + } + } +} diff --git a/Duplicati/Server/WebServer/IndexHtmlHandler.cs b/Duplicati.Library.RestAPI/WebServer/IndexHtmlHandler.cs similarity index 97% rename from Duplicati/Server/WebServer/IndexHtmlHandler.cs rename to Duplicati.Library.RestAPI/WebServer/IndexHtmlHandler.cs index 508264719..3032aa355 100644 --- a/Duplicati/Server/WebServer/IndexHtmlHandler.cs +++ b/Duplicati.Library.RestAPI/WebServer/IndexHtmlHandler.cs @@ -1,79 +1,79 @@ -// Copyright (C) 2015, The Duplicati Team - -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Linq; -using HttpServer; -using HttpServer.HttpModules; -using HttpServer.Exceptions; +// Copyright (C) 2015, The Duplicati Team + +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Linq; +using HttpServer; +using HttpServer.HttpModules; +using HttpServer.Exceptions; using Duplicati.Library.Common.IO; -namespace Duplicati.Server.WebServer -{ - internal class IndexHtmlHandler : HttpModule - { - private readonly string m_webroot; - - private static readonly string[] ForbiddenChars = new string[] {"\\", "..", ":"}.Union(from n in System.IO.Path.GetInvalidPathChars() select n.ToString()).Distinct().ToArray(); - private static readonly string DirSep = Util.DirectorySeparatorString; - - public IndexHtmlHandler(string webroot) { m_webroot = webroot; } - - public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - var path = this.GetPath(request.Uri); - var html = System.IO.Path.Combine(path, "index.html"); - var htm = System.IO.Path.Combine(path, "index.htm"); - - if (System.IO.Directory.Exists(path) && (System.IO.File.Exists(html) || System.IO.File.Exists(htm))) - { - if (!request.Uri.AbsolutePath.EndsWith("/", StringComparison.Ordinal)) - { - response.Redirect(request.Uri.AbsolutePath + "/"); - return true; - } - - response.Status = System.Net.HttpStatusCode.OK; - response.Reason = "OK"; - response.ContentType = "text/html; charset=utf-8"; - response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); - - using (var fs = System.IO.File.OpenRead(System.IO.File.Exists(html) ? html : htm)) - { - response.ContentLength = fs.Length; - response.Body = fs; - response.Send(); - } - - return true; - } - - return false; - } - - private string GetPath(Uri uri) - { - if (ForbiddenChars.Any(x => uri.AbsolutePath.Contains(x))) - throw new BadRequestException("Illegal path"); - var uripath = Uri.UnescapeDataString(uri.AbsolutePath); - while(uripath.Length > 0 && (uripath.StartsWith("/", StringComparison.Ordinal) || uripath.StartsWith(DirSep, StringComparison.Ordinal))) - uripath = uripath.Substring(1); - return System.IO.Path.Combine(m_webroot, uripath.Replace('/', System.IO.Path.DirectorySeparatorChar)); - } - } -} - +namespace Duplicati.Server.WebServer +{ + internal class IndexHtmlHandler : HttpModule + { + private readonly string m_webroot; + + private static readonly string[] ForbiddenChars = new string[] {"\\", "..", ":"}.Union(from n in System.IO.Path.GetInvalidPathChars() select n.ToString()).Distinct().ToArray(); + private static readonly string DirSep = Util.DirectorySeparatorString; + + public IndexHtmlHandler(string webroot) { m_webroot = webroot; } + + public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + var path = this.GetPath(request.Uri); + var html = System.IO.Path.Combine(path, "index.html"); + var htm = System.IO.Path.Combine(path, "index.htm"); + + if (System.IO.Directory.Exists(path) && (System.IO.File.Exists(html) || System.IO.File.Exists(htm))) + { + if (!request.Uri.AbsolutePath.EndsWith("/", StringComparison.Ordinal)) + { + response.Redirect(request.Uri.AbsolutePath + "/"); + return true; + } + + response.Status = System.Net.HttpStatusCode.OK; + response.Reason = "OK"; + response.ContentType = "text/html; charset=utf-8"; + response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); + + using (var fs = System.IO.File.OpenRead(System.IO.File.Exists(html) ? html : htm)) + { + response.ContentLength = fs.Length; + response.Body = fs; + response.Send(); + } + + return true; + } + + return false; + } + + private string GetPath(Uri uri) + { + if (ForbiddenChars.Any(x => uri.AbsolutePath.Contains(x))) + throw new BadRequestException("Illegal path"); + var uripath = Uri.UnescapeDataString(uri.AbsolutePath); + while(uripath.Length > 0 && (uripath.StartsWith("/", StringComparison.Ordinal) || uripath.StartsWith(DirSep, StringComparison.Ordinal))) + uripath = uripath.Substring(1); + return System.IO.Path.Combine(m_webroot, uripath.Replace('/', System.IO.Path.DirectorySeparatorChar)); + } + } +} + diff --git a/Duplicati/Server/WebServer/RESTHandler.cs b/Duplicati.Library.RestAPI/WebServer/RESTHandler.cs similarity index 95% rename from Duplicati/Server/WebServer/RESTHandler.cs rename to Duplicati.Library.RestAPI/WebServer/RESTHandler.cs index b09b78378..ea931607d 100644 --- a/Duplicati/Server/WebServer/RESTHandler.cs +++ b/Duplicati.Library.RestAPI/WebServer/RESTHandler.cs @@ -1,258 +1,259 @@ -// Copyright (C) 2015, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using HttpServer.HttpModules; - -using Duplicati.Server.WebServer.RESTMethods; - -namespace Duplicati.Server.WebServer -{ - public class RESTHandler : HttpModule - { - public const string API_URI_PATH = "/api/v1"; - public static readonly int API_URI_SEGMENTS = API_URI_PATH.Split(new char[] {'/'}).Length; - - private static readonly Dictionary _modules = new Dictionary(StringComparer.OrdinalIgnoreCase); - - public static IDictionary Modules { get { return _modules; } } - - /// - /// Loads all REST modules in the Duplicati.Server.WebServer.RESTMethods namespace - /// - static RESTHandler() - { - var lst = - from n in typeof(RESTHandler).Assembly.GetTypes() - where - n.Namespace == typeof(IRESTMethod).Namespace - && - typeof(IRESTMethod).IsAssignableFrom(n) - && - !n.IsAbstract - && - !n.IsInterface - select n; - - foreach(var t in lst) - { - var m = (IRESTMethod)Activator.CreateInstance(t); - _modules.Add(t.Name.ToLowerInvariant(), m); - } - } - - public static void HandleControlCGI(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, Type module) - { - var method = request.Method; - if (!string.IsNullOrWhiteSpace(request.Headers["X-HTTP-Method-Override"])) - method = request.Headers["X-HTTP-Method-Override"]; - - DoProcess(request, response, session, method, module.Name.ToLowerInvariant(), (String.Equals(request.Method, "POST", StringComparison.OrdinalIgnoreCase) ? request.Form : request.QueryString)["id"].Value); - } - - private static readonly ConcurrentDictionary _cultureCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - - private static System.Globalization.CultureInfo ParseRequestCulture(RequestInfo info) - { - // Inject the override - return ParseRequestCulture(string.Format("{0},{1}", info.Request.Headers["X-UI-Language"], info.Request.Headers["Accept-Language"])); - } - - public static System.Globalization.CultureInfo ParseDefaultRequestCulture(RequestInfo info) - { - if (info == null) - return null; - return ParseRequestCulture(info.Request.Headers["Accept-Language"]); - } - - private static System.Globalization.CultureInfo ParseRequestCulture(string acceptheader) - { - acceptheader = acceptheader ?? string.Empty; - - // Lock-free read - System.Globalization.CultureInfo ci; - if (_cultureCache.TryGetValue(acceptheader, out ci)) - return ci; - - // Lock-free assignment, we might compute the value twice - return _cultureCache[acceptheader] = - // Parse headers like "Accept-Language: da, en-gb;q=0.8, en;q=0.7" - acceptheader - .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) - .Select(x => - { - var opts = x.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); - var lang = opts.FirstOrDefault(); - var weight = - opts.Where(y => y.StartsWith("q=", StringComparison.OrdinalIgnoreCase)) - .Select(y => - { - float f; - float.TryParse(y.Substring(2), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out f); - return f; - }).FirstOrDefault(); - - // Set the default weight=1 - if (weight <= 0.001 && weight >= 0) - weight = 1; - - return new KeyValuePair(lang, weight); - }) - // Handle priority - .OrderByDescending(x => x.Value) - .Select(x => x.Key) - .Distinct() - // Filter invalid/unsupported items - .Where(x => !string.IsNullOrWhiteSpace(x) && Library.Localization.LocalizationService.ParseCulture(x) != null) - .Select(x => Library.Localization.LocalizationService.ParseCulture(x)) - // And get the first that works - .FirstOrDefault(); - - } - - public static void DoProcess(RequestInfo info, string method, string module, string key) - { - var ci = ParseRequestCulture(info); - - using (Library.Localization.LocalizationService.TemporaryContext(ci)) - { - try - { - if (ci != null) - info.Response.AddHeader("Content-Language", ci.Name); - - IRESTMethod mod; - _modules.TryGetValue(module, out mod); - - if (mod == null) - { - info.Response.Status = System.Net.HttpStatusCode.NotFound; - info.Response.Reason = "No such module"; - } - else if (method == HttpServer.Method.Get && mod is IRESTMethodGET get) - { - if (info.Request.Form != HttpServer.HttpForm.EmptyForm) - { - if (info.Request.QueryString == HttpServer.HttpInput.Empty) - { - var r = info.Request.GetType().GetField("_queryString", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - r.SetValue(info.Request, new HttpServer.HttpInput("formdata")); - } - - foreach (HttpServer.HttpInputItem v in info.Request.Form) - if (!info.Request.QueryString.Contains(v.Name)) - info.Request.QueryString.Add(v.Name, v.Value); - } - - get.GET(key, info); - } - else if (method == HttpServer.Method.Put && mod is IRESTMethodPUT put) - put.PUT(key, info); - else if (method == HttpServer.Method.Post && mod is IRESTMethodPOST post) - { - if (info.Request.Form == HttpServer.HttpForm.EmptyForm || info.Request.Form == HttpServer.HttpInput.Empty) - { - var r = info.Request.GetType().GetMethod("AssignForm", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, new Type[] {typeof(HttpServer.HttpForm)}, null); - r.Invoke(info.Request, new object[] {new HttpServer.HttpForm(info.Request.QueryString)}); - } - else - { - foreach (HttpServer.HttpInputItem v in info.Request.QueryString) - if (!info.Request.Form.Contains(v.Name)) - info.Request.Form.Add(v.Name, v.Value); - } - - post.POST(key, info); - } - else if (method == HttpServer.Method.Delete && mod is IRESTMethodDELETE delete) - delete.DELETE(key, info); - else if (method == "PATCH" && mod is IRESTMethodPATCH patch) - patch.PATCH(key, info); - else - { - info.Response.Status = System.Net.HttpStatusCode.MethodNotAllowed; - info.Response.Reason = "Method is not allowed"; - } - } - catch (Exception ex) - { - Program.DataConnection.LogError("", string.Format("Request for {0} gave error", info.Request.Uri), ex); - Console.WriteLine(ex); - - try - { - if (!info.Response.HeadersSent) - { - info.Response.Status = System.Net.HttpStatusCode.InternalServerError; - info.Response.Reason = "Error"; - info.Response.ContentType = "text/plain"; - - var wex = ex; - while (wex is System.Reflection.TargetInvocationException && wex.InnerException != wex) - wex = wex.InnerException; - - info.BodyWriter.WriteJsonObject(new - { - Message = wex.Message, - Type = wex.GetType().Name, -#if DEBUG - Stacktrace = wex.ToString() -#endif - }); - info.BodyWriter.Flush(); - } - } - catch (Exception flex) - { - Program.DataConnection.LogError("", "Reporting error gave error", flex); - } - } - } - } - - public static void DoProcess(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, string method, string module, string key) - { - using(var reqinfo = new RequestInfo(request, response, session)) - DoProcess(reqinfo, method, module, key); - } - - public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - if (!request.Uri.AbsolutePath.StartsWith(API_URI_PATH, StringComparison.OrdinalIgnoreCase)) - return false; - - var module = request.Uri.Segments.Skip(API_URI_SEGMENTS).FirstOrDefault(); - if (string.IsNullOrWhiteSpace(module)) - module = "help"; - - module = module.Trim('/'); - - var key = string.Join("", request.Uri.Segments.Skip(API_URI_SEGMENTS + 1)).Trim('/'); - - var method = request.Method; - if (!string.IsNullOrWhiteSpace(request.Headers["X-HTTP-Method-Override"])) - method = request.Headers["X-HTTP-Method-Override"]; - - DoProcess(request, response, session, method, module, key); - - return true; - } - } -} - +// Copyright (C) 2015, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using HttpServer.HttpModules; + +using Duplicati.Server.WebServer.RESTMethods; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer +{ + public class RESTHandler : HttpModule + { + public const string API_URI_PATH = "/api/v1"; + public static readonly int API_URI_SEGMENTS = API_URI_PATH.Split(new char[] {'/'}).Length; + + private static readonly Dictionary _modules = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public static IDictionary Modules { get { return _modules; } } + + /// + /// Loads all REST modules in the Duplicati.Server.WebServer.RESTMethods namespace + /// + static RESTHandler() + { + var lst = + from n in typeof(IRESTMethod).Assembly.GetTypes() + where + n.Namespace == typeof(IRESTMethod).Namespace + && + typeof(IRESTMethod).IsAssignableFrom(n) + && + !n.IsAbstract + && + !n.IsInterface + select n; + + foreach(var t in lst) + { + var m = (IRESTMethod)Activator.CreateInstance(t); + _modules.Add(t.Name.ToLowerInvariant(), m); + } + } + + public static void HandleControlCGI(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, Type module) + { + var method = request.Method; + if (!string.IsNullOrWhiteSpace(request.Headers["X-HTTP-Method-Override"])) + method = request.Headers["X-HTTP-Method-Override"]; + + DoProcess(request, response, session, method, module.Name.ToLowerInvariant(), (String.Equals(request.Method, "POST", StringComparison.OrdinalIgnoreCase) ? request.Form : request.QueryString)["id"].Value); + } + + private static readonly ConcurrentDictionary _cultureCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + + private static System.Globalization.CultureInfo ParseRequestCulture(RequestInfo info) + { + // Inject the override + return ParseRequestCulture(string.Format("{0},{1}", info.Request.Headers["X-UI-Language"], info.Request.Headers["Accept-Language"])); + } + + public static System.Globalization.CultureInfo ParseDefaultRequestCulture(RequestInfo info) + { + if (info == null) + return null; + return ParseRequestCulture(info.Request.Headers["Accept-Language"]); + } + + private static System.Globalization.CultureInfo ParseRequestCulture(string acceptheader) + { + acceptheader = acceptheader ?? string.Empty; + + // Lock-free read + System.Globalization.CultureInfo ci; + if (_cultureCache.TryGetValue(acceptheader, out ci)) + return ci; + + // Lock-free assignment, we might compute the value twice + return _cultureCache[acceptheader] = + // Parse headers like "Accept-Language: da, en-gb;q=0.8, en;q=0.7" + acceptheader + .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) + .Select(x => + { + var opts = x.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + var lang = opts.FirstOrDefault(); + var weight = + opts.Where(y => y.StartsWith("q=", StringComparison.OrdinalIgnoreCase)) + .Select(y => + { + float f; + float.TryParse(y.Substring(2), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out f); + return f; + }).FirstOrDefault(); + + // Set the default weight=1 + if (weight <= 0.001 && weight >= 0) + weight = 1; + + return new KeyValuePair(lang, weight); + }) + // Handle priority + .OrderByDescending(x => x.Value) + .Select(x => x.Key) + .Distinct() + // Filter invalid/unsupported items + .Where(x => !string.IsNullOrWhiteSpace(x) && Library.Localization.LocalizationService.ParseCulture(x) != null) + .Select(x => Library.Localization.LocalizationService.ParseCulture(x)) + // And get the first that works + .FirstOrDefault(); + + } + + public static void DoProcess(RequestInfo info, string method, string module, string key) + { + var ci = ParseRequestCulture(info); + + using (Library.Localization.LocalizationService.TemporaryContext(ci)) + { + try + { + if (ci != null) + info.Response.AddHeader("Content-Language", ci.Name); + + IRESTMethod mod; + _modules.TryGetValue(module, out mod); + + if (mod == null) + { + info.Response.Status = System.Net.HttpStatusCode.NotFound; + info.Response.Reason = "No such module"; + } + else if (method == HttpServer.Method.Get && mod is IRESTMethodGET get) + { + if (info.Request.Form != HttpServer.HttpForm.EmptyForm) + { + if (info.Request.QueryString == HttpServer.HttpInput.Empty) + { + var r = info.Request.GetType().GetField("_queryString", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + r.SetValue(info.Request, new HttpServer.HttpInput("formdata")); + } + + foreach (HttpServer.HttpInputItem v in info.Request.Form) + if (!info.Request.QueryString.Contains(v.Name)) + info.Request.QueryString.Add(v.Name, v.Value); + } + + get.GET(key, info); + } + else if (method == HttpServer.Method.Put && mod is IRESTMethodPUT put) + put.PUT(key, info); + else if (method == HttpServer.Method.Post && mod is IRESTMethodPOST post) + { + if (info.Request.Form == HttpServer.HttpForm.EmptyForm || info.Request.Form == HttpServer.HttpInput.Empty) + { + var r = info.Request.GetType().GetMethod("AssignForm", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, new Type[] {typeof(HttpServer.HttpForm)}, null); + r.Invoke(info.Request, new object[] {new HttpServer.HttpForm(info.Request.QueryString)}); + } + else + { + foreach (HttpServer.HttpInputItem v in info.Request.QueryString) + if (!info.Request.Form.Contains(v.Name)) + info.Request.Form.Add(v.Name, v.Value); + } + + post.POST(key, info); + } + else if (method == HttpServer.Method.Delete && mod is IRESTMethodDELETE delete) + delete.DELETE(key, info); + else if (method == "PATCH" && mod is IRESTMethodPATCH patch) + patch.PATCH(key, info); + else + { + info.Response.Status = System.Net.HttpStatusCode.MethodNotAllowed; + info.Response.Reason = "Method is not allowed"; + } + } + catch (Exception ex) + { + FIXMEGlobal.DataConnection.LogError("", string.Format("Request for {0} gave error", info.Request.Uri), ex); + Console.WriteLine(ex); + + try + { + if (!info.Response.HeadersSent) + { + info.Response.Status = System.Net.HttpStatusCode.InternalServerError; + info.Response.Reason = "Error"; + info.Response.ContentType = "text/plain"; + + var wex = ex; + while (wex is System.Reflection.TargetInvocationException && wex.InnerException != wex) + wex = wex.InnerException; + + info.BodyWriter.WriteJsonObject(new + { + Message = wex.Message, + Type = wex.GetType().Name, +#if DEBUG + Stacktrace = wex.ToString() +#endif + }); + info.BodyWriter.Flush(); + } + } + catch (Exception flex) + { + FIXMEGlobal.DataConnection.LogError("", "Reporting error gave error", flex); + } + } + } + } + + public static void DoProcess(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, string method, string module, string key) + { + using(var reqinfo = new RequestInfo(request, response, session)) + DoProcess(reqinfo, method, module, key); + } + + public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + if (!request.Uri.AbsolutePath.StartsWith(API_URI_PATH, StringComparison.OrdinalIgnoreCase)) + return false; + + var module = request.Uri.Segments.Skip(API_URI_SEGMENTS).FirstOrDefault(); + if (string.IsNullOrWhiteSpace(module)) + module = "help"; + + module = module.Trim('/'); + + var key = string.Join("", request.Uri.Segments.Skip(API_URI_SEGMENTS + 1)).Trim('/'); + + var method = request.Method; + if (!string.IsNullOrWhiteSpace(request.Headers["X-HTTP-Method-Override"])) + method = request.Headers["X-HTTP-Method-Override"]; + + DoProcess(request, response, session, method, module, key); + + return true; + } + } +} + diff --git a/Duplicati/Server/WebServer/Server.cs b/Duplicati.Library.RestAPI/WebServer/Server.cs similarity index 93% rename from Duplicati/Server/WebServer/Server.cs rename to Duplicati.Library.RestAPI/WebServer/Server.cs index e9d5396e5..6ea669629 100644 --- a/Duplicati/Server/WebServer/Server.cs +++ b/Duplicati.Library.RestAPI/WebServer/Server.cs @@ -1,454 +1,455 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using HttpServer.HttpModules; -using System.Security.Cryptography.X509Certificates; -using Duplicati.Library.Common.IO; - -namespace Duplicati.Server.WebServer -{ - public class Server - { - /// - /// The tag used for logging - /// - private static readonly string LOGTAG = Duplicati.Library.Logging.Log.LogTagFromType(); - - /// - /// Option for changing the webroot folder - /// - public const string OPTION_WEBROOT = "webservice-webroot"; - - /// - /// Option for changing the webservice listen port - /// - public const string OPTION_PORT = "webservice-port"; - - /// - /// Option for changing the webservice listen interface - /// - public const string OPTION_INTERFACE = "webservice-interface"; - - /// - /// The default path to the web root - /// - public const string DEFAULT_OPTION_WEBROOT = "webroot"; - - /// - /// The default listening port - /// - public const int DEFAULT_OPTION_PORT = 8200; - - /// - /// Option for setting the webservice SSL certificate - /// - public const string OPTION_SSLCERTIFICATEFILE = "webservice-sslcertificatefile"; - - /// - /// Option for setting the webservice SSL certificate key - /// - public const string OPTION_SSLCERTIFICATEFILEPASSWORD = "webservice-sslcertificatepassword"; - - /// - /// The default listening interface - /// - public const string DEFAULT_OPTION_INTERFACE = "loopback"; - - /// - /// The single webserver instance - /// - private readonly HttpServer.HttpServer m_server; - - /// - /// The webserver listening port - /// - public readonly int Port; - - /// - /// A string that is sent out instead of password values - /// - public const string PASSWORD_PLACEHOLDER = "**********"; - - /// - /// Sets up the webserver and starts it - /// - /// A set of options - public Server(IDictionary options) - { - string portstring; - IEnumerable ports = null; - options.TryGetValue(OPTION_PORT, out portstring); - if (!string.IsNullOrEmpty(portstring)) - ports = - from n in portstring.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) - where int.TryParse(n, out _) - select int.Parse(n); - - if (ports == null || !ports.Any()) - ports = new int[] { DEFAULT_OPTION_PORT }; - - string interfacestring; - System.Net.IPAddress listenInterface; - options.TryGetValue(OPTION_INTERFACE, out interfacestring); - - if (string.IsNullOrWhiteSpace(interfacestring)) - interfacestring = Program.DataConnection.ApplicationSettings.ServerListenInterface; - if (string.IsNullOrWhiteSpace(interfacestring)) - interfacestring = DEFAULT_OPTION_INTERFACE; - - if (interfacestring.Trim() == "*" || interfacestring.Trim().Equals("any", StringComparison.OrdinalIgnoreCase) || interfacestring.Trim().Equals("all", StringComparison.OrdinalIgnoreCase)) - listenInterface = System.Net.IPAddress.Any; - else if (interfacestring.Trim() == "loopback") - listenInterface = System.Net.IPAddress.Loopback; - else - listenInterface = System.Net.IPAddress.Parse(interfacestring); - - string certificateFile; - options.TryGetValue(OPTION_SSLCERTIFICATEFILE, out certificateFile); - - string certificateFilePassword; - options.TryGetValue(OPTION_SSLCERTIFICATEFILEPASSWORD, out certificateFilePassword); - - X509Certificate2 cert = null; - bool certValid = false; - - if (certificateFile == null) - { - try - { - cert = Program.DataConnection.ApplicationSettings.ServerSSLCertificate; - - if (cert != null) - certValid = cert.HasPrivateKey; - } - catch (Exception ex) - { - Duplicati.Library.Logging.Log.WriteWarningMessage(LOGTAG, "DefectStoredSSLCert", ex, Strings.Server.DefectSSLCertInDatabase); - } - } - else if (certificateFile.Length == 0) - { - Program.DataConnection.ApplicationSettings.ServerSSLCertificate = null; - } - else - { - try - { - if (string.IsNullOrWhiteSpace(certificateFilePassword)) - cert = new X509Certificate2(certificateFile, "", X509KeyStorageFlags.Exportable); - else - cert = new X509Certificate2(certificateFile, certificateFilePassword, X509KeyStorageFlags.Exportable); - - certValid = cert.HasPrivateKey; - } - catch (Exception ex) - { - throw new Exception(Strings.Server.SSLCertificateFailure(ex.Message), ex); - } - } - - // If we are in hosted mode with no specified port, - // then try different ports - foreach (var p in ports) - try - { - // Due to the way the server is initialized, - // we cannot try to start it again on another port, - // so we create a new server for each attempt - - var server = CreateServer(options); - - if (!certValid) - server.Start(listenInterface, p); - else - { - var secProtocols = System.Security.Authentication.SslProtocols.Tls12; - - try - { - //try TLS 1.3 (type not available on .NET < 4.8) - secProtocols = System.Security.Authentication.SslProtocols.Tls12 | (System.Security.Authentication.SslProtocols)12288; - } - catch (NotSupportedException) - { - } - server.Start(listenInterface, p, cert, secProtocols, null, false); - } - - m_server = server; - m_server.ServerName = string.Format("{0} v{1}", Library.AutoUpdater.AutoUpdateSettings.AppName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); - this.Port = p; - - if (interfacestring != Program.DataConnection.ApplicationSettings.ServerListenInterface) - Program.DataConnection.ApplicationSettings.ServerListenInterface = interfacestring; - - if (certValid && !cert.Equals(Program.DataConnection.ApplicationSettings.ServerSSLCertificate)) - Program.DataConnection.ApplicationSettings.ServerSSLCertificate = cert; - - Duplicati.Library.Logging.Log.WriteInformationMessage(LOGTAG, "ServerListening", Strings.Server.StartedServer(listenInterface.ToString(), p)); - - return; - } - catch (System.Net.Sockets.SocketException) - { - } - - throw new Exception(Strings.Server.ServerStartFailure(ports)); - } - - private static void AddMimeTypes(FileModule fm) - { - fm.AddDefaultMimeTypes(); - fm.MimeTypes["htc"] = "text/x-component"; - fm.MimeTypes["json"] = "application/json"; - fm.MimeTypes["map"] = "application/json"; - fm.MimeTypes["htm"] = "text/html; charset=utf-8"; - fm.MimeTypes["html"] = "text/html; charset=utf-8"; - fm.MimeTypes["hbs"] = "application/x-handlebars-template"; - fm.MimeTypes["woff"] = "application/font-woff"; - fm.MimeTypes["woff2"] = "application/font-woff"; - } - - private static HttpServer.HttpServer CreateServer(IDictionary options) - { - HttpServer.HttpServer server = new HttpServer.HttpServer(); - - server.Add(new HostHeaderChecker()); - - if (string.Equals(Environment.GetEnvironmentVariable("SYNO_DSM_AUTH") ?? string.Empty, "1")) - server.Add(new SynologyAuthenticationHandler()); - - server.Add(new AuthenticationHandler()); - - server.Add(new RESTHandler()); - - string webroot = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); - string install_webroot = System.IO.Path.Combine(Library.AutoUpdater.UpdaterManager.InstalledBaseDir, "webroot"); - -#if DEBUG - // Easy test for extensions while debugging - install_webroot = Library.AutoUpdater.UpdaterManager.InstalledBaseDir; - - if (!System.IO.Directory.Exists(System.IO.Path.Combine(webroot, "webroot"))) - { - //For debug we go "../../../.." to get out of "GUI/Duplicati.GUI.TrayIcon/bin/debug" - string tmpwebroot = System.IO.Path.GetFullPath(System.IO.Path.Combine(webroot, "..", "..", "..", "..")); - tmpwebroot = System.IO.Path.Combine(tmpwebroot, "Server"); - if (System.IO.Directory.Exists(System.IO.Path.Combine(tmpwebroot, "webroot"))) - webroot = tmpwebroot; - else - { - //If we are running the server standalone, we only need to exit "bin/Debug" - tmpwebroot = System.IO.Path.GetFullPath(System.IO.Path.Combine(webroot, "..", "..")); - if (System.IO.Directory.Exists(System.IO.Path.Combine(tmpwebroot, "webroot"))) - webroot = tmpwebroot; - } - } -#endif - - webroot = System.IO.Path.Combine(webroot, "webroot"); - - if (options.ContainsKey(OPTION_WEBROOT)) - { - string userroot = options[OPTION_WEBROOT]; -#if DEBUG - //In debug mode we do not care where the path points -#else - //In release mode we check that the user supplied path is located - // in the same folders as the running application, to avoid users - // that inadvertently expose top level folders - if (!string.IsNullOrWhiteSpace(userroot) - && - ( - userroot.StartsWith(Util.AppendDirSeparator(System.Reflection.Assembly.GetExecutingAssembly().Location), Library.Utility.Utility.ClientFilenameStringComparison) - || - userroot.StartsWith(Util.AppendDirSeparator(Program.StartupPath), Library.Utility.Utility.ClientFilenameStringComparison) - ) - ) -#endif - { - webroot = userroot; - install_webroot = webroot; - } - } - - if (install_webroot != webroot && System.IO.Directory.Exists(System.IO.Path.Combine(install_webroot, "customized"))) - { - var customized_files = new CacheControlFileHandler("/customized/", System.IO.Path.Combine(install_webroot, "customized")); - AddMimeTypes(customized_files); - server.Add(customized_files); - } - - if (install_webroot != webroot && System.IO.Directory.Exists(System.IO.Path.Combine(install_webroot, "oem"))) - { - var oem_files = new CacheControlFileHandler("/oem/", System.IO.Path.Combine(install_webroot, "oem")); - AddMimeTypes(oem_files); - server.Add(oem_files); - } - - if (install_webroot != webroot && System.IO.Directory.Exists(System.IO.Path.Combine(install_webroot, "package"))) - { - var proxy_files = new CacheControlFileHandler("/proxy/", System.IO.Path.Combine(install_webroot, "package")); - AddMimeTypes(proxy_files); - server.Add(proxy_files); - } - - var fh = new CacheControlFileHandler("/", webroot, true); - AddMimeTypes(fh); - server.Add(fh); - - server.Add(new IndexHtmlHandler(webroot)); -#if DEBUG - //For debugging, it is nice to know when we get a 404 - server.Add(new DebugReportHandler()); -#endif - return server; - } - - private class DebugReportHandler : HttpModule - { - public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - System.Diagnostics.Trace.WriteLine(string.Format("Rejecting request for {0}", request.Uri)); - return false; - } - } - - private class CacheControlFileHandler : FileModule - { - public CacheControlFileHandler(string baseUri, string basePath, bool useLastModifiedHeader = false) - : base(baseUri, basePath, useLastModifiedHeader) - { - - } - - public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - if (!this.CanHandle(request.Uri)) - return false; - - if (request.Uri.AbsolutePath.EndsWith("index.html", StringComparison.Ordinal) || request.Uri.AbsolutePath.EndsWith("index.htm", StringComparison.Ordinal)) - response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); - else - response.AddHeader("Cache-Control", "max-age=" + (60 * 60 * 24)); - return base.Process(request, response, session); - } - } - - /// - /// Module for injecting host header verification - /// - private class HostHeaderChecker : HttpModule - { - /// - /// The hostnames that we allow - /// - private string[] m_lastSplitNames; - - /// - /// The string used to generate m_lastSplitNames; - /// - private string m_lastAllowed; - - /// - /// A regex to detect potential IPv4 addresses. - /// Note that this also detects things that are not valid IPv4. - /// - private static readonly System.Text.RegularExpressions.Regex IPV4 = new System.Text.RegularExpressions.Regex(@"((\d){1,3}\.){3}(\d){1,3}"); - /// - /// A regex to detect potential IPv6 addresses. - /// Note that this also detects things that are not valid IPv6. - /// - private static readonly System.Text.RegularExpressions.Regex IPV6 = new System.Text.RegularExpressions.Regex(@"(\:)?(\:?[A-Fa-f0-9]{1,4}\:?){1,8}(\:)?"); - - /// - /// The hostnames that are always allowed - /// - private static readonly string[] DEFAULT_ALLOWED = new string[] { "localhost", "127.0.0.1", "::1", "localhost.localdomain" }; - - /// - /// Process the received request - /// - /// A flag indicating if the request is handled. - /// The received request. - /// The response object. - /// The session state. - public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - string[] h = null; - var hstring = Program.DataConnection.ApplicationSettings.AllowedHostnames; - - if (!string.IsNullOrWhiteSpace(hstring)) - { - h = m_lastSplitNames; - if (hstring != m_lastAllowed) - { - m_lastAllowed = hstring; - h = m_lastSplitNames = (hstring ?? string.Empty).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - } - - if (h == null || h.Length == 0) - h = null; - } - - // For some reason, the web server strips out the host header - var host = request.Headers["Host"]; - if (string.IsNullOrWhiteSpace(host)) - host = request.Uri.Host; - - // This should not happen - if (string.IsNullOrWhiteSpace(host)) - { - response.Reason = "Invalid request, missing host header"; - response.Status = System.Net.HttpStatusCode.Forbidden; - var msg = System.Text.Encoding.ASCII.GetBytes(response.Reason); - response.ContentType = "text/plain"; - response.ContentLength = msg.Length; - response.Body.Write(msg, 0, msg.Length); - response.Send(); - return true; - } - - // Check the hostnames we always allow - if (DEFAULT_ALLOWED.Contains(host, StringComparer.OrdinalIgnoreCase)) - return false; - - // Then the user specified ones - if (h != null && h.Contains(host, StringComparer.OrdinalIgnoreCase)) - return false; - - // Disable checks if we have an asterisk - if (h != null && Array.IndexOf(h, "*") >= 0) - return false; - - // Finally, check if we have a potential IP address - var v4 = IPV4.Match(host); - var v6 = IPV6.Match(host); - - if ((v4.Success && v4.Length == host.Length) || (v6.Success && v6.Length == host.Length)) - { - try - { - // Verify that the hostname is indeed a valid IP address - System.Net.IPAddress.Parse(host); - return false; - } - catch - { } - } - - // Failed to find a valid header - response.Reason = $"The host header sent by the client is not allowed"; - response.Status = System.Net.HttpStatusCode.Forbidden; - var txt = System.Text.Encoding.ASCII.GetBytes(response.Reason); - response.ContentType = "text/plain"; - response.ContentLength = txt.Length; - response.Body.Write(txt, 0, txt.Length); - response.Send(); - return true; - - } - } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using HttpServer.HttpModules; +using System.Security.Cryptography.X509Certificates; +using Duplicati.Library.Common.IO; +using Duplicati.Library.RestAPI; + +namespace Duplicati.Server.WebServer +{ + public class Server + { + /// + /// The tag used for logging + /// + private static readonly string LOGTAG = Duplicati.Library.Logging.Log.LogTagFromType(); + + /// + /// Option for changing the webroot folder + /// + public const string OPTION_WEBROOT = "webservice-webroot"; + + /// + /// Option for changing the webservice listen port + /// + public const string OPTION_PORT = "webservice-port"; + + /// + /// Option for changing the webservice listen interface + /// + public const string OPTION_INTERFACE = "webservice-interface"; + + /// + /// The default path to the web root + /// + public const string DEFAULT_OPTION_WEBROOT = "webroot"; + + /// + /// The default listening port + /// + public const int DEFAULT_OPTION_PORT = 8200; + + /// + /// Option for setting the webservice SSL certificate + /// + public const string OPTION_SSLCERTIFICATEFILE = "webservice-sslcertificatefile"; + + /// + /// Option for setting the webservice SSL certificate key + /// + public const string OPTION_SSLCERTIFICATEFILEPASSWORD = "webservice-sslcertificatepassword"; + + /// + /// The default listening interface + /// + public const string DEFAULT_OPTION_INTERFACE = "loopback"; + + /// + /// The single webserver instance + /// + private readonly HttpServer.HttpServer m_server; + + /// + /// The webserver listening port + /// + public readonly int Port; + + /// + /// A string that is sent out instead of password values + /// + public const string PASSWORD_PLACEHOLDER = "**********"; + + /// + /// Sets up the webserver and starts it + /// + /// A set of options + public Server(IDictionary options) + { + string portstring; + IEnumerable ports = null; + options.TryGetValue(OPTION_PORT, out portstring); + if (!string.IsNullOrEmpty(portstring)) + ports = + from n in portstring.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + where int.TryParse(n, out _) + select int.Parse(n); + + if (ports == null || !ports.Any()) + ports = new int[] { DEFAULT_OPTION_PORT }; + + string interfacestring; + System.Net.IPAddress listenInterface; + options.TryGetValue(OPTION_INTERFACE, out interfacestring); + + if (string.IsNullOrWhiteSpace(interfacestring)) + interfacestring = FIXMEGlobal.DataConnection.ApplicationSettings.ServerListenInterface; + if (string.IsNullOrWhiteSpace(interfacestring)) + interfacestring = DEFAULT_OPTION_INTERFACE; + + if (interfacestring.Trim() == "*" || interfacestring.Trim().Equals("any", StringComparison.OrdinalIgnoreCase) || interfacestring.Trim().Equals("all", StringComparison.OrdinalIgnoreCase)) + listenInterface = System.Net.IPAddress.Any; + else if (interfacestring.Trim() == "loopback") + listenInterface = System.Net.IPAddress.Loopback; + else + listenInterface = System.Net.IPAddress.Parse(interfacestring); + + string certificateFile; + options.TryGetValue(OPTION_SSLCERTIFICATEFILE, out certificateFile); + + string certificateFilePassword; + options.TryGetValue(OPTION_SSLCERTIFICATEFILEPASSWORD, out certificateFilePassword); + + X509Certificate2 cert = null; + bool certValid = false; + + if (certificateFile == null) + { + try + { + cert = FIXMEGlobal.DataConnection.ApplicationSettings.ServerSSLCertificate; + + if (cert != null) + certValid = cert.HasPrivateKey; + } + catch (Exception ex) + { + Duplicati.Library.Logging.Log.WriteWarningMessage(LOGTAG, "DefectStoredSSLCert", ex, Strings.Server.DefectSSLCertInDatabase); + } + } + else if (certificateFile.Length == 0) + { + FIXMEGlobal.DataConnection.ApplicationSettings.ServerSSLCertificate = null; + } + else + { + try + { + if (string.IsNullOrWhiteSpace(certificateFilePassword)) + cert = new X509Certificate2(certificateFile, "", X509KeyStorageFlags.Exportable); + else + cert = new X509Certificate2(certificateFile, certificateFilePassword, X509KeyStorageFlags.Exportable); + + certValid = cert.HasPrivateKey; + } + catch (Exception ex) + { + throw new Exception(Strings.Server.SSLCertificateFailure(ex.Message), ex); + } + } + + // If we are in hosted mode with no specified port, + // then try different ports + foreach (var p in ports) + try + { + // Due to the way the server is initialized, + // we cannot try to start it again on another port, + // so we create a new server for each attempt + + var server = CreateServer(options); + + if (!certValid) + server.Start(listenInterface, p); + else + { + var secProtocols = System.Security.Authentication.SslProtocols.Tls12; + + try + { + //try TLS 1.3 (type not available on .NET < 4.8) + secProtocols = System.Security.Authentication.SslProtocols.Tls12 | (System.Security.Authentication.SslProtocols)12288; + } + catch (NotSupportedException) + { + } + server.Start(listenInterface, p, cert, secProtocols, null, false); + } + + m_server = server; + m_server.ServerName = string.Format("{0} v{1}", Library.AutoUpdater.AutoUpdateSettings.AppName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); + this.Port = p; + + if (interfacestring != FIXMEGlobal.DataConnection.ApplicationSettings.ServerListenInterface) + FIXMEGlobal.DataConnection.ApplicationSettings.ServerListenInterface = interfacestring; + + if (certValid && !cert.Equals(FIXMEGlobal.DataConnection.ApplicationSettings.ServerSSLCertificate)) + FIXMEGlobal.DataConnection.ApplicationSettings.ServerSSLCertificate = cert; + + Duplicati.Library.Logging.Log.WriteInformationMessage(LOGTAG, "ServerListening", Strings.Server.StartedServer(listenInterface.ToString(), p)); + + return; + } + catch (System.Net.Sockets.SocketException) + { + } + + throw new Exception(Strings.Server.ServerStartFailure(ports)); + } + + private static void AddMimeTypes(FileModule fm) + { + fm.AddDefaultMimeTypes(); + fm.MimeTypes["htc"] = "text/x-component"; + fm.MimeTypes["json"] = "application/json"; + fm.MimeTypes["map"] = "application/json"; + fm.MimeTypes["htm"] = "text/html; charset=utf-8"; + fm.MimeTypes["html"] = "text/html; charset=utf-8"; + fm.MimeTypes["hbs"] = "application/x-handlebars-template"; + fm.MimeTypes["woff"] = "application/font-woff"; + fm.MimeTypes["woff2"] = "application/font-woff"; + } + + private static HttpServer.HttpServer CreateServer(IDictionary options) + { + HttpServer.HttpServer server = new HttpServer.HttpServer(); + + server.Add(new HostHeaderChecker()); + + if (string.Equals(Environment.GetEnvironmentVariable("SYNO_DSM_AUTH") ?? string.Empty, "1")) + server.Add(new SynologyAuthenticationHandler()); + + server.Add(new AuthenticationHandler()); + + server.Add(new RESTHandler()); + + string webroot = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + string install_webroot = System.IO.Path.Combine(Library.AutoUpdater.UpdaterManager.InstalledBaseDir, "webroot"); + +#if DEBUG + // Easy test for extensions while debugging + install_webroot = Library.AutoUpdater.UpdaterManager.InstalledBaseDir; + + if (!System.IO.Directory.Exists(System.IO.Path.Combine(webroot, "webroot"))) + { + //For debug we go "../../../.." to get out of "GUI/Duplicati.GUI.TrayIcon/bin/debug" + string tmpwebroot = System.IO.Path.GetFullPath(System.IO.Path.Combine(webroot, "..", "..", "..", "..")); + tmpwebroot = System.IO.Path.Combine(tmpwebroot, "Server"); + if (System.IO.Directory.Exists(System.IO.Path.Combine(tmpwebroot, "webroot"))) + webroot = tmpwebroot; + else + { + //If we are running the server standalone, we only need to exit "bin/Debug" + tmpwebroot = System.IO.Path.GetFullPath(System.IO.Path.Combine(webroot, "..", "..")); + if (System.IO.Directory.Exists(System.IO.Path.Combine(tmpwebroot, "webroot"))) + webroot = tmpwebroot; + } + } +#endif + + webroot = System.IO.Path.Combine(webroot, "webroot"); + + if (options.ContainsKey(OPTION_WEBROOT)) + { + string userroot = options[OPTION_WEBROOT]; +#if DEBUG + //In debug mode we do not care where the path points +#else + //In release mode we check that the user supplied path is located + // in the same folders as the running application, to avoid users + // that inadvertently expose top level folders + if (!string.IsNullOrWhiteSpace(userroot) + && + ( + userroot.StartsWith(Util.AppendDirSeparator(System.Reflection.Assembly.GetExecutingAssembly().Location), Library.Utility.Utility.ClientFilenameStringComparison) + || + userroot.StartsWith(Util.AppendDirSeparator(Program.StartupPath), Library.Utility.Utility.ClientFilenameStringComparison) + ) + ) +#endif + { + webroot = userroot; + install_webroot = webroot; + } + } + + if (install_webroot != webroot && System.IO.Directory.Exists(System.IO.Path.Combine(install_webroot, "customized"))) + { + var customized_files = new CacheControlFileHandler("/customized/", System.IO.Path.Combine(install_webroot, "customized")); + AddMimeTypes(customized_files); + server.Add(customized_files); + } + + if (install_webroot != webroot && System.IO.Directory.Exists(System.IO.Path.Combine(install_webroot, "oem"))) + { + var oem_files = new CacheControlFileHandler("/oem/", System.IO.Path.Combine(install_webroot, "oem")); + AddMimeTypes(oem_files); + server.Add(oem_files); + } + + if (install_webroot != webroot && System.IO.Directory.Exists(System.IO.Path.Combine(install_webroot, "package"))) + { + var proxy_files = new CacheControlFileHandler("/proxy/", System.IO.Path.Combine(install_webroot, "package")); + AddMimeTypes(proxy_files); + server.Add(proxy_files); + } + + var fh = new CacheControlFileHandler("/", webroot, true); + AddMimeTypes(fh); + server.Add(fh); + + server.Add(new IndexHtmlHandler(webroot)); +#if DEBUG + //For debugging, it is nice to know when we get a 404 + server.Add(new DebugReportHandler()); +#endif + return server; + } + + private class DebugReportHandler : HttpModule + { + public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + System.Diagnostics.Trace.WriteLine(string.Format("Rejecting request for {0}", request.Uri)); + return false; + } + } + + private class CacheControlFileHandler : FileModule + { + public CacheControlFileHandler(string baseUri, string basePath, bool useLastModifiedHeader = false) + : base(baseUri, basePath, useLastModifiedHeader) + { + + } + + public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + if (!this.CanHandle(request.Uri)) + return false; + + if (request.Uri.AbsolutePath.EndsWith("index.html", StringComparison.Ordinal) || request.Uri.AbsolutePath.EndsWith("index.htm", StringComparison.Ordinal)) + response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); + else + response.AddHeader("Cache-Control", "max-age=" + (60 * 60 * 24)); + return base.Process(request, response, session); + } + } + + /// + /// Module for injecting host header verification + /// + private class HostHeaderChecker : HttpModule + { + /// + /// The hostnames that we allow + /// + private string[] m_lastSplitNames; + + /// + /// The string used to generate m_lastSplitNames; + /// + private string m_lastAllowed; + + /// + /// A regex to detect potential IPv4 addresses. + /// Note that this also detects things that are not valid IPv4. + /// + private static readonly System.Text.RegularExpressions.Regex IPV4 = new System.Text.RegularExpressions.Regex(@"((\d){1,3}\.){3}(\d){1,3}"); + /// + /// A regex to detect potential IPv6 addresses. + /// Note that this also detects things that are not valid IPv6. + /// + private static readonly System.Text.RegularExpressions.Regex IPV6 = new System.Text.RegularExpressions.Regex(@"(\:)?(\:?[A-Fa-f0-9]{1,4}\:?){1,8}(\:)?"); + + /// + /// The hostnames that are always allowed + /// + private static readonly string[] DEFAULT_ALLOWED = new string[] { "localhost", "127.0.0.1", "::1", "localhost.localdomain" }; + + /// + /// Process the received request + /// + /// A flag indicating if the request is handled. + /// The received request. + /// The response object. + /// The session state. + public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + string[] h = null; + var hstring = FIXMEGlobal.DataConnection.ApplicationSettings.AllowedHostnames; + + if (!string.IsNullOrWhiteSpace(hstring)) + { + h = m_lastSplitNames; + if (hstring != m_lastAllowed) + { + m_lastAllowed = hstring; + h = m_lastSplitNames = (hstring ?? string.Empty).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + } + + if (h == null || h.Length == 0) + h = null; + } + + // For some reason, the web server strips out the host header + var host = request.Headers["Host"]; + if (string.IsNullOrWhiteSpace(host)) + host = request.Uri.Host; + + // This should not happen + if (string.IsNullOrWhiteSpace(host)) + { + response.Reason = "Invalid request, missing host header"; + response.Status = System.Net.HttpStatusCode.Forbidden; + var msg = System.Text.Encoding.ASCII.GetBytes(response.Reason); + response.ContentType = "text/plain"; + response.ContentLength = msg.Length; + response.Body.Write(msg, 0, msg.Length); + response.Send(); + return true; + } + + // Check the hostnames we always allow + if (DEFAULT_ALLOWED.Contains(host, StringComparer.OrdinalIgnoreCase)) + return false; + + // Then the user specified ones + if (h != null && h.Contains(host, StringComparer.OrdinalIgnoreCase)) + return false; + + // Disable checks if we have an asterisk + if (h != null && Array.IndexOf(h, "*") >= 0) + return false; + + // Finally, check if we have a potential IP address + var v4 = IPV4.Match(host); + var v6 = IPV6.Match(host); + + if ((v4.Success && v4.Length == host.Length) || (v6.Success && v6.Length == host.Length)) + { + try + { + // Verify that the hostname is indeed a valid IP address + System.Net.IPAddress.Parse(host); + return false; + } + catch + { } + } + + // Failed to find a valid header + response.Reason = $"The host header sent by the client is not allowed"; + response.Status = System.Net.HttpStatusCode.Forbidden; + var txt = System.Text.Encoding.ASCII.GetBytes(response.Reason); + response.ContentType = "text/plain"; + response.ContentLength = txt.Length; + response.Body.Write(txt, 0, txt.Length); + response.Send(); + return true; + + } + } + } +} diff --git a/Duplicati/Server/WebServer/SynologyAuthenticationHandler.cs b/Duplicati.Library.RestAPI/WebServer/SynologyAuthenticationHandler.cs similarity index 97% rename from Duplicati/Server/WebServer/SynologyAuthenticationHandler.cs rename to Duplicati.Library.RestAPI/WebServer/SynologyAuthenticationHandler.cs index 77fef2a19..33639591b 100644 --- a/Duplicati/Server/WebServer/SynologyAuthenticationHandler.cs +++ b/Duplicati.Library.RestAPI/WebServer/SynologyAuthenticationHandler.cs @@ -1,289 +1,289 @@ -// Copyright (C) 2017, The Duplicati Team -// http://www.duplicati.com, info@duplicati.com -// -// This library is free software; you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as -// published by the Free Software Foundation; either version 2.1 of the -// License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using HttpServer.HttpModules; - -namespace Duplicati.Server.WebServer -{ - /// - /// Helper class for enforcing the built-in authentication on Synology DSM - /// - public class SynologyAuthenticationHandler : HttpModule - { - /// - /// The path to the login.cgi script - /// - private readonly string LOGIN_CGI = GetEnvArg("SYNO_LOGIN_CGI", "/usr/syno/synoman/webman/login.cgi"); - /// - /// The path to the authenticate.cgi script - /// - private readonly string AUTH_CGI = GetEnvArg("SYNO_AUTHENTICATE_CGI", "/usr/syno/synoman/webman/modules/authenticate.cgi"); - /// - /// A flag indicating if only admins are allowed - /// - private readonly bool ADMIN_ONLY = !(GetEnvArg("SYNO_ALL_USERS", "0") == "1"); - /// - /// A flag indicating if the XSRF token should be fetched automatically - /// - private readonly bool AUTO_XSRF = GetEnvArg("SYNO_AUTO_XSRF", "1") == "1"; - - /// - /// A flag indicating that the auth-module is fully disabled - /// - private readonly bool FULLY_DISABLED; - - /// - /// Re-evaluate the logins periodically to ensure it is still valid - /// - private readonly TimeSpan CACHE_TIMEOUT = TimeSpan.FromMinutes(3); - - /// - /// A cache of previously authenticated logins - /// - private readonly ConcurrentDictionary m_logincache = new ConcurrentDictionary(); - - /// - /// Initializes a new instance of the class. - /// - public SynologyAuthenticationHandler() - { - Console.WriteLine("Enabling Synology integrated authentication handler"); - var disable = false; - if (!File.Exists(LOGIN_CGI)) - { - Console.WriteLine("Disabling webserver as the login script is not found: {0}", LOGIN_CGI); - disable = true; - } - if (!File.Exists(AUTH_CGI)) - { - Console.WriteLine("Disabling webserver as the auth script is not found: {0}", AUTH_CGI); - disable = true; - } - - FULLY_DISABLED = disable; - } - - /// - /// Processes the request - /// - /// true if the request is handled false otherwise. - /// The request. - /// The response. - /// The session. - public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) - { - if (FULLY_DISABLED) - { - response.Status = System.Net.HttpStatusCode.ServiceUnavailable; - response.Reason = "The system is incorrectly configured"; - return true; - } - - var limitedAccess = - request.Uri.AbsolutePath.StartsWith(RESTHandler.API_URI_PATH, StringComparison.OrdinalIgnoreCase) - || - request.Uri.AbsolutePath.StartsWith(AuthenticationHandler.LOGIN_SCRIPT_URI, StringComparison.OrdinalIgnoreCase) - || - request.Uri.AbsolutePath.StartsWith(AuthenticationHandler.LOGOUT_SCRIPT_URI, StringComparison.OrdinalIgnoreCase); - - if (!limitedAccess) - return false; - - var tmpenv = new Dictionary(); - - tmpenv["REMOTE_ADDR"] = request.RemoteEndPoint.Address.ToString(); - tmpenv["REMOTE_PORT"] = request.RemoteEndPoint.Port.ToString(); - - if (!string.IsNullOrWhiteSpace(request.Headers["X-Real-IP"])) - tmpenv["REMOTE_ADDR"] = request.Headers["X-Real-IP"]; - if (!string.IsNullOrWhiteSpace(request.Headers["X-Real-IP"])) - tmpenv["REMOTE_PORT"] = request.Headers["X-Real-Port"]; - - var loginid = request.Cookies["id"]?.Value; - if (!string.IsNullOrWhiteSpace(loginid)) - tmpenv["HTTP_COOKIE"] = "id=" + loginid; - - var xsrftoken = request.Headers["X-Syno-Token"]; - if (string.IsNullOrWhiteSpace(xsrftoken)) - xsrftoken = request.QueryString["SynoToken"]?.Value; - - var cachestring = BuildCacheKey(tmpenv, xsrftoken); - - DateTime cacheExpires; - if (m_logincache.TryGetValue(cachestring, out cacheExpires) && cacheExpires > DateTime.Now) - { - // We do not refresh the cache, as we need to ask the synology auth system periodically - return false; - } - - if (string.IsNullOrWhiteSpace(xsrftoken) && AUTO_XSRF) - { - var authre = new Regex(@"""SynoToken""\s?\:\s?""(?[^""]+)"""); - try - { - var resp = ShellExec(LOGIN_CGI, env: tmpenv).Result; - - var m = authre.Match(resp); - if (m.Success) - xsrftoken = m.Groups["token"].Value; - else - throw new Exception("Unable to get XSRF token"); - } - catch (Exception) - { - response.Status = System.Net.HttpStatusCode.InternalServerError; - response.Reason = "The system is incorrectly configured"; - return true; - - } - } - - if (!string.IsNullOrWhiteSpace(xsrftoken)) - tmpenv["HTTP_X_SYNO_TOKEN"] = xsrftoken; - - cachestring = BuildCacheKey(tmpenv, xsrftoken); - - var username = GetEnvArg("SYNO_USERNAME"); - if (string.IsNullOrWhiteSpace(username)) - { - try - { - username = ShellExec(AUTH_CGI, shell: false, exitcode: 0, env: tmpenv).Result; - } - catch (Exception) - { - response.Status = System.Net.HttpStatusCode.InternalServerError; - response.Reason = "The system is incorrectly configured"; - return true; - } - } - - if (string.IsNullOrWhiteSpace(username)) - { - response.Status = System.Net.HttpStatusCode.Forbidden; - response.Reason = "Permission denied, not logged in"; - return true; - } - - username = username.Trim(); - - if (ADMIN_ONLY) - { - var groups = GetEnvArg("SYNO_GROUP_IDS"); - - if (string.IsNullOrWhiteSpace(groups)) - { - groups = ShellExec("id", "-G '" + username.Trim().Replace("'", "\\'") + "'", exitcode: 0).Result ?? string.Empty; - groups = groups.Replace(Environment.NewLine, String.Empty); - } - - if (!groups.Split(new char[] { ' ' }).Contains("101")) - { - response.Status = System.Net.HttpStatusCode.Forbidden; - response.Reason = "Administrator login required"; - return true; - } - } - - // We are now authenticated, add to cache - m_logincache[cachestring] = DateTime.Now + CACHE_TIMEOUT; - return false; - } - - /// - /// Builds a cache key from the environment data - /// - /// The cache key. - /// The environment. - /// The XSRF token. - private static string BuildCacheKey(Dictionary values, string xsrftoken) - { - if (!values.ContainsKey("REMOTE_ADDR") || !values.ContainsKey("REMOTE_PORT") || !values.ContainsKey("HTTP_COOKIE")) - return null; - - return string.Format("{0}:{1}/{2}?{3}", values["REMOTE_ADDR"], values["REMOTE_PORT"], values["HTTP_COOKIE"], xsrftoken); - } - - /// - /// Runs an external command - /// - /// The stdout data. - /// The executable - /// The executable and the arguments. - /// If set to true use the shell context for execution. - /// Set the value to check for a particular exitcode. - private static async Task ShellExec(string command, string args = null, bool shell = false, int exitcode = -1, Dictionary env = null) - { - var psi = new ProcessStartInfo() - { - FileName = command, - Arguments = shell ? null : args, - UseShellExecute = false, - RedirectStandardInput = shell, - RedirectStandardOutput = true, - RedirectStandardError = false - }; - - if (env != null) - foreach (var pk in env) - psi.EnvironmentVariables[pk.Key] = pk.Value; - - using (var p = System.Diagnostics.Process.Start(psi)) - { - if (shell && args != null) - await p.StandardInput.WriteLineAsync(args); - - var res = p.StandardOutput.ReadToEndAsync(); - - var tries = 10; - var ms = (int)TimeSpan.FromSeconds(0.5).TotalMilliseconds; - while (tries > 0 && !p.HasExited) - { - tries--; - p.WaitForExit(ms); - } - - if (!p.HasExited) - try { p.Kill(); } - catch { } - - if (!p.HasExited || (p.ExitCode != exitcode && exitcode != -1)) - throw new Exception(string.Format("Exit code was: {0}, stdout: {1}", p.ExitCode, res)); - return await res; - } - } - - /// - /// Gets the environment variable argument. - /// - /// The environment variable. - /// The name of the environment variable. - /// The default value. - private static string GetEnvArg(string key, string @default = null) - { - var res = Environment.GetEnvironmentVariable(key); - return string.IsNullOrWhiteSpace(res) ? @default : res.Trim(); - } - } -} +// Copyright (C) 2017, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using HttpServer.HttpModules; + +namespace Duplicati.Server.WebServer +{ + /// + /// Helper class for enforcing the built-in authentication on Synology DSM + /// + public class SynologyAuthenticationHandler : HttpModule + { + /// + /// The path to the login.cgi script + /// + private readonly string LOGIN_CGI = GetEnvArg("SYNO_LOGIN_CGI", "/usr/syno/synoman/webman/login.cgi"); + /// + /// The path to the authenticate.cgi script + /// + private readonly string AUTH_CGI = GetEnvArg("SYNO_AUTHENTICATE_CGI", "/usr/syno/synoman/webman/modules/authenticate.cgi"); + /// + /// A flag indicating if only admins are allowed + /// + private readonly bool ADMIN_ONLY = !(GetEnvArg("SYNO_ALL_USERS", "0") == "1"); + /// + /// A flag indicating if the XSRF token should be fetched automatically + /// + private readonly bool AUTO_XSRF = GetEnvArg("SYNO_AUTO_XSRF", "1") == "1"; + + /// + /// A flag indicating that the auth-module is fully disabled + /// + private readonly bool FULLY_DISABLED; + + /// + /// Re-evaluate the logins periodically to ensure it is still valid + /// + private readonly TimeSpan CACHE_TIMEOUT = TimeSpan.FromMinutes(3); + + /// + /// A cache of previously authenticated logins + /// + private readonly ConcurrentDictionary m_logincache = new ConcurrentDictionary(); + + /// + /// Initializes a new instance of the class. + /// + public SynologyAuthenticationHandler() + { + Console.WriteLine("Enabling Synology integrated authentication handler"); + var disable = false; + if (!File.Exists(LOGIN_CGI)) + { + Console.WriteLine("Disabling webserver as the login script is not found: {0}", LOGIN_CGI); + disable = true; + } + if (!File.Exists(AUTH_CGI)) + { + Console.WriteLine("Disabling webserver as the auth script is not found: {0}", AUTH_CGI); + disable = true; + } + + FULLY_DISABLED = disable; + } + + /// + /// Processes the request + /// + /// true if the request is handled false otherwise. + /// The request. + /// The response. + /// The session. + public override bool Process(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session) + { + if (FULLY_DISABLED) + { + response.Status = System.Net.HttpStatusCode.ServiceUnavailable; + response.Reason = "The system is incorrectly configured"; + return true; + } + + var limitedAccess = + request.Uri.AbsolutePath.StartsWith(RESTHandler.API_URI_PATH, StringComparison.OrdinalIgnoreCase) + || + request.Uri.AbsolutePath.StartsWith(AuthenticationHandler.LOGIN_SCRIPT_URI, StringComparison.OrdinalIgnoreCase) + || + request.Uri.AbsolutePath.StartsWith(AuthenticationHandler.LOGOUT_SCRIPT_URI, StringComparison.OrdinalIgnoreCase); + + if (!limitedAccess) + return false; + + var tmpenv = new Dictionary(); + + tmpenv["REMOTE_ADDR"] = request.RemoteEndPoint.Address.ToString(); + tmpenv["REMOTE_PORT"] = request.RemoteEndPoint.Port.ToString(); + + if (!string.IsNullOrWhiteSpace(request.Headers["X-Real-IP"])) + tmpenv["REMOTE_ADDR"] = request.Headers["X-Real-IP"]; + if (!string.IsNullOrWhiteSpace(request.Headers["X-Real-IP"])) + tmpenv["REMOTE_PORT"] = request.Headers["X-Real-Port"]; + + var loginid = request.Cookies["id"]?.Value; + if (!string.IsNullOrWhiteSpace(loginid)) + tmpenv["HTTP_COOKIE"] = "id=" + loginid; + + var xsrftoken = request.Headers["X-Syno-Token"]; + if (string.IsNullOrWhiteSpace(xsrftoken)) + xsrftoken = request.QueryString["SynoToken"]?.Value; + + var cachestring = BuildCacheKey(tmpenv, xsrftoken); + + DateTime cacheExpires; + if (m_logincache.TryGetValue(cachestring, out cacheExpires) && cacheExpires > DateTime.Now) + { + // We do not refresh the cache, as we need to ask the synology auth system periodically + return false; + } + + if (string.IsNullOrWhiteSpace(xsrftoken) && AUTO_XSRF) + { + var authre = new Regex(@"""SynoToken""\s?\:\s?""(?[^""]+)"""); + try + { + var resp = ShellExec(LOGIN_CGI, env: tmpenv).Result; + + var m = authre.Match(resp); + if (m.Success) + xsrftoken = m.Groups["token"].Value; + else + throw new Exception("Unable to get XSRF token"); + } + catch (Exception) + { + response.Status = System.Net.HttpStatusCode.InternalServerError; + response.Reason = "The system is incorrectly configured"; + return true; + + } + } + + if (!string.IsNullOrWhiteSpace(xsrftoken)) + tmpenv["HTTP_X_SYNO_TOKEN"] = xsrftoken; + + cachestring = BuildCacheKey(tmpenv, xsrftoken); + + var username = GetEnvArg("SYNO_USERNAME"); + if (string.IsNullOrWhiteSpace(username)) + { + try + { + username = ShellExec(AUTH_CGI, shell: false, exitcode: 0, env: tmpenv).Result; + } + catch (Exception) + { + response.Status = System.Net.HttpStatusCode.InternalServerError; + response.Reason = "The system is incorrectly configured"; + return true; + } + } + + if (string.IsNullOrWhiteSpace(username)) + { + response.Status = System.Net.HttpStatusCode.Forbidden; + response.Reason = "Permission denied, not logged in"; + return true; + } + + username = username.Trim(); + + if (ADMIN_ONLY) + { + var groups = GetEnvArg("SYNO_GROUP_IDS"); + + if (string.IsNullOrWhiteSpace(groups)) + { + groups = ShellExec("id", "-G '" + username.Trim().Replace("'", "\\'") + "'", exitcode: 0).Result ?? string.Empty; + groups = groups.Replace(Environment.NewLine, String.Empty); + } + + if (!groups.Split(new char[] { ' ' }).Contains("101")) + { + response.Status = System.Net.HttpStatusCode.Forbidden; + response.Reason = "Administrator login required"; + return true; + } + } + + // We are now authenticated, add to cache + m_logincache[cachestring] = DateTime.Now + CACHE_TIMEOUT; + return false; + } + + /// + /// Builds a cache key from the environment data + /// + /// The cache key. + /// The environment. + /// The XSRF token. + private static string BuildCacheKey(Dictionary values, string xsrftoken) + { + if (!values.ContainsKey("REMOTE_ADDR") || !values.ContainsKey("REMOTE_PORT") || !values.ContainsKey("HTTP_COOKIE")) + return null; + + return string.Format("{0}:{1}/{2}?{3}", values["REMOTE_ADDR"], values["REMOTE_PORT"], values["HTTP_COOKIE"], xsrftoken); + } + + /// + /// Runs an external command + /// + /// The stdout data. + /// The executable + /// The executable and the arguments. + /// If set to true use the shell context for execution. + /// Set the value to check for a particular exitcode. + private static async Task ShellExec(string command, string args = null, bool shell = false, int exitcode = -1, Dictionary env = null) + { + var psi = new ProcessStartInfo() + { + FileName = command, + Arguments = shell ? null : args, + UseShellExecute = false, + RedirectStandardInput = shell, + RedirectStandardOutput = true, + RedirectStandardError = false + }; + + if (env != null) + foreach (var pk in env) + psi.EnvironmentVariables[pk.Key] = pk.Value; + + using (var p = System.Diagnostics.Process.Start(psi)) + { + if (shell && args != null) + await p.StandardInput.WriteLineAsync(args); + + var res = p.StandardOutput.ReadToEndAsync(); + + var tries = 10; + var ms = (int)TimeSpan.FromSeconds(0.5).TotalMilliseconds; + while (tries > 0 && !p.HasExited) + { + tries--; + p.WaitForExit(ms); + } + + if (!p.HasExited) + try { p.Kill(); } + catch { } + + if (!p.HasExited || (p.ExitCode != exitcode && exitcode != -1)) + throw new Exception(string.Format("Exit code was: {0}, stdout: {1}", p.ExitCode, res)); + return await res; + } + } + + /// + /// Gets the environment variable argument. + /// + /// The environment variable. + /// The name of the environment variable. + /// The default value. + private static string GetEnvArg(string key, string @default = null) + { + var res = Environment.GetEnvironmentVariable(key); + return string.IsNullOrWhiteSpace(res) ? @default : res.Trim(); + } + } +} diff --git a/Duplicati/Server/newbackup.json b/Duplicati.Library.RestAPI/newbackup.json similarity index 96% rename from Duplicati/Server/newbackup.json rename to Duplicati.Library.RestAPI/newbackup.json index 97c35f4fa..3fbb3c65b 100644 --- a/Duplicati/Server/newbackup.json +++ b/Duplicati.Library.RestAPI/newbackup.json @@ -1,15 +1,15 @@ -{ - Backup: { - Settings: [ - {Name: "encryption-module", Value: "aes"}, - {Name: "compression-module", Value: "zip"}, - {Name: "dblock-size", Value: "50mb"}, - {Name: "keep-time", Value: ""} - ] - }, - Schedule: { - Repeat: "1D", - Time: "13:00:00", - AllowedDays: ["mon", "tue", "wed", "thu", "fri", "sat", "sun"] - } +{ + Backup: { + Settings: [ + {Name: "encryption-module", Value: "aes"}, + {Name: "compression-module", Value: "zip"}, + {Name: "dblock-size", Value: "50mb"}, + {Name: "keep-time", Value: ""} + ] + }, + Schedule: { + Repeat: "1D", + Time: "13:00:00", + AllowedDays: ["mon", "tue", "wed", "thu", "fri", "sat", "sun"] + } } \ No newline at end of file diff --git a/Duplicati.sln b/Duplicati.sln index 5891e7de5..e0d67a087 100644 --- a/Duplicati.sln +++ b/Duplicati.sln @@ -154,6 +154,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Implementation", "Implement EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.Library.Backends", "Duplicati\Library\Backends\Duplicati.Library.Backends.csproj", "{5290E237-C2CD-48F2-99D2-817F9C2163C8}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Duplicati.WebserverCore", "Duplicati\WebserverCore\Duplicati.WebserverCore.csproj", "{5A702CEE-DB36-4153-BD94-D8CF867E75A9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Duplicati.Library.RestAPI", "Duplicati.Library.RestAPI\Duplicati.Library.RestAPI.csproj", "{C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -424,6 +428,14 @@ Global {5290E237-C2CD-48F2-99D2-817F9C2163C8}.Debug|Any CPU.Build.0 = Debug|Any CPU {5290E237-C2CD-48F2-99D2-817F9C2163C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {5290E237-C2CD-48F2-99D2-817F9C2163C8}.Release|Any CPU.Build.0 = Release|Any CPU + {5A702CEE-DB36-4153-BD94-D8CF867E75A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A702CEE-DB36-4153-BD94-D8CF867E75A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A702CEE-DB36-4153-BD94-D8CF867E75A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A702CEE-DB36-4153-BD94-D8CF867E75A9}.Release|Any CPU.Build.0 = Release|Any CPU + {C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1D4D665-23A3-4216-9CD1-D67AE9AAAA4C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -445,6 +457,7 @@ Global {17566860-3D98-4604-AA5B-47661F75609F} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} {2AF960C0-357D-4D44-A3D5-8B6E89DB0F11} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} {2C838169-B187-4B09-8768-1C24C2521C8D} = {566EBBDA-19A4-4056-A615-D901D57D2439} + {E93F3DE2-FF3A-4709-96A3-8190AA14FA25} = {D19A38DD-68F1-4EF5-BF5F-8966CE0D9A5B} {8E4CECFB-0413-4B00-AB93-78D1C3902BD5} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} {5489181D-950C-44AF-873C-45EB0A3B6BD2} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} {D9E4E686-423C-48EC-A392-404E7C00860C} = {E1A9B303-F281-45C5-A4F6-CADD9DE3F3C4} diff --git a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj index 8f2ef415d..f05705b68 100644 --- a/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj +++ b/Duplicati/CommandLine/ConfigurationImporter/Duplicati.CommandLine.ConfigurationImporter.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 Duplicati.CommandLine.ConfigurationImporter.Implementation Duplicati.CommandLine.ConfigurationImporter diff --git a/Duplicati/Server/Duplicati.Server.csproj b/Duplicati/Server/Duplicati.Server.csproj index 39b012ba0..de5b79361 100644 --- a/Duplicati/Server/Duplicati.Server.csproj +++ b/Duplicati/Server/Duplicati.Server.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 The Server Duplicati implementation Duplicati.Server.Implementation @@ -19,6 +19,7 @@ + @@ -45,6 +46,7 @@ + @@ -69,11 +71,6 @@ - - - - - Always diff --git a/Duplicati/Server/Program.cs b/Duplicati/Server/Program.cs index a905d5968..146f6c11d 100644 --- a/Duplicati/Server/Program.cs +++ b/Duplicati/Server/Program.cs @@ -4,6 +4,8 @@ using System.Globalization; using System.Linq; using Duplicati.Library.Common; using Duplicati.Library.Common.IO; +using Duplicati.Library.RestAPI; +using Duplicati.WebserverCore; namespace Duplicati.Server { @@ -36,7 +38,7 @@ namespace Duplicati.Server /// /// Gets the folder where Duplicati data is stored /// - public static string DataFolder { get; private set; } + public static string DataFolder { get => FIXMEGlobal.DataFolder; private set => FIXMEGlobal.DataFolder = value; } /// /// The single instance @@ -46,27 +48,27 @@ namespace Duplicati.Server /// /// This is the only access to the database /// - public static Database.Connection DataConnection; + public static Database.Connection DataConnection { get => FIXMEGlobal.DataConnection; set => FIXMEGlobal.DataConnection = value; } /// /// This is the lock to be used before manipulating the shared resources /// - public static readonly object MainLock = new object(); + public static object MainLock { get => FIXMEGlobal.MainLock; } /// /// This is the scheduling thread /// - public static Scheduler Scheduler; + public static Scheduler Scheduler { get => FIXMEGlobal.Scheduler; set => FIXMEGlobal.Scheduler = value; } /// /// This is the working thread /// - public static Duplicati.Library.Utility.WorkerThread WorkThread; + public static Duplicati.Library.Utility.WorkerThread WorkThread { get => FIXMEGlobal.WorkThread; set => FIXMEGlobal.WorkThread = value; } /// /// List of completed task results /// - public static readonly List> TaskResultCache = new List>(); + public static List> TaskResultCache { get => FIXMEGlobal.TaskResultCache; } /// /// The maximum number of completed task results to keep in memory @@ -86,22 +88,27 @@ namespace Duplicati.Server /// /// The controller interface for pause/resume and throttle options /// - public static LiveControls LiveControl; + public static LiveControls LiveControl { get => FIXMEGlobal.LiveControl; set => FIXMEGlobal.LiveControl = value; } /// /// The application exit event /// - public static System.Threading.ManualResetEvent ApplicationExitEvent; + public static System.Threading.ManualResetEvent ApplicationExitEvent { get => FIXMEGlobal.ApplicationExitEvent; set => FIXMEGlobal.ApplicationExitEvent = value; } /// /// The webserver instance /// private static WebServer.Server WebServer; + /// + /// Callback to shutdown the modern webserver + /// + private static Action ShutdownModernWebserver; + /// /// The update poll thread. /// - public static UpdatePollThread UpdatePoller; + public static UpdatePollThread UpdatePoller { get => FIXMEGlobal.UpdatePoller; set => FIXMEGlobal.UpdatePoller = value; } /// /// An event that is set once the server is ready to respond to requests @@ -111,12 +118,12 @@ namespace Duplicati.Server /// /// The status event signaler, used to control long polling of status updates /// - public static readonly EventPollNotify StatusEventNotifyer = new EventPollNotify(); + public static EventPollNotify StatusEventNotifyer { get => FIXMEGlobal.StatusEventNotifyer; } /// /// A delegate method for creating a copy of the current progress state /// - public static Func GenerateProgressState; + public static Func GenerateProgressState { get => FIXMEGlobal.GenerateProgressState; set => FIXMEGlobal.GenerateProgressState = value; } /// /// An event ID that increases whenever the database is updated @@ -131,12 +138,12 @@ namespace Duplicati.Server /// /// The log redirect handler /// - public static readonly LogWriteHandler LogHandler = new LogWriteHandler(); + public static LogWriteHandler LogHandler { get => FIXMEGlobal.LogHandler; } /// /// Used to check the origin of the web server (e.g. Tray icon or a stand alone Server) /// - public static string Origin = "Server"; + public static string Origin { get => FIXMEGlobal.Origin; set => FIXMEGlobal.Origin = value; } private static System.Threading.Timer PurgeTempFilesTimer = null; @@ -166,6 +173,27 @@ namespace Duplicati.Server set { DataConnection.ApplicationSettings.ServerPortChanged = value; } } + public static void IncrementLastDataUpdateID() + { + System.Threading.Interlocked.Increment(ref Program.LastDataUpdateID); + } + + public static void IncrementLastNotificationUpdateID() + { + System.Threading.Interlocked.Increment(ref Program.LastNotificationUpdateID); + } + + static Program() + { + FIXMEGlobal.IncrementLastDataUpdateID = Program.IncrementLastDataUpdateID; + FIXMEGlobal.PeekLastDataUpdateID = () => Program.LastDataUpdateID; + FIXMEGlobal.IncrementLastNotificationUpdateID = Program.IncrementLastNotificationUpdateID; + FIXMEGlobal.PeekLastNotificationUpdateID = () => Program.LastNotificationUpdateID; + FIXMEGlobal.GetDatabaseConnection = Program.GetDatabaseConnection; + FIXMEGlobal.StartOrStopUsageReporter = Program.StartOrStopUsageReporter; + FIXMEGlobal.UpdateThrottleSpeeds = Program.UpdateThrottleSpeeds; + } + /// /// The main entry point for the application. /// @@ -291,6 +319,7 @@ namespace Duplicati.Server { StatusEventNotifyer.SignalNewEvent(); + ShutdownModernWebserver(); UpdatePoller?.Terminate(); Scheduler?.Terminate(true); WorkThread?.Terminate(true); @@ -317,6 +346,9 @@ namespace Duplicati.Server ServerPortChanged |= WebServer.Port != DataConnection.ApplicationSettings.LastWebserverPort; DataConnection.ApplicationSettings.LastWebserverPort = WebServer.Port; + + var server = new DuplicatiWebserver(); + ShutdownModernWebserver = server.Foo(); } private static void SetWorkerThread() @@ -647,7 +679,7 @@ namespace Duplicati.Server //Attempt to open the database, handling any encryption present Duplicati.Library.SQLiteHelper.SQLiteLoader.OpenDatabase(con, DatabasePath, useDatabaseEncryption, dbPassword); - Duplicati.Library.SQLiteHelper.DatabaseUpgrader.UpgradeDatabase(con, DatabasePath, typeof(Database.Connection)); + Duplicati.Library.SQLiteHelper.DatabaseUpgrader.UpgradeDatabase(con, DatabasePath, typeof(Duplicati.Library.RestAPI.Database.DatabaseConnectionSchemaMarker)); } catch (Exception ex) { diff --git a/Duplicati/Service/Duplicati.Service.csproj b/Duplicati/Service/Duplicati.Service.csproj index 72ac037d3..ce324aee2 100644 --- a/Duplicati/Service/Duplicati.Service.csproj +++ b/Duplicati/Service/Duplicati.Service.csproj @@ -1,7 +1,7 @@  - netstandard2.0 + net6.0 LGPL, Copyright © Duplicati Team 2021 Duplicati.Service.Implementation diff --git a/Duplicati/WebserverCore/Duplicati.WebserverCore.csproj b/Duplicati/WebserverCore/Duplicati.WebserverCore.csproj new file mode 100644 index 000000000..cbcd65f1d --- /dev/null +++ b/Duplicati/WebserverCore/Duplicati.WebserverCore.csproj @@ -0,0 +1,15 @@ + + + + net6.0 + Library + enable + enable + true + + + + + + + diff --git a/Duplicati/WebserverCore/DuplicatiWebserver.cs b/Duplicati/WebserverCore/DuplicatiWebserver.cs new file mode 100644 index 000000000..7dc7cc37b --- /dev/null +++ b/Duplicati/WebserverCore/DuplicatiWebserver.cs @@ -0,0 +1,14 @@ +namespace Duplicati.WebserverCore +{ + public class DuplicatiWebserver + { + public Action Foo() { + var builder = WebApplication.CreateBuilder(); + var app = builder.Build(); + + app.UseTestMiddleware(); + app.RunAsync("http://localhost:3001"); + return () => { app.StopAsync(); }; + } + } +} \ No newline at end of file diff --git a/Duplicati/WebserverCore/RestHandlerCore.cs b/Duplicati/WebserverCore/RestHandlerCore.cs new file mode 100644 index 000000000..c7c46252a --- /dev/null +++ b/Duplicati/WebserverCore/RestHandlerCore.cs @@ -0,0 +1,56 @@ +// Copyright (C) 2023, The Duplicati Team +// http://www.duplicati.com, info@duplicati.com +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +using Duplicati.Server.WebServer.RESTMethods; + +namespace Duplicati.WebserverCorer +{ + public class RESTHandlerCore + { + public const string API_URI_PATH = "/api/v1"; + public static readonly int API_URI_SEGMENTS = API_URI_PATH.Split(new char[] { '/' }).Length; + + private static readonly Dictionary _modules = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public static IDictionary Modules { get { return _modules; } } + + /// + /// Loads all REST modules in the Duplicati.Server.WebServer.RESTMethods namespace + /// + static RESTHandlerCore() + { + var lst = + from n in typeof(IRESTMethod).Assembly.GetTypes() + where + n.Namespace == typeof(IRESTMethod).Namespace + && + typeof(IRESTMethod).IsAssignableFrom(n) + && + !n.IsAbstract + && + !n.IsInterface + select n; + + foreach (var t in lst) + { + var m = (IRESTMethod)Activator.CreateInstance(t); + _modules.Add(t.Name.ToLowerInvariant(), m); + } + } + } +} + diff --git a/Duplicati/WebserverCore/TestMiddleware.cs b/Duplicati/WebserverCore/TestMiddleware.cs new file mode 100644 index 000000000..04c8a9246 --- /dev/null +++ b/Duplicati/WebserverCore/TestMiddleware.cs @@ -0,0 +1,37 @@ +using System.Globalization; +namespace Duplicati.WebserverCore +{ + public class TestMiddleware + { + private readonly RequestDelegate _next; + + public TestMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + var cultureQuery = context.Request.Query["culture"]; + if (!string.IsNullOrWhiteSpace(cultureQuery)) + { + var culture = new CultureInfo(cultureQuery); + + CultureInfo.CurrentCulture = culture; + CultureInfo.CurrentUICulture = culture; + } + + // Call the next delegate/middleware in the pipeline. + await _next(context); + } + } + + public static class TestMiddlewareExtensions + { + public static IApplicationBuilder UseTestMiddleware( + this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } + } +} \ No newline at end of file From 83bc52bff44cfadd4b0246c9f98428e5b859c069 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sat, 28 Jan 2023 08:15:45 -0800 Subject: [PATCH 243/253] More WIP setting up kestrel --- Duplicati/WebserverCore/DuplicatiWebserver.cs | 17 +- Duplicati/WebserverCore/RestHandlerCore.cs | 188 +++++++++++++++++- 2 files changed, 195 insertions(+), 10 deletions(-) diff --git a/Duplicati/WebserverCore/DuplicatiWebserver.cs b/Duplicati/WebserverCore/DuplicatiWebserver.cs index 7dc7cc37b..d9c91b7b0 100644 --- a/Duplicati/WebserverCore/DuplicatiWebserver.cs +++ b/Duplicati/WebserverCore/DuplicatiWebserver.cs @@ -1,14 +1,29 @@ -namespace Duplicati.WebserverCore +using Duplicati.WebserverCorer; + +namespace Duplicati.WebserverCore { public class DuplicatiWebserver { public Action Foo() { var builder = WebApplication.CreateBuilder(); + builder.Host.UseRESTHandlers(); var app = builder.Build(); app.UseTestMiddleware(); + app.UseRESTHandlerEndpoints(); + app.RunAsync("http://localhost:3001"); return () => { app.StopAsync(); }; } + + public Action Bar() + { + var builder = Host.CreateDefaultBuilder(); + builder.UseRESTHandlers(); + var app = builder.Build(); + + app.RunAsync(); + return () => { app.StopAsync() }; + } } } \ No newline at end of file diff --git a/Duplicati/WebserverCore/RestHandlerCore.cs b/Duplicati/WebserverCore/RestHandlerCore.cs index c7c46252a..13d9189fb 100644 --- a/Duplicati/WebserverCore/RestHandlerCore.cs +++ b/Duplicati/WebserverCore/RestHandlerCore.cs @@ -15,11 +15,19 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +using Amazon.S3; +using Duplicati.Library.RestAPI; using Duplicati.Server.WebServer.RESTMethods; +using Duplicati.WebserverCore; +using Microsoft.AspNetCore.Mvc; +using Org.BouncyCastle.Bcpg.Sig; +using System.Collections.Concurrent; +using System.Net; +using System.Reflection; namespace Duplicati.WebserverCorer { - public class RESTHandlerCore + public class RESTHandlerCoreController : Controller { public const string API_URI_PATH = "/api/v1"; public static readonly int API_URI_SEGMENTS = API_URI_PATH.Split(new char[] { '/' }).Length; @@ -28,10 +36,157 @@ namespace Duplicati.WebserverCorer public static IDictionary Modules { get { return _modules; } } - /// - /// Loads all REST modules in the Duplicati.Server.WebServer.RESTMethods namespace - /// - static RESTHandlerCore() + public RESTHandlerCoreController(List restMethods) + { + } + + [Route(API_URI_PATH + "/{module?}/{key?}")] + [AcceptVerbs("GET", "POST", "PUT", "DELETE", "PATCH")] + public async Task Index(string? module, string? key) + { + + module = (module != null && module != "") ? module : "help"; + + var method = Request.Method; + + var ci = ParseRequestCulture(Request.Headers.Accept); + + using (Library.Localization.LocalizationService.TemporaryContext(ci)) + { + try + { + if (ci != null) + Response.Headers.Add("Content-Language", ci.Name); + + IRESTMethod mod; + _modules.TryGetValue(module, out mod); + + if (mod == null) + { + return NotFound("No such module"); + } + else if (method == "GET" && mod is IRESTMethodGET get) + { + //if (info.Request.Form != HttpServer.HttpForm.EmptyForm) + //{ + // if (info.Request.QueryString == HttpServer.HttpInput.Empty) + // { + // var r = info.Request.GetType().GetField("_queryString", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + // r.SetValue(info.Request, new HttpServer.HttpInput("formdata")); + // } + + // foreach (HttpServer.HttpInputItem v in info.Request.Form) + // if (!info.Request.QueryString.Contains(v.Name)) + // info.Request.QueryString.Add(v.Name, v.Value); + //} + + get.GET(key, info); + } + else if (method =="PUT" && mod is IRESTMethodPUT put) + put.PUT(key, info); + else if (method == "POST" && mod is IRESTMethodPOST post) + { + //if (info.Request.Form == HttpServer.HttpForm.EmptyForm || info.Request.Form == HttpServer.HttpInput.Empty) + //{ + // var r = info.Request.GetType().GetMethod("AssignForm", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, new Type[] { typeof(HttpServer.HttpForm) }, null); + // r.Invoke(info.Request, new object[] { new HttpServer.HttpForm(info.Request.QueryString) }); + //} + //else + //{ + // foreach (HttpServer.HttpInputItem v in info.Request.QueryString) + // if (!info.Request.Form.Contains(v.Name)) + // info.Request.Form.Add(v.Name, v.Value); + //} + + post.POST(key, info); + } + else if (method == "DELETE" && mod is IRESTMethodDELETE delete) + delete.DELETE(key, info); + else if (method == "PATCH" && mod is IRESTMethodPATCH patch) + patch.PATCH(key, info); + else + { + return StatusCode( (int)HttpStatusCode.MethodNotAllowed, "Method is not allowed"); + } + } + catch (Exception ex) + { + FIXMEGlobal.DataConnection.LogError("", string.Format("Request for {0} gave error",Request.Path), ex); + Console.WriteLine(ex); + + try + { + var wex = ex; + while (wex is System.Reflection.TargetInvocationException && wex.InnerException != wex) + wex = wex.InnerException; + + return StatusCode(500, wex.Message +#if DEBUG + + "\n" + wex.StackTrace +#endif + ); + } + catch (Exception flex) + { + FIXMEGlobal.DataConnection.LogError("", "Reporting error gave error", flex); + } + } + } + + return Ok(); + } + + + private static readonly ConcurrentDictionary _cultureCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + private static System.Globalization.CultureInfo ParseRequestCulture(string acceptheader) + { + acceptheader = acceptheader ?? string.Empty; + + // Lock-free read + System.Globalization.CultureInfo ci; + if (_cultureCache.TryGetValue(acceptheader, out ci)) + return ci; + + // Lock-free assignment, we might compute the value twice + return _cultureCache[acceptheader] = + // Parse headers like "Accept-Language: da, en-gb;q=0.8, en;q=0.7" + acceptheader + .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries) + .Select(x => + { + var opts = x.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + var lang = opts.FirstOrDefault(); + var weight = + opts.Where(y => y.StartsWith("q=", StringComparison.OrdinalIgnoreCase)) + .Select(y => + { + float f; + float.TryParse(y.Substring(2), System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out f); + return f; + }).FirstOrDefault(); + + // Set the default weight=1 + if (weight <= 0.001 && weight >= 0) + weight = 1; + + return new KeyValuePair(lang, weight); + }) + // Handle priority + .OrderByDescending(x => x.Value) + .Select(x => x.Key) + .Distinct() + // Filter invalid/unsupported items + .Where(x => !string.IsNullOrWhiteSpace(x) && Library.Localization.LocalizationService.ParseCulture(x) != null) + .Select(x => Library.Localization.LocalizationService.ParseCulture(x)) + // And get the first that works + .FirstOrDefault(System.Globalization.CultureInfo.InvariantCulture); + + } + } + public static class RESTHandlerCoreExtensions + { + public static IHostBuilder UseRESTHandlers( + this IHostBuilder builder) { var lst = from n in typeof(IRESTMethod).Assembly.GetTypes() @@ -45,12 +200,27 @@ namespace Duplicati.WebserverCorer !n.IsInterface select n; - foreach (var t in lst) + builder.ConfigureServices(services => { - var m = (IRESTMethod)Activator.CreateInstance(t); - _modules.Add(t.Name.ToLowerInvariant(), m); - } + foreach (var t in lst) + { + services.AddSingleton(t); + } + }); + + return builder; + } + + public static IEndpointRouteBuilder UseRESTHandlerEndpoints(this IEndpointRouteBuilder builder) + { + builder.MapFallback(async (HttpContext context) => { + await System.Threading.Tasks.Task.Delay(1); + context. + //TODO: Register controllers without this middleware ? + }); + return builder; } } + } From e5442da247d1f95b15c64b688bffc7ad85b3076b Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Sun, 29 Jan 2023 17:29:57 -0800 Subject: [PATCH 244/253] [WIP] Kestrel loads and routes loaded, shim classes not yet implemented --- .../Duplicati.WebserverCore.csproj | 7 +- Duplicati/WebserverCore/DuplicatiWebserver.cs | 50 ++++++++++- .../WebserverCore/LegacyHttpRequestShim.cs | 83 +++++++++++++++++++ .../WebserverCore/LegacyHttpResponseShim.cs | 61 ++++++++++++++ .../WebserverCore/LegacyHttpSessionShim.cs | 37 +++++++++ Duplicati/WebserverCore/RestHandlerCore.cs | 30 ++++--- 6 files changed, 252 insertions(+), 16 deletions(-) create mode 100644 Duplicati/WebserverCore/LegacyHttpRequestShim.cs create mode 100644 Duplicati/WebserverCore/LegacyHttpResponseShim.cs create mode 100644 Duplicati/WebserverCore/LegacyHttpSessionShim.cs diff --git a/Duplicati/WebserverCore/Duplicati.WebserverCore.csproj b/Duplicati/WebserverCore/Duplicati.WebserverCore.csproj index cbcd65f1d..e1ad23e45 100644 --- a/Duplicati/WebserverCore/Duplicati.WebserverCore.csproj +++ b/Duplicati/WebserverCore/Duplicati.WebserverCore.csproj @@ -11,5 +11,10 @@ - + + + + ..\..\thirdparty\HttpServer\HttpServer.dll + + diff --git a/Duplicati/WebserverCore/DuplicatiWebserver.cs b/Duplicati/WebserverCore/DuplicatiWebserver.cs index d9c91b7b0..64425cf87 100644 --- a/Duplicati/WebserverCore/DuplicatiWebserver.cs +++ b/Duplicati/WebserverCore/DuplicatiWebserver.cs @@ -1,4 +1,5 @@ -using Duplicati.WebserverCorer; +using Microsoft.AspNetCore.Mvc.ApplicationParts; +using Microsoft.AspNetCore.Mvc.Controllers; namespace Duplicati.WebserverCore { @@ -7,10 +8,16 @@ namespace Duplicati.WebserverCore public Action Foo() { var builder = WebApplication.CreateBuilder(); builder.Host.UseRESTHandlers(); + builder.Services.AddControllers() + // This app gets launched by a different assembly, so we need to tell it to look in this one + .AddApplicationPart(this.GetType().Assembly); + builder.Services.AddHostedService(); var app = builder.Build(); - app.UseTestMiddleware(); - app.UseRESTHandlerEndpoints(); + //app.UseTestMiddleware(); + //app.UseRESTHandlerEndpoints(); + + app.MapControllers(); app.RunAsync("http://localhost:3001"); return () => { app.StopAsync(); }; @@ -23,7 +30,42 @@ namespace Duplicati.WebserverCore var app = builder.Build(); app.RunAsync(); - return () => { app.StopAsync() }; + return () => { app.StopAsync(); }; } } + + //Useful for debugging ASP.net magically loading controllers + public class ApplicationPartsLogger : IHostedService + { + private readonly ILogger _logger; + private readonly ApplicationPartManager _partManager; + + public ApplicationPartsLogger(ILogger logger, ApplicationPartManager partManager) + { + _logger = logger; + _partManager = partManager; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + // Get the names of all the application parts. This is the short assembly name for AssemblyParts + var applicationParts = _partManager.ApplicationParts.Select(x => x.Name); + + // Create a controller feature, and populate it from the application parts + var controllerFeature = new ControllerFeature(); + _partManager.PopulateFeature(controllerFeature); + + // Get the names of all of the controllers + var controllers = controllerFeature.Controllers.Select(x => x.Name); + + // Log the application parts and controllers + _logger.LogInformation("Found the following application parts: '{ApplicationParts}' with the following controllers: '{Controllers}'", + string.Join(", ", applicationParts), string.Join(", ", controllers)); + + return Task.CompletedTask; + } + + // Required by the interface + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; + } } \ No newline at end of file diff --git a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs new file mode 100644 index 000000000..cc8294943 --- /dev/null +++ b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs @@ -0,0 +1,83 @@ + +using HttpServer; +using HttpServer.FormDecoders; +using System.Collections.Specialized; +using System.Net; + +class LegacyHttpRequestShim : HttpServer.IHttpRequest +{ + public string[] AcceptTypes => throw new NotImplementedException(); + + public Stream Body { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public bool BodyIsComplete => throw new NotImplementedException(); + + public ConnectionType Connection { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public int ContentLength { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public RequestCookies Cookies => throw new NotImplementedException(); + + public HttpForm Form => throw new NotImplementedException(); + + public NameValueCollection Headers => throw new NotImplementedException(); + + public string HttpVersion { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public bool IsAjax => throw new NotImplementedException(); + + public string Method { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public HttpParam Param => throw new NotImplementedException(); + + public HttpInput QueryString => throw new NotImplementedException(); + + public bool Secure => throw new NotImplementedException(); + + public IPEndPoint RemoteEndPoint => throw new NotImplementedException(); + + public Uri Uri { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public string[] UriParts => throw new NotImplementedException(); + + public string UriPath { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public void AddHeader(string name, string value) + { + throw new NotImplementedException(); + } + + public int AddToBody(byte[] bytes, int offset, int length) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public object Clone() + { + throw new NotImplementedException(); + } + + public IHttpResponse CreateResponse(IHttpClientContext context) + { + throw new NotImplementedException(); + } + + public void DecodeBody(FormDecoderProvider providers) + { + throw new NotImplementedException(); + } + + public byte[] GetBody() + { + throw new NotImplementedException(); + } + + public void SetCookies(RequestCookies cookies) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs new file mode 100644 index 000000000..6eb909c7b --- /dev/null +++ b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs @@ -0,0 +1,61 @@ + +using HttpServer; +using HttpServer.FormDecoders; +using System.Collections.Specialized; +using System.Net; +using System.Text; + +class LegacyHttpResponseShim : HttpServer.IHttpResponse +{ + public Stream Body { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public string ProtocolVersion { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public bool Chunked { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public ConnectionType Connection { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public Encoding Encoding { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public int KeepAlive { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public HttpStatusCode Status { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public string Reason { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public long ContentLength { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public string ContentType { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public bool HeadersSent => throw new NotImplementedException(); + + public bool Sent => throw new NotImplementedException(); + + public ResponseCookies Cookies => throw new NotImplementedException(); + + public void AddHeader(string name, string value) + { + throw new NotImplementedException(); + } + + public void Redirect(Uri uri) + { + throw new NotImplementedException(); + } + + public void Redirect(string url) + { + throw new NotImplementedException(); + } + + public void Send() + { + throw new NotImplementedException(); + } + + public void SendBody(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + + public void SendBody(byte[] buffer) + { + throw new NotImplementedException(); + } + + public void SendHeaders() + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Duplicati/WebserverCore/LegacyHttpSessionShim.cs b/Duplicati/WebserverCore/LegacyHttpSessionShim.cs new file mode 100644 index 000000000..92b119d9f --- /dev/null +++ b/Duplicati/WebserverCore/LegacyHttpSessionShim.cs @@ -0,0 +1,37 @@ + +using HttpServer; +using HttpServer.FormDecoders; +using HttpServer.Sessions; +using System.Collections.Specialized; +using System.Net; +using System.Text; + +class LegacyHttpSessionShim : HttpServer.Sessions.IHttpSession +{ + public object this[string name] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public string Id => throw new NotImplementedException(); + + public DateTime Accessed { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + + public int Count => throw new NotImplementedException(); + + public IEnumerable Keys => throw new NotImplementedException(); + + public event HttpSessionClearedHandler BeforeClear; + + public void Clear() + { + throw new NotImplementedException(); + } + + public void Clear(bool expires) + { + throw new NotImplementedException(); + } + + public void Dispose() + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Duplicati/WebserverCore/RestHandlerCore.cs b/Duplicati/WebserverCore/RestHandlerCore.cs index 13d9189fb..7590c8af7 100644 --- a/Duplicati/WebserverCore/RestHandlerCore.cs +++ b/Duplicati/WebserverCore/RestHandlerCore.cs @@ -25,7 +25,7 @@ using System.Collections.Concurrent; using System.Net; using System.Reflection; -namespace Duplicati.WebserverCorer +namespace Duplicati.WebserverCore { public class RESTHandlerCoreController : Controller { @@ -36,8 +36,14 @@ namespace Duplicati.WebserverCorer public static IDictionary Modules { get { return _modules; } } - public RESTHandlerCoreController(List restMethods) + public RESTHandlerCoreController(IEnumerable restMethods) { + Console.WriteLine("Loaded controller!"); + foreach (var method in restMethods) + { + var t = method.GetType(); + _modules.Add(t.Name.ToLowerInvariant(), method); + } } [Route(API_URI_PATH + "/{module?}/{key?}")] @@ -51,6 +57,8 @@ namespace Duplicati.WebserverCorer var ci = ParseRequestCulture(Request.Headers.Accept); + var info = new RequestInfo(new LegacyHttpRequestShim(), new LegacyHttpResponseShim(), new LegacyHttpSessionShim()); + using (Library.Localization.LocalizationService.TemporaryContext(ci)) { try @@ -211,15 +219,15 @@ namespace Duplicati.WebserverCorer return builder; } - public static IEndpointRouteBuilder UseRESTHandlerEndpoints(this IEndpointRouteBuilder builder) - { - builder.MapFallback(async (HttpContext context) => { - await System.Threading.Tasks.Task.Delay(1); - context. - //TODO: Register controllers without this middleware ? - }); - return builder; - } + //public static IEndpointRouteBuilder UseRESTHandlerEndpoints(this IEndpointRouteBuilder builder) + //{ + // builder.MapFallback(async (HttpContext context) => { + // await System.Threading.Tasks.Task.Delay(1); + // // context. + // //TODO: Register controllers without this middleware ? + // }); + // return builder; + //} } } From c318c4300223fe83633f9c29c9d272df6c32283c Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 1 Mar 2023 21:47:31 -0800 Subject: [PATCH 245/253] Progress on implementing legacy webserver shims --- Duplicati/WebserverCore/DuplicatiWebserver.cs | 1 + Duplicati/WebserverCore/LegacyHttpRequestShim.cs | 13 +++++++++++-- Duplicati/WebserverCore/LegacyHttpResponseShim.cs | 11 +++++++---- Duplicati/WebserverCore/RestHandlerCore.cs | 3 ++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Duplicati/WebserverCore/DuplicatiWebserver.cs b/Duplicati/WebserverCore/DuplicatiWebserver.cs index 64425cf87..f4c576a69 100644 --- a/Duplicati/WebserverCore/DuplicatiWebserver.cs +++ b/Duplicati/WebserverCore/DuplicatiWebserver.cs @@ -19,6 +19,7 @@ namespace Duplicati.WebserverCore app.MapControllers(); + // Test http://127.0.0.1:3001/api/v1/Licenses app.RunAsync("http://localhost:3001"); return () => { app.StopAsync(); }; } diff --git a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs index cc8294943..3c13a4570 100644 --- a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs @@ -3,12 +3,16 @@ using HttpServer; using HttpServer.FormDecoders; using System.Collections.Specialized; using System.Net; +using HttpRequest = Microsoft.AspNetCore.Http.HttpRequest; class LegacyHttpRequestShim : HttpServer.IHttpRequest { + HttpRequest request; + public LegacyHttpRequestShim(HttpRequest request) { this.request = request; } + public string[] AcceptTypes => throw new NotImplementedException(); - public Stream Body { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public Stream Body { get => request.Body; set => throw new NotImplementedException(); } public bool BodyIsComplete => throw new NotImplementedException(); @@ -29,7 +33,12 @@ class LegacyHttpRequestShim : HttpServer.IHttpRequest public HttpParam Param => throw new NotImplementedException(); - public HttpInput QueryString => throw new NotImplementedException(); + public HttpInput QueryString { get { + var input = new HttpInput("QueryString"); + foreach (var kvp in request.Query ) { input.Add(kvp.Key, kvp.Value); } + return input; + } + } public bool Secure => throw new NotImplementedException(); diff --git a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs index 6eb909c7b..a9f4c633b 100644 --- a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs @@ -4,21 +4,24 @@ using HttpServer.FormDecoders; using System.Collections.Specialized; using System.Net; using System.Text; +using HttpResponse = Microsoft.AspNetCore.Http.HttpResponse; class LegacyHttpResponseShim : HttpServer.IHttpResponse { - public Stream Body { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + HttpResponse response; + public LegacyHttpResponseShim(HttpResponse response) { this.response = response; } + public Stream Body { get => response.Body; set => throw new NotImplementedException(); } public string ProtocolVersion { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public bool Chunked { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public ConnectionType Connection { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public Encoding Encoding { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public Encoding Encoding { get => Encoding.UTF8; set => throw new NotImplementedException(); } public int KeepAlive { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public HttpStatusCode Status { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public string Reason { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public long ContentLength { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public string ContentType { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public bool HeadersSent => throw new NotImplementedException(); + public bool HeadersSent => response.HasStarted; public bool Sent => throw new NotImplementedException(); @@ -26,7 +29,7 @@ class LegacyHttpResponseShim : HttpServer.IHttpResponse public void AddHeader(string name, string value) { - throw new NotImplementedException(); + response.Headers.Add(name, value); } public void Redirect(Uri uri) diff --git a/Duplicati/WebserverCore/RestHandlerCore.cs b/Duplicati/WebserverCore/RestHandlerCore.cs index 7590c8af7..a03f6e192 100644 --- a/Duplicati/WebserverCore/RestHandlerCore.cs +++ b/Duplicati/WebserverCore/RestHandlerCore.cs @@ -39,6 +39,7 @@ namespace Duplicati.WebserverCore public RESTHandlerCoreController(IEnumerable restMethods) { Console.WriteLine("Loaded controller!"); + //FIXME: Why no methods? foreach (var method in restMethods) { var t = method.GetType(); @@ -57,7 +58,7 @@ namespace Duplicati.WebserverCore var ci = ParseRequestCulture(Request.Headers.Accept); - var info = new RequestInfo(new LegacyHttpRequestShim(), new LegacyHttpResponseShim(), new LegacyHttpSessionShim()); + var info = new RequestInfo(new LegacyHttpRequestShim(Request), new LegacyHttpResponseShim(Response), new LegacyHttpSessionShim()); using (Library.Localization.LocalizationService.TemporaryContext(ci)) { From 006af8fd78db9d473a07891864f795e1c93fa484 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Mon, 13 Mar 2023 20:07:49 -0700 Subject: [PATCH 246/253] More services working (licenses, systeminfo, serverstate) --- .../WebServer/BodyWriter.cs | 92 ++++++++++++------- .../Serializer.cs | 19 ++++ .../WebserverCore/LegacyHttpRequestShim.cs | 27 +++++- .../WebserverCore/LegacyHttpResponseShim.cs | 8 +- Duplicati/WebserverCore/RestHandlerCore.cs | 11 +-- 5 files changed, 108 insertions(+), 49 deletions(-) diff --git a/Duplicati.Library.RestAPI/WebServer/BodyWriter.cs b/Duplicati.Library.RestAPI/WebServer/BodyWriter.cs index 0434bfe8a..7eb9bfc20 100644 --- a/Duplicati.Library.RestAPI/WebServer/BodyWriter.cs +++ b/Duplicati.Library.RestAPI/WebServer/BodyWriter.cs @@ -16,21 +16,18 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; +using System.Globalization; +using System.Threading.Tasks; using Duplicati.Server.Serialization; namespace Duplicati.Server.WebServer { - public class BodyWriter : System.IO.StreamWriter, IDisposable + public class BodyWriter : IDisposable, IAsyncDisposable { private readonly HttpServer.IHttpResponse m_resp; private readonly string m_jsonp; private static readonly object SUCCESS_RESPONSE = new { Status = "OK" }; - - // We override the format provider so all JSON output uses US format - public override IFormatProvider FormatProvider - { - get { return System.Globalization.CultureInfo.InvariantCulture; } - } + private readonly System.IO.StreamWriter m_bodyStreamWriter; public BodyWriter(HttpServer.IHttpResponse resp, HttpServer.IHttpRequest request) : this(resp, request.QueryString["jsonp"].Value) @@ -38,25 +35,13 @@ namespace Duplicati.Server.WebServer } public BodyWriter(HttpServer.IHttpResponse resp, string jsonp) - : base(resp.Body, resp.Encoding) { + m_bodyStreamWriter = new System.IO.StreamWriter(resp.Body, resp.Encoding); m_resp = resp; m_jsonp = jsonp; if (!m_resp.HeadersSent) m_resp.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); } - - protected override void Dispose (bool disposing) - { - if (!m_resp.HeadersSent) - { - base.Flush(); - m_resp.ContentLength = base.BaseStream.Length; - m_resp.Send(); - } - base.Dispose(disposing); - } - public void SetOK() { m_resp.Reason = "OK"; @@ -74,22 +59,61 @@ namespace Duplicati.Server.WebServer if (!m_resp.HeadersSent) m_resp.ContentType = "application/json"; - using(this) + Task.Run(async () => { + + if (!string.IsNullOrEmpty(m_jsonp)) + { + await m_bodyStreamWriter.WriteAsync(m_jsonp); + await m_bodyStreamWriter.WriteAsync('('); + } + + var oldCulture = CultureInfo.CurrentCulture; + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + await Serializer.SerializeJsonAsync(m_bodyStreamWriter, o, true); + CultureInfo.CurrentCulture = oldCulture; + + if (!string.IsNullOrEmpty(m_jsonp)) + { + await m_bodyStreamWriter.WriteAsync(')'); + await m_bodyStreamWriter.FlushAsync(); + } + }).GetAwaiter().GetResult(); + } + + public void Dispose() + { + Task.Run(async () => { + await DisposeAsync(); + }).GetAwaiter().GetResult(); + } + + private bool disposed = false; + public async ValueTask DisposeAsync() + { + if(disposed) return; + disposed = true; + + if (!m_resp.HeadersSent) { - if (!string.IsNullOrEmpty(m_jsonp)) - { - this.Write(m_jsonp); - this.Write('('); - } - - Serializer.SerializeJson(this, o, true); - - if (!string.IsNullOrEmpty(m_jsonp)) - { - this.Write(')'); - this.Flush(); - } + await m_bodyStreamWriter.FlushAsync(); + m_resp.ContentLength = m_bodyStreamWriter.BaseStream.Length; + m_resp.Send(); } + await m_bodyStreamWriter.DisposeAsync(); + } + + internal void Flush() + { + Task.Run(async () => { + await m_bodyStreamWriter.FlushAsync(); + }).GetAwaiter().GetResult(); + } + + internal void Write(string v) + { + Task.Run(async () => { + await m_bodyStreamWriter.WriteAsync(v); + }).GetAwaiter().GetResult(); } } diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Serializer.cs b/Duplicati/Server/Duplicati.Server.Serialization/Serializer.cs index 36eb7870c..f9a34216e 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Serializer.cs +++ b/Duplicati/Server/Duplicati.Server.Serialization/Serializer.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -39,6 +41,23 @@ namespace Duplicati.Server.Serialization } } + public static async Task SerializeJsonAsync(System.IO.TextWriter tw, object o, bool preventDispose = false) + { + Newtonsoft.Json.JsonSerializer jsonSerializer = Newtonsoft.Json.JsonSerializer.Create(m_jsonSettings); + StringBuilder sb = new StringBuilder(); + StringWriter sw = new StringWriter(sb); + var jsonWriter = new JsonTextWriter(sw); + using (preventDispose ? null : jsonWriter) + { + jsonWriter.Formatting = m_jsonFormatting; + jsonSerializer.Serialize(jsonWriter, o); + await jsonWriter.FlushAsync(); + } + await sw.FlushAsync(); + await tw.WriteAsync(sb.ToString()); + await tw.FlushAsync(); + } + public static T Deserialize(System.IO.TextReader sr) { Newtonsoft.Json.JsonSerializer jsonSerializer = Newtonsoft.Json.JsonSerializer.Create(m_jsonSettings); diff --git a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs index 3c13a4570..470ef82f6 100644 --- a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs @@ -23,21 +23,38 @@ class LegacyHttpRequestShim : HttpServer.IHttpRequest public HttpForm Form => throw new NotImplementedException(); - public NameValueCollection Headers => throw new NotImplementedException(); + public NameValueCollection Headers + { + get + { + var headers = new NameValueCollection(); + foreach (var pair in request.Headers) + { + foreach (var value in pair.Value) + { + headers.Add(pair.Key, value); + } + } + return headers; + } + } public string HttpVersion { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public bool IsAjax => throw new NotImplementedException(); - public string Method { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public string Method { get => request.Method; set => throw new NotImplementedException(); } public HttpParam Param => throw new NotImplementedException(); - public HttpInput QueryString { get { + public HttpInput QueryString + { + get + { var input = new HttpInput("QueryString"); - foreach (var kvp in request.Query ) { input.Add(kvp.Key, kvp.Value); } + foreach (var kvp in request.Query) { input.Add(kvp.Key, kvp.Value); } return input; - } + } } public bool Secure => throw new NotImplementedException(); diff --git a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs index a9f4c633b..acf6690ec 100644 --- a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs @@ -16,10 +16,10 @@ class LegacyHttpResponseShim : HttpServer.IHttpResponse public ConnectionType Connection { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public Encoding Encoding { get => Encoding.UTF8; set => throw new NotImplementedException(); } public int KeepAlive { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public HttpStatusCode Status { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public string Reason { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public HttpStatusCode Status { get => throw new NotImplementedException(); set => response.StatusCode = (int)value; } + public string Reason { get => throw new NotImplementedException(); set { /*NOP*/ } } public long ContentLength { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public string ContentType { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public string ContentType { get => throw new NotImplementedException(); set => response.ContentType = value; } public bool HeadersSent => response.HasStarted; @@ -44,7 +44,7 @@ class LegacyHttpResponseShim : HttpServer.IHttpResponse public void Send() { - throw new NotImplementedException(); + response.StartAsync(); } public void SendBody(byte[] buffer, int offset, int count) diff --git a/Duplicati/WebserverCore/RestHandlerCore.cs b/Duplicati/WebserverCore/RestHandlerCore.cs index a03f6e192..3c1d74290 100644 --- a/Duplicati/WebserverCore/RestHandlerCore.cs +++ b/Duplicati/WebserverCore/RestHandlerCore.cs @@ -24,6 +24,7 @@ using Org.BouncyCastle.Bcpg.Sig; using System.Collections.Concurrent; using System.Net; using System.Reflection; +using System.Xml.Linq; namespace Duplicati.WebserverCore { @@ -32,9 +33,7 @@ namespace Duplicati.WebserverCore public const string API_URI_PATH = "/api/v1"; public static readonly int API_URI_SEGMENTS = API_URI_PATH.Split(new char[] { '/' }).Length; - private static readonly Dictionary _modules = new Dictionary(StringComparer.OrdinalIgnoreCase); - - public static IDictionary Modules { get { return _modules; } } + private readonly Dictionary _modules = new Dictionary(StringComparer.OrdinalIgnoreCase); public RESTHandlerCoreController(IEnumerable restMethods) { @@ -49,7 +48,7 @@ namespace Duplicati.WebserverCore [Route(API_URI_PATH + "/{module?}/{key?}")] [AcceptVerbs("GET", "POST", "PUT", "DELETE", "PATCH")] - public async Task Index(string? module, string? key) + public async Task Index(string? module, string? key) { module = (module != null && module != "") ? module : "help"; @@ -142,7 +141,7 @@ namespace Duplicati.WebserverCore } } - return Ok(); + return null; } @@ -213,7 +212,7 @@ namespace Duplicati.WebserverCore { foreach (var t in lst) { - services.AddSingleton(t); + services.AddSingleton((IRESTMethod?)Activator.CreateInstance(t) ?? throw new NullReferenceException("RestMethod " + nameof(t) + " is null")); } }); From 238f1dd900abe784195f5b2768115627d61dbd60 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Tue, 14 Mar 2023 22:05:52 -0700 Subject: [PATCH 247/253] Initial static files support --- Duplicati/WebserverCore/DuplicatiWebserver.cs | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Duplicati/WebserverCore/DuplicatiWebserver.cs b/Duplicati/WebserverCore/DuplicatiWebserver.cs index f4c576a69..431bc085a 100644 --- a/Duplicati/WebserverCore/DuplicatiWebserver.cs +++ b/Duplicati/WebserverCore/DuplicatiWebserver.cs @@ -1,11 +1,13 @@ using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Controllers; +using Microsoft.Extensions.FileProviders; namespace Duplicati.WebserverCore { public class DuplicatiWebserver { - public Action Foo() { + public Action Foo() + { var builder = WebApplication.CreateBuilder(); builder.Host.UseRESTHandlers(); builder.Services.AddControllers() @@ -17,6 +19,26 @@ namespace Duplicati.WebserverCore //app.UseTestMiddleware(); //app.UseRESTHandlerEndpoints(); + + + string webroot = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + string install_webroot = System.IO.Path.Combine(Library.AutoUpdater.UpdaterManager.InstalledBaseDir, "webroot"); + webroot = System.IO.Path.Combine(webroot, "webroot"); + var webroot_fileprovider = new PhysicalFileProvider(webroot); + + // index.html + DefaultFilesOptions defaultFilesOptions = new DefaultFilesOptions(); + defaultFilesOptions.DefaultFileNames.Clear(); + defaultFilesOptions.DefaultFileNames.Add("index.html"); + defaultFilesOptions.FileProvider = webroot_fileprovider; + app.UseDefaultFiles(defaultFilesOptions); + + app.UseStaticFiles(new StaticFileOptions + { + FileProvider = webroot_fileprovider, + RequestPath = "" + }); + app.MapControllers(); // Test http://127.0.0.1:3001/api/v1/Licenses From f0e9257a62f20d5a24333eb3463e1ab0057fb48a Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 15 Mar 2023 22:02:53 -0700 Subject: [PATCH 248/253] Mostly working. runnow doesn't work --- .../RESTMethods/Backup.cs | 7 ++- .../RESTMethods/Backups.cs | 10 +++- .../RESTMethods/CommandLine.cs | 9 +++- .../RESTMethods/RemoteOperation.cs | 27 ++++++----- .../RESTMethods/ServerSettings.cs | 7 ++- .../WebserverCore/LegacyHttpRequestShim.cs | 46 ++++++++++++++++++- Duplicati/WebserverCore/RestHandlerCore.cs | 22 +++++---- 7 files changed, 100 insertions(+), 28 deletions(-) diff --git a/Duplicati.Library.RestAPI/RESTMethods/Backup.cs b/Duplicati.Library.RestAPI/RESTMethods/Backup.cs index 232c428a2..ff9d0b7af 100644 --- a/Duplicati.Library.RestAPI/RESTMethods/Backup.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Backup.cs @@ -540,7 +540,12 @@ namespace Duplicati.Server.WebServer.RESTMethods { string str = info.Request.Form["data"].Value; if (string.IsNullOrWhiteSpace(str)) - str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); + str = System.Threading.Tasks.Task.Run(async () => + { + using (var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) + + return await sr.ReadToEndAsync(); + }).GetAwaiter().GetResult(); if (string.IsNullOrWhiteSpace(str)) { diff --git a/Duplicati.Library.RestAPI/RESTMethods/Backups.cs b/Duplicati.Library.RestAPI/RESTMethods/Backups.cs index 3bcbfcce1..0323d7dab 100644 --- a/Duplicati.Library.RestAPI/RESTMethods/Backups.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/Backups.cs @@ -218,8 +218,14 @@ namespace Duplicati.Server.WebServer.RESTMethods try { var str = info.Request.Form["data"].Value; - if (string.IsNullOrWhiteSpace(str)) - str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); + if (string.IsNullOrWhiteSpace(str)) { + str = System.Threading.Tasks.Task.Run(async () => + { + using (var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) + + return await sr.ReadToEndAsync(); + }).GetAwaiter().GetResult(); + } data = Serializer.Deserialize(new StringReader(str)); if (data.Backup == null) diff --git a/Duplicati.Library.RestAPI/RESTMethods/CommandLine.cs b/Duplicati.Library.RestAPI/RESTMethods/CommandLine.cs index 3b2d6a28a..55c3e237f 100644 --- a/Duplicati.Library.RestAPI/RESTMethods/CommandLine.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/CommandLine.cs @@ -114,8 +114,13 @@ namespace Duplicati.Server.WebServer.RESTMethods if (string.IsNullOrWhiteSpace(key)) { string[] args; - using (var sr = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) - args = Newtonsoft.Json.JsonConvert.DeserializeObject(sr.ReadToEnd()); + var str = System.Threading.Tasks.Task.Run(async () => + { + using (var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) + + return await sr.ReadToEndAsync(); + }).GetAwaiter().GetResult(); + args = Newtonsoft.Json.JsonConvert.DeserializeObject(str); var k = new ActiveRun(); k.Writer = new LogWriter(k); diff --git a/Duplicati.Library.RestAPI/RESTMethods/RemoteOperation.cs b/Duplicati.Library.RestAPI/RESTMethods/RemoteOperation.cs index 7f165af89..90112a292 100644 --- a/Duplicati.Library.RestAPI/RESTMethods/RemoteOperation.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/RemoteOperation.cs @@ -26,7 +26,8 @@ namespace Duplicati.Server.WebServer.RESTMethods private void LocateDbUri(string uri, RequestInfo info) { var path = Library.Main.DatabaseLocator.GetDatabasePath(uri, null, false, false); - info.OutputOK(new { + info.OutputOK(new + { Exists = !string.IsNullOrWhiteSpace(path), Path = path }); @@ -34,7 +35,7 @@ namespace Duplicati.Server.WebServer.RESTMethods private void CreateFolder(string uri, RequestInfo info) { - using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) + using (var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) b.CreateFolder(); info.OutputOK(); @@ -45,10 +46,10 @@ namespace Duplicati.Server.WebServer.RESTMethods var data = info.Request.QueryString["data"].Value; var remotename = info.Request.QueryString["filename"].Value; - using(var ms = new System.IO.MemoryStream()) - using(var b = Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) + using (var ms = new System.IO.MemoryStream()) + using (var b = Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) { - using(var tf = new Library.Utility.TempFile()) + using (var tf = new Library.Utility.TempFile()) { System.IO.File.WriteAllText(tf, data); b.PutAsync(remotename, tf, CancellationToken.None).Wait(); @@ -60,16 +61,16 @@ namespace Duplicati.Server.WebServer.RESTMethods private void ListFolder(string uri, RequestInfo info) { - using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) + using (var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(uri, new Dictionary())) info.OutputOK(b.List()); } private void TestConnection(string url, RequestInfo info) { - + var modules = (from n in Library.DynamicLoader.GenericLoader.Modules - where n is Library.Interface.IConnectionModule - select n).ToArray(); + where n is Library.Interface.IConnectionModule + select n).ToArray(); try { @@ -155,10 +156,12 @@ namespace Duplicati.Server.WebServer.RESTMethods public void POST(string key, RequestInfo info) { - string url; + string url = System.Threading.Tasks.Task.Run(async () => + { + using (var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) - using(var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) - url = sr.ReadToEnd(); + return await sr.ReadToEndAsync(); + }).GetAwaiter().GetResult(); switch (key) { diff --git a/Duplicati.Library.RestAPI/RESTMethods/ServerSettings.cs b/Duplicati.Library.RestAPI/RESTMethods/ServerSettings.cs index 093e0e6d2..118442d6e 100644 --- a/Duplicati.Library.RestAPI/RESTMethods/ServerSettings.cs +++ b/Duplicati.Library.RestAPI/RESTMethods/ServerSettings.cs @@ -53,7 +53,12 @@ namespace Duplicati.Server.WebServer.RESTMethods string str = info.Request.Form["data"].Value; if (string.IsNullOrWhiteSpace(str)) - str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); + str = System.Threading.Tasks.Task.Run(async () => + { + using (var sr = new System.IO.StreamReader(info.Request.Body, System.Text.Encoding.UTF8, true)) + + return await sr.ReadToEndAsync(); + }).GetAwaiter().GetResult(); if (string.IsNullOrWhiteSpace(str)) { diff --git a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs index 470ef82f6..db74be3c6 100644 --- a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs @@ -1,8 +1,12 @@ +using Duplicati.Library.Utility; using HttpServer; using HttpServer.FormDecoders; +using System; using System.Collections.Specialized; +using System.Globalization; using System.Net; +using System.Xml.Linq; using HttpRequest = Microsoft.AspNetCore.Http.HttpRequest; class LegacyHttpRequestShim : HttpServer.IHttpRequest @@ -21,7 +25,45 @@ class LegacyHttpRequestShim : HttpServer.IHttpRequest public RequestCookies Cookies => throw new NotImplementedException(); - public HttpForm Form => throw new NotImplementedException(); + public HttpForm Form + { + get + { + var form = new HttpForm(); + + if (request.ContentType.StartsWith("multipart/form-data", true, CultureInfo.InvariantCulture) || request.ContentType.StartsWith("application/x-www-form-urlencoded", true, CultureInfo.InvariantCulture) ) + { + + foreach (var kvp in request.Form) + { + form.Add(kvp.Key, kvp.Value); + } + + //Files + foreach (var file in request.Form.Files) + { + // Generate a temp file *CRY* I can't believe duplicati did this + string path = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "HttpServer"); + string tempFile = Path.Combine(path, Math.Abs(file.FileName.GetHashCode()) + ".tmp"); + + // If the file exists generate a new filename + while (File.Exists(tempFile)) + tempFile = Path.Combine(path, Math.Abs(file.FileName.GetHashCode() + 1) + ".tmp"); + + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + using (var memoryStream = new MemoryStream()) + { + file.CopyTo(memoryStream); + File.WriteAllBytes(tempFile, memoryStream.ToArray()); + } + + form.AddFile(new HttpFile(file.Name, tempFile, file.ContentType, file.FileName)); + } + } + return form; + } + } public NameValueCollection Headers { @@ -61,7 +103,7 @@ class LegacyHttpRequestShim : HttpServer.IHttpRequest public IPEndPoint RemoteEndPoint => throw new NotImplementedException(); - public Uri Uri { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public System.Uri Uri { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public string[] UriParts => throw new NotImplementedException(); diff --git a/Duplicati/WebserverCore/RestHandlerCore.cs b/Duplicati/WebserverCore/RestHandlerCore.cs index 3c1d74290..02d013d5f 100644 --- a/Duplicati/WebserverCore/RestHandlerCore.cs +++ b/Duplicati/WebserverCore/RestHandlerCore.cs @@ -24,6 +24,7 @@ using Org.BouncyCastle.Bcpg.Sig; using System.Collections.Concurrent; using System.Net; using System.Reflection; +using System.Text; using System.Xml.Linq; namespace Duplicati.WebserverCore @@ -48,7 +49,7 @@ namespace Duplicati.WebserverCore [Route(API_URI_PATH + "/{module?}/{key?}")] [AcceptVerbs("GET", "POST", "PUT", "DELETE", "PATCH")] - public async Task Index(string? module, string? key) + public async System.Threading.Tasks.Task Index(string? module, string? key) { module = (module != null && module != "") ? module : "help"; @@ -71,7 +72,9 @@ namespace Duplicati.WebserverCore if (mod == null) { - return NotFound("No such module"); + Response.StatusCode = (int)HttpStatusCode.NotFound; + await Response.Body.WriteAsync(Encoding.UTF8.GetBytes("No such module")); + return; } else if (method == "GET" && mod is IRESTMethodGET get) { @@ -114,7 +117,9 @@ namespace Duplicati.WebserverCore patch.PATCH(key, info); else { - return StatusCode( (int)HttpStatusCode.MethodNotAllowed, "Method is not allowed"); + Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed; + await Response.Body.WriteAsync(Encoding.UTF8.GetBytes("Method is not allowed")); + return; } } catch (Exception ex) @@ -125,14 +130,17 @@ namespace Duplicati.WebserverCore try { var wex = ex; - while (wex is System.Reflection.TargetInvocationException && wex.InnerException != wex) + while (wex is System.Reflection.TargetInvocationException && wex.InnerException != wex && wex.InnerException != null) wex = wex.InnerException; - return StatusCode(500, wex.Message + Response.StatusCode = (int)HttpStatusCode.InternalServerError; + await Response.Body.WriteAsync(Encoding.UTF8.GetBytes( + wex.Message #if DEBUG + "\n" + wex.StackTrace #endif - ); + )); + return; } catch (Exception flex) { @@ -140,8 +148,6 @@ namespace Duplicati.WebserverCore } } } - - return null; } From 97862fbeec0a598117d7e3fd851a5c23545c729e Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 3 May 2023 21:10:19 -0700 Subject: [PATCH 249/253] Fix potential duplicate header crash and handling of the url slug Fixes the run now link on a backup job --- Duplicati/WebserverCore/LegacyHttpResponseShim.cs | 4 ++++ Duplicati/WebserverCore/RestHandlerCore.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs index acf6690ec..6e5064d5e 100644 --- a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs @@ -29,6 +29,10 @@ class LegacyHttpResponseShim : HttpServer.IHttpResponse public void AddHeader(string name, string value) { + if (response.Headers.ContainsKey(name)) + { + response.Headers.Remove(name); + } response.Headers.Add(name, value); } diff --git a/Duplicati/WebserverCore/RestHandlerCore.cs b/Duplicati/WebserverCore/RestHandlerCore.cs index 02d013d5f..b6f57ec1e 100644 --- a/Duplicati/WebserverCore/RestHandlerCore.cs +++ b/Duplicati/WebserverCore/RestHandlerCore.cs @@ -47,7 +47,7 @@ namespace Duplicati.WebserverCore } } - [Route(API_URI_PATH + "/{module?}/{key?}")] + [Route(API_URI_PATH + "/{module?}/{**key}")] [AcceptVerbs("GET", "POST", "PUT", "DELETE", "PATCH")] public async System.Threading.Tasks.Task Index(string? module, string? key) { From ab3a0f58f1bb4dd76af0d60f834cf6d380ba3619 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Wed, 3 May 2023 21:54:11 -0700 Subject: [PATCH 250/253] Implement AuthHandler in Kestrel --- .../WebServer/AuthenticationHandler.cs | 2 +- Duplicati/WebserverCore/AuthMiddleware.cs | 38 +++++++++++++++++++ Duplicati/WebserverCore/DuplicatiWebserver.cs | 5 +-- .../WebserverCore/LegacyHttpRequestShim.cs | 7 ++-- .../WebserverCore/LegacyHttpResponseShim.cs | 7 +++- Duplicati/WebserverCore/TestMiddleware.cs | 37 ------------------ 6 files changed, 50 insertions(+), 46 deletions(-) create mode 100644 Duplicati/WebserverCore/AuthMiddleware.cs delete mode 100644 Duplicati/WebserverCore/TestMiddleware.cs diff --git a/Duplicati.Library.RestAPI/WebServer/AuthenticationHandler.cs b/Duplicati.Library.RestAPI/WebServer/AuthenticationHandler.cs index 3dd26011d..ba6fd921b 100644 --- a/Duplicati.Library.RestAPI/WebServer/AuthenticationHandler.cs +++ b/Duplicati.Library.RestAPI/WebServer/AuthenticationHandler.cs @@ -25,7 +25,7 @@ using Duplicati.Library.RestAPI; namespace Duplicati.Server.WebServer { - internal class AuthenticationHandler : HttpModule + public class AuthenticationHandler : HttpModule { private const string AUTH_COOKIE_NAME = "session-auth"; private const string NONCE_COOKIE_NAME = "session-nonce"; diff --git a/Duplicati/WebserverCore/AuthMiddleware.cs b/Duplicati/WebserverCore/AuthMiddleware.cs new file mode 100644 index 000000000..9aaae10e6 --- /dev/null +++ b/Duplicati/WebserverCore/AuthMiddleware.cs @@ -0,0 +1,38 @@ + +namespace Duplicati.WebserverCore +{ + public class AuthMiddleware + { + private readonly RequestDelegate _next; + private readonly Server.WebServer.AuthenticationHandler _authHandler = new(); + + public AuthMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + var info = new Server.WebServer.RESTMethods.RequestInfo(new LegacyHttpRequestShim(context.Request), new LegacyHttpResponseShim(context.Response), new LegacyHttpSessionShim()); + + if (!_authHandler.Process(info.Request, info.Response, info.Session)) + { + // Call the next delegate/middleware in the pipeline. + await _next(context); + } + else + { + info.Response.Send(); + } + } + } + + public static class AuthMiddlewareExtensions + { + public static IApplicationBuilder UseAuthMiddleware( + this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } + } +} \ No newline at end of file diff --git a/Duplicati/WebserverCore/DuplicatiWebserver.cs b/Duplicati/WebserverCore/DuplicatiWebserver.cs index 431bc085a..ca227d420 100644 --- a/Duplicati/WebserverCore/DuplicatiWebserver.cs +++ b/Duplicati/WebserverCore/DuplicatiWebserver.cs @@ -15,10 +15,7 @@ namespace Duplicati.WebserverCore .AddApplicationPart(this.GetType().Assembly); builder.Services.AddHostedService(); var app = builder.Build(); - - //app.UseTestMiddleware(); - //app.UseRESTHandlerEndpoints(); - + app.UseAuthMiddleware(); string webroot = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); diff --git a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs index db74be3c6..381e1be3f 100644 --- a/Duplicati/WebserverCore/LegacyHttpRequestShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpRequestShim.cs @@ -2,6 +2,7 @@ using Duplicati.Library.Utility; using HttpServer; using HttpServer.FormDecoders; +using Microsoft.AspNetCore.Http.Extensions; using System; using System.Collections.Specialized; using System.Globalization; @@ -23,7 +24,7 @@ class LegacyHttpRequestShim : HttpServer.IHttpRequest public ConnectionType Connection { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } public int ContentLength { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public RequestCookies Cookies => throw new NotImplementedException(); + public RequestCookies Cookies => new RequestCookies(request.Headers.Cookie); public HttpForm Form { @@ -31,7 +32,7 @@ class LegacyHttpRequestShim : HttpServer.IHttpRequest { var form = new HttpForm(); - if (request.ContentType.StartsWith("multipart/form-data", true, CultureInfo.InvariantCulture) || request.ContentType.StartsWith("application/x-www-form-urlencoded", true, CultureInfo.InvariantCulture) ) + if (request.ContentType != null && (request.ContentType.StartsWith("multipart/form-data", true, CultureInfo.InvariantCulture) || request.ContentType.StartsWith("application/x-www-form-urlencoded", true, CultureInfo.InvariantCulture) )) { foreach (var kvp in request.Form) @@ -103,7 +104,7 @@ class LegacyHttpRequestShim : HttpServer.IHttpRequest public IPEndPoint RemoteEndPoint => throw new NotImplementedException(); - public System.Uri Uri { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } + public System.Uri Uri { get => new System.Uri(request.GetEncodedUrl()); set => throw new NotImplementedException(); } public string[] UriParts => throw new NotImplementedException(); diff --git a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs index 6e5064d5e..873c7ccb9 100644 --- a/Duplicati/WebserverCore/LegacyHttpResponseShim.cs +++ b/Duplicati/WebserverCore/LegacyHttpResponseShim.cs @@ -9,6 +9,7 @@ using HttpResponse = Microsoft.AspNetCore.Http.HttpResponse; class LegacyHttpResponseShim : HttpServer.IHttpResponse { HttpResponse response; + ResponseCookies cookies = new(); public LegacyHttpResponseShim(HttpResponse response) { this.response = response; } public Stream Body { get => response.Body; set => throw new NotImplementedException(); } public string ProtocolVersion { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } @@ -25,7 +26,7 @@ class LegacyHttpResponseShim : HttpServer.IHttpResponse public bool Sent => throw new NotImplementedException(); - public ResponseCookies Cookies => throw new NotImplementedException(); + public ResponseCookies Cookies => cookies; public void AddHeader(string name, string value) { @@ -48,6 +49,10 @@ class LegacyHttpResponseShim : HttpServer.IHttpResponse public void Send() { + foreach(ResponseCookie cookie in cookies) + { + response.Cookies.Append(cookie.Name, cookie.Value, new CookieOptions() { Expires = cookie.Expires, Path = cookie.Path, IsEssential=true }) ; + } response.StartAsync(); } diff --git a/Duplicati/WebserverCore/TestMiddleware.cs b/Duplicati/WebserverCore/TestMiddleware.cs deleted file mode 100644 index 04c8a9246..000000000 --- a/Duplicati/WebserverCore/TestMiddleware.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Globalization; -namespace Duplicati.WebserverCore -{ - public class TestMiddleware - { - private readonly RequestDelegate _next; - - public TestMiddleware(RequestDelegate next) - { - _next = next; - } - - public async Task InvokeAsync(HttpContext context) - { - var cultureQuery = context.Request.Query["culture"]; - if (!string.IsNullOrWhiteSpace(cultureQuery)) - { - var culture = new CultureInfo(cultureQuery); - - CultureInfo.CurrentCulture = culture; - CultureInfo.CurrentUICulture = culture; - } - - // Call the next delegate/middleware in the pipeline. - await _next(context); - } - } - - public static class TestMiddlewareExtensions - { - public static IApplicationBuilder UseTestMiddleware( - this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } - } -} \ No newline at end of file From 65e907d79fec2098e66728fadc05aa40aecfe2c4 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Thu, 29 Feb 2024 22:06:45 -0800 Subject: [PATCH 251/253] Fix release build dependancy problem --- Duplicati.Library.RestAPI/WebServer/Server.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Duplicati.Library.RestAPI/WebServer/Server.cs b/Duplicati.Library.RestAPI/WebServer/Server.cs index 6ea669629..c8e4408f3 100644 --- a/Duplicati.Library.RestAPI/WebServer/Server.cs +++ b/Duplicati.Library.RestAPI/WebServer/Server.cs @@ -264,7 +264,7 @@ namespace Duplicati.Server.WebServer ( userroot.StartsWith(Util.AppendDirSeparator(System.Reflection.Assembly.GetExecutingAssembly().Location), Library.Utility.Utility.ClientFilenameStringComparison) || - userroot.StartsWith(Util.AppendDirSeparator(Program.StartupPath), Library.Utility.Utility.ClientFilenameStringComparison) + userroot.StartsWith(Util.AppendDirSeparator(Duplicati.Library.AutoUpdater.UpdaterManager.InstalledBaseDir), Library.Utility.Utility.ClientFilenameStringComparison) ) ) #endif From bc5f17ebf17727260f59d97cb6ca8e7896d25068 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 1 Mar 2024 21:57:36 -0800 Subject: [PATCH 252/253] Try fix mac build --- .../GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 2 +- Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 12251c2f3..84c825128 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -43,7 +43,7 @@ ..\..\..\thirdparty\MonoMac\MonoMac.dll - + CocoaRunner.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs index 856f146a7..d6b8c84e4 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs @@ -335,7 +335,7 @@ namespace Duplicati.GUI.TrayIcon #endif [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetCocoaRunnerInstance() { -#if XAMARIN_MAC +#if XAMARIN_MAC && !__LEGACY_TOOLKITS__ return new CocoaRunner(); #else throw new UserInformationException("Xamarin.Mac framework not found", "TrayIconMissingXamarinMac"); From 4f577c65a4d8806f79637c50c21ca3a683c5a07a Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 1 Mar 2024 22:27:03 -0800 Subject: [PATCH 253/253] Fix backward logic to try to fix mac build --- .../GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj | 2 +- Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj index 84c825128..769ad0624 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Duplicati.GUI.TrayIcon.csproj @@ -43,7 +43,7 @@ ..\..\..\thirdparty\MonoMac\MonoMac.dll - + CocoaRunner.cs diff --git a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs index d6b8c84e4..7fba3811d 100644 --- a/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs +++ b/Duplicati/GUI/Duplicati.GUI.TrayIcon/Program.cs @@ -335,7 +335,7 @@ namespace Duplicati.GUI.TrayIcon #endif [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static TrayIconBase GetCocoaRunnerInstance() { -#if XAMARIN_MAC && !__LEGACY_TOOLKITS__ +#if XAMARIN_MAC && __LEGACY_TOOLKITS__ return new CocoaRunner(); #else throw new UserInformationException("Xamarin.Mac framework not found", "TrayIconMissingXamarinMac");