Compare commits
No commits in common. "8a1afadea046f9dc7b2eb56456777fbfc64ef857" and "e11b9728269575d0bfc5a3029ff742987cad882d" have entirely different histories.
8a1afadea0
...
e11b972826
2 changed files with 2 additions and 39 deletions
|
@ -7,7 +7,7 @@ pub mod following;
|
|||
use axum::extract::{Path, Query, State};
|
||||
use sea_orm::{ColumnTrait, EntityTrait, QueryFilter, QuerySelect, SelectColumns};
|
||||
|
||||
use apb::{ActorMut, Node};
|
||||
use apb::{ActorMut, Node, ObjectMut};
|
||||
use crate::{errors::UpubError, model::{self, user}, server::{auth::AuthIdentity, fetcher::Fetcher, Context}, url};
|
||||
|
||||
use super::{jsonld::LD, JsonLD, TryFetch};
|
||||
|
@ -19,13 +19,8 @@ pub async fn view(
|
|||
Path(id): Path<String>,
|
||||
Query(query): Query<TryFetch>,
|
||||
) -> crate::Result<JsonLD<serde_json::Value>> {
|
||||
let mut uid = ctx.uri("users", id.clone());
|
||||
let uid = ctx.uri("users", id.clone());
|
||||
if auth.is_local() && query.fetch && !ctx.is_local(&uid) {
|
||||
if id.starts_with('@') {
|
||||
if let Some((user, host)) = id.replacen('@', "", 1).split_once('@') {
|
||||
uid = ctx.webfinger(user, host).await?;
|
||||
}
|
||||
}
|
||||
ctx.fetch_user(&uid).await?;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,8 +11,6 @@ use super::{auth::HttpSignature, Context};
|
|||
|
||||
#[axum::async_trait]
|
||||
pub trait Fetcher {
|
||||
async fn webfinger(&self, user: &str, host: &str) -> crate::Result<String>;
|
||||
|
||||
async fn fetch_user(&self, id: &str) -> crate::Result<model::user::Model>;
|
||||
async fn pull_user(&self, id: &str) -> crate::Result<model::user::Model>;
|
||||
|
||||
|
@ -83,36 +81,6 @@ pub trait Fetcher {
|
|||
|
||||
#[axum::async_trait]
|
||||
impl Fetcher for Context {
|
||||
async fn webfinger(&self, user: &str, host: &str) -> crate::Result<String> {
|
||||
let subject = format!("acct:{user}@{host}");
|
||||
let webfinger_uri = format!("https://{host}/.well-known/webfinger?resource={subject}");
|
||||
let resource = Self::request(
|
||||
Method::GET, &webfinger_uri, None, &self.base(), &self.app().private_key, self.domain(),
|
||||
)
|
||||
.await?
|
||||
.json::<jrd::JsonResourceDescriptor>()
|
||||
.await?;
|
||||
|
||||
if resource.subject != subject {
|
||||
return Err(UpubError::unprocessable());
|
||||
}
|
||||
|
||||
for link in resource.links {
|
||||
if link.rel == "self" {
|
||||
if let Some(href) = link.href {
|
||||
return Ok(href);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(alias) = resource.aliases.into_iter().next() {
|
||||
return Ok(alias);
|
||||
}
|
||||
|
||||
Err(UpubError::not_found())
|
||||
}
|
||||
|
||||
|
||||
async fn fetch_user(&self, id: &str) -> crate::Result<model::user::Model> {
|
||||
if let Some(x) = model::user::Entity::find_by_id(id).one(self.db()).await? {
|
||||
return Ok(x); // already in db, easy
|
||||
|
|
Loading…
Reference in a new issue