diff options
| author | WriterV2 <primary-v2@protonmail.com> | 2024-10-27 13:58:51 +0100 |
|---|---|---|
| committer | WriterV2 <primary-v2@protonmail.com> | 2024-10-27 14:00:34 +0100 |
| commit | 04e19765aca471fd85199714699aaf827d04608d (patch) | |
| tree | a2bfa782c1db2a6b783206087309a9eed3c6e9b9 /src/handlers | |
| parent | e074949d96fe29929e99890b3035dc1a5ba57184 (diff) | |
Refactor: Organize modules initially
Diffstat (limited to 'src/handlers')
| -rw-r--r-- | src/handlers/admin.rs | 39 | ||||
| -rw-r--r-- | src/handlers/frontend.rs | 37 | ||||
| -rw-r--r-- | src/handlers/mod.rs | 21 |
3 files changed, 97 insertions, 0 deletions
diff --git a/src/handlers/admin.rs b/src/handlers/admin.rs new file mode 100644 index 0000000..349275b --- /dev/null +++ b/src/handlers/admin.rs @@ -0,0 +1,39 @@ +use std::env; + +use axum::extract::Request; +use axum::http::{HeaderMap, StatusCode}; +use axum::middleware::Next; +use axum::response::Response; +use subtle::ConstantTimeEq; + +pub async fn admin_middleware( + headers: HeaderMap, + request: Request, + next: Next, +) -> Result<Response, StatusCode> { + let expected_token = env::var("TOKEN").map_err(|_| { + eprintln!("Error: TOKEN environment variable is not set"); + StatusCode::INTERNAL_SERVER_ERROR + })?; + + let token = headers + .get("X-Admin-Token") + .and_then(|header| header.to_str().ok()) + .ok_or(StatusCode::UNAUTHORIZED)?; + + if !expected_token + .as_bytes() + .ct_eq(token.as_bytes()) + .unwrap_u8() + == 1 + { + eprintln!("Warning: Unauthorized access attempt with invalid token"); + return Err(StatusCode::UNAUTHORIZED); + } + + Ok(next.run(request).await) +} + +pub async fn admin_handler() -> &'static str { + "Hello World" +} diff --git a/src/handlers/frontend.rs b/src/handlers/frontend.rs new file mode 100644 index 0000000..f4b7c6c --- /dev/null +++ b/src/handlers/frontend.rs @@ -0,0 +1,37 @@ +use axum::response::IntoResponse; +use maud::{html, Markup, DOCTYPE}; + +use crate::error::AppError; + +pub async fn home() -> Result<impl IntoResponse, AppError> { + Ok(html!({ + (head("Home")) + body class="bg-[#eae3d2] text-[#333] dark:bg-[#333] dark:text-[#eae3d2] font-mono text-base tracking-wide" { + (header_with_navbar()) + } + })) +} + +fn header_with_navbar() -> Markup { + html!({ + header { + navbar class="p-3 text-sm flex flex-row flex-wrap content-center justify-around decoration-purple-500 shadow" { + a class="hover:underline" href="/" { "Home" } + a class="hover:underline" href="/" { "Stories" } + a class="hover:underline" href="/" { "Tools" } + a class="hover:underline" href="/" { "Games" } + } + } + }) +} + +fn head(page_title: &str) -> Markup { + html! { + head { + (DOCTYPE) + meta charset="utf-8"; + link rel="stylesheet" type="text/css" href="/static/styles.css"; + title { (page_title) } + } + } +} diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs new file mode 100644 index 0000000..d69f590 --- /dev/null +++ b/src/handlers/mod.rs @@ -0,0 +1,21 @@ +use axum::extract::DefaultBodyLimit; +use axum::middleware::{self}; +use axum::routing::get; +use axum::Router; +use sqlx::SqlitePool; +use tower_http::services::ServeDir; + +use admin::{admin_handler, admin_middleware}; +use frontend::home; + +mod admin; +mod frontend; + +pub async fn router(pool: SqlitePool) -> Router { + Router::new() + .route("/admin", get(admin_handler)) + .layer(middleware::from_fn(admin_middleware)) + .route("/", get(home)) + .nest_service("/static", ServeDir::new("src/static")) + .layer(DefaultBodyLimit::max(10000)) +} |
