From a404f9a997da70e97c63b615044f7d8138976e4b Mon Sep 17 00:00:00 2001 From: HeapUnderflow Date: Wed, 12 Oct 2022 17:13:21 +0200 Subject: [PATCH] Allow setting a public url for all paths --- src/args.rs | 24 ++++++++++++++++++++++++ src/endpoints/create.rs | 4 ++-- src/endpoints/edit.rs | 6 +++--- src/endpoints/pastalist.rs | 2 +- src/endpoints/remove.rs | 4 ++-- templates/error.html | 2 +- templates/header.html | 8 ++++---- templates/pasta.html | 10 +++++----- templates/pastalist.html | 20 ++++++++++---------- 9 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/args.rs b/src/args.rs index 577fa0f..37b6461 100644 --- a/src/args.rs +++ b/src/args.rs @@ -1,4 +1,7 @@ +use std::convert::Infallible; +use std::fmt; use std::net::IpAddr; +use std::str::FromStr; use clap::Parser; use lazy_static::lazy_static; @@ -48,6 +51,9 @@ pub struct Args { #[clap(long, env="MICROBIN_PURE_HTML")] pub pure_html: bool, + #[clap(long, env="MICROBIN_PUBLIC_PATH", default_value_t = PublicUrl(String::from("/")))] + pub public_path: PublicUrl, + #[clap(long, env="MICROBIN_READONLY")] pub readonly: bool, @@ -59,4 +65,22 @@ pub struct Args { #[clap(long, env="MICROBIN_WIDE")] pub wide: bool, +} + +#[derive(Debug, Clone)] +pub struct PublicUrl(pub String); + +impl fmt::Display for PublicUrl { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl FromStr for PublicUrl { + type Err = Infallible; + + fn from_str(s: &str) -> Result { + let uri = s.strip_suffix('/').unwrap_or(s).to_owned(); + Ok(PublicUrl(uri)) + } } \ No newline at end of file diff --git a/src/endpoints/create.rs b/src/endpoints/create.rs index 8c8b1a3..fe39c94 100644 --- a/src/endpoints/create.rs +++ b/src/endpoints/create.rs @@ -32,7 +32,7 @@ pub async fn create( ) -> Result { if ARGS.readonly { return Ok(HttpResponse::Found() - .append_header(("Location", "/")) + .append_header(("Location", format!("{}/", ARGS.public_path))) .finish()); } @@ -154,6 +154,6 @@ pub async fn create( save_to_file(&pastas); Ok(HttpResponse::Found() - .append_header(("Location", format!("/pasta/{}", to_animal_names(id)))) + .append_header(("Location", format!("{}/pasta/{}", ARGS.public_path, to_animal_names(id)))) .finish()) } diff --git a/src/endpoints/edit.rs b/src/endpoints/edit.rs index f928324..54ef1f6 100644 --- a/src/endpoints/edit.rs +++ b/src/endpoints/edit.rs @@ -28,7 +28,7 @@ pub async fn get_edit(data: web::Data, id: web::Path) -> HttpR if pasta.id == id { if !pasta.editable { return HttpResponse::Found() - .append_header(("Location", "/")) + .append_header(("Location", format!("{}/", ARGS.public_path))) .finish(); } return HttpResponse::Ok().content_type("text/html").body( @@ -55,7 +55,7 @@ pub async fn post_edit( ) -> Result { if ARGS.readonly { return Ok(HttpResponse::Found() - .append_header(("Location", "/")) + .append_header(("Location", format!("{}/", ARGS.public_path))) .finish()); } @@ -85,7 +85,7 @@ pub async fn post_edit( save_to_file(&pastas); return Ok(HttpResponse::Found() - .append_header(("Location", format!("/pasta/{}", pastas[i].id_as_animals()))) + .append_header(("Location", format!("{}/pasta/{}", ARGS.public_path, pastas[i].id_as_animals()))) .finish()); } else { break; diff --git a/src/endpoints/pastalist.rs b/src/endpoints/pastalist.rs index 3e3dec4..e2536e5 100644 --- a/src/endpoints/pastalist.rs +++ b/src/endpoints/pastalist.rs @@ -17,7 +17,7 @@ struct PastaListTemplate<'a> { pub async fn list(data: web::Data) -> HttpResponse { if ARGS.no_listing { return HttpResponse::Found() - .append_header(("Location", "/")) + .append_header(("Location", format!("{}/", ARGS.public_path))) .finish(); } diff --git a/src/endpoints/remove.rs b/src/endpoints/remove.rs index 7b95553..6d552b0 100644 --- a/src/endpoints/remove.rs +++ b/src/endpoints/remove.rs @@ -13,7 +13,7 @@ use std::fs; pub async fn remove(data: web::Data, id: web::Path) -> HttpResponse { if ARGS.readonly { return HttpResponse::Found() - .append_header(("Location", "/")) + .append_header(("Location", format!("{}/", ARGS.public_path))) .finish(); } @@ -39,7 +39,7 @@ pub async fn remove(data: web::Data, id: web::Path) -> HttpRes // remove it from in-memory pasta list pastas.remove(i); return HttpResponse::Found() - .append_header(("Location", "/pastalist")) + .append_header(("Location", format!("{}/pastalist", ARGS.public_path))) .finish(); } } diff --git a/templates/error.html b/templates/error.html index 05f55d5..6e60b7c 100644 --- a/templates/error.html +++ b/templates/error.html @@ -4,7 +4,7 @@ Not Found

- Go Home + Go Home

{% include "footer.html" %} diff --git a/templates/header.html b/templates/header.html index 37d2de0..96729da 100644 --- a/templates/header.html +++ b/templates/header.html @@ -10,7 +10,7 @@ {% if !args.pure_html %} - + {%- endif %} {% if args.wide %} @@ -49,11 +49,11 @@ {%- endif %} -New Pasta +New Pasta -Pasta List +Pasta List -Help +Help
diff --git a/templates/pasta.html b/templates/pasta.html index 879c948..9514702 100644 --- a/templates/pasta.html +++ b/templates/pasta.html @@ -1,19 +1,19 @@ {% include "header.html" %}
diff --git a/templates/pastalist.html b/templates/pastalist.html index 4de2d2b..c3d15a2 100644 --- a/templates/pastalist.html +++ b/templates/pastalist.html @@ -4,7 +4,7 @@ {% if pastas.is_empty() %}

- No pastas yet. 😔 Create one here. + No pastas yet. 😔 Create one here.


{%- else %} @@ -38,7 +38,7 @@ {% if pasta.pasta_type == "text" && !pasta.private %} - {{pasta.id_as_animals()}} + {{pasta.id_as_animals()}} {{pasta.created_as_string()}} @@ -47,14 +47,14 @@ {{pasta.expiration_as_string()}} - Raw + Raw {% if pasta.file.is_some() %} - File + File {%- endif %} {% if pasta.editable %} - Edit + Edit {%- endif %} - Remove + Remove {%- endif %} @@ -90,7 +90,7 @@ {% if pasta.pasta_type == "url" && !pasta.private %} - {{pasta.id_as_animals()}} + {{pasta.id_as_animals()}} {{pasta.created_as_string()}} @@ -99,11 +99,11 @@ {{pasta.expiration_as_string()}} - Raw + Raw {% if pasta.editable %} - Edit + Edit {%- endif %} - Remove + Remove {%- endif %}