3 block::{generate_cc, SiteOrCommunity},
4 community::{announce::GetCommunity, send_activity_in_community},
9 activity_lists::AnnouncableActivities,
11 fetch_local_site_data,
13 objects::{community::ApubCommunity, instance::remote_instance_inboxes, person::ApubPerson},
14 protocol::activities::block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
17 use activitypub_federation::{
18 core::object_id::ObjectId,
20 traits::{ActivityHandler, Actor},
21 utils::verify_domains_match,
23 use activitystreams_kinds::{activity::UndoType, public};
24 use lemmy_api_common::utils::blocking;
25 use lemmy_db_schema::{
27 community::{CommunityPersonBan, CommunityPersonBanForm},
28 moderator::{ModBan, ModBanForm, ModBanFromCommunity, ModBanFromCommunityForm},
29 person::{Person, PersonUpdateForm},
31 traits::{Bannable, Crud},
33 use lemmy_utils::error::LemmyError;
34 use lemmy_websocket::LemmyContext;
38 #[tracing::instrument(skip_all)]
40 target: &SiteOrCommunity,
43 reason: Option<String>,
44 context: &LemmyContext,
45 ) -> Result<(), LemmyError> {
46 let block = BlockUser::new(target, user, mod_, None, reason, None, context).await?;
48 let id = generate_activity_id(
50 &context.settings().get_protocol_and_hostname(),
52 let undo = UndoBlockUser {
53 actor: ObjectId::new(mod_.actor_id()),
56 cc: generate_cc(target, context.pool()).await?,
59 unparsed: Default::default(),
62 let mut inboxes = vec![user.shared_inbox_or_inbox()];
64 SiteOrCommunity::Site(_) => {
65 inboxes.append(&mut remote_instance_inboxes(context.pool()).await?);
66 send_lemmy_activity(context, undo, mod_, inboxes, false).await
68 SiteOrCommunity::Community(c) => {
69 let activity = AnnouncableActivities::UndoBlockUser(undo);
70 send_activity_in_community(activity, mod_, c, inboxes, context).await
76 #[async_trait::async_trait(?Send)]
77 impl ActivityHandler for UndoBlockUser {
78 type DataType = LemmyContext;
79 type Error = LemmyError;
81 fn id(&self) -> &Url {
85 fn actor(&self) -> &Url {
89 #[tracing::instrument(skip_all)]
92 context: &Data<LemmyContext>,
93 request_counter: &mut i32,
94 ) -> Result<(), LemmyError> {
95 let local_site_data = blocking(context.pool(), fetch_local_site_data).await??;
96 check_apub_id_valid(self.id(), &local_site_data, context.settings())
97 .map_err(LemmyError::from_message)?;
99 verify_is_public(&self.to, &self.cc)?;
100 verify_domains_match(self.actor.inner(), self.object.actor.inner())?;
101 self.object.verify(context, request_counter).await?;
105 #[tracing::instrument(skip_all)]
108 context: &Data<LemmyContext>,
109 request_counter: &mut i32,
110 ) -> Result<(), LemmyError> {
111 let instance = local_instance(context);
112 let expires = self.object.expires.map(|u| u.naive_local());
113 let mod_person = self
115 .dereference(context, instance, request_counter)
117 let blocked_person = self
120 .dereference(context, instance, request_counter)
125 .dereference(context, instance, request_counter)
128 SiteOrCommunity::Site(_site) => {
129 let blocked_person = blocking(context.pool(), move |conn| {
133 &PersonUpdateForm::builder()
135 .ban_expires(Some(expires))
142 let form = ModBanForm {
143 mod_person_id: mod_person.id,
144 other_person_id: blocked_person.id,
145 reason: self.object.summary,
149 blocking(context.pool(), move |conn| ModBan::create(conn, &form)).await??;
151 SiteOrCommunity::Community(community) => {
152 let community_user_ban_form = CommunityPersonBanForm {
153 community_id: community.id,
154 person_id: blocked_person.id,
157 blocking(context.pool(), move |conn: &mut _| {
158 CommunityPersonBan::unban(conn, &community_user_ban_form)
163 let form = ModBanFromCommunityForm {
164 mod_person_id: mod_person.id,
165 other_person_id: blocked_person.id,
166 community_id: community.id,
167 reason: self.object.summary,
171 blocking(context.pool(), move |conn| {
172 ModBanFromCommunity::create(conn, &form)
182 #[async_trait::async_trait(?Send)]
183 impl GetCommunity for UndoBlockUser {
184 #[tracing::instrument(skip_all)]
185 async fn get_community(
187 context: &LemmyContext,
188 request_counter: &mut i32,
189 ) -> Result<ApubCommunity, LemmyError> {
190 self.object.get_community(context, request_counter).await