make Url Mappings relative rather than absolute

This commit is contained in:
Shaun Walker 2022-01-03 10:56:13 -05:00
parent 224618cf21
commit eeff4af167
8 changed files with 122 additions and 84 deletions

View File

@ -40,28 +40,47 @@
var interop = new Interop(JSRuntime); var interop = new Interop(JSRuntime);
if (await interop.FormValid(form)) if (await interop.FormValid(form))
{ {
var route = new Route(_url, PageState.Alias.Path); if (_url != _mappedurl)
var url = route.SiteUrl + "/" + route.PagePath; {
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(); _url = (_url.StartsWith("/")) ? _url.Substring(1) : _url;
urlmapping.SiteId = PageState.Site.SiteId; _url = (!_url.StartsWith("http")) ? url + _url : _url;
urlmapping.Url = url;
urlmapping.MappedUrl = _mappedurl;
urlmapping.Requests = 0;
urlmapping.CreatedOn = DateTime.UtcNow;
urlmapping.RequestedOn = DateTime.UtcNow;
try if (_url.StartsWith(url))
{ {
urlmapping = await UrlMappingService.AddUrlMappingAsync(urlmapping); var urlmapping = new UrlMapping();
await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping); urlmapping.SiteId = PageState.Site.SiteId;
NavigationManager.NavigateTo(NavigateUrl()); var route = new Route(_url, PageState.Alias.Path);
} urlmapping.Url = route.PagePath;
catch (Exception ex) urlmapping.MappedUrl = _mappedurl.Replace(url, "");
{ urlmapping.Requests = 0;
await logger.LogError(ex, "Error Saving UrlMapping {UrlMapping} {Error}", urlmapping, ex.Message); urlmapping.CreatedOn = DateTime.UtcNow;
AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error); 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 else
{ {

View File

@ -26,55 +26,65 @@
</form> </form>
@code { @code {
private ElementReference form; private ElementReference form;
private bool validated = false; private bool validated = false;
private int _urlmappingid; private int _urlmappingid;
private string _url = string.Empty; private string _url = string.Empty;
private string _mappedurl = string.Empty; private string _mappedurl = string.Empty;
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
try try
{ {
_urlmappingid = Int32.Parse(PageState.QueryString["id"]); _urlmappingid = Int32.Parse(PageState.QueryString["id"]);
var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid); var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid);
if (urlmapping != null) if (urlmapping != null)
{ {
_url = urlmapping.Url; _url = urlmapping.Url;
_mappedurl = urlmapping.MappedUrl; _mappedurl = urlmapping.MappedUrl;
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
await logger.LogError(ex, "Error Loading UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message); await logger.LogError(ex, "Error Loading UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message);
AddModuleMessage(Localizer["Error.LoadUrlMapping"], MessageType.Error); AddModuleMessage(Localizer["Error.LoadUrlMapping"], MessageType.Error);
} }
} }
private async Task SaveUrlMapping() private async Task SaveUrlMapping()
{ {
validated = true; validated = true;
var interop = new Interop(JSRuntime); var interop = new Interop(JSRuntime);
if (await interop.FormValid(form)) if (await interop.FormValid(form))
{ {
var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid); if (_url != _mappedurl)
urlmapping.MappedUrl = _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 var urlmapping = await UrlMappingService.GetUrlMappingAsync(_urlmappingid);
{ urlmapping.MappedUrl = _mappedurl.Replace(url, "");
urlmapping = await UrlMappingService.UpdateUrlMappingAsync(urlmapping); urlmapping = await UrlMappingService.UpdateUrlMappingAsync(urlmapping);
await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping); await logger.LogInformation("UrlMapping Saved {UrlMapping}", urlmapping);
NavigationManager.NavigateTo(NavigateUrl()); NavigationManager.NavigateTo(NavigateUrl());
} }
catch (Exception ex) catch (Exception ex)
{ {
await logger.LogError(ex, "Error Saving UrlMapping {UrlMapping} {Error}", urlmapping, ex.Message); await logger.LogError(ex, "Error Saving UrlMapping {UrlMappingId} {Error}", _urlmappingid, ex.Message);
AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error); AddModuleMessage(Localizer["Error.SaveUrlMapping"], MessageType.Error);
} }
} }
else
{
AddModuleMessage(Localizer["Message.DuplicateUrlMapping"], MessageType.Warning);
}
}
else else
{ {
AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);

View File

@ -40,10 +40,10 @@ else
<td><ActionLink Action="Edit" Parameters="@($"id=" + context.UrlMappingId.ToString())" ResourceKey="Edit" /></td> <td><ActionLink Action="Edit" Parameters="@($"id=" + context.UrlMappingId.ToString())" ResourceKey="Edit" /></td>
<td><ActionDialog Header="Delete Url Mapping" Message="@string.Format(Localizer["Confirm.DeleteUrlMapping"], context.Url)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteUrlMapping(context))" ResourceKey="DeleteUrlMapping" /></td> <td><ActionDialog Header="Delete Url Mapping" Message="@string.Format(Localizer["Confirm.DeleteUrlMapping"], context.Url)" Action="Delete" Security="SecurityAccessLevel.Admin" Class="btn btn-danger" OnClick="@(async () => await DeleteUrlMapping(context))" ResourceKey="DeleteUrlMapping" /></td>
<td> <td>
<a href="@context.Url">@context.Url</a> <a href="@Utilities.TenantUrl(PageState.Alias, context.Url)">@context.Url</a>
@if (_mapped) @if (_mapped)
{ {
@((MarkupString)"<br />&gt;&gt;&nbsp;")<a href="@context.MappedUrl">@context.MappedUrl</a> @((MarkupString)"<br />&gt;&gt;&nbsp;")<a href="@((context.MappedUrl.StartsWith("http") ? context.MappedUrl : Utilities.TenantUrl(PageState.Alias, context.MappedUrl)))">@context.MappedUrl</a>
} }
</td> </td>
<td>@context.Requests</td> <td>@context.Requests</td>

View File

@ -121,10 +121,10 @@
<value>Redirect To:</value> <value>Redirect To:</value>
</data> </data>
<data name="MappedUrl.HelpText" xml:space="preserve"> <data name="MappedUrl.HelpText" xml:space="preserve">
<value>A fully qualified Url where the user will be redirected</value> <value>A relative or absolute Url where the user will be redirected</value>
</data> </data>
<data name="Url.HelpText" xml:space="preserve"> <data name="Url.HelpText" xml:space="preserve">
<value>A fully qualified Url for this site</value> <value>An absolute Url identifying a path to a specific page in the site</value>
</data> </data>
<data name="Url.Text" xml:space="preserve"> <data name="Url.Text" xml:space="preserve">
<value>Url:</value> <value>Url:</value>
@ -135,4 +135,10 @@
<data name="Message.InfoRequired" xml:space="preserve"> <data name="Message.InfoRequired" xml:space="preserve">
<value>Please Provide All Required Information</value> <value>Please Provide All Required Information</value>
</data> </data>
<data name="Message.DuplicateUrlMapping" xml:space="preserve">
<value>The Url and Redirect To cannot be the same</value>
</data>
<data name="Message.SaveUrlMapping" xml:space="preserve">
<value>The Url must belong to the current site</value>
</data>
</root> </root>

View File

@ -121,10 +121,10 @@
<value>Redirect To:</value> <value>Redirect To:</value>
</data> </data>
<data name="MappedUrl.HelpText" xml:space="preserve"> <data name="MappedUrl.HelpText" xml:space="preserve">
<value>A fully qualified Url where the user will be redirected</value> <value>A relative or absolute Url where the user will be redirected</value>
</data> </data>
<data name="Url.HelpText" xml:space="preserve"> <data name="Url.HelpText" xml:space="preserve">
<value>A fully qualified Url for this site</value> <value>A relative Url identifying a path to a specific page in the site</value>
</data> </data>
<data name="Url.Text" xml:space="preserve"> <data name="Url.Text" xml:space="preserve">
<value>Url:</value> <value>Url:</value>
@ -138,4 +138,7 @@
<data name="Message.InfoRequired" xml:space="preserve"> <data name="Message.InfoRequired" xml:space="preserve">
<value>Please Provide All Required Information</value> <value>Please Provide All Required Information</value>
</data> </data>
<data name="Message.DuplicateUrlMapping" xml:space="preserve">
<value>The Url and Redirect To cannot be the same</value>
</data>
</root> </root>

View File

@ -234,10 +234,12 @@
} }
else // page not found 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)) 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 else // not mapped
{ {

View File

@ -261,11 +261,10 @@ namespace Oqtane.Controllers
// save url mapping if page path changed // save url mapping if page path changed
if (currentPage.Path != page.Path) if (currentPage.Path != page.Path)
{ {
var url = HttpContext.Request.Scheme + "://" + _alias.Name + "/";
var urlMapping = new UrlMapping(); var urlMapping = new UrlMapping();
urlMapping.SiteId = page.SiteId; urlMapping.SiteId = page.SiteId;
urlMapping.Url = url + currentPage.Path; urlMapping.Url = currentPage.Path;
urlMapping.MappedUrl = url + page.Path; urlMapping.MappedUrl = page.Path;
urlMapping.Requests = 0; urlMapping.Requests = 0;
urlMapping.CreatedOn = System.DateTime.UtcNow; urlMapping.CreatedOn = System.DateTime.UtcNow;
urlMapping.RequestedOn = System.DateTime.UtcNow; urlMapping.RequestedOn = System.DateTime.UtcNow;

View File

@ -143,14 +143,14 @@ namespace Oqtane.Pages
ThemeType = page.ThemeType; ThemeType = page.ThemeType;
} }
} }
else else // page not found
{ {
// page does not exist // look for url mapping
url = route.SiteUrl + "/" + route.PagePath; var urlMapping = _urlMappings.GetUrlMapping(site.SiteId, route.PagePath);
var urlMapping = _urlMappings.GetUrlMapping(site.SiteId, url);
if (urlMapping != null && !string.IsNullOrEmpty(urlMapping.MappedUrl)) 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 ip = HttpContext.Connection.RemoteIpAddress?.ToString() ?? "";
string useragent = (Request.Headers[HeaderNames.UserAgent] != StringValues.Empty) ? Request.Headers[HeaderNames.UserAgent] : ""; string useragent = (Request.Headers[HeaderNames.UserAgent] != StringValues.Empty) ? Request.Headers[HeaderNames.UserAgent] : "";
string language = (Request.Headers[HeaderNames.AcceptLanguage] != StringValues.Empty) ? Request.Headers[HeaderNames.AcceptLanguage] : ""; string language = (Request.Headers[HeaderNames.AcceptLanguage] != StringValues.Empty) ? Request.Headers[HeaderNames.AcceptLanguage] : "";
if (language.Contains(",")) language = (language.Contains(",")) ? language.Substring(0, language.IndexOf(",")) : language;
{ language = (language.Contains(";")) ? language.Substring(0, language.IndexOf(";")) : language;
language = language.Substring(0, language.IndexOf(",")); language = (language.Trim().Length == 0) ? "*" : language;
}
string url = Request.GetEncodedUrl(); string url = Request.GetEncodedUrl();
string referrer = (Request.Headers[HeaderNames.Referer] != StringValues.Empty) ? Request.Headers[HeaderNames.Referer] : ""; string referrer = (Request.Headers[HeaderNames.Referer] != StringValues.Empty) ? Request.Headers[HeaderNames.Referer] : "";
int? userid = null; int? userid = null;