X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Factivities%2Ffollowing%2Ffollow.rs;h=2f0f5037aed69d6d3abed8572bb0a5afe2b68f1c;hb=e9e76549a88cfbdab36f00d302cceabcaaa24f4c;hp=82c0c37a5942b1a244f7153720b11a47b9cf84fb;hpb=030afbc2e78a91b1a302ca59c4ea0ccef9057019;p=lemmy.git diff --git a/crates/apub/src/activities/following/follow.rs b/crates/apub/src/activities/following/follow.rs index 82c0c37a..2f0f5037 100644 --- a/crates/apub/src/activities/following/follow.rs +++ b/crates/apub/src/activities/following/follow.rs @@ -6,24 +6,32 @@ use crate::{ verify_person_in_community, }, fetcher::user_or_community::UserOrCommunity, - local_instance, + insert_received_activity, objects::{community::ApubCommunity, person::ApubPerson}, - protocol::activities::following::{accept::AcceptFollow, follow::Follow}, - ActorType, + protocol::activities::following::{ + accept::AcceptFollow, + follow::Follow, + undo_follow::UndoFollow, + }, + SendActivity, }; use activitypub_federation::{ - core::object_id::ObjectId, - data::Data, + config::Data, + kinds::activity::FollowType, + protocol::verification::verify_urls_match, traits::{ActivityHandler, Actor}, }; -use activitystreams_kinds::activity::FollowType; -use lemmy_api_common::LemmyContext; +use lemmy_api_common::{ + community::{BlockCommunity, BlockCommunityResponse}, + context::LemmyContext, + utils::local_user_view_from_jwt, +}; use lemmy_db_schema::{ source::{ - community::{CommunityFollower, CommunityFollowerForm}, + community::{Community, CommunityFollower, CommunityFollowerForm}, person::{PersonFollower, PersonFollowerForm}, }, - traits::Followable, + traits::{Crud, Followable}, }; use lemmy_utils::error::LemmyError; use url::Url; @@ -32,11 +40,12 @@ impl Follow { pub(in crate::activities::following) fn new( actor: &ApubPerson, community: &ApubCommunity, - context: &LemmyContext, + context: &Data, ) -> Result { Ok(Follow { - actor: ObjectId::new(actor.actor_id()), - object: ObjectId::new(community.actor_id()), + actor: actor.id().into(), + object: community.id().into(), + to: Some([community.id().into()]), kind: FollowType::Follow, id: generate_activity_id( FollowType::Follow, @@ -49,14 +58,14 @@ impl Follow { pub async fn send( actor: &ApubPerson, community: &ApubCommunity, - context: &LemmyContext, + context: &Data, ) -> Result<(), LemmyError> { let community_follower_form = CommunityFollowerForm { community_id: community.id, person_id: actor.id, pending: true, }; - CommunityFollower::follow(context.pool(), &community_follower_form) + CommunityFollower::follow(&mut context.pool(), &community_follower_form) .await .ok(); @@ -66,7 +75,7 @@ impl Follow { } } -#[async_trait::async_trait(?Send)] +#[async_trait::async_trait] impl ActivityHandler for Follow { type DataType = LemmyContext; type Error = LemmyError; @@ -80,36 +89,23 @@ impl ActivityHandler for Follow { } #[tracing::instrument(skip_all)] - async fn verify( - &self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { - verify_person(&self.actor, context, request_counter).await?; - let object = self - .object - .dereference(context, local_instance(context).await, request_counter) - .await?; + async fn verify(&self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; + verify_person(&self.actor, context).await?; + let object = self.object.dereference(context).await?; if let UserOrCommunity::Community(c) = object { - verify_person_in_community(&self.actor, &c, context, request_counter).await?; + verify_person_in_community(&self.actor, &c, context).await?; + } + if let Some(to) = &self.to { + verify_urls_match(to[0].inner(), self.object.inner())?; } Ok(()) } #[tracing::instrument(skip_all)] - async fn receive( - self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { - let actor = self - .actor - .dereference(context, local_instance(context).await, request_counter) - .await?; - let object = self - .object - .dereference(context, local_instance(context).await, request_counter) - .await?; + async fn receive(self, context: &Data) -> Result<(), LemmyError> { + let actor = self.actor.dereference(context).await?; + let object = self.object.dereference(context).await?; match object { UserOrCommunity::User(u) => { let form = PersonFollowerForm { @@ -117,7 +113,7 @@ impl ActivityHandler for Follow { follower_id: actor.id, pending: false, }; - PersonFollower::follow(context.pool(), &form).await?; + PersonFollower::follow(&mut context.pool(), &form).await?; } UserOrCommunity::Community(c) => { let form = CommunityFollowerForm { @@ -125,10 +121,25 @@ impl ActivityHandler for Follow { person_id: actor.id, pending: false, }; - CommunityFollower::follow(context.pool(), &form).await?; + CommunityFollower::follow(&mut context.pool(), &form).await?; } } - AcceptFollow::send(self, context, request_counter).await + AcceptFollow::send(self, context).await + } +} + +#[async_trait::async_trait] +impl SendActivity for BlockCommunity { + type Response = BlockCommunityResponse; + + async fn send_activity( + request: &Self, + _response: &Self::Response, + context: &Data, + ) -> Result<(), LemmyError> { + let local_user_view = local_user_view_from_jwt(&request.auth, context).await?; + let community = Community::read(&mut context.pool(), request.community_id).await?; + UndoFollow::send(&local_user_view.person.into(), &community.into(), context).await } }