using System; using System.Text.RegularExpressions; using Diacritical; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.Extensions.DependencyInjection; using NzbDrone.Core.Authentication; using NzbDrone.Core.Configuration; namespace Lidarr.Http.Authentication { public static class AuthenticationBuilderExtensions { private static readonly Regex CookieNameRegex = new Regex(@"[^a-z0-9]+", RegexOptions.Compiled | RegexOptions.IgnoreCase); public static AuthenticationBuilder AddApiKey(this AuthenticationBuilder authenticationBuilder, string name, Action options) { return authenticationBuilder.AddScheme(name, options); } public static AuthenticationBuilder AddNone(this AuthenticationBuilder authenticationBuilder, string name) { return authenticationBuilder.AddScheme(name, options => { }); } public static AuthenticationBuilder AddExternal(this AuthenticationBuilder authenticationBuilder, string name) { return authenticationBuilder.AddScheme(name, options => { }); } public static AuthenticationBuilder AddAppAuthentication(this IServiceCollection services) { services.AddOptions(AuthenticationType.Forms.ToString()) .Configure((options, configFileProvider) => { // Replace diacritics and replace non-word characters to ensure cookie name doesn't contain any valid URL characters not allowed in cookie names var instanceName = configFileProvider.InstanceName; instanceName = instanceName.RemoveDiacritics(); instanceName = CookieNameRegex.Replace(instanceName, string.Empty); options.Cookie.Name = $"{instanceName}Auth"; options.AccessDeniedPath = "/login?loginFailed=true"; options.LoginPath = "/login"; options.ExpireTimeSpan = TimeSpan.FromDays(7); options.SlidingExpiration = true; options.ReturnUrlParameter = "returnUrl"; }); return services.AddAuthentication() .AddNone(AuthenticationType.None.ToString()) .AddExternal(AuthenticationType.External.ToString()) #pragma warning disable CS0618 // Type or member is obsolete .AddCookie(AuthenticationType.Basic.ToString()) #pragma warning restore CS0618 // Type or member is obsolete .AddCookie(AuthenticationType.Forms.ToString()) .AddApiKey("API", options => { options.HeaderName = "X-Api-Key"; options.QueryName = "apikey"; }) .AddApiKey("SignalR", options => { options.HeaderName = "X-Api-Key"; options.QueryName = "access_token"; }); } } }