From 2198cbdff9e4a13da7db8e43f9ded1110b7cac92 Mon Sep 17 00:00:00 2001 From: Daniel Szabo Date: Tue, 1 Nov 2022 20:56:07 +0200 Subject: [PATCH] Getting ready for 1.2 & new site release - improved support for serving static resources from the binary, now supporting images - added new logo - changed save button - fixed footer attribution text, it is not true anymore that MicroBin is made by myself - replaced footer GitHub link with microbin.eu link --- Cargo.lock | 47 +++++++++++++++ Cargo.toml | 2 + README.MD | 2 +- src/endpoints/info.rs | 2 +- src/endpoints/static_resources.rs | 91 +++++++++++++++++++---------- templates/{ => assets}/favicon.svg | 0 templates/assets/logo.png | Bin 0 -> 4402 bytes templates/{ => assets}/water.css | 0 templates/footer.html | 8 +-- templates/header.html | 19 +++--- templates/index.html | 36 +++++++----- templates/info.html | 4 +- templates/pasta.html | 6 +- 13 files changed, 149 insertions(+), 68 deletions(-) rename templates/{ => assets}/favicon.svg (100%) create mode 100644 templates/assets/logo.png rename templates/{ => assets}/water.css (100%) diff --git a/Cargo.lock b/Cargo.lock index 21101c1..c4189be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1293,8 +1293,10 @@ dependencies = [ "lazy_static", "linkify", "log", + "mime_guess", "qrcode-generator", "rand", + "rust-embed", "sanitize-filename", "serde", "serde_json", @@ -1702,6 +1704,40 @@ version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" +[[package]] +name = "rust-embed" +version = "6.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "283ffe2f866869428c92e0d61c2f35dfb4355293cdfdc48f49e895c15f1333d1" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "6.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31ab23d42d71fb9be1b643fe6765d292c5e14d46912d13f3ae2815ca048ea04d" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "7.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1669d81dfabd1b5f8e2856b8bbe146c6192b0ba22162edc738ac0a5de18f054" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc_version" version = "0.4.0" @@ -1820,6 +1856,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" diff --git a/Cargo.toml b/Cargo.toml index 19a334a..8adc0ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,8 @@ actix-web-httpauth = "0.6.0" lazy_static = "1.4.0" syntect = "5.0" qrcode-generator = "4.1.6" +rust-embed = "6.4.2" +mime_guess = "2.0.4" [profile.release] lto = true diff --git a/README.MD b/README.MD index 610cad0..e9756d8 100644 --- a/README.MD +++ b/README.MD @@ -18,7 +18,7 @@ Or install from Cargo: And run with your custom configuration: -`microbin --port 8080 --highlightsyntax --editable` +`microbin --port 8080 --public-path https://myserver.net --highlightsyntax --editable` ### Features - Is very small diff --git a/src/endpoints/info.rs b/src/endpoints/info.rs index bbdc4fe..7b8bb27 100644 --- a/src/endpoints/info.rs +++ b/src/endpoints/info.rs @@ -33,7 +33,7 @@ pub async fn info(data: web::Data) -> HttpResponse { args: &ARGS, pastas: &pastas, status: &String::from(status), - version_string: &String::from("1.2.0-20221029"), + version_string: &String::from("1.2.0-20221101"), message: &String::from(message), } .render() diff --git a/src/endpoints/static_resources.rs b/src/endpoints/static_resources.rs index 728d617..d314416 100644 --- a/src/endpoints/static_resources.rs +++ b/src/endpoints/static_resources.rs @@ -1,36 +1,63 @@ -use actix_web::{get, web, HttpResponse}; -use askama::Template; -use std::marker::PhantomData; +use actix_web::{web, App, HttpResponse, HttpServer, Responder}; +use mime_guess::from_path; +use rust_embed::RustEmbed; -#[derive(Template)] -#[template(path = "water.css", escape = "none")] -struct WaterCSS<'a> { - _marker: PhantomData<&'a ()>, -} +#[derive(RustEmbed)] +#[folder = "templates/assets/"] +struct Asset; -#[derive(Template)] -#[template(path = "favicon.svg", escape = "none")] -struct Favicon<'a> { - _marker: PhantomData<&'a ()>, -} - -#[get("/static/{resource}")] -pub async fn static_resources(resource_id: web::Path) -> HttpResponse { - match resource_id.into_inner().as_str() { - "water.css" => HttpResponse::Ok().content_type("text/css").body( - WaterCSS { - _marker: Default::default(), - } - .render() - .unwrap(), - ), - "favicon.svg" => HttpResponse::Ok().content_type("image/svg+xml").body( - Favicon { - _marker: Default::default(), - } - .render() - .unwrap(), - ), - _ => HttpResponse::NotFound().content_type("text/html").finish(), +fn handle_embedded_file(path: &str) -> HttpResponse { + match Asset::get(path) { + Some(content) => HttpResponse::Ok() + .content_type(from_path(path).first_or_octet_stream().as_ref()) + .body(content.data.into_owned()), + None => HttpResponse::NotFound().body("404 Not Found"), } } + +#[actix_web::get("/static/{_:.*}")] +async fn static_resources(path: web::Path) -> impl Responder { + handle_embedded_file(path.as_str()) +} + +// #[derive(Template)] +// #[template(path = "water.css", escape = "none")] +// struct WaterCSS<'a> { +// _marker: PhantomData<&'a ()>, +// } + +// // #[derive(Template)] +// // #[template(path = "logo.png", escape = "none")] +// struct LogoPNG<'a> { +// _marker: PhantomData<&'a ()>, +// } + +// #[derive(Template)] +// #[template(path = "favicon.svg", escape = "none")] +// struct Favicon<'a> { +// _marker: PhantomData<&'a ()>, +// } + +// #[get("/static/{resource}")] +// pub async fn static_resources(resource_id: web::Path) -> HttpResponse { +// match resource_id.into_inner().as_str() { +// "water.css" => HttpResponse::Ok().content_type("text/css").body( +// WaterCSS { +// _marker: Default::default(), +// } +// .render() +// .unwrap(), +// ), +// "logo.png" => HttpResponse::Ok() +// .content_type("image/png") +// .body(Ok(EmbedFile::open("templates/logo.png")?)), +// "favicon.svg" => HttpResponse::Ok().content_type("image/svg+xml").body( +// Favicon { +// _marker: Default::default(), +// } +// .render() +// .unwrap(), +// ), +// _ => HttpResponse::NotFound().content_type("text/html").finish(), +// } +// } diff --git a/templates/favicon.svg b/templates/assets/favicon.svg similarity index 100% rename from templates/favicon.svg rename to templates/assets/favicon.svg diff --git a/templates/assets/logo.png b/templates/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e2a30e4675adf101d553c5ab29a06910c5b2f4 GIT binary patch literal 4402 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 literal 0 HcmV?d00001 diff --git a/templates/water.css b/templates/assets/water.css similarity index 100% rename from templates/water.css rename to templates/assets/water.css diff --git a/templates/footer.html b/templates/footer.html index d705401..ae7f14e 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -1,17 +1,17 @@ - {% if !args.hide_footer %}

{% if args.footer_text.as_ref().is_none() %} - MicroBin by Dániel Szabó. Fork me on GitHub! - Let's keep the Web compact, accessible and humane! + MicroBin by Dániel Szabó and the FOSS Community. + Let's keep the Web compact, accessible and humane! {%- else %} - {{ args.footer_text.as_ref().unwrap() }} + {{ args.footer_text.as_ref().unwrap() }} {%- endif %}

{%- endif %} + \ No newline at end of file diff --git a/templates/header.html b/templates/header.html index d282c93..8bd4a5b 100644 --- a/templates/header.html +++ b/templates/header.html @@ -10,7 +10,7 @@ - + {% if !args.pure_html %} {% if args.custom_css.as_ref().is_none() %} @@ -48,20 +48,17 @@ {% if !args.hide_logo %} - μ - {%- endif %} - - {% if args.title.as_ref().is_none() %} - MicroBin - {%- else %} - {{ args.title.as_ref().unwrap() }} - {%- endif %} + + + {%- endif %} {% if args.title.as_ref().is_none() %} + MicroBin {%- else %} {{ args.title.as_ref().unwrap() }} {%- endif %} New - Pasta + - Pasta List + List Info diff --git a/templates/index.html b/templates/index.html index 3c92851..1730b86 100644 --- a/templates/index.html +++ b/templates/index.html @@ -164,23 +164,27 @@ -
- - {% if !args.no_file_upload %} -
- -
- + +
+ {% if !args.no_file_upload %} +
+ +
+ +
+ {% endif %} + {% if args.readonly %} + + + {%- else %} + + + + {%- endif %}
- {% endif %} - {% if args.readonly %} - - {%- else %} - - {%- endif %} - -