X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Fhttp%2Fmod.rs;h=c261d9e4929c363385e10756d491967a25f29148;hb=e9e76549a88cfbdab36f00d302cceabcaaa24f4c;hp=ae8a3632aa59310b23732b0383b6f1b189a74a9d;hpb=5ce8adcb13f9d68f5d7e8569b3040fdf2bb362d0;p=lemmy.git diff --git a/crates/apub/src/http/mod.rs b/crates/apub/src/http/mod.rs index ae8a3632..c261d9e4 100644 --- a/crates/apub/src/http/mod.rs +++ b/crates/apub/src/http/mod.rs @@ -1,66 +1,99 @@ -use crate::APUB_JSON_CONTENT_TYPE; -use actix_web::{body::Body, web, HttpResponse}; +use crate::{ + activity_lists::SharedInboxActivities, + fetcher::user_or_community::UserOrCommunity, + protocol::objects::tombstone::Tombstone, + CONTEXT, +}; +use activitypub_federation::{ + actix_web::inbox::receive_activity, + config::Data, + protocol::context::WithContext, + FEDERATION_CONTENT_TYPE, +}; +use actix_web::{web, web::Bytes, HttpRequest, HttpResponse}; use http::StatusCode; -use lemmy_api_structs::blocking; -use lemmy_db_queries::source::activity::Activity_; -use lemmy_db_schema::source::activity::Activity; -use lemmy_utils::{settings::Settings, LemmyError}; -use lemmy_websocket::LemmyContext; +use lemmy_api_common::context::LemmyContext; +use lemmy_db_schema::source::activity::SentActivity; +use lemmy_utils::error::{LemmyError, LemmyErrorType, LemmyResult}; use serde::{Deserialize, Serialize}; +use std::ops::Deref; +use url::Url; -pub mod comment; -pub mod community; -pub mod post; -pub mod user; +mod comment; +mod community; +mod person; +mod post; +pub mod routes; +pub mod site; + +pub async fn shared_inbox( + request: HttpRequest, + body: Bytes, + data: Data, +) -> LemmyResult { + receive_activity::(request, body, &data) + .await +} /// Convert the data to json and turn it into an HTTP Response with the correct ActivityPub /// headers. -fn create_apub_response(data: &T) -> HttpResponse +/// +/// actix-web doesn't allow pretty-print for json so we need to do this manually. +fn create_apub_response(data: &T) -> LemmyResult where T: Serialize, { - HttpResponse::Ok() - .content_type(APUB_JSON_CONTENT_TYPE) - .json(data) + let json = serde_json::to_string_pretty(&WithContext::new(data, CONTEXT.clone()))?; + + Ok( + HttpResponse::Ok() + .content_type(FEDERATION_CONTENT_TYPE) + .body(json), + ) } -fn create_apub_tombstone_response(data: &T) -> HttpResponse -where - T: Serialize, -{ - HttpResponse::Gone() - .content_type(APUB_JSON_CONTENT_TYPE) - .status(StatusCode::GONE) - .json(data) +fn create_apub_tombstone_response>(id: T) -> LemmyResult { + let tombstone = Tombstone::new(id.into()); + let json = serde_json::to_string_pretty(&WithContext::new(tombstone, CONTEXT.deref().clone()))?; + + Ok( + HttpResponse::Gone() + .content_type(FEDERATION_CONTENT_TYPE) + .status(StatusCode::GONE) + .body(json), + ) +} + +fn err_object_not_local() -> LemmyError { + LemmyErrorType::ObjectNotLocal.into() } #[derive(Deserialize)] -pub struct CommunityQuery { +pub struct ActivityQuery { type_: String, id: String, } -/// Return the ActivityPub json representation of a local community over HTTP. -pub async fn get_activity( - info: web::Path, +/// Return the ActivityPub json representation of a local activity over HTTP. +#[tracing::instrument(skip_all)] +pub(crate) async fn get_activity( + info: web::Path, context: web::Data, -) -> Result, LemmyError> { - let settings = Settings::get(); - let activity_id = format!( +) -> Result { + let settings = context.settings(); + let activity_id = Url::parse(&format!( "{}/activities/{}/{}", settings.get_protocol_and_hostname(), info.type_, info.id - ); - let activity = blocking(context.pool(), move |conn| { - Activity::read_from_apub_id(&conn, &activity_id) - }) - .await??; + ))? + .into(); + let activity = SentActivity::read_from_apub_id(&mut context.pool(), &activity_id).await?; - let sensitive = activity.sensitive.unwrap_or(true); - if !activity.local || sensitive { - Ok(HttpResponse::NotFound().finish()) + let sensitive = activity.sensitive; + if sensitive { + Ok(HttpResponse::Forbidden().finish()) } else { - Ok(create_apub_response(&activity.data)) + create_apub_response(&activity.data) } }