Project

General

Profile

« Previous | Next » 

Revision 6b53d6c8

Added by koszko about 2 years ago

use StreamFilter under Mozilla to prevent csp tags from blocking our injected scripts

View differences:

background/main.js
11 11
 * IMPORT get_storage
12 12
 * IMPORT start_storage_server
13 13
 * IMPORT start_page_actions_server
14
 * IMPORT start_policy_injector
15 14
 * IMPORT browser
15
 * IMPORT is_privileged_url
16
 * IMPORT query_best
17
 * IMPORT gen_nonce
18
 * IMPORT inject_csp_headers
19
 * IMPORT apply_stream_filter
20
 * IMPORT is_chrome
16 21
 * IMPORTS_END
17 22
 */
18 23

  
19 24
start_storage_server();
20 25
start_page_actions_server();
21
start_policy_injector();
22 26

  
23 27
async function init_ext(install_details)
24 28
{
25
    console.log("details:", install_details);
26 29
    if (install_details.reason != "install")
27 30
	return;
28 31

  
......
44 47

  
45 48
browser.runtime.onInstalled.addListener(init_ext);
46 49

  
47
console.log("hello, hachette");
50

  
51
let storage;
52

  
53
function on_headers_received(details)
54
{
55
    const url = details.url;
56
    if (is_privileged_url(details.url))
57
	return;
58

  
59
    const [pattern, settings] = query_best(storage, details.url);
60
    const allow = !!(settings && settings.allow);
61
    const nonce = gen_nonce();
62
    const policy = {allow, url, nonce};
63

  
64
    let headers = details.responseHeaders;
65
    let skip = false;
66
    for (const header of headers) {
67
	if ((header.name.toLowerCase().trim() === "content-disposition" &&
68
	     /^\s*attachment\s*(;.*)$/i.test(header.value)))
69
	    skip = true;
70
    }
71

  
72
    headers = inject_csp_headers(details, headers, policy);
73

  
74
    skip = skip || (details.statusCode >= 300 && details.statusCode < 400);
75
    if (!skip) {
76
	/* Check for API availability. */
77
	if (browser.webRequest.filterResponseData)
78
	    headers = apply_stream_filter(details, headers, policy);
79
    }
80

  
81
    return {responseHeaders: headers};
82
}
83

  
84
async function start_webRequest_operations()
85
{
86
    storage = await get_storage();
87

  
88
    const extra_opts = ["blocking", "responseHeaders"];
89
    if (is_chrome)
90
	extra_opts.push("extraHeaders");
91

  
92
    browser.webRequest.onHeadersReceived.addListener(
93
	on_headers_received,
94
	{urls: ["<all_urls>"], types: ["main_frame", "sub_frame"]},
95
	extra_opts
96
    );
97
}
98

  
99
start_webRequest_operations();

Also available in: Unified diff