X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Factivities%2Ffollowing%2Fundo_follow.rs;h=c36b36df8cb4c118464387c6690d687114d7ccdc;hb=e9e76549a88cfbdab36f00d302cceabcaaa24f4c;hp=94b0b68ecef5569930fe91b57c12a40c5ed2280c;hpb=b0c318566342740c5c97dd4b4d341fc2902607e0;p=lemmy.git diff --git a/crates/apub/src/activities/following/undo_follow.rs b/crates/apub/src/activities/following/undo_follow.rs index 94b0b68e..c36b36df 100644 --- a/crates/apub/src/activities/following/undo_follow.rs +++ b/crates/apub/src/activities/following/undo_follow.rs @@ -1,51 +1,52 @@ use crate::{ activities::{generate_activity_id, send_lemmy_activity, verify_person}, - local_instance, + fetcher::user_or_community::UserOrCommunity, + insert_received_activity, objects::{community::ApubCommunity, person::ApubPerson}, - protocol::activities::following::{follow::FollowCommunity, undo_follow::UndoFollowCommunity}, - ActorType, + protocol::activities::following::{follow::Follow, undo_follow::UndoFollow}, }; use activitypub_federation::{ - core::object_id::ObjectId, - data::Data, + config::Data, + kinds::activity::UndoType, + protocol::verification::verify_urls_match, traits::{ActivityHandler, Actor}, - utils::verify_urls_match, }; -use activitystreams_kinds::activity::UndoType; -use lemmy_api_common::utils::blocking; +use lemmy_api_common::context::LemmyContext; use lemmy_db_schema::{ - source::community::{CommunityFollower, CommunityFollowerForm}, + source::{ + community::{CommunityFollower, CommunityFollowerForm}, + person::{PersonFollower, PersonFollowerForm}, + }, traits::Followable, }; use lemmy_utils::error::LemmyError; -use lemmy_websocket::LemmyContext; use url::Url; -impl UndoFollowCommunity { +impl UndoFollow { #[tracing::instrument(skip_all)] pub async fn send( actor: &ApubPerson, community: &ApubCommunity, - context: &LemmyContext, + context: &Data, ) -> Result<(), LemmyError> { - let object = FollowCommunity::new(actor, community, context)?; - let undo = UndoFollowCommunity { - actor: ObjectId::new(actor.actor_id()), + let object = Follow::new(actor, community, context)?; + let undo = UndoFollow { + actor: actor.id().into(), + to: Some([community.id().into()]), object, kind: UndoType::Undo, id: generate_activity_id( UndoType::Undo, &context.settings().get_protocol_and_hostname(), )?, - unparsed: Default::default(), }; let inbox = vec![community.shared_inbox_or_inbox()]; send_lemmy_activity(context, undo, actor, inbox, true).await } } -#[async_trait::async_trait(?Send)] -impl ActivityHandler for UndoFollowCommunity { +#[async_trait::async_trait] +impl ActivityHandler for UndoFollow { type DataType = LemmyContext; type Error = LemmyError; @@ -58,44 +59,41 @@ impl ActivityHandler for UndoFollowCommunity { } #[tracing::instrument(skip_all)] - async fn verify( - &self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { + async fn verify(&self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; verify_urls_match(self.actor.inner(), self.object.actor.inner())?; - verify_person(&self.actor, context, request_counter).await?; - self.object.verify(context, request_counter).await?; + verify_person(&self.actor, context).await?; + self.object.verify(context).await?; + if let Some(to) = &self.to { + verify_urls_match(to[0].inner(), self.object.object.inner())?; + } Ok(()) } #[tracing::instrument(skip_all)] - async fn receive( - self, - context: &Data, - request_counter: &mut i32, - ) -> Result<(), LemmyError> { - let person = self - .actor - .dereference(context, local_instance(context), request_counter) - .await?; - let community = self - .object - .object - .dereference(context, local_instance(context), request_counter) - .await?; + async fn receive(self, context: &Data) -> Result<(), LemmyError> { + let person = self.actor.dereference(context).await?; + let object = self.object.object.dereference(context).await?; - let community_follower_form = CommunityFollowerForm { - community_id: community.id, - person_id: person.id, - pending: false, - }; + match object { + UserOrCommunity::User(u) => { + let form = PersonFollowerForm { + person_id: u.id, + follower_id: person.id, + pending: false, + }; + PersonFollower::unfollow(&mut context.pool(), &form).await?; + } + UserOrCommunity::Community(c) => { + let form = CommunityFollowerForm { + community_id: c.id, + person_id: person.id, + pending: false, + }; + CommunityFollower::unfollow(&mut context.pool(), &form).await?; + } + } - // This will fail if they aren't a follower, but ignore the error. - blocking(context.pool(), move |conn| { - CommunityFollower::unfollow(conn, &community_follower_form).ok() - }) - .await?; Ok(()) } }