From 970b68e808bd0899b69e6bb41e2e2b7379f6ab77 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 20 Nov 2020 14:43:04 -0800 Subject: [PATCH] New: Validate that naming formats don't contain illegal characters Fixes #1768 (cherry picked from commit 145c644c9d8f1636027da8a782a7e74f3182c678) --- .../Organizer/FileNameValidation.cs | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/NzbDrone.Core/Organizer/FileNameValidation.cs b/src/NzbDrone.Core/Organizer/FileNameValidation.cs index e7d7235b9..ec54c73cf 100644 --- a/src/NzbDrone.Core/Organizer/FileNameValidation.cs +++ b/src/NzbDrone.Core/Organizer/FileNameValidation.cs @@ -1,6 +1,10 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; using System.Text.RegularExpressions; using FluentValidation; using FluentValidation.Validators; +using NzbDrone.Common.Extensions; namespace NzbDrone.Core.Organizer { @@ -12,18 +16,23 @@ namespace NzbDrone.Core.Organizer public static IRuleBuilderOptions ValidTrackFormat(this IRuleBuilder ruleBuilder) { ruleBuilder.SetValidator(new NotEmptyValidator(null)); + ruleBuilder.SetValidator(new IllegalCharactersValidator()); + return ruleBuilder.SetValidator(new ValidStandardTrackFormatValidator()); } public static IRuleBuilderOptions ValidArtistFolderFormat(this IRuleBuilder ruleBuilder) { ruleBuilder.SetValidator(new NotEmptyValidator(null)); + ruleBuilder.SetValidator(new IllegalCharactersValidator()); + return ruleBuilder.SetValidator(new RegularExpressionValidator(FileNameBuilder.ArtistNameRegex)).WithMessage("Must contain Artist name"); } public static IRuleBuilderOptions ValidAlbumFolderFormat(this IRuleBuilder ruleBuilder) { ruleBuilder.SetValidator(new NotEmptyValidator(null)); + ruleBuilder.SetValidator(new IllegalCharactersValidator()); return ruleBuilder.SetValidator(new RegularExpressionValidator(FileNameBuilder.AlbumTitleRegex)).WithMessage("Must contain Album title"); //.SetValidator(new RegularExpressionValidator(FileNameBuilder.ReleaseDateRegex)).WithMessage("Must contain Release year"); @@ -51,4 +60,42 @@ namespace NzbDrone.Core.Organizer return true; } } + + public class IllegalCharactersValidator : PropertyValidator + { + private readonly char[] _invalidPathChars = Path.GetInvalidPathChars(); + + public IllegalCharactersValidator() + : base("Contains illegal characters: {InvalidCharacters}") + { + + } + + protected override bool IsValid(PropertyValidatorContext context) + { + var value = context.PropertyValue as string; + var invalidCharacters = new List(); + + if (value.IsNullOrWhiteSpace()) + { + return true; + } + + foreach (var i in _invalidPathChars) + { + if (value.IndexOf(i) >= 0) + { + invalidCharacters.Add(i); + } + } + + if (invalidCharacters.Any()) + { + context.MessageFormatter.AppendArgument("InvalidCharacters", string.Join("", invalidCharacters)); + return false; + } + + return true; + } + } }