53 lines
1.9 KiB
Rust
53 lines
1.9 KiB
Rust
|
use axum::extract::Query;
|
||
|
use axum::http::StatusCode;
|
||
|
use axum::Json;
|
||
|
use magnetar_core::web_model::content_type::{ContentActivityStreams, ContentHtml};
|
||
|
use magnetar_core::web_model::rel::{RelOStatusSubscribe, RelSelf, RelWebFingerProfilePage};
|
||
|
use magnetar_core::web_model::webfinger::{Acct, WebFinger, WebFingerRel, WebFingerSubject};
|
||
|
use serde::Deserialize;
|
||
|
|
||
|
#[derive(Deserialize)]
|
||
|
pub struct WebFingerQuery {
|
||
|
resource: WebFingerSubject,
|
||
|
rel: Option<Vec<String>>,
|
||
|
}
|
||
|
|
||
|
pub async fn handle_webfinger(
|
||
|
Query(WebFingerQuery { resource, rel, .. }): Query<WebFingerQuery>,
|
||
|
) -> Result<Json<WebFinger>, StatusCode> {
|
||
|
let resource = match resource {
|
||
|
acct @ WebFingerSubject::Acct(_) => acct,
|
||
|
// Leniently re-add the acct
|
||
|
WebFingerSubject::Url(url) if url.contains('@') && !url.starts_with("http") => {
|
||
|
WebFingerSubject::Acct(Acct::new(url.into()))
|
||
|
}
|
||
|
other => other,
|
||
|
};
|
||
|
|
||
|
println!("{resource:?}");
|
||
|
|
||
|
Ok(Json(WebFinger {
|
||
|
subject: WebFingerSubject::Acct("natty@tech.lgbt".into()),
|
||
|
aliases: vec![
|
||
|
WebFingerSubject::Url("https://tech.lgbt/@natty".to_owned()),
|
||
|
WebFingerSubject::Url("https://tech.lgbt/users/natty".to_owned()),
|
||
|
],
|
||
|
links: vec![
|
||
|
WebFingerRel::RelWebFingerProfilePage {
|
||
|
rel: RelWebFingerProfilePage,
|
||
|
content_type: ContentHtml,
|
||
|
href: "https://tech.lgbt/@natty".to_owned(),
|
||
|
},
|
||
|
WebFingerRel::RelSelf {
|
||
|
rel: RelSelf,
|
||
|
content_type: ContentActivityStreams,
|
||
|
href: "https://tech.lgbt/users/natty".to_owned(),
|
||
|
},
|
||
|
WebFingerRel::RelOStatusSubscribe {
|
||
|
rel: RelOStatusSubscribe,
|
||
|
template: "https://tech.lgbt/authorize_interaction?uri={uri}".to_owned(),
|
||
|
},
|
||
|
],
|
||
|
}))
|
||
|
}
|