Use the webfinger crate for fetching resources too
This commit is contained in:
parent
5415b70854
commit
78be09c47c
|
@ -17,7 +17,6 @@ pub mod inbox;
|
|||
pub mod object;
|
||||
pub mod request;
|
||||
pub mod sign;
|
||||
pub mod webfinger;
|
||||
|
||||
pub type ActivityPub = Content<Json<serde_json::Value>>;
|
||||
|
||||
|
|
|
@ -1,52 +0,0 @@
|
|||
use diesel::PgConnection;
|
||||
use reqwest::Client;
|
||||
use reqwest::{
|
||||
header::{Accept, qitem},
|
||||
mime::Mime
|
||||
};
|
||||
use serde_json;
|
||||
|
||||
use activity_pub::ap_url;
|
||||
|
||||
pub trait Webfinger {
|
||||
fn webfinger_subject(&self, conn: &PgConnection) -> String;
|
||||
fn webfinger_aliases(&self, conn: &PgConnection) -> Vec<String>;
|
||||
fn webfinger_links(&self, conn: &PgConnection) -> Vec<Vec<(String, String)>>;
|
||||
|
||||
fn webfinger(&self, conn: &PgConnection) -> String {
|
||||
json!({
|
||||
"subject": self.webfinger_subject(conn),
|
||||
"aliases": self.webfinger_aliases(conn),
|
||||
"links": self.webfinger_links(conn).into_iter().map(|link| {
|
||||
let mut link_obj = serde_json::Map::new();
|
||||
for (k, v) in link {
|
||||
link_obj.insert(k, serde_json::Value::String(v));
|
||||
}
|
||||
serde_json::Value::Object(link_obj)
|
||||
}).collect::<Vec<serde_json::Value>>()
|
||||
}).to_string()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn resolve(acct: String) -> Result<String, String> {
|
||||
let instance = acct.split("@").last().unwrap();
|
||||
let url = ap_url(format!("{}/.well-known/webfinger?resource=acct:{}", instance, acct));
|
||||
Client::new()
|
||||
.get(&url[..])
|
||||
.header(Accept(vec![qitem("application/jrd+json".parse::<Mime>().unwrap())]))
|
||||
.send()
|
||||
.map(|mut r| {
|
||||
let res = r.text().unwrap();
|
||||
let json: serde_json::Value = serde_json::from_str(&res[..]).unwrap();
|
||||
json["links"].as_array().unwrap()
|
||||
.into_iter()
|
||||
.find_map(|link| {
|
||||
if link["rel"].as_str().unwrap() == "self" && link["type"].as_str().unwrap() == "application/activity+json" {
|
||||
Some(String::from(link["href"].as_str().unwrap()))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}).unwrap()
|
||||
})
|
||||
.map_err(|e| format!("Error while fetchin WebFinger resource ({})", e))
|
||||
}
|
|
@ -31,8 +31,7 @@ use activity_pub::{
|
|||
ap_url, ActivityStream, Id, IntoId,
|
||||
actor::{ActorType, Actor as APActor},
|
||||
inbox::{Inbox, WithInbox},
|
||||
sign::{Signer, gen_keypair},
|
||||
webfinger::{resolve}
|
||||
sign::{Signer, gen_keypair}
|
||||
};
|
||||
use db_conn::DbConn;
|
||||
use models::{
|
||||
|
@ -140,9 +139,9 @@ impl User {
|
|||
|
||||
fn fetch_from_webfinger(conn: &PgConnection, acct: String) -> Option<User> {
|
||||
match resolve(acct.clone()) {
|
||||
Ok(url) => User::fetch_from_url(conn, url),
|
||||
Ok(wf) => wf.links.into_iter().find(|l| l.mime_type == Some(String::from("application/activity+json"))).and_then(|l| User::fetch_from_url(conn, l.href)),
|
||||
Err(details) => {
|
||||
println!("{}", details);
|
||||
println!("{:?}", details);
|
||||
None
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue