Plume/src/routes/well_known.rs

62 lines
2.1 KiB
Rust
Raw Normal View History

2018-04-24 13:38:43 +02:00
use rocket::http::ContentType;
use rocket::response::Content;
use BASE_URL;
2018-05-19 09:39:59 +02:00
use activity_pub::{ap_url, webfinger::Webfinger};
2018-04-24 10:35:45 +02:00
use db_conn::DbConn;
2018-05-19 09:39:59 +02:00
use models::{blogs::Blog, users::User};
2018-04-24 10:35:45 +02:00
2018-06-10 21:33:42 +02:00
#[get("/.well-known/nodeinfo")]
fn nodeinfo() -> Content<String> {
Content(ContentType::new("application", "jrd+json"), json!({
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": ap_url(format!("{domain}/nodeinfo", domain = BASE_URL.as_str()))
}
]
}).to_string())
}
2018-04-24 10:35:45 +02:00
#[get("/.well-known/host-meta", format = "application/xml")]
fn host_meta() -> String {
2018-04-24 10:35:45 +02:00
format!(r#"
<?xml version="1.0"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Link rel="lrdd" type="application/xrd+xml" template="{url}"/>
2018-04-24 10:35:45 +02:00
</XRD>
"#, url = ap_url(format!("{domain}/.well-known/webfinger?resource={{uri}}", domain = BASE_URL.as_str())))
2018-04-24 10:35:45 +02:00
}
#[derive(FromForm)]
struct WebfingerQuery {
resource: String
}
2018-04-24 13:38:43 +02:00
#[get("/.well-known/webfinger?<query>")]
fn webfinger(query: WebfingerQuery, conn: DbConn) -> Content<Result<String, &'static str>> {
let mut parsed_query = query.resource.splitn(2, ":");
2018-04-24 10:35:45 +02:00
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() {
2018-05-01 13:48:19 +02:00
let res = match User::find_local(&*conn, String::from(user)) {
2018-04-24 13:38:43 +02:00
Some(usr) => Ok(usr.webfinger(&*conn)),
None => match Blog::find_local(&*conn, String::from(user)) {
2018-04-24 13:38:43 +02:00
Some(blog) => Ok(blog.webfinger(&*conn)),
2018-04-24 10:35:45 +02:00
None => Err("Requested actor not found")
}
2018-04-24 13:38:43 +02:00
};
Content(ContentType::new("application", "jrd+json"), res)
2018-04-24 10:35:45 +02:00
} else {
2018-04-24 13:38:43 +02:00
Content(ContentType::new("text", "plain"), Err("Invalid instance"))
2018-04-24 10:35:45 +02:00
}
} else {
2018-04-24 13:38:43 +02:00
Content(ContentType::new("text", "plain"), Err("Invalid resource type. Only acct is supported"))
2018-04-24 10:35:45 +02:00
}
}