use rocket::http::ContentType; use rocket::response::Content; use BASE_URL; use activity_pub::{ap_url, webfinger::Webfinger}; use db_conn::DbConn; use models::{blogs::Blog, users::User}; #[get("/.well-known/host-meta", format = "application/xml")] fn host_meta() -> String { format!(r#" "#, url = ap_url(format!("{domain}/.well-known/webfinger?resource={{uri}}", domain = BASE_URL.as_str()))) } #[derive(FromForm)] struct WebfingerQuery { resource: String } #[get("/.well-known/webfinger?")] fn webfinger(query: WebfingerQuery, conn: DbConn) -> Content> { let mut parsed_query = query.resource.splitn(2, ":"); let res_type = parsed_query.next().unwrap(); let res = parsed_query.next().unwrap(); if res_type == "acct" { let mut parsed_res = res.split("@"); let user = parsed_res.next().unwrap(); let res_dom = parsed_res.next().unwrap(); if res_dom == BASE_URL.as_str() { let res = match User::find_local(&*conn, String::from(user)) { Some(usr) => Ok(usr.webfinger(&*conn)), None => match Blog::find_local(&*conn, String::from(user)) { Some(blog) => Ok(blog.webfinger(&*conn)), None => Err("Requested actor not found") } }; Content(ContentType::new("application", "jrd+json"), res) } else { Content(ContentType::new("text", "plain"), Err("Invalid instance")) } } else { Content(ContentType::new("text", "plain"), Err("Invalid resource type. Only acct is supported")) } }