Add favicon
authorGreg Burri <greg.burri@gmail.com>
Sun, 2 Mar 2025 23:18:56 +0000 (00:18 +0100)
committerGreg Burri <greg.burri@gmail.com>
Sun, 2 Mar 2025 23:18:56 +0000 (00:18 +0100)
Cargo.lock
README.md
backend/src/data/db/user.rs
backend/src/hash.rs
backend/src/main.rs
backend/src/services/mod.rs
backend/src/translation.rs
backend/static/favicon.ico [new file with mode: 0644]
common/src/ron_api.rs

index 2f667da..56b1295 100644 (file)
@@ -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",
index 04bd2ca..0c90d8e 100644 (file)
--- 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
index cdfa76f..51c71f4 100644 (file)
@@ -1,4 +1,4 @@
-use chrono::{prelude::*, Duration};
+use chrono::{Duration, prelude::*};
 use rand::distr::{Alphanumeric, SampleString};
 use sqlx::Sqlite;
 
index d06a15a..cb70199 100644 (file)
@@ -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> {
index a9ef75a..199b933 100644 (file)
@@ -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::<SocketAddr>();
 
     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<Option<model::User>>,
     mut req: Request,
     next: Next,
 ) -> Result<Response> {
+    // 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::<Uri>() {
+    //                     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
 }
index 9b44b23..b294a37 100644 (file)
@@ -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;
index 884b79b..5f01870 100644 (file)
@@ -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 (file)
index 0000000..02b971b
Binary files /dev/null and b/backend/static/favicon.ico differ
index 50f9ef0..d481947 100644 (file)
@@ -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)]