use crate::{ core::object_id::ObjectId, data::Data, traits::{ActivityHandler, Actor, ApubObject}, Error, LocalInstance, }; use crate::core::signatures::verify_signature; use actix_web::{HttpRequest, HttpResponse}; use serde::de::DeserializeOwned; use tracing::debug; /// Receive an activity and perform some basic checks, including HTTP signature verification. pub async fn receive_activity( request: HttpRequest, activity: Activity, local_instance: &LocalInstance, data: &Data, ) -> 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( request.headers(), request.method(), request.uri(), actor.public_key(), )?; debug!("Receiving activity {}", activity.id().to_string()); activity.receive(data, request_counter).await?; Ok(HttpResponse::Ok().finish()) }