Move @context out of object/activity definitions

This commit is contained in:
Felix Ableitner 2021-10-28 17:25:26 +02:00
parent 2d04ff93f5
commit d89156810d
42 changed files with 179 additions and 473 deletions

View file

@ -1,23 +1,4 @@
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"comments_enabled": {
"id": "pt:commentsEnabled",
"type": "sc:Boolean"
},
"matrixUserId": {
"id": "as:alsoKnownAs",
"type": "sc:Text"
},
"moderators": "as:moderators",
"pt": "https://join-lemmy.org#",
"sc": "http://schema.org#",
"sensitive": "as:sensitive",
"stickied": "as:stickied"
},
"https://w3id.org/security/v1"
],
"id": "https://enterprise.lemmy.ml/comment/38741",
"type": "Note",
"attributedTo": "https://enterprise.lemmy.ml/u/picard",

View file

@ -1,23 +1,4 @@
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"comments_enabled": {
"id": "pt:commentsEnabled",
"type": "sc:Boolean"
},
"matrixUserId": {
"id": "as:alsoKnownAs",
"type": "sc:Text"
},
"moderators": "as:moderators",
"pt": "https://join-lemmy.org#",
"sc": "http://schema.org#",
"sensitive": "as:sensitive",
"stickied": "as:stickied"
},
"https://w3id.org/security/v1"
],
"id": "https://enterprise.lemmy.ml/c/tenforward",
"type": "Group",
"preferredUsername": "main",

View file

@ -1,23 +1,4 @@
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"comments_enabled": {
"id": "pt:commentsEnabled",
"type": "sc:Boolean"
},
"matrixUserId": {
"id": "as:alsoKnownAs",
"type": "sc:Text"
},
"moderators": "as:moderators",
"pt": "https://join-lemmy.org#",
"sc": "http://schema.org#",
"sensitive": "as:sensitive",
"stickied": "as:stickied"
},
"https://w3id.org/security/v1"
],
"id": "https://enterprise.lemmy.ml/u/picard",
"type": "Person",
"preferredUsername": "picard",

View file

@ -1,23 +1,4 @@
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"comments_enabled": {
"id": "pt:commentsEnabled",
"type": "sc:Boolean"
},
"matrixUserId": {
"id": "as:alsoKnownAs",
"type": "sc:Text"
},
"moderators": "as:moderators",
"pt": "https://join-lemmy.org#",
"sc": "http://schema.org#",
"sensitive": "as:sensitive",
"stickied": "as:stickied"
},
"https://w3id.org/security/v1"
],
"id": "https://enterprise.lemmy.ml/post/55143",
"type": "Page",
"attributedTo": "https://enterprise.lemmy.ml/u/picard",

View file

@ -1,23 +1,4 @@
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"comments_enabled": {
"id": "pt:commentsEnabled",
"type": "sc:Boolean"
},
"matrixUserId": {
"id": "as:alsoKnownAs",
"type": "sc:Text"
},
"moderators": "as:moderators",
"pt": "https://join-lemmy.org#",
"sc": "http://schema.org#",
"sensitive": "as:sensitive",
"stickied": "as:stickied"
},
"https://w3id.org/security/v1"
],
"id": "https://enterprise.lemmy.ml/private_message/1621",
"type": "ChatMessage",
"attributedTo": "https://enterprise.lemmy.ml/u/picard",

View file

