From d1aca27126672f72d18b9749507a29040f4bfdd3 Mon Sep 17 00:00:00 2001 From: Felix Date: Mon, 18 May 2020 18:15:26 +0200 Subject: [PATCH] Use activitystreams-ext --- server/Cargo.lock | 34 +++++++++++++++++++++++----------- server/Cargo.toml | 6 ++---- server/src/apub/community.rs | 30 +++++++++++++++--------------- server/src/apub/fetcher.rs | 8 +++----- server/src/apub/mod.rs | 8 ++++---- server/src/apub/post.rs | 28 ++++++++++++++-------------- server/src/apub/user.rs | 10 +++++----- 7 files changed, 66 insertions(+), 58 deletions(-) diff --git a/server/Cargo.lock b/server/Cargo.lock index 0a59a6092..a8bddc698 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -26,10 +26,20 @@ dependencies = [ "syn", ] +[[package]] +name = "activitystreams-ext" +version = "0.1.0" +source = "git+https://git.asonix.dog/asonix/activitystreams-ext#862426e504832256a6b26e1ec2198c0bda22139b" +dependencies = [ + "activitystreams-new", + "serde 1.0.110", + "serde_json 1.0.53", +] + [[package]] name = "activitystreams-new" version = "0.1.0" -source = "git+https://git.asonix.dog/asonix/activitystreams-sketch#2fb52d32bbce9716c76e08579cf5c716366945fe" +source = "git+https://git.asonix.dog/asonix/activitystreams-sketch#2cd88752996d702b355f0cd2c8dc991af00b3cae" dependencies = [ "activitystreams", "serde 1.0.110", @@ -1565,6 +1575,7 @@ name = "lemmy_server" version = "0.0.1" dependencies = [ "activitystreams", + "activitystreams-ext", "activitystreams-new", "actix", "actix-files", @@ -2093,18 +2104,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d480cb4e89522ccda96d0eed9af94180b7a5f93fb28f66e1fd7d68431663d1" +checksum = "edc93aeee735e60ecb40cf740eb319ff23eab1c5748abfdb5c180e4ce49f7791" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82996f11efccb19b685b14b5df818de31c1edcee3daa256ab5775dd98e72feb" +checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" dependencies = [ "proc-macro2", "quote", @@ -2131,9 +2142,9 @@ checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" [[package]] name = "ppv-lite86" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1e4df3c96bec4c7ce0e32fe5960c98ffc869443ec9592a0411ca1ee96e5e2f0" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" [[package]] name = "pq-sys" @@ -2183,9 +2194,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42934bc9c8ab0d3b273a16d8551c8f0fcff46be73276ca083ec2414c15c4ba5e" +checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" dependencies = [ "proc-macro2", ] @@ -3028,8 +3039,9 @@ checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" [[package]] name = "typed-builder" -version = "0.5.1" -source = "git+https://git.asonix.dog/asonix/typed-builder#3dadcaaa6184ef720093c8f0632a7d423d2537b0" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fc4459191c621a53ef6c6ca5642e6e0e5ccc61f3e5b8ad6b6ab5317f0200fb" dependencies = [ "proc-macro2", "quote", diff --git a/server/Cargo.toml b/server/Cargo.toml index a28f98e88..ddc6e7666 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -4,15 +4,13 @@ version = "0.0.1" authors = ["Dessalines "] edition = "2018" -[patch.crates-io] -typed-builder = { git = "https://git.asonix.dog/asonix/typed-builder" } - [dependencies] diesel = { version = "1.4.4", features = ["postgres","chrono","r2d2","64-column-tables","serde_json"] } diesel_migrations = "1.4.0" dotenv = "0.15.0" activitystreams = "0.6.2" -activitystreams-new = { version = "0.1.0", git = "https://git.asonix.dog/asonix/activitystreams-sketch" } +activitystreams-new = { git = "https://git.asonix.dog/asonix/activitystreams-sketch" } +activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext" } bcrypt = "0.8.0" chrono = { version = "0.4.7", features = ["serde"] } failure = "0.1.8" diff --git a/server/src/apub/community.rs b/server/src/apub/community.rs index d91cb4ba1..bc9244924 100644 --- a/server/src/apub/community.rs +++ b/server/src/apub/community.rs @@ -28,10 +28,10 @@ use activitystreams::{ collection::UnorderedCollection, context, endpoint::EndpointProperties, - ext::Extensible, object::{properties::ObjectProperties, Tombstone}, BaseBox, }; +use activitystreams_ext::Ext3; use actix_web::{body::Body, web::Path, HttpResponse, Result}; use diesel::PgConnection; use failure::Error; @@ -91,12 +91,12 @@ impl ToApub for Community { let group_extension = GroupExtension::new(conn, self.category_id, self.nsfw)?; - Ok( - group - .extend(group_extension) - .extend(actor_props) - .extend(self.get_public_key_ext()), - ) + Ok(Ext3::new( + group, + group_extension, + actor_props, + self.get_public_key_ext(), + )) } fn to_tombstone(&self) -> Result { @@ -161,7 +161,7 @@ impl ActorType for Community { delete .delete_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(group)?; + .set_object_base_box(BaseBox::from_concrete(group)?)?; insert_activity(&conn, self.creator_id, &delete, true)?; @@ -186,7 +186,7 @@ impl ActorType for Community { delete .delete_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(group)?; + .set_object_base_box(BaseBox::from_concrete(group)?)?; // TODO // Undo that fake activity @@ -227,7 +227,7 @@ impl ActorType for Community { remove .remove_props .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(group)?; + .set_object_base_box(BaseBox::from_concrete(group)?)?; insert_activity(&conn, mod_.id, &remove, true)?; @@ -252,7 +252,7 @@ impl ActorType for Community { remove .remove_props .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(group)?; + .set_object_base_box(BaseBox::from_concrete(group)?)?; // Undo that fake activity let undo_id = format!("{}/undo/remove/{}", self.actor_id, uuid::Uuid::new_v4()); @@ -316,10 +316,10 @@ impl FromApub for CommunityForm { /// Parse an ActivityPub group received from another instance into a Lemmy community. fn from_apub(group: &GroupExt, conn: &PgConnection) -> Result { - let group_extensions: &GroupExtension = &group.base.base.extension; - let oprops = &group.base.base.base.object_props; - let aprops = &group.base.extension; - let public_key: &PublicKey = &group.extension.public_key; + let group_extensions: &GroupExtension = &group.ext_one; + let oprops = &group.inner.object_props; + let aprops = &group.ext_two; + let public_key: &PublicKey = &group.ext_three.public_key; let mut creator_and_moderator_uris = oprops.get_many_attributed_to_xsd_any_uris().unwrap(); let creator = creator_and_moderator_uris diff --git a/server/src/apub/fetcher.rs b/server/src/apub/fetcher.rs index 9379dd96b..402716642 100644 --- a/server/src/apub/fetcher.rs +++ b/server/src/apub/fetcher.rs @@ -125,12 +125,12 @@ pub fn search_by_apub_id(query: &str, conn: &PgConnection) -> Result(&query_url)? { SearchAcceptedObjects::Person(p) => { - let user_uri = p.base.base.object_props.get_id().unwrap().to_string(); + let user_uri = p.inner.object_props.get_id().unwrap().to_string(); let user = get_or_fetch_and_upsert_remote_user(&user_uri, &conn)?; response.users = vec![UserView::read(conn, user.id)?]; } SearchAcceptedObjects::Group(g) => { - let community_uri = g.base.base.base.object_props.get_id().unwrap().to_string(); + let community_uri = g.inner.object_props.get_id().unwrap().to_string(); let community = get_or_fetch_and_upsert_remote_community(&community_uri, &conn)?; // TODO Maybe at some point in the future, fetch all the history of a community // fetch_community_outbox(&c, conn)?; @@ -220,9 +220,7 @@ pub fn get_or_fetch_and_upsert_remote_community( // Also add the community moderators too let creator_and_moderator_uris = group - .base - .base - .base + .inner .object_props .get_many_attributed_to_xsd_any_uris() .unwrap(); diff --git a/server/src/apub/mod.rs b/server/src/apub/mod.rs index 3b0872061..805e6a0c3 100644 --- a/server/src/apub/mod.rs +++ b/server/src/apub/mod.rs @@ -25,9 +25,9 @@ use crate::{ use activitystreams::{ activity::Follow, actor::{properties::ApActorProperties, Group, Person}, - ext::Ext, object::{Page, Tombstone}, }; +use activitystreams_ext::{Ext1, Ext2, Ext3}; use actix_web::{body::Body, HttpResponse, Result}; use chrono::NaiveDateTime; use diesel::PgConnection; @@ -37,9 +37,9 @@ use log::debug; use serde::Serialize; use url::Url; -type GroupExt = Ext, ApActorProperties>, PublicKeyExtension>; -type PersonExt = Ext, PublicKeyExtension>; -type PageExt = Ext; +type GroupExt = Ext3; +type PersonExt = Ext2; +type PageExt = Ext1; pub static APUB_JSON_CONTENT_TYPE: &str = "application/activity+json"; diff --git a/server/src/apub/post.rs b/server/src/apub/post.rs index b96f79ebf..23f18a5c5 100644 --- a/server/src/apub/post.rs +++ b/server/src/apub/post.rs @@ -26,9 +26,10 @@ use crate::{ use activitystreams::{ activity::{Create, Delete, Dislike, Like, Remove, Undo, Update}, context, - ext::Extensible, object::{kind::PageType, properties::ObjectProperties, Page, Tombstone}, + BaseBox, }; +use activitystreams_ext::Ext1; use actix_web::{body::Body, web::Path, HttpResponse, Result}; use diesel::PgConnection; use failure::Error; @@ -95,7 +96,7 @@ impl ToApub for Post { comments_enabled: !self.locked, sensitive: self.nsfw, }; - Ok(page.extend(ext)) + Ok(Ext1::new(page, ext)) } fn to_tombstone(&self) -> Result { @@ -113,9 +114,8 @@ impl FromApub for PostForm { /// Parse an ActivityPub page received from another instance into a Lemmy post. fn from_apub(page: &PageExt, conn: &PgConnection) -> Result { - let ext = &page.extension; - let page = &page.base; - let oprops = &page.object_props; + let ext = &page.ext_one; + let oprops = &page.inner.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)?; let community_actor_id = &oprops.get_to_xsd_any_uri().unwrap().to_string(); @@ -164,7 +164,7 @@ impl ApubObjectType for Post { create .create_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; insert_activity(&conn, creator.id, &create, true)?; @@ -187,7 +187,7 @@ impl ApubObjectType for Post { update .update_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; insert_activity(&conn, creator.id, &update, true)?; @@ -210,7 +210,7 @@ impl ApubObjectType for Post { delete .delete_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; insert_activity(&conn, self.creator_id, &delete, true)?; @@ -234,7 +234,7 @@ impl ApubObjectType for Post { delete .delete_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; // TODO // Undo that fake activity @@ -274,7 +274,7 @@ impl ApubObjectType for Post { remove .remove_props .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; insert_activity(&conn, mod_.id, &remove, true)?; @@ -297,7 +297,7 @@ impl ApubObjectType for Post { remove .remove_props .set_actor_xsd_any_uri(mod_.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; // Undo that fake activity let undo_id = format!("{}/undo/remove/{}", self.ap_id, uuid::Uuid::new_v4()); @@ -337,7 +337,7 @@ impl ApubLikeableType for Post { like .like_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; insert_activity(&conn, creator.id, &like, true)?; @@ -359,7 +359,7 @@ impl ApubLikeableType for Post { dislike .dislike_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; insert_activity(&conn, creator.id, &dislike, true)?; @@ -381,7 +381,7 @@ impl ApubLikeableType for Post { like .like_props .set_actor_xsd_any_uri(creator.actor_id.to_owned())? - .set_object_base_box(page)?; + .set_object_base_box(BaseBox::from_concrete(page)?)?; // TODO // Undo that fake activity diff --git a/server/src/apub/user.rs b/server/src/apub/user.rs index dac6bc313..a2958b159 100644 --- a/server/src/apub/user.rs +++ b/server/src/apub/user.rs @@ -21,9 +21,9 @@ use activitystreams::{ actor::{properties::ApActorProperties, Person}, context, endpoint::EndpointProperties, - ext::Extensible, object::{properties::ObjectProperties, Tombstone}, }; +use activitystreams_ext::Ext2; use actix_web::{body::Body, web::Path, HttpResponse, Result}; use diesel::PgConnection; use failure::Error; @@ -70,7 +70,7 @@ impl ToApub for User_ { .set_following(self.get_following_url())? .set_liked(self.get_liked_url())?; - Ok(person.extend(actor_props).extend(self.get_public_key_ext())) + Ok(Ext2::new(person, actor_props, self.get_public_key_ext())) } fn to_tombstone(&self) -> Result { unimplemented!() @@ -177,9 +177,9 @@ impl FromApub for UserForm { type ApubType = PersonExt; /// Parse an ActivityPub person received from another instance into a Lemmy user. fn from_apub(person: &PersonExt, _conn: &PgConnection) -> Result { - let oprops = &person.base.base.object_props; - let aprops = &person.base.extension; - let public_key: &PublicKey = &person.extension.public_key; + let oprops = &person.inner.object_props; + let aprops = &person.ext_one; + let public_key: &PublicKey = &person.ext_two.public_key; Ok(UserForm { name: oprops.get_name_xsd_string().unwrap().to_string(),