From 7485f1a5b4993ce7928d792b1955b3b6af3ed542 Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 5 May 2020 02:04:48 +0200 Subject: [PATCH] Federate nsfw/locked info for posts --- server/src/api/site.rs | 6 +++--- server/src/apub/fetcher.rs | 2 +- server/src/apub/mod.rs | 4 ++++ server/src/apub/page_extension.rs | 10 ++++++++++ server/src/apub/post.rs | 30 +++++++++++++++++++----------- server/src/apub/shared_inbox.rs | 18 +++++++++--------- 6 files changed, 46 insertions(+), 24 deletions(-) create mode 100644 server/src/apub/page_extension.rs diff --git a/server/src/api/site.rs b/server/src/api/site.rs index 346b4e503..1a4ed0be5 100644 --- a/server/src/api/site.rs +++ b/server/src/api/site.rs @@ -359,9 +359,9 @@ impl Perform for Oper { let create_site = CreateSite { name: setup.site_name.to_owned(), description: None, - enable_downvotes: false, - open_registration: false, - enable_nsfw: false, + enable_downvotes: true, + open_registration: true, + enable_nsfw: true, auth: login_response.jwt, }; Oper::new(create_site).perform(pool, websocket_info.clone())?; diff --git a/server/src/apub/fetcher.rs b/server/src/apub/fetcher.rs index 8a4b88554..9db6755a2 100644 --- a/server/src/apub/fetcher.rs +++ b/server/src/apub/fetcher.rs @@ -39,7 +39,7 @@ where pub enum SearchAcceptedObjects { Person(Box), Group(Box), - Page(Box), + Page(Box), } /// Attempt to parse the query as URL, and fetch an ActivityPub object from it. diff --git a/server/src/apub/mod.rs b/server/src/apub/mod.rs index 40f4322ea..3c6a00600 100644 --- a/server/src/apub/mod.rs +++ b/server/src/apub/mod.rs @@ -3,6 +3,7 @@ pub mod comment; pub mod community; pub mod community_inbox; pub mod fetcher; +pub mod page_extension; pub mod post; pub mod shared_inbox; pub mod signatures; @@ -65,7 +66,9 @@ use crate::websocket::{ }; use crate::{convert_datetime, naive_now, Settings}; +use crate::apub::page_extension::PageExtension; use activities::{populate_object_props, send_activity}; +use activitystreams::Base; use chrono::NaiveDateTime; use fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user}; use signatures::verify; @@ -73,6 +76,7 @@ use signatures::{sign, PublicKey, PublicKeyExtension}; type GroupExt = Ext, PublicKeyExtension>; type PersonExt = Ext, PublicKeyExtension>; +type PageExt = Ext; pub static APUB_JSON_CONTENT_TYPE: &str = "application/activity+json"; diff --git a/server/src/apub/page_extension.rs b/server/src/apub/page_extension.rs new file mode 100644 index 000000000..03b145ec8 --- /dev/null +++ b/server/src/apub/page_extension.rs @@ -0,0 +1,10 @@ +use super::*; + +#[derive(Clone, Debug, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct PageExtension { + pub comments_enabled: bool, + pub sensitive: bool, +} + +impl Extension for PageExtension where T: Base {} diff --git a/server/src/apub/post.rs b/server/src/apub/post.rs index 61fbf827c..8a13d3907 100644 --- a/server/src/apub/post.rs +++ b/server/src/apub/post.rs @@ -20,10 +20,10 @@ pub async fn get_apub_post( } impl ToApub for Post { - type Response = Page; + type Response = PageExt; // Turn a Lemmy post into an ActivityPub page that can be sent out over the network. - fn to_apub(&self, conn: &PgConnection) -> Result { + fn to_apub(&self, conn: &PgConnection) -> Result { let mut page = Page::default(); let oprops: &mut ObjectProperties = page.as_mut(); let creator = User_::read(conn, self.creator_id)?; @@ -31,6 +31,8 @@ impl ToApub for Post { oprops // Not needed when the Post is embedded in a collection (like for community outbox) + // TODO: need to set proper context defining sensitive/commentsEnabled fields + // https://git.asonix.dog/Aardwolf/activitystreams/issues/5 .set_context_xsd_any_uri(context())? .set_id(self.ap_id.to_owned())? // Use summary field to be consistent with mastodon content warning. @@ -45,7 +47,7 @@ impl ToApub for Post { } // TODO: hacky code because we get self.url == Some("") - // https://github.com/dessalines/lemmy/issues/602 + // https://github.com/LemmyNet/lemmy/issues/602 let url = self.url.as_ref().filter(|u| !u.is_empty()); if let Some(u) = url { oprops.set_url_xsd_any_uri(u.to_owned())?; @@ -55,7 +57,11 @@ impl ToApub for Post { oprops.set_updated(convert_datetime(u))?; } - Ok(page) + let ext = PageExtension { + comments_enabled: !self.locked, + sensitive: self.nsfw, + }; + Ok(page.extend(ext)) } fn to_tombstone(&self) -> Result { @@ -69,10 +75,12 @@ impl ToApub for Post { } impl FromApub for PostForm { - type ApubType = Page; + type ApubType = PageExt; /// Parse an ActivityPub page received from another instance into a Lemmy post. - fn from_apub(page: &Page, conn: &PgConnection) -> Result { + fn from_apub(page: &PageExt, conn: &PgConnection) -> Result { + let ext = &page.extension; + let page = &page.base; let oprops = &page.object_props; let creator_actor_id = &oprops.get_attributed_to_xsd_any_uri().unwrap().to_string(); let creator = get_or_fetch_and_upsert_remote_user(&creator_actor_id, &conn)?; @@ -85,18 +93,18 @@ impl FromApub for PostForm { body: oprops.get_content_xsd_string().map(|c| c.to_string()), creator_id: creator.id, community_id: community.id, - removed: None, // -> Delete activity / tombstone - locked: None, // -> commentsEnabled + removed: None, + locked: Some(!ext.comments_enabled), published: oprops .get_published() .map(|u| u.as_ref().to_owned().naive_local()), updated: oprops .get_updated() .map(|u| u.as_ref().to_owned().naive_local()), - deleted: None, // -> Delete activity / tombstone - nsfw: false, // -> sensitive + deleted: None, + nsfw: ext.sensitive, stickied: None, // -> put it in "featured" collection of the community - embed_title: None, // -> attachment? + embed_title: None, // -> attachment? or fetch the embed locally embed_description: None, embed_html: None, thumbnail_url: None, diff --git a/server/src/apub/shared_inbox.rs b/server/src/apub/shared_inbox.rs index 4b29c3976..a409d70b6 100644 --- a/server/src/apub/shared_inbox.rs +++ b/server/src/apub/shared_inbox.rs @@ -110,7 +110,7 @@ fn receive_create_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let user_uri = create .create_props @@ -213,7 +213,7 @@ fn receive_update_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let user_uri = update .update_props @@ -263,7 +263,7 @@ fn receive_like_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let user_uri = like.like_props.get_actor_xsd_any_uri().unwrap().to_string(); @@ -316,7 +316,7 @@ fn receive_dislike_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let user_uri = dislike .dislike_props @@ -692,7 +692,7 @@ fn receive_delete_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, &conn)?; verify(request, &user.public_key.unwrap())?; @@ -763,7 +763,7 @@ fn receive_remove_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, &conn)?; verify(request, &mod_.public_key.unwrap())?; @@ -1166,7 +1166,7 @@ fn receive_undo_delete_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, &conn)?; verify(request, &user.public_key.unwrap())?; @@ -1237,7 +1237,7 @@ fn receive_undo_remove_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, &conn)?; verify(request, &mod_.public_key.unwrap())?; @@ -1526,7 +1526,7 @@ fn receive_undo_like_post( .to_owned() .unwrap() .to_owned() - .into_concrete::()?; + .into_concrete::()?; let user_uri = like.like_props.get_actor_xsd_any_uri().unwrap().to_string();