From 692e4bff228b87c11ea5bf0855b0b1656f2a392e Mon Sep 17 00:00:00 2001 From: aprilthepink Date: Wed, 17 Jul 2024 14:21:32 +0200 Subject: [PATCH] fix: resolve webfinger correctly --- src/http.rs | 23 ++--------------------- src/lysand/conversion.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/http.rs b/src/http.rs index a597303..e4715fc 100644 --- a/src/http.rs +++ b/src/http.rs @@ -4,7 +4,7 @@ use crate::{ error::Error, lysand::{ self, - conversion::{db_user_from_url, receive_lysand_note}, + conversion::{db_user_from_url, local_db_user_from_name, receive_lysand_note}, }, objects::person::{DbUser, PersonAcceptedActivities}, utils::generate_user_id, @@ -107,26 +107,7 @@ pub async fn webfinger( data: Data, ) -> Result { let name = extract_webfinger_name(&query.resource, &data)?; - let db_user = data.read_user(name.clone()).await; - let user; - if db_user.is_ok() { - user = db_user.unwrap(); - } else { - let res = resolve("acct:".to_string() + name + "@" + &LYSAND_DOMAIN, true) - .await - .unwrap(); - user = db_user_from_url(Url::parse( - res.links - .get(0) - .clone() - .unwrap() - .href - .clone() - .unwrap() - .as_str(), - )?) - .await?; - } + let user = local_db_user_from_name(name.to_string()).await?; Ok(HttpResponse::Ok().json(build_webfinger_response( query.resource.clone(), generate_user_id(&API_DOMAIN, &user.id)?, diff --git a/src/lysand/conversion.rs b/src/lysand/conversion.rs index ca82c6d..e46fda8 100644 --- a/src/lysand/conversion.rs +++ b/src/lysand/conversion.rs @@ -4,6 +4,7 @@ use anyhow::{anyhow, Ok}; use async_recursion::async_recursion; use chrono::{DateTime, TimeZone, Utc}; use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set}; +use serde::{Deserialize, Serialize}; use time::OffsetDateTime; use url::Url; @@ -167,6 +168,32 @@ pub async fn db_post_from_url(url: Url) -> anyhow::Result } } +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ApiUser { + uri: Url, +} + +pub async fn local_db_user_from_name(name: String) -> anyhow::Result { + let user_res: Option = prelude::User::find() + .filter(entities::user::Column::Username.eq(name.clone())) + .filter(entities::user::Column::Local.eq(true)) + .one(DB.get().unwrap()) + .await?; + if let Some(user) = user_res { + Ok(user) + } else { + let client = request_client(); + let api_url = Url::parse(&format!( + "https://{}/api/v1/accounts/id?username={}", + LYSAND_DOMAIN.to_string(), + name + ))?; + let request = client.get(api_url).send().await?; + let user_json = request.json::().await?; + Ok(db_user_from_url(user_json.uri).await?) + } +} + pub async fn db_user_from_url(url: Url) -> anyhow::Result { print!("Fetching user from domain: {}", url.domain().unwrap()); if !url.domain().eq(&Some(LYSAND_DOMAIN.as_str()))