Add hook for incoming activities

This commit is contained in:
Felix Ableitner 2025-06-16 14:46:03 +02:00
parent 7e876dd5ce
commit 9f56f5390c

View file

@ -10,14 +10,16 @@ use crate::{
}; };
use actix_web::{web::Bytes, HttpRequest, HttpResponse}; use actix_web::{web::Bytes, HttpRequest, HttpResponse};
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use std::future::Future;
use tracing::debug; use tracing::debug;
/// Handles incoming activities, verifying HTTP signatures and other checks /// Handles incoming activities, verifying HTTP signatures and other checks
/// ///
/// After successful validation, activities are passed to respective [trait@ActivityHandler]. /// After successful validation, activities are passed to respective [trait@ActivityHandler].
pub async fn receive_activity<Activity, ActorT, Datatype>( pub async fn receive_activity<Activity, ActorT, Datatype, Fut>(
request: HttpRequest, request: HttpRequest,
body: Bytes, body: Bytes,
hook: impl FnOnce(&Activity, &ActorT) -> Fut,
data: &Data<Datatype>, data: &Data<Datatype>,
) -> Result<HttpResponse, <Activity as ActivityHandler>::Error> ) -> Result<HttpResponse, <Activity as ActivityHandler>::Error>
where where
@ -27,6 +29,7 @@ where
<Activity as ActivityHandler>::Error: From<Error> + From<<ActorT as Object>::Error>, <Activity as ActivityHandler>::Error: From<Error> + From<<ActorT as Object>::Error>,
<ActorT as Object>::Error: From<Error>, <ActorT as Object>::Error: From<Error>,
Datatype: Clone, Datatype: Clone,
Fut: Future<Output = Result<(), <Activity as ActivityHandler>::Error>>,
{ {
let digest_header = request let digest_header = request
.headers() .headers()
@ -41,6 +44,8 @@ where
let uri = http_compat::uri(request.uri()); let uri = http_compat::uri(request.uri());
verify_signature(&headers, &method, &uri, actor.public_key_pem())?; verify_signature(&headers, &method, &uri, actor.public_key_pem())?;
hook(&activity, &actor).await?;
debug!("Receiving activity {}", activity.id().to_string()); debug!("Receiving activity {}", activity.id().to_string());
activity.verify(data).await?; activity.verify(data).await?;
activity.receive(data).await?; activity.receive(data).await?;