From 750d8f1b3001e3ae918e77ab4925600f4eeee455 Mon Sep 17 00:00:00 2001 From: EECOLOR Date: Wed, 30 Oct 2024 11:00:01 +0100 Subject: [PATCH 1/3] Add support for inline scripts in combination with CSP header --- library/lib/SafeScript.js | 19 ++++++++++ library/lib/rollbar.js | 3 +- library/lib/serve.js | 42 ++++++++++++++++++---- library/lib/stylesheet.js | 5 +-- library/lib/universalComponents.js | 3 +- library/webpack-loaders/template-loader.js | 1 + library/webpack-plugins/template-plugin.js | 8 +++-- 7 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 library/lib/SafeScript.js diff --git a/library/lib/SafeScript.js b/library/lib/SafeScript.js new file mode 100644 index 00000000..70280691 --- /dev/null +++ b/library/lib/SafeScript.js @@ -0,0 +1,19 @@ +const crypto = require('crypto') +const React = require('react') + +let scriptHashes = null + +module.exports = { SafeScript, recordScriptHashes } + +function SafeScript({ dangerouslySetInnerHTML }) { + if (!scriptHashes) throw new Error('No script hashes present') + scriptHashes.add(crypto.createHash('sha256').update(dangerouslySetInnerHTML.__html).digest('base64')) + return React.createElement('script', { dangerouslySetInnerHTML }) +} + +function recordScriptHashes(newScriptHashses, callback) { + scriptHashes = newScriptHashses + const result = callback() + scriptHashes = null + return result +} diff --git a/library/lib/rollbar.js b/library/lib/rollbar.js index 63d1ef51..ba8501db 100644 --- a/library/lib/rollbar.js +++ b/library/lib/rollbar.js @@ -1,5 +1,6 @@ import fs from 'fs' import merge from 'rollbar/src/merge' +import { SafeScript } from './SafeScript' const snippet = fs.readFileSync(__non_webpack_require__.resolve('rollbar/dist/rollbar.snippet.js'), 'utf8') @@ -15,5 +16,5 @@ const defaultOptions = { export default function rollbar(options, nonSerializableRollbarConfig = '/* no non-serializable config */') { const config = JSON.stringify(merge(defaultOptions, options)) const __html = `var _rollbarConfig = ${config};${nonSerializableRollbarConfig};${snippet}` - return