From e4cd8a3fd82cac3bf10b330c3895f76b43ac481e Mon Sep 17 00:00:00 2001 From: Mark Junker Date: Wed, 1 Dec 2021 04:55:14 +0100 Subject: [PATCH] Use the URI comparer to fix #35 --- .../WebDavServicesExtensions.cs | 1 + .../Handlers/Impl/CopyHandler.cs | 12 ++++++++++-- .../Handlers/Impl/CopyMoveHandlerBase.cs | 9 +++++++-- .../Handlers/Impl/MoveHandler.cs | 12 ++++++++++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/FubarDev.WebDavServer.AspNetCore/WebDavServicesExtensions.cs b/src/FubarDev.WebDavServer.AspNetCore/WebDavServicesExtensions.cs index 0d73917b..2c31d350 100644 --- a/src/FubarDev.WebDavServer.AspNetCore/WebDavServicesExtensions.cs +++ b/src/FubarDev.WebDavServer.AspNetCore/WebDavServicesExtensions.cs @@ -76,6 +76,7 @@ public static IServiceCollection AddWebDav( services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); + services.TryAddScoped(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); diff --git a/src/FubarDev.WebDavServer/Handlers/Impl/CopyHandler.cs b/src/FubarDev.WebDavServer/Handlers/Impl/CopyHandler.cs index e2afc9b5..ac21b868 100644 --- a/src/FubarDev.WebDavServer/Handlers/Impl/CopyHandler.cs +++ b/src/FubarDev.WebDavServer/Handlers/Impl/CopyHandler.cs @@ -39,6 +39,7 @@ public class CopyHandler : CopyMoveHandlerBase, ICopyHandler /// Options for the compatibility with the litmus tool. /// The logger for this handler. /// The service provider used to lazily query the implementation. + /// The comparer for URIs. public CopyHandler( IFileSystem rootFileSystem, IWebDavContextAccessor contextAccessor, @@ -46,8 +47,15 @@ public CopyHandler( IOptions options, IOptions litmusCompatibilityOptions, ILogger logger, - IServiceProvider serviceProvider) - : base(rootFileSystem, contextAccessor, implicitLockFactory, litmusCompatibilityOptions, logger) + IServiceProvider serviceProvider, + IUriComparer? uriComparer = default) + : base( + rootFileSystem, + contextAccessor, + implicitLockFactory, + litmusCompatibilityOptions, + logger, + uriComparer) { _serviceProvider = serviceProvider; _options = options.Value; diff --git a/src/FubarDev.WebDavServer/Handlers/Impl/CopyMoveHandlerBase.cs b/src/FubarDev.WebDavServer/Handlers/Impl/CopyMoveHandlerBase.cs index 3c174c2a..016ab1cc 100644 --- a/src/FubarDev.WebDavServer/Handlers/Impl/CopyMoveHandlerBase.cs +++ b/src/FubarDev.WebDavServer/Handlers/Impl/CopyMoveHandlerBase.cs @@ -32,6 +32,7 @@ public abstract class CopyMoveHandlerBase private readonly IWebDavContextAccessor _contextAccessor; private readonly IImplicitLockFactory _implicitLockFactory; + private readonly IUriComparer? _uriComparer; private readonly LitmusCompatibilityOptions _litmusCompatibilityOptions; @@ -43,16 +44,19 @@ public abstract class CopyMoveHandlerBase /// A factory to create implicit locks. /// Options for the compatibility with the litmus tool. /// The logger to use (either for COPY or MOVE). + /// The comparer for URIs. protected CopyMoveHandlerBase( IFileSystem rootFileSystem, IWebDavContextAccessor contextAccessor, IImplicitLockFactory implicitLockFactory, IOptions litmusCompatibilityOptions, - ILogger logger) + ILogger logger, + IUriComparer? uriComparer = null) { _rootFileSystem = rootFileSystem; _contextAccessor = contextAccessor; _implicitLockFactory = implicitLockFactory; + _uriComparer = uriComparer; _litmusCompatibilityOptions = litmusCompatibilityOptions.Value; Logger = logger; } @@ -132,9 +136,10 @@ await WebDavContext.RequestHeaders { var sourceUrl = WebDavContext.PublicAbsoluteRequestUrl; var destinationUrl = new Uri(sourceUrl, destination); + var uriComparer = _uriComparer ?? new DefaultUriComparer(_contextAccessor); // Ignore different schemes - if (!WebDavContext.PublicControllerUrl.IsBaseOf(destinationUrl) || mode == RecursiveProcessingMode.PreferCrossServer) + if (!uriComparer.IsThisServer(destinationUrl) || mode == RecursiveProcessingMode.PreferCrossServer) { if (Logger.IsEnabled(LogLevel.Trace)) { diff --git a/src/FubarDev.WebDavServer/Handlers/Impl/MoveHandler.cs b/src/FubarDev.WebDavServer/Handlers/Impl/MoveHandler.cs index a14c2f28..253667f1 100644 --- a/src/FubarDev.WebDavServer/Handlers/Impl/MoveHandler.cs +++ b/src/FubarDev.WebDavServer/Handlers/Impl/MoveHandler.cs @@ -39,6 +39,7 @@ public class MoveHandler : CopyMoveHandlerBase, IMoveHandler /// Options for the compatibility with the litmus tool. /// The logger for this handler. /// The service provider used to lazily query the implementation. + /// The comparer for URIs. public MoveHandler( IFileSystem rootFileSystem, IWebDavContextAccessor contextAccessor, @@ -46,8 +47,15 @@ public MoveHandler( IOptions options, IOptions litmusCompatibilityOptions, ILogger logger, - IServiceProvider serviceProvider) - : base(rootFileSystem, contextAccessor, implicitLockFactory, litmusCompatibilityOptions, logger) + IServiceProvider serviceProvider, + IUriComparer? uriComparer = null) + : base( + rootFileSystem, + contextAccessor, + implicitLockFactory, + litmusCompatibilityOptions, + logger, + uriComparer) { _serviceProvider = serviceProvider; _options = options.Value;