Skip to content

Commit

Permalink
Populate content with HTML, and source with markdown (ref #1220)
Browse files Browse the repository at this point in the history
  • Loading branch information
Nutomic committed Nov 24, 2020
1 parent 911b26f commit cd3f20e
Show file tree
Hide file tree
Showing 14 changed files with 184 additions and 90 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 23 additions & 2 deletions docs/src/contributing_apub_api_outline.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ Receives activities from user: `Follow`, `Undo/Follow`, `Create`, `Update`, `Lik
"https://enterprise.lemmy.ml/u/riker"
],
"content": "Welcome to the default community!",
"source": {
"content": "Welcome to the default community!",
"mediaType": "text/markdown"
},
"icon": {
"type": "Image",
"url": "https://enterprise.lemmy.ml/pictrs/image/Z8pFFb21cl.png"
Expand Down Expand Up @@ -123,7 +127,11 @@ Sends and receives activities from/to other users: `Create/Note`, `Update/Note`,
"type": "Person",
"preferredUsername": "picard",
"name": "Jean-Luc Picard",
"summary": "The user bio",
"content": "The user bio",
"source": {
"content": "The user bio",
"mediaType": "text/markdown"
},
"icon": {
"type": "Image",
"url": "https://enterprise.lemmy.ml/pictrs/image/DS3q0colRA.jpg"
Expand All @@ -150,7 +158,7 @@ Sends and receives activities from/to other users: `Create/Note`, `Update/Note`,
|---|---|---|
| `preferredUsername` | yes | Name of the actor |
| `name` | no | The user's displayname |
| `summary` | no | User bio |
| `content` | no | User bio |
| `icon` | no | The user's avatar, shown next to the username |
| `image` | no | The user's banner, shown on top of the profile |
| `inbox` | no | ActivityPub inbox URL |
Expand All @@ -174,6 +182,10 @@ A page with title, and optional URL and text content. The URL often leads to an
"to": "https://voyager.lemmy.ml/c/main",
"summary": "Test thumbnail 2",
"content": "blub blub",
"source": {
"content": "blub blub",
"mediaType": "text/markdown"
},
"url": "https://voyager.lemmy.ml:/pictrs/image/fzGwCsq7BJ.jpg",
"image": {
"type": "Image",
Expand Down Expand Up @@ -213,6 +225,10 @@ A reply to a post, or reply to another comment. Contains only text (including re
"attributedTo": "https://enterprise.lemmy.ml/u/picard",
"to": "https://enterprise.lemmy.ml/c/main",
"content": "mmmk",
"source": {
"content": "mmmk",
"mediaType": "text/markdown"
},
"inReplyTo": [
"https://enterprise.lemmy.ml/post/38",
"https://voyager.lemmy.ml/comment/73"
Expand Down Expand Up @@ -243,6 +259,11 @@ A direct message from one user to another. Can not include additional users. Thr
"attributedTo": "https://enterprise.lemmy.ml/u/picard",
"to": "https://voyager.lemmy.ml/u/janeway",
"content": "test",
"source": {
"content": "test",
"mediaType": "text/markdown"
},
"mediaType": "text/markdown",
"published": "2020-10-08T19:10:46.542820+00:00",
"updated": "2020-10-08T20:13:52.547156+00:00"
}
Expand Down
2 changes: 1 addition & 1 deletion lemmy_apub/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ lemmy_db = { path = "../lemmy_db" }
lemmy_structs = { path = "../lemmy_structs" }
lemmy_websocket = { path = "../lemmy_websocket" }
diesel = "1.4"
activitystreams = "0.7.0-alpha.4"
activitystreams = "0.7.0-alpha.6"
activitystreams-ext = "0.1.0-alpha.2"
bcrypt = "0.8"
chrono = { version = "0.4", features = ["serde"] }
Expand Down
10 changes: 5 additions & 5 deletions lemmy_apub/src/activities/receive/comment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ use crate::{
fetcher::get_or_fetch_and_insert_comment,
ActorType,
FromApub,
NoteExt,
};
use activitystreams::{
activity::{ActorAndObjectRefExt, Create, Dislike, Like, Remove, Update},
base::ExtendsExt,
object::Note,
};
use anyhow::{anyhow, Context};
use lemmy_db::{
Expand All @@ -27,7 +27,7 @@ pub(crate) async fn receive_create_comment(
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let user = get_actor_as_user(&create, context, request_counter).await?;
let note = Note::from_any_base(create.object().to_owned().one().context(location_info!())?)?
let note = NoteExt::from_any_base(create.object().to_owned().one().context(location_info!())?)?
.context(location_info!())?;

let comment =
Expand Down Expand Up @@ -83,7 +83,7 @@ pub(crate) async fn receive_update_comment(
context: &LemmyContext,
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let note = Note::from_any_base(update.object().to_owned().one().context(location_info!())?)?
let note = NoteExt::from_any_base(update.object().to_owned().one().context(location_info!())?)?
.context(location_info!())?;
let user = get_actor_as_user(&update, context, request_counter).await?;

Expand Down Expand Up @@ -140,7 +140,7 @@ pub(crate) async fn receive_like_comment(
context: &LemmyContext,
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let note = Note::from_any_base(like.object().to_owned().one().context(location_info!())?)?
let note = NoteExt::from_any_base(like.object().to_owned().one().context(location_info!())?)?
.context(location_info!())?;
let user = get_actor_as_user(&like, context, request_counter).await?;

Expand Down Expand Up @@ -191,7 +191,7 @@ pub(crate) async fn receive_dislike_comment(
context: &LemmyContext,
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let note = Note::from_any_base(
let note = NoteExt::from_any_base(
dislike
.object()
.to_owned()
Expand Down
7 changes: 4 additions & 3 deletions lemmy_apub/src/activities/receive/comment_undo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ use crate::{
activities::receive::get_actor_as_user,
fetcher::get_or_fetch_and_insert_comment,
FromApub,
NoteExt,
};
use activitystreams::{activity::*, object::Note, prelude::*};
use activitystreams::{activity::*, prelude::*};
use anyhow::Context;
use lemmy_db::{
comment::{Comment, CommentForm, CommentLike},
Expand All @@ -20,7 +21,7 @@ pub(crate) async fn receive_undo_like_comment(
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let user = get_actor_as_user(like, context, request_counter).await?;
let note = Note::from_any_base(like.object().to_owned().one().context(location_info!())?)?
let note = NoteExt::from_any_base(like.object().to_owned().one().context(location_info!())?)?
.context(location_info!())?;

let comment = CommentForm::from_apub(&note, context, None, request_counter).await?;
Expand Down Expand Up @@ -64,7 +65,7 @@ pub(crate) async fn receive_undo_dislike_comment(
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let user = get_actor_as_user(dislike, context, request_counter).await?;
let note = Note::from_any_base(
let note = NoteExt::from_any_base(
dislike
.object()
.to_owned()
Expand Down
7 changes: 4 additions & 3 deletions lemmy_apub/src/activities/receive/private_message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ use crate::{
fetcher::get_or_fetch_and_upsert_user,
inbox::get_activity_to_and_cc,
FromApub,
NoteExt,
};
use activitystreams::{
activity::{ActorAndObjectRefExt, Create, Delete, Undo, Update},
base::{AsBase, ExtendsExt},
object::{AsObject, Note},
object::AsObject,
public,
};
use anyhow::{anyhow, Context};
Expand All @@ -30,7 +31,7 @@ pub(crate) async fn receive_create_private_message(
) -> Result<(), LemmyError> {
check_private_message_activity_valid(&create, context, request_counter).await?;

let note = Note::from_any_base(
let note = NoteExt::from_any_base(
create
.object()
.as_one()
Expand Down Expand Up @@ -79,7 +80,7 @@ pub(crate) async fn receive_update_private_message(
.as_one()
.context(location_info!())?
.to_owned();
let note = Note::from_any_base(object)?.context(location_info!())?;
let note = NoteExt::from_any_base(object)?.context(location_info!())?;

let private_message_form =
PrivateMessageForm::from_apub(&note, context, Some(expected_domain), request_counter).await?;
Expand Down
7 changes: 4 additions & 3 deletions lemmy_apub/src/fetcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ use crate::{
ActorType,
FromApub,
GroupExt,
NoteExt,
PageExt,
PersonExt,
APUB_JSON_CONTENT_TYPE,
};
use activitystreams::{base::BaseExt, collection::OrderedCollection, object::Note, prelude::*};
use activitystreams::{base::BaseExt, collection::OrderedCollection, prelude::*};
use anyhow::{anyhow, Context};
use chrono::NaiveDateTime;
use diesel::result::Error::NotFound;
Expand Down Expand Up @@ -91,7 +92,7 @@ enum SearchAcceptedObjects {
Person(Box<PersonExt>),
Group(Box<GroupExt>),
Page(Box<PageExt>),
Comment(Box<Note>),
Comment(Box<NoteExt>),
}

/// Attempt to parse the query as URL, and fetch an ActivityPub object from it.
Expand Down Expand Up @@ -488,7 +489,7 @@ pub(crate) async fn get_or_fetch_and_insert_comment(
comment_ap_id
);
let comment =
fetch_remote_object::<Note>(context.client(), comment_ap_id, recursion_counter).await?;
fetch_remote_object::<NoteExt>(context.client(), comment_ap_id, recursion_counter).await?;
let comment_form = CommentForm::from_apub(
&comment,
context,
Expand Down
9 changes: 5 additions & 4 deletions lemmy_apub/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use activitystreams::{
activity::Follow,
actor::{ApActor, Group, Person},
base::AnyBase,
object::{Page, Tombstone},
object::{ApObject, Note, Page, Tombstone},
};
use activitystreams_ext::{Ext1, Ext2};
use anyhow::{anyhow, Context};
Expand All @@ -31,11 +31,12 @@ use std::net::IpAddr;
use url::{ParseError, Url};

/// Activitystreams type for community
type GroupExt = Ext2<ApActor<Group>, GroupExtension, PublicKeyExtension>;
type GroupExt = Ext2<ApActor<ApObject<Group>>, GroupExtension, PublicKeyExtension>;
/// Activitystreams type for user
type PersonExt = Ext1<ApActor<Person>, PublicKeyExtension>;
type PersonExt = Ext1<ApActor<ApObject<Person>>, PublicKeyExtension>;
/// Activitystreams type for post
type PageExt = Ext1<Page, PageExtension>;
type PageExt = Ext1<ApObject<Page>, PageExtension>;
type NoteExt = ApObject<Note>;

pub static APUB_JSON_CONTENT_TYPE: &str = "application/activity+json";

Expand Down
31 changes: 17 additions & 14 deletions lemmy_apub/src/objects/comment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@ use crate::{
get_or_fetch_and_insert_post,
get_or_fetch_and_upsert_user,
},
objects::{check_object_domain, create_tombstone},
objects::{
check_object_domain,
create_tombstone,
get_source_markdown_value,
set_content_and_source,
},
FromApub,
NoteExt,
ToApub,
};
use activitystreams::{
object::{kind::NoteType, Note, Tombstone},
object::{kind::NoteType, ApObject, Note, Tombstone},
prelude::*,
};
use anyhow::Context;
Expand All @@ -32,10 +38,10 @@ use url::Url;

#[async_trait::async_trait(?Send)]
impl ToApub for Comment {
type ApubType = Note;
type ApubType = NoteExt;

async fn to_apub(&self, pool: &DbPool) -> Result<Note, LemmyError> {
let mut comment = Note::new();
async fn to_apub(&self, pool: &DbPool) -> Result<NoteExt, LemmyError> {
let mut comment = ApObject::new(Note::new());

let creator_id = self.creator_id;
let creator = blocking(pool, move |conn| User_::read(conn, creator_id)).await??;
Expand Down Expand Up @@ -63,9 +69,10 @@ impl ToApub for Comment {
.set_published(convert_datetime(self.published))
.set_to(community.actor_id)
.set_many_in_reply_tos(in_reply_to_vec)
.set_content(self.content.to_owned())
.set_attributed_to(creator.actor_id);

set_content_and_source(&mut comment, &self.content)?;

if let Some(u) = self.updated {
comment.set_updated(convert_datetime(u));
}
Expand All @@ -80,13 +87,13 @@ impl ToApub for Comment {

#[async_trait::async_trait(?Send)]
impl FromApub for CommentForm {
type ApubType = Note;
type ApubType = NoteExt;

/// Converts a `Note` to `CommentForm`.
///
/// If the parent community, post and comment(s) are not known locally, these are also fetched.
async fn from_apub(
note: &Note,
note: &NoteExt,
context: &LemmyContext,
expected_domain: Option<Url>,
request_counter: &mut i32,
Expand Down Expand Up @@ -124,12 +131,8 @@ impl FromApub for CommentForm {
}
None => None,
};
let content = note
.content()
.context(location_info!())?
.as_single_xsd_string()
.context(location_info!())?
.to_string();

let content = get_source_markdown_value(note)?.context(location_info!())?;
let content_slurs_removed = remove_slurs(&content);

Ok(CommentForm {
Expand Down
26 changes: 12 additions & 14 deletions lemmy_apub/src/objects/community.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
use crate::{
extensions::group_extensions::GroupExtension,
fetcher::get_or_fetch_and_upsert_user,
objects::{check_object_domain, create_tombstone},
objects::{
check_object_domain,
create_tombstone,
get_source_markdown_value,
set_content_and_source,
},
ActorType,
FromApub,
GroupExt,
Expand All @@ -10,7 +15,7 @@ use crate::{
use activitystreams::{
actor::{kind::GroupType, ApActor, Endpoints, Group},
base::BaseExt,
object::{Image, Tombstone},
object::{ApObject, Image, Tombstone},
prelude::*,
};
use activitystreams_ext::Ext2;
Expand Down Expand Up @@ -46,7 +51,7 @@ impl ToApub for Community {
.await??;
let moderators: Vec<String> = moderators.into_iter().map(|m| m.user_actor_id).collect();

let mut group = Group::new();
let mut group = ApObject::new(Group::new());
group
.set_context(activitystreams::context())
.set_id(Url::parse(&self.actor_id)?)
Expand All @@ -58,9 +63,7 @@ impl ToApub for Community {
group.set_updated(convert_datetime(u));
}
if let Some(d) = self.description.to_owned() {
// TODO: this should be html, also add source field with raw markdown
// -> same for post.content and others
group.set_content(d);
set_content_and_source(&mut group, &d)?;
}

if let Some(icon_url) = &self.icon {
Expand Down Expand Up @@ -138,14 +141,9 @@ impl FromApub for CommunityForm {
.as_xsd_string()
.context(location_info!())?
.to_string();
// TODO: should be parsed as html and tags like <script> removed (or use markdown source)
// -> same for post.content etc
let description = group
.inner
.content()
.map(|s| s.as_single_xsd_string())
.flatten()
.map(|s| s.to_string());

let description = get_source_markdown_value(group)?;

check_slurs(&name)?;
check_slurs(&title)?;
check_slurs_opt(&description)?;
Expand Down
Loading

0 comments on commit cd3f20e

Please sign in to comment.