lemmy/server/src/routes/webfinger.rs

85 lines
2.2 KiB
Rust
Raw Normal View History

use super::*;
2019-12-18 00:59:47 +00:00
use crate::db::community::Community;
#[derive(Deserialize)]
pub struct Params {
resource: String,
}
pub fn config(cfg: &mut web::ServiceConfig) {
2020-03-18 21:09:00 +00:00
if Settings::get().federation.enabled {
cfg.route(
".well-known/webfinger",
web::get().to(get_webfinger_response),
);
}
}
2019-12-26 19:48:13 +00:00
lazy_static! {
static ref WEBFINGER_COMMUNITY_REGEX: Regex = Regex::new(&format!(
"^group:([a-z0-9_]{{3, 20}})@{}$",
Settings::get().hostname
))
.unwrap();
}
2019-12-18 00:59:47 +00:00
/// Responds to webfinger requests of the following format. There isn't any real documentation for
/// this, but it described in this blog post:
/// https://mastodon.social/.well-known/webfinger?resource=acct:gargron@mastodon.social
///
/// You can also view the webfinger response that Mastodon sends:
/// https://radical.town/.well-known/webfinger?resource=acct:felix@radical.town
async fn get_webfinger_response(
info: Query<Params>,
2020-04-24 14:04:36 +00:00
db: DbPoolParam,
2020-04-21 20:40:03 +00:00
) -> Result<HttpResponse, Error> {
let res = web::block(move || {
let conn = db.get()?;
2019-12-18 00:59:47 +00:00
let regex_parsed = WEBFINGER_COMMUNITY_REGEX
.captures(&info.resource)
2020-03-19 18:01:01 +00:00
.map(|c| c.get(1))
.flatten();
let community_name = match regex_parsed {
Some(c) => c.as_str(),
None => return Err(format_err!("not_found")),
};
2019-12-18 00:59:47 +00:00
// Make sure the requested community exists.
2020-04-24 14:04:36 +00:00
let community = match Community::read_from_name(&conn, &community_name) {
Ok(o) => o,
Err(_) => return Err(format_err!("not_found")),
};
2019-12-18 00:59:47 +00:00
let community_url = community.get_url();
Ok(json!({
2019-12-18 00:59:47 +00:00
"subject": info.resource,
"aliases": [
community_url,
],
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": community.get_url(),
2019-12-18 00:59:47 +00:00
},
{
"rel": "self",
"type": "application/activity+json",
2019-12-26 19:48:13 +00:00
"href": community_url
2019-12-18 00:59:47 +00:00
}
// TODO: this also needs to return the subscribe link once that's implemented
//{
// "rel": "http://ostatus.org/schema/1.0/subscribe",
// "template": "https://my_instance.com/authorize_interaction?uri={uri}"
//}
]
}))
})
.await
.map(|json| HttpResponse::Ok().json(json))
2020-04-21 20:48:54 +00:00
.map_err(ErrorBadRequest)?;
Ok(res)
2019-12-18 00:59:47 +00:00
}