aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/auth.rs1
-rw-r--r--src/file_upload.rs59
-rw-r--r--src/listing.rs40
-rw-r--r--src/main.rs10
-rw-r--r--src/renderer.rs9
5 files changed, 61 insertions, 58 deletions
diff --git a/src/auth.rs b/src/auth.rs
index 3989ab4..c3cbd54 100644
--- a/src/auth.rs
+++ b/src/auth.rs
@@ -163,6 +163,7 @@ fn build_unauthorized_response(
req.state().default_color_scheme,
req.state().default_color_scheme,
false,
+ false,
)
.into_string()
}
diff --git a/src/file_upload.rs b/src/file_upload.rs
index 9344e8b..36b2401 100644
--- a/src/file_upload.rs
+++ b/src/file_upload.rs
@@ -1,7 +1,7 @@
use actix_web::{
dev,
http::{header, StatusCode},
- multipart, FromRequest, FutureResponse, HttpMessage, HttpRequest, HttpResponse, Query,
+ multipart, FutureResponse, HttpMessage, HttpRequest, HttpResponse,
};
use futures::{future, future::FutureResult, Future, Stream};
use std::{
@@ -11,7 +11,7 @@ use std::{
};
use crate::errors::{self, ContextualError};
-use crate::listing::{QueryParameters, SortingMethod, SortingOrder};
+use crate::listing::{self, SortingMethod, SortingOrder};
use crate::renderer;
use crate::themes::ColorScheme;
@@ -127,48 +127,24 @@ pub fn upload_file(
"/".to_string()
};
- let (path, sort_method, sort_order, color_scheme) = match Query::<QueryParameters>::extract(req)
- {
- Ok(query) => {
- let sort_param = query.sort;
- let order_param = query.order;
- let theme_param = query.theme.unwrap_or(default_color_scheme);
-
- if let Some(path) = query.path.clone() {
- if let Ok(stripped_path) = path.strip_prefix(Component::RootDir) {
- (
- stripped_path.to_owned(),
- sort_param,
- order_param,
- theme_param,
- )
- } else {
- (path.clone(), sort_param, order_param, theme_param)
- }
- } else {
- let err = ContextualError::InvalidHTTPRequestError(
- "Missing query parameter 'path'".to_string(),
- );
- return Box::new(create_error_response(
- &err.to_string(),
- StatusCode::BAD_REQUEST,
- &return_path,
- sort_param,
- order_param,
- theme_param,
- default_color_scheme,
- ));
- }
- }
- Err(e) => {
- let err = ContextualError::InvalidHTTPRequestError(e.to_string());
+ let (sort_method, sort_order, _, color_scheme, path) = listing::extract_query_parameters(req);
+ let color_scheme = color_scheme.unwrap_or(default_color_scheme);
+ let upload_path = match path {
+ Some(path) => match path.strip_prefix(Component::RootDir) {
+ Ok(stripped_path) => stripped_path.to_owned(),
+ Err(_) => path.clone(),
+ },
+ None => {
+ let err = ContextualError::InvalidHTTPRequestError(
+ "Missing query parameter 'path'".to_string(),
+ );
return Box::new(create_error_response(
&err.to_string(),
StatusCode::BAD_REQUEST,
&return_path,
- None,
- None,
- default_color_scheme,
+ sort_method,
+ sort_order,
+ color_scheme,
default_color_scheme,
));
}
@@ -194,7 +170,7 @@ pub fn upload_file(
};
// If the target path is under the app root directory, save the file.
- let target_dir = match &app_root_dir.clone().join(path).canonicalize() {
+ let target_dir = match &app_root_dir.clone().join(upload_path).canonicalize() {
Ok(path) if path.starts_with(&app_root_dir) => path.clone(),
_ => {
let err = ContextualError::InvalidHTTPRequestError(
@@ -261,6 +237,7 @@ fn create_error_response(
color_scheme,
default_color_scheme,
true,
+ true,
)
.into_string(),
),
diff --git a/src/listing.rs b/src/listing.rs
index 22e43f0..2e3093d 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -10,10 +10,10 @@ use std::path::{Path, PathBuf};
use std::time::SystemTime;
use strum_macros::{Display, EnumString};
-use crate::archive;
+use crate::archive::{self, CompressionMethod};
use crate::errors;
use crate::renderer;
-use crate::themes;
+use crate::themes::ColorScheme;
/// Query parameters
#[derive(Deserialize)]
@@ -21,8 +21,8 @@ pub struct QueryParameters {
pub path: Option<PathBuf>,
pub sort: Option<SortingMethod>,
pub order: Option<SortingOrder>,
- pub theme: Option<themes::ColorScheme>,
- download: Option<archive::CompressionMethod>,
+ pub theme: Option<ColorScheme>,
+ download: Option<CompressionMethod>,
}
/// Available sorting methods
@@ -131,7 +131,7 @@ pub fn directory_listing<S>(
skip_symlinks: bool,
file_upload: bool,
random_route: Option<String>,
- default_color_scheme: themes::ColorScheme,
+ default_color_scheme: ColorScheme,
upload_route: String,
) -> Result<HttpResponse, io::Error> {
let serve_path = req.path();
@@ -144,12 +144,7 @@ pub fn directory_listing<S>(
Err(_) => base.to_path_buf(),
};
- let (sort_method, sort_order, download, color_scheme) =
- if let Ok(query) = Query::<QueryParameters>::extract(req) {
- (query.sort, query.order, query.download.clone(), query.theme)
- } else {
- (None, None, None, None)
- };
+ let (sort_method, sort_order, download, color_scheme, _) = extract_query_parameters(req);
let mut entries: Vec<Entry> = Vec::new();
@@ -273,6 +268,7 @@ pub fn directory_listing<S>(
color_scheme,
default_color_scheme,
false,
+ true,
)
.into_string(),
))
@@ -299,3 +295,25 @@ pub fn directory_listing<S>(
))
}
}
+
+pub fn extract_query_parameters<S>(
+ req: &HttpRequest<S>,
+) -> (
+ Option<SortingMethod>,
+ Option<SortingOrder>,
+ Option<CompressionMethod>,
+ Option<ColorScheme>,
+ Option<PathBuf>,
+) {
+ if let Ok(query) = Query::<QueryParameters>::extract(req) {
+ (
+ query.sort,
+ query.order,
+ query.download.clone(),
+ query.theme,
+ query.path.clone(),
+ )
+ } else {
+ (None, None, None, None, None)
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index 22b91cb..3bac14d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -287,6 +287,9 @@ fn error_404(req: &HttpRequest<crate::MiniserveConfig>) -> Result<HttpResponse,
None => "/".to_string(),
};
+ let (sort_method, sort_order, _, color_scheme, _) = listing::extract_query_parameters(req);
+ let color_scheme = color_scheme.unwrap_or(default_color_scheme);
+
errors::log_error_chain(err_404.to_string());
Ok(actix_web::HttpResponse::NotFound().body(
@@ -294,11 +297,12 @@ fn error_404(req: &HttpRequest<crate::MiniserveConfig>) -> Result<HttpResponse,
&err_404.to_string(),
StatusCode::NOT_FOUND,
&return_address,
- None,
- None,
- default_color_scheme,
+ sort_method,
+ sort_order,
+ color_scheme,
default_color_scheme,
false,
+ true,
)
.into_string(),
))
diff --git a/src/renderer.rs b/src/renderer.rs
index acef208..cdcec94 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -854,6 +854,7 @@ pub fn render_error(
color_scheme: ColorScheme,
default_color_scheme: ColorScheme,
has_referer: bool,
+ display_back_link: bool,
) -> Markup {
let link = if has_referer {
return_address.to_string()
@@ -875,9 +876,11 @@ pub fn render_error(
@for error in error_description.lines() {
p { (error) }
}
- div.error-nav {
- a.error-back href=(link) {
- "Go back to file listing"
+ @if display_back_link {
+ div.error-nav {
+ a.error-back href=(link) {
+ "Go back to file listing"
+ }
}
}
}