diff --git a/Duplicati/Server/Database/Backup.cs b/Duplicati/Server/Database/Backup.cs index c3808c004..269c11e60 100644 --- a/Duplicati/Server/Database/Backup.cs +++ b/Duplicati/Server/Database/Backup.cs @@ -18,6 +18,7 @@ using System; using Duplicati.Server.Serialization.Interface; using System.Collections.Generic; +using System.Text.RegularExpressions; namespace Duplicati.Server.Database { @@ -65,7 +66,7 @@ namespace Duplicati.Server.Database /// public string[] Tags { get; set; } /// - /// The backup target url, excluding username/password + /// The backup target url /// public string TargetURL { get; set; } /// @@ -98,6 +99,24 @@ namespace Duplicati.Server.Database /// public bool IsTemporary { get { return ID == null ? false : ID.IndexOf("-", StringComparison.Ordinal) > 0; } } + /// + /// Sanitizes the backup TargetUrl + /// + public void SanitizeTargetUrl() + { + var url = this.TargetURL; + // Remove authid + url = Regex.Replace(url, "(!?authid)=[^&\n]+[&]?", ""); + // remove auth-password + url = Regex.Replace(url, "(!?auth-password)=[^&\n]+[&]?", ""); + // Remove edge case of '?&' + url = Regex.Replace(url, Regex.Escape("?&"), ""); + // Remove edge case of '&' at end of line + url = Regex.Replace(url, "&$", ""); + // Remove edge case of '?' at end of line + url = Regex.Replace(url, Regex.Escape("?"), ""); + this.TargetURL = url; + } } } diff --git a/Duplicati/Server/Duplicati.Server.Serialization/Interface/IBackup.cs b/Duplicati/Server/Duplicati.Server.Serialization/Interface/IBackup.cs index e54ed5a9e..1330332d6 100644 --- a/Duplicati/Server/Duplicati.Server.Serialization/Interface/IBackup.cs +++ b/Duplicati/Server/Duplicati.Server.Serialization/Interface/IBackup.cs @@ -42,7 +42,7 @@ namespace Duplicati.Server.Serialization.Interface /// string[] Tags { get; set; } /// - /// The backup target url, excluding username/password + /// The backup target url /// string TargetURL { get; set; } /// @@ -74,6 +74,8 @@ namespace Duplicati.Server.Serialization.Interface /// Gets a value indicating if this instance is not persisted to the database /// bool IsTemporary { get; } + + void SanitizeTargetUrl(); } } diff --git a/Duplicati/Server/WebServer/RESTMethods/Backup.cs b/Duplicati/Server/WebServer/RESTMethods/Backup.cs index 0d73c8077..7ad204990 100644 --- a/Duplicati/Server/WebServer/RESTMethods/Backup.cs +++ b/Duplicati/Server/WebServer/RESTMethods/Backup.cs @@ -125,6 +125,7 @@ namespace Duplicati.Server.WebServer.RESTMethods if (!exportPasswords) { backup.Settings = (Duplicati.Server.Serialization.Interface.ISetting[])backup.Settings.Where((setting) => !passwordFields.Contains(setting.Name)).ToArray(); + backup.SanitizeTargetUrl(); } if (cmdline)