relay/src/middleware/webfinger.rs
asonix 206db2079f
All checks were successful
continuous-integration/drone/push Build is passing
Remove futures-util dependency
2023-09-09 16:46:22 -04:00

58 lines
1.6 KiB
Rust

use crate::{
config::{Config, UrlKind},
data::State,
future::LocalBoxFuture,
};
use actix_web::web::Data;
use actix_webfinger::{Resolver, Webfinger};
use rsa_magic_public_key::AsMagicPublicKey;
pub(crate) struct RelayResolver;
#[derive(Clone, Debug, thiserror::Error)]
#[error("Error resolving webfinger data")]
pub(crate) struct RelayError;
impl Resolver for RelayResolver {
type State = (Data<State>, Data<Config>);
type Error = RelayError;
fn find(
scheme: Option<&str>,
account: &str,
domain: &str,
(state, config): Self::State,
) -> LocalBoxFuture<'static, Result<Option<Webfinger>, Self::Error>> {
let domain = domain.to_owned();
let account = account.to_owned();
let scheme = scheme.map(|scheme| scheme.to_owned());
let fut = async move {
if let Some(scheme) = scheme {
if scheme != "acct:" {
return Ok(None);
}
}
if domain != config.hostname() {
return Ok(None);
}
if account != "relay" {
return Ok(None);
}
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())
.add_magic_public_key(&state.public_key.as_magic_public_key());
Ok(Some(wf))
};
Box::pin(fut)
}
}
impl actix_web::error::ResponseError for RelayError {}