@namespace Oqtane.Components @using Microsoft.AspNetCore.Http @using Microsoft.AspNetCore.Http.Extensions @using Microsoft.AspNetCore.Antiforgery @using Oqtane.Client @using Oqtane.Client.Utilities @using Oqtane.Repository @using Oqtane.Infrastructure @using Oqtane.Security @using Oqtane.Models @using Oqtane.Shared @using Oqtane.Themes @using System.Net @using Microsoft.AspNetCore.Localization @inject NavigationManager NavigationManager @inject IAntiforgery Antiforgery; @inject IConfigManager ConfigManager; @inject ITenantManager TenantManager; @inject ISiteRepository SiteRepository; @inject IPageRepository PageRepository; @inject IThemeRepository ThemeRepository; @inject ILanguageRepository LanguageRepository; @inject IServerStateManager ServerStateManager; @inject ILocalizationManager LocalizationManager; @inject IAliasRepository AliasRepository; @if (!string.IsNullOrEmpty(_PWAScript)) { } @((MarkupString)_styleSheets) @((MarkupString)_headResources) @if (string.IsNullOrEmpty(_message)) { @if (!string.IsNullOrEmpty(_reconnectScript)) { @((MarkupString)_reconnectScript) } @if (!string.IsNullOrEmpty(_PWAScript)) { @((MarkupString)_PWAScript) } @((MarkupString)_bodyResources) } else {
@_message
} @code { private string _interactiveRenderMode = "InteractiveServer"; private string _language = "en"; private string _antiForgeryToken = ""; private string _remoteIPAddress = ""; private string _headResources = ""; private string _bodyResources = ""; private string _styleSheets = ""; private string _PWAScript = ""; private string _reconnectScript = ""; private string _message = ""; // CascadingParameter is required to access HttpContext [CascadingParameter] HttpContext Context { get; set; } protected override void OnInitialized() { _antiForgeryToken = Antiforgery.GetAndStoreTokens(Context).RequestToken; _remoteIPAddress = Context.Connection.RemoteIpAddress?.ToString() ?? ""; // if framework is installed if (ConfigManager.IsInstalled()) { var alias = TenantManager.GetAlias(); if (alias != null) { var url = WebUtility.UrlDecode(Context.Request.GetEncodedUrl()); HandleDefaultAliasRedirect(alias, url); var site = SiteRepository.GetSite(alias.SiteId); if (site != null && (!site.IsDeleted || url.Contains("admin/site")) && site.Runtime != "Hybrid") { // if (!string.IsNullOrEmpty(site.Runtime)) // { // Runtime = site.Runtime; // } // if (!string.IsNullOrEmpty(site.RenderMode)) // { // RenderMode = site.RenderMode; // } Route route = new Route(url, alias.Path); var page = PageRepository.GetPage(route.PagePath, site.SiteId); if (page == null && route.PagePath == "" && site.HomePageId != null) { page = PageRepository.GetPage(site.HomePageId.Value); } // if (page == null || page.IsDeleted) // { // // page not found - look for url mapping // var urlMapping = _urlMappings.GetUrlMapping(site.SiteId, route.PagePath); // if (urlMapping != null && !string.IsNullOrEmpty(urlMapping.MappedUrl)) // { // url = (urlMapping.MappedUrl.StartsWith("http")) ? urlMapping.MappedUrl : route.SiteUrl + "/" + urlMapping.MappedUrl; // return RedirectPermanent(url); // } // else // { // if (route.PagePath != "404") // { // return RedirectPermanent(route.SiteUrl + "/404"); // } // } // } // if (site.VisitorTracking) // { // TrackVisitor(site.SiteId); // } // get jwt token for downstream APIs // if (User.Identity.IsAuthenticated) // { // var sitesettings = HttpContext.GetSiteSettings(); // var secret = sitesettings.GetValue("JwtOptions:Secret", ""); // if (!string.IsNullOrEmpty(secret)) // { // AuthorizationToken = _jwtManager.GenerateToken(alias, (ClaimsIdentity)User.Identity, secret, sitesettings.GetValue("JwtOptions:Issuer", ""), sitesettings.GetValue("JwtOptions:Audience", ""), int.Parse(sitesettings.GetValue("JwtOptions:Lifetime", "20"))); // } // } // stylesheets var themes = ThemeRepository.GetThemes().ToList(); var resources = new List(); if (string.IsNullOrEmpty(page.ThemeType)) { page.ThemeType = site.DefaultThemeType; } var theme = themes.FirstOrDefault(item => item.Themes.Any(item => item.TypeName == page.ThemeType)); if (theme?.Resources != null) { resources.AddRange(theme.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet).ToList()); } var type = Type.GetType(page.ThemeType); if (type != null) { var obj = Activator.CreateInstance(type) as IThemeControl; if (obj?.Resources != null) { resources.AddRange(obj.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet).ToList()); } } ManageStyleSheets(resources, alias, theme.ThemeName); // scripts if (_interactiveRenderMode == "InteractiveServer") { _reconnectScript = CreateReconnectScript(); } if (site.PwaIsEnabled && site.PwaAppIconFileId != null && site.PwaSplashIconFileId != null) { _PWAScript = CreatePWAScript(alias, site, route); } _headResources += ParseScripts(site.HeadContent); _bodyResources += ParseScripts(site.BodyContent); var scripts = ServerStateManager.GetServerState(alias.SiteKey).Scripts; foreach (var script in scripts) { AddScript(script, alias); } // set culture if not specified string culture = Context.Request.Cookies[CookieRequestCultureProvider.DefaultCookieName]; if (culture == null) { // get default language for site var languages = LanguageRepository.GetLanguages(alias.SiteId); if (languages.Any()) { // use default language if specified otherwise use first language in collection culture = (languages.Where(l => l.IsDefault).SingleOrDefault() ?? languages.First()).Code; } else { culture = LocalizationManager.GetDefaultCulture(); } SetLocalizationCookie(culture); } // set language for page if (!string.IsNullOrEmpty(culture)) { // localization cookie value in form of c=en|uic=en _language = culture.Split('|')[0]; _language = _language.Replace("c=", ""); } } else { _message = "Site Is Disabled"; } } else { _message = "Site Not Configured Correctly - No Matching Alias Exists For Host Name"; } } } private void HandleDefaultAliasRedirect(Alias alias, string url) { // redirect non-default alias if (!alias.IsDefault) { // get aliases for site and tenant var aliases = AliasRepository.GetAliases().Where(item => item.TenantId == alias.TenantId && item.SiteId == alias.SiteId); // get first default alias var defaultAlias = aliases.Where(item => item.IsDefault).FirstOrDefault(); if (defaultAlias != null) { // redirect to default alias NavigationManager.NavigateTo(url.Replace(alias.Name, defaultAlias.Name), true); } else // no default alias specified - use first alias { defaultAlias = aliases.FirstOrDefault(); if (defaultAlias != null && alias.Name.Trim() != defaultAlias.Name.Trim()) { // redirect to first alias NavigationManager.NavigateTo(url.Replace(alias.Name, defaultAlias.Name), true); } } } } private string CreatePWAScript(Alias alias, Site site, Route route) { return "" + Environment.NewLine + ""; } private string CreateReconnectScript() { return ""; } private string ParseScripts(string content) { // iterate scripts var scripts = ""; if (!string.IsNullOrEmpty(content)) { var index = content.IndexOf("= 0) { scripts += content.Substring(index, content.IndexOf("", index) + 9 - index); index = content.IndexOf(""; } else { // inline script return ""; } } private void SetLocalizationCookie(string culture) { Context.Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture))); } private void ManageStyleSheets(List resources, Alias alias, string name) { if (resources != null) { int count = 0; foreach (var resource in resources) { if (resource.Url.StartsWith("~")) { resource.Url = resource.Url.Replace("~", "/Themes/" + Utilities.GetTypeName(name) + "/").Replace("//", "/"); } if (!resource.Url.Contains("://") && alias.BaseUrl != "" && !resource.Url.StartsWith(alias.BaseUrl)) { resource.Url = alias.BaseUrl + resource.Url; } if (!_styleSheets.Contains(resource.Url, StringComparison.OrdinalIgnoreCase)) { count++; string id = "id=\"app-stylesheet-" + ResourceLevel.Page.ToString().ToLower() + "-" + DateTime.UtcNow.ToString("yyyyMMddHHmmssfff") + "-" + count.ToString("00") + "\" "; _styleSheets += "" + Environment.NewLine; } } } } }