3 block::{generate_cc, SiteOrCommunity},
4 community::{announce::GetCommunity, send_activity_in_community},
9 activity_lists::AnnouncableActivities,
11 objects::{community::ApubCommunity, instance::remote_instance_inboxes, person::ApubPerson},
12 protocol::activities::block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
15 use activitypub_federation::{
16 core::object_id::ObjectId,
18 traits::{ActivityHandler, Actor},
19 utils::verify_domains_match,
21 use activitystreams_kinds::{activity::UndoType, public};
22 use lemmy_db_schema::{
24 community::{CommunityPersonBan, CommunityPersonBanForm},
25 moderator::{ModBan, ModBanForm, ModBanFromCommunity, ModBanFromCommunityForm},
26 person::{Person, PersonUpdateForm},
28 traits::{Bannable, Crud},
30 use lemmy_utils::error::LemmyError;
31 use lemmy_websocket::LemmyContext;
35 #[tracing::instrument(skip_all)]
37 target: &SiteOrCommunity,
40 reason: Option<String>,
41 context: &LemmyContext,
42 ) -> Result<(), LemmyError> {
43 let block = BlockUser::new(target, user, mod_, None, reason, None, context).await?;
45 let id = generate_activity_id(
47 &context.settings().get_protocol_and_hostname(),
49 let undo = UndoBlockUser {
50 actor: ObjectId::new(mod_.actor_id()),
53 cc: generate_cc(target, context.pool()).await?,
56 unparsed: Default::default(),
59 let mut inboxes = vec![user.shared_inbox_or_inbox()];
61 SiteOrCommunity::Site(_) => {
62 inboxes.append(&mut remote_instance_inboxes(context.pool()).await?);
63 send_lemmy_activity(context, undo, mod_, inboxes, false).await
65 SiteOrCommunity::Community(c) => {
66 let activity = AnnouncableActivities::UndoBlockUser(undo);
67 send_activity_in_community(activity, mod_, c, inboxes, context).await
73 #[async_trait::async_trait(?Send)]
74 impl ActivityHandler for UndoBlockUser {
75 type DataType = LemmyContext;
76 type Error = LemmyError;
78 fn id(&self) -> &Url {
82 fn actor(&self) -> &Url {
86 #[tracing::instrument(skip_all)]
89 context: &Data<LemmyContext>,
90 request_counter: &mut i32,
91 ) -> Result<(), LemmyError> {
92 verify_is_public(&self.to, &self.cc)?;
93 verify_domains_match(self.actor.inner(), self.object.actor.inner())?;
94 self.object.verify(context, request_counter).await?;
98 #[tracing::instrument(skip_all)]
101 context: &Data<LemmyContext>,
102 request_counter: &mut i32,
103 ) -> Result<(), LemmyError> {
104 let instance = local_instance(context).await;
105 let expires = self.object.expires.map(|u| u.naive_local());
106 let mod_person = self
108 .dereference(context, instance, request_counter)
110 let blocked_person = self
113 .dereference(context, instance, request_counter)
118 .dereference(context, instance, request_counter)
121 SiteOrCommunity::Site(_site) => {
122 let blocked_person = Person::update(
125 &PersonUpdateForm::builder()
127 .ban_expires(Some(expires))
133 let form = ModBanForm {
134 mod_person_id: mod_person.id,
135 other_person_id: blocked_person.id,
136 reason: self.object.summary,
140 ModBan::create(context.pool(), &form).await?;
142 SiteOrCommunity::Community(community) => {
143 let community_user_ban_form = CommunityPersonBanForm {
144 community_id: community.id,
145 person_id: blocked_person.id,
148 CommunityPersonBan::unban(context.pool(), &community_user_ban_form).await?;
151 let form = ModBanFromCommunityForm {
152 mod_person_id: mod_person.id,
153 other_person_id: blocked_person.id,
154 community_id: community.id,
155 reason: self.object.summary,
159 ModBanFromCommunity::create(context.pool(), &form).await?;
167 #[async_trait::async_trait(?Send)]
168 impl GetCommunity for UndoBlockUser {
169 #[tracing::instrument(skip_all)]
170 async fn get_community(
172 context: &LemmyContext,
173 request_counter: &mut i32,
174 ) -> Result<ApubCommunity, LemmyError> {
175 self.object.get_community(context, request_counter).await