use crate::{ core::{axum::DigestVerified, object_id::ObjectId, signatures::verify_signature}, data::Data, traits::{ActivityHandler, Actor, ApubObject}, Error, LocalInstance, }; use http::{HeaderMap, Method, Uri}; use serde::de::DeserializeOwned; use tracing::debug; /// Receive an activity and perform some basic checks, including HTTP signature verification. pub async fn receive_activity( _digest_verified: DigestVerified, activity: Activity, local_instance: &LocalInstance, data: &Data, headers: HeaderMap, method: Method, uri: Uri, ) -> 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, { local_instance.verify_url_and_domain(&activity).await?; let request_counter = &mut 0; let actor = ObjectId::::new(activity.actor().clone()) .dereference(data, local_instance, request_counter) .await?; verify_signature(&headers, &method, &uri, actor.public_key())?; debug!("Receiving activity {}", activity.id().to_string()); activity.receive(data, request_counter).await?; Ok(()) }