Project

General

Profile

« Previous | Next » 

Revision 3303d7d7

Added by koszko about 2 years ago

filter HTTP request headers to remove Hachette cookies in case they slip through

View differences:

background/cookie_filter.js
1
/**
2
 * part of Hachette
3
 * Filtering request headers to remove hachette cookies that might have slipped
4
 * through.
5
 *
6
 * Copyright (C) 2021 Wojtek Kosior
7
 * Redistribution terms are gathered in the `copyright' file.
8
 */
9

  
10
/*
11
 * IMPORTS_START
12
 * IMPORT extract_signed
13
 * IMPORTS_END
14
 */
15

  
16
function is_valid_hachette_cookie(cookie)
17
{
18
    const match = /^hachette-(\w*)=(.*)$/.exec(cookie);
19
    if (!match)
20
	return false;
21

  
22
    return !extract_signed(match.slice(1, 3)).fail;
23
}
24

  
25
function remove_hachette_cookies(header)
26
{
27
    if (header.name !== "Cookie")
28
	return header;
29

  
30
    const cookies = header.value.split("; ");
31
    const value = cookies.filter(c => !is_valid_hachette_cookie(c)).join("; ");
32

  
33
    return value ? {name: "Cookie", value} : null;
34
}
35

  
36
function filter_cookie_headers(headers)
37
{
38
    return headers.map(remove_hachette_cookies).filter(h => h);
39
}
40

  
41
/*
42
 * EXPORTS_START
43
 * EXPORT filter_cookie_headers
44
 * EXPORTS_END
45
 */
background/main.js
17 17
 * IMPORT gen_nonce
18 18
 * IMPORT inject_csp_headers
19 19
 * IMPORT apply_stream_filter
20
 * IMPORT filter_cookie_headers
20 21
 * IMPORT is_chrome
21 22
 * IMPORTS_END
22 23
 */
......
81 82
    return {responseHeaders: headers};
82 83
}
83 84

  
85
function on_before_send_headers(details)
86
{
87
    let headers = details.requestHeaders;
88
    headers = filter_cookie_headers(headers);
89
    return {requestHeaders: headers};
90
}
91

  
92
const all_types = [
93
    "main_frame", "sub_frame", "stylesheet", "script", "image", "font",
94
    "object", "xmlhttprequest", "ping", "csp_report", "media", "websocket",
95
    "other", "main_frame", "sub_frame"
96
];
97

  
84 98
async function start_webRequest_operations()
85 99
{
86 100
    storage = await get_storage();
87 101

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

  
92 106
    browser.webRequest.onHeadersReceived.addListener(
93 107
	on_headers_received,
94 108
	{urls: ["<all_urls>"], types: ["main_frame", "sub_frame"]},
95
	extra_opts
109
	extra_opts.concat("responseHeaders")
110
    );
111

  
112
    browser.webRequest.onBeforeSendHeaders.addListener(
113
	on_before_send_headers,
114
	{urls: ["<all_urls>"], types: all_types},
115
	extra_opts.concat("requestHeaders")
96 116
    );
97 117
}
98 118

  

Also available in: Unified diff