Replace fetch_profile() function with perform_webfinger_query()
This commit is contained in:
parent
d658c3e802
commit
2a626a1859
2 changed files with 44 additions and 44 deletions
|
@ -83,6 +83,46 @@ pub async fn fetch_file(
|
||||||
Ok((file_name, media_type))
|
Ok((file_name, media_type))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn perform_webfinger_query(
|
||||||
|
instance: &Instance,
|
||||||
|
actor_address: &ActorAddress,
|
||||||
|
) -> Result<String, FetchError> {
|
||||||
|
let webfinger_account_uri = format!("acct:{}", actor_address.to_string());
|
||||||
|
// TOOD: support http
|
||||||
|
let webfinger_url = format!(
|
||||||
|
"https://{}/.well-known/webfinger",
|
||||||
|
actor_address.instance,
|
||||||
|
);
|
||||||
|
let client = reqwest::Client::new();
|
||||||
|
let mut request_builder = client.get(&webfinger_url);
|
||||||
|
if !instance.is_private {
|
||||||
|
// Public instance should set User-Agent header
|
||||||
|
request_builder = request_builder
|
||||||
|
.header(reqwest::header::USER_AGENT, instance.agent());
|
||||||
|
};
|
||||||
|
let webfinger_data = request_builder
|
||||||
|
.query(&[("resource", webfinger_account_uri)])
|
||||||
|
.send().await?
|
||||||
|
.error_for_status()?
|
||||||
|
.text().await?;
|
||||||
|
let jrd: JsonResourceDescriptor = serde_json::from_str(&webfinger_data)?;
|
||||||
|
let link = jrd.links.into_iter()
|
||||||
|
.find(|link| link.rel == "self")
|
||||||
|
.ok_or(FetchError::OtherError("self link not found"))?;
|
||||||
|
let actor_url = link.href
|
||||||
|
.ok_or(FetchError::OtherError("account href not found"))?;
|
||||||
|
Ok(actor_url)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn fetch_actor(
|
||||||
|
instance: &Instance,
|
||||||
|
actor_url: &str,
|
||||||
|
) -> Result<Actor, FetchError> {
|
||||||
|
let actor_json = send_request(instance, actor_url, &[]).await?;
|
||||||
|
let actor = serde_json::from_str(&actor_json)?;
|
||||||
|
Ok(actor)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn fetch_avatar_and_banner(
|
pub async fn fetch_avatar_and_banner(
|
||||||
actor: &Actor,
|
actor: &Actor,
|
||||||
media_dir: &Path,
|
media_dir: &Path,
|
||||||
|
@ -110,47 +150,6 @@ pub async fn fetch_avatar_and_banner(
|
||||||
Ok((avatar, banner))
|
Ok((avatar, banner))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn fetch_profile(
|
|
||||||
instance: &Instance,
|
|
||||||
actor_address: &ActorAddress,
|
|
||||||
media_dir: &Path,
|
|
||||||
) -> Result<ProfileCreateData, FetchError> {
|
|
||||||
let webfinger_account_uri = format!("acct:{}", actor_address.to_string());
|
|
||||||
// TOOD: support http
|
|
||||||
let webfinger_url = format!(
|
|
||||||
"https://{}/.well-known/webfinger",
|
|
||||||
actor_address.instance,
|
|
||||||
);
|
|
||||||
let client = reqwest::Client::new();
|
|
||||||
let mut request_builder = client.get(&webfinger_url);
|
|
||||||
if !instance.is_private {
|
|
||||||
// Public instance should set User-Agent header
|
|
||||||
request_builder = request_builder
|
|
||||||
.header(reqwest::header::USER_AGENT, instance.agent());
|
|
||||||
};
|
|
||||||
let webfinger_data = request_builder
|
|
||||||
.query(&[("resource", webfinger_account_uri)])
|
|
||||||
.send().await?
|
|
||||||
.error_for_status()?
|
|
||||||
.text().await?;
|
|
||||||
let jrd: JsonResourceDescriptor = serde_json::from_str(&webfinger_data)?;
|
|
||||||
let link = jrd.links.iter()
|
|
||||||
.find(|link| link.rel == "self")
|
|
||||||
.ok_or(FetchError::OtherError("self link not found"))?;
|
|
||||||
let actor_url = link.href.as_ref()
|
|
||||||
.ok_or(FetchError::OtherError("account href not found"))?;
|
|
||||||
fetch_profile_by_actor_id(instance, actor_url, media_dir).await
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn fetch_actor(
|
|
||||||
instance: &Instance,
|
|
||||||
actor_url: &str,
|
|
||||||
) -> Result<Actor, FetchError> {
|
|
||||||
let actor_json = send_request(instance, actor_url, &[]).await?;
|
|
||||||
let actor = serde_json::from_str(&actor_json)?;
|
|
||||||
Ok(actor)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn fetch_profile_by_actor_id(
|
pub async fn fetch_profile_by_actor_id(
|
||||||
instance: &Instance,
|
instance: &Instance,
|
||||||
actor_url: &str,
|
actor_url: &str,
|
||||||
|
|
|
@ -19,8 +19,8 @@ use crate::models::profiles::queries::{
|
||||||
use crate::models::profiles::types::DbActorProfile;
|
use crate::models::profiles::types::DbActorProfile;
|
||||||
use super::fetchers::{
|
use super::fetchers::{
|
||||||
fetch_object,
|
fetch_object,
|
||||||
fetch_profile,
|
|
||||||
fetch_profile_by_actor_id,
|
fetch_profile_by_actor_id,
|
||||||
|
perform_webfinger_query,
|
||||||
FetchError,
|
FetchError,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -92,9 +92,10 @@ pub async fn import_profile_by_actor_address(
|
||||||
if actor_address.instance == instance.host() {
|
if actor_address.instance == instance.host() {
|
||||||
return Err(ImportError::LocalObject);
|
return Err(ImportError::LocalObject);
|
||||||
};
|
};
|
||||||
let mut profile_data = fetch_profile(
|
let actor_id = perform_webfinger_query(instance, actor_address).await?;
|
||||||
|
let mut profile_data = fetch_profile_by_actor_id(
|
||||||
instance,
|
instance,
|
||||||
actor_address,
|
&actor_id,
|
||||||
media_dir,
|
media_dir,
|
||||||
).await?;
|
).await?;
|
||||||
if profile_data.acct != actor_address.acct() {
|
if profile_data.acct != actor_address.acct() {
|
||||||
|
|
Loading…
Reference in a new issue