csp-builder
Version:
A builder tool to help generate Content Security Policies in a type-safe way
417 lines (316 loc) • 8.07 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
(function (PredefinedSource) {
PredefinedSource["None"] = "'none'";
PredefinedSource["ReportSample"] = "'report-sample'";
PredefinedSource["Self"] = "'self'";
PredefinedSource["StrictDynamic"] = "'strict-dynamic'";
PredefinedSource["UnsafeEval"] = "'unsafe-eval'";
PredefinedSource["UnsafeInline"] = "'unsafe-inline'";
})(exports.PredefinedSource || (exports.PredefinedSource = {}));
(function (SchemaSource) {
SchemaSource["Blob"] = "blob:";
SchemaSource["Data"] = "data:";
SchemaSource["Filesystem"] = "filesystem:";
SchemaSource["Http"] = "http:";
SchemaSource["Https"] = "https:";
SchemaSource["MediaStream"] = "mediastream:";
})(exports.SchemaSource || (exports.SchemaSource = {}));
(function (DirectiveType) {
DirectiveType["Fetch"] = "fetch";
DirectiveType["Document"] = "document";
DirectiveType["Navigation"] = "navigation";
DirectiveType["Reporting"] = "reporting";
DirectiveType["Other"] = "other";
})(exports.DirectiveType || (exports.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 exports.DirectiveType.Fetch;
}
}
class DefaultSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'default-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class FontSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'font-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class FrameSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'frame-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class ImageSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'img-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class ManifestSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'manifest-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
getMinimumCspVersion() {
return 3;
}
}
class MediaSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'media-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class ObjectSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'object-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class PrefetchSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'prefetch-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
getMinimumCspVersion() {
return 3;
}
}
class ScriptSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'script-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class StyleSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'style-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
}
class WorkerSource extends AbstractMultiValueDirective {
getDirectiveName() {
return 'worker-src';
}
getDirectiveType() {
return exports.DirectiveType.Fetch;
}
getMinimumCspVersion() {
return 3;
}
}
class BaseUri extends AbstractMultiValueDirective {
getDirectiveName() {
return 'base-uri';
}
getDirectiveType() {
return exports.DirectiveType.Document;
}
}
class PluginTypes extends AbstractMultiValueDirective {
getDirectiveName() {
return 'plugin-types';
}
getDirectiveType() {
return exports.DirectiveType.Document;
}
getMinimumCspVersion() {
return 2;
}
}
class Sandbox extends AbstractMultiValueDirective {
getDirectiveName() {
return 'sandbox';
}
getDirectiveType() {
return exports.DirectiveType.Document;
}
}
class FormAction extends AbstractMultiValueDirective {
getDirectiveName() {
return 'form-action';
}
getDirectiveType() {
return exports.DirectiveType.Navigation;
}
getMinimumCspVersion() {
return 2;
}
}
class FrameAncestors extends AbstractMultiValueDirective {
getDirectiveName() {
return 'frame-ancestors';
}
getDirectiveType() {
return exports.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 exports.DirectiveType.Reporting;
}
}
class ReportUri extends AbstractSingleValueDirective {
getDirectiveName() {
return 'report-uri';
}
getDirectiveType() {
return exports.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 exports.DirectiveType.Other;
}
}
class RequireSriFor extends AbstractSingleValueDirective {
getDirectiveName() {
return 'require-sri-for';
}
getDirectiveType() {
return exports.DirectiveType.Other;
}
}
class UpgradeInsecureRequests extends AbstractToggleDirective {
getDirectiveName() {
return 'upgrade-insecure-requests';
}
getDirectiveType() {
return exports.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();
}
}
exports.AbstractMultiValueDirective = AbstractMultiValueDirective;
exports.AbstractSingleValueDirective = AbstractSingleValueDirective;
exports.AbstractToggleDirective = AbstractToggleDirective;
exports.BaseUri = BaseUri;
exports.BlockAllMixedContent = BlockAllMixedContent;
exports.Builder = Builder;
exports.ConnectSource = ConnectSource;
exports.DefaultSource = DefaultSource;
exports.FontSource = FontSource;
exports.FormAction = FormAction;
exports.FrameAncestors = FrameAncestors;
exports.FrameSource = FrameSource;
exports.ImageSource = ImageSource;
exports.ManifestSource = ManifestSource;
exports.MediaSource = MediaSource;
exports.ObjectSource = ObjectSource;
exports.PluginTypes = PluginTypes;
exports.PrefetchSource = PrefetchSource;
exports.ReportTo = ReportTo;
exports.ReportUri = ReportUri;
exports.RequireSriFor = RequireSriFor;
exports.Sandbox = Sandbox;
exports.ScriptSource = ScriptSource;
exports.StyleSource = StyleSource;
exports.UpgradeInsecureRequests = UpgradeInsecureRequests;
exports.WorkerSource = WorkerSource;
//# sourceMappingURL=index.js.map