diff options
author | Sven-Hendrik Haase <svenstaro@gmail.com> | 2020-09-24 02:39:19 +0000 |
---|---|---|
committer | Sven-Hendrik Haase <svenstaro@gmail.com> | 2020-09-24 02:39:19 +0000 |
commit | 13352ef42532d1f96e3b54059756d8b6e3c7f374 (patch) | |
tree | 4d22230eabb8954cedaca8966cc0d40cda5473b1 /src | |
parent | Slightly better variable name (diff) | |
download | miniserve-13352ef42532d1f96e3b54059756d8b6e3c7f374.tar.gz miniserve-13352ef42532d1f96e3b54059756d8b6e3c7f374.zip |
Add embedded favicon (fixes #364)
Diffstat (limited to 'src')
-rw-r--r-- | src/args.rs | 5 | ||||
-rw-r--r-- | src/auth.rs | 1 | ||||
-rw-r--r-- | src/file_upload.rs | 7 | ||||
-rw-r--r-- | src/listing.rs | 3 | ||||
-rw-r--r-- | src/main.rs | 23 | ||||
-rw-r--r-- | src/renderer.rs | 8 |
6 files changed, 43 insertions, 4 deletions
diff --git a/src/args.rs b/src/args.rs index 8893ebd..8467a92 100644 --- a/src/args.rs +++ b/src/args.rs @@ -171,6 +171,10 @@ pub fn parse_args() -> crate::MiniserveConfig { None }; + // Generate some random route for the favicon so that it is very unlikely to conflict with a + // real file. + let favicon_route = nanoid::nanoid!(10, &ROUTE_ALPHABET); + let default_color_scheme = args.color_scheme; let path_explicitly_chosen = args.path.is_some(); @@ -189,6 +193,7 @@ pub fn parse_args() -> crate::MiniserveConfig { path_explicitly_chosen, no_symlinks: args.no_symlinks, random_route, + favicon_route, default_color_scheme, index: args.index, overwrite_files: args.overwrite_files, diff --git a/src/auth.rs b/src/auth.rs index 91c7bb0..e3eec89 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -124,6 +124,7 @@ fn build_unauthorized_response( state.default_color_scheme, false, false, + &state.favicon_route, ) .into_string() } diff --git a/src/file_upload.rs b/src/file_upload.rs index 136bd45..394afbc 100644 --- a/src/file_upload.rs +++ b/src/file_upload.rs @@ -111,6 +111,7 @@ pub fn upload_file( payload: actix_web::web::Payload, default_color_scheme: ColorScheme, uses_random_route: bool, + favicon_route: String, ) -> Pin<Box<dyn Future<Output = Result<HttpResponse, actix_web::Error>>>> { let conf = req.app_data::<crate::MiniserveConfig>().unwrap(); let return_path = if let Some(header) = req.headers().get(header::REFERER) { @@ -139,6 +140,7 @@ pub fn upload_file( color_scheme, default_color_scheme, uses_random_route, + &favicon_route, )); } }; @@ -159,6 +161,7 @@ pub fn upload_file( color_scheme, default_color_scheme, uses_random_route, + &favicon_route, )); } }; @@ -179,6 +182,7 @@ pub fn upload_file( color_scheme, default_color_scheme, uses_random_route, + &favicon_route, )); } }; @@ -204,6 +208,7 @@ pub fn upload_file( color_scheme, default_color_scheme, uses_random_route, + &favicon_route, ), }), ) @@ -220,6 +225,7 @@ fn create_error_response( color_scheme: ColorScheme, default_color_scheme: ColorScheme, uses_random_route: bool, + favicon_route: &str, ) -> future::Ready<Result<HttpResponse, actix_web::Error>> { errors::log_error_chain(description.to_string()); future::ok( @@ -236,6 +242,7 @@ fn create_error_response( default_color_scheme, true, !uses_random_route, + &favicon_route, ) .into_string(), ), diff --git a/src/listing.rs b/src/listing.rs index 89d4e6c..a70e237 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -137,6 +137,7 @@ pub fn directory_listing( skip_symlinks: bool, file_upload: bool, random_route: Option<String>, + favicon_route: String, default_color_scheme: ColorScheme, show_qrcode: bool, upload_route: String, @@ -296,6 +297,7 @@ pub fn directory_listing( default_color_scheme, false, false, + &favicon_route, ) .into_string(), ), @@ -356,6 +358,7 @@ pub fn directory_listing( show_qrcode, file_upload, &upload_route, + &favicon_route, &encoded_dir, &display_dir, tar_enabled, diff --git a/src/main.rs b/src/main.rs index 12314b0..f50b1a4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,10 @@ #![feature(proc_macro_hygiene)] -use actix_web::http::StatusCode; use actix_web::web; +use actix_web::{ + http::{header::ContentType, StatusCode}, + Responder, +}; use actix_web::{middleware, App, HttpRequest, HttpResponse}; use actix_web_httpauth::middleware::HttpAuthentication; use std::io::{self, Write}; @@ -50,6 +53,9 @@ pub struct MiniserveConfig { /// Enable random route generation pub random_route: Option<String>, + /// Randomly generated favicon route + pub favicon_route: String, + /// Default color scheme pub default_color_scheme: themes::ColorScheme, @@ -239,6 +245,7 @@ async fn run() -> Result<(), ContextualError> { HttpAuthentication::basic(auth::handle_auth), )) .wrap(middleware::Logger::default()) + .route(&format!("/{}", inside_config.favicon_route), web::get().to(favicon)) .configure(|c| configure_app(c, &inside_config)) .default_service(web::get().to(error_404)) }) @@ -270,6 +277,7 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { let path = &conf.path; let no_symlinks = conf.no_symlinks; let random_route = conf.random_route.clone(); + let favicon_route = conf.favicon_route.clone(); let default_color_scheme = conf.default_color_scheme; let show_qrcode = conf.show_qrcode; let file_upload = conf.file_upload; @@ -298,6 +306,7 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { no_symlinks, file_upload, random_route.clone(), + favicon_route.clone(), default_color_scheme, show_qrcode, u_r.clone(), @@ -310,13 +319,14 @@ fn configure_app(app: &mut web::ServiceConfig, conf: &MiniserveConfig) { } }; + let favicon_route = conf.favicon_route.clone(); if let Some(serve_path) = serve_path { if conf.file_upload { let default_color_scheme = conf.default_color_scheme; // Allow file upload app.service( web::resource(&upload_route).route(web::post().to(move |req, payload| { - file_upload::upload_file(req, payload, default_color_scheme, uses_random_route) + file_upload::upload_file(req, payload, default_color_scheme, uses_random_route, favicon_route.clone()) })), ) // Handle directories @@ -336,6 +346,7 @@ async fn error_404(req: HttpRequest) -> HttpResponse { let conf = req.app_data::<MiniserveConfig>().unwrap(); let default_color_scheme = conf.default_color_scheme; let uses_random_route = conf.random_route.is_some(); + let favicon_route = conf.favicon_route.clone(); let query_params = listing::extract_query_parameters(&req); let color_scheme = query_params.theme.unwrap_or(default_color_scheme); @@ -352,7 +363,15 @@ async fn error_404(req: HttpRequest) -> HttpResponse { default_color_scheme, false, !uses_random_route, + &favicon_route, ) .into_string(), ) } + +async fn favicon() -> impl Responder { + let logo = include_str!("../data/logo.svg"); + web::HttpResponse::Ok() + .set(ContentType(mime::IMAGE_SVG)) + .message_body(logo.into()) +} diff --git a/src/renderer.rs b/src/renderer.rs index c26059e..11fe8e3 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -22,6 +22,7 @@ pub fn page( show_qrcode: bool, file_upload: bool, upload_route: &str, + favicon_route: &str, encoded_dir: &str, display_dir: &str, tar_enabled: bool, @@ -39,7 +40,7 @@ pub fn page( html! { (DOCTYPE) html { - (page_header(display_dir, color_scheme, file_upload, false)) + (page_header(display_dir, color_scheme, file_upload, favicon_route, false)) body#drop-container { @if file_upload { div.drag-form { @@ -838,6 +839,7 @@ fn page_header( serve_path: &str, color_scheme: ColorScheme, file_upload: bool, + favicon_route: &str, is_error: bool, ) -> Markup { html! { @@ -845,6 +847,7 @@ fn page_header( meta charset="utf-8"; meta http-equiv="X-UA-Compatible" content="IE=edge"; meta name="viewport" content="width=device-width, initial-scale=1"; + link rel="icon" type="image/svg+xml" href={ "/" (favicon_route) }; @if is_error { title { (serve_path) } } @else { @@ -924,6 +927,7 @@ pub fn render_error( default_color_scheme: ColorScheme, has_referer: bool, display_back_link: bool, + favicon_route: &str, ) -> Markup { let link = if has_referer { return_address.to_string() @@ -940,7 +944,7 @@ pub fn render_error( html! { (DOCTYPE) html { - (page_header(&error_code.to_string(), color_scheme, false, true)) + (page_header(&error_code.to_string(), color_scheme, false, favicon_route, true)) body { div.error { p { (error_code.to_string()) } |