From b2572ebfe5f5cdb8eb8e3f44eaf7632d0746d652 Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Mon, 3 Mar 2025 00:18:56 +0100 Subject: [PATCH] Add favicon --- Cargo.lock | 15 ++++----- README.md | 5 +++ backend/src/data/db/user.rs | 2 +- backend/src/hash.rs | 2 +- backend/src/main.rs | 62 +++++++++++++++++++++++++++++++----- backend/src/services/mod.rs | 5 +-- backend/src/translation.rs | 2 +- backend/static/favicon.ico | Bin 0 -> 16958 bytes common/src/ron_api.rs | 2 +- 9 files changed, 73 insertions(+), 22 deletions(-) create mode 100644 backend/static/favicon.ico diff --git a/Cargo.lock b/Cargo.lock index 2f667da..56b1295 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1905,7 +1905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.2", + "rand_core 0.9.3", "zerocopy 0.8.21", ] @@ -1926,7 +1926,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.2", + "rand_core 0.9.3", ] [[package]] @@ -1940,12 +1940,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.21", ] [[package]] @@ -1962,7 +1961,7 @@ dependencies = [ "itertools", "lettre", "rand 0.9.0", - "rand_core 0.9.2", + "rand_core 0.9.3", "rinja", "ron", "serde", @@ -2813,9 +2812,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", "tokio", diff --git a/README.md b/README.md index 04bd2ca..0c90d8e 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,11 @@ As root: 2. Enabled it: #> systemctl enable recipes 3. Launch it: #> systemctl start recipes +## Cross compile for Raspberry PI on Windows + +* $> https://gnutoolchains.com/raspberry/ +* https://gnutoolchains.com/raspberry64/ + # Useful URLs * Rust patterns : https://github.com/rust-unofficial/patterns diff --git a/backend/src/data/db/user.rs b/backend/src/data/db/user.rs index cdfa76f..51c71f4 100644 --- a/backend/src/data/db/user.rs +++ b/backend/src/data/db/user.rs @@ -1,4 +1,4 @@ -use chrono::{prelude::*, Duration}; +use chrono::{Duration, prelude::*}; use rand::distr::{Alphanumeric, SampleString}; use sqlx::Sqlite; diff --git a/backend/src/hash.rs b/backend/src/hash.rs index d06a15a..cb70199 100644 --- a/backend/src/hash.rs +++ b/backend/src/hash.rs @@ -1,8 +1,8 @@ use std::string::String; use argon2::{ - password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString}, Argon2, + password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString, rand_core::OsRng}, }; fn get_argon2<'k>() -> Argon2<'k> { diff --git a/backend/src/main.rs b/backend/src/main.rs index a9ef75a..199b933 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -13,7 +13,10 @@ use chrono::prelude::*; use clap::Parser; use config::Config; use itertools::Itertools; -use tower_http::{services::ServeDir, trace::TraceLayer}; +use tower_http::{ + services::{ServeDir, ServeFile}, + trace::TraceLayer, +}; use tracing::{Level, event}; use data::{db, model}; @@ -85,7 +88,7 @@ async fn main() { .with_max_level(TRACING_LEVEL) .init(); - if process_args().await { + if !process_args().await { return; } @@ -254,22 +257,22 @@ async fn main() { "/user/edit", get(services::user::edit_user_get).post(services::user::edit_user_post), ) + .nest("/fragments", fragments_routes) .route_layer(middleware::from_fn(services::ron_error_to_html)); let app = Router::new() .merge(html_routes) - .nest("/fragments", fragments_routes) .nest("/ron-api", ron_api_routes) .fallback(services::not_found) - .layer(TraceLayer::new_for_http()) - // FIXME: Should be 'route_layer' but it doesn't work for 'fallback(..)'. .layer(middleware::from_fn(translation)) .layer(middleware::from_fn_with_state( state.clone(), user_authentication, )) - .nest_service("/static", ServeDir::new("static")) .with_state(state) + .nest_service("/favicon.ico", ServeFile::new("static/favicon.ico")) + .nest_service("/static", ServeDir::new("static")) + .layer(TraceLayer::new_for_http()) .into_make_service_with_connect_info::(); let addr = SocketAddr::from(([0, 0, 0, 0], port)); @@ -291,11 +294,53 @@ async fn user_authentication( Ok(next.run(req).await) } +/// The language of the current HTTP request is defined in the current order: +/// - Extraction from the url: like in '/fr/recipe/view/42' (Not yet implemented). +/// - Get from the user database record. +/// - Get from the cookie. +/// - Get from the HTTP header `accept-language`. +/// - Set as `translation::DEFAULT_LANGUAGE_CODE`. async fn translation( Extension(user): Extension>, mut req: Request, next: Next, ) -> Result { + // Here we are extracting the language from the url then rewriting it. + // For example: + // "/fr/recipe/view/1" + // lang = "fr" and uri rewritten as = "/recipe/view/1" + // Disable because it doesn't work at this level, see: + // https://docs.rs/axum/latest/axum/middleware/index.html#rewriting-request-uri-in-middleware + + // let lang_and_new_uri = 'lang_from_uri: { + // if let Some(path_query) = req.uri().path_and_query() { + // event!(Level::INFO, "path: {:?}", path_query.path()); + // let mut parts = path_query.path().split('/'); + // let _ = parts.next(); // Empty part due to the first '/'. + // if let Some(lang) = parts.next() { + // let available_codes = translation::available_codes(); + // if available_codes.contains(&lang) { + // let mut rest: String = String::from(""); + // for part in parts { + // rest.push('/'); + // rest.push_str(part); + // } + // // let uri_builder = Uri::builder() + // if let Ok(new_uri) = rest.parse::() { + // event!(Level::INFO, "path rewrite: {:?}", new_uri.path()); + // break 'lang_from_uri Some((lang.to_string(), new_uri)); + // } + // } + // } + // } + // None + // }; + // let language = if let Some((lang, uri)) = lang_and_new_uri { + // *req.uri_mut() = uri; // Replace the URI without the language. + // event!(Level::INFO, "URI: {:?}", req.uri()); + // lang + // } else + let language = if let Some(user) = user { user.lang } else { @@ -370,6 +415,7 @@ struct Args { dbtest: bool, } +/// Returns `true` if the server can be started. async fn process_args() -> bool { let args = Args::parse(); @@ -418,8 +464,8 @@ async fn process_args() -> bool { } } - return true; + return false; } - false + true } diff --git a/backend/src/services/mod.rs b/backend/src/services/mod.rs index 9b44b23..b294a37 100644 --- a/backend/src/services/mod.rs +++ b/backend/src/services/mod.rs @@ -1,16 +1,17 @@ use axum::{ body, debug_handler, extract::{Extension, Request, State}, - http::{header, StatusCode}, + http::{StatusCode, header}, middleware::Next, response::{Html, IntoResponse, Response}, }; use rinja::Template; use crate::{ + Result, data::{db, model}, html_templates::*, - ron_utils, translation, Result, + ron_utils, translation, }; pub mod fragments; diff --git a/backend/src/translation.rs b/backend/src/translation.rs index 884b79b..5f01870 100644 --- a/backend/src/translation.rs +++ b/backend/src/translation.rs @@ -5,7 +5,7 @@ use ron::de::from_reader; use serde::Deserialize; use strum::EnumCount; use strum_macros::EnumCount; -use tracing::{event, Level}; +use tracing::{Level, event}; use crate::consts; diff --git a/backend/static/favicon.ico b/backend/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..02b971bcddb174415ab62035987bc138b39a3ad0 GIT binary patch literal 16958 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 X1V}HEz`iZLu^zK}Wj)giQt$r(J4zt- literal 0 HcmV?d00001 diff --git a/common/src/ron_api.rs b/common/src/ron_api.rs index 50f9ef0..d481947 100644 --- a/common/src/ron_api.rs +++ b/common/src/ron_api.rs @@ -1,5 +1,5 @@ use chrono::NaiveDate; -use ron::ser::{to_string_pretty, PrettyConfig}; +use ron::ser::{PrettyConfig, to_string_pretty}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone)] -- 2.49.0