summaryrefslogtreecommitdiffstats
path: root/server/src/apub/user.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/apub/user.rs')
-rw-r--r--server/src/apub/user.rs124
1 files changed, 59 insertions, 65 deletions
diff --git a/server/src/apub/user.rs b/server/src/apub/user.rs
index 51339ccf..323407c7 100644
--- a/server/src/apub/user.rs
+++ b/server/src/apub/user.rs
@@ -1,38 +1,35 @@
use crate::{
+ api::claims::Claims,
apub::{
activities::send_activity,
create_apub_response,
- extensions::signatures::PublicKey,
+ insert_activity,
ActorType,
FromApub,
PersonExt,
ToApub,
},
blocking,
- convert_datetime,
- db::{
- activity::insert_activity,
- user::{UserForm, User_},
- },
- naive_now,
routes::DbPoolParam,
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 lemmy_db::{
+ naive_now,
+ user::{UserForm, User_},
+};
+use lemmy_utils::convert_datetime;
use serde::Deserialize;
#[derive(Deserialize)]
@@ -47,46 +44,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<PersonExt, LemmyError> {
// 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<Tombstone, LemmyError> {
unimplemented!()
@@ -203,31 +193,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<Self, LemmyError> {
- 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::<Image>()?
- .object_props
- .get_url_xsd_any_uri()
+ async fn from_apub(person: &mut PersonExt, _: &Client, _: &DbPool) -> Result<Self, LemmyError> {
+ 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 +229,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()),
})
}
@@ -254,7 +248,7 @@ pub async fn get_apub_user_http(
) -> Result<HttpResponse<Body>, 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?;