Project

General

Profile

Download (1.47 KB) Statistics
| Branch: | Tag: | Revision:

haketilo / background / policy_injector.js @ cd5272ac

1
/**
2
 * Myext injecting policy to page using webRequest
3
 *
4
 * Copyright (C) 2021 Wojtek Kosior
5
 * Redistribution terms are gathered in the `copyright' file.
6
 */
7

    
8
/*
9
 * IMPORTS_START
10
 * IMPORT TYPE_PREFIX
11
 * IMPORT get_storage
12
 * IMPORT browser
13
 * IMPORT is_chrome
14
 * IMPORT gen_unique
15
 * IMPORT url_item
16
 * IMPORT get_query_best
17
 * IMPORT csp_rule
18
 * IMPORTS_END
19
 */
20

    
21
var storage;
22
var query_best;
23

    
24
let csp_header_names = {
25
    "content-security-policy" : true,
26
    "x-webkit-csp" : true,
27
    "x-content-security-policy" : true
28
};
29

    
30
function is_noncsp_header(header)
31
{
32
    return !csp_header_names[header.name.toLowerCase()];
33
}
34

    
35
function inject(details)
36
{
37
    let url = url_item(details.url);
38

    
39
    let [pattern, settings] = query_best(url);
40

    
41
    if (settings !== undefined && settings.allow)
42
	return {cancel : false};
43

    
44
    let nonce = gen_unique(url);
45
    let headers = details.responseHeaders.filter(is_noncsp_header);
46

    
47
    headers.push({
48
	name : "content-security-policy",
49
	value : csp_rule(nonce)
50
    });
51

    
52
    return {responseHeaders: headers};
53
}
54

    
55
async function start_policy_injector()
56
{
57
    storage = await get_storage();
58
    query_best = await get_query_best();
59

    
60
    let extra_opts = ["blocking", "responseHeaders"];
61
    if (is_chrome)
62
	extra_opts.push("extraHeaders");
63

    
64
    browser.webRequest.onHeadersReceived.addListener(
65
	inject,
66
	{
67
	    urls: ["<all_urls>"],
68
	    types: ["main_frame", "sub_frame"]
69
	},
70
	extra_opts
71
    );
72
}
73

    
74
/*
75
 * EXPORTS_START
76
 * EXPORT start_policy_injector
77
 * EXPORTS_END
78
 */
(4-4/7)