From 08a73c00a347eed1e9b4483f2b9f2d0b833174fe Mon Sep 17 00:00:00 2001 From: zhoupeiheng Date: Mon, 4 Jul 2022 16:05:01 +0800 Subject: [PATCH 1/3] fix: static file support route_prefix --- src/config.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/config.rs b/src/config.rs index 2ee014f21..0a5c945c3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -151,8 +151,11 @@ impl MiniserveConfig { // Generate some random routes for the favicon and css so that they are very unlikely to conflict with // real files. - let favicon_route = format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET)); - let css_route = format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET)); + let (favicon_route, css_route) = if args.random_route { + (format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET)), format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET))) + } else { + (format!("{}/{}", route_prefix, nanoid::nanoid!(10, &ROUTE_ALPHABET)), format!("{}/{}", route_prefix, nanoid::nanoid!(10, &ROUTE_ALPHABET))) + }; let default_color_scheme = args.color_scheme; let default_color_scheme_dark = args.color_scheme_dark; From e57125850d232c4f4eaafa4c3e7552df6bf80e2f Mon Sep 17 00:00:00 2001 From: zhoupeiheng Date: Wed, 20 Jul 2022 18:04:50 +0800 Subject: [PATCH 2/3] test: check_static_file_route_pattern --- src/config.rs | 10 ++++++++-- tests/config.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 tests/config.rs diff --git a/src/config.rs b/src/config.rs index 0a5c945c3..d3aa845c4 100644 --- a/src/config.rs +++ b/src/config.rs @@ -152,9 +152,15 @@ impl MiniserveConfig { // Generate some random routes for the favicon and css so that they are very unlikely to conflict with // real files. let (favicon_route, css_route) = if args.random_route { - (format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET)), format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET))) + ( + format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET)), + format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET)), + ) } else { - (format!("{}/{}", route_prefix, nanoid::nanoid!(10, &ROUTE_ALPHABET)), format!("{}/{}", route_prefix, nanoid::nanoid!(10, &ROUTE_ALPHABET))) + ( + format!("{}/{}", route_prefix, nanoid::nanoid!(10, &ROUTE_ALPHABET)), + format!("{}/{}", route_prefix, nanoid::nanoid!(10, &ROUTE_ALPHABET)), + ) }; let default_color_scheme = args.color_scheme; diff --git a/tests/config.rs b/tests/config.rs new file mode 100644 index 000000000..136b3b19d --- /dev/null +++ b/tests/config.rs @@ -0,0 +1,28 @@ +mod fixtures; + +use fixtures::{server_no_stderr, Error, TestServer}; +use regex::Regex; +use rstest::rstest; +use select::{document::Document, predicate::Attr}; + +#[rstest] +#[case(server_no_stderr(&[] as &[&str]), "/[a-f0-9]+")] +#[case(server_no_stderr(&["--random-route"]), "/[a-f0-9]+")] +#[case(server_no_stderr(&["--route-prefix", "foo"]), "/foo/[a-f0-9]+")] +fn check_static_file_route_pattern( + #[case] server: TestServer, + #[case] route_pattern: String, +) -> Result<(), Error> { + let body = reqwest::blocking::get(server.url())?; + let parsed = Document::from_read(body)?; + let re = Regex::new(&route_pattern).unwrap(); + + assert!(parsed + .find(Attr("rel", "stylesheet")) + .all(|x| re.is_match(x.attr("href").unwrap()))); + assert!(parsed + .find(Attr("rel", "icon")) + .all(|x| re.is_match(x.attr("href").unwrap()))); + + Ok(()) +} From ff3bab81e9dc515e687c9bfea5dea0a719297131 Mon Sep 17 00:00:00 2001 From: zhoupeiheng Date: Thu, 28 Jul 2022 16:36:20 +0800 Subject: [PATCH 3/3] Apply suggestions from code review --- src/config.rs | 3 +++ tests/config.rs | 28 ---------------------------- tests/serve_request.rs | 25 +++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 30 deletions(-) delete mode 100644 tests/config.rs diff --git a/src/config.rs b/src/config.rs index d3aa845c4..ec7ec660f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -151,6 +151,9 @@ impl MiniserveConfig { // Generate some random routes for the favicon and css so that they are very unlikely to conflict with // real files. + // If --random-route is enabled , in order to not leak the random generated route, we must not use it + // as static files prefix. + // Otherwise, we should apply route_prefix to static files. let (favicon_route, css_route) = if args.random_route { ( format!("/{}", nanoid::nanoid!(10, &ROUTE_ALPHABET)), diff --git a/tests/config.rs b/tests/config.rs deleted file mode 100644 index 136b3b19d..000000000 --- a/tests/config.rs +++ /dev/null @@ -1,28 +0,0 @@ -mod fixtures; - -use fixtures::{server_no_stderr, Error, TestServer}; -use regex::Regex; -use rstest::rstest; -use select::{document::Document, predicate::Attr}; - -#[rstest] -#[case(server_no_stderr(&[] as &[&str]), "/[a-f0-9]+")] -#[case(server_no_stderr(&["--random-route"]), "/[a-f0-9]+")] -#[case(server_no_stderr(&["--route-prefix", "foo"]), "/foo/[a-f0-9]+")] -fn check_static_file_route_pattern( - #[case] server: TestServer, - #[case] route_pattern: String, -) -> Result<(), Error> { - let body = reqwest::blocking::get(server.url())?; - let parsed = Document::from_read(body)?; - let re = Regex::new(&route_pattern).unwrap(); - - assert!(parsed - .find(Attr("rel", "stylesheet")) - .all(|x| re.is_match(x.attr("href").unwrap()))); - assert!(parsed - .find(Attr("rel", "icon")) - .all(|x| re.is_match(x.attr("href").unwrap()))); - - Ok(()) -} diff --git a/tests/serve_request.rs b/tests/serve_request.rs index 450a8f5e0..3f5eefff2 100644 --- a/tests/serve_request.rs +++ b/tests/serve_request.rs @@ -9,8 +9,7 @@ use fixtures::{ use http::StatusCode; use regex::Regex; use rstest::rstest; -use select::document::Document; -use select::node::Node; +use select::{document::Document, node::Node, predicate::Attr}; use std::process::{Command, Stdio}; use std::thread::sleep; use std::time::Duration; @@ -281,3 +280,25 @@ fn serves_requests_with_route_prefix(#[case] server: TestServer) -> Result<(), E Ok(()) } + +#[rstest] +#[case(server_no_stderr(&[] as &[&str]), "/[a-f0-9]+")] +#[case(server_no_stderr(&["--random-route"]), "/[a-f0-9]+")] +#[case(server_no_stderr(&["--route-prefix", "foobar"]), "/foobar/[a-f0-9]+")] +fn serves_requests_static_file_check( + #[case] server: TestServer, + #[case] static_file_pattern: String, +) -> Result<(), Error> { + let body = reqwest::blocking::get(server.url())?; + let parsed = Document::from_read(body)?; + let re = Regex::new(&static_file_pattern).unwrap(); + + assert!(parsed + .find(Attr("rel", "stylesheet")) + .all(|x| re.is_match(x.attr("href").unwrap()))); + assert!(parsed + .find(Attr("rel", "icon")) + .all(|x| re.is_match(x.attr("href").unwrap()))); + + Ok(()) +}