From f27b2e13ebc57f44e40a50ec618db173f073edb9 Mon Sep 17 00:00:00 2001 From: silverpill Date: Sat, 18 Mar 2023 13:29:03 +0000 Subject: [PATCH] Add webclient redirection rule for /@username routes --- CHANGELOG.md | 1 + src/main.rs | 1 + src/web_client/views.rs | 25 ++++++++++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18e2b40..32bf070 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Make webclient-to-object redirects work for remote profiles and posts. +- Added webclient redirection rule for `/@username` routes. ## [1.17.0] - 2023-03-15 diff --git a/src/main.rs b/src/main.rs index c92592b..188bc6b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -175,6 +175,7 @@ async fn main() -> std::io::Result<()> { .service(nodeinfo::get_nodeinfo_2_0) .service(nodeinfo::get_nodeinfo_2_1) .service(web_client::profile_page_redirect()) + .service(web_client::profile_acct_page_redirect()) .service(web_client::post_page_redirect()) .service( // Fallback for well-known paths diff --git a/src/web_client/views.rs b/src/web_client/views.rs index af0b9ea..a95ef29 100644 --- a/src/web_client/views.rs +++ b/src/web_client/views.rs @@ -20,7 +20,7 @@ use crate::database::{get_database_client, DbPool}; use crate::errors::HttpError; use crate::models::{ posts::queries::get_post_by_id, - profiles::queries::get_profile_by_id, + profiles::queries::{get_profile_by_acct, get_profile_by_id}, }; pub fn static_service(web_client_dir: &Path) -> Files { @@ -44,6 +44,7 @@ pub fn static_service(web_client_dir: &Path) -> Files { })) } +// DEPRECATED async fn profile_page_redirect_view( config: web::Data, db_pool: web::Data, @@ -66,6 +67,28 @@ pub fn profile_page_redirect() -> Resource { .route(web::get().to(profile_page_redirect_view)) } +async fn profile_acct_page_redirect_view( + config: web::Data, + db_pool: web::Data, + acct: web::Path, +) -> Result { + let db_client = &**get_database_client(&db_pool).await?; + let profile = get_profile_by_acct(db_client, &acct).await?; + let actor_id = profile.actor_id(&config.instance_url()); + let response = HttpResponse::Found() + .append_header(("Location", actor_id)) + .finish(); + Ok(response) +} + +pub fn profile_acct_page_redirect() -> Resource { + web::resource("/@{acct}") + .guard(guard::fn_guard(|ctx| { + is_activitypub_request(ctx.head().headers()) + })) + .route(web::get().to(profile_acct_page_redirect_view)) +} + async fn post_page_redirect_view( config: web::Data, db_pool: web::Data,