From 5da4dadc31c085b75afc4ac1b9a101409f01823d Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 17 May 2023 17:13:08 -0400 Subject: [PATCH] allow HeadContent to support script tags --- Oqtane.Client/Modules/Admin/Pages/Add.razor | 2 +- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 2 +- Oqtane.Client/Modules/Admin/Site/Index.razor | 2 +- .../Resources/Modules/Admin/Pages/Add.resx | 2 +- .../Resources/Modules/Admin/Pages/Edit.resx | 2 +- .../Resources/Modules/Admin/Site/Index.resx | 2 +- Oqtane.Client/UI/ThemeBuilder.razor | 78 ++++++++++++++++++- Oqtane.Server/Pages/_Host.cshtml.cs | 20 +++++ 8 files changed, 101 insertions(+), 9 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index b5bfa662..323f5328 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -134,7 +134,7 @@
- +
diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 77920ad7..38c68d94 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -141,7 +141,7 @@
- +
diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 52ac9445..dcf6bdc6 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -105,7 +105,7 @@
- +
diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx index 85b92768..b3345f93 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Add.resx @@ -229,7 +229,7 @@ Appearance - Optionally enter content to be included in the page head (ie. meta and link tags are valid, script tags are not). + Optionally enter content to be included in the page head (ie. meta, link, or script tags). Please note that inline script must include an id attribute. Head Content: diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx index 184b4af4..3b1cedd4 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx @@ -265,7 +265,7 @@ Clickable? - Optionally enter content to be included in the page head (ie. meta and link tags are valid, script tags are not). + Optionally enter content to be included in the page head (ie. meta, link, or script tags). Please note that inline script must include an id attribute. Head Content: diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 5b5df55c..cbd72422 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -355,7 +355,7 @@ Appearance - Optionally enter content to be included in the page head (ie. meta and link tags are valid, script tags are not). + Optionally enter content to be included in the page head (ie. meta, link, or script tags). Please note that inline script must include an id attribute. Head Content: diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index 69625df5..3c7bfe7b 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -1,5 +1,5 @@ @namespace Oqtane.UI -@inject IJSRuntime JsRuntime +@inject IJSRuntime JSRuntime @inject NavigationManager NavigationManager @inject SiteState SiteState @@ -41,11 +41,11 @@ // head content if (!string.IsNullOrEmpty(PageState.Site.HeadContent)) { - headcontent += PageState.Site.HeadContent + "\n"; + headcontent += RemoveScripts(PageState.Site.HeadContent) + "\n"; } if (!string.IsNullOrEmpty(PageState.Page.HeadContent)) { - headcontent += PageState.Page.HeadContent + "\n"; + headcontent += RemoveScripts(PageState.Page.HeadContent) + "\n"; } // stylesheets foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet)) @@ -79,6 +79,78 @@ }; } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!firstRender) + { + if (PageState.Page.HeadContent != null && PageState.Page.HeadContent.Contains("= 0) + { + var script = PageState.Page.HeadContent.Substring(index, PageState.Page.HeadContent.IndexOf("", index) + 9 - index); + var attributes = script.Substring(0, script.IndexOf(">")).Replace("\"", "").Split(" "); + string id = ""; + string url = ""; + string integrity = ""; + string crossorigin = ""; + bool es6module = false; + foreach (var attribute in attributes) + { + if (attribute.Contains("=")) + { + var value = attribute.Split("="); + switch (value[0]) + { + case "id": + id = value[1]; + break; + case "src": + url = value[1]; + break; + case "integrity": + integrity = value[1]; + break; + case "crossorigin": + crossorigin = value[1]; + break; + case "type": + es6module = (value[1] == "module"); + break; + } + } + } + if (!string.IsNullOrEmpty(url)) + { + url = (url.Contains("://")) ? url : PageState.Alias.BaseUrl + url; + await interop.IncludeScript(id, url, integrity, crossorigin, "", "head"); + } + else + { + index = script.IndexOf(">") + 1; + await interop.IncludeScript(id, "", "", "", script.Substring(index, script.IndexOf("") - index), "head"); + } + index = PageState.Page.HeadContent.IndexOf("= 0) + { + headcontent = headcontent.Remove(index, headcontent.IndexOf("") + 9 - index); + index = headcontent.IndexOf(""; diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index e0079e67..fef79e52 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -125,6 +125,10 @@ namespace Oqtane.Pages { ReconnectScript = CreateReconnectScript(); } + if (!string.IsNullOrEmpty(site.HeadContent)) + { + ProcessHeadContent(site.HeadContent); + } var ThemeType = site.DefaultThemeType; // get jwt token for downstream APIs @@ -166,6 +170,8 @@ namespace Oqtane.Pages } } + ProcessHeadContent(page.HeadContent); + // include global resources var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); foreach (Assembly assembly in assemblies) @@ -376,6 +382,20 @@ namespace Oqtane.Pages } } + private void ProcessHeadContent(string headcontent) + { + // iterate scripts + if (headcontent != null) + { + var index = headcontent.IndexOf("= 0) + { + HeadResources += headcontent.Substring(index, headcontent.IndexOf("", index) + 9 - index) + Environment.NewLine; + index = headcontent.IndexOf("