From 7c55a841842fe2ce4134d976ba667ef74728ba13 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 15 Jul 2020 19:56:14 +0200 Subject: [PATCH 1/6] Migrate extensions to new activitystreams library --- .../src/apub/extensions/group_extensions.rs | 23 +++++++++++++++++-- server/src/apub/extensions/page_extension.rs | 23 +++++++++++++++++-- server/src/apub/extensions/signatures.rs | 21 +++++++++++++++-- 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/server/src/apub/extensions/group_extensions.rs b/server/src/apub/extensions/group_extensions.rs index 2120f6f1..7dc42c4a 100644 --- a/server/src/apub/extensions/group_extensions.rs +++ b/server/src/apub/extensions/group_extensions.rs @@ -1,5 +1,6 @@ use crate::LemmyError; -use activitystreams::{ext::Extension, Actor}; +use activitystreams_ext::UnparsedExtension; +use activitystreams_new::unparsed::UnparsedMutExt; use diesel::PgConnection; use lemmy_db::{category::Category, Crud}; use serde::{Deserialize, Serialize}; @@ -37,4 +38,22 @@ impl GroupExtension { } } -impl Extension for GroupExtension where T: Actor {} +impl UnparsedExtension for GroupExtension +where + U: UnparsedMutExt, +{ + type Error = serde_json::Error; + + fn try_from_unparsed(unparsed_mut: &mut U) -> Result { + Ok(GroupExtension { + category: unparsed_mut.remove("category")?, + sensitive: unparsed_mut.remove("sensitive")?, + }) + } + + fn try_into_unparsed(self, unparsed_mut: &mut U) -> Result<(), Self::Error> { + unparsed_mut.insert("category", self.category)?; + unparsed_mut.insert("sensitive", self.sensitive)?; + Ok(()) + } +} diff --git a/server/src/apub/extensions/page_extension.rs b/server/src/apub/extensions/page_extension.rs index 484807e3..9851a013 100644 --- a/server/src/apub/extensions/page_extension.rs +++ b/server/src/apub/extensions/page_extension.rs @@ -1,4 +1,5 @@ -use activitystreams::{ext::Extension, Base}; +use activitystreams_ext::UnparsedExtension; +use activitystreams_new::unparsed::UnparsedMutExt; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Default, Deserialize, Serialize)] @@ -8,4 +9,22 @@ pub struct PageExtension { pub sensitive: bool, } -impl Extension for PageExtension where T: Base {} +impl UnparsedExtension for PageExtension +where + U: UnparsedMutExt, +{ + type Error = serde_json::Error; + + fn try_from_unparsed(unparsed_mut: &mut U) -> Result { + Ok(PageExtension { + comments_enabled: unparsed_mut.remove("commentsEnabled")?, + sensitive: unparsed_mut.remove("sensitive")?, + }) + } + + fn try_into_unparsed(self, unparsed_mut: &mut U) -> Result<(), Self::Error> { + unparsed_mut.insert("commentsEnabled", self.comments_enabled)?; + unparsed_mut.insert("sensitive", self.sensitive)?; + Ok(()) + } +} diff --git a/server/src/apub/extensions/signatures.rs b/server/src/apub/extensions/signatures.rs index 1c930a95..468e820e 100644 --- a/server/src/apub/extensions/signatures.rs +++ b/server/src/apub/extensions/signatures.rs @@ -1,5 +1,6 @@ use crate::{apub::ActorType, LemmyError}; -use activitystreams::ext::Extension; +use activitystreams_ext::UnparsedExtension; +use activitystreams_new::unparsed::UnparsedMutExt; use actix_web::{client::ClientRequest, HttpRequest}; use http_signature_normalization_actix::{ digest::{DigestClient, SignExt}, @@ -98,4 +99,20 @@ impl PublicKey { } } -impl Extension for PublicKeyExtension where T: activitystreams::Actor {} +impl UnparsedExtension for PublicKeyExtension +where + U: UnparsedMutExt, +{ + type Error = serde_json::Error; + + fn try_from_unparsed(unparsed_mut: &mut U) -> Result { + Ok(PublicKeyExtension { + public_key: unparsed_mut.remove("publicKey")?, + }) + } + + fn try_into_unparsed(self, unparsed_mut: &mut U) -> Result<(), Self::Error> { + unparsed_mut.insert("publicKey", self.public_key)?; + Ok(()) + } +} -- 2.40.1 From 5417cb8476050121aa9458a9ac82c97463d7a0f2 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 15 Jul 2020 19:59:37 +0200 Subject: [PATCH 2/6] Migrate community activities --- server/src/apub/community.rs | 135 ++++++++++++----------------- server/src/apub/community_inbox.rs | 2 +- server/src/apub/mod.rs | 2 +- server/src/apub/user.rs | 3 +- 4 files changed, 59 insertions(+), 83 deletions(-) diff --git a/server/src/apub/community.rs b/server/src/apub/community.rs index d6869b2e..37ac9da9 100644 --- a/server/src/apub/community.rs +++ b/server/src/apub/community.rs @@ -10,13 +10,12 @@ use crate::{ routes::DbPoolParam, DbPool, LemmyError, }; -use activitystreams::{ - activity::{Accept, Announce, Delete, Remove, Undo}, - Activity, Base, BaseBox, -}; +use activitystreams::{activity::Announce, BaseBox}; +use activitystreams::{Activity, Base}; use activitystreams_ext::Ext2; use activitystreams_new::{ activity::Follow, + activity::{Accept, Delete, Remove, Undo}, actor::{kind::GroupType, ApActor, Endpoints, Group}, base::BaseExt, collection::UnorderedCollection, @@ -24,6 +23,7 @@ use activitystreams_new::{ object::Tombstone, prelude::*, primitives::{XsdAnyUri, XsdDateTime}, + public, }; use actix_web::{body::Body, client::Client, web, HttpResponse}; use itertools::Itertools; @@ -128,23 +128,19 @@ impl ActorType for Community { /// As a local community, accept the follow request from a remote user. async fn send_accept_follow( &self, - follow: &Follow, + follow: Follow, client: &Client, pool: &DbPool, ) -> Result<(), LemmyError> { let actor_uri = follow.actor.as_single_xsd_any_uri().unwrap().to_string(); let id = format!("{}/accept/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut accept = Accept::new(); - accept - .object_props - .set_context_xsd_any_uri(context())? - .set_id(id)?; - accept - .accept_props - .set_actor_xsd_any_uri(self.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(follow.clone())?)?; + let mut accept = Accept::new(self.actor_id.to_owned(), follow.into_any_base()?); let to = format!("{}/inbox", actor_uri); + accept + .set_context(context()) + .set_id(XsdAnyUri::from_str(&id)?) + .set_to(to.clone()); insert_activity(self.creator_id, accept.clone(), true, pool).await?; @@ -162,17 +158,12 @@ impl ActorType for Community { let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut delete = Delete::default(); - populate_object_props( - &mut delete.object_props, - vec![self.get_followers_url()], - &id, - )?; - + let mut delete = Delete::new(creator.actor_id.to_owned(), group.into_any_base()?); delete - .delete_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; + .set_context(context()) + .set_id(XsdAnyUri::from_str(&id)?) + .set_to(public()) + .set_many_ccs(vec![self.get_followers_url()]); insert_activity(self.creator_id, delete.clone(), true, pool).await?; @@ -195,33 +186,22 @@ impl ActorType for Community { let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut delete = Delete::default(); - populate_object_props( - &mut delete.object_props, - vec![self.get_followers_url()], - &id, - )?; - + let mut delete = Delete::new(creator.actor_id.to_owned(), group.into_any_base()?); delete - .delete_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; + .set_context(context()) + .set_id(XsdAnyUri::from_str(&id)?) + .set_to(public()) + .set_many_ccs(vec![self.get_followers_url()]); // TODO // Undo that fake activity let undo_id = format!("{}/undo/delete/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut undo = Undo::default(); - - populate_object_props( - &mut undo.object_props, - vec![self.get_followers_url()], - &undo_id, - )?; - + let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?); undo - .undo_props - .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(delete)?; + .set_context(context()) + .set_id(XsdAnyUri::from_str(&undo_id)?) + .set_to(public()) + .set_many_ccs(vec![self.get_followers_url()]); insert_activity(self.creator_id, undo.clone(), true, pool).await?; @@ -244,17 +224,12 @@ impl ActorType for Community { let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut remove = Remove::default(); - populate_object_props( - &mut remove.object_props, - vec![self.get_followers_url()], - &id, - )?; - + let mut remove = Remove::new(mod_.actor_id.to_owned(), group.into_any_base()?); remove - .remove_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; + .set_context(context()) + .set_id(XsdAnyUri::from_str(&id)?) + .set_to(public()) + .set_many_ccs(vec![self.get_followers_url()]); insert_activity(mod_.id, remove.clone(), true, pool).await?; @@ -277,32 +252,21 @@ impl ActorType for Community { let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut remove = Remove::default(); - populate_object_props( - &mut remove.object_props, - vec![self.get_followers_url()], - &id, - )?; - + let mut remove = Remove::new(mod_.actor_id.to_owned(), group.into_any_base()?); remove - .remove_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(BaseBox::from_concrete(group)?)?; + .set_context(context()) + .set_id(XsdAnyUri::from_str(&id)?) + .set_to(public()) + .set_many_ccs(vec![self.get_followers_url()]); // Undo that fake activity let undo_id = format!("{}/undo/remove/{}", self.actor_id, uuid::Uuid::new_v4()); - let mut undo = Undo::default(); - - populate_object_props( - &mut undo.object_props, - vec![self.get_followers_url()], - &undo_id, - )?; - + let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?); undo - .undo_props - .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(remove)?; + .set_context(context()) + .set_id(XsdAnyUri::from_str(&undo_id)?) + .set_to(public()) + .set_many_ccs(vec![self.get_followers_url()]); insert_activity(mod_.id, undo.clone(), true, pool).await?; @@ -358,7 +322,7 @@ impl FromApub for CommunityForm { /// Parse an ActivityPub group received from another instance into a Lemmy community. async fn from_apub(group: &GroupExt, client: &Client, pool: &DbPool) -> Result { - let creator_and_moderator_uris = group.attributed_to().unwrap(); + let creator_and_moderator_uris = group.inner.attributed_to().unwrap(); let creator_uri = creator_and_moderator_uris .as_many() .unwrap() @@ -371,23 +335,34 @@ impl FromApub for CommunityForm { let creator = get_or_fetch_and_upsert_remote_user(creator_uri, client, pool).await?; Ok(CommunityForm { - name: group.name().unwrap().as_single_xsd_string().unwrap().into(), + name: group + .inner + .name() + .unwrap() + .as_single_xsd_string() + .unwrap() + .into(), title: group.inner.preferred_username().unwrap().to_string(), // TODO: should be parsed as html and tags like