mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-12-29 11:20:36 +00:00
Change the way that to
is set in apub
This commit is contained in:
parent
2ad60379e4
commit
7cfcf0acec
16 changed files with 169 additions and 156 deletions
|
@ -1,15 +1,12 @@
|
|||
use crate::{
|
||||
activities::receive::{
|
||||
create::receive_create,
|
||||
delete::receive_delete,
|
||||
dislike::receive_dislike,
|
||||
like::receive_like,
|
||||
receive_unhandled_activity,
|
||||
remove::receive_remove,
|
||||
undo::receive_undo,
|
||||
update::receive_update,
|
||||
},
|
||||
inbox::shared_inbox::get_community_id_from_activity,
|
||||
use crate::activities::receive::{
|
||||
create::receive_create,
|
||||
delete::receive_delete,
|
||||
dislike::receive_dislike,
|
||||
like::receive_like,
|
||||
receive_unhandled_activity,
|
||||
remove::receive_remove,
|
||||
undo::receive_undo,
|
||||
update::receive_update,
|
||||
};
|
||||
use activitystreams::{
|
||||
activity::*,
|
||||
|
@ -28,8 +25,12 @@ pub async fn receive_announce(
|
|||
let announce = Announce::from_any_base(activity)?.context(location_info!())?;
|
||||
|
||||
// ensure that announce and community come from the same instance
|
||||
let community = get_community_id_from_activity(&announce)?;
|
||||
announce.id(community.domain().context(location_info!())?)?;
|
||||
let community_id = announce
|
||||
.actor()?
|
||||
.to_owned()
|
||||
.single_xsd_any_uri()
|
||||
.context(location_info!())?;
|
||||
announce.id(community_id.domain().context(location_info!())?)?;
|
||||
|
||||
let kind = announce.object().as_single_kind_str();
|
||||
let object = announce.object();
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
use crate::{
|
||||
activities::receive::{announce_if_community_is_local, receive_unhandled_activity},
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
activities::receive::{
|
||||
announce_if_community_is_local,
|
||||
get_actor_as_user,
|
||||
receive_unhandled_activity,
|
||||
},
|
||||
ActorType,
|
||||
FromApub,
|
||||
PageExt,
|
||||
|
@ -29,7 +32,7 @@ pub async fn receive_create(
|
|||
let create = Create::from_any_base(activity)?.context(location_info!())?;
|
||||
|
||||
// ensure that create and actor come from the same instance
|
||||
let user = get_user_from_activity(&create, context).await?;
|
||||
let user = get_actor_as_user(&create, context).await?;
|
||||
create.id(user.actor_id()?.domain().context(location_info!())?)?;
|
||||
|
||||
match create.object().as_single_kind_str() {
|
||||
|
@ -43,7 +46,7 @@ async fn receive_create_post(
|
|||
create: Create,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(&create, context).await?;
|
||||
let user = get_actor_as_user(&create, context).await?;
|
||||
let page = PageExt::from_any_base(create.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -76,7 +79,7 @@ async fn receive_create_comment(
|
|||
create: Create,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(&create, context).await?;
|
||||
let user = get_actor_as_user(&create, context).await?;
|
||||
let note = Note::from_any_base(create.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
use crate::{
|
||||
activities::receive::{announce_if_community_is_local, receive_unhandled_activity},
|
||||
activities::receive::{
|
||||
announce_if_community_is_local,
|
||||
get_actor_as_user,
|
||||
receive_unhandled_activity,
|
||||
},
|
||||
fetcher::{get_or_fetch_and_insert_comment, get_or_fetch_and_insert_post},
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
ActorType,
|
||||
FromApub,
|
||||
GroupExt,
|
||||
|
@ -50,7 +53,7 @@ async fn receive_delete_post(
|
|||
delete: Delete,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(&delete, context).await?;
|
||||
let user = get_actor_as_user(&delete, context).await?;
|
||||
let page = PageExt::from_any_base(delete.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -109,7 +112,7 @@ async fn receive_delete_comment(
|
|||
delete: Delete,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(&delete, context).await?;
|
||||
let user = get_actor_as_user(&delete, context).await?;
|
||||
let note = Note::from_any_base(delete.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -169,7 +172,7 @@ async fn receive_delete_community(
|
|||
) -> Result<HttpResponse, LemmyError> {
|
||||
let group = GroupExt::from_any_base(delete.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
let user = get_user_from_activity(&delete, context).await?;
|
||||
let user = get_actor_as_user(&delete, context).await?;
|
||||
|
||||
let community_actor_id = CommunityForm::from_apub(&group, context, Some(user.actor_id()?))
|
||||
.await?
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
use crate::{
|
||||
activities::receive::{announce_if_community_is_local, receive_unhandled_activity},
|
||||
activities::receive::{
|
||||
announce_if_community_is_local,
|
||||
get_actor_as_user,
|
||||
receive_unhandled_activity,
|
||||
},
|
||||
fetcher::{get_or_fetch_and_insert_comment, get_or_fetch_and_insert_post},
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
FromApub,
|
||||
PageExt,
|
||||
};
|
||||
|
@ -49,7 +52,7 @@ async fn receive_dislike_post(
|
|||
dislike: Dislike,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(&dislike, context).await?;
|
||||
let user = get_actor_as_user(&dislike, context).await?;
|
||||
let page = PageExt::from_any_base(
|
||||
dislike
|
||||
.object()
|
||||
|
@ -107,7 +110,7 @@ async fn receive_dislike_comment(
|
|||
.context(location_info!())?,
|
||||
)?
|
||||
.context(location_info!())?;
|
||||
let user = get_user_from_activity(&dislike, context).await?;
|
||||
let user = get_actor_as_user(&dislike, context).await?;
|
||||
|
||||
let comment = CommentForm::from_apub(¬e, context, None).await?;
|
||||
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
use crate::{
|
||||
activities::receive::{announce_if_community_is_local, receive_unhandled_activity},
|
||||
activities::receive::{
|
||||
announce_if_community_is_local,
|
||||
get_actor_as_user,
|
||||
receive_unhandled_activity,
|
||||
},
|
||||
fetcher::{get_or_fetch_and_insert_comment, get_or_fetch_and_insert_post},
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
FromApub,
|
||||
PageExt,
|
||||
};
|
||||
|
@ -36,7 +39,7 @@ pub async fn receive_like(
|
|||
}
|
||||
|
||||
async fn receive_like_post(like: Like, context: &LemmyContext) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(&like, context).await?;
|
||||
let user = get_actor_as_user(&like, context).await?;
|
||||
let page = PageExt::from_any_base(like.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -82,7 +85,7 @@ async fn receive_like_comment(
|
|||
) -> Result<HttpResponse, LemmyError> {
|
||||
let note = Note::from_any_base(like.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
let user = get_user_from_activity(&like, context).await?;
|
||||
let user = get_actor_as_user(&like, context).await?;
|
||||
|
||||
let comment = CommentForm::from_apub(¬e, context, None).await?;
|
||||
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
use crate::{fetcher::get_or_fetch_and_upsert_community, ActorType};
|
||||
use crate::{
|
||||
fetcher::{get_or_fetch_and_upsert_community, get_or_fetch_and_upsert_user},
|
||||
ActorType,
|
||||
};
|
||||
use activitystreams::{
|
||||
base::{Extends, ExtendsExt},
|
||||
activity::{ActorAndObjectRef, ActorAndObjectRefExt},
|
||||
base::{AsBase, Extends, ExtendsExt},
|
||||
object::{AsObject, ObjectExt},
|
||||
};
|
||||
use actix_web::HttpResponse;
|
||||
|
@ -63,3 +67,15 @@ where
|
|||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(in crate) async fn get_actor_as_user<T, A>(
|
||||
activity: &T,
|
||||
context: &LemmyContext,
|
||||
) -> Result<User_, LemmyError>
|
||||
where
|
||||
T: AsBase<A> + ActorAndObjectRef,
|
||||
{
|
||||
let actor = activity.actor()?;
|
||||
let user_uri = actor.as_single_xsd_any_uri().context(location_info!())?;
|
||||
get_or_fetch_and_upsert_user(&user_uri, context).await
|
||||
}
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
use crate::{
|
||||
activities::receive::{announce_if_community_is_local, receive_unhandled_activity},
|
||||
activities::receive::{
|
||||
announce_if_community_is_local,
|
||||
get_actor_as_user,
|
||||
receive_unhandled_activity,
|
||||
},
|
||||
fetcher::{get_or_fetch_and_insert_comment, get_or_fetch_and_insert_post},
|
||||
inbox::shared_inbox::{get_community_id_from_activity, get_user_from_activity},
|
||||
ActorType,
|
||||
FromApub,
|
||||
GroupExt,
|
||||
|
@ -38,9 +41,18 @@ pub async fn receive_remove(
|
|||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let remove = Remove::from_any_base(activity)?.context(location_info!())?;
|
||||
let actor = get_user_from_activity(&remove, context).await?;
|
||||
let community = get_community_id_from_activity(&remove)?;
|
||||
if actor.actor_id()?.domain() != community.domain() {
|
||||
let actor = get_actor_as_user(&remove, context).await?;
|
||||
let cc = remove
|
||||
.cc()
|
||||
.map(|c| c.as_many())
|
||||
.flatten()
|
||||
.context(location_info!())?;
|
||||
let community_id = cc
|
||||
.first()
|
||||
.map(|c| c.as_xsd_any_uri())
|
||||
.flatten()
|
||||
.context(location_info!())?;
|
||||
if actor.actor_id()?.domain() != community_id.domain() {
|
||||
return Err(anyhow!("Remove receive are only allowed on local objects").into());
|
||||
}
|
||||
|
||||
|
@ -56,7 +68,7 @@ async fn receive_remove_post(
|
|||
remove: Remove,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let mod_ = get_user_from_activity(&remove, context).await?;
|
||||
let mod_ = get_actor_as_user(&remove, context).await?;
|
||||
let page = PageExt::from_any_base(remove.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -115,7 +127,7 @@ async fn receive_remove_comment(
|
|||
remove: Remove,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let mod_ = get_user_from_activity(&remove, context).await?;
|
||||
let mod_ = get_actor_as_user(&remove, context).await?;
|
||||
let note = Note::from_any_base(remove.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -173,7 +185,7 @@ async fn receive_remove_community(
|
|||
remove: Remove,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let mod_ = get_user_from_activity(&remove, context).await?;
|
||||
let mod_ = get_actor_as_user(&remove, context).await?;
|
||||
let group = GroupExt::from_any_base(remove.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
use crate::{
|
||||
activities::receive::{
|
||||
announce_if_community_is_local,
|
||||
get_actor_as_user,
|
||||
receive_unhandled_activity,
|
||||
undo_comment::*,
|
||||
undo_post::*,
|
||||
},
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
ActorType,
|
||||
FromApub,
|
||||
GroupExt,
|
||||
|
@ -141,7 +141,7 @@ async fn receive_undo_delete_community(
|
|||
delete: &Delete,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(delete, context).await?;
|
||||
let user = get_actor_as_user(delete, context).await?;
|
||||
let group = GroupExt::from_any_base(delete.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -207,7 +207,7 @@ async fn receive_undo_remove_community(
|
|||
remove: &Remove,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let mod_ = get_user_from_activity(remove, context).await?;
|
||||
let mod_ = get_actor_as_user(remove, context).await?;
|
||||
let group = GroupExt::from_any_base(remove.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
use crate::{
|
||||
activities::receive::announce_if_community_is_local,
|
||||
activities::receive::{announce_if_community_is_local, get_actor_as_user},
|
||||
fetcher::get_or_fetch_and_insert_comment,
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
ActorType,
|
||||
FromApub,
|
||||
};
|
||||
|
@ -24,7 +23,7 @@ pub(crate) async fn receive_undo_like_comment(
|
|||
like: &Like,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(like, context).await?;
|
||||
let user = get_actor_as_user(like, context).await?;
|
||||
let note = Note::from_any_base(like.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -69,7 +68,7 @@ pub(crate) async fn receive_undo_dislike_comment(
|
|||
dislike: &Dislike,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(dislike, context).await?;
|
||||
let user = get_actor_as_user(dislike, context).await?;
|
||||
let note = Note::from_any_base(
|
||||
dislike
|
||||
.object()
|
||||
|
@ -120,7 +119,7 @@ pub(crate) async fn receive_undo_delete_comment(
|
|||
delete: &Delete,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(delete, context).await?;
|
||||
let user = get_actor_as_user(delete, context).await?;
|
||||
let note = Note::from_any_base(delete.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -179,7 +178,7 @@ pub(crate) async fn receive_undo_remove_comment(
|
|||
remove: &Remove,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let mod_ = get_user_from_activity(remove, context).await?;
|
||||
let mod_ = get_actor_as_user(remove, context).await?;
|
||||
let note = Note::from_any_base(remove.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
use crate::{
|
||||
activities::receive::announce_if_community_is_local,
|
||||
activities::receive::{announce_if_community_is_local, get_actor_as_user},
|
||||
fetcher::get_or_fetch_and_insert_post,
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
ActorType,
|
||||
FromApub,
|
||||
PageExt,
|
||||
|
@ -25,7 +24,7 @@ pub(crate) async fn receive_undo_like_post(
|
|||
like: &Like,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(like, context).await?;
|
||||
let user = get_actor_as_user(like, context).await?;
|
||||
let page = PageExt::from_any_base(like.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -64,7 +63,7 @@ pub(crate) async fn receive_undo_dislike_post(
|
|||
dislike: &Dislike,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(dislike, context).await?;
|
||||
let user = get_actor_as_user(dislike, context).await?;
|
||||
let page = PageExt::from_any_base(
|
||||
dislike
|
||||
.object()
|
||||
|
@ -109,7 +108,7 @@ pub(crate) async fn receive_undo_delete_post(
|
|||
delete: &Delete,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(delete, context).await?;
|
||||
let user = get_actor_as_user(delete, context).await?;
|
||||
let page = PageExt::from_any_base(delete.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -169,7 +168,7 @@ pub(crate) async fn receive_undo_remove_post(
|
|||
remove: &Remove,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let mod_ = get_user_from_activity(remove, context).await?;
|
||||
let mod_ = get_actor_as_user(remove, context).await?;
|
||||
let page = PageExt::from_any_base(remove.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
use crate::{
|
||||
activities::receive::{announce_if_community_is_local, receive_unhandled_activity},
|
||||
activities::receive::{
|
||||
announce_if_community_is_local,
|
||||
get_actor_as_user,
|
||||
receive_unhandled_activity,
|
||||
},
|
||||
fetcher::{get_or_fetch_and_insert_comment, get_or_fetch_and_insert_post},
|
||||
inbox::shared_inbox::get_user_from_activity,
|
||||
ActorType,
|
||||
FromApub,
|
||||
PageExt,
|
||||
|
@ -31,7 +34,7 @@ pub async fn receive_update(
|
|||
let update = Update::from_any_base(activity)?.context(location_info!())?;
|
||||
|
||||
// ensure that update and actor come from the same instance
|
||||
let user = get_user_from_activity(&update, context).await?;
|
||||
let user = get_actor_as_user(&update, context).await?;
|
||||
update.id(user.actor_id()?.domain().context(location_info!())?)?;
|
||||
|
||||
match update.object().as_single_kind_str() {
|
||||
|
@ -45,7 +48,7 @@ async fn receive_update_post(
|
|||
update: Update,
|
||||
context: &LemmyContext,
|
||||
) -> Result<HttpResponse, LemmyError> {
|
||||
let user = get_user_from_activity(&update, context).await?;
|
||||
let user = get_actor_as_user(&update, context).await?;
|
||||
let page = PageExt::from_any_base(update.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
|
||||
|
@ -84,7 +87,7 @@ async fn receive_update_comment(
|
|||
) -> Result<HttpResponse, LemmyError> {
|
||||
let note = Note::from_any_base(update.object().to_owned().one().context(location_info!())?)?
|
||||
.context(location_info!())?;
|
||||
let user = get_user_from_activity(&update, context).await?;
|
||||
let user = get_actor_as_user(&update, context).await?;
|
||||
|
||||
let comment = CommentForm::from_apub(¬e, context, Some(user.actor_id()?)).await?;
|
||||
|
||||
|
|
|
@ -54,14 +54,17 @@ impl ApubObjectType for Comment {
|
|||
})
|
||||
.await??;
|
||||
|
||||
let maa = collect_non_local_mentions_and_addresses(&self.content, &community, context).await?;
|
||||
let mut maa =
|
||||
collect_non_local_mentions_and_addresses(&self.content, &community, context).await?;
|
||||
let mut ccs = vec![community.actor_id()?];
|
||||
ccs.append(&mut maa.addressed_ccs);
|
||||
|
||||
let mut create = Create::new(creator.actor_id.to_owned(), note.into_any_base()?);
|
||||
create
|
||||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(CreateType::Create)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(maa.addressed_ccs.to_owned())
|
||||
.set_many_ccs(ccs)
|
||||
// Set the mention tags
|
||||
.set_many_tags(maa.get_tags()?);
|
||||
|
||||
|
@ -83,14 +86,17 @@ impl ApubObjectType for Comment {
|
|||
})
|
||||
.await??;
|
||||
|
||||
let maa = collect_non_local_mentions_and_addresses(&self.content, &community, context).await?;
|
||||
let mut maa =
|
||||
collect_non_local_mentions_and_addresses(&self.content, &community, context).await?;
|
||||
let mut ccs = vec![community.actor_id()?];
|
||||
ccs.append(&mut maa.addressed_ccs);
|
||||
|
||||
let mut update = Update::new(creator.actor_id.to_owned(), note.into_any_base()?);
|
||||
update
|
||||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UpdateType::Update)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(maa.addressed_ccs.to_owned())
|
||||
.set_many_ccs(ccs)
|
||||
// Set the mention tags
|
||||
.set_many_tags(maa.get_tags()?);
|
||||
|
||||
|
@ -116,7 +122,7 @@ impl ApubObjectType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DeleteType::Delete)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, delete, context).await?;
|
||||
Ok(())
|
||||
|
@ -144,7 +150,7 @@ impl ApubObjectType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DeleteType::Delete)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
// Undo that fake activity
|
||||
let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
|
||||
|
@ -152,7 +158,7 @@ impl ApubObjectType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UndoType::Undo)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, undo, context).await?;
|
||||
Ok(())
|
||||
|
@ -175,7 +181,7 @@ impl ApubObjectType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(RemoveType::Remove)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&mod_, &community, remove, context).await?;
|
||||
Ok(())
|
||||
|
@ -199,7 +205,7 @@ impl ApubObjectType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(RemoveType::Remove)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
// Undo that fake activity
|
||||
let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
|
||||
|
@ -207,7 +213,7 @@ impl ApubObjectType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UndoType::Undo)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&mod_, &community, undo, context).await?;
|
||||
Ok(())
|
||||
|
@ -233,7 +239,7 @@ impl ApubLikeableType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(LikeType::Like)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, like, context).await?;
|
||||
Ok(())
|
||||
|
@ -256,7 +262,7 @@ impl ApubLikeableType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DislikeType::Dislike)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, dislike, context).await?;
|
||||
Ok(())
|
||||
|
@ -283,7 +289,7 @@ impl ApubLikeableType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DislikeType::Dislike)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
// Undo that fake activity
|
||||
let mut undo = Undo::new(creator.actor_id.to_owned(), like.into_any_base()?);
|
||||
|
@ -291,7 +297,7 @@ impl ApubLikeableType for Comment {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UndoType::Undo)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, undo, context).await?;
|
||||
Ok(())
|
||||
|
|
|
@ -42,7 +42,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(CreateType::Create)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(creator, &community, create, context).await?;
|
||||
Ok(())
|
||||
|
@ -63,7 +63,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UpdateType::Update)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(creator, &community, update, context).await?;
|
||||
Ok(())
|
||||
|
@ -83,7 +83,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DeleteType::Delete)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(creator, &community, delete, context).await?;
|
||||
Ok(())
|
||||
|
@ -107,7 +107,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DeleteType::Delete)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
// Undo that fake activity
|
||||
let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
|
||||
|
@ -115,7 +115,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UndoType::Undo)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(creator, &community, undo, context).await?;
|
||||
Ok(())
|
||||
|
@ -135,7 +135,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(RemoveType::Remove)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(mod_, &community, remove, context).await?;
|
||||
Ok(())
|
||||
|
@ -155,7 +155,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(RemoveType::Remove)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
// Undo that fake activity
|
||||
let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
|
||||
|
@ -163,7 +163,7 @@ impl ApubObjectType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UndoType::Undo)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(mod_, &community, undo, context).await?;
|
||||
Ok(())
|
||||
|
@ -186,7 +186,7 @@ impl ApubLikeableType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(LikeType::Like)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, like, context).await?;
|
||||
Ok(())
|
||||
|
@ -206,7 +206,7 @@ impl ApubLikeableType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DislikeType::Dislike)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, dislike, context).await?;
|
||||
Ok(())
|
||||
|
@ -230,7 +230,7 @@ impl ApubLikeableType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(LikeType::Like)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
// Undo that fake activity
|
||||
let mut undo = Undo::new(creator.actor_id.to_owned(), like.into_any_base()?);
|
||||
|
@ -238,7 +238,7 @@ impl ApubLikeableType for Post {
|
|||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UndoType::Undo)?)
|
||||
.set_to(public())
|
||||
.set_many_ccs(vec![community.get_followers_url()?]);
|
||||
.set_many_ccs(vec![community.actor_id()?]);
|
||||
|
||||
send_to_community(&creator, &community, undo, context).await?;
|
||||
Ok(())
|
||||
|
|
|
@ -30,13 +30,13 @@ impl ApubObjectType for PrivateMessage {
|
|||
let recipient = blocking(context.pool(), move |conn| User_::read(conn, recipient_id)).await??;
|
||||
|
||||
let mut create = Create::new(creator.actor_id.to_owned(), note.into_any_base()?);
|
||||
let to = recipient.get_inbox_url()?;
|
||||
|
||||
create
|
||||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(CreateType::Create)?)
|
||||
.set_to(to.clone());
|
||||
.set_to(recipient.actor_id()?);
|
||||
|
||||
send_activity_single_dest(create, creator, to, context).await?;
|
||||
send_activity_single_dest(create, creator, recipient.get_inbox_url()?, context).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -48,13 +48,12 @@ impl ApubObjectType for PrivateMessage {
|
|||
let recipient = blocking(context.pool(), move |conn| User_::read(conn, recipient_id)).await??;
|
||||
|
||||
let mut update = Update::new(creator.actor_id.to_owned(), note.into_any_base()?);
|
||||
let to = recipient.get_inbox_url()?;
|
||||
update
|
||||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UpdateType::Update)?)
|
||||
.set_to(to.clone());
|
||||
.set_to(recipient.actor_id()?);
|
||||
|
||||
send_activity_single_dest(update, creator, to, context).await?;
|
||||
send_activity_single_dest(update, creator, recipient.get_inbox_url()?, context).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -65,13 +64,12 @@ impl ApubObjectType for PrivateMessage {
|
|||
let recipient = blocking(context.pool(), move |conn| User_::read(conn, recipient_id)).await??;
|
||||
|
||||
let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
|
||||
let to = recipient.get_inbox_url()?;
|
||||
delete
|
||||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DeleteType::Delete)?)
|
||||
.set_to(to.clone());
|
||||
.set_to(recipient.actor_id()?);
|
||||
|
||||
send_activity_single_dest(delete, creator, to, context).await?;
|
||||
send_activity_single_dest(delete, creator, recipient.get_inbox_url()?, context).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -86,20 +84,19 @@ impl ApubObjectType for PrivateMessage {
|
|||
let recipient = blocking(context.pool(), move |conn| User_::read(conn, recipient_id)).await??;
|
||||
|
||||
let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
|
||||
let to = recipient.get_inbox_url()?;
|
||||
delete
|
||||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(DeleteType::Delete)?)
|
||||
.set_to(to.clone());
|
||||
.set_to(recipient.actor_id()?);
|
||||
|
||||
// Undo that fake activity
|
||||
let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
|
||||
undo
|
||||
.set_context(activitystreams::context())
|
||||
.set_id(generate_activity_id(UndoType::Undo)?)
|
||||
.set_to(to.clone());
|
||||
.set_to(recipient.actor_id()?);
|
||||
|
||||
send_activity_single_dest(undo, creator, to, context).await?;
|
||||
send_activity_single_dest(undo, creator, recipient.get_inbox_url()?, context).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ use url::Url;
|
|||
pub async fn send_activity_single_dest<T, Kind>(
|
||||
activity: T,
|
||||
creator: &dyn ActorType,
|
||||
to: Url,
|
||||
inbox: Url,
|
||||
context: &LemmyContext,
|
||||
) -> Result<(), LemmyError>
|
||||
where
|
||||
|
@ -39,13 +39,17 @@ where
|
|||
Kind: Serialize,
|
||||
<T as Extends<Kind>>::Error: From<serde_json::Error> + Send + Sync + 'static,
|
||||
{
|
||||
if check_is_apub_id_valid(&to).is_ok() {
|
||||
debug!("Sending activity {:?} to {}", &activity.id_unchecked(), &to);
|
||||
if check_is_apub_id_valid(&inbox).is_ok() {
|
||||
debug!(
|
||||
"Sending activity {:?} to {}",
|
||||
&activity.id_unchecked(),
|
||||
&inbox
|
||||
);
|
||||
send_activity_internal(
|
||||
context.activity_queue(),
|
||||
activity,
|
||||
creator,
|
||||
vec![to],
|
||||
vec![inbox],
|
||||
context.pool(),
|
||||
true,
|
||||
)
|
||||
|
@ -69,7 +73,7 @@ where
|
|||
// dont send to the local instance, nor to the instance where the activity originally came from,
|
||||
// because that would result in a database error (same data inserted twice)
|
||||
let community_shared_inbox = community.get_shared_inbox_url()?;
|
||||
let to: Vec<Url> = community
|
||||
let follower_inboxes: Vec<Url> = community
|
||||
.get_follower_inboxes(context.pool())
|
||||
.await?
|
||||
.iter()
|
||||
|
@ -89,7 +93,7 @@ where
|
|||
context.activity_queue(),
|
||||
activity,
|
||||
community,
|
||||
to,
|
||||
follower_inboxes,
|
||||
context.pool(),
|
||||
true,
|
||||
)
|
||||
|
@ -177,7 +181,7 @@ async fn send_activity_internal<T, Kind>(
|
|||
activity_sender: &QueueHandle,
|
||||
activity: T,
|
||||
actor: &dyn ActorType,
|
||||
to: Vec<Url>,
|
||||
inboxes: Vec<Url>,
|
||||
pool: &DbPool,
|
||||
insert_into_db: bool,
|
||||
) -> Result<(), LemmyError>
|
||||
|
@ -186,7 +190,7 @@ where
|
|||
Kind: Serialize,
|
||||
<T as Extends<Kind>>::Error: From<serde_json::Error> + Send + Sync + 'static,
|
||||
{
|
||||
if !Settings::get().federation.enabled || to.is_empty() {
|
||||
if !Settings::get().federation.enabled || inboxes.is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
@ -199,10 +203,10 @@ where
|
|||
insert_activity(actor.user_id(), activity.clone(), true, pool).await?;
|
||||
}
|
||||
|
||||
for t in to {
|
||||
for i in inboxes {
|
||||
let message = SendActivityTask {
|
||||
activity: serialised_activity.to_owned(),
|
||||
to: t,
|
||||
inbox: i,
|
||||
actor_id: actor.actor_id()?,
|
||||
private_key: actor.private_key().context(location_info!())?,
|
||||
};
|
||||
|
@ -215,7 +219,7 @@ where
|
|||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
struct SendActivityTask {
|
||||
activity: String,
|
||||
to: Url,
|
||||
inbox: Url,
|
||||
actor_id: Url,
|
||||
private_key: String,
|
||||
}
|
||||
|
@ -235,7 +239,7 @@ impl ActixJob for SendActivityTask {
|
|||
let result = sign_and_send(
|
||||
&state.client,
|
||||
headers,
|
||||
&self.to,
|
||||
&self.inbox,
|
||||
self.activity.clone(),
|
||||
&self.actor_id,
|
||||
self.private_key.to_owned(),
|
||||
|
@ -247,7 +251,7 @@ impl ActixJob for SendActivityTask {
|
|||
return Err(anyhow!(
|
||||
"Failed to send activity {} to {}",
|
||||
&self.activity,
|
||||
self.to
|
||||
self.inbox
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
|
|
|
@ -11,24 +11,17 @@ use crate::{
|
|||
},
|
||||
check_is_apub_id_valid,
|
||||
extensions::signatures::verify,
|
||||
fetcher::{get_or_fetch_and_upsert_actor, get_or_fetch_and_upsert_user},
|
||||
fetcher::get_or_fetch_and_upsert_actor,
|
||||
insert_activity,
|
||||
};
|
||||
use activitystreams::{
|
||||
activity::{ActorAndObject, ActorAndObjectRef},
|
||||
base::AsBase,
|
||||
object::AsObject,
|
||||
prelude::*,
|
||||
};
|
||||
use activitystreams::{activity::ActorAndObject, prelude::*};
|
||||
use actix_web::{web, HttpRequest, HttpResponse};
|
||||
use anyhow::Context;
|
||||
use lemmy_db::user::User_;
|
||||
use lemmy_utils::{location_info, LemmyError};
|
||||
use lemmy_websocket::LemmyContext;
|
||||
use log::debug;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::fmt::Debug;
|
||||
use url::Url;
|
||||
|
||||
#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Deserialize, Serialize)]
|
||||
#[serde(rename_all = "PascalCase")]
|
||||
|
@ -55,22 +48,20 @@ pub async fn shared_inbox(
|
|||
) -> Result<HttpResponse, LemmyError> {
|
||||
let activity = input.into_inner();
|
||||
|
||||
let sender = &activity
|
||||
let actor = activity
|
||||
.actor()?
|
||||
.to_owned()
|
||||
.single_xsd_any_uri()
|
||||
.context(location_info!())?;
|
||||
let community = get_community_id_from_activity(&activity)?;
|
||||
debug!(
|
||||
"Shared inbox received activity {:?} from {}",
|
||||
&activity.id_unchecked(),
|
||||
&sender
|
||||
&actor
|
||||
);
|
||||
|
||||
check_is_apub_id_valid(sender)?;
|
||||
check_is_apub_id_valid(&community)?;
|
||||
check_is_apub_id_valid(&actor)?;
|
||||
|
||||
let actor = get_or_fetch_and_upsert_actor(sender, &context).await?;
|
||||
let actor = get_or_fetch_and_upsert_actor(&actor, &context).await?;
|
||||
verify(&request, actor.as_ref())?;
|
||||
|
||||
let any_base = activity.clone().into_any_base()?;
|
||||
|
@ -89,30 +80,3 @@ pub async fn shared_inbox(
|
|||
insert_activity(actor.user_id(), activity.clone(), false, context.pool()).await?;
|
||||
res
|
||||
}
|
||||
|
||||
pub(in crate) async fn get_user_from_activity<T, A>(
|
||||
activity: &T,
|
||||
context: &LemmyContext,
|
||||
) -> Result<User_, LemmyError>
|
||||
where
|
||||
T: AsBase<A> + ActorAndObjectRef,
|
||||
{
|
||||
let actor = activity.actor()?;
|
||||
let user_uri = actor.as_single_xsd_any_uri().context(location_info!())?;
|
||||
get_or_fetch_and_upsert_user(&user_uri, context).await
|
||||
}
|
||||
|
||||
pub(in crate) fn get_community_id_from_activity<T, A>(activity: &T) -> Result<Url, LemmyError>
|
||||
where
|
||||
T: AsBase<A> + ActorAndObjectRef + AsObject<A>,
|
||||
{
|
||||
let cc = activity.cc().context(location_info!())?;
|
||||
let cc = cc.as_many().context(location_info!())?;
|
||||
Ok(
|
||||
cc.first()
|
||||
.context(location_info!())?
|
||||
.as_xsd_any_uri()
|
||||
.context(location_info!())?
|
||||
.to_owned(),
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue