Ejemplo n.º 1
0
 public static string ToFormatedString(this CommonPolicyDirective.Directive directive)
 {
     return(directive switch
     {
         CommonPolicyDirective.Directive.AllowAll => AllowAll,
         CommonPolicyDirective.Directive.AllowSelf => AllowSelf,
         CommonPolicyDirective.Directive.AllowSrc => AllowSrc,
         CommonPolicyDirective.Directive.DenyAll => DenyAll,
         CommonPolicyDirective.Directive.AllowOrigin => AllowOrigin,
         _ => DenyAll,
     });
 /// <summary>
 /// Adds a list of features to which the provided directive is applied.
 /// </summary>
 /// <param name="directive">Directive to apply.</param>
 /// <param name="features">Features.</param>
 /// <param name="hostSources">List of source uri if the directive requires one.</param>
 /// <returns></returns>
 public SecurityHeadersBuilder AddFeaturePolicy(CommonPolicyDirective.Directive directive, FeaturePolicyConstants.HttpFeatures features, IList <Uri> hostSources = null)
 {
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Accelerometer))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Accelerometer, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.AmbientLightSensor))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.AmbientLightSensor, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Autoplay))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Autoplay, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Battery))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Battery, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Camera))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Camera, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.DisplayCapture))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.DisplayCapture, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.DocumentDomain))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.DocumentDomain, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.EncryptedMedia))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.EncryptedMedia, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.ExecutionWhileNotRendered))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.ExecutionWhileNotRendered, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.ExecutionWhileOutOfViewport))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.ExecutionWhileOutOfViewport, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Fullscreen))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Fullscreen, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Geolocation))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Geolocation, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Gyroscope))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Gyroscope, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Magnetometer))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Magnetometer, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Microphone))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Microphone, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Midi))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Midi, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Payment))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Payment, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.PictureInPicture))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.PictureInPicture, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.PublickeyCredentials))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.PublickeyCredentials, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Speaker))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Speaker, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.SyncXhr))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.SyncXhr, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.Usb))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.Usb, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.WakeLock))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.WakeLock, directive);
     }
     if (features.HasFlag(FeaturePolicyConstants.HttpFeatures.XrSpatialTracking))
     {
         _features.TryAdd(FeaturePolicyConstants.HttpFeatures.XrSpatialTracking, directive);
     }
     _policy.SetHeaders[FeaturePolicyConstants.Header] = FeaturesToString(hostSources);
     return(this);
 }
        /// <summary>
        /// Adds a list of content security to which the provided directive is applied.
        /// </summary>
        /// <param name="directive">Directive to apply.</param>
        /// <param name="fetchDirective">Content security fetch directive.</param>
        /// <param name="hostSources">List of uri if the directive requires one.</param>
        /// <param name="schemeSources">List of scheme source authorized.</param>
        /// <param name="reportOnly">Indicates whether the rules are only there to generate a report.</param>
        /// <returns></returns>
        public SecurityHeadersBuilder AddContentSecurityPolicy(CommonPolicyDirective.Directive directive, ContentSecurityPolicyConstants.FetchDirectives fetchDirective, CommonPolicySchemeSource.SchemeSources schemeSources, IList <Uri> hostSources = null, bool reportOnly = true)
        {
            if (reportOnly && _reportUri == null)
            {
                throw new ReportUriMissingException();
            }

            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ChildSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ChildSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ConnectSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ConnectSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.DefaultSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.DefaultSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.FontSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.FontSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.FrameSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.FrameSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ImgSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ImgSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ManifestSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ManifestSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.MediaSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.MediaSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ObjectSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ObjectSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.PrefetchSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.PrefetchSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ScriptSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ScriptSrc, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ScriptSrcAttr))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ScriptSrcAttr, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.ScriptSrcElem))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.ScriptSrcElem, directive);
            }
            if (fetchDirective.HasFlag(ContentSecurityPolicyConstants.FetchDirectives.WorkerSrc))
            {
                _directives.TryAdd(ContentSecurityPolicyConstants.FetchDirectives.WorkerSrc, directive);
            }
            string header = ContentSecurityToString(hostSources);

            header += SchemeSourceToString(schemeSources);
            if (_reportUri != null)
            {
                header += "; " + CommonPolicyDirective.ReportUri + " " + _reportUri.AbsoluteUri;
            }
            if (reportOnly)
            {
                _policy.SetHeaders[ContentSecurityPolicyConstants.HeaderReportOnly] = header;
            }
            else
            {
                _policy.SetHeaders[ContentSecurityPolicyConstants.Header] = header;
            }
            return(this);
        }