From d8196e76621e673b40ab2ec6fe8527c1e0b7bc3e Mon Sep 17 00:00:00 2001 From: Lukas Stabe Date: Fri, 21 Aug 2020 02:21:13 +0200 Subject: url-decode path in title and heading --- src/listing.rs | 15 ++++++++++++--- src/renderer.rs | 13 +++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/listing.rs b/src/listing.rs index 388153f..6970c36 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -5,7 +5,7 @@ use actix_web::web::Query; use actix_web::{HttpRequest, HttpResponse, Result}; use bytesize::ByteSize; use htmlescape::encode_minimal as escape_html_entity; -use percent_encoding::{utf8_percent_encode, AsciiSet, CONTROLS}; +use percent_encoding::{utf8_percent_encode, percent_decode_str, AsciiSet, CONTROLS}; use qrcodegen::{QrCode, QrCodeEcc}; use serde::Deserialize; use std::io; @@ -165,9 +165,17 @@ pub fn directory_listing( let base = Path::new(serve_path); let random_route = format!("/{}", random_route.unwrap_or_default()); let is_root = base.parent().is_none() || Path::new(&req.path()) == Path::new(&random_route); - let current_dir = match base.strip_prefix(random_route) { + let encoded_dir = match base.strip_prefix(random_route) { Ok(c_d) => Path::new("/").join(c_d), Err(_) => base.to_path_buf(), + }.display().to_string(); + let display_dir = { + let decoded = percent_decode_str(&encoded_dir).decode_utf8_lossy(); + if is_root { + decoded.to_string() + } else { + format!("{}/", decoded) + } }; let query_params = extract_query_parameters(req); @@ -350,7 +358,8 @@ pub fn directory_listing( show_qrcode, file_upload, &upload_route, - ¤t_dir.display().to_string(), + &encoded_dir, + &display_dir, tar_enabled, zip_enabled, ) diff --git a/src/renderer.rs b/src/renderer.rs index 7270e8f..a01b0a1 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -22,13 +22,14 @@ pub fn page( show_qrcode: bool, file_upload: bool, upload_route: &str, - current_dir: &str, + encoded_dir: &str, + display_dir: &str, tar_enabled: bool, zip_enabled: bool, ) -> Markup { let upload_action = build_upload_action( upload_route, - current_dir, + encoded_dir, sort_method, sort_order, color_scheme, @@ -38,7 +39,7 @@ pub fn page( html! { (DOCTYPE) html { - (page_header(serve_path, color_scheme, file_upload, false)) + (page_header(display_dir, color_scheme, file_upload, false)) body#drop-container { @if file_upload { div.drag-form { @@ -50,7 +51,7 @@ pub fn page( (color_scheme_selector(sort_method, sort_order, color_scheme, default_color_scheme, serve_path, show_qrcode)) div.container { span#top { } - h1.title { "Index of " (serve_path) } + h1.title { "Index of " (display_dir) } div.toolbar { @if tar_enabled || zip_enabled { div.download { @@ -107,13 +108,13 @@ pub fn page( /// Build the action of the upload form fn build_upload_action( upload_route: &str, - current_dir: &str, + encoded_dir: &str, sort_method: Option, sort_order: Option, color_scheme: ColorScheme, default_color_scheme: ColorScheme, ) -> String { - let mut upload_action = format!("{}?path={}", upload_route, current_dir); + let mut upload_action = format!("{}?path={}", upload_route, encoded_dir); if let Some(sorting_method) = sort_method { upload_action = format!("{}&sort={}", upload_action, &sorting_method); } -- cgit v1.2.3 From cdc10d5e234df74de01fb3fa6f30a507d7199408 Mon Sep 17 00:00:00 2001 From: Lukas Stabe Date: Fri, 21 Aug 2020 02:41:41 +0200 Subject: make name ordering case-insensitive --- src/listing.rs | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/listing.rs b/src/listing.rs index 6970c36..b58d765 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -249,29 +249,25 @@ pub fn directory_listing( } } - if let Some(sorting_method) = query_params.sort { - match sorting_method { - SortingMethod::Name => entries - .sort_by(|e1, e2| alphanumeric_sort::compare_str(e1.name.clone(), e2.name.clone())), - SortingMethod::Size => entries.sort_by(|e1, e2| { - // If we can't get the size of the entry (directory for instance) - // let's consider it's 0b - e2.size - .unwrap_or_else(|| ByteSize::b(0)) - .cmp(&e1.size.unwrap_or_else(|| ByteSize::b(0))) - }), - SortingMethod::Date => entries.sort_by(|e1, e2| { - // If, for some reason, we can't get the last modification date of an entry - // let's consider it was modified on UNIX_EPOCH (01/01/19270 00:00:00) - e2.last_modification_date - .unwrap_or(SystemTime::UNIX_EPOCH) - .cmp(&e1.last_modification_date.unwrap_or(SystemTime::UNIX_EPOCH)) - }), - }; - } else { - // Sort in alphanumeric order by default - entries.sort_by(|e1, e2| alphanumeric_sort::compare_str(e1.name.clone(), e2.name.clone())) - } + match query_params.sort.unwrap_or(SortingMethod::Name) { + SortingMethod::Name => entries.sort_by(|e1, e2| { + alphanumeric_sort::compare_str(e1.name.to_lowercase(), e2.name.to_lowercase()) + }), + SortingMethod::Size => entries.sort_by(|e1, e2| { + // If we can't get the size of the entry (directory for instance) + // let's consider it's 0b + e2.size + .unwrap_or_else(|| ByteSize::b(0)) + .cmp(&e1.size.unwrap_or_else(|| ByteSize::b(0))) + }), + SortingMethod::Date => entries.sort_by(|e1, e2| { + // If, for some reason, we can't get the last modification date of an entry + // let's consider it was modified on UNIX_EPOCH (01/01/19270 00:00:00) + e2.last_modification_date + .unwrap_or(SystemTime::UNIX_EPOCH) + .cmp(&e1.last_modification_date.unwrap_or(SystemTime::UNIX_EPOCH)) + }), + }; if let Some(sorting_order) = query_params.order { if let SortingOrder::Descending = sorting_order { -- cgit v1.2.3 From 22a1b02971ef147afd1afb729b4e4466da6724f8 Mon Sep 17 00:00:00 2001 From: Lukas Stabe Date: Fri, 21 Aug 2020 03:27:58 +0200 Subject: set size and date column to smaller, fixed sizes --- src/renderer.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/renderer.rs b/src/renderer.rs index a01b0a1..17e0119 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -76,9 +76,9 @@ pub fn page( } table { thead { - th { (build_link("name", "Name", sort_method, sort_order, color_scheme, default_color_scheme)) } - th { (build_link("size", "Size", sort_method, sort_order, color_scheme, default_color_scheme)) } - th { (build_link("date", "Last modification", sort_method, sort_order, color_scheme, default_color_scheme)) } + th.name { (build_link("name", "Name", sort_method, sort_order, color_scheme, default_color_scheme)) } + th.size { (build_link("size", "Size", sort_method, sort_order, color_scheme, default_color_scheme)) } + th.date { (build_link("date", "Last modification", sort_method, sort_order, color_scheme, default_color_scheme)) } } tbody { @if !is_root { @@ -353,7 +353,7 @@ fn entry_row( } } } - td { + td.size-cell { @if let Some(size) = entry.size { (size) } @@ -534,12 +534,17 @@ fn css(color_scheme: ColorScheme) -> Markup { color: {table_text_color}; text-align: left; line-height: 1.125rem; - width: 33.333%; }} table thead tr th {{ padding: 0.5rem 0.625rem 0.625rem; font-weight: bold; }} + table thead th.size {{ + width: 6em; + }} + table thead th.date {{ + width: 15em; + }} table tbody tr:nth-child(odd) {{ background: {odd_row_background}; }} @@ -552,9 +557,11 @@ fn css(color_scheme: ColorScheme) -> Markup { table tbody tr:hover {{ background: {active_row_color}; }} + td.size-cell {{ + text-align: right; + }} td.date-cell {{ display: flex; - width: calc(100% - 1.25rem); justify-content: space-between; }} .at {{ -- cgit v1.2.3 From 3a031e78a8fd966bd3f4c209556f16fd34902b97 Mon Sep 17 00:00:00 2001 From: Lukas Stabe Date: Fri, 21 Aug 2020 07:02:33 +0200 Subject: make linter happy --- src/listing.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/listing.rs b/src/listing.rs index b58d765..0ffa2df 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -5,7 +5,7 @@ use actix_web::web::Query; use actix_web::{HttpRequest, HttpResponse, Result}; use bytesize::ByteSize; use htmlescape::encode_minimal as escape_html_entity; -use percent_encoding::{utf8_percent_encode, percent_decode_str, AsciiSet, CONTROLS}; +use percent_encoding::{percent_decode_str, utf8_percent_encode, AsciiSet, CONTROLS}; use qrcodegen::{QrCode, QrCodeEcc}; use serde::Deserialize; use std::io; @@ -165,10 +165,14 @@ pub fn directory_listing( let base = Path::new(serve_path); let random_route = format!("/{}", random_route.unwrap_or_default()); let is_root = base.parent().is_none() || Path::new(&req.path()) == Path::new(&random_route); + let encoded_dir = match base.strip_prefix(random_route) { Ok(c_d) => Path::new("/").join(c_d), Err(_) => base.to_path_buf(), - }.display().to_string(); + } + .display() + .to_string(); + let display_dir = { let decoded = percent_decode_str(&encoded_dir).decode_utf8_lossy(); if is_root { -- cgit v1.2.3