2020-03-20 00:55:11 +00:00
|
|
|
use crate::{
|
|
|
|
config::{Config, UrlKind},
|
2020-03-23 22:17:53 +00:00
|
|
|
data::State,
|
2023-09-09 20:46:22 +00:00
|
|
|
future::LocalBoxFuture,
|
2020-03-20 00:55:11 +00:00
|
|
|
};
|
2020-03-16 03:36:46 +00:00
|
|
|
use actix_web::web::Data;
|
2020-04-21 19:12:10 +00:00
|
|
|
use actix_webfinger::{Resolver, Webfinger};
|
2020-03-16 03:36:46 +00:00
|
|
|
use rsa_magic_public_key::AsMagicPublicKey;
|
|
|
|
|
2021-02-10 04:17:20 +00:00
|
|
|
pub(crate) struct RelayResolver;
|
2020-03-16 03:36:46 +00:00
|
|
|
|
|
|
|
#[derive(Clone, Debug, thiserror::Error)]
|
|
|
|
#[error("Error resolving webfinger data")]
|
2021-02-10 04:17:20 +00:00
|
|
|
pub(crate) struct RelayError;
|
2020-03-16 03:36:46 +00:00
|
|
|
|
2020-04-21 19:12:10 +00:00
|
|
|
impl Resolver for RelayResolver {
|
|
|
|
type State = (Data<State>, Data<Config>);
|
2020-03-16 03:36:46 +00:00
|
|
|
type Error = RelayError;
|
|
|
|
|
|
|
|
fn find(
|
2021-11-23 18:43:52 +00:00
|
|
|
scheme: Option<&str>,
|
2020-03-16 03:36:46 +00:00
|
|
|
account: &str,
|
|
|
|
domain: &str,
|
2020-04-21 19:12:10 +00:00
|
|
|
(state, config): Self::State,
|
2021-09-18 17:55:39 +00:00
|
|
|
) -> LocalBoxFuture<'static, Result<Option<Webfinger>, Self::Error>> {
|
2020-03-16 03:36:46 +00:00
|
|
|
let domain = domain.to_owned();
|
|
|
|
let account = account.to_owned();
|
2021-11-23 18:43:52 +00:00
|
|
|
let scheme = scheme.map(|scheme| scheme.to_owned());
|
2020-03-16 03:36:46 +00:00
|
|
|
|
|
|
|
let fut = async move {
|
2021-11-23 18:43:52 +00:00
|
|
|
if let Some(scheme) = scheme {
|
|
|
|
if scheme != "acct:" {
|
|
|
|
return Ok(None);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-20 00:55:11 +00:00
|
|
|
if domain != config.hostname() {
|
2020-03-16 03:36:46 +00:00
|
|
|
return Ok(None);
|
|
|
|
}
|
|
|
|
|
|
|
|
if account != "relay" {
|
|
|
|
return Ok(None);
|
|
|
|
}
|
|
|
|
|
2020-06-03 17:37:36 +00:00
|
|
|
let mut wf = Webfinger::new(config.generate_resource().as_str());
|
|
|
|
wf.add_alias(config.generate_url(UrlKind::Actor).as_str())
|
|
|
|
.add_activitypub(config.generate_url(UrlKind::Actor).as_str())
|
2020-04-21 19:12:10 +00:00
|
|
|
.add_magic_public_key(&state.public_key.as_magic_public_key());
|
2020-03-16 03:36:46 +00:00
|
|
|
|
|
|
|
Ok(Some(wf))
|
|
|
|
};
|
|
|
|
|
|
|
|
Box::pin(fut)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl actix_web::error::ResponseError for RelayError {}
|