diff --git a/src/Jackett.Common/Content/custom.css b/src/Jackett.Common/Content/custom.css index 1f4ae8bac..00d5a48a1 100644 --- a/src/Jackett.Common/Content/custom.css +++ b/src/Jackett.Common/Content/custom.css @@ -177,7 +177,7 @@ hr { text-align: center; } -#jackett-allowext, #jackett-allowupdate, #jackett-logging, #jackett-prerelease, #jackett-cache-enabled { +#jackett-allowext, #jackett-allowcors, #jackett-allowupdate, #jackett-logging, #jackett-prerelease, #jackett-cache-enabled { width: 25px; } diff --git a/src/Jackett.Common/Content/custom.js b/src/Jackett.Common/Content/custom.js index a94a77b09..73aa6061e 100644 --- a/src/Jackett.Common/Content/custom.js +++ b/src/Jackett.Common/Content/custom.js @@ -125,6 +125,7 @@ function loadJackettSettings() { $("#jackett-savedir").val(data.blackholedir); $("#jackett-allowext").attr('checked', data.external); + $("#jackett-allowcors").attr('checked', data.cors); $("#jackett-allowupdate").attr('checked', data.updatedisabled); $("#jackett-prerelease").attr('checked', data.prerelease); $("#jackett-logging").attr('checked', data.logging); @@ -1528,6 +1529,7 @@ function bindUIButtons() { var jackett_basepathoverride = $("#jackett-basepathoverride").val(); var jackett_baseurloverride = $("#jackett-baseurloverride").val(); var jackett_external = $("#jackett-allowext").is(':checked'); + var jackett_cors = $("#jackett-allowcors").is(':checked'); var jackett_update = $("#jackett-allowupdate").is(':checked'); var jackett_prerelease = $("#jackett-prerelease").is(':checked'); var jackett_logging = $("#jackett-logging").is(':checked'); @@ -1548,6 +1550,7 @@ function bindUIButtons() { var jsonObject = { port: jackett_port, external: jackett_external, + cors: jackett_cors, updatedisabled: jackett_update, prerelease: jackett_prerelease, blackholedir: $("#jackett-savedir").val(), diff --git a/src/Jackett.Common/Content/custom_mobile.css b/src/Jackett.Common/Content/custom_mobile.css index 49d583c03..17d104c0a 100644 --- a/src/Jackett.Common/Content/custom_mobile.css +++ b/src/Jackett.Common/Content/custom_mobile.css @@ -161,7 +161,7 @@ hr { text-align: center; } -#jackett-allowext, #jackett-allowupdate, #jackett-logging, #jackett-prerelease, #jackett-cache-enabled { +#jackett-allowext, #jackett-allowcors, #jackett-allowupdate, #jackett-logging, #jackett-prerelease, #jackett-cache-enabled { width: 25px; } diff --git a/src/Jackett.Common/Content/index.html b/src/Jackett.Common/Content/index.html index 110f535ee..8af24404a 100644 --- a/src/Jackett.Common/Content/index.html +++ b/src/Jackett.Common/Content/index.html @@ -28,8 +28,8 @@ - - + + @@ -178,6 +178,10 @@ External access: +
+ Allow CORS: + +
Disable auto update: diff --git a/src/Jackett.Common/Content/login.html b/src/Jackett.Common/Content/login.html index 26fe156b6..88947dc4d 100644 --- a/src/Jackett.Common/Content/login.html +++ b/src/Jackett.Common/Content/login.html @@ -16,7 +16,7 @@ - + Jackett diff --git a/src/Jackett.Common/Models/Config/ServerConfig.cs b/src/Jackett.Common/Models/Config/ServerConfig.cs index 4bd02c42e..f2e6f9e9e 100644 --- a/src/Jackett.Common/Models/Config/ServerConfig.cs +++ b/src/Jackett.Common/Models/Config/ServerConfig.cs @@ -33,6 +33,7 @@ namespace Jackett.Common.Models.Config public int Port { get; set; } public bool AllowExternal { get; set; } + public bool AllowCORS { get; set; } public string APIKey { get; set; } public string AdminPassword { get; set; } public string InstanceId { get; set; } diff --git a/src/Jackett.Common/Models/DTO/ServerConfig.cs b/src/Jackett.Common/Models/DTO/ServerConfig.cs index 9a02428cd..84df88b0f 100644 --- a/src/Jackett.Common/Models/DTO/ServerConfig.cs +++ b/src/Jackett.Common/Models/DTO/ServerConfig.cs @@ -14,6 +14,8 @@ namespace Jackett.Common.Models.DTO [DataMember] public bool external { get; set; } [DataMember] + public bool cors { get; set; } + [DataMember] public string api_key { get; set; } [DataMember] public string blackholedir { get; set; } @@ -66,6 +68,7 @@ namespace Jackett.Common.Models.DTO this.notices = notices; port = config.Port; external = config.AllowExternal; + cors = config.AllowCORS; api_key = config.APIKey; blackholedir = config.BlackholeDir; updatedisabled = config.UpdateDisabled; diff --git a/src/Jackett.Server/Controllers/ServerConfigurationController.cs b/src/Jackett.Server/Controllers/ServerConfigurationController.cs index 6da0d4671..521cb8274 100644 --- a/src/Jackett.Server/Controllers/ServerConfigurationController.cs +++ b/src/Jackett.Server/Controllers/ServerConfigurationController.cs @@ -79,6 +79,7 @@ namespace Jackett.Server.Controllers var originalAllowExternal = serverConfig.AllowExternal; var port = config.port; var external = config.external; + var cors = config.cors; var saveDir = config.blackholedir; var updateDisabled = config.updatedisabled; var preRelease = config.prerelease; @@ -113,10 +114,12 @@ namespace Jackett.Server.Controllers var omdbApiUrl = config.omdburl; if (config.basepathoverride != serverConfig.BasePathOverride) - { webHostRestartNeeded = true; - } + if (config.cors != serverConfig.AllowCORS) + webHostRestartNeeded = true; + + serverConfig.AllowCORS = cors; serverConfig.UpdateDisabled = updateDisabled; serverConfig.UpdatePrerelease = preRelease; serverConfig.BasePathOverride = basePathOverride; diff --git a/src/Jackett.Server/Startup.cs b/src/Jackett.Server/Startup.cs index 64949b2a4..785ddc240 100644 --- a/src/Jackett.Server/Startup.cs +++ b/src/Jackett.Server/Startup.cs @@ -30,6 +30,8 @@ namespace Jackett.Server { public class Startup { + private const string AllowAllOrigins = "AllowAllOrigins"; + public Startup(IConfiguration configuration) => Configuration = configuration; public IConfiguration Configuration { get; } @@ -37,9 +39,14 @@ namespace Jackett.Server // This method gets called by the runtime. Use this method to add services to the container. public IServiceProvider ConfigureServices(IServiceCollection services) { - services.AddResponseCompression(); + services.AddResponseCompression() + .AddCors( + options => + { + options.AddPolicy(name: AllowAllOrigins, corsPolicyBuilder => corsPolicyBuilder.AllowAnyOrigin()); - services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) + }) + .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { @@ -49,8 +56,6 @@ namespace Jackett.Server options.Cookie.Name = "Jackett"; }); - - #if NET461 services.AddMvc( config => config.Filters.Add( @@ -141,6 +146,9 @@ namespace Jackett.Server app.UseAuthentication(); + if (Helper.ServerConfiguration.AllowCORS) + app.UseCors(AllowAllOrigins); + app.UseMvc(); } #else @@ -183,6 +191,9 @@ namespace Jackett.Server app.UseRouting(); + if (Helper.ServerConfiguration.AllowCORS) + app.UseCors(AllowAllOrigins); + app.UseEndpoints(endpoints => endpoints.MapControllers()); } #endif