pr_19550.patch 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. diff --git a/services/web/app/src/infrastructure/CSP.js b/services/web/app/src/infrastructure/CSP.js
  2. index 28f4f380d3d..abc11c59a48 100644
  3. --- a/services/web/app/src/infrastructure/CSP.js
  4. +++ b/services/web/app/src/infrastructure/CSP.js
  5. @@ -6,6 +6,7 @@ module.exports = function ({
  6. reportPercentage,
  7. reportOnly = false,
  8. exclude = [],
  9. + viewDirectives = {},
  10. }) {
  11. const header = reportOnly
  12. ? 'Content-Security-Policy-Report-Only'
  13. @@ -33,7 +34,12 @@ module.exports = function ({
  14. res.locals.scriptNonce = scriptNonce
  15. - const policy = buildViewPolicy(scriptNonce, reportPercentage, reportUri)
  16. + const policy = buildViewPolicy(
  17. + scriptNonce,
  18. + reportPercentage,
  19. + reportUri,
  20. + viewDirectives[view]
  21. + )
  22. // Note: https://csp-evaluator.withgoogle.com/ is useful for checking the policy
  23. @@ -68,11 +74,17 @@ const buildDefaultPolicy = (reportUri, styleSrc) => {
  24. return directives.join('; ')
  25. }
  26. -const buildViewPolicy = (scriptNonce, reportPercentage, reportUri) => {
  27. +const buildViewPolicy = (
  28. + scriptNonce,
  29. + reportPercentage,
  30. + reportUri,
  31. + viewDirectives
  32. +) => {
  33. const directives = [
  34. `script-src 'nonce-${scriptNonce}' 'unsafe-inline' 'strict-dynamic' https: 'report-sample'`, // only allow scripts from certain sources
  35. `object-src 'none'`, // forbid loading an "object" element
  36. `base-uri 'none'`, // forbid setting a "base" element
  37. + ...(viewDirectives ?? []),
  38. ]
  39. if (reportUri) {
  40. diff --git a/services/web/config/settings.defaults.js b/services/web/config/settings.defaults.js
  41. index cad13ab8156..ab738babdcd 100644
  42. --- a/services/web/config/settings.defaults.js
  43. +++ b/services/web/config/settings.defaults.js
  44. @@ -911,6 +911,9 @@ module.exports = {
  45. reportPercentage: parseFloat(process.env.CSP_REPORT_PERCENTAGE) || 0,
  46. reportUri: process.env.CSP_REPORT_URI,
  47. exclude: [],
  48. + viewDirectives: {
  49. + 'app/views/project/ide-react': [`img-src 'self' data: blob:`],
  50. + },
  51. },
  52. unsupportedBrowsers: {