use models::instance::Instance;
use db_conn::DbConn;
use models::users::User;
use models::blogs::Blog;
use rocket_contrib::Json;
use activity_pub::webfinger::Webfinger;
#[get("/.well-known/host-meta", format = "application/xml")]
fn host_meta(conn: DbConn) -> String {
let domain = Instance::get_local(&*conn).unwrap().public_domain;
format!(r#"
"#, domain = domain)
}
#[derive(FromForm)]
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 {
let mut parsed_query = query.resource.split(":");
println!("{:?}", parsed_query.clone().collect::>());
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();
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)),
None => match Blog::find_by_actor_id(&*conn, String::from(user)) {
Some(blog) => Ok(blog.webfinger(format, &*conn)),
None => Err("Requested actor not found")
}
}
} else {
Err("Invalid instance")
}
} else {
Err("Invalid resource type. Only acct is supported")
}
}