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 object;
|
||||||
pub mod request;
|
pub mod request;
|
||||||
pub mod sign;
|
pub mod sign;
|
||||||
pub mod webfinger;
|
|
||||||
|
|
||||||
pub type ActivityPub = Content<Json<serde_json::Value>>;
|
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,
|
ap_url, ActivityStream, Id, IntoId,
|
||||||
actor::{ActorType, Actor as APActor},
|
actor::{ActorType, Actor as APActor},
|
||||||
inbox::{Inbox, WithInbox},
|
inbox::{Inbox, WithInbox},
|
||||||
sign::{Signer, gen_keypair},
|
sign::{Signer, gen_keypair}
|
||||||
webfinger::{resolve}
|
|
||||||
};
|
};
|
||||||
use db_conn::DbConn;
|
use db_conn::DbConn;
|
||||||
use models::{
|
use models::{
|
||||||
@ -140,9 +139,9 @@ impl User {
|
|||||||
|
|
||||||
fn fetch_from_webfinger(conn: &PgConnection, acct: String) -> Option<User> {
|
fn fetch_from_webfinger(conn: &PgConnection, acct: String) -> Option<User> {
|
||||||
match resolve(acct.clone()) {
|
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) => {
|
Err(details) => {
|
||||||
println!("{}", details);
|
println!("{:?}", details);
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user