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?,
58 let mut inboxes = vec![user.shared_inbox_or_inbox()];
60 SiteOrCommunity::Site(_) => {
61 inboxes.append(&mut remote_instance_inboxes(context.pool()).await?);
62 send_lemmy_activity(context, undo, mod_, inboxes, false).await
64 SiteOrCommunity::Community(c) => {
65 let activity = AnnouncableActivities::UndoBlockUser(undo);
66 send_activity_in_community(activity, mod_, c, inboxes, true, context).await
72 #[async_trait::async_trait(?Send)]
73 impl ActivityHandler for UndoBlockUser {
74 type DataType = LemmyContext;
75 type Error = LemmyError;
77 fn id(&self) -> &Url {
81 fn actor(&self) -> &Url {
85 #[tracing::instrument(skip_all)]
88 context: &Data<LemmyContext>,
89 request_counter: &mut i32,
90 ) -> Result<(), LemmyError> {
91 verify_is_public(&self.to, &self.cc)?;
92 verify_domains_match(self.actor.inner(), self.object.actor.inner())?;
93 self.object.verify(context, request_counter).await?;
97 #[tracing::instrument(skip_all)]
100 context: &Data<LemmyContext>,
101 request_counter: &mut i32,
102 ) -> Result<(), LemmyError> {
103 let instance = local_instance(context).await;
104 let expires = self.object.expires.map(|u| u.naive_local());
105 let mod_person = self
107 .dereference(context, instance, request_counter)
109 let blocked_person = self
112 .dereference(context, instance, request_counter)
117 .dereference(context, instance, request_counter)
120 SiteOrCommunity::Site(_site) => {
121 let blocked_person = Person::update(
124 &PersonUpdateForm::builder()
126 .ban_expires(Some(expires))
132 let form = ModBanForm {
133 mod_person_id: mod_person.id,
134 other_person_id: blocked_person.id,
135 reason: self.object.summary,
139 ModBan::create(context.pool(), &form).await?;
141 SiteOrCommunity::Community(community) => {
142 let community_user_ban_form = CommunityPersonBanForm {
143 community_id: community.id,
144 person_id: blocked_person.id,
147 CommunityPersonBan::unban(context.pool(), &community_user_ban_form).await?;
150 let form = ModBanFromCommunityForm {
151 mod_person_id: mod_person.id,
152 other_person_id: blocked_person.id,
153 community_id: community.id,
154 reason: self.object.summary,
158 ModBanFromCommunity::create(context.pool(), &form).await?;
166 #[async_trait::async_trait(?Send)]
167 impl GetCommunity for UndoBlockUser {
168 #[tracing::instrument(skip_all)]
169 async fn get_community(
171 context: &LemmyContext,
172 request_counter: &mut i32,
173 ) -> Result<ApubCommunity, LemmyError> {
174 self.object.get_community(context, request_counter).await