From 954e30d89fbb0b491bc206ffffb540a8f1aeb4b7 Mon Sep 17 00:00:00 2001 From: Michael Atwood Date: Tue, 30 Jun 2020 16:01:16 -0700 Subject: [PATCH 1/5] Save url parameter action segments --- Oqtane.Client/Modules/ModuleBase.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 1f6d38eb..236fe779 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -122,7 +122,7 @@ namespace Oqtane.Modules var templateSegments = parameterTemplate.Split('/', StringSplitOptions.RemoveEmptyEntries); var parameters = PageState.UrlParameters.Split('/', StringSplitOptions.RemoveEmptyEntries); - + var actionId = 1; if (parameters.Length == templateSegments.Length) { for (int i = 0; i < parameters.Length; i++) @@ -131,6 +131,8 @@ namespace Oqtane.Modules { if (templateSegments[i] == parameters[i]) { + urlParameters.TryAdd("action" + actionId, parameters[i]); + actionId += 1; } else if (templateSegments[i].StartsWith("{") && templateSegments[i].EndsWith("}")) { From 038894cf64f8bed8cb4c81d41d4512efd31ac852 Mon Sep 17 00:00:00 2001 From: Michael Atwood Date: Wed, 1 Jul 2020 01:35:06 -0700 Subject: [PATCH 2/5] Enhancement to url parameters helper in modulebase --- Oqtane.Client/Modules/ModuleBase.cs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 236fe779..7f2faeda 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -44,6 +44,26 @@ namespace Oqtane.Modules public virtual List Resources { get; set; } + public virtual string UrlParametersTemplate { get; set; } = ""; + public virtual Dictionary UrlParamerters + { + get + { + var urlparameters = new Dictionary(); + + var templates = UrlParametersTemplate.Split(',', StringSplitOptions.RemoveEmptyEntries); + foreach (var template in templates) + { + urlparameters = GetUrlParameters(template); + + if (urlparameters.Count > 0) goto Return; + } + + Return: + return urlparameters; + } + } + // base lifecycle method for handling JSInterop script registration protected override async Task OnAfterRenderAsync(bool firstRender) @@ -116,7 +136,7 @@ namespace Oqtane.Modules return Utilities.ContentUrl(PageState.Alias, fileid); } - public Dictionary GetUrlParameters(string parameterTemplate) + public virtual Dictionary GetUrlParameters(string parameterTemplate) { var urlParameters = new Dictionary(); @@ -131,7 +151,7 @@ namespace Oqtane.Modules { if (templateSegments[i] == parameters[i]) { - urlParameters.TryAdd("action" + actionId, parameters[i]); + urlParameters.TryAdd("parameter" + actionId, parameters[i]); actionId += 1; } else if (templateSegments[i].StartsWith("{") && templateSegments[i].EndsWith("}")) From 2e7cfefb2e34be573c2b5529d1496d4760e1f633 Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Wed, 1 Jul 2020 14:23:55 +0200 Subject: [PATCH 3/5] Notification Repository Breaking change fix --- Oqtane.Server/Repository/NotificationRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Server/Repository/NotificationRepository.cs b/Oqtane.Server/Repository/NotificationRepository.cs index 45730d84..43025c3a 100644 --- a/Oqtane.Server/Repository/NotificationRepository.cs +++ b/Oqtane.Server/Repository/NotificationRepository.cs @@ -21,7 +21,7 @@ namespace Oqtane.Repository return _db.Notification .Where(item => item.SiteId == siteId) .Where(item => item.IsDelivered == false) - .Where(item => item.SendOn < System.DateTime.UtcNow) + .Where(item => item.SendOn == null || item.SendOn < System.DateTime.UtcNow) .ToList(); } From d4be058d07a94926e270bb50bfaf70760bf6331c Mon Sep 17 00:00:00 2001 From: Michael Atwood Date: Wed, 1 Jul 2020 15:15:39 -0700 Subject: [PATCH 4/5] Can get parameters without template clear urlParameters dictionary if template fails. Removed UrlParametersTemplate property and UrlParamerters auto dictionary --- Oqtane.Client/Modules/ModuleBase.cs | 72 +++++++++++++---------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 7f2faeda..633caed5 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -44,26 +44,6 @@ namespace Oqtane.Modules public virtual List Resources { get; set; } - public virtual string UrlParametersTemplate { get; set; } = ""; - public virtual Dictionary UrlParamerters - { - get - { - var urlparameters = new Dictionary(); - - var templates = UrlParametersTemplate.Split(',', StringSplitOptions.RemoveEmptyEntries); - foreach (var template in templates) - { - urlparameters = GetUrlParameters(template); - - if (urlparameters.Count > 0) goto Return; - } - - Return: - return urlparameters; - } - } - // base lifecycle method for handling JSInterop script registration protected override async Task OnAfterRenderAsync(bool firstRender) @@ -136,37 +116,51 @@ namespace Oqtane.Modules return Utilities.ContentUrl(PageState.Alias, fileid); } - public virtual Dictionary GetUrlParameters(string parameterTemplate) + public virtual Dictionary GetUrlParameters(string parametersTemplate = "") { var urlParameters = new Dictionary(); - - var templateSegments = parameterTemplate.Split('/', StringSplitOptions.RemoveEmptyEntries); + string[] templateSegments; var parameters = PageState.UrlParameters.Split('/', StringSplitOptions.RemoveEmptyEntries); - var actionId = 1; - if (parameters.Length == templateSegments.Length) + var parameterId = 0; + + if (string.IsNullOrEmpty(parametersTemplate)) { for (int i = 0; i < parameters.Length; i++) { - if (parameters.Length > i) + urlParameters.TryAdd("parameter" + i, parameters[i]); + } + } + else + { + templateSegments = parametersTemplate.Split('/', StringSplitOptions.RemoveEmptyEntries); + + if (parameters.Length == templateSegments.Length) + { + for (int i = 0; i < parameters.Length; i++) { - if (templateSegments[i] == parameters[i]) + if (parameters.Length > i) { - urlParameters.TryAdd("parameter" + actionId, parameters[i]); - actionId += 1; - } - else if (templateSegments[i].StartsWith("{") && templateSegments[i].EndsWith("}")) - { - var key = templateSegments[i].Replace("{", ""); - key = key.Replace("}", ""); - urlParameters.TryAdd(key, parameters[i]); - } - else - { - i = parameters.Length; + if (templateSegments[i] == parameters[i]) + { + urlParameters.TryAdd("parameter" + parameterId, parameters[i]); + parameterId++; + } + else if (templateSegments[i].StartsWith("{") && templateSegments[i].EndsWith("}")) + { + var key = templateSegments[i].Replace("{", ""); + key = key.Replace("}", ""); + urlParameters.TryAdd(key, parameters[i]); + } + else + { + i = parameters.Length; + urlParameters.Clear(); + } } } } } + return urlParameters; } From 7b5a192b8293cc55d3474c31d5515302f404c780 Mon Sep 17 00:00:00 2001 From: Sven Reichelt Date: Thu, 2 Jul 2020 09:34:57 +0200 Subject: [PATCH 5/5] Added double page path validation --- Oqtane.Client/Modules/Admin/Pages/Add.razor | 10 ++++++++++ Oqtane.Client/Modules/Admin/Pages/Edit.razor | 14 +++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 2970d442..194b0e13 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -346,6 +346,12 @@ } } + if (!PagePathIsUnique(page.Path, page.SiteId, _pageList)) + { + AddModuleMessage($"A page with path {_path} already exists for the selected parent page. The page path needs to be unique for the selected parent.", MessageType.Warning); + return; + } + Page child; switch (_insert) { @@ -407,4 +413,8 @@ } } + private static bool PagePathIsUnique(string pagePath, int siteId, List existingPages) + { + return !existingPages.Any(page => page.SiteId == siteId && page.Path == pagePath); + } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 7373d36a..4b28d530 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -333,7 +333,7 @@ _children = new List(); if (_parentid == "-1") { - foreach(Page p in PageState.Pages.Where(item => item.ParentId == null)) + foreach (Page p in PageState.Pages.Where(item => item.ParentId == null)) { if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions)) { @@ -433,6 +433,13 @@ page.Path = parent.Path + "/" + Utilities.GetFriendlyUrl(_path); } } + + if (!PagePathIsUnique(page.Path, page.SiteId, page.PageId, _pageList)) + { + AddModuleMessage($"A page with path {_path} already exists for the selected parent page. The page path needs to be unique for the selected parent.", MessageType.Warning); + return; + } + if (_insert != "=") { Page child; @@ -512,4 +519,9 @@ AddModuleMessage("Error Saving Page", MessageType.Error); } } + + private static bool PagePathIsUnique(string pagePath, int siteId, int pageId, List existingPages) + { + return !existingPages.Any(page => page.SiteId == siteId && page.Path == pagePath && page.PageId != pageId); + } }