@@ -2,9 +2,9 @@ var RequestGuard = (() => {
22 'use strict' ;
33 const VERSION_LABEL = `NoScript ${ browser . runtime . getManifest ( ) . version } ` ;
44 browser . browserAction . setTitle ( { title : VERSION_LABEL } ) ;
5- const REPORT_URI = "https://noscript-csp.invalid/__NoScript_Probe__/" ;
6- const REPORT_GROUP = "NoScript-Endpoint " ;
7- let csp = new ReportingCSP ( REPORT_URI , REPORT_GROUP ) ;
5+ const CSP_REPORT_URI = "https://noscript-csp.invalid/__NoScript_Probe__/" ;
6+ const CSP_MARKER = "noscript-marker " ;
7+ let csp = new ReportingCSP ( CSP_MARKER , CSP_REPORT_URI ) ;
88 const policyTypesMap = {
99 main_frame : "" ,
1010 sub_frame : "frame" ,
@@ -172,6 +172,19 @@ var RequestGuard = (() => {
172172 TabStatus . recordAll ( sender . tab . id , message . seen ) ;
173173 return true ;
174174 } ,
175+ violation ( { url, type} , sender ) {
176+ let tabId = sender . tab . id ;
177+ let { frameId} = sender ;
178+ let r = {
179+ url, type, tabId, frameId
180+ } ;
181+ Content . reportTo ( r , false , policyTypesMap [ type ] ) ;
182+ if ( type === "script" && url === sender . url ) {
183+ TabStatus . record ( r , "noscriptFrame" , true ) ;
184+ } else {
185+ TabStatus . record ( r , "blocked" ) ;
186+ }
187+ } ,
175188 async blockedObjects ( message , sender ) {
176189 let { url, documentUrl, policyType} = message ;
177190 let TAG = `<${ policyType . toUpperCase ( ) } >` ;
@@ -501,19 +514,22 @@ var RequestGuard = (() => {
501514 type,
502515 } ) ;
503516 }
517+
518+ let utf8Decoder = new TextDecoder ( "UTF-8" ) ;
504519 function onViolationReport ( request ) {
505520 try {
506- let decoder = new TextDecoder ( "UTF-8" ) ;
507- const report = JSON . parse ( decoder . decode ( request . requestBody . raw [ 0 ] . bytes ) ) [ 'csp-report' ] ;
508- let csp = report [ "original-policy" ]
521+ let text = utf8Decoder . decode ( request . requestBody . raw [ 0 ] . bytes ) ;
522+ if ( text . includes ( `"inline"` ) ) return ABORT ;
523+ let report = JSON . parse ( text ) [ "csp-report" ] ;
524+ let originalPolicy = report [ "original-policy" ]
509525 debug ( "CSP report" , report ) ;
510526 let blockedURI = report [ 'blocked-uri' ] ;
511527 if ( blockedURI && blockedURI !== 'self' ) {
512528 let r = fakeRequestFromCSP ( report , request ) ;
513529 if ( ! / : / . test ( r . url ) ) r . url = request . documentUrl ;
514530 Content . reportTo ( r , false , policyTypesMap [ r . type ] ) ;
515531 TabStatus . record ( r , "blocked" ) ;
516- } else if ( report [ "violated-directive" ] === "script-src" && / ; s c r i p t - s r c ' n o n e ' / . test ( report [ "original-policy" ] ) ) {
532+ } else if ( report [ "violated-directive" ] === "script-src" && ( originalPolicy . includes ( " ; script-src 'none'" ) ) ) {
517533 let r = fakeRequestFromCSP ( report , request ) ;
518534 Content . reportTo ( r , false , "script" ) ; // NEW
519535 TabStatus . record ( r , "noscriptFrame" , true ) ;
@@ -570,8 +586,10 @@ var RequestGuard = (() => {
570586 listen ( "onResponseStarted" , filterDocs , [ "responseHeaders" ] ) ;
571587 listen ( "onCompleted" , filterAll ) ;
572588 listen ( "onErrorOccurred" , filterAll ) ;
573- wr . onBeforeRequest . addListener ( onViolationReport ,
574- { urls : [ csp . reportURI ] , types : [ "csp_report" ] } , [ "blocking" , "requestBody" ] ) ;
589+ if ( csp . reportURI ) {
590+ wr . onBeforeRequest . addListener ( onViolationReport ,
591+ { urls : [ csp . reportURI ] , types : [ "csp_report" ] } , [ "blocking" , "requestBody" ] ) ;
592+ }
575593 TabStatus . probe ( ) ;
576594 } ,
577595 stop ( ) {
0 commit comments