mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Make chrome: URLs have a "host".
This commit is contained in:
parent
7375e2cedd
commit
374679852c
4 changed files with 20 additions and 10 deletions
|
@ -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()) {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue