diff --git a/src/Lidarr.Http/Authentication/EnableAuthInNancy.cs b/src/Lidarr.Http/Authentication/EnableAuthInNancy.cs index 1d619583d..70887f9af 100644 --- a/src/Lidarr.Http/Authentication/EnableAuthInNancy.cs +++ b/src/Lidarr.Http/Authentication/EnableAuthInNancy.cs @@ -71,7 +71,6 @@ namespace Lidarr.Http.Authentication ); FormsAuthConfig = new FormsAuthenticationConfiguration - { RedirectUrl = _configFileProvider.UrlBase + "/login", UserMapper = _authenticationService, diff --git a/src/Lidarr.Http/Extensions/Pipelines/UrlBasePipeline.cs b/src/Lidarr.Http/Extensions/Pipelines/UrlBasePipeline.cs index d8c765e67..85793213f 100644 --- a/src/Lidarr.Http/Extensions/Pipelines/UrlBasePipeline.cs +++ b/src/Lidarr.Http/Extensions/Pipelines/UrlBasePipeline.cs @@ -1,11 +1,11 @@ -using System; +using System; using Nancy; using Nancy.Bootstrapper; using Nancy.Responses; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; -namespace NzbDrone.Api.Extensions.Pipelines +namespace Lidarr.Http.Extensions.Pipelines { public class UrlBasePipeline : IRegisterNancyPipeline { @@ -43,4 +43,4 @@ namespace NzbDrone.Api.Extensions.Pipelines return null; } } -} \ No newline at end of file +} diff --git a/src/Lidarr.Http/Frontend/Mappers/HtmlMapperBase.cs b/src/Lidarr.Http/Frontend/Mappers/HtmlMapperBase.cs new file mode 100644 index 000000000..66a1c62f5 --- /dev/null +++ b/src/Lidarr.Http/Frontend/Mappers/HtmlMapperBase.cs @@ -0,0 +1,89 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; +using Nancy; +using NLog; +using NzbDrone.Common.Disk; +using NzbDrone.Common.EnvironmentInfo; + +namespace Lidarr.Http.Frontend.Mappers +{ + public abstract class HtmlMapperBase : StaticResourceMapperBase + { + private readonly IDiskProvider _diskProvider; + private readonly Func _cacheBreakProviderFactory; + private static readonly Regex ReplaceRegex = new Regex(@"(?:(?href|src)=\"")(?.*?(?css|js|png|ico|ics|svg))(?:\"")(?:\s(?data-no-hash))?", RegexOptions.Compiled | RegexOptions.IgnoreCase); + + private string _generatedContent; + + protected HtmlMapperBase(IDiskProvider diskProvider, + Func cacheBreakProviderFactory, + Logger logger) : base(diskProvider, logger) + { + _diskProvider = diskProvider; + _cacheBreakProviderFactory = cacheBreakProviderFactory; + } + + protected string HtmlPath; + protected string UrlBase; + + protected override Stream GetContentStream(string filePath) + { + var text = GetHtmlText(); + + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(text); + writer.Flush(); + stream.Position = 0; + return stream; + } + + public override Response GetResponse(string resourceUrl) + { + var response = base.GetResponse(resourceUrl); + response.Headers["X-UA-Compatible"] = "IE=edge"; + + return response; + } + + protected string GetHtmlText() + { + if (RuntimeInfo.IsProduction && _generatedContent != null) + { + return _generatedContent; + } + + var text = _diskProvider.ReadAllText(HtmlPath); + var cacheBreakProvider = _cacheBreakProviderFactory(); + + text = ReplaceRegex.Replace(text, match => + { + string url; + + if (match.Groups["nohash"].Success) + { + url = match.Groups["path"].Value; + } + + else + { + url = cacheBreakProvider.AddCacheBreakerToPath(match.Groups["path"].Value); + } + + return string.Format("{0}=\"{1}{2}\"", match.Groups["attribute"].Value, UrlBase, url); + }); + + text = ReplaceText(text); + + _generatedContent = text; + + return _generatedContent; + } + + protected virtual string ReplaceText(string text) + { + return text; + } + } +} diff --git a/src/Lidarr.Http/Frontend/Mappers/IndexHtmlMapper.cs b/src/Lidarr.Http/Frontend/Mappers/IndexHtmlMapper.cs index a0d9d2b47..d2e64d8b0 100644 --- a/src/Lidarr.Http/Frontend/Mappers/IndexHtmlMapper.cs +++ b/src/Lidarr.Http/Frontend/Mappers/IndexHtmlMapper.cs @@ -1,7 +1,5 @@ using System; using System.IO; -using System.Text.RegularExpressions; -using Nancy; using NLog; using NzbDrone.Common.Disk; using NzbDrone.Common.EnvironmentInfo; @@ -10,19 +8,12 @@ using NzbDrone.Core.Configuration; namespace Lidarr.Http.Frontend.Mappers { - public class IndexHtmlMapper : StaticResourceMapperBase + public class IndexHtmlMapper : HtmlMapperBase { - private readonly IDiskProvider _diskProvider; private readonly IConfigFileProvider _configFileProvider; private readonly IAnalyticsService _analyticsService; - private readonly Func _cacheBreakProviderFactory; - private readonly string _indexPath; - private static readonly Regex ReplaceRegex = new Regex(@"(?:(?href|src)=\"")(?.*?(?css|js|png|ico|ics|svg))(?:\"")(?:\s(?data-no-hash))?", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static string API_KEY; - private static string URL_BASE; - private string _generatedContent - ; public IndexHtmlMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, @@ -30,21 +21,20 @@ namespace Lidarr.Http.Frontend.Mappers IAnalyticsService analyticsService, Func cacheBreakProviderFactory, Logger logger) - : base(diskProvider, logger) + : base(diskProvider, cacheBreakProviderFactory, logger) { - _diskProvider = diskProvider; _configFileProvider = configFileProvider; _analyticsService = analyticsService; - _cacheBreakProviderFactory = cacheBreakProviderFactory; - _indexPath = Path.Combine(appFolderInfo.StartUpFolder, _configFileProvider.UiFolder, "index.html"); + + HtmlPath = Path.Combine(appFolderInfo.StartUpFolder, _configFileProvider.UiFolder, "index.html"); + UrlBase = configFileProvider.UrlBase; API_KEY = configFileProvider.ApiKey; - URL_BASE = configFileProvider.UrlBase; } public override string Map(string resourceUrl) { - return _indexPath; + return HtmlPath; } public override bool CanHandle(string resourceUrl) @@ -58,66 +48,18 @@ namespace Lidarr.Http.Frontend.Mappers } - public override Response GetResponse(string resourceUrl) + protected override string ReplaceText(string text) { - var response = base.GetResponse(resourceUrl); - response.Headers["X-UA-Compatible"] = "IE=edge"; - - return response; - } - - protected override Stream GetContentStream(string filePath) - { - var text = GetIndexText(); - - var stream = new MemoryStream(); - var writer = new StreamWriter(stream); - writer.Write(text); - writer.Flush(); - stream.Position = 0; - return stream; - } - - private string GetIndexText() - { - if (RuntimeInfo.IsProduction && _generatedContent != null) - { - return _generatedContent; - } - - var text = _diskProvider.ReadAllText(_indexPath); - - var cacheBreakProvider = _cacheBreakProviderFactory(); - - text = ReplaceRegex.Replace(text, match => - { - string url; - - if (match.Groups["nohash"].Success) - { - url = match.Groups["path"].Value; - } - - else - { - url = cacheBreakProvider.AddCacheBreakerToPath(match.Groups["path"].Value); - } - - return string.Format("{0}=\"{1}{2}\"", match.Groups["attribute"].Value, URL_BASE, url); - }); - - text = text.Replace("API_ROOT", URL_BASE + "/api/v1"); + text = text.Replace("API_ROOT", UrlBase + "/api/v1"); text = text.Replace("API_KEY", API_KEY); text = text.Replace("RELEASE", BuildInfo.Release); text = text.Replace("APP_VERSION", BuildInfo.Version.ToString()); text = text.Replace("APP_BRANCH", _configFileProvider.Branch.ToLower()); text = text.Replace("APP_ANALYTICS", _analyticsService.IsEnabled.ToString().ToLowerInvariant()); - text = text.Replace("URL_BASE", URL_BASE); + text = text.Replace("URL_BASE", UrlBase); text = text.Replace("IS_PRODUCTION", RuntimeInfo.IsProduction.ToString().ToLowerInvariant()); - _generatedContent = text; - - return _generatedContent; + return text; } } } diff --git a/src/Lidarr.Http/Frontend/Mappers/LoginHtmlMapper.cs b/src/Lidarr.Http/Frontend/Mappers/LoginHtmlMapper.cs index 22b4071da..a2290855c 100644 --- a/src/Lidarr.Http/Frontend/Mappers/LoginHtmlMapper.cs +++ b/src/Lidarr.Http/Frontend/Mappers/LoginHtmlMapper.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using Nancy; using NLog; @@ -7,7 +8,7 @@ using NzbDrone.Core.Configuration; namespace Lidarr.Http.Frontend.Mappers { - public class LoginHtmlMapper : StaticResourceMapperBase + public class LoginHtmlMapper : HtmlMapperBase { private readonly IDiskProvider _diskProvider; private readonly string _indexPath; @@ -16,56 +17,23 @@ namespace Lidarr.Http.Frontend.Mappers public LoginHtmlMapper(IAppFolderInfo appFolderInfo, IDiskProvider diskProvider, + Func cacheBreakProviderFactory, IConfigFileProvider configFileProvider, Logger logger) - : base(diskProvider, logger) + : base(diskProvider, cacheBreakProviderFactory, logger) { - _diskProvider = diskProvider; - _indexPath = Path.Combine(appFolderInfo.StartUpFolder, configFileProvider.UiFolder, "login.html"); + HtmlPath = Path.Combine(appFolderInfo.StartUpFolder, configFileProvider.UiFolder, "login.html"); + UrlBase = configFileProvider.UrlBase; } public override string Map(string resourceUrl) { - return _indexPath; + return HtmlPath; } public override bool CanHandle(string resourceUrl) { return resourceUrl.StartsWith("/login"); } - - public override Response GetResponse(string resourceUrl) - { - var response = base.GetResponse(resourceUrl); - response.Headers["X-UA-Compatible"] = "IE=edge"; - - return response; - } - - protected override Stream GetContentStream(string filePath) - { - var text = GetLoginText(); - - var stream = new MemoryStream(); - var writer = new StreamWriter(stream); - writer.Write(text); - writer.Flush(); - stream.Position = 0; - return stream; - } - - private string GetLoginText() - { - if (RuntimeInfo.IsProduction && _generatedContent != null) - { - return _generatedContent; - } - - var text = _diskProvider.ReadAllText(_indexPath); - - _generatedContent = text; - - return _generatedContent; - } } } diff --git a/src/Lidarr.Http/Lidarr.Http.csproj b/src/Lidarr.Http/Lidarr.Http.csproj index 4be66b7d9..d6af75307 100644 --- a/src/Lidarr.Http/Lidarr.Http.csproj +++ b/src/Lidarr.Http/Lidarr.Http.csproj @@ -87,12 +87,14 @@ + +