diff --git a/src/activity_pub/webfinger.rs b/src/activity_pub/webfinger.rs index 0780cd79..00754dbd 100644 --- a/src/activity_pub/webfinger.rs +++ b/src/activity_pub/webfinger.rs @@ -6,7 +6,7 @@ pub trait Webfinger { fn webfinger_aliases(&self, conn: &PgConnection) -> Vec; fn webfinger_links(&self, conn: &PgConnection) -> Vec>; - fn webfinger_json(&self, conn: &PgConnection) -> serde_json::Value { + fn webfinger(&self, conn: &PgConnection) -> String { json!({ "subject": self.webfinger_subject(conn), "aliases": self.webfinger_aliases(conn), @@ -17,34 +17,6 @@ pub trait Webfinger { } serde_json::Value::Object(link_obj) }).collect::>() - }) - } - - fn webfinger_xml(&self, conn: &PgConnection) -> String { - format!(r#" - - - {subject} - {aliases} - {links} - - "#, - subject = self.webfinger_subject(conn), - aliases = self.webfinger_aliases(conn).into_iter().map(|a| { - format!("{a}", a = a) - }).collect::>().join("\n"), - links = self.webfinger_links(conn).into_iter().map(|l| { - format!("", l.into_iter().map(|prop| { - format!("{}=\"{}\"", prop.0, prop.1) - }).collect::>().join(" ")) - }).collect::>().join("\n") - ) - } - - fn webfinger(&self, format: &'static str, conn: &PgConnection) -> String { - match format { - "json" => self.webfinger_json(conn).to_string(), - _ => self.webfinger_xml(conn) - } + }).to_string() } } diff --git a/src/main.rs b/src/main.rs index 490083a6..e7bdb638 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,8 +54,7 @@ fn main() { rocket::ignite() .mount("/", routes![ routes::well_known::host_meta, - routes::well_known::webfinger_json, - routes::well_known::webfinger_xml, + routes::well_known::webfinger, routes::instance::configure, routes::instance::post_config, diff --git a/src/routes/well_known.rs b/src/routes/well_known.rs index 5668631f..e8f6e3ab 100644 --- a/src/routes/well_known.rs +++ b/src/routes/well_known.rs @@ -1,3 +1,6 @@ +use rocket::http::ContentType; +use rocket::response::Content; + use activity_pub::webfinger::Webfinger; use db_conn::DbConn; use models::blogs::Blog; @@ -20,17 +23,8 @@ struct WebfingerQuery { resource: String } -#[get("/.well-known/webfinger?", format = "application/jrd+json")] -fn webfinger_json(query: WebfingerQuery, conn: DbConn) -> Result { - webfinger(query, conn, "json") -} - -#[get("/.well-known/webfinger?", format = "application/xrd+xml")] -fn webfinger_xml(query: WebfingerQuery, conn: DbConn) -> Result { - webfinger(query, conn, "xml") -} - -fn webfinger(query: WebfingerQuery, conn: DbConn, format: &'static str) -> Result { +#[get("/.well-known/webfinger?")] +fn webfinger(query: WebfingerQuery, conn: DbConn) -> Content> { let mut parsed_query = query.resource.split(":"); println!("{:?}", parsed_query.clone().collect::>()); let res_type = parsed_query.next().unwrap(); @@ -43,17 +37,18 @@ fn webfinger(query: WebfingerQuery, conn: DbConn, format: &'static str) -> Resul let domain = Instance::get_local(&*conn).unwrap().public_domain; if res_dom == domain { - match User::find_by_name(&*conn, String::from(user)) { - Some(usr) => Ok(usr.webfinger(format, &*conn)), + let res = match User::find_by_name(&*conn, String::from(user)) { + Some(usr) => Ok(usr.webfinger(&*conn)), None => match Blog::find_by_actor_id(&*conn, String::from(user)) { - Some(blog) => Ok(blog.webfinger(format, &*conn)), + Some(blog) => Ok(blog.webfinger(&*conn)), None => Err("Requested actor not found") } - } + }; + Content(ContentType::new("application", "jrd+json"), res) } else { - Err("Invalid instance") + Content(ContentType::new("text", "plain"), Err("Invalid instance")) } } else { - Err("Invalid resource type. Only acct is supported") + Content(ContentType::new("text", "plain"), Err("Invalid resource type. Only acct is supported")) } }