@ -12,7 +12,6 @@ use crate::{
verify_person_in_community,
CreateOrUpdateType,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{
comment::{ApubComment, Note},
@ -20,13 +19,7 @@ use crate::{
person::ApubPerson,
},
};
use activitystreams::{
base::AnyBase,
link::Mention,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{link::Mention, public, unparsed::Unparsed};
use lemmy_api_common::{blocking, check_post_deleted_or_removed};
use lemmy_apub_lib::{
data::Data,
@ -54,8 +47,6 @@ pub struct CreateOrUpdateComment {
#[serde(rename = "type")]
kind: CreateOrUpdateType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -91,7 +82,6 @@ impl CreateOrUpdateComment {
tag: maa.tags,
kind,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};

View file

@ -12,18 +12,11 @@ use crate::{
verify_mod_action,
verify_person_in_community,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
generate_moderators_url,
objects::{community::ApubCommunity, person::ApubPerson},
};
use activitystreams::{
activity::kind::AddType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::AddType, public, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -49,8 +42,6 @@ pub struct AddMod {
#[serde(rename = "type")]
kind: AddType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -74,7 +65,6 @@ impl AddMod {
cc: vec![community.actor_id()],
kind: AddType::Add,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};

View file

@ -12,24 +12,17 @@ use crate::{
deletion::{delete::Delete, undo_delete::UndoDelete},
generate_activity_id,
post::create_or_update::CreateOrUpdatePost,
send_lemmy_activity,
verify_activity,
verify_is_public,
voting::{undo_vote::UndoVote, vote::Vote},
},
context::lemmy_context,
fetcher::object_id::ObjectId,
http::is_activity_already_known,
insert_activity,
objects::community::ApubCommunity,
send_lemmy_activity,
};
use activitystreams::{
activity::kind::AnnounceType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::AnnounceType, public, unparsed::Unparsed};
use lemmy_apub_lib::{
data::Data,
traits::{ActivityFields, ActivityHandler, ActorType},
@ -102,8 +95,6 @@ pub struct AnnounceActivity {
#[serde(rename = "type")]
kind: AnnounceType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -125,7 +116,6 @@ impl AnnounceActivity {
&AnnounceType::Announce,
&context.settings().get_protocol_and_hostname(),
)?,
context: lemmy_context(),
unparsed: Default::default(),
};
let inboxes = list_community_follower_inboxes(community, additional_inboxes, context).await?;

View file

@ -10,17 +10,10 @@ use crate::{
verify_mod_action,
verify_person_in_community,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
};
use activitystreams::{
activity::kind::BlockType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::BlockType, public, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -51,8 +44,6 @@ pub struct BlockUserFromCommunity {
#[serde(rename = "type")]
kind: BlockType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -75,7 +66,6 @@ impl BlockUserFromCommunity {
BlockType::Block,
&context.settings().get_protocol_and_hostname(),
)?,
context: lemmy_context(),
unparsed: Default::default(),
})
}

View file

@ -1,10 +1,12 @@
use crate::{
activities::community::announce::{AnnouncableActivities, AnnounceActivity},
activities::{
community::announce::{AnnouncableActivities, AnnounceActivity},
send_lemmy_activity,
},
check_is_apub_id_valid,
fetcher::object_id::ObjectId,
insert_activity,
objects::community::ApubCommunity,
send_lemmy_activity,
};
use itertools::Itertools;
use lemmy_apub_lib::traits::ActorType;

View file

@ -12,18 +12,11 @@ use crate::{
verify_mod_action,
verify_person_in_community,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
generate_moderators_url,
objects::{community::ApubCommunity, person::ApubPerson},
};
use activitystreams::{
activity::kind::RemoveType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::RemoveType, public, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -49,8 +42,6 @@ pub struct RemoveMod {
kind: RemoveType,
pub(in crate::activities) target: Url,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -72,7 +63,6 @@ impl RemoveMod {
object: ObjectId::new(removed_mod.actor_id()),
target: generate_moderators_url(&community.actor_id)?.into(),
id: id.clone(),
context: lemmy_context(),
cc: vec![community.actor_id()],
kind: RemoveType::Remove,
unparsed: Default::default(),

View file

@ -11,17 +11,10 @@ use crate::{
verify_mod_action,
verify_person_in_community,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
};
use activitystreams::{
activity::kind::UndoType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::UndoType, public, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -46,8 +39,6 @@ pub struct UndoBlockUserFromCommunity {
#[serde(rename = "type")]
kind: UndoType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -72,7 +63,6 @@ impl UndoBlockUserFromCommunity {
cc: vec![community.actor_id()],
kind: UndoType::Undo,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};

View file

@ -10,20 +10,13 @@ use crate::{
verify_mod_action,
verify_person_in_community,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{
community::{ApubCommunity, Group},
person::ApubPerson,
},
};
use activitystreams::{
activity::kind::UpdateType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::UpdateType, public, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -51,8 +44,6 @@ pub struct UpdateCommunity {
#[serde(rename = "type")]
kind: UpdateType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -74,7 +65,6 @@ impl UpdateCommunity {
cc: vec![community.actor_id()],
kind: UpdateType::Update,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};

View file

@ -14,17 +14,10 @@ use crate::{
verify_activity,
verify_is_public,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
};
use activitystreams::{
activity::kind::DeleteType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::DeleteType, public, unparsed::Unparsed};
use anyhow::anyhow;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
@ -79,8 +72,6 @@ pub struct Delete {
/// deleting their own content.
pub(in crate::activities::deletion) summary: Option<String>,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -159,7 +150,6 @@ impl Delete {
DeleteType::Delete,
&context.settings().get_protocol_and_hostname(),
)?,
context: lemmy_context(),
unparsed: Default::default(),
})
}

View file

@ -15,17 +15,10 @@ use crate::{
verify_activity,
verify_is_public,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
};
use activitystreams::{
activity::kind::UndoType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::UndoType, public, unparsed::Unparsed};
use anyhow::anyhow;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
@ -52,8 +45,6 @@ pub struct UndoDelete {
#[serde(rename = "type")]
kind: UndoType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -128,7 +119,6 @@ impl UndoDelete {
cc: vec![community.actor_id()],
kind: UndoType::Undo,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};

View file

@ -1,16 +1,14 @@
use crate::{
activities::{following::follow::FollowCommunity, generate_activity_id, verify_activity},
context::lemmy_context,
activities::{
following::follow::FollowCommunity,
generate_activity_id,
send_lemmy_activity,
verify_activity,
},
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
send_lemmy_activity,
};
use activitystreams::{
activity::kind::AcceptType,
base::AnyBase,
primitives::OneOrMany,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::AcceptType, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -32,8 +30,6 @@ pub struct AcceptFollowCommunity {
#[serde(rename = "type")]
kind: AcceptType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -59,7 +55,6 @@ impl AcceptFollowCommunity {
AcceptType::Accept,
&context.settings().get_protocol_and_hostname(),
)?,
context: lemmy_context(),
unparsed: Default::default(),
};
let inbox = vec![person.inbox_url()];

View file

@ -2,21 +2,15 @@ use crate::{
activities::{
following::accept::AcceptFollowCommunity,
generate_activity_id,
send_lemmy_activity,
verify_activity,
verify_person,
verify_person_in_community,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
send_lemmy_activity,
};
use activitystreams::{
activity::kind::FollowType,
base::AnyBase,
primitives::OneOrMany,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::FollowType, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -41,8 +35,6 @@ pub struct FollowCommunity {
#[serde(rename = "type")]
kind: FollowType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -62,7 +54,6 @@ impl FollowCommunity {
FollowType::Follow,
&context.settings().get_protocol_and_hostname(),
)?,
context: lemmy_context(),
unparsed: Default::default(),
})
}

View file

@ -2,20 +2,14 @@ use crate::{
activities::{
following::follow::FollowCommunity,
generate_activity_id,
send_lemmy_activity,
verify_activity,
verify_person,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
send_lemmy_activity,
};
use activitystreams::{
activity::kind::UndoType,
base::AnyBase,
primitives::OneOrMany,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::UndoType, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -40,8 +34,6 @@ pub struct UndoFollowCommunity {
#[serde(rename = "type")]
kind: UndoType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -62,7 +54,6 @@ impl UndoFollowCommunity {
UndoType::Undo,
&context.settings().get_protocol_and_hostname(),
)?,
context: lemmy_context(),
unparsed: Default::default(),
};
let inbox = vec![community.shared_inbox_or_inbox_url()];

View file

@ -1,13 +1,19 @@
use crate::{
check_is_apub_id_valid,
context::WithContext,
fetcher::object_id::ObjectId,
generate_moderators_url,
insert_activity,
objects::{community::ApubCommunity, person::ApubPerson},
};
use activitystreams::public;
use anyhow::anyhow;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{traits::ActivityFields, verify::verify_domains_match};
use lemmy_apub_lib::{
activity_queue::send_activity,
traits::{ActivityFields, ActorType},
verify::verify_domains_match,
};
use lemmy_db_schema::source::community::Community;
use lemmy_db_views_actor::{
community_person_ban_view::CommunityPersonBanView,
@ -15,6 +21,7 @@ use lemmy_db_views_actor::{
};
use lemmy_utils::{settings::structs::Settings, LemmyError};
use lemmy_websocket::LemmyContext;
use log::info;
use serde::{Deserialize, Serialize};
use strum_macros::ToString;
use url::{ParseError, Url};
@ -146,3 +153,47 @@ where
);
Url::parse(&id)
}
async fn send_lemmy_activity<T: Serialize>(
context: &LemmyContext,
activity: &T,
activity_id: &Url,
actor: &dyn ActorType,
inboxes: Vec<Url>,
sensitive: bool,
) -> Result<(), LemmyError> {
if !context.settings().federation.enabled || inboxes.is_empty() {
return Ok(());
}
let activity = WithContext::new(activity);
info!("Sending activity {}", activity_id.to_string());
// Don't send anything to ourselves
// TODO: this should be a debug assert
let hostname = context.settings().get_hostname_without_port()?;
let inboxes: Vec<&Url> = inboxes
.iter()
.filter(|i| i.domain().expect("valid inbox url") != hostname)
.collect();
let serialised_activity = serde_json::to_string(&activity)?;
insert_activity(
activity_id,
serialised_activity.clone(),
true,
sensitive,
context.pool(),
)
.await?;
send_activity(
serialised_activity,
actor,
inboxes,
context.client(),
context.activity_queue(),
)
.await
}

View file

@ -12,7 +12,6 @@ use crate::{
verify_person_in_community,
CreateOrUpdateType,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{
community::ApubCommunity,
@ -20,7 +19,7 @@ use crate::{
post::{ApubPost, Page},
},
};
use activitystreams::{base::AnyBase, primitives::OneOrMany, public, unparsed::Unparsed};
use activitystreams::{public, unparsed::Unparsed};
use anyhow::anyhow;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
@ -44,8 +43,6 @@ pub struct CreateOrUpdatePost {
#[serde(rename = "type")]
kind: CreateOrUpdateType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -69,7 +66,6 @@ impl CreateOrUpdatePost {
cc: vec![community.actor_id()],
kind,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
})
}

View file

@ -1,14 +1,18 @@
use crate::{
activities::{generate_activity_id, verify_activity, verify_person, CreateOrUpdateType},
context::lemmy_context,
activities::{
generate_activity_id,
send_lemmy_activity,
verify_activity,
verify_person,
CreateOrUpdateType,
},
fetcher::object_id::ObjectId,
objects::{
person::ApubPerson,
private_message::{ApubPrivateMessage, ChatMessage},
},
send_lemmy_activity,
};
use activitystreams::{base::AnyBase, primitives::OneOrMany, unparsed::Unparsed};
use activitystreams::unparsed::Unparsed;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -24,8 +28,6 @@ use url::Url;
#[derive(Clone, Debug, Deserialize, Serialize, ActivityFields)]
#[serde(rename_all = "camelCase")]
pub struct CreateOrUpdatePrivateMessage {
#[serde(rename = "@context")]
pub context: OneOrMany<AnyBase>,
id: Url,
actor: ObjectId<ApubPerson>,
to: [ObjectId<ApubPerson>; 1],
@ -54,7 +56,6 @@ impl CreateOrUpdatePrivateMessage {
&context.settings().get_protocol_and_hostname(),
)?;
let create_or_update = CreateOrUpdatePrivateMessage {
context: lemmy_context(),
id: id.clone(),
actor: ObjectId::new(actor.actor_id()),
to: [ObjectId::new(recipient.actor_id())],

View file

@ -1,16 +1,9 @@
use crate::{
activities::{generate_activity_id, verify_activity, verify_person},
context::lemmy_context,
activities::{generate_activity_id, send_lemmy_activity, verify_activity, verify_person},
fetcher::object_id::ObjectId,
objects::{person::ApubPerson, private_message::ApubPrivateMessage},
send_lemmy_activity,
};
use activitystreams::{
activity::kind::DeleteType,
base::AnyBase,
primitives::OneOrMany,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::DeleteType, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -35,8 +28,6 @@ pub struct DeletePrivateMessage {
#[serde(rename = "type")]
kind: DeleteType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -56,7 +47,6 @@ impl DeletePrivateMessage {
DeleteType::Delete,
&context.settings().get_protocol_and_hostname(),
)?,
context: lemmy_context(),
unparsed: Default::default(),
})
}

View file

@ -2,20 +2,14 @@ use crate::{
activities::{
generate_activity_id,
private_message::delete::DeletePrivateMessage,
send_lemmy_activity,
verify_activity,
verify_person,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{person::ApubPerson, private_message::ApubPrivateMessage},
send_lemmy_activity,
};
use activitystreams::{
activity::kind::UndoType,
base::AnyBase,
primitives::OneOrMany,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::UndoType, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -40,8 +34,6 @@ pub struct UndoDeletePrivateMessage {
#[serde(rename = "type")]
kind: UndoType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -69,7 +61,6 @@ impl UndoDeletePrivateMessage {
object,
kind: UndoType::Undo,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};
let inbox = vec![recipient.shared_inbox_or_inbox_url()];

View file

@ -1,17 +1,15 @@
use crate::{
activities::{generate_activity_id, verify_activity, verify_person_in_community},
context::lemmy_context,
activities::{
generate_activity_id,
send_lemmy_activity,
verify_activity,
verify_person_in_community,
},
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
send_lemmy_activity,
PostOrComment,
};
use activitystreams::{
activity::kind::FlagType,
base::AnyBase,
primitives::OneOrMany,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::FlagType, unparsed::Unparsed};
use lemmy_api_common::{blocking, comment::CommentReportResponse, post::PostReportResponse};
use lemmy_apub_lib::{
data::Data,
@ -40,8 +38,6 @@ pub struct Report {
#[serde(rename = "type")]
kind: FlagType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -67,7 +63,6 @@ impl Report {
summary: reason,
kind,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};
send_lemmy_activity(

View file

@ -14,18 +14,11 @@ use crate::{
vote::{Vote, VoteType},
},
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
PostOrComment,
};
use activitystreams::{
activity::kind::UndoType,
base::AnyBase,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{activity::kind::UndoType, public, unparsed::Unparsed};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -49,8 +42,6 @@ pub struct UndoVote {
#[serde(rename = "type")]
kind: UndoType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -81,7 +72,6 @@ impl UndoVote {
cc: vec![community.actor_id()],
kind: UndoType::Undo,
id: id.clone(),
context: lemmy_context(),
unparsed: Default::default(),
};
let activity = AnnouncableActivities::UndoVote(undo_vote);

View file

@ -10,12 +10,11 @@ use crate::{
verify_person_in_community,
voting::{vote_comment, vote_post},
},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{community::ApubCommunity, person::ApubPerson},
PostOrComment,
};
use activitystreams::{base::AnyBase, primitives::OneOrMany, public, unparsed::Unparsed};
use activitystreams::{public, unparsed::Unparsed};
use anyhow::anyhow;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
@ -71,8 +70,6 @@ pub struct Vote {
#[serde(rename = "type")]
pub(in crate::activities::voting) kind: VoteType,
id: Url,
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
unparsed: Unparsed,
}
@ -92,7 +89,6 @@ impl Vote {
cc: vec![community.actor_id()],
kind: kind.clone(),
id: generate_activity_id(kind, &context.settings().get_protocol_and_hostname())?,
context: lemmy_context(),
unparsed: Default::default(),
})
}

View file

@ -1,17 +1,10 @@
use crate::{
collections::CommunityContext,
context::lemmy_context,
fetcher::object_id::ObjectId,
generate_moderators_url,
objects::person::ApubPerson,
};
use activitystreams::{
base::AnyBase,
chrono::NaiveDateTime,
collection::kind::OrderedCollectionType,
primitives::OneOrMany,
url::Url,
};
use activitystreams::{chrono::NaiveDateTime, collection::kind::OrderedCollectionType};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{traits::ApubObject, verify::verify_domains_match};
use lemmy_db_schema::{
@ -22,13 +15,12 @@ use lemmy_db_views_actor::community_moderator_view::CommunityModeratorView;
use lemmy_utils::LemmyError;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use url::Url;
#[skip_serializing_none]
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupModerators {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
r#type: OrderedCollectionType,
id: Url,
ordered_items: Vec<ObjectId<ApubPerson>>,
@ -75,7 +67,6 @@ impl ApubObject for ApubCommunityModerators {
.map(|m| ObjectId::<ApubPerson>::new(m.moderator.actor_id.clone().into_inner()))
.collect();
Ok(GroupModerators {
context: lemmy_context(),
r#type: OrderedCollectionType::OrderedCollection,
id: generate_moderators_url(&data.0.actor_id)?.into(),
ordered_items,

View file

@ -1,17 +1,11 @@
use crate::{
activities::{post::create_or_update::CreateOrUpdatePost, CreateOrUpdateType},
collections::CommunityContext,
context::lemmy_context,
generate_outbox_url,
objects::{person::ApubPerson, post::ApubPost},
};
use activitystreams::{
base::AnyBase,
chrono::NaiveDateTime,
collection::kind::OrderedCollectionType,
primitives::OneOrMany,
url::Url,
};
use activitystreams::collection::kind::OrderedCollectionType;
use chrono::NaiveDateTime;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
data::Data,
@ -25,13 +19,12 @@ use lemmy_db_schema::{
use lemmy_utils::LemmyError;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use url::Url;
#[skip_serializing_none]
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GroupOutbox {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
r#type: OrderedCollectionType,
id: Url,
ordered_items: Vec<CreateOrUpdatePost>,
@ -88,7 +81,6 @@ impl ApubObject for ApubCommunityOutbox {
}
Ok(GroupOutbox {
context: lemmy_context(),
r#type: OrderedCollectionType::OrderedCollection,
id: generate_outbox_url(&data.0.actor_id)?.into(),
ordered_items,

View file

@ -1,28 +1,51 @@
use activitystreams::{base::AnyBase, context, primitives::OneOrMany};
use serde::{Deserialize, Serialize};
use serde_json::json;
use url::Url;
pub(crate) fn lemmy_context() -> OneOrMany<AnyBase> {
let context_ext = AnyBase::from_arbitrary_json(json!(
{
"sc": "http://schema.org#",
"sensitive": "as:sensitive",
"stickied": "as:stickied",
"pt": "https://join-lemmy.org#",
"comments_enabled": {
"type": "sc:Boolean",
"id": "pt:commentsEnabled"
},
"moderators": "as:moderators",
"matrixUserId": {
"type": "sc:Text",
"id": "as:alsoKnownAs"
},
}))
.expect("parse context");
OneOrMany::from(vec![
AnyBase::from(context()),
context_ext,
AnyBase::from(Url::parse("https://w3id.org/security/v1").expect("parse context")),
])
lazy_static! {
static ref CONTEXT: OneOrMany<AnyBase> = {
let context_ext = AnyBase::from_arbitrary_json(json!(
{
"sc": "http://schema.org#",
"sensitive": "as:sensitive",
"stickied": "as:stickied",
"pt": "https://join-lemmy.org#",
"comments_enabled": {
"type": "sc:Boolean",
"id": "pt:commentsEnabled"
},
"moderators": "as:moderators",
"matrixUserId": {
"type": "sc:Text",
"id": "as:alsoKnownAs"
},
}))
.expect("parse context");
OneOrMany::from(vec![
AnyBase::from(context()),
context_ext,
AnyBase::from(Url::parse("https://w3id.org/security/v1").expect("parse context")),
])
};
}
#[derive(Serialize, Deserialize)]
pub(crate) struct WithContext<T> {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(flatten)]
inner: T,
}
impl<T> WithContext<T> {
pub(crate) fn new(inner: T) -> WithContext<T> {
WithContext {
context: CONTEXT.clone(),
inner,
}
}
pub(crate) fn inner(self) -> T {
self.inner
}
}

View file

@ -22,7 +22,6 @@ use url::Url;
/// fetch through the search). This should be configurable.
static REQUEST_LIMIT: i32 = 25;
// TODO: after moving this file to library, remove lazy_static dependency from apub crate
lazy_static! {
static ref CLIENT: Client = Client::builder()
.user_agent(build_user_agent(&Settings::get()))

View file

@ -2,7 +2,7 @@ use crate::objects::{
comment::{ApubComment, Note},
post::{ApubPost, Page},
};
use activitystreams::chrono::NaiveDateTime;
use chrono::NaiveDateTime;
use lemmy_apub_lib::traits::ApubObject;
use lemmy_db_schema::source::{comment::CommentForm, post::PostForm};
use lemmy_utils::LemmyError;

View file

@ -7,8 +7,8 @@ use crate::{
post::{ApubPost, Page},
},
};
use activitystreams::chrono::NaiveDateTime;
use anyhow::anyhow;
use chrono::NaiveDateTime;
use itertools::Itertools;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{

View file

@ -10,7 +10,7 @@ use crate::{
community_outbox::ApubCommunityOutbox,
CommunityContext,
},
context::lemmy_context,
context::WithContext,
fetcher::object_id::ObjectId,
generate_outbox_url,
http::{
@ -82,9 +82,9 @@ pub async fn community_inbox(
) -> Result<HttpResponse, LemmyError> {
let unparsed = payload_to_string(payload).await?;
info!("Received community inbox activity {}", unparsed);
let activity = serde_json::from_str::<GroupInboxActivities>(&unparsed)?;
let activity = serde_json::from_str::<WithContext<GroupInboxActivities>>(&unparsed)?;
receive_group_inbox(activity.clone(), request, &context).await?;
receive_group_inbox(activity.inner(), request, &context).await?;
Ok(HttpResponse::Ok().finish())
}
@ -127,9 +127,9 @@ pub(crate) async fn get_apub_community_followers(
let mut collection = UnorderedCollection::new();
collection
.set_many_contexts(lemmy_context())
.set_id(community.followers_url.into())
.set_total_items(community_followers.len() as u64);
let collection = WithContext::new(collection);
Ok(create_apub_response(&collection))
}

View file

@ -1,5 +1,6 @@
use crate::{
check_is_apub_id_valid,
context::WithContext,
fetcher::get_or_fetch_and_upsert_actor,
http::{
community::{receive_group_inbox, GroupInboxActivities},
@ -55,8 +56,8 @@ pub async fn shared_inbox(
) -> Result<HttpResponse, LemmyError> {
let unparsed = payload_to_string(payload).await?;
info!("Received shared inbox activity {}", unparsed);
let activity = serde_json::from_str::<SharedInboxActivities>(&unparsed)?;
match activity {
let activity = serde_json::from_str::<WithContext<SharedInboxActivities>>(&unparsed)?;
match activity.inner() {
SharedInboxActivities::GroupInboxActivities(g) => {
receive_group_inbox(g, request, &context).await
}
@ -134,7 +135,7 @@ where
{
HttpResponse::Ok()
.content_type(APUB_JSON_CONTENT_TYPE)
.json(data)
.json(WithContext::new(data))
}
fn create_apub_tombstone_response<T>(data: &T) -> HttpResponse<Body>
@ -144,7 +145,7 @@ where
HttpResponse::Gone()
.content_type(APUB_JSON_CONTENT_TYPE)
.status(StatusCode::GONE)
.json(data)
.json(WithContext::new(data))
}
#[derive(Deserialize)]

View file

@ -8,7 +8,7 @@ use crate::{
undo_delete::UndoDeletePrivateMessage,
},
},
context::lemmy_context,
context::WithContext,
generate_outbox_url,
http::{
create_apub_response,
@ -80,8 +80,8 @@ pub async fn person_inbox(
) -> Result<HttpResponse, LemmyError> {
let unparsed = payload_to_string(payload).await?;
info!("Received person inbox activity {}", unparsed);
let activity = serde_json::from_str::<PersonInboxActivities>(&unparsed)?;
receive_person_inbox(activity, request, &context).await
let activity = serde_json::from_str::<WithContext<PersonInboxActivities>>(&unparsed)?;
receive_person_inbox(activity.inner(), request, &context).await
}
pub(in crate::http) async fn receive_person_inbox(
@ -104,8 +104,8 @@ pub(crate) async fn get_apub_person_outbox(
let mut collection = OrderedCollection::new();
collection
.set_many_items(Vec::<Url>::new())
.set_many_contexts(lemmy_context())
.set_id(generate_outbox_url(&person.actor_id)?.into())
.set_total_items(0_u64);
let collection = WithContext::new(collection);
Ok(create_apub_response(&collection))
}

View file

@ -12,15 +12,10 @@ extern crate lazy_static;
use crate::fetcher::post_or_comment::PostOrComment;
use anyhow::{anyhow, Context};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
activity_queue::send_activity,
traits::ActorType,
webfinger::{webfinger_resolve_actor, WebfingerType},
};
use lemmy_apub_lib::webfinger::{webfinger_resolve_actor, WebfingerType};
use lemmy_db_schema::{newtypes::DbUrl, source::activity::Activity, DbPool};
use lemmy_utils::{location_info, settings::structs::Settings, LemmyError};
use lemmy_websocket::LemmyContext;
use log::info;
use serde::Serialize;
use std::net::IpAddr;
use url::{ParseError, Url};
@ -195,46 +190,3 @@ where
.await??;
Ok(())
}
pub(crate) async fn send_lemmy_activity<T: Serialize>(
context: &LemmyContext,
activity: &T,
activity_id: &Url,
actor: &dyn ActorType,
inboxes: Vec<Url>,
sensitive: bool,
) -> Result<(), LemmyError> {
if !context.settings().federation.enabled || inboxes.is_empty() {
return Ok(());
}
info!("Sending activity {}", activity_id.to_string());
// Don't send anything to ourselves
// TODO: this should be a debug assert
let hostname = context.settings().get_hostname_without_port()?;
let inboxes: Vec<&Url> = inboxes
.iter()
.filter(|i| i.domain().expect("valid inbox url") != hostname)
.collect();
let serialised_activity = serde_json::to_string(&activity)?;
insert_activity(
activity_id,
serialised_activity.clone(),
true,
sensitive,
context.pool(),
)
.await?;
send_activity(
serialised_activity,
actor,
inboxes,
context.client(),
context.activity_queue(),
)
.await
}

View file

@ -1,6 +1,5 @@
use crate::{
activities::{verify_is_public, verify_person_in_community},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{
community::ApubCommunity,
@ -11,16 +10,9 @@ use crate::{
},
PostOrComment,
};
use activitystreams::{
base::AnyBase,
chrono::NaiveDateTime,
object::kind::NoteType,
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
use activitystreams::{object::kind::NoteType, public, unparsed::Unparsed};
use anyhow::anyhow;
use chrono::{DateTime, FixedOffset};
use chrono::{DateTime, FixedOffset, NaiveDateTime};
use html2md::parse_html;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
@ -52,11 +44,6 @@ use url::Url;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Note {
/// Necessary to make this optional to make Pleroma Create/Note work.
/// TODO: change this so that context is not defined in the struct itself, but added in activity
/// queue and http handlers
#[serde(rename = "@context")]
context: Option<OneOrMany<AnyBase>>,
r#type: NoteType,
id: Url,
pub(crate) attributed_to: ObjectId<ApubPerson>,
@ -206,7 +193,6 @@ impl ApubObject for ApubComment {
};
let note = Note {
context: Some(lemmy_context()),
r#type: NoteType::Note,
id: self.ap_id.to_owned().into_inner(),
attributed_to: ObjectId::new(creator.actor_id),

View file

@ -5,7 +5,6 @@ use crate::{
community_outbox::ApubCommunityOutbox,
CommunityContext,
},
context::lemmy_context,
fetcher::object_id::ObjectId,
generate_moderators_url,
generate_outbox_url,
@ -13,13 +12,10 @@ use crate::{
};
use activitystreams::{
actor::{kind::GroupType, Endpoints},
base::AnyBase,
chrono::NaiveDateTime,
object::kind::ImageType,
primitives::OneOrMany,
unparsed::Unparsed,
};
use chrono::{DateTime, FixedOffset};
use chrono::{DateTime, FixedOffset, NaiveDateTime};
use itertools::Itertools;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
@ -50,8 +46,6 @@ use url::Url;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Group {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(rename = "type")]
kind: GroupType,
pub(crate) id: Url,
@ -181,7 +175,6 @@ impl ApubObject for ApubCommunity {
});
let group = Group {
context: lemmy_context(),
kind: GroupType::Group,
id: self.actor_id(),
preferred_username: self.name.clone(),

View file

@ -1,18 +1,10 @@
use crate::{
check_is_apub_id_valid,
context::lemmy_context,
generate_outbox_url,
objects::{get_summary_from_string_or_source, ImageObject, Source},
};
use activitystreams::{
actor::Endpoints,
base::AnyBase,
chrono::NaiveDateTime,
object::{kind::ImageType, Tombstone},
primitives::OneOrMany,
unparsed::Unparsed,
};
use chrono::{DateTime, FixedOffset};
use activitystreams::{actor::Endpoints, object::kind::ImageType, unparsed::Unparsed};
use chrono::{DateTime, FixedOffset, NaiveDateTime};
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
signatures::PublicKey,
@ -44,8 +36,6 @@ pub enum UserTypes {
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Person {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(rename = "type")]
kind: UserTypes,
id: Url,
@ -99,7 +89,7 @@ impl From<DbPerson> for ApubPerson {
impl ApubObject for ApubPerson {
type DataType = LemmyContext;
type ApubType = Person;
type TombstoneType = Tombstone;
type TombstoneType = ();
fn last_refreshed_at(&self) -> Option<NaiveDateTime> {
Some(self.last_refreshed_at)
@ -146,7 +136,6 @@ impl ApubObject for ApubPerson {
});
let person = Person {
context: lemmy_context(),
kind,
id: self.actor_id.to_owned().into_inner(),
preferred_username: self.name.clone(),
@ -170,7 +159,7 @@ impl ApubObject for ApubPerson {
Ok(person)
}
fn to_tombstone(&self) -> Result<Tombstone, LemmyError> {
fn to_tombstone(&self) -> Result<(), LemmyError> {
unimplemented!()
}

View file

@ -1,6 +1,5 @@
use crate::{
activities::{verify_is_public, verify_person_in_community},
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{
community::ApubCommunity,
@ -11,9 +10,7 @@ use crate::{
},
};
use activitystreams::{
base::AnyBase,
object::kind::{ImageType, PageType},
primitives::OneOrMany,
public,
unparsed::Unparsed,
};
@ -49,8 +46,6 @@ use url::Url;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Page {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
r#type: PageType,
id: Url,
pub(crate) attributed_to: ObjectId<ApubPerson>,
@ -196,7 +191,6 @@ impl ApubObject for ApubPost {
});
let page = Page {
context: lemmy_context(),
r#type: PageType::Page,
id: self.ap_id.clone().into(),
attributed_to: ObjectId::new(creator.actor_id),

View file

@ -1,17 +1,10 @@
use crate::{
context::lemmy_context,
fetcher::object_id::ObjectId,
objects::{person::ApubPerson, Source},
};
use activitystreams::{
base::AnyBase,
chrono::NaiveDateTime,
object::Tombstone,
primitives::OneOrMany,
unparsed::Unparsed,
};
use activitystreams::unparsed::Unparsed;
use anyhow::anyhow;
use chrono::{DateTime, FixedOffset};
use chrono::{DateTime, FixedOffset, NaiveDateTime};
use html2md::parse_html;
use lemmy_api_common::blocking;
use lemmy_apub_lib::{
@ -37,8 +30,6 @@ use url::Url;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ChatMessage {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
r#type: ChatMessageType,
id: Url,
pub(crate) attributed_to: ObjectId<ApubPerson>,
@ -104,7 +95,7 @@ impl From<PrivateMessage> for ApubPrivateMessage {
impl ApubObject for ApubPrivateMessage {
type DataType = LemmyContext;
type ApubType = ChatMessage;
type TombstoneType = Tombstone;
type TombstoneType = ();
fn last_refreshed_at(&self) -> Option<NaiveDateTime> {
None
@ -137,7 +128,6 @@ impl ApubObject for ApubPrivateMessage {
blocking(context.pool(), move |conn| Person::read(conn, recipient_id)).await??;
let note = ChatMessage {
context: lemmy_context(),
r#type: ChatMessageType::ChatMessage,
id: self.ap_id.clone().into(),
attributed_to: ObjectId::new(creator.actor_id),
@ -155,7 +145,7 @@ impl ApubObject for ApubPrivateMessage {
Ok(note)
}
fn to_tombstone(&self) -> Result<Tombstone, LemmyError> {
fn to_tombstone(&self) -> Result<(), LemmyError> {
unimplemented!()
}

View file

@ -1,10 +1,5 @@
use crate::context::lemmy_context;
use activitystreams::{
base::AnyBase,
chrono::{DateTime, FixedOffset, NaiveDateTime},
object::kind::TombstoneType,
primitives::OneOrMany,
};
use activitystreams::object::kind::TombstoneType;
use chrono::{DateTime, FixedOffset, NaiveDateTime};
use lemmy_utils::utils::convert_datetime;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
@ -13,8 +8,6 @@ use serde_with::skip_serializing_none;
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Tombstone {
#[serde(rename = "@context")]
context: OneOrMany<AnyBase>,
#[serde(rename = "type")]
kind: TombstoneType,
former_type: String,
@ -24,7 +17,6 @@ pub struct Tombstone {
impl Tombstone {
pub fn new<T: ToString>(former_type: T, updated_time: NaiveDateTime) -> Tombstone {
Tombstone {
context: lemmy_context(),
kind: TombstoneType::Tombstone,
former_type: former_type.to_string(),
deleted: convert_datetime(updated_time),