// Copyright (c) André N. Klingsheim. See License.txt in the project root for license information. using System; using NWebsec.Core.HttpHeaders.Configuration; namespace NWebsec.Middleware { public class CspOptions : ICspConfiguration, IFluentCspOptions { public bool Enabled { get; set; } = true; public ICspDirectiveConfiguration DefaultSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration ScriptSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration ObjectSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration StyleSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration ImgSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration MediaSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration FrameSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration FontSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration ConnectSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration BaseUriDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration ChildSrcDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration FormActionDirective { get; set; } = new CspDirective(); public ICspDirectiveConfiguration FrameAncestorsDirective { get; set; } = new CspDirective(); public ICspPluginTypesDirectiveConfiguration PluginTypesDirective { get; set; } = new FluentCspPluginTypesDirective(); public ICspSandboxDirectiveConfiguration SandboxDirective { get; set; } = new FluentCspSandboxDirective(); public ICspUpgradeDirectiveConfiguration UpgradeInsecureRequestsDirective { get; set; } = new CspUpgradeDirectiveConfiguration(); public ICspReportUriDirectiveConfiguration ReportUriDirective { get; set; } = new CspReportUriDirective(); public IFluentCspOptions DefaultSources(Action configurer) { configurer(DefaultSrcDirective); return this; } public IFluentCspOptions ScriptSources(Action configurer) { configurer(ScriptSrcDirective); return this; } public IFluentCspOptions ObjectSources(Action configurer) { configurer(ObjectSrcDirective); return this; } public IFluentCspOptions StyleSources(Action configurer) { configurer(StyleSrcDirective); return this; } public IFluentCspOptions ImageSources(Action configurer) { configurer(ImgSrcDirective); return this; } public IFluentCspOptions MediaSources(Action configurer) { configurer(MediaSrcDirective); return this; } public IFluentCspOptions FrameSources(Action configurer) { configurer(FrameSrcDirective); return this; } public IFluentCspOptions FontSources(Action configurer) { configurer(FontSrcDirective); return this; } public IFluentCspOptions ConnectSources(Action configurer) { configurer(ConnectSrcDirective); return this; } public IFluentCspOptions BaseUris(Action configurer) { configurer(BaseUriDirective); return this; } public IFluentCspOptions ChildSources(Action configurer) { configurer(ChildSrcDirective); return this; } public IFluentCspOptions FormActions(Action configurer) { configurer(FormActionDirective); return this; } public IFluentCspOptions FrameAncestors(Action configurer) { configurer(FrameAncestorsDirective); return this; } public IFluentCspOptions PluginTypes(Action configurer) { configurer((IFluentCspPluginTypesDirective)PluginTypesDirective); return this; } public IFluentCspOptions Sandbox() { SandboxDirective.Enabled = true; return this; } public IFluentCspOptions Sandbox(Action configurer) { SandboxDirective.Enabled = true; configurer((IFluentCspSandboxDirective)SandboxDirective); return this; } public IFluentCspOptions UpgradeInsecureRequests(int httpsPort = 443) { if (httpsPort < 1 || httpsPort > 65535) { throw new ArgumentOutOfRangeException(nameof(httpsPort),"The port number must be in the range 1-65535."); } UpgradeInsecureRequestsDirective.Enabled = true; UpgradeInsecureRequestsDirective.HttpsPort = httpsPort; return this; } public IFluentCspOptions ReportUris(Action configurer) { configurer((IFluentCspReportUriDirective)ReportUriDirective); return this; } } }