From c9338027f26170dffc95a052ecfc3def1bf3a729 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Fri, 3 Jul 2020 14:20:28 +0200 Subject: Migrate user and group to new activitystreams library --- server/src/apub/user.rs | 118 +++++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 66 deletions(-) (limited to 'server/src/apub/user.rs') diff --git a/server/src/apub/user.rs b/server/src/apub/user.rs index 51339ccf..a3194355 100644 --- a/server/src/apub/user.rs +++ b/server/src/apub/user.rs @@ -1,13 +1,5 @@ use crate::{ - apub::{ - activities::send_activity, - create_apub_response, - extensions::signatures::PublicKey, - ActorType, - FromApub, - PersonExt, - ToApub, - }, + apub::{activities::send_activity, create_apub_response, ActorType, FromApub, PersonExt, ToApub}, blocking, convert_datetime, db::{ @@ -19,20 +11,17 @@ use crate::{ DbPool, LemmyError, }; -use activitystreams::{ - actor::{properties::ApActorProperties, Person}, - context, - endpoint::EndpointProperties, - object::{properties::ObjectProperties, AnyImage, Image}, - primitives::XsdAnyUri, -}; -use activitystreams_ext::Ext2; +use activitystreams_ext::Ext1; use activitystreams_new::{ activity::{Follow, Undo}, - object::Tombstone, + actor::{ApActor, Endpoints, Person}, + context, + object::{Image, Tombstone}, prelude::*, + primitives::{XsdAnyUri, XsdDateTime}, }; use actix_web::{body::Body, client::Client, web, HttpResponse}; +use failure::_core::str::FromStr; use serde::Deserialize; #[derive(Deserialize)] @@ -47,46 +36,39 @@ impl ToApub for User_ { // Turn a Lemmy Community into an ActivityPub group that can be sent out over the network. async fn to_apub(&self, _pool: &DbPool) -> Result { // TODO go through all these to_string and to_owned() - let mut person = Person::default(); - let oprops: &mut ObjectProperties = person.as_mut(); - oprops - .set_context_xsd_any_uri(context())? - .set_id(self.actor_id.to_string())? - .set_name_xsd_string(self.name.to_owned())? - .set_published(convert_datetime(self.published))?; + let mut person = Person::new(); + person + .set_context(context()) + .set_id(XsdAnyUri::from_str(&self.actor_id)?) + .set_name(self.name.to_owned()) + .set_published(XsdDateTime::from(convert_datetime(self.published))); if let Some(u) = self.updated { - oprops.set_updated(convert_datetime(u))?; - } - - if let Some(i) = &self.preferred_username { - oprops.set_name_xsd_string(i.to_owned())?; + person.set_updated(XsdDateTime::from(convert_datetime(u))); } if let Some(avatar_url) = &self.avatar { let mut image = Image::new(); - image - .object_props - .set_url_xsd_any_uri(avatar_url.to_owned())?; - let any_image = AnyImage::from_concrete(image)?; - oprops.set_icon_any_image(any_image)?; + image.set_url(avatar_url.to_owned()); + person.set_icon(image.into_any_base()?); } - let mut endpoint_props = EndpointProperties::default(); - - endpoint_props.set_shared_inbox(self.get_shared_inbox_url())?; - - let mut actor_props = ApActorProperties::default(); + let mut ap_actor = ApActor::new(self.get_inbox_url().parse()?, person); + ap_actor + .set_outbox(self.get_outbox_url().parse()?) + .set_followers(self.get_followers_url().parse()?) + .set_following(self.get_following_url().parse()?) + .set_liked(self.get_liked_url().parse()?) + .set_endpoints(Endpoints { + shared_inbox: Some(self.get_shared_inbox_url().parse()?), + ..Default::default() + }); - actor_props - .set_inbox(self.get_inbox_url())? - .set_outbox(self.get_outbox_url())? - .set_endpoints(endpoint_props)? - .set_followers(self.get_followers_url())? - .set_following(self.get_following_url())? - .set_liked(self.get_liked_url())?; + if let Some(i) = &self.preferred_username { + ap_actor.set_preferred_username(i.to_owned()); + } - Ok(Ext2::new(person, actor_props, self.get_public_key_ext())) + Ok(Ext1::new(ap_actor, self.get_public_key_ext())) } fn to_tombstone(&self) -> Result { unimplemented!() @@ -203,31 +185,33 @@ impl ActorType for User_ { impl FromApub for UserForm { type ApubType = PersonExt; /// Parse an ActivityPub person received from another instance into a Lemmy user. - async fn from_apub(person: &PersonExt, _: &Client, _: &DbPool) -> Result { - let oprops = &person.inner.object_props; - let aprops = &person.ext_one; - let public_key: &PublicKey = &person.ext_two.public_key; - - let avatar = match oprops.get_icon_any_image() { - Some(any_image) => any_image - .to_owned() - .into_concrete::()? - .object_props - .get_url_xsd_any_uri() + async fn from_apub(person: &mut PersonExt, _: &Client, _: &DbPool) -> Result { + let avatar = match person.take_icon() { + Some(any_image) => Image::from_any_base(any_image.as_one().unwrap().clone()) + .unwrap() + .unwrap() + .url + .unwrap() + .as_single_xsd_any_uri() .map(|u| u.to_string()), None => None, }; Ok(UserForm { - name: oprops.get_name_xsd_string().unwrap().to_string(), - preferred_username: aprops.get_preferred_username().map(|u| u.to_string()), + name: person + .take_name() + .unwrap() + .as_single_xsd_string() + .unwrap() + .into(), + preferred_username: person.inner.take_preferred_username(), password_encrypted: "".to_string(), admin: false, banned: false, email: None, avatar, - updated: oprops - .get_updated() + updated: person + .take_updated() .map(|u| u.as_ref().to_owned().naive_local()), show_nsfw: false, theme: "".to_string(), @@ -237,11 +221,13 @@ impl FromApub for UserForm { show_avatars: false, send_notifications_to_email: false, matrix_user_id: None, - actor_id: oprops.get_id().unwrap().to_string(), - bio: oprops.get_summary_xsd_string().map(|s| s.to_string()), + actor_id: person.id().unwrap().to_string(), + bio: person + .take_summary() + .map(|s| s.as_single_xsd_string().unwrap().into()), local: false, private_key: None, - public_key: Some(public_key.to_owned().public_key_pem), + public_key: Some(person.ext_one.public_key.to_owned().public_key_pem), last_refreshed_at: Some(naive_now()), }) } -- cgit v1.2.3 From 80aef61aed29d25099835ee4769bb8e1e363eb47 Mon Sep 17 00:00:00 2001 From: nutomic Date: Fri, 10 Jul 2020 18:15:41 +0000 Subject: Split code into cargo workspaces (#67) More fixes - fixed docker builds - fixed mentions regex test - fixed DATABASE_URL stuff - change schema path in diesel.toml Address review comments - add jsonb column back into activity table - remove authors field from cargo.toml - adjust LEMMY_DATABASE_URL env var usage - rename all occurences of LEMMY_DATABASE_URL to DATABASE_URL Decouple utils and db Split code into cargo workspaces Co-authored-by: Felix Ableitner Reviewed-on: https://yerbamate.dev/LemmyNet/lemmy/pulls/67 --- server/src/apub/user.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'server/src/apub/user.rs') diff --git a/server/src/apub/user.rs b/server/src/apub/user.rs index a3194355..323407c7 100644 --- a/server/src/apub/user.rs +++ b/server/src/apub/user.rs @@ -1,12 +1,15 @@ use crate::{ - apub::{activities::send_activity, create_apub_response, ActorType, FromApub, PersonExt, ToApub}, - blocking, - convert_datetime, - db::{ - activity::insert_activity, - user::{UserForm, User_}, + api::claims::Claims, + apub::{ + activities::send_activity, + create_apub_response, + insert_activity, + ActorType, + FromApub, + PersonExt, + ToApub, }, - naive_now, + blocking, routes::DbPoolParam, DbPool, LemmyError, @@ -22,6 +25,11 @@ use activitystreams_new::{ }; use actix_web::{body::Body, client::Client, web, HttpResponse}; use failure::_core::str::FromStr; +use lemmy_db::{ + naive_now, + user::{UserForm, User_}, +}; +use lemmy_utils::convert_datetime; use serde::Deserialize; #[derive(Deserialize)] @@ -240,7 +248,7 @@ pub async fn get_apub_user_http( ) -> Result, LemmyError> { let user_name = info.into_inner().user_name; let user = blocking(&db, move |conn| { - User_::find_by_email_or_username(conn, &user_name) + Claims::find_by_email_or_username(conn, &user_name) }) .await??; let u = user.to_apub(&db).await?; -- cgit v1.2.3