]> Untitled Git - lemmy.git/blobdiff - crates/apub/src/http/mod.rs
Making public key required. Fixes #1934
[lemmy.git] / crates / apub / src / http / mod.rs
index 450b937d58bd1fb88a9d29b27e2bf785f6bb23a2..18e654d4376d68f7b25790d58fad4813885f7841 100644 (file)
@@ -2,7 +2,7 @@ use crate::{
   activity_lists::SharedInboxActivities,
   check_is_apub_id_valid,
   context::WithContext,
-  fetcher::{object_id::ObjectId, user_or_community::UserOrCommunity},
+  fetcher::user_or_community::UserOrCommunity,
   http::{community::receive_group_inbox, person::receive_person_inbox},
   insert_activity,
 };
@@ -19,6 +19,7 @@ use http::StatusCode;
 use lemmy_api_common::blocking;
 use lemmy_apub_lib::{
   data::Data,
+  object_id::ObjectId,
   signatures::verify_signature,
   traits::{ActivityHandler, ActorType},
   APUB_JSON_CONTENT_TYPE,
@@ -48,10 +49,10 @@ pub async fn shared_inbox(
   let activity = serde_json::from_str::<WithContext<SharedInboxActivities>>(&unparsed)?;
   match activity.inner() {
     SharedInboxActivities::GroupInboxActivities(g) => {
-      receive_group_inbox(g, activity_data, request, &context).await
+      receive_group_inbox(*g, activity_data, request, &context).await
     }
     SharedInboxActivities::PersonInboxActivities(p) => {
-      receive_person_inbox(p, activity_data, request, &context).await
+      receive_person_inbox(*p, activity_data, request, &context).await
     }
   }
 }
@@ -94,7 +95,7 @@ where
   let actor = ObjectId::<UserOrCommunity>::new(activity_data.actor)
     .dereference(context, request_counter)
     .await?;
-  verify_signature(&request, &actor.public_key().context(location_info!())?)?;
+  verify_signature(&request, &actor.public_key())?;
 
   // Do nothing if we received the same activity before
   if is_activity_already_known(context.pool(), &activity_data.id).await? {
@@ -108,14 +109,8 @@ where
 
   // Log the activity, so we avoid receiving and parsing it twice. Note that this could still happen
   // if we receive the same activity twice in very quick succession.
-  insert_activity(
-    &activity_data.id,
-    activity.clone(),
-    false,
-    true,
-    context.pool(),
-  )
-  .await?;
+  let object_value = serde_json::to_value(&activity)?;
+  insert_activity(&activity_data.id, object_value, false, true, context.pool()).await?;
 
   info!("Receiving activity {}", activity_data.id.to_string());
   activity
@@ -135,6 +130,12 @@ where
     .json(WithContext::new(data))
 }
 
+fn create_json_apub_response(data: serde_json::Value) -> HttpResponse<Body> {
+  HttpResponse::Ok()
+    .content_type(APUB_JSON_CONTENT_TYPE)
+    .json(data)
+}
+
 fn create_apub_tombstone_response<T>(data: &T) -> HttpResponse<Body>
 where
   T: Serialize,
@@ -173,7 +174,7 @@ pub(crate) async fn get_activity(
   if !activity.local || sensitive {
     Ok(HttpResponse::NotFound().finish())
   } else {
-    Ok(create_apub_response(&activity.data))
+    Ok(create_json_apub_response(activity.data))
   }
 }