From 3bfa8ab4fffbacad50a2d20937bc64206cd4d3d0 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Thu, 9 Feb 2023 04:45:29 +0900 Subject: [PATCH] Improved error message when attempting to fetch non-local object (fixes #2715) (#2717) --- crates/apub/src/http/comment.rs | 5 ++--- crates/apub/src/http/mod.rs | 10 ++++++++-- crates/apub/src/http/post.rs | 5 ++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/crates/apub/src/http/comment.rs b/crates/apub/src/http/comment.rs index 5e7de7e25..6753271c7 100644 --- a/crates/apub/src/http/comment.rs +++ b/crates/apub/src/http/comment.rs @@ -1,10 +1,9 @@ use crate::{ - http::{create_apub_response, create_apub_tombstone_response}, + http::{create_apub_response, create_apub_tombstone_response, err_object_not_local}, objects::comment::ApubComment, }; use activitypub_federation::traits::ApubObject; use actix_web::{web, web::Path, HttpResponse}; -use diesel::result::Error::NotFound; use lemmy_api_common::context::LemmyContext; use lemmy_db_schema::{newtypes::CommentId, source::comment::Comment, traits::Crud}; use lemmy_utils::error::LemmyError; @@ -24,7 +23,7 @@ pub(crate) async fn get_apub_comment( let id = CommentId(info.comment_id.parse::()?); let comment: ApubComment = Comment::read(context.pool(), id).await?.into(); if !comment.local { - return Err(NotFound.into()); + return Err(err_object_not_local()); } if !comment.deleted && !comment.removed { diff --git a/crates/apub/src/http/mod.rs b/crates/apub/src/http/mod.rs index 726834c00..83272d120 100644 --- a/crates/apub/src/http/mod.rs +++ b/crates/apub/src/http/mod.rs @@ -100,6 +100,10 @@ fn create_apub_tombstone_response>(id: T) -> HttpResponse { .json(WithContext::new(tombstone, CONTEXT.deref().clone())) } +fn err_object_not_local() -> LemmyError { + LemmyError::from_message("Object not local, fetch it from original instance") +} + #[derive(Deserialize)] pub struct ActivityQuery { type_: String, @@ -123,8 +127,10 @@ pub(crate) async fn get_activity( let activity = Activity::read_from_apub_id(context.pool(), &activity_id).await?; let sensitive = activity.sensitive.unwrap_or(true); - if !activity.local || sensitive { - Ok(HttpResponse::NotFound().finish()) + if !activity.local { + return Err(err_object_not_local()); + } else if sensitive { + Ok(HttpResponse::Forbidden().finish()) } else { Ok(create_json_apub_response(activity.data)) } diff --git a/crates/apub/src/http/post.rs b/crates/apub/src/http/post.rs index bea5da3a4..fc164a549 100644 --- a/crates/apub/src/http/post.rs +++ b/crates/apub/src/http/post.rs @@ -1,10 +1,9 @@ use crate::{ - http::{create_apub_response, create_apub_tombstone_response}, + http::{create_apub_response, create_apub_tombstone_response, err_object_not_local}, objects::post::ApubPost, }; use activitypub_federation::traits::ApubObject; use actix_web::{web, HttpResponse}; -use diesel::result::Error::NotFound; use lemmy_api_common::context::LemmyContext; use lemmy_db_schema::{newtypes::PostId, source::post::Post, traits::Crud}; use lemmy_utils::error::LemmyError; @@ -24,7 +23,7 @@ pub(crate) async fn get_apub_post( let id = PostId(info.post_id.parse::()?); let post: ApubPost = Post::read(context.pool(), id).await?.into(); if !post.local { - return Err(NotFound.into()); + return Err(err_object_not_local()); } if !post.deleted && !post.removed {