1010
1111class Render
1212{
13+ /** @var \Flancer32\Csp\Helper\Config */
14+ private $ hlpCfg ;
1315 /** @var \Magento\Framework\App\State */
1416 private $ state ;
1517 /** @var \Magento\Backend\Model\Url */
@@ -20,11 +22,13 @@ class Render
2022 public function __construct (
2123 \Magento \Framework \App \State $ state ,
2224 \Magento \Backend \Model \Url $ urlBack ,
23- \Magento \Framework \Url $ urlFront
25+ \Magento \Framework \Url $ urlFront ,
26+ \Flancer32 \Csp \Helper \Config $ hlpCfg
2427 ) {
2528 $ this ->state = $ state ;
2629 $ this ->urlBack = $ urlBack ;
2730 $ this ->urlFront = $ urlFront ;
31+ $ this ->hlpCfg = $ hlpCfg ;
2832 }
2933
3034 /**
@@ -41,22 +45,38 @@ public function aroundExecute(
4145 ) {
4246 // Collect all CSP rules and compose HTTP header.
4347 $ proceed ($ observer );
44-
45- // Setup reporting in HTTP header.
46- /** @var \Magento\Framework\App\Response\HttpInterface $response */
47- $ response = $ observer ->getEvent ()->getData ('response ' );
48-
49- $ uri = $ this ->getReportUri ();
50-
51- // 'Report-To' is not widely supported yet, so remove it.
52- // (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-to)
53- $ response ->clearHeader ('Report-To ' );
54- // TODO: we should get 'Content-Security-Policy-Report-Only' or 'Content-Security-Policy'
55- $ cspHeader = $ response ->getHeader ('Content-Security-Policy-Report-Only ' );
56- $ value = $ cspHeader ->getFieldValue ();
57- $ value = str_replace ('report-to report-endpoint; ' , '' , $ value );
58- $ value .= " report-uri $ uri; " ;
59- $ response ->setHeader ('Content-Security-Policy-Report-Only ' , $ value );
48+ // ... then modify HTTP header
49+ if ($ this ->hlpCfg ->getEnabled ()) {
50+ // Setup reporting in HTTP header.
51+ /** @var \Magento\Framework\App\Response\HttpInterface $response */
52+ $ response = $ observer ->getEvent ()->getData ('response ' );
53+ // URI to get CSP violation reports for admin/front areas
54+ $ uri = $ this ->getReportUri ();
55+ // 'Report-To' is not widely supported yet, so remove it. Use 'report-uri' directive instead.
56+ // (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-to)
57+ $ response ->clearHeader ('Report-To ' );
58+ // Get current CSP header and clear it.
59+ $ cspHeader = $ response ->getHeader (Cfg::HTTP_HEAD_CSP_REPORT_ONLY );
60+ if ($ cspHeader ) {
61+ $ response ->clearHeader (Cfg::HTTP_HEAD_CSP_REPORT_ONLY );
62+ } else {
63+ $ cspHeader = $ response ->getHeader (Cfg::HTTP_HEAD_CSP );
64+ $ response ->clearHeader (Cfg::HTTP_HEAD_CSP );
65+ }
66+ // Modify CSP header if exists.
67+ if ($ cspHeader ) {
68+ $ value = $ cspHeader ->getFieldValue ();
69+ // use deprecated 'report-uri' instead of 'report-to' because Chrome doesn't work correctly with
70+ // new 'report'to' or with both directives.
71+ $ value = str_replace ('report-to report-endpoint; ' , '' , $ value );
72+ // only one 'report-uri' directive is allowed
73+ $ pattern = '/report-uri\s*.*;/ ' ;
74+ $ value = preg_replace ($ pattern , '' , $ value );
75+ $ value .= "report-uri $ uri; " ;
76+ $ header = $ this ->hlpCfg ->getRulesReportOnly () ? Cfg::HTTP_HEAD_CSP_REPORT_ONLY : Cfg::HTTP_HEAD_CSP ;
77+ $ response ->setHeader ($ header , $ value );
78+ }
79+ }
6080 }
6181
6282 private function getReportUri ()
0 commit comments