relay/src/middleware/webfinger.rs

52 lines
1.3 KiB
Rust
Raw Normal View History

use crate::{
config::{Config, UrlKind},
2020-03-23 22:17:53 +00:00
data::State,
};
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;
use std::{future::Future, pin::Pin};
pub struct RelayResolver;
#[derive(Clone, Debug, thiserror::Error)]
#[error("Error resolving webfinger data")]
pub struct RelayError;
2020-04-26 01:49:29 +00:00
type FutResult<T, E> = dyn Future<Output = Result<T, E>>;
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(
account: &str,
domain: &str,
2020-04-21 19:12:10 +00:00
(state, config): Self::State,
2020-04-26 01:49:29 +00:00
) -> Pin<Box<FutResult<Option<Webfinger>, Self::Error>>> {
2020-03-16 03:36:46 +00:00
let domain = domain.to_owned();
let account = account.to_owned();
let fut = async move {
if domain != config.hostname() {
2020-03-16 03:36:46 +00:00
return Ok(None);
}
if account != "relay" {
return Ok(None);
}
let mut wf = Webfinger::new(&config.generate_resource());
wf.add_alias(&config.generate_url(UrlKind::Actor))
.add_activitypub(&config.generate_url(UrlKind::Actor))
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 {}