X-Git-Url: http://these/git/?a=blobdiff_plain;f=crates%2Fapub%2Fsrc%2Fprotocol%2Fobjects%2Fgroup.rs;h=9c679fdf10a6bd6b5f87281e1e616fe67305dd05;hb=3471f3533cb724b2cf6953d563aadfcc9f66c1d2;hp=316af1a8dc7d4834c5a34d08fd7ae01d546e920c;hpb=030afbc2e78a91b1a302ca59c4ea0ccef9057019;p=lemmy.git diff --git a/crates/apub/src/protocol/objects/group.rs b/crates/apub/src/protocol/objects/group.rs index 316af1a8..9c679fdf 100644 --- a/crates/apub/src/protocol/objects/group.rs +++ b/crates/apub/src/protocol/objects/group.rs @@ -1,10 +1,11 @@ use crate::{ check_apub_id_valid_with_strictness, collections::{ + community_featured::ApubCommunityFeatured, community_moderators::ApubCommunityModerators, community_outbox::ApubCommunityOutbox, }, - fetch_local_site_data, + local_site_data_cached, objects::{community::ApubCommunity, read_from_string_or_source_opt}, protocol::{ objects::{Endpoints, LanguageTag}, @@ -13,13 +14,19 @@ use crate::{ }, }; use activitypub_federation::{ - core::{object_id::ObjectId, signatures::PublicKey}, - deser::helpers::deserialize_skip_error, - utils::verify_domains_match, + fetch::{collection_id::CollectionId, object_id::ObjectId}, + kinds::actor::GroupType, + protocol::{ + helpers::deserialize_skip_error, + public_key::PublicKey, + verification::verify_domains_match, + }, }; -use activitystreams_kinds::actor::GroupType; use chrono::{DateTime, FixedOffset}; -use lemmy_api_common::{utils::local_site_opt_to_slur_regex, LemmyContext}; +use lemmy_api_common::{ + context::LemmyContext, + utils::{local_site_opt_to_slur_regex, sanitize_html, sanitize_html_opt}, +}; use lemmy_db_schema::{ newtypes::InstanceId, source::community::{CommunityInsertForm, CommunityUpdateForm}, @@ -27,10 +34,11 @@ use lemmy_db_schema::{ }; use lemmy_utils::{ error::LemmyError, - utils::{check_slurs, check_slurs_opt}, + utils::slurs::{check_slurs, check_slurs_opt}, }; use serde::{Deserialize, Serialize}; use serde_with::skip_serializing_none; +use std::fmt::Debug; use url::Url; #[skip_serializing_none] @@ -56,14 +64,13 @@ pub struct Group { pub(crate) image: Option, // lemmy extension pub(crate) sensitive: Option, - // deprecated, use attributed_to instead - pub(crate) moderators: Option>, #[serde(deserialize_with = "deserialize_skip_error", default)] - pub(crate) attributed_to: Option>, + pub(crate) attributed_to: Option>, // lemmy extension pub(crate) posting_restricted_to_mods: Option, - pub(crate) outbox: ObjectId, + pub(crate) outbox: CollectionId, pub(crate) endpoints: Option, + pub(crate) featured: Option>, #[serde(default)] pub(crate) language: Vec, pub(crate) published: Option>, @@ -76,16 +83,10 @@ impl Group { expected_domain: &Url, context: &LemmyContext, ) -> Result<(), LemmyError> { - let local_site_data = fetch_local_site_data(context.pool()).await?; - - check_apub_id_valid_with_strictness( - self.id.inner(), - true, - &local_site_data, - context.settings(), - )?; + check_apub_id_valid_with_strictness(self.id.inner(), true, context).await?; verify_domains_match(expected_domain, self.id.inner())?; + let local_site_data = local_site_data_cached(&mut context.pool()).await?; let slur_regex = &local_site_opt_to_slur_regex(&local_site_data.local_site); check_slurs(&self.preferred_username, slur_regex)?; @@ -96,10 +97,15 @@ impl Group { } pub(crate) fn into_insert_form(self, instance_id: InstanceId) -> CommunityInsertForm { + let name = sanitize_html(&self.preferred_username); + let title = sanitize_html(&self.name.unwrap_or(self.preferred_username)); + let description = read_from_string_or_source_opt(&self.summary, &None, &self.source); + let description = sanitize_html_opt(&description); + CommunityInsertForm { - name: self.preferred_username.clone(), - title: self.name.unwrap_or(self.preferred_username), - description: read_from_string_or_source_opt(&self.summary, &None, &self.source), + name, + title, + description, removed: None, published: self.published.map(|u| u.naive_local()), updated: self.updated.map(|u| u.naive_local()), @@ -108,7 +114,7 @@ impl Group { actor_id: Some(self.id.into()), local: Some(false), private_key: None, - hidden: Some(false), + hidden: None, public_key: self.public_key.public_key_pem, last_refreshed_at: Some(naive_now()), icon: self.icon.map(|i| i.url.into()), @@ -116,8 +122,10 @@ impl Group { followers_url: Some(self.followers.into()), inbox_url: Some(self.inbox.into()), shared_inbox_url: self.endpoints.map(|e| e.shared_inbox.into()), + moderators_url: self.attributed_to.map(Into::into), posting_restricted_to_mods: self.posting_restricted_to_mods, instance_id, + featured_url: self.featured.map(Into::into), } } @@ -135,9 +143,9 @@ impl Group { deleted: None, nsfw: Some(self.sensitive.unwrap_or(false)), actor_id: Some(self.id.into()), - local: Some(false), + local: None, private_key: None, - hidden: Some(false), + hidden: None, public_key: Some(self.public_key.public_key_pem), last_refreshed_at: Some(naive_now()), icon: Some(self.icon.map(|i| i.url.into())), @@ -145,7 +153,9 @@ impl Group { followers_url: Some(self.followers.into()), inbox_url: Some(self.inbox.into()), shared_inbox_url: Some(self.endpoints.map(|e| e.shared_inbox.into())), + moderators_url: self.attributed_to.map(Into::into), posting_restricted_to_mods: self.posting_restricted_to_mods, + featured_url: self.featured.map(Into::into), } } }