use crate::{ config::RequestData, core::{ axum::ActivityData, http_signatures::{verify_inbox_hash, verify_signature}, object_id::ObjectId, }, error::Error, traits::{ActivityHandler, Actor, ApubObject}, }; use serde::de::DeserializeOwned; use tracing::debug; /// Handles incoming activities, verifying HTTP signatures and other checks /// /// After successful validation, activities are passed to respective [trait@ActivityHandler]. pub async fn receive_activity( activity_data: ActivityData, data: &RequestData, ) -> Result<(), ::Error> where Activity: ActivityHandler + DeserializeOwned + Send + 'static, ActorT: ApubObject + Actor + Send + 'static, for<'de2> ::ApubType: serde::Deserialize<'de2>, ::Error: From + From + From<::Error> + From, ::Error: From + From, Datatype: Clone, { verify_inbox_hash(activity_data.headers.get("Digest"), &activity_data.body)?; let activity: Activity = serde_json::from_slice(&activity_data.body)?; data.config.verify_url_and_domain(&activity).await?; let actor = ObjectId::::from(activity.actor().clone()) .dereference(data) .await?; verify_signature( &activity_data.headers, &activity_data.method, &activity_data.uri, actor.public_key(), )?; debug!("Receiving activity {}", activity.id().to_string()); activity.receive(data).await?; Ok(()) } // TODO: copy tests from actix-web inbox and implement for axum as well