diff --git a/Cargo.lock b/Cargo.lock
index 669626caa..fa63a4b27 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2582,7 +2582,6 @@ dependencies = [
"moka",
"pretty_assertions",
"reqwest 0.12.8",
- "semver",
"serde",
"serde_json",
"serde_with",
diff --git a/crates/apub/Cargo.toml b/crates/apub/Cargo.toml
index 8124fda01..057e9bd38 100644
--- a/crates/apub/Cargo.toml
+++ b/crates/apub/Cargo.toml
@@ -45,7 +45,6 @@ html2md = "0.2.14"
html2text = "0.12.6"
stringreader = "0.1.1"
enum_delegate = "0.2.0"
-semver = "1.0.23"
[dev-dependencies]
serial_test = { workspace = true }
diff --git a/crates/apub/assets/lemmy/activities/create_or_update/create_comment.json b/crates/apub/assets/lemmy/activities/create_or_update/create_note.json
similarity index 100%
rename from crates/apub/assets/lemmy/activities/create_or_update/create_comment.json
rename to crates/apub/assets/lemmy/activities/create_or_update/create_note.json
diff --git a/crates/apub/assets/lemmy/activities/create_or_update/create_private_message.json b/crates/apub/assets/lemmy/activities/create_or_update/create_private_message.json
index e7dbdd0f9..54ee39350 100644
--- a/crates/apub/assets/lemmy/activities/create_or_update/create_private_message.json
+++ b/crates/apub/assets/lemmy/activities/create_or_update/create_private_message.json
@@ -3,7 +3,7 @@
"actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
"to": ["http://ds9.lemmy.ml/u/lemmy_alpha"],
"object": {
- "type": "Note",
+ "type": "ChatMessage",
"id": "http://enterprise.lemmy.ml/private_message/1",
"attributedTo": "http://enterprise.lemmy.ml/u/lemmy_beta",
"to": ["http://ds9.lemmy.ml/u/lemmy_alpha"],
diff --git a/crates/apub/assets/lemmy/objects/private_message.json b/crates/apub/assets/lemmy/objects/chat_message.json
similarity index 93%
rename from crates/apub/assets/lemmy/objects/private_message.json
rename to crates/apub/assets/lemmy/objects/chat_message.json
index a3579523e..95b37322e 100644
--- a/crates/apub/assets/lemmy/objects/private_message.json
+++ b/crates/apub/assets/lemmy/objects/chat_message.json
@@ -1,6 +1,6 @@
{
"id": "https://enterprise.lemmy.ml/private_message/1621",
- "type": "Note",
+ "type": "ChatMessage",
"attributedTo": "https://enterprise.lemmy.ml/u/picard",
"to": ["https://queer.hacktivis.me/users/lanodan"],
"content": "
Hello hello, testing
\n",
diff --git a/crates/apub/assets/lemmy/objects/comment.json b/crates/apub/assets/lemmy/objects/note.json
similarity index 100%
rename from crates/apub/assets/lemmy/objects/comment.json
rename to crates/apub/assets/lemmy/objects/note.json
diff --git a/crates/apub/assets/mastodon/activities/private_message.json b/crates/apub/assets/mastodon/activities/private_message.json
deleted file mode 100644
index b542859b5..000000000
--- a/crates/apub/assets/mastodon/activities/private_message.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
- "@context": [
- "https://www.w3.org/ns/activitystreams",
- {
- "ostatus": "http://ostatus.org#",
- "atomUri": "ostatus:atomUri",
- "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
- "conversation": "ostatus:conversation",
- "sensitive": "as:sensitive",
- "toot": "http://joinmastodon.org/ns#",
- "votersCount": "toot:votersCount"
- }
- ],
- "id": "https://mastodon.world/users/nutomic/statuses/110854468010322301",
- "type": "Note",
- "summary": null,
- "inReplyTo": "https://mastodon.world/users/nutomic/statuses/110854464248188528",
- "published": "2023-08-08T14:29:04Z",
- "url": "https://mastodon.world/@nutomic/110854468010322301",
- "attributedTo": "https://mastodon.world/users/nutomic",
- "to": ["https://ds9.lemmy.ml/u/nutomic"],
- "cc": [],
- "sensitive": false,
- "atomUri": "https://mastodon.world/users/nutomic/statuses/110854468010322301",
- "inReplyToAtomUri": "https://mastodon.world/users/nutomic/statuses/110854464248188528",
- "conversation": "tag:mastodon.world,2023-08-08:objectId=121377096:objectType=Conversation",
- "content": "@nutomic@ds9.lemmy.ml 444
",
- "contentMap": {
- "es": "@nutomic@ds9.lemmy.ml 444
"
- },
- "attachment": [],
- "tag": [
- {
- "type": "Mention",
- "href": "https://ds9.lemmy.ml/u/nutomic",
- "name": "@nutomic@ds9.lemmy.ml"
- }
- ],
- "replies": {
- "id": "https://mastodon.world/users/nutomic/statuses/110854468010322301/replies",
- "type": "Collection",
- "first": {
- "type": "CollectionPage",
- "next": "https://mastodon.world/users/nutomic/statuses/110854468010322301/replies?only_other_accounts=true&page=true",
- "partOf": "https://mastodon.world/users/nutomic/statuses/110854468010322301/replies",
- "items": []
- }
- }
-}
diff --git a/crates/apub/assets/pleroma/objects/chat_message.json b/crates/apub/assets/pleroma/objects/chat_message.json
new file mode 100644
index 000000000..6a2afc82e
--- /dev/null
+++ b/crates/apub/assets/pleroma/objects/chat_message.json
@@ -0,0 +1,15 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://queer.hacktivis.me/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "attributedTo": "https://queer.hacktivis.me/users/lanodan",
+ "content": "Hi!",
+ "id": "https://queer.hacktivis.me/objects/2",
+ "published": "2020-02-12T14:08:20Z",
+ "to": ["https://enterprise.lemmy.ml/u/picard"],
+ "type": "ChatMessage"
+}
diff --git a/crates/apub/src/activities/community/announce.rs b/crates/apub/src/activities/community/announce.rs
index 9d714e304..950f4861d 100644
--- a/crates/apub/src/activities/community/announce.rs
+++ b/crates/apub/src/activities/community/announce.rs
@@ -64,17 +64,16 @@ impl ActivityHandler for RawAnnouncableActivities {
// verify and receive activity
activity.verify(context).await?;
- let actor_id = activity.actor().clone().into();
- activity.receive(context).await?;
+ activity.clone().receive(context).await?;
// if community is local, send activity to followers
if let Some(community) = community {
if community.local {
+ let actor_id = activity.actor().clone().into();
verify_person_in_community(&actor_id, &community, context).await?;
AnnounceActivity::send(self, &community, context).await?;
}
}
-
Ok(())
}
}
diff --git a/crates/apub/src/activities/create_or_update/comment.rs b/crates/apub/src/activities/create_or_update/comment.rs
index 93cac92ee..9f64e805b 100644
--- a/crates/apub/src/activities/create_or_update/comment.rs
+++ b/crates/apub/src/activities/create_or_update/comment.rs
@@ -43,7 +43,6 @@ use lemmy_utils::{
error::{LemmyError, LemmyResult},
utils::mention::scrape_text_for_mentions,
};
-use serde_json::{from_value, to_value};
use url::Url;
impl CreateOrUpdateNote {
@@ -99,8 +98,7 @@ impl CreateOrUpdateNote {
inboxes.add_inbox(person.shared_inbox_or_inbox());
}
- let activity =
- AnnouncableActivities::CreateOrUpdateNoteWrapper(from_value(to_value(create_or_update)?)?);
+ let activity = AnnouncableActivities::CreateOrUpdateComment(create_or_update);
send_activity_in_community(activity, &person, &community, inboxes, false, &context).await
}
}
diff --git a/crates/apub/src/activities/create_or_update/mod.rs b/crates/apub/src/activities/create_or_update/mod.rs
index b442e5fa3..c69e00e91 100644
--- a/crates/apub/src/activities/create_or_update/mod.rs
+++ b/crates/apub/src/activities/create_or_update/mod.rs
@@ -1,4 +1,3 @@
pub mod comment;
-pub(crate) mod note_wrapper;
pub mod post;
pub mod private_message;
diff --git a/crates/apub/src/activities/create_or_update/note_wrapper.rs b/crates/apub/src/activities/create_or_update/note_wrapper.rs
deleted file mode 100644
index 9206d0c05..000000000
--- a/crates/apub/src/activities/create_or_update/note_wrapper.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-use crate::{
- objects::{community::ApubCommunity, note_wrapper::is_public},
- protocol::{
- activities::create_or_update::{
- note::CreateOrUpdateNote,
- note_wrapper::CreateOrUpdateNoteWrapper,
- private_message::CreateOrUpdatePrivateMessage,
- },
- InCommunity,
- },
-};
-use activitypub_federation::{config::Data, traits::ActivityHandler};
-use lemmy_api_common::context::LemmyContext;
-use lemmy_utils::error::{FederationError, LemmyError, LemmyResult};
-use serde_json::{from_value, to_value};
-use url::Url;
-
-#[async_trait::async_trait]
-impl ActivityHandler for CreateOrUpdateNoteWrapper {
- type DataType = LemmyContext;
- type Error = LemmyError;
-
- fn id(&self) -> &Url {
- &self.id
- }
-
- fn actor(&self) -> &Url {
- &self.actor
- }
-
- #[tracing::instrument(skip_all)]
- async fn verify(&self, context: &Data) -> LemmyResult<()> {
- let val = to_value(self)?;
- if is_public(&self.to, &self.cc) {
- CreateOrUpdateNote::verify(&from_value(val)?, context).await?;
- } else {
- CreateOrUpdatePrivateMessage::verify(&from_value(val)?, context).await?;
- }
- Ok(())
- }
-
- #[tracing::instrument(skip_all)]
- async fn receive(self, context: &Data) -> LemmyResult<()> {
- let is_public = is_public(&self.to, &self.cc);
- let val = to_value(self)?;
- if is_public {
- CreateOrUpdateNote::receive(from_value(val)?, context).await?;
- } else {
- CreateOrUpdatePrivateMessage::receive(from_value(val)?, context).await?;
- }
- Ok(())
- }
-}
-
-#[async_trait::async_trait]
-impl InCommunity for CreateOrUpdateNoteWrapper {
- #[tracing::instrument(skip(self, context))]
- async fn community(&self, context: &Data) -> LemmyResult {
- if is_public(&self.to, &self.cc) {
- let comment: CreateOrUpdateNote = from_value(to_value(self)?)?;
- comment.community(context).await
- } else {
- Err(FederationError::ObjectIsNotPublic.into())
- }
- }
-}
diff --git a/crates/apub/src/activities/create_or_update/private_message.rs b/crates/apub/src/activities/create_or_update/private_message.rs
index b6e7478ef..6bba4e374 100644
--- a/crates/apub/src/activities/create_or_update/private_message.rs
+++ b/crates/apub/src/activities/create_or_update/private_message.rs
@@ -3,7 +3,7 @@ use crate::{
insert_received_activity,
objects::{person::ApubPerson, private_message::ApubPrivateMessage},
protocol::activities::{
- create_or_update::private_message::CreateOrUpdatePrivateMessage,
+ create_or_update::chat_message::CreateOrUpdateChatMessage,
CreateOrUpdateType,
},
};
@@ -30,7 +30,7 @@ pub(crate) async fn send_create_or_update_pm(
kind.clone(),
&context.settings().get_protocol_and_hostname(),
)?;
- let create_or_update = CreateOrUpdatePrivateMessage {
+ let create_or_update = CreateOrUpdateChatMessage {
id: id.clone(),
actor: actor.id().into(),
to: [recipient.id().into()],
@@ -44,7 +44,7 @@ pub(crate) async fn send_create_or_update_pm(
}
#[async_trait::async_trait]
-impl ActivityHandler for CreateOrUpdatePrivateMessage {
+impl ActivityHandler for CreateOrUpdateChatMessage {
type DataType = LemmyContext;
type Error = LemmyError;
diff --git a/crates/apub/src/activities/deletion/mod.rs b/crates/apub/src/activities/deletion/mod.rs
index 941ac4237..15118a476 100644
--- a/crates/apub/src/activities/deletion/mod.rs
+++ b/crates/apub/src/activities/deletion/mod.rs
@@ -36,7 +36,7 @@ use lemmy_db_schema::{
community::{Community, CommunityUpdateForm},
person::Person,
post::{Post, PostUpdateForm},
- private_message::{PrivateMessage as DbPrivateMessage, PrivateMessageUpdateForm},
+ private_message::{PrivateMessage, PrivateMessageUpdateForm},
},
traits::Crud,
};
@@ -82,7 +82,7 @@ pub(crate) async fn send_apub_delete_in_community(
#[tracing::instrument(skip_all)]
pub(crate) async fn send_apub_delete_private_message(
actor: &ApubPerson,
- pm: DbPrivateMessage,
+ pm: PrivateMessage,
deleted: bool,
context: Data,
) -> LemmyResult<()> {
@@ -298,7 +298,7 @@ async fn receive_delete_action(
}
}
DeletableObjects::PrivateMessage(pm) => {
- DbPrivateMessage::update(
+ PrivateMessage::update(
&mut context.pool(),
pm.id,
&PrivateMessageUpdateForm {
diff --git a/crates/apub/src/activity_lists.rs b/crates/apub/src/activity_lists.rs
index 0a11e30a0..7ed1d8baf 100644
--- a/crates/apub/src/activity_lists.rs
+++ b/crates/apub/src/activity_lists.rs
@@ -11,7 +11,11 @@ use crate::{
report::Report,
update::UpdateCommunity,
},
- create_or_update::{note_wrapper::CreateOrUpdateNoteWrapper, page::CreateOrUpdatePage},
+ create_or_update::{
+ chat_message::CreateOrUpdateChatMessage,
+ note::CreateOrUpdateNote,
+ page::CreateOrUpdatePage,
+ },
deletion::{delete::Delete, undo_delete::UndoDelete},
following::{
accept::AcceptFollow,
@@ -44,17 +48,47 @@ pub enum SharedInboxActivities {
AcceptFollow(AcceptFollow),
RejectFollow(RejectFollow),
UndoFollow(UndoFollow),
+ CreateOrUpdatePrivateMessage(CreateOrUpdateChatMessage),
Report(Report),
AnnounceActivity(AnnounceActivity),
/// This is a catch-all and needs to be last
RawAnnouncableActivities(RawAnnouncableActivities),
}
+/// List of activities which the group inbox can handle.
+#[derive(Debug, Deserialize, Serialize)]
+#[serde(untagged)]
+#[enum_delegate::implement(ActivityHandler)]
+pub enum GroupInboxActivities {
+ Follow(Follow),
+ UndoFollow(UndoFollow),
+ Report(Report),
+ /// This is a catch-all and needs to be last
+ AnnouncableActivities(RawAnnouncableActivities),
+}
+
+/// List of activities which the person inbox can handle.
+#[derive(Clone, Debug, Deserialize, Serialize)]
+#[serde(untagged)]
+#[enum_delegate::implement(ActivityHandler)]
+pub enum PersonInboxActivities {
+ Follow(Follow),
+ AcceptFollow(AcceptFollow),
+ RejectFollow(RejectFollow),
+ UndoFollow(UndoFollow),
+ CreateOrUpdatePrivateMessage(CreateOrUpdateChatMessage),
+ Delete(Delete),
+ UndoDelete(UndoDelete),
+ AnnounceActivity(AnnounceActivity),
+ /// User can also receive some "announcable" activities, eg a comment mention.
+ AnnouncableActivities(AnnouncableActivities),
+}
+
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)]
#[enum_delegate::implement(ActivityHandler)]
pub enum AnnouncableActivities {
- CreateOrUpdateNoteWrapper(CreateOrUpdateNoteWrapper),
+ CreateOrUpdateComment(CreateOrUpdateNote),
CreateOrUpdatePost(CreateOrUpdatePage),
Vote(Vote),
UndoVote(UndoVote),
@@ -77,7 +111,7 @@ impl InCommunity for AnnouncableActivities {
async fn community(&self, context: &Data) -> LemmyResult {
use AnnouncableActivities::*;
match self {
- CreateOrUpdateNoteWrapper(a) => a.community(context).await,
+ CreateOrUpdateComment(a) => a.community(context).await,
CreateOrUpdatePost(a) => a.community(context).await,
Vote(a) => a.community(context).await,
UndoVote(a) => a.community(context).await,
@@ -99,32 +133,40 @@ impl InCommunity for AnnouncableActivities {
mod tests {
use crate::{
- activity_lists::SharedInboxActivities,
+ activity_lists::{GroupInboxActivities, PersonInboxActivities, SharedInboxActivities},
protocol::tests::{test_json, test_parse_lemmy_item},
};
use lemmy_utils::error::LemmyResult;
+ #[test]
+ fn test_group_inbox() -> LemmyResult<()> {
+ test_parse_lemmy_item::("assets/lemmy/activities/following/follow.json")?;
+ test_parse_lemmy_item::(
+ "assets/lemmy/activities/create_or_update/create_note.json",
+ )?;
+ Ok(())
+ }
+
+ #[test]
+ fn test_person_inbox() -> LemmyResult<()> {
+ test_parse_lemmy_item::(
+ "assets/lemmy/activities/following/accept.json",
+ )?;
+ test_parse_lemmy_item::(
+ "assets/lemmy/activities/create_or_update/create_note.json",
+ )?;
+ test_parse_lemmy_item::(
+ "assets/lemmy/activities/create_or_update/create_private_message.json",
+ )?;
+ test_json::("assets/mastodon/activities/follow.json")?;
+ Ok(())
+ }
+
#[test]
fn test_shared_inbox() -> LemmyResult<()> {
test_parse_lemmy_item::(
"assets/lemmy/activities/deletion/delete_user.json",
)?;
- test_parse_lemmy_item::(
- "assets/lemmy/activities/following/accept.json",
- )?;
- test_parse_lemmy_item::(
- "assets/lemmy/activities/create_or_update/create_comment.json",
- )?;
- test_parse_lemmy_item::(
- "assets/lemmy/activities/create_or_update/create_private_message.json",
- )?;
- test_parse_lemmy_item::(
- "assets/lemmy/activities/following/follow.json",
- )?;
- test_parse_lemmy_item::(
- "assets/lemmy/activities/create_or_update/create_comment.json",
- )?;
- test_json::("assets/mastodon/activities/follow.json")?;
Ok(())
}
}
diff --git a/crates/apub/src/objects/comment.rs b/crates/apub/src/objects/comment.rs
index 2c8ed9f9d..dc0721404 100644
--- a/crates/apub/src/objects/comment.rs
+++ b/crates/apub/src/objects/comment.rs
@@ -266,7 +266,7 @@ pub(crate) mod tests {
let url = Url::parse("https://enterprise.lemmy.ml/comment/38741")?;
let data = prepare_comment_test(&url, &context).await?;
- let json: Note = file_to_json_object("assets/lemmy/objects/comment.json")?;
+ let json: Note = file_to_json_object("assets/lemmy/objects/note.json")?;
ApubComment::verify(&json, &url, &context).await?;
let comment = ApubComment::from_json(json.clone(), &context).await?;
diff --git a/crates/apub/src/objects/mod.rs b/crates/apub/src/objects/mod.rs
index 58841b29e..f837f7ad3 100644
--- a/crates/apub/src/objects/mod.rs
+++ b/crates/apub/src/objects/mod.rs
@@ -15,7 +15,6 @@ use std::fmt::Debug;
pub mod comment;
pub mod community;
pub mod instance;
-pub mod note_wrapper;
pub mod person;
pub mod post;
pub mod private_message;
diff --git a/crates/apub/src/objects/note_wrapper.rs b/crates/apub/src/objects/note_wrapper.rs
deleted file mode 100644
index 5d613c7ae..000000000
--- a/crates/apub/src/objects/note_wrapper.rs
+++ /dev/null
@@ -1,85 +0,0 @@
-use super::comment::ApubComment;
-use crate::{
- objects::private_message::ApubPrivateMessage,
- protocol::objects::note_wrapper::NoteWrapper,
-};
-use activitypub_federation::{config::Data, kinds::public, traits::Object};
-use chrono::{DateTime, Utc};
-use lemmy_api_common::{context::LemmyContext, LemmyErrorType};
-use lemmy_utils::error::{LemmyError, LemmyResult};
-use serde_json::{from_value, to_value};
-use url::Url;
-
-/// Private messages and public comments are quite awkward in Activitypub, because the json
-/// format looks identical. They only way to differentiate them is to check for the presence
-/// or absence of `https://www.w3.org/ns/activitystreams#Public` in `to` or `cc` which this
-/// wrapper does.
-#[derive(Debug)]
-pub(crate) struct ApubNote {}
-
-#[async_trait::async_trait]
-impl Object for ApubNote {
- type DataType = LemmyContext;
- type Kind = NoteWrapper;
- type Error = LemmyError;
-
- fn last_refreshed_at(&self) -> Option> {
- None
- }
-
- #[tracing::instrument(skip_all)]
- async fn read_from_id(
- _object_id: Url,
- _context: &Data,
- ) -> LemmyResult