aboutsummaryrefslogtreecommitdiff
path: root/background/policy_smuggler.mjs
blob: 61f34c58595b60330bc98fd53e46cda4f0455cfe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* Myext smuggling policy to content script through url
* 
* Copyright (C) 2021 Wojtek Kosior
*
* Dual-licensed under:
*   - 0BSD license
*   - GPLv3 or (at your option) any later version
*/

import {TYPE_PREFIX} from '/common/stored_types.mjs';
import get_storage from './storage.mjs';
import browser from '/common/browser.mjs';
import url_item from './url_item.mjs';

"use strict";

var storage;

function redirect(request)
{
    let url_re = /^([^#]*)((#[^#]*)(#.*)?)?$/;
    let match = url_re.exec(request.url);
    let base_url = match[1];
    let first_target = match[3];
    let second_target = match[4];

    if (first_target === "#myext-allow") {
	console.log(["not redirecting"]);
	return {cancel : false};
    }

    let url = url_item(request.url);
    let settings = storage.get(TYPE_PREFIX.PAGE, url);
    console.log("got", storage.get(TYPE_PREFIX.PAGE, url), "for", url);
    if (settings === undefined || !settings.allow)
	return {cancel : false};

    second_target = (first_target || "") + (second_target || "")

    console.log(["redirecting", request.url,
		 (base_url + "#myext-allow" + second_target)]);

    return {
	redirectUrl : (base_url + "#myext-allow" + second_target)
    };
}

export default async function start() {
    storage = await get_storage();

    chrome.webRequest.onBeforeRequest.addListener(
	redirect,
	{
	    urls: ["<all_urls>"],
	    types: ["main_frame", "sub_frame"]
	},
	["blocking"]
    );
}