Check for community ban when parsing post/comment (fixes #1287)

This commit is contained in:
Felix Ableitner 2020-12-02 16:55:53 +01:00
parent 7649dd048b
commit 32c4d3224c
4 changed files with 34 additions and 2 deletions

View file

@ -259,7 +259,7 @@ async fn handle_undo_follow(
Ok(()) Ok(())
} }
async fn check_community_or_site_ban( pub(crate) async fn check_community_or_site_ban(
user: &User_, user: &User_,
community: &Community, community: &Community,
pool: &DbPool, pool: &DbPool,

View file

@ -7,6 +7,7 @@ use crate::{
}, },
objects::{ objects::{
check_object_domain, check_object_domain,
check_object_for_community_or_site_ban,
create_tombstone, create_tombstone,
get_object_from_apub, get_object_from_apub,
get_source_markdown_value, get_source_markdown_value,
@ -101,6 +102,8 @@ impl FromApub for Comment {
expected_domain: Option<Url>, expected_domain: Option<Url>,
request_counter: &mut i32, request_counter: &mut i32,
) -> Result<Comment, LemmyError> { ) -> Result<Comment, LemmyError> {
check_object_for_community_or_site_ban(note, context, request_counter).await?;
let comment: Comment = let comment: Comment =
get_object_from_apub(note, context, expected_domain, request_counter).await?; get_object_from_apub(note, context, expected_domain, request_counter).await?;

View file

@ -1,4 +1,8 @@
use crate::check_is_apub_id_valid; use crate::{
check_is_apub_id_valid,
fetcher::{get_or_fetch_and_upsert_community, get_or_fetch_and_upsert_user},
inbox::community_inbox::check_community_or_site_ban,
};
use activitystreams::{ use activitystreams::{
base::{AsBase, BaseExt, ExtendsExt}, base::{AsBase, BaseExt, ExtendsExt},
markers::Base, markers::Base,
@ -205,3 +209,26 @@ where
Ok(to) Ok(to)
} }
} }
pub(in crate::objects) async fn check_object_for_community_or_site_ban<T, Kind>(
object: &T,
context: &LemmyContext,
request_counter: &mut i32,
) -> Result<(), LemmyError>
where
T: ObjectExt<Kind>,
{
let user_id = object
.attributed_to()
.context(location_info!())?
.as_single_xsd_any_uri()
.context(location_info!())?;
let user = get_or_fetch_and_upsert_user(user_id, context, request_counter).await?;
let community_id = object
.to()
.context(location_info!())?
.as_single_xsd_any_uri()
.context(location_info!())?;
let community = get_or_fetch_and_upsert_community(community_id, context, request_counter).await?;
check_community_or_site_ban(&user, &community, context.pool()).await
}

View file

@ -3,6 +3,7 @@ use crate::{
fetcher::{get_or_fetch_and_upsert_community, get_or_fetch_and_upsert_user}, fetcher::{get_or_fetch_and_upsert_community, get_or_fetch_and_upsert_user},
objects::{ objects::{
check_object_domain, check_object_domain,
check_object_for_community_or_site_ban,
create_tombstone, create_tombstone,
get_object_from_apub, get_object_from_apub,
get_source_markdown_value, get_source_markdown_value,
@ -112,6 +113,7 @@ impl FromApub for Post {
expected_domain: Option<Url>, expected_domain: Option<Url>,
request_counter: &mut i32, request_counter: &mut i32,
) -> Result<Post, LemmyError> { ) -> Result<Post, LemmyError> {
check_object_for_community_or_site_ban(page, context, request_counter).await?;
get_object_from_apub(page, context, expected_domain, request_counter).await get_object_from_apub(page, context, expected_domain, request_counter).await
} }
} }