@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)
@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("", 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;
}
}
}
}
}