Make chrome: URLs have a "host".

This commit is contained in:
Simon Sapin 2016-04-23 01:16:29 +02:00
parent 7375e2cedd
commit 374679852c
4 changed files with 20 additions and 10 deletions

View file

@ -8,14 +8,18 @@ use net_traits::{LoadConsumer, LoadData, NetworkError};
use resource_thread::{CancellationListener, send_error}; use resource_thread::{CancellationListener, send_error};
use std::sync::Arc; use std::sync::Arc;
use url::Url; use url::Url;
use url::percent_encoding::percent_decode;
use util::resource_files::resources_dir_path; use util::resource_files::resources_dir_path;
pub fn resolve_chrome_url(url: &Url) -> Result<Url, ()> { pub fn resolve_chrome_url(url: &Url) -> Result<Url, ()> {
assert_eq!(url.scheme(), "chrome"); assert_eq!(url.scheme(), "chrome");
if url.host_str() != Some("resources") {
return Err(())
}
let resources = resources_dir_path(); let resources = resources_dir_path();
let mut path = resources.clone(); let mut path = resources.clone();
for segment in url.path_segments().unwrap() { for segment in url.path_segments().unwrap() {
path.push(segment) path.push(&*try!(percent_decode(segment.as_bytes()).decode_utf8().map_err(|_| ())))
} }
// Don't allow chrome URLs access to files outside of the resources directory. // Don't allow chrome URLs access to files outside of the resources directory.
if !(path.starts_with(resources) && path.exists()) { if !(path.starts_with(resources) && path.exists()) {

View file

@ -42,7 +42,7 @@ lazy_static! {
Ok(res) => { Ok(res) => {
let ua_stylesheet = Stylesheet::from_bytes( let ua_stylesheet = Stylesheet::from_bytes(
&res, &res,
Url::parse(&format!("chrome:///{:?}", filename)).unwrap(), Url::parse(&format!("chrome://resources/{:?}", filename)).unwrap(),
None, None,
None, None,
Origin::UserAgent, Origin::UserAgent,
@ -69,7 +69,7 @@ lazy_static! {
Ok(res) => { Ok(res) => {
Stylesheet::from_bytes( Stylesheet::from_bytes(
&res, &res,
Url::parse("chrome:///quirks-mode.css").unwrap(), Url::parse("chrome://resources/quirks-mode.css").unwrap(),
None, None,
None, None,
Origin::UserAgent, Origin::UserAgent,

View file

@ -3,6 +3,6 @@
<title>Certificate error</title> <title>Certificate error</title>
</head> </head>
<body> <body>
<img src="chrome:/badcert.jpg"> <img src="chrome://resources/badcert.jpg">
</body> </body>
</html> </html>

View file

@ -7,40 +7,46 @@ use url::Url;
#[test] #[test]
fn test_relative() { fn test_relative() {
let url = Url::parse("chrome:/../something").unwrap(); let url = Url::parse("chrome://resources/../something").unwrap();
assert!(resolve_chrome_url(&url).is_err()); assert!(resolve_chrome_url(&url).is_err());
} }
#[test] #[test]
fn test_relative_2() { fn test_relative_2() {
let url = Url::parse("chrome:/subdir/../something").unwrap(); let url = Url::parse("chrome://resources/subdir/../something").unwrap();
assert!(resolve_chrome_url(&url).is_err()); assert!(resolve_chrome_url(&url).is_err());
} }
#[test] #[test]
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
fn test_absolute() { fn test_absolute() {
let url = Url::parse("chrome:/etc/passwd").unwrap(); let url = Url::parse("chrome://resources/etc/passwd").unwrap();
assert!(resolve_chrome_url(&url).is_err()); assert!(resolve_chrome_url(&url).is_err());
} }
#[test] #[test]
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
fn test_absolute_2() { fn test_absolute_2() {
let url = Url::parse("chrome:/C:\\Windows").unwrap(); let url = Url::parse("chrome://resources/C:\\Windows").unwrap();
assert!(resolve_chrome_url(&url).is_err()); assert!(resolve_chrome_url(&url).is_err());
} }
#[test] #[test]
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
fn test_absolute_3() { fn test_absolute_3() {
let url = Url::parse("chrome:/\\\\server/C$").unwrap(); let url = Url::parse("chrome://resources/\\\\server/C$").unwrap();
assert!(resolve_chrome_url(&url).is_err()); assert!(resolve_chrome_url(&url).is_err());
} }
#[test] #[test]
fn test_valid() { fn test_valid() {
let url = Url::parse("chrome:/badcert.jpg").unwrap(); let url = Url::parse("chrome://resources/badcert.jpg").unwrap();
let resolved = resolve_chrome_url(&url).unwrap(); let resolved = resolve_chrome_url(&url).unwrap();
assert_eq!(resolved.scheme(), "file"); assert_eq!(resolved.scheme(), "file");
} }
#[test]
fn test_incorrect_host() {
let url = Url::parse("chrome://not-resources/badcert.jpg").unwrap();
assert!(resolve_chrome_url(&url).is_err());
}