csp-builder
Version:
A builder tool to help generate Content Security Policies in a type-safe way
323 lines (295 loc) • 7.85 kB
JavaScript
var PredefinedSource;
(function (PredefinedSource) {
PredefinedSource["None"] = "'none'";
PredefinedSource["ReportSample"] = "'report-sample'";
PredefinedSource["Self"] = "'self'";
PredefinedSource["StrictDynamic"] = "'strict-dynamic'";
PredefinedSource["UnsafeEval"] = "'unsafe-eval'";
PredefinedSource["UnsafeInline"] = "'unsafe-inline'";
})(PredefinedSource || (PredefinedSource = {}));
var SchemaSource;
(function (SchemaSource) {
SchemaSource["Blob"] = "blob:";
SchemaSource["Data"] = "data:";
SchemaSource["Filesystem"] = "filesystem:";
SchemaSource["Http"] = "http:";
SchemaSource["Https"] = "https:";
SchemaSource["MediaStream"] = "mediastream:";
})(SchemaSource || (SchemaSource = {}));
var DirectiveType;
(function (DirectiveType) {
DirectiveType["Fetch"] = "fetch";
DirectiveType["Document"] = "document";
DirectiveType["Navigation"] = "navigation";
DirectiveType["Reporting"] = "reporting";
DirectiveType["Other"] = "other";
})(DirectiveType || (DirectiveType = {}));
class AbstractMultiValueDirective {
constructor() {
this.state = new Set();
}
addValue(value) {
const values = Array.isArray(value) ? value : [value];
this.state = new Set([...this.state, ...values]);
return this;
}
serialize() {
const sources = Array.from(this.state).join(' ');
return `${this.getDirectiveName()} ${sources};`;
}
getMinimumCspVersion() {
return 1;
}
}
class ConnectSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'connect-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class DefaultSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'default-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class FontSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'font-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class FrameSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'frame-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class ImageSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'img-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class ManifestSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'manifest-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
getMinimumCspVersion() {
return 3;
}
}
class MediaSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'media-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class ObjectSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'object-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class PrefetchSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'prefetch-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
getMinimumCspVersion() {
return 3;
}
}
class ScriptSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'script-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class StyleSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'style-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
}
class WorkerSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'worker-src';
}
getDirectiveType() {
return DirectiveType.Fetch;
}
getMinimumCspVersion() {
return 3;
}
}
class BaseUri extends AbstractMultiValueDirective {
getDirectiveName() {
return 'base-uri';
}
getDirectiveType() {
return DirectiveType.Document;
}
}
class PluginTypes extends AbstractMultiValueDirective {
getDirectiveName() {
return 'plugin-types';
}
getDirectiveType() {
return DirectiveType.Document;
}
getMinimumCspVersion() {
return 2;
}
}
class Sandbox extends AbstractMultiValueDirective {
getDirectiveName() {
return 'sandbox';
}
getDirectiveType() {
return DirectiveType.Document;
}
}
class FormAction extends AbstractMultiValueDirective {
getDirectiveName() {
return 'form-action';
}
getDirectiveType() {
return DirectiveType.Navigation;
}
getMinimumCspVersion() {
return 2;
}
}
class FrameAncestors extends AbstractMultiValueDirective {
getDirectiveName() {
return 'frame-ancestors';
}
getDirectiveType() {
return DirectiveType.Navigation;
}
getMinimumCspVersion() {
return 2;
}
}
class AbstractSingleValueDirective {
constructor() {
this.state = null;
}
setValue(value) {
this.state = value;
return this;
}
getMinimumCspVersion() {
return 1;
}
serialize() {
if (!this.state) {
return '';
}
return `${this.getDirectiveName()} ${this.state};`;
}
}
class ReportTo extends AbstractSingleValueDirective {
getDirectiveName() {
return 'report-to';
}
getDirectiveType() {
return DirectiveType.Reporting;
}
}
class ReportUri extends AbstractSingleValueDirective {
getDirectiveName() {
return 'report-uri';
}
getDirectiveType() {
return DirectiveType.Reporting;
}
}
class AbstractToggleDirective {
constructor() {
this.state = false;
}
toggle(value) {
this.state = value;
return this;
}
getMinimumCspVersion() {
return 1;
}
serialize() {
if (!this.state) {
return '';
}
return `${this.getDirectiveName()};`;
}
}
class BlockAllMixedContent extends AbstractToggleDirective {
getDirectiveName() {
return 'block-all-mixed-content';
}
getDirectiveType() {
return DirectiveType.Other;
}
}
class RequireSriFor extends AbstractSingleValueDirective {
getDirectiveName() {
return 'require-sri-for';
}
getDirectiveType() {
return DirectiveType.Other;
}
}
class UpgradeInsecureRequests extends AbstractToggleDirective {
getDirectiveName() {
return 'upgrade-insecure-requests';
}
getDirectiveType() {
return DirectiveType.Other;
}
}
class Builder {
constructor(level = 3) {
this.directives = new Map();
this.level = level;
}
addDirective(directive) {
const directiveName = directive.getDirectiveName();
if (directive.getMinimumCspVersion() > this.level) {
throw new Error(`Directive ${directiveName} is not supported by CSP level of ${this.level}`);
}
this.directives.set(directiveName, directive);
return this;
}
stringify() {
return Array.from(this.directives.values())
.map((directive) => directive.serialize())
.join(' ')
.trim();
}
}
export { AbstractMultiValueDirective, AbstractSingleValueDirective, AbstractToggleDirective, BaseUri, BlockAllMixedContent, Builder, ConnectSource, DefaultSource, DirectiveType, FontSource, FormAction, FrameAncestors, FrameSource, ImageSource, ManifestSource, MediaSource, ObjectSource, PluginTypes, PredefinedSource, PrefetchSource, ReportTo, ReportUri, RequireSriFor, Sandbox, SchemaSource, ScriptSource, StyleSource, UpgradeInsecureRequests, WorkerSource };
//# sourceMappingURL=index.js.map