Skip to content

Commit af0c65a

Browse files
authored
Merge pull request #442 from brave/bump-base64
Bump base64
2 parents 5d024dc + 60172f3 commit af0c65a

12 files changed

+70
-51
lines changed

Cargo.lock

+11-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "adblock"
3-
version = "0.9.5"
3+
version = "0.9.6"
44
authors = ["Anton Lazarev <[email protected]>", "Andrius Aucinas"]
55
edition = "2021"
66

@@ -34,7 +34,7 @@ idna = "1.0.3"
3434
serde = { version = "1.0", features = ["derive", "rc"] }
3535
seahash = "3" # seahash 4 introduces a breaking hash algorithm change
3636
memchr = "2.4"
37-
base64 = "0.13"
37+
base64 = "0.22"
3838
rmp-serde = "0.15"
3939
cssparser = { version = "0.29", optional = true }
4040
selectors = { version = "0.24", optional = true }

benches/bench_redirect_performance.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ fn build_resources_for_filters(#[allow(unused)] filters: &[NetworkFilter]) -> Re
122122
#[cfg(not(feature = "resource-assembler"))]
123123
{
124124
use adblock::resources::{MimeType, Resource, ResourceType};
125+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
125126

126127
filters
127128
.iter()
@@ -137,7 +138,7 @@ fn build_resources_for_filters(#[allow(unused)] filters: &[NetworkFilter]) -> Re
137138
name: redirect.to_owned(),
138139
aliases: vec![],
139140
kind: ResourceType::Mime(MimeType::from_extension(&redirect)),
140-
content: base64::encode(redirect),
141+
content: BASE64_STANDARD.encode(redirect),
141142
dependencies: vec![],
142143
permission: Default::default(),
143144
}

src/resources/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,12 @@ impl Resource {
156156
/// dependencies. Content will be automatically base64-encoded by the constructor.
157157
#[cfg(test)]
158158
pub fn simple(name: &str, kind: MimeType, content: &str) -> Self {
159+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
159160
Self {
160161
name: name.to_string(),
161162
aliases: vec![],
162163
kind: ResourceType::Mime(kind),
163-
content: base64::encode(content),
164+
content: BASE64_STANDARD.encode(content),
164165
dependencies: vec![],
165166
permission: Default::default(),
166167
}

src/resources/resource_assembler.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
//! files in the uBlock Origin repository.
33
44
use crate::resources::{MimeType, Resource, ResourceType};
5+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
56
use memchr::memmem;
67
use once_cell::sync::Lazy;
78
use regex::Regex;
@@ -191,7 +192,7 @@ fn read_template_resources(scriptlets_data: &str) -> Vec<Resource> {
191192
.map(|aliases| aliases.iter().map(|alias| alias.to_string()).collect())
192193
.unwrap_or_default(),
193194
kind,
194-
content: base64::encode(&script),
195+
content: BASE64_STANDARD.encode(&script),
195196
dependencies: vec![],
196197
permission: Default::default(),
197198
});
@@ -220,9 +221,9 @@ fn build_resource_from_file_contents(
220221
let content = match mimetype {
221222
MimeType::ApplicationJavascript | MimeType::TextHtml | MimeType::TextPlain => {
222223
let utf8string = std::str::from_utf8(resource_contents).unwrap();
223-
base64::encode(&utf8string.replace('\r', ""))
224+
BASE64_STANDARD.encode(&utf8string.replace('\r', ""))
224225
}
225-
_ => base64::encode(&resource_contents),
226+
_ => BASE64_STANDARD.encode(&resource_contents),
226227
};
227228

228229
Resource {

src/resources/resource_storage.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use std::collections::HashMap;
44

5+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
56
use once_cell::sync::Lazy;
67
use regex::Regex;
78
use thiserror::Error;
@@ -134,7 +135,7 @@ impl ResourceStorage {
134135
}
135136

136137
// Ensure the resource contents are valid base64 (and utf8 if applicable)
137-
let decoded = base64::decode(&resource.content)?;
138+
let decoded = BASE64_STANDARD.decode(&resource.content)?;
138139
if content_type.is_textual() {
139140
let _ = String::from_utf8(decoded)?;
140141
}
@@ -174,7 +175,7 @@ impl ResourceStorage {
174175
let mut result = String::new();
175176

176177
for dep in deps.iter() {
177-
if let Ok(decoded) = base64::decode(&dep.content) {
178+
if let Ok(decoded) = BASE64_STANDARD.decode(&dep.content) {
178179
if let Ok(dep) = core::str::from_utf8(&decoded) {
179180
result += dep;
180181
result += "\n";
@@ -245,7 +246,7 @@ impl ResourceStorage {
245246
self.recursive_dependencies(dep, required_deps, filter_permission)?;
246247
}
247248

248-
let template = String::from_utf8(base64::decode(&resource.content)?)?;
249+
let template = String::from_utf8(BASE64_STANDARD.decode(&resource.content)?)?;
249250

250251
if let Some(function_name) = extract_function_name(&template) {
251252
// newer function-style resource: pass args using function call syntax

tests/matching.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use adblock::request::Request;
44
use adblock::resources::{MimeType, Resource, ResourceType};
55
use adblock::Engine;
66

7+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
78
use serde::{Deserialize, Serialize};
89

910
use adblock::lists::ParseOptions;
@@ -43,7 +44,7 @@ fn build_resources_from_filters(filters: &[String]) -> Vec<Resource> {
4344
name: redirect.to_owned(),
4445
aliases: vec![],
4546
kind: ResourceType::Mime(MimeType::from_extension(&redirect)),
46-
content: base64::encode(redirect),
47+
content: BASE64_STANDARD.encode(redirect),
4748
dependencies: vec![],
4849
permission: Default::default(),
4950
}

tests/unit/blocker.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,7 @@ mod blocker_tests {
344344
use crate::lists::parse_filters;
345345
use crate::request::Request;
346346
use crate::resources::Resource;
347+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
347348
use std::collections::HashSet;
348349
use std::iter::FromIterator;
349350

@@ -1340,7 +1341,7 @@ mod blocker_tests {
13401341
.unwrap();
13411342
Some(format!(
13421343
"data:text/plain;base64,{}",
1343-
base64::encode(identifier)
1344+
BASE64_STANDARD.encode(identifier)
13441345
))
13451346
}
13461347
let a_redirect = add_simple_resource(&mut resources, "a");

tests/unit/cosmetic_filter_cache.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ mod key_from_selector_tests {
8080
mod cosmetic_cache_tests {
8181
use super::super::*;
8282
use crate::resources::Resource;
83+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
8384

8485
fn cache_from_rules(rules: Vec<&str>) -> CosmeticFilterCache {
8586
let parsed_rules = rules
@@ -207,7 +208,7 @@ mod cosmetic_cache_tests {
207208
name: "set-constant.js".into(),
208209
aliases: vec![],
209210
kind: ResourceType::Template,
210-
content: base64::encode("set-constant.js, {{1}}, {{2}}"),
211+
content: BASE64_STANDARD.encode("set-constant.js, {{1}}, {{2}}"),
211212
dependencies: vec![],
212213
permission: Default::default(),
213214
},
@@ -668,7 +669,7 @@ mod cosmetic_cache_tests {
668669
name: "abort-on-property-read.js".into(),
669670
aliases: vec!["aopr".to_string()],
670671
kind: ResourceType::Template,
671-
content: base64::encode("abort-on-property-read.js, {{1}}"),
672+
content: BASE64_STANDARD.encode("abort-on-property-read.js, {{1}}"),
672673
dependencies: vec![],
673674
permission: Default::default(),
674675
}]);

tests/unit/engine.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod tests {
33
use super::super::*;
44
use crate::lists::FilterFormat;
55
use crate::resources::MimeType;
6+
use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
67

78
#[test]
89
fn tags_enable_adds_tags() {
@@ -291,7 +292,7 @@ mod tests {
291292
matched_rule.redirect,
292293
Some(format!(
293294
"data:application/javascript;base64,{}",
294-
base64::encode(format!("{}", script))
295+
BASE64_STANDARD.encode(format!("{}", script))
295296
)),
296297
"Expected redirect to contain resource"
297298
);
@@ -724,15 +725,15 @@ mod tests {
724725
name: "trusted-set-cookie.js".to_string(),
725726
aliases: vec![],
726727
kind: ResourceType::Mime(MimeType::ApplicationJavascript),
727-
content: base64::encode("trusted-set-cookie"),
728+
content: BASE64_STANDARD.encode("trusted-set-cookie"),
728729
dependencies: vec![],
729730
permission: UBO_PERM,
730731
},
731732
Resource {
732733
name: "brave-fix.js".to_string(),
733734
aliases: vec![],
734735
kind: ResourceType::Mime(MimeType::ApplicationJavascript),
735-
content: base64::encode("brave-fix"),
736+
content: BASE64_STANDARD.encode("brave-fix"),
736737
dependencies: vec![],
737738
permission: BRAVE_PERM,
738739
},
@@ -844,7 +845,7 @@ mod tests {
844845
name: "trusted-set-local-storage-item.js".into(),
845846
aliases: vec![],
846847
kind: ResourceType::Mime(MimeType::ApplicationJavascript),
847-
content: base64::encode("function trustedSetLocalStorageItem(key = '', value = '') { setLocalStorageItemFn('local', true, key, value); }"),
848+
content: BASE64_STANDARD.encode("function trustedSetLocalStorageItem(key = '', value = '') { setLocalStorageItemFn('local', true, key, value); }"),
848849
dependencies: vec![],
849850
permission: Default::default(),
850851
},

tests/unit/resources/resource_assembler.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ mod tests {
9999
.replace('\r', "");
100100
assert_eq!(
101101
std::str::from_utf8(
102-
&base64::decode(&reserialized[34].content).expect("decode base64 content")
102+
&BASE64_STANDARD
103+
.decode(&reserialized[34].content)
104+
.expect("decode base64 content")
103105
)
104106
.expect("convert to utf8 string"),
105107
noopjs_contents,
@@ -191,7 +193,7 @@ mod tests {
191193
);
192194
assert_eq!(
193195
std::str::from_utf8(
194-
&base64::decode(&reserialized[20].content).expect("decode base64 content")
196+
&BASE64_STANDARD.decode(&reserialized[20].content).expect("decode base64 content")
195197
).expect("convert to utf8 string"),
196198
"(function() {\nif ( window !== window.top ) {\nreturn;\n}\nvar tstart;\nvar ttl = 30000;\nvar delay = 0;\nvar delayStep = 50;\nvar buster = function() {\nvar docEl = document.documentElement,\nbodyEl = document.body,\nvw = Math.min(docEl.clientWidth, window.innerWidth),\nvh = Math.min(docEl.clientHeight, window.innerHeight),\ntol = Math.min(vw, vh) * 0.05,\nel = document.elementFromPoint(vw/2, vh/2),\nstyle, rect;\nfor (;;) {\nif ( el === null || el.parentNode === null || el === bodyEl ) {\nbreak;\n}\nstyle = window.getComputedStyle(el);\nif ( parseInt(style.zIndex, 10) >= 1000 || style.position === 'fixed' ) {\nrect = el.getBoundingClientRect();\nif ( rect.left <= tol && rect.top <= tol && (vw - rect.right) <= tol && (vh - rect.bottom) < tol ) {\nel.parentNode.removeChild(el);\ntstart = Date.now();\nel = document.elementFromPoint(vw/2, vh/2);\nbodyEl.style.setProperty('overflow', 'auto', 'important');\ndocEl.style.setProperty('overflow', 'auto', 'important');\ncontinue;\n}\n}\nel = el.parentNode;\n}\nif ( (Date.now() - tstart) < ttl ) {\ndelay = Math.min(delay + delayStep, 1000);\nsetTimeout(buster, delay);\n}\n};\nvar domReady = function(ev) {\nif ( ev ) {\ndocument.removeEventListener(ev.type, domReady);\n}\ntstart = Date.now();\nsetTimeout(buster, delay);\n};\nif ( document.readyState === 'loading' ) {\ndocument.addEventListener('DOMContentLoaded', domReady);\n} else {\ndomReady();\n}\n})();\n",
197199
);
@@ -201,7 +203,7 @@ mod tests {
201203
assert_eq!(reserialized[6].kind, ResourceType::Template);
202204
assert_eq!(
203205
std::str::from_utf8(
204-
&base64::decode(&reserialized[6].content).expect("decode base64 content")
206+
&BASE64_STANDARD.decode(&reserialized[6].content).expect("decode base64 content")
205207
).expect("convert to utf8 string"),
206208
"(function() {\nconst rawPrunePaths = '{{1}}';\nconst rawNeedlePaths = '{{2}}';\nconst prunePaths = rawPrunePaths !== '{{1}}' && rawPrunePaths !== ''\n? rawPrunePaths.split(/ +/)\n: [];\nlet needlePaths;\nlet log, reLogNeedle;\nif ( prunePaths.length !== 0 ) {\nneedlePaths = prunePaths.length !== 0 &&\nrawNeedlePaths !== '{{2}}' && rawNeedlePaths !== ''\n? rawNeedlePaths.split(/ +/)\n: [];\n} else {\nlog = console.log.bind(console);\nlet needle;\nif ( rawNeedlePaths === '' || rawNeedlePaths === '{{2}}' ) {\nneedle = '.?';\n} else if ( rawNeedlePaths.charAt(0) === '/' && rawNeedlePaths.slice(-1) === '/' ) {\nneedle = rawNeedlePaths.slice(1, -1);\n} else {\nneedle = rawNeedlePaths.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\nreLogNeedle = new RegExp(needle);\n}\nconst findOwner = function(root, path, prune = false) {\nlet owner = root;\nlet chain = path;\nfor (;;) {\nif ( typeof owner !== 'object' || owner === null ) {\nreturn false;\n}\nconst pos = chain.indexOf('.');\nif ( pos === -1 ) {\nif ( prune === false ) {\nreturn owner.hasOwnProperty(chain);\n}\nif ( chain === '*' ) {\nfor ( const key in owner ) {\nif ( owner.hasOwnProperty(key) === false ) { continue; }\ndelete owner[key];\n}\n} else if ( owner.hasOwnProperty(chain) ) {\ndelete owner[chain];\n}\nreturn true;\n}\nconst prop = chain.slice(0, pos);\nif (\nprop === '[]' && Array.isArray(owner) ||\nprop === '*' && owner instanceof Object\n) {\nconst next = chain.slice(pos + 1);\nlet found = false;\nfor ( const key of Object.keys(owner) ) {\nfound = findOwner(owner[key], next, prune) || found;\n}\nreturn found;\n}\nif ( owner.hasOwnProperty(prop) === false ) { return false; }\nowner = owner[prop];\nchain = chain.slice(pos + 1);\n}\n};\nconst mustProcess = function(root) {\nfor ( const needlePath of needlePaths ) {\nif ( findOwner(root, needlePath) === false ) {\nreturn false;\n}\n}\nreturn true;\n};\nconst pruner = function(o) {\nif ( log !== undefined ) {\nconst json = JSON.stringify(o, null, 2);\nif ( reLogNeedle.test(json) ) {\nlog('uBO:', location.hostname, json);\n}\nreturn o;\n}\nif ( mustProcess(o) === false ) { return o; }\nfor ( const path of prunePaths ) {\nfindOwner(o, path, true);\n}\nreturn o;\n};\nJSON.parse = new Proxy(JSON.parse, {\napply: function() {\nreturn pruner(Reflect.apply(...arguments));\n},\n});\nResponse.prototype.json = new Proxy(Response.prototype.json, {\napply: function() {\nreturn Reflect.apply(...arguments).then(o => pruner(o));\n},\n});\n})();\n",
207209
);
@@ -283,7 +285,7 @@ mod tests {
283285
);
284286
assert_eq!(
285287
std::str::from_utf8(
286-
&base64::decode(&reserialized[18].content).expect("decode base64 content")
288+
&BASE64_STANDARD.decode(&reserialized[18].content).expect("decode base64 content")
287289
).expect("convert to utf8 string"),
288290
"(function() {\nif ( window !== window.top ) {\nreturn;\n}\nvar tstart;\nvar ttl = 30000;\nvar delay = 0;\nvar delayStep = 50;\nvar buster = function() {\nvar docEl = document.documentElement,\nbodyEl = document.body,\nvw = Math.min(docEl.clientWidth, window.innerWidth),\nvh = Math.min(docEl.clientHeight, window.innerHeight),\ntol = Math.min(vw, vh) * 0.05,\nel = document.elementFromPoint(vw/2, vh/2),\nstyle, rect;\nfor (;;) {\nif ( el === null || el.parentNode === null || el === bodyEl ) {\nbreak;\n}\nstyle = window.getComputedStyle(el);\nif ( parseInt(style.zIndex, 10) >= 1000 || style.position === 'fixed' ) {\nrect = el.getBoundingClientRect();\nif ( rect.left <= tol && rect.top <= tol && (vw - rect.right) <= tol && (vh - rect.bottom) < tol ) {\nel.parentNode.removeChild(el);\ntstart = Date.now();\nel = document.elementFromPoint(vw/2, vh/2);\nbodyEl.style.setProperty('overflow', 'auto', 'important');\ndocEl.style.setProperty('overflow', 'auto', 'important');\ncontinue;\n}\n}\nel = el.parentNode;\n}\nif ( (Date.now() - tstart) < ttl ) {\ndelay = Math.min(delay + delayStep, 1000);\nsetTimeout(buster, delay);\n}\n};\nvar domReady = function(ev) {\nif ( ev ) {\ndocument.removeEventListener(ev.type, domReady);\n}\ntstart = Date.now();\nsetTimeout(buster, delay);\n};\nif ( document.readyState === 'loading' ) {\ndocument.addEventListener('DOMContentLoaded', domReady);\n} else {\ndomReady();\n}\n})();\n",
289291
);

0 commit comments

Comments
 (0)