From eec7103910ad3237c3aa355c18362fc15d050978 Mon Sep 17 00:00:00 2001 From: Ginger Date: Wed, 4 Mar 2026 11:18:07 -0500 Subject: [PATCH] feat: Implement dedicated 404 page for routes under `/_continuwuity/` --- src/router/router.rs | 9 +++++++-- src/web/mod.rs | 6 ++++-- src/web/pages/index.rs | 8 ++------ src/web/pages/password_reset.rs | 4 ++-- src/web/pages/resources.rs | 2 +- src/web/pages/templates/error.html.j2 | 9 ++++++++- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/router/router.rs b/src/router/router.rs index fdaf9126..81e380dd 100644 --- a/src/router/router.rs +++ b/src/router/router.rs @@ -1,6 +1,10 @@ use std::sync::Arc; -use axum::{Router, response::IntoResponse}; +use axum::{ + Router, + response::{IntoResponse, Redirect}, + routing::get, +}; use conduwuit::Error; use conduwuit_service::{Services, state, state::Guard}; use http::{StatusCode, Uri}; @@ -10,7 +14,8 @@ pub(crate) fn build(services: &Arc) -> (Router, Guard) { let router = Router::::new(); let (state, guard) = state::create(services.clone()); let router = conduwuit_api::router::build(router, &services.server) - .merge(conduwuit_web::build()) + .nest("/_continuwuity/", conduwuit_web::build()) + .route("/", get(async || Redirect::permanent("/_continuwuity/"))) .fallback(not_found) .with_state(state); diff --git a/src/web/mod.rs b/src/web/mod.rs index b0987d9a..5e0e21f2 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -20,6 +20,8 @@ enum WebError { ValidationError(#[from] validator::ValidationErrors), #[error("Bad request: {0}")] BadRequest(String), + #[error("This page does not exist.")] + NotFound, #[error("Internal server error: {0}")] InternalError(#[from] conduwuit_core::Error), } @@ -28,14 +30,13 @@ impl IntoResponse for WebError { fn into_response(self) -> Response { #[derive(Debug, Template)] #[template(path = "error.html.j2")] - #[allow(unused)] struct Error { error: WebError, status: StatusCode, } - let status = match &self { | Self::ValidationError(_) | Self::BadRequest(_) => StatusCode::BAD_REQUEST, + | Self::NotFound => StatusCode::NOT_FOUND, | _ => StatusCode::INTERNAL_SERVER_ERROR, }; @@ -57,6 +58,7 @@ pub fn build() -> Router { .merge(index::build()) .merge(resources::build()) .merge(password_reset::build()) + .fallback(async || WebError::NotFound) .layer(SetResponseHeaderLayer::if_not_present( header::CONTENT_SECURITY_POLICY, HeaderValue::from_static("default-src 'self'; img-src 'self' data:;"), diff --git a/src/web/pages/index.rs b/src/web/pages/index.rs index 161301a2..2935aa46 100644 --- a/src/web/pages/index.rs +++ b/src/web/pages/index.rs @@ -2,17 +2,13 @@ use askama::Template; use axum::{ Router, extract::State, - response::{Html, IntoResponse, Redirect}, + response::{Html, IntoResponse}, routing::get, }; use crate::WebError; -pub(crate) fn build() -> Router { - Router::new() - .route("/", get(async || Redirect::permanent("/_continuwuity/"))) - .route("/_continuwuity/", get(index_handler)) -} +pub(crate) fn build() -> Router { Router::new().route("/", get(index_handler)) } async fn index_handler( State(services): State, diff --git a/src/web/pages/password_reset.rs b/src/web/pages/password_reset.rs index 866e5f55..dc2f25f2 100644 --- a/src/web/pages/password_reset.rs +++ b/src/web/pages/password_reset.rs @@ -6,7 +6,6 @@ use axum::{ response::{Html, IntoResponse, Response}, routing::get, }; -use conduwuit_service::password_reset::PASSWORD_RESET_PATH; use serde::Deserialize; use validator::Validate; @@ -54,7 +53,8 @@ form! { } pub(crate) fn build() -> Router { - Router::new().route(PASSWORD_RESET_PATH, get(get_password_reset).post(post_password_reset)) + Router::new() + .route("/account/reset_password", get(get_password_reset).post(post_password_reset)) } async fn password_reset_form( diff --git a/src/web/pages/resources.rs b/src/web/pages/resources.rs index b984bb57..e959dcfe 100644 --- a/src/web/pages/resources.rs +++ b/src/web/pages/resources.rs @@ -2,7 +2,7 @@ use axum::Router; pub(crate) fn build() -> Router { Router::new().nest( - "/_continuwuity/resources/", + "/resources/", #[allow(unused_qualifications)] memory_serve::load!().index_file(None).into_router(), ) diff --git a/src/web/pages/templates/error.html.j2 b/src/web/pages/templates/error.html.j2 index 63083972..5bc34b5b 100644 --- a/src/web/pages/templates/error.html.j2 +++ b/src/web/pages/templates/error.html.j2 @@ -21,7 +21,14 @@  \二つ
-

Request error(︶^︶)

+

+ {% if status == StatusCode::NOT_FOUND %} + Not found + {% else %} + Request error + {% endif %} + (︶^︶) +

{{ error }}