diff --git a/Oqtane.Client/Modules/Admin/UrlMappings/Add.razor b/Oqtane.Client/Modules/Admin/UrlMappings/Add.razor index efde8b66..a6f82e06 100644 --- a/Oqtane.Client/Modules/Admin/UrlMappings/Add.razor +++ b/Oqtane.Client/Modules/Admin/UrlMappings/Add.razor @@ -40,28 +40,47 @@ var interop = new Interop(JSRuntime); if (await interop.FormValid(form)) { - var route = new Route(_url, PageState.Alias.Path); - var url = route.SiteUrl + "/" + route.PagePath; + if (_url != _mappedurl) + { + Uri uri = new Uri(NavigationManager.Uri); + var url = uri.Scheme + "://" + uri.Authority + "/"; + url = url + (!string.IsNullOrEmpty(PageState.Alias.Path) ? PageState.Alias.Path + "/" : ""); - var urlmapping = new UrlMapping(); - urlmapping.SiteId = PageState.Site.SiteId; - urlmapping.Url = url; - urlmapping.MappedUrl = _mappedurl; - urlmapping.Requests = 0; - urlmapping.CreatedOn = DateTime.UtcNow; - urlmapping.RequestedOn = DateTime.UtcNow; + _url = (_url.StartsWith("/")) ? _url.Substring(1) : _url; + _url = (!_url.StartsWith("http")) ? url + _url : _url; - try - { - urlmapping = await UrlMappingService.AddUrlMappingAsync(urlmapping); - await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping); - NavigationManager.NavigateTo(NavigateUrl()); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Saving UrlMapping {UrlMapping} {Error}", urlmapping, ex.Message); - AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error); - } + if (_url.StartsWith(url)) + { + var urlmapping = new UrlMapping(); + urlmapping.SiteId = PageState.Site.SiteId; + var route = new Route(_url, PageState.Alias.Path); + urlmapping.Url = route.PagePath; + urlmapping.MappedUrl = _mappedurl.Replace(url, ""); + urlmapping.Requests = 0; + urlmapping.CreatedOn = DateTime.UtcNow; + urlmapping.RequestedOn = DateTime.UtcNow; + + try + { + urlmapping = await UrlMappingService.AddUrlMappingAsync(urlmapping); + await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping); + NavigationManager.NavigateTo(NavigateUrl()); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving UrlMapping {UrlMapping} {Error}", urlmapping, ex.Message); + AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error); + } + } + else + { + AddModuleMessage(Localizer["Message.SaveUrlMapping"], MessageType.Warning); + } + } + else + { + AddModuleMessage(Localizer["Message.DuplicateUrlMapping"], MessageType.Warning); + } } else { diff --git a/Oqtane.Client/Modules/Admin/UrlMappings/Edit.razor b/Oqtane.Client/Modules/Admin/UrlMappings/Edit.razor index 1ef1b79a..71f08e63 100644 --- a/Oqtane.Client/Modules/Admin/UrlMappings/Edit.razor +++ b/Oqtane.Client/Modules/Admin/UrlMappings/Edit.razor @@ -26,55 +26,65 @@ @code { - private ElementReference form; - private bool validated = false; + private ElementReference form; + private bool validated = false; - private int _urlmappingid; - private string _url = string.Empty; - private string _mappedurl = string.Empty; + private int _urlmappingid; + private string _url = string.Empty; + private string _mappedurl = string.Empty; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - protected override async Task OnInitializedAsync() - { - try - { - _urlmappingid = Int32.Parse(PageState.QueryString["id"]); - var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid); - if (urlmapping != null) - { - _url = urlmapping.Url; - _mappedurl = urlmapping.MappedUrl; - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message); - AddModuleMessage(Localizer["Error.LoadUrlMapping"], MessageType.Error); - } - } + protected override async Task OnInitializedAsync() + { + try + { + _urlmappingid = Int32.Parse(PageState.QueryString["id"]); + var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid); + if (urlmapping != null) + { + _url = urlmapping.Url; + _mappedurl = urlmapping.MappedUrl; + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message); + AddModuleMessage(Localizer["Error.LoadUrlMapping"], MessageType.Error); + } + } - private async Task SaveUrlMapping() - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) - { - var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid); - urlmapping.MappedUrl = _mappedurl; + private async Task SaveUrlMapping() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + if (_url != _mappedurl) + { + try + { + Uri uri = new Uri(NavigationManager.Uri); + var url = uri.Scheme + "://" + uri.Authority + "/"; + url = url + (!string.IsNullOrEmpty(PageState.Alias.Path) ? PageState.Alias.Path + "/" : ""); - try - { - urlmapping = await UrlMappingService.UpdateUrlMappingAsync(urlmapping); - await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping); - NavigationManager.NavigateTo(NavigateUrl()); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Saving UrlMapping {UrlMapping} {Error}", urlmapping, ex.Message); - AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error); - } - } + var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid); + urlmapping.MappedUrl = _mappedurl.Replace(url, ""); + urlmapping = await UrlMappingService.UpdateUrlMappingAsync(urlmapping); + await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping); + NavigationManager.NavigateTo(NavigateUrl()); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message); + AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error); + } + } + else + { + AddModuleMessage(Localizer["Message.DuplicateUrlMapping"], MessageType.Warning); + } + } else { AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); diff --git a/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor b/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor index 02f41be9..28478589 100644 --- a/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor +++ b/Oqtane.Client/Modules/Admin/UrlMappings/Index.razor @@ -40,10 +40,10 @@ else - @context.Url + @context.Url @if (_mapped) { - @((MarkupString)"
>> ")@context.MappedUrl + @((MarkupString)"
>> ")@context.MappedUrl } @context.Requests diff --git a/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Add.resx b/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Add.resx index 6f983495..e1185498 100644 --- a/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Add.resx @@ -121,10 +121,10 @@ Redirect To: - A fully qualified Url where the user will be redirected + A relative or absolute Url where the user will be redirected - A fully qualified Url for this site + An absolute Url identifying a path to a specific page in the site Url: @@ -135,4 +135,10 @@ Please Provide All Required Information + + The Url and Redirect To cannot be the same + + + The Url must belong to the current site + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Edit.resx index 400ba0d5..2312ef83 100644 --- a/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/UrlMappings/Edit.resx @@ -121,10 +121,10 @@ Redirect To: - A fully qualified Url where the user will be redirected + A relative or absolute Url where the user will be redirected - A fully qualified Url for this site + A relative Url identifying a path to a specific page in the site Url: @@ -138,4 +138,7 @@ Please Provide All Required Information + + The Url and Redirect To cannot be the same + \ No newline at end of file diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 9806b699..1e339e78 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -234,10 +234,12 @@ } else // page not found { - var urlMapping = await UrlMappingService.GetUrlMappingAsync(site.SiteId, route.SiteUrl + "/" + route.PagePath); + // look for url mapping + var urlMapping = await UrlMappingService.GetUrlMappingAsync(site.SiteId, route.PagePath); if (urlMapping != null && !string.IsNullOrEmpty(urlMapping.MappedUrl)) { - NavigationManager.NavigateTo(urlMapping.MappedUrl, false); + var url = (urlMapping.MappedUrl.StartsWith("http")) ? urlMapping.MappedUrl : route.SiteUrl + "/" + urlMapping.MappedUrl; + NavigationManager.NavigateTo(url, false); } else // not mapped { diff --git a/Oqtane.Server/Controllers/PageController.cs b/Oqtane.Server/Controllers/PageController.cs index 5f792dd8..a0bf6213 100644 --- a/Oqtane.Server/Controllers/PageController.cs +++ b/Oqtane.Server/Controllers/PageController.cs @@ -261,11 +261,10 @@ namespace Oqtane.Controllers // save url mapping if page path changed if (currentPage.Path != page.Path) { - var url = HttpContext.Request.Scheme + "://" + _alias.Name + "/"; var urlMapping = new UrlMapping(); urlMapping.SiteId = page.SiteId; - urlMapping.Url = url + currentPage.Path; - urlMapping.MappedUrl = url + page.Path; + urlMapping.Url = currentPage.Path; + urlMapping.MappedUrl = page.Path; urlMapping.Requests = 0; urlMapping.CreatedOn = System.DateTime.UtcNow; urlMapping.RequestedOn = System.DateTime.UtcNow; diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index 0ff719fc..ef0992ed 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -143,14 +143,14 @@ namespace Oqtane.Pages ThemeType = page.ThemeType; } } - else + else // page not found { - // page does not exist - url = route.SiteUrl + "/" + route.PagePath; - var urlMapping = _urlMappings.GetUrlMapping(site.SiteId, url); + // look for url mapping + var urlMapping = _urlMappings.GetUrlMapping(site.SiteId, route.PagePath); if (urlMapping != null && !string.IsNullOrEmpty(urlMapping.MappedUrl)) { - return RedirectPermanent(urlMapping.MappedUrl); + url = (urlMapping.MappedUrl.StartsWith("http")) ? urlMapping.MappedUrl : route.SiteUrl + "/" + urlMapping.MappedUrl; + return RedirectPermanent(url); } } } @@ -190,10 +190,9 @@ namespace Oqtane.Pages string ip = HttpContext.Connection.RemoteIpAddress?.ToString() ?? ""; string useragent = (Request.Headers[HeaderNames.UserAgent] != StringValues.Empty) ? Request.Headers[HeaderNames.UserAgent] : ""; string language = (Request.Headers[HeaderNames.AcceptLanguage] != StringValues.Empty) ? Request.Headers[HeaderNames.AcceptLanguage] : ""; - if (language.Contains(",")) - { - language = language.Substring(0, language.IndexOf(",")); - } + language = (language.Contains(",")) ? language.Substring(0, language.IndexOf(",")) : language; + language = (language.Contains(";")) ? language.Substring(0, language.IndexOf(";")) : language; + language = (language.Trim().Length == 0) ? "*" : language; string url = Request.GetEncodedUrl(); string referrer = (Request.Headers[HeaderNames.Referer] != StringValues.Empty) ? Request.Headers[HeaderNames.Referer] : ""; int? userid = null;