Mapped Network Drive Validator

New: Prevent adding Mapped Network Drives when Running as a Windows Services
pull/6/head
Mark McDowall 10 years ago
parent c43296ffe9
commit c12f16b6d3

@ -7,16 +7,19 @@ namespace NzbDrone.Api.Config
{ {
public class DownloadClientConfigModule : NzbDroneConfigModule<DownloadClientConfigResource> public class DownloadClientConfigModule : NzbDroneConfigModule<DownloadClientConfigResource>
{ {
public DownloadClientConfigModule(IConfigService configService, RootFolderValidator rootFolderValidator, PathExistsValidator pathExistsValidator) public DownloadClientConfigModule(IConfigService configService,
RootFolderValidator rootFolderValidator,
PathExistsValidator pathExistsValidator,
MappedNetworkDriveValidator mappedNetworkDriveValidator)
: base(configService) : base(configService)
{ {
SharedValidator.RuleFor(c => c.DownloadedEpisodesFolder) SharedValidator.RuleFor(c => c.DownloadedEpisodesFolder)
.Cascade(CascadeMode.StopOnFirstFailure) .Cascade(CascadeMode.StopOnFirstFailure)
.IsValidPath() .IsValidPath()
.SetValidator(rootFolderValidator) .SetValidator(rootFolderValidator)
.SetValidator(mappedNetworkDriveValidator)
.SetValidator(pathExistsValidator) .SetValidator(pathExistsValidator)
.When(c => !String.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder)); .When(c => !String.IsNullOrWhiteSpace(c.DownloadedEpisodesFolder));
} }
} }
} }

@ -11,7 +11,9 @@ namespace NzbDrone.Api.RemotePathMappings
{ {
private readonly IRemotePathMappingService _remotePathMappingService; private readonly IRemotePathMappingService _remotePathMappingService;
public RemotePathMappingModule(IRemotePathMappingService remotePathMappingService, PathExistsValidator pathExistsValidator) public RemotePathMappingModule(IRemotePathMappingService remotePathMappingService,
PathExistsValidator pathExistsValidator,
MappedNetworkDriveValidator mappedNetworkDriveValidator)
{ {
_remotePathMappingService = remotePathMappingService; _remotePathMappingService = remotePathMappingService;
@ -31,6 +33,7 @@ namespace NzbDrone.Api.RemotePathMappings
SharedValidator.RuleFor(c => c.LocalPath) SharedValidator.RuleFor(c => c.LocalPath)
.Cascade(CascadeMode.StopOnFirstFailure) .Cascade(CascadeMode.StopOnFirstFailure)
.IsValidPath() .IsValidPath()
.SetValidator(mappedNetworkDriveValidator)
.SetValidator(pathExistsValidator); .SetValidator(pathExistsValidator);
} }

@ -15,7 +15,8 @@ namespace NzbDrone.Api.RootFolders
IBroadcastSignalRMessage signalRBroadcaster, IBroadcastSignalRMessage signalRBroadcaster,
RootFolderValidator rootFolderValidator, RootFolderValidator rootFolderValidator,
PathExistsValidator pathExistsValidator, PathExistsValidator pathExistsValidator,
DroneFactoryValidator droneFactoryValidator) DroneFactoryValidator droneFactoryValidator,
MappedNetworkDriveValidator mappedNetworkDriveValidator)
: base(signalRBroadcaster) : base(signalRBroadcaster)
{ {
_rootFolderService = rootFolderService; _rootFolderService = rootFolderService;
@ -29,8 +30,9 @@ namespace NzbDrone.Api.RootFolders
.Cascade(CascadeMode.StopOnFirstFailure) .Cascade(CascadeMode.StopOnFirstFailure)
.IsValidPath() .IsValidPath()
.SetValidator(rootFolderValidator) .SetValidator(rootFolderValidator)
.SetValidator(pathExistsValidator) .SetValidator(droneFactoryValidator)
.SetValidator(droneFactoryValidator); .SetValidator(mappedNetworkDriveValidator)
.SetValidator(pathExistsValidator);
} }
private RootFolderResource GetRootFolder(int id) private RootFolderResource GetRootFolder(int id)

@ -896,6 +896,7 @@
<Compile Include="Validation\NzbDroneValidationFailure.cs" /> <Compile Include="Validation\NzbDroneValidationFailure.cs" />
<Compile Include="Validation\NzbDroneValidationResult.cs" /> <Compile Include="Validation\NzbDroneValidationResult.cs" />
<Compile Include="Validation\NzbDroneValidationState.cs" /> <Compile Include="Validation\NzbDroneValidationState.cs" />
<Compile Include="Validation\Paths\MappedNetworkDriveValidator.cs" />
<Compile Include="Validation\Paths\DroneFactoryValidator.cs" /> <Compile Include="Validation\Paths\DroneFactoryValidator.cs" />
<Compile Include="Validation\Paths\PathExistsValidator.cs" /> <Compile Include="Validation\Paths\PathExistsValidator.cs" />
<Compile Include="Validation\Paths\PathValidator.cs" /> <Compile Include="Validation\Paths\PathValidator.cs" />

@ -0,0 +1,50 @@
using System;
using System.IO;
using System.Text.RegularExpressions;
using FluentValidation.Validators;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Core.Validation.Paths
{
public class MappedNetworkDriveValidator : PropertyValidator
{
private readonly IRuntimeInfo _runtimeInfo;
private readonly IDiskProvider _diskProvider;
private static readonly Regex DriveRegex = new Regex(@"[a-z]\:\\", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public MappedNetworkDriveValidator(IRuntimeInfo runtimeInfo, IDiskProvider diskProvider)
: base("Mapped Network Drive and Windows Service")
{
_runtimeInfo = runtimeInfo;
_diskProvider = diskProvider;
}
protected override bool IsValid(PropertyValidatorContext context)
{
if (context.PropertyValue == null) return false;
if (OsInfo.IsNotWindows) return true;
if (!_runtimeInfo.IsWindowsService) return true;
var path = context.PropertyValue.ToString();
if (!DriveRegex.IsMatch(path)) return true;
var drives = _diskProvider.GetDrives();
foreach (var drive in drives)
{
if (path.StartsWith(drive.Name, StringComparison.InvariantCultureIgnoreCase))
{
if (drive.DriveType == DriveType.Network)
{
return false;
}
}
}
return true;
}
}
}
Loading…
Cancel
Save