diff --git a/src/Geta.NotFoundHandler.Admin/Areas/GetaNotFoundHandlerAdmin/Pages/Models/RedirectModel.cs b/src/Geta.NotFoundHandler.Admin/Areas/GetaNotFoundHandlerAdmin/Pages/Models/RedirectModel.cs index 229097e..d3aff9d 100644 --- a/src/Geta.NotFoundHandler.Admin/Areas/GetaNotFoundHandlerAdmin/Pages/Models/RedirectModel.cs +++ b/src/Geta.NotFoundHandler.Admin/Areas/GetaNotFoundHandlerAdmin/Pages/Models/RedirectModel.cs @@ -1,17 +1,35 @@ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Geta.NotFoundHandler.Core.Redirects; namespace Geta.NotFoundHandler.Admin.Pages.Geta.NotFoundHandler.Admin.Models { - public class RedirectModel + public class RedirectModel : IValidatableObject { public Guid? Id { get; set; } + [Required] public string OldUrl { get; set; } + [Required] public string NewUrl { get; set; } + public bool WildCardSkipAppend { get; set; } + public RedirectType RedirectType { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if (!Uri.IsWellFormedUriString(OldUrl, UriKind.RelativeOrAbsolute)) + { + yield return new ValidationResult("Old Url must be a valid absolute or relative url.", new[] { nameof(OldUrl) }); + } + + if (!Uri.IsWellFormedUriString(NewUrl, UriKind.RelativeOrAbsolute)) + { + yield return new ValidationResult("New Url must be a valid absolute or relative url.", new[] { nameof(NewUrl) }); + } + } } } diff --git a/src/Geta.NotFoundHandler/Core/Redirects/RedirectsCsvParser.cs b/src/Geta.NotFoundHandler/Core/Redirects/RedirectsCsvParser.cs index 299b34d..e33090d 100644 --- a/src/Geta.NotFoundHandler/Core/Redirects/RedirectsCsvParser.cs +++ b/src/Geta.NotFoundHandler/Core/Redirects/RedirectsCsvParser.cs @@ -46,6 +46,12 @@ private CustomRedirectCollection Load(IEnumerable csvImportModel foreach (var item in csvImportModels) { + if (!IsValidRedirect(item)) + { + _logger.LogWarning("NotFoundHandler: Skipping import of invalid redirect. OldUrl: {oldUrl}; NewUrl: {newUrl}", item.OldUrl, item.NewUrl); + continue; + } + // Create new custom redirect nodes var redirectType = GetRedirectType(item.RedirectType); var skipWildCardAppend = GetSkipWildCardAppend(item.WildcardSkippedAppend); @@ -56,6 +62,12 @@ private CustomRedirectCollection Load(IEnumerable csvImportModel return redirects; } + private static bool IsValidRedirect(CsvImportModel model) + { + return Uri.IsWellFormedUriString(model.OldUrl, UriKind.RelativeOrAbsolute) + && Uri.IsWellFormedUriString(model.NewUrl, UriKind.RelativeOrAbsolute); + } + private static bool GetSkipWildCardAppend(string skipWildCardAttr) { if (!string.IsNullOrWhiteSpace(skipWildCardAttr) && bool.TryParse(skipWildCardAttr, out var skipWildCardAppend))