diff --git a/src/main.rs b/src/main.rs index 36273fcc..18e2fcc5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -113,8 +113,8 @@ async fn main() -> std::io::Result<()> { .configure(v1::services) .configure(widget::services) .configure(docs::services) - .configure(static_assets::services) .configure(pages::services) + .configure(static_assets::services) .app_data(get_json_err()) }) .bind(SETTINGS.server.get_ip()) diff --git a/src/static_assets/filemap.rs b/src/static_assets/filemap.rs new file mode 100644 index 00000000..2141daa9 --- /dev/null +++ b/src/static_assets/filemap.rs @@ -0,0 +1,52 @@ +/* +* Copyright (C) 2021 Aravinth Manivannan +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see . +*/ +use cache_buster::Files; + +pub struct FileMap { + pub files: Files, +} + +impl FileMap { + pub fn new() -> Self { + let map = include_str!("../cache_buster_data.json"); + let files = Files::new(&map); + Self { files } + } + pub fn get<'a>(&'a self, path: &'a str) -> Option<&'a str> { + // let file_path = self.files.get(path); + let file_path = self.files.get_full_path(path); + + if file_path.is_some() { + let file_path = &file_path.unwrap()[1..]; + return Some(file_path); + } else { + return None; + } + } +} + +#[cfg(test)] +mod tests { + + #[test] + fn filemap_works() { + let files = super::FileMap::new(); + let css = files.get("./static-assets/bundle/bundle.css").unwrap(); + println!("{}", css); + assert!(css.contains("/static/bundle/bundle")); + } +} diff --git a/src/static_assets/mod.rs b/src/static_assets/mod.rs new file mode 100644 index 00000000..ab61fc46 --- /dev/null +++ b/src/static_assets/mod.rs @@ -0,0 +1,26 @@ +/* +* Copyright (C) 2021 Aravinth Manivannan +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as +* published by the Free Software Foundation, either version 3 of the +* License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see . +*/ + +pub mod filemap; +pub mod static_files; + +pub use filemap::FileMap; + +pub fn services(cfg: &mut actix_web::web::ServiceConfig) { + cfg.service(static_files::static_files); + cfg.service(static_files::favicons); +} diff --git a/src/static_assets.rs b/src/static_assets/static_files.rs similarity index 57% rename from src/static_assets.rs rename to src/static_assets/static_files.rs index 4e4b9146..4458b87a 100644 --- a/src/static_assets.rs +++ b/src/static_assets/static_files.rs @@ -18,7 +18,7 @@ use std::borrow::Cow; use actix_web::body::Body; use actix_web::{get, http::header, web, HttpResponse, Responder}; -use cache_buster::Files; +use log::debug; use mime_guess::from_path; use rust_embed::RustEmbed; @@ -28,7 +28,7 @@ use crate::CACHE_AGE; #[folder = "static/"] struct Asset; -pub fn handle_embedded_file(path: &str) -> HttpResponse { +fn handle_assets(path: &str) -> HttpResponse { match Asset::get(path) { Some(content) => { let body: Body = match content { @@ -48,37 +48,41 @@ pub fn handle_embedded_file(path: &str) -> HttpResponse { } #[get("/static/{_:.*}")] -async fn dist(path: web::Path) -> impl Responder { - handle_embedded_file(&path.0) +pub async fn static_files(path: web::Path) -> impl Responder { + handle_assets(&path.0) } -pub fn services(cfg: &mut web::ServiceConfig) { - cfg.service(dist); -} -pub struct FileMap { - files: Files, -} -impl FileMap { - pub fn new() -> Self { - let map = include_str!("cache_buster_data.json"); - let files = Files::new(&map); - Self { files } - } - pub fn get<'a>(&'a self, path: &'a str) -> Option<&'a str> { - // let file_path = self.files.get(path); - let file_path = self.files.get_full_path(path); +#[derive(RustEmbed)] +#[folder = "static-assets/favicons/"] +struct Favicons; - if file_path.is_some() { - let file_path = &file_path.unwrap()[1..]; - return Some(file_path); - } else { - return None; +fn handle_favicons(path: &str) -> HttpResponse { + match Favicons::get(path) { + Some(content) => { + let body: Body = match content { + Cow::Borrowed(bytes) => bytes.into(), + Cow::Owned(bytes) => bytes.into(), + }; + + HttpResponse::Ok() + .set(header::CacheControl(vec![header::CacheDirective::MaxAge( + CACHE_AGE, + )])) + .content_type(from_path(path).first_or_octet_stream().as_ref()) + .body(body) } + None => HttpResponse::NotFound().body("404 Not Found"), } } +#[get("/{file}")] +pub async fn favicons(path: web::Path) -> impl Responder { + debug!("searching favicons"); + handle_favicons(&path.0) +} + #[cfg(test)] mod tests { use actix_web::http::StatusCode; @@ -86,10 +90,11 @@ mod tests { use super::*; use crate::*; + use crate::tests::*; #[actix_rt::test] async fn static_assets_work() { - let mut app = test::init_service(App::new().configure(services)).await; + let mut app = get_app!().await; let resp = test::call_service( &mut app, @@ -99,11 +104,21 @@ mod tests { assert_eq!(resp.status(), StatusCode::OK); } - #[test] - fn filemap_works() { - let files = super::FileMap::new(); - let css = files.get("./static-assets/bundle/bundle.css").unwrap(); - println!("{}", css); - assert!(css.contains("/static/bundle/bundle")); + #[actix_rt::test] + async fn favicons_work() { + + assert!(Favicons::get("favicon.ico").is_some()); + + //let mut app = test::init_service(App::new().configure(services)).await; + let mut app = get_app!().await; + + let resp = test::call_service( + &mut app, + test::TestRequest::get().uri("/favicon.ico").to_request(), + ) + .await; + assert_eq!(resp.status(), StatusCode::OK); + } + } diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 205df515..7b0aea0d 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -48,6 +48,21 @@ macro_rules! post_request { #[macro_export] macro_rules! get_app { + () => { + test::init_service( + App::new() + .wrap(get_identity_service()) + .wrap(actix_middleware::NormalizePath::new( + actix_middleware::normalize::TrailingSlash::Trim, + )) + .configure(crate::api::v1::services) + .configure(crate::widget::services) + .configure(crate::docs::services) + .configure(crate::pages::services) + .configure(crate::static_assets::services) + ) + + }; ($data:expr) => { test::init_service( App::new() @@ -55,9 +70,11 @@ macro_rules! get_app { .wrap(actix_middleware::NormalizePath::new( actix_middleware::normalize::TrailingSlash::Trim, )) - .configure(crate::api::v1::pow::services) .configure(crate::api::v1::services) + .configure(crate::widget::services) + .configure(crate::docs::services) .configure(crate::pages::services) + .configure(crate::static_assets::services) .data($data.clone()), ) }; diff --git a/static-assets/favicons/android-icon-144x144.png b/static-assets/favicons/android-icon-144x144.png new file mode 100644 index 00000000..0f16a0b9 Binary files /dev/null and b/static-assets/favicons/android-icon-144x144.png differ diff --git a/static-assets/favicons/android-icon-192x192.png b/static-assets/favicons/android-icon-192x192.png new file mode 100644 index 00000000..5223305e Binary files /dev/null and b/static-assets/favicons/android-icon-192x192.png differ diff --git a/static-assets/favicons/android-icon-36x36.png b/static-assets/favicons/android-icon-36x36.png new file mode 100644 index 00000000..f4900ce7 Binary files /dev/null and b/static-assets/favicons/android-icon-36x36.png differ diff --git a/static-assets/favicons/android-icon-48x48.png b/static-assets/favicons/android-icon-48x48.png new file mode 100644 index 00000000..ef1cafb6 Binary files /dev/null and b/static-assets/favicons/android-icon-48x48.png differ diff --git a/static-assets/favicons/android-icon-72x72.png b/static-assets/favicons/android-icon-72x72.png new file mode 100644 index 00000000..e6704414 Binary files /dev/null and b/static-assets/favicons/android-icon-72x72.png differ diff --git a/static-assets/favicons/android-icon-96x96.png b/static-assets/favicons/android-icon-96x96.png new file mode 100644 index 00000000..032e2f11 Binary files /dev/null and b/static-assets/favicons/android-icon-96x96.png differ diff --git a/static-assets/favicons/apple-icon-114x114.png b/static-assets/favicons/apple-icon-114x114.png new file mode 100644 index 00000000..d1d4d49f Binary files /dev/null and b/static-assets/favicons/apple-icon-114x114.png differ diff --git a/static-assets/favicons/apple-icon-120x120.png b/static-assets/favicons/apple-icon-120x120.png new file mode 100644 index 00000000..139bad9a Binary files /dev/null and b/static-assets/favicons/apple-icon-120x120.png differ diff --git a/static-assets/favicons/apple-icon-144x144.png b/static-assets/favicons/apple-icon-144x144.png new file mode 100644 index 00000000..0f16a0b9 Binary files /dev/null and b/static-assets/favicons/apple-icon-144x144.png differ diff --git a/static-assets/favicons/apple-icon-152x152.png b/static-assets/favicons/apple-icon-152x152.png new file mode 100644 index 00000000..a1565542 Binary files /dev/null and b/static-assets/favicons/apple-icon-152x152.png differ diff --git a/static-assets/favicons/apple-icon-180x180.png b/static-assets/favicons/apple-icon-180x180.png new file mode 100644 index 00000000..74ecfef1 Binary files /dev/null and b/static-assets/favicons/apple-icon-180x180.png differ diff --git a/static-assets/favicons/apple-icon-57x57.png b/static-assets/favicons/apple-icon-57x57.png new file mode 100644 index 00000000..c38be390 Binary files /dev/null and b/static-assets/favicons/apple-icon-57x57.png differ diff --git a/static-assets/favicons/apple-icon-60x60.png b/static-assets/favicons/apple-icon-60x60.png new file mode 100644 index 00000000..10eeb50e Binary files /dev/null and b/static-assets/favicons/apple-icon-60x60.png differ diff --git a/static-assets/favicons/apple-icon-72x72.png b/static-assets/favicons/apple-icon-72x72.png new file mode 100644 index 00000000..e6704414 Binary files /dev/null and b/static-assets/favicons/apple-icon-72x72.png differ diff --git a/static-assets/favicons/apple-icon-76x76.png b/static-assets/favicons/apple-icon-76x76.png new file mode 100644 index 00000000..fb54e26b Binary files /dev/null and b/static-assets/favicons/apple-icon-76x76.png differ diff --git a/static-assets/favicons/apple-icon-precomposed.png b/static-assets/favicons/apple-icon-precomposed.png new file mode 100644 index 00000000..096844d9 Binary files /dev/null and b/static-assets/favicons/apple-icon-precomposed.png differ diff --git a/static-assets/favicons/apple-icon.png b/static-assets/favicons/apple-icon.png new file mode 100644 index 00000000..096844d9 Binary files /dev/null and b/static-assets/favicons/apple-icon.png differ diff --git a/static-assets/favicons/browserconfig.xml b/static-assets/favicons/browserconfig.xml new file mode 100644 index 00000000..c5541482 --- /dev/null +++ b/static-assets/favicons/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/static-assets/favicons/favicon-16x16.png b/static-assets/favicons/favicon-16x16.png new file mode 100644 index 00000000..f5ca098a Binary files /dev/null and b/static-assets/favicons/favicon-16x16.png differ diff --git a/static-assets/favicons/favicon-32x32.png b/static-assets/favicons/favicon-32x32.png new file mode 100644 index 00000000..fc588826 Binary files /dev/null and b/static-assets/favicons/favicon-32x32.png differ diff --git a/static-assets/favicons/favicon-96x96.png b/static-assets/favicons/favicon-96x96.png new file mode 100644 index 00000000..032e2f11 Binary files /dev/null and b/static-assets/favicons/favicon-96x96.png differ diff --git a/static-assets/favicons/favicon.ico b/static-assets/favicons/favicon.ico new file mode 100644 index 00000000..d0102703 Binary files /dev/null and b/static-assets/favicons/favicon.ico differ diff --git a/static-assets/favicons/manifest.json b/static-assets/favicons/manifest.json new file mode 100644 index 00000000..013d4a6a --- /dev/null +++ b/static-assets/favicons/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "App", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} \ No newline at end of file diff --git a/static-assets/favicons/ms-icon-144x144.png b/static-assets/favicons/ms-icon-144x144.png new file mode 100644 index 00000000..0f16a0b9 Binary files /dev/null and b/static-assets/favicons/ms-icon-144x144.png differ diff --git a/static-assets/favicons/ms-icon-150x150.png b/static-assets/favicons/ms-icon-150x150.png new file mode 100644 index 00000000..f431ba8c Binary files /dev/null and b/static-assets/favicons/ms-icon-150x150.png differ diff --git a/static-assets/favicons/ms-icon-310x310.png b/static-assets/favicons/ms-icon-310x310.png new file mode 100644 index 00000000..10db438d Binary files /dev/null and b/static-assets/favicons/ms-icon-310x310.png differ diff --git a/static-assets/favicons/ms-icon-70x70.png b/static-assets/favicons/ms-icon-70x70.png new file mode 100644 index 00000000..93b0b703 Binary files /dev/null and b/static-assets/favicons/ms-icon-70x70.png differ diff --git a/templates/auth/login/index.html b/templates/auth/login/index.html index 03f2d882..bb266005 100644 --- a/templates/auth/login/index.html +++ b/templates/auth/login/index.html @@ -1,4 +1,4 @@ -<. include!("../../components/headers.html"); .> +<. include!("../../components/headers/index.html"); .>
diff --git a/templates/auth/register/index.html b/templates/auth/register/index.html index 77783a28..524d4532 100644 --- a/templates/auth/register/index.html +++ b/templates/auth/register/index.html @@ -1,4 +1,4 @@ -<. include!("../../components/headers.html"); .> +<. include!("../../components/headers/index.html"); .>
diff --git a/templates/components/headers/favicon.html b/templates/components/headers/favicon.html new file mode 100644 index 00000000..781c3662 --- /dev/null +++ b/templates/components/headers/favicon.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/templates/components/headers.html b/templates/components/headers/index.html similarity index 100% rename from templates/components/headers.html rename to templates/components/headers/index.html diff --git a/templates/components/raw-headers.html b/templates/components/headers/raw-headers.html similarity index 97% rename from templates/components/raw-headers.html rename to templates/components/headers/raw-headers.html index caf670fa..23d8fc86 100644 --- a/templates/components/raw-headers.html +++ b/templates/components/headers/raw-headers.html @@ -44,5 +44,6 @@ - + <. include!("./favicon.html"); .> + diff --git a/templates/errors/index.html b/templates/errors/index.html index b07f95ce..93f8199a 100644 --- a/templates/errors/index.html +++ b/templates/errors/index.html @@ -1,4 +1,4 @@ -<. include!("../components/headers.html"); .> +<. include!("../components/headers/index.html"); .>

<.= title .>

diff --git a/templates/panel/index.html b/templates/panel/index.html index ef449257..a6b52f23 100644 --- a/templates/panel/index.html +++ b/templates/panel/index.html @@ -1,4 +1,4 @@ -<. include!("../components/headers.html"); .> +<. include!("../components/headers/index.html"); .> <. include!("./navbar/index.html"); .>
<. include!("./header/index.html"); .> diff --git a/templates/panel/sitekey/add/index.html b/templates/panel/sitekey/add/index.html index 930dafc8..3dab97f5 100644 --- a/templates/panel/sitekey/add/index.html +++ b/templates/panel/sitekey/add/index.html @@ -1,4 +1,4 @@ -<. include!("../../../components/headers.html"); .> +<. include!("../../../components/headers/index.html"); .> <. include!("../../navbar/index.html"); .>
<. include!("../../header/index.html"); .> diff --git a/templates/panel/sitekey/list/index.html b/templates/panel/sitekey/list/index.html index ce61bafe..3a4e3827 100644 --- a/templates/panel/sitekey/list/index.html +++ b/templates/panel/sitekey/list/index.html @@ -1,4 +1,4 @@ -<. include!("../../../components/headers.html"); .> +<. include!("../../../components/headers/index.html"); .> <. include!("../../navbar/index.html"); .>
<. include!("../../header/index.html"); .> diff --git a/templates/panel/sitekey/view/index.html b/templates/panel/sitekey/view/index.html index 5636b6d4..bd5e533b 100644 --- a/templates/panel/sitekey/view/index.html +++ b/templates/panel/sitekey/view/index.html @@ -1,4 +1,4 @@ -<. include!("../../../components/headers.html"); .> +<. include!("../../../components/headers/index.html"); .> <. include!("../../navbar/index.html"); .>
<. include!("../../header/index.html"); .> diff --git a/templates/widget/index.html b/templates/widget/index.html index 07f909f3..710740c0 100644 --- a/templates/widget/index.html +++ b/templates/widget/index.html @@ -1,4 +1,4 @@ -<. include!("../components/raw-headers.html"); .> +<. include!("../components/headers/raw-headers.html"); .>