diff options
Diffstat (limited to 'app.js')
-rw-r--r-- | app.js | 40 |
1 files changed, 35 insertions, 5 deletions
@@ -125,7 +125,28 @@ function getCspWebSocketUrl (req, res) { return (req.protocol === 'http' ? 'ws:' : 'wss:') + config.serverurl.replace(/https?:/, "") } +function mergeWithDefaults(configured, defaultDirective, cdnDirective) { + var directive = [].concat(configured) + if (config.csp.addDefaults && defaultDirective) { + directive = directive.concat(defaultDirective) + } + if (config.usecdn && cdnDirective) { + directive = directive.concat(cdnDirective) + } + return directive +} + if (config.csp.enable) { + var defaultDirectives = { + defaultSrc: ['\'self\''], + scriptSrc: ['\'self\'', 'vimeo.com', 'https://gist.github.com', 'www.slideshare.net', 'https://query.yahooapis.com', 'https://*.disqus.com', '\'unsafe-eval\''], // TODO: Remove unsafe-eval - webpack script-loader issues + imgSrc: ['*'], + styleSrc: ['\'self\'', '\'unsafe-inline\'', 'https://assets-cdn.github.com'], // unsafe-inline is required for some libs, plus used in views + fontSrc: ['\'self\'', 'https://public.slidesharecdn.com'], + objectSrc: ['*'], // Chrome PDF viewer treats PDFs as objects :/ + childSrc: ['*'], + connectSrc: ['\'self\'', 'https://links.services.disqus.com', 'wss://realtime.services.disqus.com'] + }; var cdnDirectives = { scriptSrc: ['https://cdnjs.cloudflare.com', 'https://cdn.mathjax.org'], styleSrc: ['https://cdnjs.cloudflare.com', 'https://fonts.googleapis.com'], @@ -134,11 +155,20 @@ if (config.csp.enable) { var directives = {} for (var propertyName in config.csp.directives) { if (config.csp.directives.hasOwnProperty(propertyName)) { - var directive = [].concat(config.csp.directives[propertyName]) - if (config.usecdn && !!cdnDirectives[propertyName]) { - directive = directive.concat(cdnDirectives[propertyName]) - } - directives[propertyName] = directive + directives[propertyName] = mergeWithDefaults( + config.csp.directives[propertyName], + defaultDirectives[propertyName], + cdnDirectives[propertyName] + ) + } + } + for (var propertyName in defaultDirectives) { + if (!directives[propertyName]) { + directives[propertyName] = mergeWithDefaults( + [], + defaultDirectives[propertyName], + cdnDirectives[propertyName] + ) } } directives.scriptSrc.push(getCspNonce) |