file_upgrade_insecure_reporting_server.sjs (2961B)
1 // Custom *.sjs specifically for the needs of Bug 2 // Bug 1139297 - Implement CSP upgrade-insecure-requests directive 3 4 const { NetUtil } = ChromeUtils.importESModule( 5 "resource://gre/modules/NetUtil.sys.mjs" 6 ); 7 8 // small red image 9 const IMG_BYTES = atob( 10 "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12" + 11 "P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" 12 ); 13 14 const REPORT_URI = 15 "https://example.com/tests/dom/security/test/csp/file_upgrade_insecure_reporting_server.sjs?report"; 16 const POLICY = "upgrade-insecure-requests; default-src https: 'unsafe-inline'"; 17 const POLICY_RO = 18 "default-src https: 'unsafe-inline'; report-uri " + REPORT_URI; 19 20 function loadHTMLFromFile(path) { 21 // Load the HTML to return in the response from file. 22 // Since it's relative to the cwd of the test runner, we start there and 23 // append to get to the actual path of the file. 24 var testHTMLFile = Cc["@mozilla.org/file/directory_service;1"] 25 .getService(Ci.nsIProperties) 26 .get("CurWorkD", Ci.nsIFile); 27 var dirs = path.split("/"); 28 for (var i = 0; i < dirs.length; i++) { 29 testHTMLFile.append(dirs[i]); 30 } 31 var testHTMLFileStream = Cc[ 32 "@mozilla.org/network/file-input-stream;1" 33 ].createInstance(Ci.nsIFileInputStream); 34 testHTMLFileStream.init(testHTMLFile, -1, 0, 0); 35 var testHTML = NetUtil.readInputStreamToString( 36 testHTMLFileStream, 37 testHTMLFileStream.available() 38 ); 39 return testHTML; 40 } 41 42 function handleRequest(request, response) { 43 // avoid confusing cache behaviors 44 response.setHeader("Cache-Control", "no-cache", false); 45 46 // (1) Store the query that will report back whether the violation report was received 47 if (request.queryString == "queryresult") { 48 response.processAsync(); 49 setObjectState("queryResult", response); 50 return; 51 } 52 53 // (2) We load a page using a CSP and a report only CSP 54 if (request.queryString == "toplevel") { 55 response.setHeader("Content-Security-Policy", POLICY, false); 56 response.setHeader("Content-Security-Policy-Report-Only", POLICY_RO, false); 57 response.setHeader("Content-Type", "text/html", false); 58 response.write( 59 loadHTMLFromFile( 60 "tests/dom/security/test/csp/file_upgrade_insecure_reporting.html" 61 ) 62 ); 63 return; 64 } 65 66 // (3) Return the image back to the client 67 if (request.queryString == "img") { 68 response.setHeader("Content-Type", "image/png"); 69 response.write(IMG_BYTES); 70 return; 71 } 72 73 // (4) Finally we receive the report, let's return the request from (1) 74 // signaling that we received the report correctly 75 if (request.queryString == "report") { 76 getObjectState("queryResult", function (queryResponse) { 77 if (!queryResponse) { 78 return; 79 } 80 queryResponse.write("report-ok"); 81 queryResponse.finish(); 82 }); 83 return; 84 } 85 86 // we should never get here, but just in case ... 87 response.setHeader("Content-Type", "text/plain"); 88 response.write("doh!"); 89 }