diff --git a/Duplicati/Library/DynamicLoader/SourceProviderLoader.cs b/Duplicati/Library/DynamicLoader/SourceProviderLoader.cs
index 26382353f..d7667b325 100644
--- a/Duplicati/Library/DynamicLoader/SourceProviderLoader.cs
+++ b/Duplicati/Library/DynamicLoader/SourceProviderLoader.cs
@@ -168,28 +168,6 @@ namespace Duplicati.Library.DynamicLoader
return commands;
}
- ///
- /// Instanciates a specific SourceProvider, given the url and options
- ///
- /// The url to create the instance for
- /// The mount point to use
- /// The options to pass to the instance constructor
- /// The cancellation token
- /// The instanciated SourceProvider or null if the url is not supported
- public static Task GetSourceProvider(string url, string mountPoint, Dictionary options, CancellationToken cancellationToken)
- => GetSourceProvider(url, mountPoint, options, false, cancellationToken);
-
- ///
- /// Instanciates a specific SourceProvider for testing, given the url and options
- ///
- /// The url to create the instance for
- /// The mount point to use
- /// The options to pass to the instance constructor
- /// The cancellation token
- /// The instanciated SourceProvider or null if the url is not supported
- public static Task GetSourceProviderForTesting(string url, string mountPoint, Dictionary options, CancellationToken cancellationToken)
- => GetSourceProvider(url, mountPoint, options, true, cancellationToken);
-
///
/// Instanciates a specific SourceProvider, given the url and options
///
@@ -199,7 +177,7 @@ namespace Duplicati.Library.DynamicLoader
/// Whether the SourceProvider is requested for testing purposes
/// The cancellation token
/// The instanciated SourceProvider or null if the url is not supported
- private static async Task GetSourceProvider(string url, string mountPoint, Dictionary options, bool getForTesting, CancellationToken cancellationToken)
+ public static async Task GetSourceProvider(string url, string mountPoint, Dictionary options, CancellationToken cancellationToken)
{
// Source providers are preferred over backends
var provider = _SourceProviderLoader.GetSourceProvider(url, mountPoint, options);
@@ -218,9 +196,7 @@ namespace Duplicati.Library.DynamicLoader
try
{
- // In test mode, we do not initialize the provider
- if (!getForTesting)
- await provider.InitializeAsync(cancellationToken).ConfigureAwait(false);
+ await provider.InitializeAsync(cancellationToken).ConfigureAwait(false);
return provider;
}
catch
diff --git a/Duplicati/WebserverCore/Endpoints/Shared/SharedRemoteOperation.cs b/Duplicati/WebserverCore/Endpoints/Shared/SharedRemoteOperation.cs
index 0fea5b909..5460b60ba 100644
--- a/Duplicati/WebserverCore/Endpoints/Shared/SharedRemoteOperation.cs
+++ b/Duplicati/WebserverCore/Endpoints/Shared/SharedRemoteOperation.cs
@@ -127,8 +127,10 @@ public class SharedRemoteOperation
public static async Task GetSourceProviderForTestingAsync(Connection connection, IApplicationSettings applicationSettings, string url, string? additionalPath, string? backupId, long connectionStringId, string? sourcePrefix, CancellationToken cancelToken)
{
(url, var opts) = await ExpandUrlAsync(connection, applicationSettings, url, backupId, connectionStringId, sourcePrefix, cancelToken);
+ // Prevent the source provider from rejecting requests when we are simply testing
+ opts["store-metadata-content-in-database"] = "true";
var modules = ConfigureModules(opts);
- var sourceProvider = await Library.DynamicLoader.SourceProviderLoader.GetSourceProviderForTesting(AppendAdditionalPath(url, additionalPath), "", opts, cancelToken);
+ var sourceProvider = await Library.DynamicLoader.SourceProviderLoader.GetSourceProvider(AppendAdditionalPath(url, additionalPath), "", opts, cancelToken);
return new SourceProviderTupleDisposeWrapper(sourceProvider, modules);
}
diff --git a/Duplicati/WebserverCore/Endpoints/V1/WebModules.cs b/Duplicati/WebserverCore/Endpoints/V1/WebModules.cs
index 763949b8d..154fdf937 100644
--- a/Duplicati/WebserverCore/Endpoints/V1/WebModules.cs
+++ b/Duplicati/WebserverCore/Endpoints/V1/WebModules.cs
@@ -19,7 +19,6 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using Duplicati.Library.Interface;
-using Duplicati.Library.Main;
using Duplicati.Server;
using Duplicati.Server.Database;
using Duplicati.WebserverCore.Abstractions;
@@ -61,10 +60,20 @@ public record WebModules : IEndpointV1
options[k] = opts[k];
}
- return new Dto.WebModuleOutputDto(
- Status: "OK",
- Result: await m.Execute(options, cancellationToken).ConfigureAwait(false)
- );
+ try
+ {
+ return new Dto.WebModuleOutputDto(
+ Status: "OK",
+ Result: await m.Execute(options, cancellationToken).ConfigureAwait(false)
+ );
+ }
+ catch (Exception ex)
+ {
+ return new Dto.WebModuleOutputDto(
+ Status: "FAILED",
+ Result: new Dictionary { { "error", ex.Message } }
+ );
+ }
}
}
diff --git a/proprietary/GoogleWorkspace/APIHelper.cs b/proprietary/GoogleWorkspace/APIHelper.cs
index 034ede472..73b09fdf5 100644
--- a/proprietary/GoogleWorkspace/APIHelper.cs
+++ b/proprietary/GoogleWorkspace/APIHelper.cs
@@ -99,8 +99,8 @@ public class APIHelper
else
{
// Test connection by getting the Gmail service
- var gmailService = GetGmailService("me");
- gmailService.Users.GetProfile("me").Execute();
+ var gmailService = GetGmailService(_adminEmail ?? "me");
+ gmailService.Users.GetProfile(_adminEmail ?? "me").Execute();
}
}
public GmailService GetGmailService(string userId)
diff --git a/proprietary/GoogleWorkspace/WebModule/WebModule.cs b/proprietary/GoogleWorkspace/WebModule/WebModule.cs
index 2cba7fd31..0ef5e7a45 100644
--- a/proprietary/GoogleWorkspace/WebModule/WebModule.cs
+++ b/proprietary/GoogleWorkspace/WebModule/WebModule.cs
@@ -94,7 +94,7 @@ public class WebModule : IWebModule
foreach (var key in uri.QueryParameters.AllKeys)
forwardoptions[key!] = uri.QueryParameters[key];
- using var client = new SourceProvider(url, "", forwardoptions, true);
+ using var client = new SourceProvider(url, "", forwardoptions, false);
await client.InitializeAsync(cancellationToken);
var targetEntry = await client.GetEntryAsync((path ?? "").TrimStart('/'), isFolder: true, cancellationToken).ConfigureAwait(false);