let note = NoteExt::from_any_base(create.object().to_owned().one().context(location_info!())?)?
.context(location_info!())?;
- let comment = Comment::from_apub(¬e, context, Some(user.actor_id()), request_counter).await?;
+ let comment = Comment::from_apub(¬e, context, user.actor_id(), request_counter, false).await?;
let post_id = comment.post_id;
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
.context(location_info!())?;
let user = get_actor_as_user(&update, context, request_counter).await?;
- let comment = Comment::from_apub(¬e, context, Some(user.actor_id()), request_counter).await?;
+ let comment = Comment::from_apub(¬e, context, user.actor_id(), request_counter, false).await?;
let comment_id = comment.id;
let post_id = comment.post_id;
let page = PageExt::from_any_base(create.object().to_owned().one().context(location_info!())?)?
.context(location_info!())?;
- let post = Post::from_apub(&page, context, Some(user.actor_id()), request_counter).await?;
+ let post = Post::from_apub(&page, context, user.actor_id(), request_counter, false).await?;
// Refetch the view
let post_id = post.id;
})
.await??;
- let mut expected_domain = Some(user.actor_id());
// If sticked or locked state was changed, make sure the actor is a mod
let stickied = page.ext_one.stickied.context(location_info!())?;
let locked = !page.ext_one.comments_enabled.context(location_info!())?;
+ let mut is_mod_action = false;
if stickied != old_post.stickied || locked != old_post.locked {
let community = blocking(context.pool(), move |conn| {
Community::read(conn, old_post.community_id)
})
.await??;
verify_mod_activity(&update, announce, &community, context).await?;
- expected_domain = None;
+ is_mod_action = true;
}
- let post = Post::from_apub(&page, context, expected_domain, request_counter).await?;
+ let post = Post::from_apub(
+ &page,
+ context,
+ user.actor_id(),
+ request_counter,
+ is_mod_action,
+ )
+ .await?;
let post_id = post.id;
// Refetch the view
.context(location_info!())?;
let private_message =
- PrivateMessage::from_apub(¬e, context, Some(expected_domain), request_counter).await?;
+ PrivateMessage::from_apub(¬e, context, expected_domain, request_counter, false).await?;
let message = blocking(&context.pool(), move |conn| {
PrivateMessageView::read(conn, private_message.id)
let note = NoteExt::from_any_base(object)?.context(location_info!())?;
let private_message =
- PrivateMessage::from_apub(¬e, context, Some(expected_domain), request_counter).await?;
+ PrivateMessage::from_apub(¬e, context, expected_domain, request_counter, false).await?;
let private_message_id = private_message.id;
let message = blocking(&context.pool(), move |conn| {
}
let group = group?;
- let community =
- Community::from_apub(&group, context, Some(apub_id.to_owned()), recursion_counter).await?;
+ let community = Community::from_apub(
+ &group,
+ context,
+ apub_id.to_owned(),
+ recursion_counter,
+ false,
+ )
+ .await?;
// only fetch outbox for new communities, otherwise this can create an infinite loop
if old_community.is_none() {
let post = Post::from_apub(
&page,
context,
- Some(post_ap_id.to_owned()),
+ post_ap_id.to_owned(),
recursion_counter,
+ false,
)
.await?;
let comment = Comment::from_apub(
&comment,
context,
- Some(comment_ap_id.to_owned()),
+ comment_ap_id.to_owned(),
recursion_counter,
+ false,
)
.await?;
];
}
SearchAcceptedObjects::Page(p) => {
- let p = Post::from_apub(&p, context, Some(query_url), recursion_counter).await?;
+ let p = Post::from_apub(&p, context, query_url, recursion_counter, false).await?;
response.posts =
vec![blocking(context.pool(), move |conn| PostView::read(conn, p.id, None)).await??];
}
SearchAcceptedObjects::Comment(c) => {
- let c = Comment::from_apub(&c, context, Some(query_url), recursion_counter).await?;
+ let c = Comment::from_apub(&c, context, query_url, recursion_counter, false).await?;
response.comments = vec![
blocking(context.pool(), move |conn| {
let user = User_::from_apub(
&person?,
context,
- Some(apub_id.to_owned()),
+ apub_id.to_owned(),
recursion_counter,
+ false,
)
.await?;
let user = User_::from_apub(
&person,
context,
- Some(apub_id.to_owned()),
+ apub_id.to_owned(),
recursion_counter,
+ false,
)
.await?;
async fn from_apub(
note: &NoteExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<Comment, LemmyError> {
- let comment: Comment =
- get_object_from_apub(note, context, expected_domain, request_counter).await?;
+ let comment: Comment = get_object_from_apub(
+ note,
+ context,
+ expected_domain,
+ request_counter,
+ is_mod_action,
+ )
+ .await?;
let post_id = comment.post_id;
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
async fn from_apub(
note: &NoteExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ _is_mod_action: bool,
) -> Result<CommentForm, LemmyError> {
- let expected_domain = expected_domain.expect("expected_domain must be set for comment");
let creator_actor_id = ¬e
.attributed_to()
.context(location_info!())?
async fn from_apub(
group: &GroupExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<Community, LemmyError> {
- let community: Community =
- get_object_from_apub(group, context, expected_domain, request_counter).await?;
+ let community: Community = get_object_from_apub(
+ group,
+ context,
+ expected_domain,
+ request_counter,
+ is_mod_action,
+ )
+ .await?;
let new_moderators = fetch_community_mods(context, group, request_counter).await?;
let community_id = community.id;
async fn from_apub(
group: &GroupExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ _is_mod_action: bool,
) -> Result<Self, LemmyError> {
- let expected_domain = expected_domain.expect("expected_domain must be set for community");
let moderator_uris = fetch_community_mods(context, group, request_counter).await?;
let creator_uri = moderator_uris.first().context(location_info!())?;
/// * `apub` The object to read from
/// * `context` LemmyContext which holds DB pool, HTTP client etc
/// * `expected_domain` Domain where the object was received from. None in case of mod action.
+ /// * `is_mod_action` True if the object was sent in a mod activity, ignore `expected_domain` in this case
async fn from_apub(
apub: &Self::ApubType,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<Self, LemmyError>
where
Self: Sized;
async fn from_apub(
apub: &ApubType,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<Self, LemmyError>
where
Self: Sized;
pub(in crate::objects) async fn get_object_from_apub<From, Kind, To, ToForm>(
from: &From,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<To, LemmyError>
where
From: BaseExt<Kind>,
}
// otherwise parse and insert, assuring that it comes from the right domain
else {
- let to_form = ToForm::from_apub(&from, context, expected_domain, request_counter).await?;
+ let to_form = ToForm::from_apub(
+ &from,
+ context,
+ expected_domain,
+ request_counter,
+ is_mod_action,
+ )
+ .await?;
let to = blocking(context.pool(), move |conn| To::upsert(conn, &to_form)).await??;
Ok(to)
async fn from_apub(
page: &PageExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<Post, LemmyError> {
- let post: Post = get_object_from_apub(page, context, expected_domain, request_counter).await?;
+ let post: Post = get_object_from_apub(
+ page,
+ context,
+ expected_domain,
+ request_counter,
+ is_mod_action,
+ )
+ .await?;
check_object_for_community_or_site_ban(page, post.community_id, context, request_counter)
.await?;
Ok(post)
async fn from_apub(
page: &PageExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<PostForm, LemmyError> {
- let ap_id = match expected_domain {
- Some(e) => check_object_domain(page, e)?,
- None => {
- let id = page.id_unchecked().context(location_info!())?;
- check_is_apub_id_valid(id)?;
- id.to_owned().into()
- }
+ let ap_id = if is_mod_action {
+ let id = page.id_unchecked().context(location_info!())?;
+ check_is_apub_id_valid(id)?;
+ id.to_owned().into()
+ } else {
+ check_object_domain(page, expected_domain)?
};
let ext = &page.ext_one;
let creator_actor_id = page
async fn from_apub(
note: &NoteExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<PrivateMessage, LemmyError> {
- get_object_from_apub(note, context, expected_domain, request_counter).await
+ get_object_from_apub(
+ note,
+ context,
+ expected_domain,
+ request_counter,
+ is_mod_action,
+ )
+ .await
}
}
async fn from_apub(
note: &NoteExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ _is_mod_action: bool,
) -> Result<PrivateMessageForm, LemmyError> {
- let expected_domain = expected_domain.expect("expected_domain must be set for private message");
let creator_actor_id = note
.attributed_to()
.context(location_info!())?
async fn from_apub(
person: &PersonExt,
context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
request_counter: &mut i32,
+ is_mod_action: bool,
) -> Result<User_, LemmyError> {
let user_id = person.id_unchecked().context(location_info!())?.to_owned();
let domain = user_id.domain().context(location_info!())?;
.await??;
Ok(user)
} else {
- let user_form =
- UserForm::from_apub(person, context, expected_domain, request_counter).await?;
+ let user_form = UserForm::from_apub(
+ person,
+ context,
+ expected_domain,
+ request_counter,
+ is_mod_action,
+ )
+ .await?;
let user = blocking(context.pool(), move |conn| User_::upsert(conn, &user_form)).await??;
Ok(user)
}
async fn from_apub(
person: &PersonExt,
_context: &LemmyContext,
- expected_domain: Option<Url>,
+ expected_domain: Url,
_request_counter: &mut i32,
+ _is_mod_action: bool,
) -> Result<Self, LemmyError> {
- let expected_domain = expected_domain.expect("expected_domain must be set for user");
let avatar = match person.icon() {
Some(any_image) => Some(
Image::from_any_base(any_image.as_one().context(location_info!())?.clone())?