Revision ecb78704
Added by jahoti about 2 years ago
background/policy_injector.js | ||
---|---|---|
17 | 17 |
* IMPORT gen_nonce |
18 | 18 |
* IMPORT url_item |
19 | 19 |
* IMPORT url_extract_policy |
20 |
* IMPORT sign_policy |
|
20 | 21 |
* IMPORT get_query_best |
21 | 22 |
* IMPORT csp_rule |
22 | 23 |
* IMPORTS_END |
... | ... | |
46 | 47 |
function url_inject(details) |
47 | 48 |
{ |
48 | 49 |
const targets = url_extract_policy(details.url); |
49 |
if (targets.valid_sig) {
|
|
50 |
if (targets.current) {
|
|
50 | 51 |
return; |
51 | 52 |
} else if (targets.policy) { |
52 | 53 |
/* Redirect; update policy */ |
... | ... | |
59 | 60 |
/* Defaults */ |
60 | 61 |
settings = {}; |
61 | 62 |
|
62 |
const policy = {allow: settings.allow, nonce: gen_nonce()}; |
|
63 |
const policy_string = encodeURIComponent(JSON.stringify(policy)); |
|
64 |
const sig = gen_unique(policy_string + targets.base_url); |
|
63 |
const policy = encodeURIComponent( |
|
64 |
JSON.stringify({ |
|
65 |
allow: settings.allow, |
|
66 |
nonce: gen_nonce(), |
|
67 |
base_url: targets.base_url |
|
68 |
}) |
|
69 |
); |
|
65 | 70 |
|
66 |
let redirect_url = targets.base_url + '#' + sig + policy_string; |
|
71 |
let redirect_url = targets.base_url; |
|
72 |
redirect_url += '#' + sign_policy(policy, new Date()) + policy; |
|
67 | 73 |
if (targets.target) |
68 | 74 |
redirect_url += targets.target; |
69 | 75 |
if (targets.target2) |
... | ... | |
75 | 81 |
function inject(details) |
76 | 82 |
{ |
77 | 83 |
const targets = url_extract_policy(details.url); |
78 |
if (!targets.valid_sig)
|
|
79 |
/* Block unsigned requests */ |
|
84 |
if (!targets.current)
|
|
85 |
/* Block mis-/unsigned requests */
|
|
80 | 86 |
return {cancel: true}; |
81 | 87 |
|
82 | 88 |
const rule = csp_rule(targets.policy.nonce); |
83 |
|
|
84 | 89 |
var headers = details.responseHeaders; |
85 | 90 |
|
86 | 91 |
if (!targets.policy.allow || is_mozilla) |
common/misc.js | ||
---|---|---|
104 | 104 |
return !!/^(chrome(-extension)?|moz-extension):\/\/|^about:/i.exec(url); |
105 | 105 |
} |
106 | 106 |
|
107 |
/* Sign a given policy for a given time */ |
|
108 |
function sign_policy(policy, now, hours_offset) { |
|
109 |
let time = Math.floor(now / 3600000) + (hours_offset || 0); |
|
110 |
return gen_unique(time + policy); |
|
111 |
} |
|
112 |
|
|
107 | 113 |
/* Extract any policy present in the URL */ |
108 | 114 |
function url_extract_policy(url) |
109 | 115 |
{ |
110 |
var policy_string; |
|
111 | 116 |
const targets = url_extract_target(url); |
117 |
if (!targets.target) |
|
118 |
return targets; |
|
119 |
|
|
120 |
/* %7B -> { */ |
|
121 |
const index = targets.target.indexOf('%7B'); |
|
122 |
if (index === -1) |
|
123 |
return targets; |
|
124 |
|
|
125 |
const now = new Date(); |
|
126 |
const sig = targets.target.substring(1, index); |
|
127 |
const policy = targets.target.substring(index); |
|
128 |
if ( |
|
129 |
sig !== sign_policy(policy, now) && |
|
130 |
sig !== sign_policy(policy, now, -1) && |
|
131 |
sig !== sign_policy(policy, now, 1) |
|
132 |
) |
|
133 |
return targets; |
|
112 | 134 |
|
113 | 135 |
try { |
114 |
policy_string = targets.target.substring(65);
|
|
115 |
targets.policy = JSON.parse(decodeURIComponent(policy_string));
|
|
136 |
targets.policy = JSON.parse(decodeURIComponent(policy));
|
|
137 |
targets.current = targets.policy.base_url === targets.base_url;
|
|
116 | 138 |
} catch (e) { |
117 | 139 |
/* TODO what should happen here? */ |
118 | 140 |
} |
119 |
|
|
120 |
if (targets.policy) { |
|
121 |
const sig = gen_unique(policy_string + targets.base_url); |
|
122 |
targets.valid_sig = targets.target.substring(1, 65) === sig; |
|
123 |
} |
|
124 | 141 |
|
125 | 142 |
return targets; |
126 | 143 |
} |
... | ... | |
132 | 149 |
* EXPORT url_item |
133 | 150 |
* EXPORT url_extract_target |
134 | 151 |
* EXPORT url_extract_policy |
152 |
* EXPORT sign_policy |
|
135 | 153 |
* EXPORT csp_rule |
136 | 154 |
* EXPORT nice_name |
137 | 155 |
* EXPORT open_in_settings |
content/main.js | ||
---|---|---|
107 | 107 |
history.replaceState(null, "", targets.base_url); |
108 | 108 |
} |
109 | 109 |
|
110 |
targets.policy = targets.valid_sig ? targets.policy : {};
|
|
110 |
targets.policy = targets.current ? targets.policy : {};
|
|
111 | 111 |
|
112 | 112 |
const nonce = targets.policy.nonce || gen_nonce(); |
113 | 113 |
start_activity_info_server(); |
Also available in: Unified diff
Streamline and harden unique values/settings
The base URL is now included in the settings. The unique value no longer uses
it directly, as it is included by virtue of the settings; however, the number
of full hours since the epoch (UTC) is now incorporated.