From a7b72ed5c4b6646671b47817f3cf112f9f44552b Mon Sep 17 00:00:00 2001
From: Felix Ableitner <me@nutomic.com>
Date: Wed, 25 Nov 2020 18:44:49 +0100
Subject: [PATCH] Set valid context for our extra fields (ref #1220)

---
 Cargo.lock                                    |  4 +--
 docker/federation/start-local-instances.bash  |  2 +-
 lemmy_apub/Cargo.toml                         |  2 +-
 lemmy_apub/src/activities/send/comment.rs     | 25 ++++++++++---------
 lemmy_apub/src/activities/send/community.rs   | 17 +++++++------
 lemmy_apub/src/activities/send/post.rs        | 25 ++++++++++---------
 .../src/activities/send/private_message.rs    | 11 ++++----
 lemmy_apub/src/activities/send/user.rs        |  7 +++---
 lemmy_apub/src/extensions/context.rs          | 18 +++++++++++++
 lemmy_apub/src/extensions/mod.rs              |  1 +
 lemmy_apub/src/http/community.rs              |  5 ++--
 lemmy_apub/src/http/user.rs                   |  4 +--
 lemmy_apub/src/objects/comment.rs             |  3 ++-
 lemmy_apub/src/objects/community.rs           |  4 +--
 lemmy_apub/src/objects/post.rs                |  4 +--
 lemmy_apub/src/objects/private_message.rs     |  3 ++-
 lemmy_apub/src/objects/user.rs                |  3 ++-
 17 files changed, 83 insertions(+), 55 deletions(-)
 create mode 100644 lemmy_apub/src/extensions/context.rs

diff --git a/Cargo.lock b/Cargo.lock
index b2247c87..6b746928 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,9 +2,9 @@
 # It is not intended for manual editing.
 [[package]]
 name = "activitystreams"
-version = "0.7.0-alpha.6"
+version = "0.7.0-alpha.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b1afe32371e466a791ced0d6ef6e6b97822bb1a279ee4cc41c4324e61cd0b2b"
+checksum = "5e9fedbe571e267d9b93d071bdc4493f944022c6cce717ebb27d352026fc81c4"
 dependencies = [
  "chrono",
  "mime",
diff --git a/docker/federation/start-local-instances.bash b/docker/federation/start-local-instances.bash
index 3c374e37..ec2712f1 100755
--- a/docker/federation/start-local-instances.bash
+++ b/docker/federation/start-local-instances.bash
@@ -1,7 +1,7 @@
 #!/bin/bash
 set -e
 
-sudo docker build ../../ --file ../dev/Dockerfile -t lemmy-federation:latest
+sudo docker build ../../ --file ../dev/volume_mount.dockerfile -t lemmy-federation:latest
 
 for Item in alpha beta gamma delta epsilon ; do
   sudo mkdir -p volumes/pictrs_$Item
diff --git a/lemmy_apub/Cargo.toml b/lemmy_apub/Cargo.toml
index 6dd68bc8..5610ed69 100644
--- a/lemmy_apub/Cargo.toml
+++ b/lemmy_apub/Cargo.toml
@@ -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.6"
+activitystreams = "0.7.0-alpha.7"
 activitystreams-ext = "0.1.0-alpha.2"
 bcrypt = "0.8"
 chrono = { version = "0.4", features = ["serde"] }
diff --git a/lemmy_apub/src/activities/send/comment.rs b/lemmy_apub/src/activities/send/comment.rs
index fa0c8b33..2aee7b6e 100644
--- a/lemmy_apub/src/activities/send/comment.rs
+++ b/lemmy_apub/src/activities/send/comment.rs
@@ -1,6 +1,7 @@
 use crate::{
   activities::send::generate_activity_id,
   activity_queue::{send_comment_mentions, send_to_community},
+  extensions::context::lemmy_context,
   fetcher::get_or_fetch_and_upsert_user,
   ActorType,
   ApubLikeableType,
@@ -62,7 +63,7 @@ impl ApubObjectType for Comment {
 
     let mut create = Create::new(creator.actor_id.to_owned(), note.into_any_base()?);
     create
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(CreateType::Create)?)
       .set_to(public())
       .set_many_ccs(ccs)
@@ -95,7 +96,7 @@ impl ApubObjectType for Comment {
 
     let mut update = Update::new(creator.actor_id.to_owned(), note.into_any_base()?);
     update
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UpdateType::Update)?)
       .set_to(public())
       .set_many_ccs(ccs)
@@ -119,7 +120,7 @@ impl ApubObjectType for Comment {
 
     let mut delete = Delete::new(creator.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -145,7 +146,7 @@ impl ApubObjectType for Comment {
     // Generate a fake delete activity, with the correct object
     let mut delete = Delete::new(creator.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -153,7 +154,7 @@ impl ApubObjectType for Comment {
     // Undo that fake activity
     let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -174,7 +175,7 @@ impl ApubObjectType for Comment {
 
     let mut remove = Remove::new(mod_.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     remove
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(RemoveType::Remove)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -196,7 +197,7 @@ impl ApubObjectType for Comment {
     // Generate a fake delete activity, with the correct object
     let mut remove = Remove::new(mod_.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     remove
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(RemoveType::Remove)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -204,7 +205,7 @@ impl ApubObjectType for Comment {
     // Undo that fake activity
     let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -230,7 +231,7 @@ impl ApubLikeableType for Comment {
 
     let mut like = Like::new(creator.actor_id.to_owned(), note.into_any_base()?);
     like
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(LikeType::Like)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -253,7 +254,7 @@ impl ApubLikeableType for Comment {
 
     let mut dislike = Dislike::new(creator.actor_id.to_owned(), note.into_any_base()?);
     dislike
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DislikeType::Dislike)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -280,7 +281,7 @@ impl ApubLikeableType for Comment {
 
     let mut like = Like::new(creator.actor_id.to_owned(), note.into_any_base()?);
     like
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DislikeType::Dislike)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -288,7 +289,7 @@ impl ApubLikeableType for Comment {
     // Undo that fake activity
     let mut undo = Undo::new(creator.actor_id.to_owned(), like.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
diff --git a/lemmy_apub/src/activities/send/community.rs b/lemmy_apub/src/activities/send/community.rs
index 2373596f..775f8c25 100644
--- a/lemmy_apub/src/activities/send/community.rs
+++ b/lemmy_apub/src/activities/send/community.rs
@@ -2,6 +2,7 @@ use crate::{
   activities::send::generate_activity_id,
   activity_queue::{send_activity_single_dest, send_to_community_followers},
   check_is_apub_id_valid,
+  extensions::context::lemmy_context,
   fetcher::get_or_fetch_and_upsert_user,
   ActorType,
 };
@@ -71,7 +72,7 @@ impl ActorType for Community {
 
     let mut accept = Accept::new(self.actor_id.to_owned(), follow.into_any_base()?);
     accept
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(AcceptType::Accept)?)
       .set_to(user.actor_id()?);
 
@@ -83,7 +84,7 @@ impl ActorType for Community {
   async fn send_delete(&self, context: &LemmyContext) -> Result<(), LemmyError> {
     let mut delete = Delete::new(self.actor_id()?, self.actor_id()?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(public())
       .set_many_ccs(vec![self.get_followers_url()?]);
@@ -96,14 +97,14 @@ impl ActorType for Community {
   async fn send_undo_delete(&self, context: &LemmyContext) -> Result<(), LemmyError> {
     let mut delete = Delete::new(self.actor_id()?, self.actor_id()?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(public())
       .set_many_ccs(vec![self.get_followers_url()?]);
 
     let mut undo = Undo::new(self.actor_id()?, delete.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(public())
       .set_many_ccs(vec![self.get_followers_url()?]);
@@ -116,7 +117,7 @@ impl ActorType for Community {
   async fn send_remove(&self, context: &LemmyContext) -> Result<(), LemmyError> {
     let mut remove = Remove::new(self.actor_id()?, self.actor_id()?);
     remove
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(RemoveType::Remove)?)
       .set_to(public())
       .set_many_ccs(vec![self.get_followers_url()?]);
@@ -129,7 +130,7 @@ impl ActorType for Community {
   async fn send_undo_remove(&self, context: &LemmyContext) -> Result<(), LemmyError> {
     let mut remove = Remove::new(self.actor_id()?, self.actor_id()?);
     remove
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(RemoveType::Remove)?)
       .set_to(public())
       .set_many_ccs(vec![self.get_followers_url()?]);
@@ -137,7 +138,7 @@ impl ActorType for Community {
     // Undo that fake activity
     let mut undo = Undo::new(self.actor_id()?, remove.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(LikeType::Like)?)
       .set_to(public())
       .set_many_ccs(vec![self.get_followers_url()?]);
@@ -155,7 +156,7 @@ impl ActorType for Community {
   ) -> Result<(), LemmyError> {
     let mut announce = Announce::new(self.actor_id.to_owned(), activity);
     announce
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(AnnounceType::Announce)?)
       .set_to(public())
       .set_many_ccs(vec![self.get_followers_url()?]);
diff --git a/lemmy_apub/src/activities/send/post.rs b/lemmy_apub/src/activities/send/post.rs
index 32035952..da78667f 100644
--- a/lemmy_apub/src/activities/send/post.rs
+++ b/lemmy_apub/src/activities/send/post.rs
@@ -1,6 +1,7 @@
 use crate::{
   activities::send::generate_activity_id,
   activity_queue::send_to_community,
+  extensions::context::lemmy_context,
   ActorType,
   ApubLikeableType,
   ApubObjectType,
@@ -40,7 +41,7 @@ impl ApubObjectType for Post {
 
     let mut create = Create::new(creator.actor_id.to_owned(), page.into_any_base()?);
     create
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(CreateType::Create)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -61,7 +62,7 @@ impl ApubObjectType for Post {
 
     let mut update = Update::new(creator.actor_id.to_owned(), page.into_any_base()?);
     update
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UpdateType::Update)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -79,7 +80,7 @@ impl ApubObjectType for Post {
 
     let mut delete = Delete::new(creator.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -101,7 +102,7 @@ impl ApubObjectType for Post {
 
     let mut delete = Delete::new(creator.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -109,7 +110,7 @@ impl ApubObjectType for Post {
     // Undo that fake activity
     let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -127,7 +128,7 @@ impl ApubObjectType for Post {
 
     let mut remove = Remove::new(mod_.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     remove
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(RemoveType::Remove)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -145,7 +146,7 @@ impl ApubObjectType for Post {
 
     let mut remove = Remove::new(mod_.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     remove
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(RemoveType::Remove)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -153,7 +154,7 @@ impl ApubObjectType for Post {
     // Undo that fake activity
     let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -176,7 +177,7 @@ impl ApubLikeableType for Post {
 
     let mut like = Like::new(creator.actor_id.to_owned(), page.into_any_base()?);
     like
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(LikeType::Like)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -196,7 +197,7 @@ impl ApubLikeableType for Post {
 
     let mut dislike = Dislike::new(creator.actor_id.to_owned(), page.into_any_base()?);
     dislike
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DislikeType::Dislike)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -220,7 +221,7 @@ impl ApubLikeableType for Post {
 
     let mut like = Like::new(creator.actor_id.to_owned(), page.into_any_base()?);
     like
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(LikeType::Like)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
@@ -228,7 +229,7 @@ impl ApubLikeableType for Post {
     // Undo that fake activity
     let mut undo = Undo::new(creator.actor_id.to_owned(), like.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(public())
       .set_many_ccs(vec![community.actor_id()?]);
diff --git a/lemmy_apub/src/activities/send/private_message.rs b/lemmy_apub/src/activities/send/private_message.rs
index 51d14029..23528b5c 100644
--- a/lemmy_apub/src/activities/send/private_message.rs
+++ b/lemmy_apub/src/activities/send/private_message.rs
@@ -1,6 +1,7 @@
 use crate::{
   activities::send::generate_activity_id,
   activity_queue::send_activity_single_dest,
+  extensions::context::lemmy_context,
   ActorType,
   ApubObjectType,
   ToApub,
@@ -33,7 +34,7 @@ impl ApubObjectType for PrivateMessage {
     let mut create = Create::new(creator.actor_id.to_owned(), note.into_any_base()?);
 
     create
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(CreateType::Create)?)
       .set_to(recipient.actor_id()?);
 
@@ -50,7 +51,7 @@ impl ApubObjectType for PrivateMessage {
 
     let mut update = Update::new(creator.actor_id.to_owned(), note.into_any_base()?);
     update
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UpdateType::Update)?)
       .set_to(recipient.actor_id()?);
 
@@ -64,7 +65,7 @@ impl ApubObjectType for PrivateMessage {
 
     let mut delete = Delete::new(creator.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(recipient.actor_id()?);
 
@@ -82,14 +83,14 @@ impl ApubObjectType for PrivateMessage {
 
     let mut delete = Delete::new(creator.actor_id.to_owned(), Url::parse(&self.ap_id)?);
     delete
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(DeleteType::Delete)?)
       .set_to(recipient.actor_id()?);
 
     // Undo that fake activity
     let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(recipient.actor_id()?);
 
diff --git a/lemmy_apub/src/activities/send/user.rs b/lemmy_apub/src/activities/send/user.rs
index 2839d83b..a94f241d 100644
--- a/lemmy_apub/src/activities/send/user.rs
+++ b/lemmy_apub/src/activities/send/user.rs
@@ -1,6 +1,7 @@
 use crate::{
   activities::send::generate_activity_id,
   activity_queue::send_activity_single_dest,
+  extensions::context::lemmy_context,
   ActorType,
 };
 use activitystreams::{
@@ -61,7 +62,7 @@ impl ActorType for User_ {
 
     let mut follow = Follow::new(self.actor_id.to_owned(), community.actor_id()?);
     follow
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(FollowType::Follow)?)
       .set_to(community.actor_id()?);
 
@@ -82,14 +83,14 @@ impl ActorType for User_ {
 
     let mut follow = Follow::new(self.actor_id.to_owned(), community.actor_id()?);
     follow
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(FollowType::Follow)?)
       .set_to(community.actor_id()?);
 
     // Undo that fake activity
     let mut undo = Undo::new(Url::parse(&self.actor_id)?, follow.into_any_base()?);
     undo
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(generate_activity_id(UndoType::Undo)?)
       .set_to(community.actor_id()?);
 
diff --git a/lemmy_apub/src/extensions/context.rs b/lemmy_apub/src/extensions/context.rs
new file mode 100644
index 00000000..fe52ab95
--- /dev/null
+++ b/lemmy_apub/src/extensions/context.rs
@@ -0,0 +1,18 @@
+use activitystreams::{base::AnyBase, context};
+use lemmy_utils::LemmyError;
+use serde_json::json;
+
+pub(crate) fn lemmy_context() -> Result<Vec<AnyBase>, LemmyError> {
+  let context_ext = AnyBase::from_arbitrary_json(json!(
+  {
+    "sc": "http://schema.org#",
+    "category": "sc:category",
+    "sensitive": "as:sensitive",
+    "stickied": "as:stickied",
+    "comments_enabled": {
+    "kind": "sc:Boolean",
+    "id": "pt:commentsEnabled"
+    }
+  }))?;
+  Ok(vec![AnyBase::from(context()), context_ext])
+}
diff --git a/lemmy_apub/src/extensions/mod.rs b/lemmy_apub/src/extensions/mod.rs
index f4723a94..4b4c0866 100644
--- a/lemmy_apub/src/extensions/mod.rs
+++ b/lemmy_apub/src/extensions/mod.rs
@@ -1,3 +1,4 @@
+pub(crate) mod context;
 pub(crate) mod group_extensions;
 pub(crate) mod page_extension;
 pub(crate) mod signatures;
diff --git a/lemmy_apub/src/http/community.rs b/lemmy_apub/src/http/community.rs
index bd9c86fe..0e2f2802 100644
--- a/lemmy_apub/src/http/community.rs
+++ b/lemmy_apub/src/http/community.rs
@@ -1,4 +1,5 @@
 use crate::{
+  extensions::context::lemmy_context,
   http::{create_apub_response, create_apub_tombstone_response},
   ActorType,
   ToApub,
@@ -56,7 +57,7 @@ pub async fn get_apub_community_followers(
 
   let mut collection = UnorderedCollection::new();
   collection
-    .set_context(activitystreams::context())
+    .set_many_contexts(lemmy_context()?)
     .set_id(community.get_followers_url()?)
     .set_total_items(community_followers.len() as u64);
   Ok(create_apub_response(&collection))
@@ -88,7 +89,7 @@ pub async fn get_apub_community_outbox(
   let mut collection = OrderedCollection::new();
   collection
     .set_many_items(pages)
-    .set_context(activitystreams::context())
+    .set_many_contexts(lemmy_context()?)
     .set_id(community.get_outbox_url()?)
     .set_total_items(len as u64);
   Ok(create_apub_response(&collection))
diff --git a/lemmy_apub/src/http/user.rs b/lemmy_apub/src/http/user.rs
index 31ed5d85..0f2e1a71 100644
--- a/lemmy_apub/src/http/user.rs
+++ b/lemmy_apub/src/http/user.rs
@@ -1,4 +1,4 @@
-use crate::{http::create_apub_response, ActorType, ToApub};
+use crate::{extensions::context::lemmy_context, http::create_apub_response, ActorType, ToApub};
 use activitystreams::{
   base::BaseExt,
   collection::{CollectionExt, OrderedCollection},
@@ -42,7 +42,7 @@ pub async fn get_apub_user_outbox(
   let mut collection = OrderedCollection::new();
   collection
     .set_many_items(Vec::<Url>::new())
-    .set_context(activitystreams::context())
+    .set_many_contexts(lemmy_context()?)
     .set_id(user.get_outbox_url()?)
     .set_total_items(0_u64);
   Ok(create_apub_response(&collection))
diff --git a/lemmy_apub/src/objects/comment.rs b/lemmy_apub/src/objects/comment.rs
index c3d17e6e..277a55d0 100644
--- a/lemmy_apub/src/objects/comment.rs
+++ b/lemmy_apub/src/objects/comment.rs
@@ -1,4 +1,5 @@
 use crate::{
+  extensions::context::lemmy_context,
   fetcher::{
     get_or_fetch_and_insert_comment,
     get_or_fetch_and_insert_post,
@@ -64,7 +65,7 @@ impl ToApub for Comment {
 
     comment
       // Not needed when the Post is embedded in a collection (like for community outbox)
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(Url::parse(&self.ap_id)?)
       .set_published(convert_datetime(self.published))
       .set_to(community.actor_id)
diff --git a/lemmy_apub/src/objects/community.rs b/lemmy_apub/src/objects/community.rs
index c5a614ba..2b383ba5 100644
--- a/lemmy_apub/src/objects/community.rs
+++ b/lemmy_apub/src/objects/community.rs
@@ -1,5 +1,5 @@
 use crate::{
-  extensions::group_extensions::GroupExtension,
+  extensions::{context::lemmy_context, group_extensions::GroupExtension},
   fetcher::get_or_fetch_and_upsert_user,
   objects::{
     check_object_domain,
@@ -53,7 +53,7 @@ impl ToApub for Community {
 
     let mut group = ApObject::new(Group::new());
     group
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(Url::parse(&self.actor_id)?)
       .set_name(self.title.to_owned())
       .set_published(convert_datetime(self.published))
diff --git a/lemmy_apub/src/objects/post.rs b/lemmy_apub/src/objects/post.rs
index f2bb9add..ce16f8d1 100644
--- a/lemmy_apub/src/objects/post.rs
+++ b/lemmy_apub/src/objects/post.rs
@@ -1,5 +1,5 @@
 use crate::{
-  extensions::page_extension::PageExtension,
+  extensions::{context::lemmy_context, page_extension::PageExtension},
   fetcher::{get_or_fetch_and_upsert_community, get_or_fetch_and_upsert_user},
   objects::{
     check_object_domain,
@@ -52,7 +52,7 @@ impl ToApub for Post {
       // Not needed when the Post is embedded in a collection (like for community outbox)
       // TODO: need to set proper context defining sensitive/commentsEnabled fields
       // https://git.asonix.dog/Aardwolf/activitystreams/issues/5
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(self.ap_id.parse::<Url>()?)
       // Use summary field to be consistent with mastodon content warning.
       // https://mastodon.xyz/@Louisa/103987265222901387.json
diff --git a/lemmy_apub/src/objects/private_message.rs b/lemmy_apub/src/objects/private_message.rs
index 1a3b1587..4e9af094 100644
--- a/lemmy_apub/src/objects/private_message.rs
+++ b/lemmy_apub/src/objects/private_message.rs
@@ -1,5 +1,6 @@
 use crate::{
   check_is_apub_id_valid,
+  extensions::context::lemmy_context,
   fetcher::get_or_fetch_and_upsert_user,
   objects::{
     check_object_domain,
@@ -41,7 +42,7 @@ impl ToApub for PrivateMessage {
     let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
 
     private_message
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(Url::parse(&self.ap_id.to_owned())?)
       .set_published(convert_datetime(self.published))
       .set_to(recipient.actor_id)
diff --git a/lemmy_apub/src/objects/user.rs b/lemmy_apub/src/objects/user.rs
index ae620c2c..ddf33656 100644
--- a/lemmy_apub/src/objects/user.rs
+++ b/lemmy_apub/src/objects/user.rs
@@ -1,4 +1,5 @@
 use crate::{
+  extensions::context::lemmy_context,
   objects::{check_object_domain, get_source_markdown_value, set_content_and_source},
   ActorType,
   FromApub,
@@ -32,7 +33,7 @@ impl ToApub for User_ {
   async fn to_apub(&self, _pool: &DbPool) -> Result<PersonExt, LemmyError> {
     let mut person = ApObject::new(Person::new());
     person
-      .set_context(activitystreams::context())
+      .set_many_contexts(lemmy_context()?)
       .set_id(Url::parse(&self.actor_id)?)
       .set_published(convert_datetime(self.published));
 
-- 
2.44.1