diff --git a/Cargo.lock b/Cargo.lock
index ba6e7afa4..800aa0240 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
[[package]]
name = "activitypub_federation"
-version = "0.1.0"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b34a144dc98c419543690aa8f182d8675ebe0610775982b8fdee84a00f70fe"
+checksum = "446e75aefabf78ed9cc7e175f0d90c74f478086fb9bc571a9614fb0b7cbe35d4"
dependencies = [
"activitypub_federation_derive",
"actix-web",
@@ -19,6 +19,7 @@ dependencies = [
"http",
"http-signature-normalization-actix",
"http-signature-normalization-reqwest",
+ "itertools",
"once_cell",
"openssl",
"reqwest",
@@ -33,13 +34,13 @@ dependencies = [
[[package]]
name = "activitypub_federation_derive"
-version = "0.1.0"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a2aaf58676b669d3b0dedf6bbb44fa518b5a6657b2959561d77899c668dec2a"
+checksum = "07520b54fc0f22ad30b90399b2a2689c6e5c113df0642ca3fa2f7ee823e54126"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -135,7 +136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6"
dependencies = [
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -287,7 +288,7 @@ dependencies = [
"actix-router",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -298,7 +299,7 @@ checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -344,9 +345,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.56"
+version = "1.0.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27"
+checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc"
[[package]]
name = "arrayvec"
@@ -391,18 +392,18 @@ checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
name = "async-trait"
-version = "0.1.53"
+version = "0.1.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600"
+checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -862,7 +863,7 @@ dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
"strsim",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -876,7 +877,7 @@ dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
"strsim",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -890,7 +891,7 @@ dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
"strsim",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -901,7 +902,7 @@ checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a"
dependencies = [
"darling_core 0.12.4",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -912,7 +913,7 @@ checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b"
dependencies = [
"darling_core 0.13.1",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -923,7 +924,7 @@ checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5"
dependencies = [
"darling_core 0.14.1",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -962,7 +963,7 @@ dependencies = [
"darling 0.12.4",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -974,7 +975,7 @@ dependencies = [
"darling 0.14.1",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -984,7 +985,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58a94ace95092c5acb1e97a7e846b310cfbd499652f72297da7493f618a98d73"
dependencies = [
"derive_builder_core 0.10.2",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -994,7 +995,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68"
dependencies = [
"derive_builder_core 0.11.2",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -1007,7 +1008,7 @@ dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
"rustc_version",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -1054,7 +1055,7 @@ checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -1134,7 +1135,7 @@ dependencies = [
"darling 0.13.1",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -1395,7 +1396,7 @@ checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -1587,14 +1588,14 @@ dependencies = [
"markup5ever",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
name = "http"
-version = "0.2.6"
+version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03"
+checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
dependencies = [
"bytes",
"fnv",
@@ -1643,9 +1644,9 @@ dependencies = [
[[package]]
name = "http-signature-normalization-reqwest"
-version = "0.5.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a15d4498e747f1cb1b0114ad651619932eac790815d2dcef0fa89bd016fd991"
+checksum = "630652b9b1f4c18064199c57cce4ad0352d1ec6ec8ad8ffcb0c71dea41ac6b79"
dependencies = [
"base64",
"bytes",
@@ -2327,7 +2328,7 @@ dependencies = [
"migrations_internals",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -2535,9 +2536,9 @@ dependencies = [
[[package]]
name = "once_cell"
-version = "1.10.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
+checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225"
[[package]]
name = "opaque-debug"
@@ -2547,18 +2548,30 @@ checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
[[package]]
name = "openssl"
-version = "0.10.38"
+version = "0.10.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95"
+checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e"
dependencies = [
"bitflags",
"cfg-if",
"foreign-types",
"libc",
"once_cell",
+ "openssl-macros",
"openssl-sys",
]
+[[package]]
+name = "openssl-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
+dependencies = [
+ "proc-macro2 1.0.39",
+ "quote 1.0.18",
+ "syn 1.0.96",
+]
+
[[package]]
name = "openssl-probe"
version = "0.1.5"
@@ -2567,9 +2580,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-sys"
-version = "0.9.72"
+version = "0.9.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb"
+checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1"
dependencies = [
"autocfg",
"cc",
@@ -2732,7 +2745,7 @@ dependencies = [
"pest_meta",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -2830,7 +2843,7 @@ checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -2893,7 +2906,7 @@ dependencies = [
"proc-macro-error-attr",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
"version_check",
]
@@ -2966,7 +2979,7 @@ dependencies = [
"itertools",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -3451,29 +3464,29 @@ checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4"
[[package]]
name = "serde"
-version = "1.0.136"
+version = "1.0.137"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
+checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.136"
+version = "1.0.137"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
+checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
name = "serde_json"
-version = "1.0.79"
+version = "1.0.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95"
+checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c"
dependencies = [
"indexmap",
"itoa",
@@ -3513,7 +3526,7 @@ dependencies = [
"darling 0.13.1",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -3537,7 +3550,7 @@ dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
"rustversion",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -3636,7 +3649,7 @@ checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -3709,7 +3722,7 @@ dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
"rustversion",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -3725,9 +3738,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "1.0.95"
+version = "1.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942"
+checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
@@ -3791,7 +3804,7 @@ checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -3894,7 +3907,7 @@ checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -3997,7 +4010,7 @@ dependencies = [
"proc-macro2 1.0.39",
"prost-build",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -4034,9 +4047,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
[[package]]
name = "tracing"
-version = "0.1.32"
+version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f"
+checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09"
dependencies = [
"cfg-if",
"log",
@@ -4066,7 +4079,7 @@ checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
]
[[package]]
@@ -4361,7 +4374,7 @@ dependencies = [
"log",
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
"wasm-bindgen-shared",
]
@@ -4395,7 +4408,7 @@ checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc"
dependencies = [
"proc-macro2 1.0.39",
"quote 1.0.18",
- "syn 1.0.95",
+ "syn 1.0.96",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
diff --git a/Cargo.toml b/Cargo.toml
index f74a0ba35..6c419d073 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -42,7 +42,7 @@ lemmy_db_schema = { version = "=0.16.5", path = "./crates/db_schema" }
lemmy_api_common = { version = "=0.16.5", path = "crates/api_common" }
lemmy_websocket = { version = "=0.16.5", path = "./crates/websocket" }
lemmy_routes = { version = "=0.16.5", path = "./crates/routes" }
-activitypub_federation = "0.1.0"
+activitypub_federation = "0.2.0"
diesel = "1.4.8"
diesel_migrations = "1.4.0"
serde = { version = "1.0.136", features = ["derive"] }
diff --git a/README.md b/README.md
index 8427e332d..6258d3598 100644
--- a/README.md
+++ b/README.md
@@ -29,6 +29,8 @@
·
Documentation
·
+ Matrix Chat
+ ·
Report Bug
·
Request Feature
diff --git a/api_tests/prepare-drone-federation-test.sh b/api_tests/prepare-drone-federation-test.sh
index 2dbfbe251..3356f0a81 100755
--- a/api_tests/prepare-drone-federation-test.sh
+++ b/api_tests/prepare-drone-federation-test.sh
@@ -1,7 +1,6 @@
#!/bin/bash
set -e
-export APUB_TESTING_SEND_SYNC=1
export RUST_BACKTRACE=1
export RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
diff --git a/config/defaults.hjson b/config/defaults.hjson
index 7cb91035f..acd956a8e 100644
--- a/config/defaults.hjson
+++ b/config/defaults.hjson
@@ -66,6 +66,9 @@
# see information. If running number is consistently close to the worker_count, you should
# increase it.
worker_count: 64
+ # Use federation debug mode. Allows connecting to http and localhost urls. Also sends outgoing
+ # activities synchronously for easier testing. Do not use in production.
+ debug: false
}
# Pictrs image server configuration.
pictrs_config: {
@@ -98,25 +101,11 @@
# Username for the admin user
admin_username: "admin"
# Password for the admin user. It must be at least 10 characters.
- admin_password: "my_passwd_longer_than_ten_characters"
+ admin_password: "tf6HHDS4RolWfFhk4Rq9"
# Name of the site (can be changed later)
site_name: "My Lemmy Instance"
# Email for the admin user (optional, can be omitted and set later through the website)
- admin_email: "string"
- sidebar: "string"
- description: "string"
- icon: "string"
- banner: "string"
- enable_downvotes: true
- open_registration: true
- enable_nsfw: true
- community_creation_admin_only: true
- require_email_verification: true
- require_application: true
- application_question: "string"
- private_instance: true
- default_theme: "string"
- default_post_listing_type: "string"
+ admin_email: "user@example.com"
}
# the domain name of your instance (mandatory)
hostname: "unset"
diff --git a/crates/api/Cargo.toml b/crates/api/Cargo.toml
index 0ef120e67..9c65978fc 100644
--- a/crates/api/Cargo.toml
+++ b/crates/api/Cargo.toml
@@ -21,7 +21,7 @@ lemmy_db_views_moderator = { version = "=0.16.5", path = "../db_views_moderator"
lemmy_db_views_actor = { version = "=0.16.5", path = "../db_views_actor", features = ["full"] }
lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["full"] }
lemmy_websocket = { version = "=0.16.5", path = "../websocket" }
-activitypub_federation = "0.1.0"
+activitypub_federation = "0.2.0"
diesel = "1.4.8"
bcrypt = "0.12.1"
chrono = { version = "0.4.19", features = ["serde"], default-features = false }
diff --git a/crates/api_common/src/lib.rs b/crates/api_common/src/lib.rs
index 6cb9a2f1f..30e38c922 100644
--- a/crates/api_common/src/lib.rs
+++ b/crates/api_common/src/lib.rs
@@ -9,3 +9,8 @@ pub mod site;
#[cfg(feature = "full")]
pub mod utils;
pub mod websocket;
+
+pub extern crate lemmy_db_schema;
+pub extern crate lemmy_db_views;
+pub extern crate lemmy_db_views_actor;
+pub extern crate lemmy_db_views_moderator;
diff --git a/crates/api_crud/Cargo.toml b/crates/api_crud/Cargo.toml
index e61a37f77..12ea4305c 100644
--- a/crates/api_crud/Cargo.toml
+++ b/crates/api_crud/Cargo.toml
@@ -15,7 +15,7 @@ lemmy_db_views = { version = "=0.16.5", path = "../db_views", features = ["full"
lemmy_db_views_actor = { version = "=0.16.5", path = "../db_views_actor", features = ["full"] }
lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["full"] }
lemmy_websocket = { version = "=0.16.5", path = "../websocket" }
-activitypub_federation = "0.1.0"
+activitypub_federation = "0.2.0"
bcrypt = "0.12.1"
serde_json = { version = "1.0.79", features = ["preserve_order"] }
serde = { version = "1.0.136", features = ["derive"] }
diff --git a/crates/api_crud/src/community/create.rs b/crates/api_crud/src/community/create.rs
index 1181afc39..3de024f8e 100644
--- a/crates/api_crud/src/community/create.rs
+++ b/crates/api_crud/src/community/create.rs
@@ -76,9 +76,7 @@ impl PerformCrud for CreateCommunity {
&context.settings().get_protocol_and_hostname(),
)?;
let community_actor_id_wrapped = ObjectId::::new(community_actor_id.clone());
- let community_dupe = community_actor_id_wrapped
- .dereference_local::(context)
- .await;
+ let community_dupe = community_actor_id_wrapped.dereference_local(context).await;
if community_dupe.is_ok() {
return Err(LemmyError::from_message("community_already_exists"));
}
diff --git a/crates/api_crud/src/site/read.rs b/crates/api_crud/src/site/read.rs
index 808dcf7d9..1ef84a91f 100644
--- a/crates/api_crud/src/site/read.rs
+++ b/crates/api_crud/src/site/read.rs
@@ -54,21 +54,8 @@ impl PerformCrud for GetSite {
let create_site = CreateSite {
name: setup.site_name.to_owned(),
- sidebar: setup.sidebar.to_owned(),
- description: setup.description.to_owned(),
- icon: setup.icon.to_owned(),
- banner: setup.banner.to_owned(),
- enable_downvotes: setup.enable_downvotes,
- open_registration: setup.open_registration,
- enable_nsfw: setup.enable_nsfw,
- community_creation_admin_only: setup.community_creation_admin_only,
- require_email_verification: setup.require_email_verification,
- require_application: setup.require_application,
- application_question: setup.application_question.to_owned(),
- private_instance: setup.private_instance,
- default_theme: setup.default_theme.to_owned(),
- default_post_listing_type: setup.default_post_listing_type.to_owned(),
auth: admin_jwt,
+ ..CreateSite::default()
};
create_site.perform(context, websocket_id).await?;
info!("Site {} created", setup.site_name);
diff --git a/crates/apub/Cargo.toml b/crates/apub/Cargo.toml
index 095247c6d..7ec5ece6a 100644
--- a/crates/apub/Cargo.toml
+++ b/crates/apub/Cargo.toml
@@ -19,7 +19,7 @@ lemmy_db_views = { version = "=0.16.5", path = "../db_views", features = ["full"
lemmy_db_views_actor = { version = "=0.16.5", path = "../db_views_actor", features = ["full"] }
lemmy_api_common = { version = "=0.16.5", path = "../api_common", features = ["full"] }
lemmy_websocket = { version = "=0.16.5", path = "../websocket" }
-activitypub_federation = "0.1.0"
+activitypub_federation = "0.2.0"
diesel = "1.4.8"
activitystreams-kinds = "0.2.1"
chrono = { version = "0.4.19", features = ["serde"], default-features = false }
diff --git a/crates/apub/assets/lemmy/activities/community/report_page.json b/crates/apub/assets/lemmy/activities/community/report_page.json
index 724beb43a..bd1691b57 100644
--- a/crates/apub/assets/lemmy/activities/community/report_page.json
+++ b/crates/apub/assets/lemmy/activities/community/report_page.json
@@ -1,6 +1,8 @@
{
"actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
- "to": "http://enterprise.lemmy.ml/c/main",
+ "to": [
+ "http://enterprise.lemmy.ml/c/main"
+ ],
"object": "http://enterprise.lemmy.ml/post/7",
"summary": "report this post",
"type": "Flag",
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 85291bc06..de080a8f9 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
@@ -1,12 +1,16 @@
{
"id": "http://enterprise.lemmy.ml/activities/create/987d05fa-f637-46d7-85be-13d112bc269f",
"actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
- "to": "http://ds9.lemmy.ml/u/lemmy_alpha",
+ "to": [
+ "http://ds9.lemmy.ml/u/lemmy_alpha"
+ ],
"object": {
"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",
+ "to": [
+ "http://ds9.lemmy.ml/u/lemmy_alpha"
+ ],
"content": "hello",
"mediaType": "text/html",
"source": {
diff --git a/crates/apub/assets/lemmy/objects/chat_message.json b/crates/apub/assets/lemmy/objects/chat_message.json
index e21312fc6..c639aef92 100644
--- a/crates/apub/assets/lemmy/objects/chat_message.json
+++ b/crates/apub/assets/lemmy/objects/chat_message.json
@@ -2,7 +2,9 @@
"id": "https://enterprise.lemmy.ml/private_message/1621",
"type": "ChatMessage",
"attributedTo": "https://enterprise.lemmy.ml/u/picard",
- "to": "https://queer.hacktivis.me/users/lanodan",
+ "to": [
+ "https://queer.hacktivis.me/users/lanodan"
+ ],
"content": "Hello hello, testing
\n",
"mediaType": "text/html",
"source": {
diff --git a/crates/apub/src/activities/block/block_user.rs b/crates/apub/src/activities/block/block_user.rs
index 4478dead6..32feea604 100644
--- a/crates/apub/src/activities/block/block_user.rs
+++ b/crates/apub/src/activities/block/block_user.rs
@@ -1,6 +1,6 @@
use crate::{
activities::{
- block::{generate_cc, generate_instance_inboxes, SiteOrCommunity},
+ block::{generate_cc, SiteOrCommunity},
community::{announce::GetCommunity, send_activity_in_community},
generate_activity_id,
send_lemmy_activity,
@@ -10,14 +10,14 @@ use crate::{
},
activity_lists::AnnouncableActivities,
local_instance,
- objects::{community::ApubCommunity, person::ApubPerson},
+ objects::{community::ApubCommunity, instance::remote_instance_inboxes, person::ApubPerson},
protocol::activities::block::block_user::BlockUser,
ActorType,
};
use activitypub_federation::{
core::object_id::ObjectId,
data::Data,
- traits::ActivityHandler,
+ traits::{ActivityHandler, Actor},
utils::verify_domains_match,
};
use activitystreams_kinds::{activity::BlockType, public};
@@ -89,17 +89,16 @@ impl BlockUser {
context,
)
.await?;
- let block_id = block.id.clone();
match target {
SiteOrCommunity::Site(_) => {
- let inboxes = generate_instance_inboxes(user, context.pool()).await?;
- send_lemmy_activity(context, &block, &block_id, mod_, inboxes, false).await
+ let inboxes = remote_instance_inboxes(context.pool()).await?;
+ send_lemmy_activity(context, block, mod_, inboxes, false).await
}
SiteOrCommunity::Community(c) => {
let activity = AnnouncableActivities::BlockUser(block);
- let inboxes = vec![user.shared_inbox_or_inbox_url()];
- send_activity_in_community(activity, &block_id, mod_, c, inboxes, context).await
+ let inboxes = vec![user.shared_inbox_or_inbox()];
+ send_activity_in_community(activity, mod_, c, inboxes, context).await
}
}
}
@@ -127,7 +126,7 @@ impl ActivityHandler for BlockUser {
verify_is_public(&self.to, &self.cc)?;
match self
.target
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?
{
SiteOrCommunity::Site(site) => {
@@ -165,15 +164,15 @@ impl ActivityHandler for BlockUser {
let expires = self.expires.map(|u| u.naive_local());
let mod_person = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let blocked_person = self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let target = self
.target
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
match target {
SiteOrCommunity::Site(_site) => {
@@ -258,7 +257,7 @@ impl GetCommunity for BlockUser {
) -> Result {
let target = self
.target
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
match target {
SiteOrCommunity::Community(c) => Ok(c),
diff --git a/crates/apub/src/activities/block/mod.rs b/crates/apub/src/activities/block/mod.rs
index dec16cf3d..386260de2 100644
--- a/crates/apub/src/activities/block/mod.rs
+++ b/crates/apub/src/activities/block/mod.rs
@@ -1,5 +1,5 @@
use crate::{
- objects::{community::ApubCommunity, instance::ApubSite, person::ApubPerson},
+ objects::{community::ApubCommunity, instance::ApubSite},
protocol::objects::{group::Group, instance::Instance},
ActorType,
};
@@ -124,16 +124,3 @@ async fn generate_cc(target: &SiteOrCommunity, pool: &DbPool) -> Result
SiteOrCommunity::Community(c) => vec![c.actor_id()],
})
}
-
-async fn generate_instance_inboxes(
- blocked_user: &ApubPerson,
- pool: &DbPool,
-) -> Result, LemmyError> {
- let mut inboxes: Vec = blocking(pool, Site::read_remote_sites)
- .await??
- .into_iter()
- .map(|s| s.inbox_url.into())
- .collect();
- inboxes.push(blocked_user.shared_inbox_or_inbox_url());
- Ok(inboxes)
-}
diff --git a/crates/apub/src/activities/block/undo_block_user.rs b/crates/apub/src/activities/block/undo_block_user.rs
index a68653038..97ac34825 100644
--- a/crates/apub/src/activities/block/undo_block_user.rs
+++ b/crates/apub/src/activities/block/undo_block_user.rs
@@ -1,6 +1,6 @@
use crate::{
activities::{
- block::{generate_cc, generate_instance_inboxes, SiteOrCommunity},
+ block::{generate_cc, SiteOrCommunity},
community::{announce::GetCommunity, send_activity_in_community},
generate_activity_id,
send_lemmy_activity,
@@ -8,14 +8,14 @@ use crate::{
},
activity_lists::AnnouncableActivities,
local_instance,
- objects::{community::ApubCommunity, person::ApubPerson},
+ objects::{community::ApubCommunity, instance::remote_instance_inboxes, person::ApubPerson},
protocol::activities::block::{block_user::BlockUser, undo_block_user::UndoBlockUser},
ActorType,
};
use activitypub_federation::{
core::object_id::ObjectId,
data::Data,
- traits::ActivityHandler,
+ traits::{ActivityHandler, Actor},
utils::verify_domains_match,
};
use activitystreams_kinds::{activity::UndoType, public};
@@ -57,15 +57,15 @@ impl UndoBlockUser {
unparsed: Default::default(),
};
- let inboxes = vec![user.shared_inbox_or_inbox_url()];
+ let mut inboxes = vec![user.shared_inbox_or_inbox()];
match target {
SiteOrCommunity::Site(_) => {
- let inboxes = generate_instance_inboxes(user, context.pool()).await?;
- send_lemmy_activity(context, &undo, &id, mod_, inboxes, false).await
+ inboxes.append(&mut remote_instance_inboxes(context.pool()).await?);
+ send_lemmy_activity(context, undo, mod_, inboxes, false).await
}
SiteOrCommunity::Community(c) => {
let activity = AnnouncableActivities::UndoBlockUser(undo);
- send_activity_in_community(activity, &id, mod_, c, inboxes, context).await
+ send_activity_in_community(activity, mod_, c, inboxes, context).await
}
}
}
@@ -106,17 +106,17 @@ impl ActivityHandler for UndoBlockUser {
let expires = self.object.expires.map(|u| u.naive_local());
let mod_person = self
.actor
- .dereference::(context, instance, request_counter)
+ .dereference(context, instance, request_counter)
.await?;
let blocked_person = self
.object
.object
- .dereference::(context, instance, request_counter)
+ .dereference(context, instance, request_counter)
.await?;
match self
.object
.target
- .dereference::(context, instance, request_counter)
+ .dereference(context, instance, request_counter)
.await?
{
SiteOrCommunity::Site(_site) => {
diff --git a/crates/apub/src/activities/community/add_mod.rs b/crates/apub/src/activities/community/add_mod.rs
index 58d1006c8..ada7afdf1 100644
--- a/crates/apub/src/activities/community/add_mod.rs
+++ b/crates/apub/src/activities/community/add_mod.rs
@@ -18,7 +18,11 @@ use crate::{
protocol::activities::community::add_mod::AddMod,
ActorType,
};
-use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
+use activitypub_federation::{
+ core::object_id::ObjectId,
+ data::Data,
+ traits::{ActivityHandler, Actor},
+};
use activitystreams_kinds::{activity::AddType, public};
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{
@@ -56,8 +60,8 @@ impl AddMod {
};
let activity = AnnouncableActivities::AddMod(add);
- let inboxes = vec![added_mod.shared_inbox_or_inbox_url()];
- send_activity_in_community(activity, &id, actor, community, inboxes, context).await
+ let inboxes = vec![added_mod.shared_inbox_or_inbox()];
+ send_activity_in_community(activity, actor, community, inboxes, context).await
}
}
@@ -104,7 +108,7 @@ impl ActivityHandler for AddMod {
let community = self.get_community(context, request_counter).await?;
let new_mod = self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
// If we had to refetch the community while parsing the activity, then the new mod has already
@@ -127,7 +131,7 @@ impl ActivityHandler for AddMod {
// write mod log
let actor = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let form = ModAddCommunityForm {
mod_person_id: actor.id,
diff --git a/crates/apub/src/activities/community/announce.rs b/crates/apub/src/activities/community/announce.rs
index a2e00c786..e5419680e 100644
--- a/crates/apub/src/activities/community/announce.rs
+++ b/crates/apub/src/activities/community/announce.rs
@@ -53,15 +53,7 @@ impl AnnounceActivity {
) -> Result<(), LemmyError> {
let announce = AnnounceActivity::new(object.clone(), community, context)?;
let inboxes = community.get_follower_inboxes(context).await?;
- send_lemmy_activity(
- context,
- &announce,
- &announce.id,
- community,
- inboxes.clone(),
- false,
- )
- .await?;
+ send_lemmy_activity(context, announce, community, inboxes.clone(), false).await?;
// Pleroma and Mastodon can't handle activities like Announce/Create/Page. So for
// compatibility, we also send Announce/Page so that they can follow Lemmy communities.
@@ -71,15 +63,7 @@ impl AnnounceActivity {
_ => return Ok(()),
};
let announce_compat = AnnounceActivity::new(object, community, context)?;
- send_lemmy_activity(
- context,
- &announce_compat,
- &announce_compat.id,
- community,
- inboxes,
- false,
- )
- .await?;
+ send_lemmy_activity(context, announce_compat, community, inboxes, false).await?;
Ok(())
}
}
diff --git a/crates/apub/src/activities/community/mod.rs b/crates/apub/src/activities/community/mod.rs
index fe2aaf784..850625717 100644
--- a/crates/apub/src/activities/community/mod.rs
+++ b/crates/apub/src/activities/community/mod.rs
@@ -6,7 +6,7 @@ use crate::{
protocol::activities::community::announce::AnnounceActivity,
ActorType,
};
-use activitypub_federation::core::object_id::ObjectId;
+use activitypub_federation::{core::object_id::ObjectId, traits::Actor};
use lemmy_utils::error::LemmyError;
use lemmy_websocket::LemmyContext;
use url::Url;
@@ -18,16 +18,18 @@ pub mod report;
pub mod update;
#[tracing::instrument(skip_all)]
-pub(crate) async fn send_activity_in_community(
+pub(crate) async fn send_activity_in_community(
activity: AnnouncableActivities,
- activity_id: &Url,
- actor: &T,
+ actor: &ActorT,
community: &ApubCommunity,
mut inboxes: Vec,
context: &LemmyContext,
-) -> Result<(), LemmyError> {
- inboxes.push(community.shared_inbox_or_inbox_url());
- send_lemmy_activity(context, &activity, activity_id, actor, inboxes, false).await?;
+) -> Result<(), LemmyError>
+where
+ ActorT: Actor + ActorType,
+{
+ inboxes.push(community.shared_inbox_or_inbox());
+ send_lemmy_activity(context, activity.clone(), actor, inboxes, false).await?;
if community.local {
AnnounceActivity::send(activity, community, context).await?;
@@ -44,6 +46,6 @@ async fn get_community_from_moderators_url(
) -> Result {
let community_id = Url::parse(&moderators.to_string().replace("/moderators", ""))?;
ObjectId::new(community_id)
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await
}
diff --git a/crates/apub/src/activities/community/remove_mod.rs b/crates/apub/src/activities/community/remove_mod.rs
index 6af0e722d..7c5d817f9 100644
--- a/crates/apub/src/activities/community/remove_mod.rs
+++ b/crates/apub/src/activities/community/remove_mod.rs
@@ -18,7 +18,11 @@ use crate::{
protocol::activities::community::remove_mod::RemoveMod,
ActorType,
};
-use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
+use activitypub_federation::{
+ core::object_id::ObjectId,
+ data::Data,
+ traits::{ActivityHandler, Actor},
+};
use activitystreams_kinds::{activity::RemoveType, public};
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{
@@ -56,8 +60,8 @@ impl RemoveMod {
};
let activity = AnnouncableActivities::RemoveMod(remove);
- let inboxes = vec![removed_mod.shared_inbox_or_inbox_url()];
- send_activity_in_community(activity, &id, actor, community, inboxes, context).await
+ let inboxes = vec![removed_mod.shared_inbox_or_inbox()];
+ send_activity_in_community(activity, actor, community, inboxes, context).await
}
}
@@ -104,7 +108,7 @@ impl ActivityHandler for RemoveMod {
let community = self.get_community(context, request_counter).await?;
let remove_mod = self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let form = CommunityModeratorForm {
@@ -119,7 +123,7 @@ impl ActivityHandler for RemoveMod {
// write mod log
let actor = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let form = ModAddCommunityForm {
mod_person_id: actor.id,
diff --git a/crates/apub/src/activities/community/report.rs b/crates/apub/src/activities/community/report.rs
index b3f129e37..c3b50abfe 100644
--- a/crates/apub/src/activities/community/report.rs
+++ b/crates/apub/src/activities/community/report.rs
@@ -6,7 +6,11 @@ use crate::{
ActorType,
PostOrComment,
};
-use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
+use activitypub_federation::{
+ core::object_id::ObjectId,
+ data::Data,
+ traits::{ActivityHandler, Actor},
+};
use activitystreams_kinds::activity::FlagType;
use lemmy_api_common::{comment::CommentReportResponse, post::PostReportResponse, utils::blocking};
use lemmy_db_schema::{
@@ -30,9 +34,7 @@ impl Report {
reason: String,
context: &LemmyContext,
) -> Result<(), LemmyError> {
- let community = community_id
- .dereference_local::(context)
- .await?;
+ let community = community_id.dereference_local(context).await?;
let kind = FlagType::Flag;
let id = generate_activity_id(
kind.clone(),
@@ -40,22 +42,16 @@ impl Report {
)?;
let report = Report {
actor: ObjectId::new(actor.actor_id()),
- to: ObjectId::new(community.actor_id()),
+ to: [ObjectId::new(community.actor_id())],
object: object_id,
summary: reason,
kind,
id: id.clone(),
unparsed: Default::default(),
};
- send_lemmy_activity(
- context,
- &report,
- &id,
- actor,
- vec![community.shared_inbox_or_inbox_url()],
- false,
- )
- .await
+
+ let inbox = vec![community.shared_inbox_or_inbox()];
+ send_lemmy_activity(context, report, actor, inbox, false).await
}
}
@@ -78,9 +74,8 @@ impl ActivityHandler for Report {
context: &Data,
request_counter: &mut i32,
) -> Result<(), LemmyError> {
- let community = self
- .to
- .dereference::(context, local_instance(context), request_counter)
+ let community = self.to[0]
+ .dereference(context, local_instance(context), request_counter)
.await?;
verify_person_in_community(&self.actor, &community, context, request_counter).await?;
Ok(())
@@ -94,11 +89,11 @@ impl ActivityHandler for Report {
) -> Result<(), LemmyError> {
let actor = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
match self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?
{
PostOrComment::Post(post) => {
diff --git a/crates/apub/src/activities/community/update.rs b/crates/apub/src/activities/community/update.rs
index 538838a23..51e2a6ea1 100644
--- a/crates/apub/src/activities/community/update.rs
+++ b/crates/apub/src/activities/community/update.rs
@@ -49,7 +49,7 @@ impl UpdateCommunity {
};
let activity = AnnouncableActivities::UpdateCommunity(update);
- send_activity_in_community(activity, &id, actor, &community, vec![], context).await
+ send_activity_in_community(activity, actor, &community, vec![], context).await
}
}
@@ -139,7 +139,7 @@ impl GetCommunity for UpdateCommunity {
) -> Result {
let cid = ObjectId::new(self.object.id.clone());
cid
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await
}
}
diff --git a/crates/apub/src/activities/create_or_update/comment.rs b/crates/apub/src/activities/create_or_update/comment.rs
index 456cbb6b0..e3b01feb1 100644
--- a/crates/apub/src/activities/create_or_update/comment.rs
+++ b/crates/apub/src/activities/create_or_update/comment.rs
@@ -17,7 +17,7 @@ use crate::{
use activitypub_federation::{
core::object_id::ObjectId,
data::Data,
- traits::{ActivityHandler, ApubObject},
+ traits::{ActivityHandler, Actor, ApubObject},
utils::verify_domains_match,
};
use activitystreams_kinds::public;
@@ -86,13 +86,13 @@ impl CreateOrUpdateComment {
let mut inboxes = vec![];
for t in tagged_users {
let person = t
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
- inboxes.push(person.shared_inbox_or_inbox_url());
+ inboxes.push(person.shared_inbox_or_inbox());
}
let activity = AnnouncableActivities::CreateOrUpdateComment(create_or_update);
- send_activity_in_community(activity, &id, actor, &community, inboxes, context).await
+ send_activity_in_community(activity, actor, &community, inboxes, 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 b0e0bf36a..c0854089a 100644
--- a/crates/apub/src/activities/create_or_update/mod.rs
+++ b/crates/apub/src/activities/create_or_update/mod.rs
@@ -24,7 +24,7 @@ async fn get_comment_notif_recipients(
let post_id = comment.post_id;
let post = blocking(context.pool(), move |conn| Post::read(conn, post_id)).await??;
let actor = actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
// Note:
diff --git a/crates/apub/src/activities/create_or_update/post.rs b/crates/apub/src/activities/create_or_update/post.rs
index a0d8ce6f4..5d6f99548 100644
--- a/crates/apub/src/activities/create_or_update/post.rs
+++ b/crates/apub/src/activities/create_or_update/post.rs
@@ -69,9 +69,8 @@ impl CreateOrUpdatePost {
.into();
let create_or_update = CreateOrUpdatePost::new(post, actor, &community, kind, context).await?;
- let id = create_or_update.id.clone();
let activity = AnnouncableActivities::CreateOrUpdatePost(Box::new(create_or_update));
- send_activity_in_community(activity, &id, actor, &community, vec![], context).await
+ send_activity_in_community(activity, actor, &community, vec![], context).await
}
}
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 acd50a1aa..9ad547691 100644
--- a/crates/apub/src/activities/create_or_update/private_message.rs
+++ b/crates/apub/src/activities/create_or_update/private_message.rs
@@ -10,7 +10,7 @@ use crate::{
use activitypub_federation::{
core::object_id::ObjectId,
data::Data,
- traits::{ActivityHandler, ApubObject},
+ traits::{ActivityHandler, Actor, ApubObject},
utils::verify_domains_match,
};
use lemmy_api_common::utils::blocking;
@@ -40,13 +40,13 @@ impl CreateOrUpdatePrivateMessage {
let create_or_update = CreateOrUpdatePrivateMessage {
id: id.clone(),
actor: ObjectId::new(actor.actor_id()),
- to: ObjectId::new(recipient.actor_id()),
+ to: [ObjectId::new(recipient.actor_id())],
object: private_message.into_apub(context).await?,
kind,
unparsed: Default::default(),
};
- let inbox = vec![recipient.shared_inbox_or_inbox_url()];
- send_lemmy_activity(context, &create_or_update, &id, actor, inbox, true).await
+ let inbox = vec![recipient.shared_inbox_or_inbox()];
+ send_lemmy_activity(context, create_or_update, actor, inbox, true).await
}
}
@@ -71,7 +71,7 @@ impl ActivityHandler for CreateOrUpdatePrivateMessage {
) -> Result<(), LemmyError> {
verify_person(&self.actor, context, request_counter).await?;
verify_domains_match(self.actor.inner(), self.object.id.inner())?;
- verify_domains_match(self.to.inner(), self.object.to.inner())?;
+ verify_domains_match(self.to[0].inner(), self.object.to[0].inner())?;
ApubPrivateMessage::verify(&self.object, self.actor.inner(), context, request_counter).await?;
Ok(())
}
diff --git a/crates/apub/src/activities/deletion/delete.rs b/crates/apub/src/activities/deletion/delete.rs
index 3cf07bc8f..d2572590a 100644
--- a/crates/apub/src/activities/deletion/delete.rs
+++ b/crates/apub/src/activities/deletion/delete.rs
@@ -24,7 +24,6 @@ use lemmy_db_schema::{
ModRemovePost,
ModRemovePostForm,
},
- person::Person,
post::Post,
},
traits::Crud,
@@ -77,7 +76,7 @@ impl ActivityHandler for Delete {
receive_remove_action(
&self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?,
self.object.id(),
reason,
@@ -99,7 +98,7 @@ impl ActivityHandler for Delete {
impl Delete {
pub(in crate::activities::deletion) fn new(
- actor: &Person,
+ actor: &ApubPerson,
object: DeletableObjects,
to: Url,
community: Option<&Community>,
diff --git a/crates/apub/src/activities/deletion/delete_user.rs b/crates/apub/src/activities/deletion/delete_user.rs
index c91d08eba..0e342bd17 100644
--- a/crates/apub/src/activities/deletion/delete_user.rs
+++ b/crates/apub/src/activities/deletion/delete_user.rs
@@ -1,7 +1,7 @@
use crate::{
activities::{generate_activity_id, send_lemmy_activity, verify_is_public, verify_person},
local_instance,
- objects::person::ApubPerson,
+ objects::{instance::remote_instance_inboxes, person::ApubPerson},
protocol::activities::deletion::delete_user::DeleteUser,
};
use activitypub_federation::{
@@ -11,8 +11,7 @@ use activitypub_federation::{
utils::verify_urls_match,
};
use activitystreams_kinds::{activity::DeleteType, public};
-use lemmy_api_common::utils::{blocking, delete_user_account};
-use lemmy_db_schema::source::site::Site;
+use lemmy_api_common::utils::delete_user_account;
use lemmy_utils::error::LemmyError;
use lemmy_websocket::LemmyContext;
use url::Url;
@@ -50,7 +49,7 @@ impl ActivityHandler for DeleteUser {
) -> Result<(), LemmyError> {
let actor = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
delete_user_account(
actor.id,
@@ -80,12 +79,8 @@ impl DeleteUser {
cc: vec![],
};
- let remote_sites = blocking(context.pool(), Site::read_remote_sites).await??;
- let inboxes = remote_sites
- .into_iter()
- .map(|s| s.inbox_url.into())
- .collect();
- send_lemmy_activity(context, &delete, &id, actor, inboxes, true).await?;
+ let inboxes = remote_instance_inboxes(context.pool()).await?;
+ send_lemmy_activity(context, delete, actor, inboxes, true).await?;
Ok(())
}
}
diff --git a/crates/apub/src/activities/deletion/mod.rs b/crates/apub/src/activities/deletion/mod.rs
index 6283ffe0a..8bc67721e 100644
--- a/crates/apub/src/activities/deletion/mod.rs
+++ b/crates/apub/src/activities/deletion/mod.rs
@@ -21,7 +21,7 @@ use crate::{
};
use activitypub_federation::{
core::object_id::ObjectId,
- traits::ApubObject,
+ traits::{Actor, ApubObject},
utils::verify_domains_match,
};
use activitystreams_kinds::public;
@@ -65,22 +65,15 @@ pub async fn send_apub_delete_in_community(
deleted: bool,
context: &LemmyContext,
) -> Result<(), LemmyError> {
- let (id, activity) = if deleted {
+ let actor = ApubPerson::from(actor);
+ let activity = if deleted {
let delete = Delete::new(&actor, object, public(), Some(&community), reason, context)?;
- (delete.id.clone(), AnnouncableActivities::Delete(delete))
+ AnnouncableActivities::Delete(delete)
} else {
let undo = UndoDelete::new(&actor, object, public(), Some(&community), reason, context)?;
- (undo.id.clone(), AnnouncableActivities::UndoDelete(undo))
+ AnnouncableActivities::UndoDelete(undo)
};
- send_activity_in_community(
- activity,
- &id,
- &ApubPerson::from(actor),
- &community.into(),
- vec![],
- context,
- )
- .await
+ send_activity_in_community(activity, &actor, &community.into(), vec![], context).await
}
#[tracing::instrument(skip_all)]
@@ -97,15 +90,13 @@ pub async fn send_apub_delete_private_message(
.into();
let deletable = DeletableObjects::PrivateMessage(Box::new(pm.into()));
- let inbox = vec![recipient.shared_inbox_or_inbox_url()];
+ let inbox = vec![recipient.shared_inbox_or_inbox()];
if deleted {
let delete = Delete::new(actor, deletable, recipient.actor_id(), None, None, context)?;
- let id = delete.id.clone();
- send_lemmy_activity(context, &delete, &id, actor, inbox, true).await?;
+ send_lemmy_activity(context, delete, actor, inbox, true).await?;
} else {
let undo = UndoDelete::new(actor, deletable, recipient.actor_id(), None, None, context)?;
- let id = undo.id.clone();
- send_lemmy_activity(context, &undo, &id, actor, inbox, true).await?;
+ send_lemmy_activity(context, undo, actor, inbox, true).await?;
};
Ok(())
}
@@ -238,7 +229,7 @@ async fn receive_delete_action(
DeletableObjects::Community(community) => {
if community.local {
let mod_: Person = actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?
.deref()
.clone();
diff --git a/crates/apub/src/activities/deletion/undo_delete.rs b/crates/apub/src/activities/deletion/undo_delete.rs
index 0854c46e6..c43e4d871 100644
--- a/crates/apub/src/activities/deletion/undo_delete.rs
+++ b/crates/apub/src/activities/deletion/undo_delete.rs
@@ -23,7 +23,6 @@ use lemmy_db_schema::{
ModRemovePost,
ModRemovePostForm,
},
- person::Person,
post::Post,
},
traits::Crud,
@@ -76,7 +75,7 @@ impl ActivityHandler for UndoDelete {
UndoDelete::receive_undo_remove_action(
&self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?,
self.object.object.id(),
context,
@@ -98,7 +97,7 @@ impl ActivityHandler for UndoDelete {
impl UndoDelete {
#[tracing::instrument(skip_all)]
pub(in crate::activities::deletion) fn new(
- actor: &Person,
+ actor: &ApubPerson,
object: DeletableObjects,
to: Url,
community: Option<&Community>,
diff --git a/crates/apub/src/activities/following/accept.rs b/crates/apub/src/activities/following/accept.rs
index 410b678e7..34764264e 100644
--- a/crates/apub/src/activities/following/accept.rs
+++ b/crates/apub/src/activities/following/accept.rs
@@ -7,7 +7,7 @@ use crate::{
use activitypub_federation::{
core::object_id::ObjectId,
data::Data,
- traits::ActivityHandler,
+ traits::{ActivityHandler, Actor},
utils::verify_urls_match,
};
use activitystreams_kinds::activity::AcceptType;
@@ -24,14 +24,11 @@ impl AcceptFollowCommunity {
context: &LemmyContext,
request_counter: &mut i32,
) -> Result<(), LemmyError> {
- let community = follow
- .object
- .dereference_local::(context)
- .await?;
+ let community = follow.object.dereference_local(context).await?;
let person = follow
.actor
.clone()
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let accept = AcceptFollowCommunity {
actor: ObjectId::new(community.actor_id()),
@@ -43,8 +40,8 @@ impl AcceptFollowCommunity {
)?,
unparsed: Default::default(),
};
- let inbox = vec![person.inbox_url()];
- send_lemmy_activity(context, &accept, &accept.id, &community, inbox, true).await
+ let inbox = vec![person.shared_inbox_or_inbox()];
+ send_lemmy_activity(context, accept, &community, inbox, true).await
}
}
@@ -81,12 +78,12 @@ impl ActivityHandler for AcceptFollowCommunity {
) -> Result<(), LemmyError> {
let person = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let community = self
.object
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
// This will throw an error if no follow was requested
blocking(context.pool(), move |conn| {
diff --git a/crates/apub/src/activities/following/follow.rs b/crates/apub/src/activities/following/follow.rs
index f78fadff0..b0ae72c71 100644
--- a/crates/apub/src/activities/following/follow.rs
+++ b/crates/apub/src/activities/following/follow.rs
@@ -10,7 +10,11 @@ use crate::{
protocol::activities::following::{accept::AcceptFollowCommunity, follow::FollowCommunity},
ActorType,
};
-use activitypub_federation::{core::object_id::ObjectId, data::Data, traits::ActivityHandler};
+use activitypub_federation::{
+ core::object_id::ObjectId,
+ data::Data,
+ traits::{ActivityHandler, Actor},
+};
use activitystreams_kinds::activity::FollowType;
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{
@@ -56,8 +60,8 @@ impl FollowCommunity {
.await?;
let follow = FollowCommunity::new(actor, community, context)?;
- let inbox = vec![community.inbox_url.clone().into()];
- send_lemmy_activity(context, &follow, &follow.id, actor, inbox, true).await
+ let inbox = vec![community.shared_inbox_or_inbox()];
+ send_lemmy_activity(context, follow, actor, inbox, true).await
}
}
@@ -83,7 +87,7 @@ impl ActivityHandler for FollowCommunity {
verify_person(&self.actor, context, request_counter).await?;
let community = self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
verify_person_in_community(&self.actor, &community, context, request_counter).await?;
Ok(())
@@ -97,11 +101,11 @@ impl ActivityHandler for FollowCommunity {
) -> Result<(), LemmyError> {
let person = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let community = self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let community_follower_form = CommunityFollowerForm {
community_id: community.id,
diff --git a/crates/apub/src/activities/following/undo_follow.rs b/crates/apub/src/activities/following/undo_follow.rs
index fd178dab2..94b0b68ec 100644
--- a/crates/apub/src/activities/following/undo_follow.rs
+++ b/crates/apub/src/activities/following/undo_follow.rs
@@ -8,7 +8,7 @@ use crate::{
use activitypub_federation::{
core::object_id::ObjectId,
data::Data,
- traits::ActivityHandler,
+ traits::{ActivityHandler, Actor},
utils::verify_urls_match,
};
use activitystreams_kinds::activity::UndoType;
@@ -39,8 +39,8 @@ impl UndoFollowCommunity {
)?,
unparsed: Default::default(),
};
- let inbox = vec![community.shared_inbox_or_inbox_url()];
- send_lemmy_activity(context, &undo, &undo.id, actor, inbox, true).await
+ let inbox = vec![community.shared_inbox_or_inbox()];
+ send_lemmy_activity(context, undo, actor, inbox, true).await
}
}
@@ -77,12 +77,12 @@ impl ActivityHandler for UndoFollowCommunity {
) -> Result<(), LemmyError> {
let person = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let community = self
.object
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let community_follower_form = CommunityFollowerForm {
diff --git a/crates/apub/src/activities/mod.rs b/crates/apub/src/activities/mod.rs
index 3a4754996..4b884e4f1 100644
--- a/crates/apub/src/activities/mod.rs
+++ b/crates/apub/src/activities/mod.rs
@@ -7,8 +7,9 @@ use crate::{
CONTEXT,
};
use activitypub_federation::{
- core::{activity_queue::SendActivity, object_id::ObjectId},
+ core::{activity_queue::send_activity, object_id::ObjectId},
deser::context::WithContext,
+ traits::{ActivityHandler, Actor},
};
use activitystreams_kinds::public;
use anyhow::anyhow;
@@ -39,7 +40,7 @@ async fn verify_person(
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let person = person_id
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
if person.banned {
let err = anyhow!("Person {} is banned", person_id);
@@ -58,7 +59,7 @@ pub(crate) async fn verify_person_in_community(
request_counter: &mut i32,
) -> Result<(), LemmyError> {
let person = person_id
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
if person.banned {
return Err(LemmyError::from_message("Person is banned from site"));
@@ -91,7 +92,7 @@ pub(crate) async fn verify_mod_action(
) -> Result<(), LemmyError> {
if community.local {
let actor = mod_id
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
// Note: this will also return true for admins in addition to mods, but as we dont know about
@@ -166,42 +167,31 @@ where
}
#[tracing::instrument(skip_all)]
-async fn send_lemmy_activity(
+async fn send_lemmy_activity(
context: &LemmyContext,
- activity: &T,
- activity_id: &Url,
- actor: &dyn ActorType,
- inboxes: Vec,
+ activity: Activity,
+ actor: &ActorT,
+ inbox: Vec,
sensitive: bool,
-) -> Result<(), LemmyError> {
- if !context.settings().federation.enabled || inboxes.is_empty() {
- return Ok(());
- }
+) -> Result<(), LemmyError>
+where
+ Activity: ActivityHandler + Serialize,
+ ActorT: Actor + ActorType,
+ Activity: ActivityHandler,
+{
+ info!("Sending activity {}", activity.id().to_string());
let activity = WithContext::new(activity, CONTEXT.deref().clone());
- 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 = inboxes
- .into_iter()
- .filter(|i| i.domain().expect("valid inbox url") != hostname)
- .collect();
-
- let serialised_activity = serde_json::to_string(&activity)?;
-
let object_value = serde_json::to_value(&activity)?;
- insert_activity(activity_id, object_value, true, sensitive, context.pool()).await?;
+ insert_activity(activity.id(), object_value, true, sensitive, context.pool()).await?;
- SendActivity {
- activity_id: activity_id.clone(),
- actor_public_key: actor.get_public_key(),
- actor_private_key: actor.private_key().expect("actor has private key"),
- inboxes,
- activity: serialised_activity,
- }
- .send(local_instance(context))
+ send_activity(
+ activity,
+ actor.get_public_key(),
+ actor.private_key().expect("actor has private key"),
+ inbox,
+ local_instance(context),
+ )
.await?;
Ok(())
diff --git a/crates/apub/src/activities/voting/undo_vote.rs b/crates/apub/src/activities/voting/undo_vote.rs
index 4f410ae97..35b642519 100644
--- a/crates/apub/src/activities/voting/undo_vote.rs
+++ b/crates/apub/src/activities/voting/undo_vote.rs
@@ -2,7 +2,6 @@ use crate::{
activities::{
community::{announce::GetCommunity, send_activity_in_community},
generate_activity_id,
- verify_is_public,
verify_person_in_community,
voting::{undo_vote_comment, undo_vote_post},
},
@@ -62,7 +61,7 @@ impl UndoVote {
unparsed: Default::default(),
};
let activity = AnnouncableActivities::UndoVote(undo_vote);
- send_activity_in_community(activity, &id, actor, &community, vec![], context).await
+ send_activity_in_community(activity, actor, &community, vec![], context).await
}
}
@@ -85,7 +84,6 @@ impl ActivityHandler for UndoVote {
context: &Data,
request_counter: &mut i32,
) -> Result<(), LemmyError> {
- verify_is_public(&self.to, &self.cc)?;
let community = self.get_community(context, request_counter).await?;
verify_person_in_community(&self.actor, &community, context, request_counter).await?;
verify_urls_match(self.actor.inner(), self.object.actor.inner())?;
@@ -101,12 +99,12 @@ impl ActivityHandler for UndoVote {
) -> Result<(), LemmyError> {
let actor = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let object = self
.object
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
match object {
PostOrComment::Post(p) => undo_vote_post(actor, &p, context).await,
diff --git a/crates/apub/src/activities/voting/vote.rs b/crates/apub/src/activities/voting/vote.rs
index 7971704db..b4f442388 100644
--- a/crates/apub/src/activities/voting/vote.rs
+++ b/crates/apub/src/activities/voting/vote.rs
@@ -2,7 +2,6 @@ use crate::{
activities::{
community::{announce::GetCommunity, send_activity_in_community},
generate_activity_id,
- verify_is_public,
verify_person_in_community,
voting::{vote_comment, vote_post},
},
@@ -61,10 +60,9 @@ impl Vote {
.await??
.into();
let vote = Vote::new(object, actor, &community, kind, context)?;
- let vote_id = vote.id.clone();
let activity = AnnouncableActivities::Vote(vote);
- send_activity_in_community(activity, &vote_id, actor, &community, vec![], context).await
+ send_activity_in_community(activity, actor, &community, vec![], context).await
}
}
@@ -87,7 +85,6 @@ impl ActivityHandler for Vote {
context: &Data,
request_counter: &mut i32,
) -> Result<(), LemmyError> {
- verify_is_public(&self.to, &self.cc)?;
let community = self.get_community(context, request_counter).await?;
verify_person_in_community(&self.actor, &community, context, request_counter).await?;
let site = blocking(context.pool(), Site::read_local_site).await??;
@@ -105,11 +102,11 @@ impl ActivityHandler for Vote {
) -> Result<(), LemmyError> {
let actor = self
.actor
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let object = self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
match object {
PostOrComment::Post(p) => vote_post(&self.kind, actor, &p, context).await,
@@ -128,7 +125,7 @@ impl GetCommunity for Vote {
) -> Result {
let object = self
.object
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let cid = match object {
PostOrComment::Post(p) => p.community_id,
diff --git a/crates/apub/src/collections/community_moderators.rs b/crates/apub/src/collections/community_moderators.rs
index b8cd64690..7243ac3e7 100644
--- a/crates/apub/src/collections/community_moderators.rs
+++ b/crates/apub/src/collections/community_moderators.rs
@@ -112,7 +112,7 @@ impl ApubObject for ApubCommunityModerators {
for mod_id in apub.ordered_items {
let mod_id = ObjectId::new(mod_id);
let mod_user: ApubPerson = mod_id
- .dereference::(&data.1, local_instance(&data.1), request_counter)
+ .dereference(&data.1, local_instance(&data.1), request_counter)
.await?;
if !current_moderators
diff --git a/crates/apub/src/fetcher/search.rs b/crates/apub/src/fetcher/search.rs
index 43244b4d7..1622e451d 100644
--- a/crates/apub/src/fetcher/search.rs
+++ b/crates/apub/src/fetcher/search.rs
@@ -28,7 +28,7 @@ pub async fn search_by_apub_id(
match Url::parse(query) {
Ok(url) => {
ObjectId::new(url)
- .dereference::(context, instance, request_counter)
+ .dereference(context, instance, request_counter)
.await
}
Err(_) => {
@@ -39,7 +39,7 @@ pub async fn search_by_apub_id(
webfinger_resolve_actor::(identifier, context, request_counter).await?;
Ok(SearchableObjects::Person(
ObjectId::new(id)
- .dereference::(context, instance, request_counter)
+ .dereference(context, instance, request_counter)
.await?,
))
}
@@ -48,7 +48,7 @@ pub async fn search_by_apub_id(
webfinger_resolve_actor::(identifier, context, request_counter).await?;
Ok(SearchableObjects::Community(
ObjectId::new(id)
- .dereference::(context, instance, request_counter)
+ .dereference(context, instance, request_counter)
.await?,
))
}
diff --git a/crates/apub/src/fetcher/user_or_community.rs b/crates/apub/src/fetcher/user_or_community.rs
index 16a74c2e5..1ed9bb0f0 100644
--- a/crates/apub/src/fetcher/user_or_community.rs
+++ b/crates/apub/src/fetcher/user_or_community.rs
@@ -2,7 +2,7 @@ use crate::{
objects::{community::ApubCommunity, person::ApubPerson},
protocol::objects::{group::Group, person::Person},
};
-use activitypub_federation::{core::inbox::ActorPublicKey, traits::ApubObject};
+use activitypub_federation::traits::{Actor, ApubObject};
use chrono::NaiveDateTime;
use lemmy_utils::error::LemmyError;
use lemmy_websocket::LemmyContext;
@@ -102,11 +102,15 @@ impl ApubObject for UserOrCommunity {
}
}
-impl ActorPublicKey for UserOrCommunity {
+impl Actor for UserOrCommunity {
fn public_key(&self) -> &str {
match self {
UserOrCommunity::User(p) => p.public_key(),
UserOrCommunity::Community(p) => p.public_key(),
}
}
+
+ fn inbox(&self) -> Url {
+ unimplemented!()
+ }
}
diff --git a/crates/apub/src/fetcher/webfinger.rs b/crates/apub/src/fetcher/webfinger.rs
index b53a988ee..c46935426 100644
--- a/crates/apub/src/fetcher/webfinger.rs
+++ b/crates/apub/src/fetcher/webfinger.rs
@@ -69,7 +69,7 @@ where
.collect();
for l in links {
let object = ObjectId::::new(l)
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await;
if object.is_ok() {
return object.map(|o| o.actor_id().into());
diff --git a/crates/apub/src/http/community.rs b/crates/apub/src/http/community.rs
index 6b8c7fe7e..8765959c5 100644
--- a/crates/apub/src/http/community.rs
+++ b/crates/apub/src/http/community.rs
@@ -86,7 +86,7 @@ pub(crate) async fn get_apub_community_outbox(
let id = ObjectId::new(generate_outbox_url(&community.actor_id)?);
let outbox_data = CommunityContext(community.into(), context.get_ref().clone());
let outbox: ApubCommunityOutbox = id
- .dereference::(&outbox_data, local_instance(&context), &mut 0)
+ .dereference(&outbox_data, local_instance(&context), &mut 0)
.await?;
Ok(create_apub_response(&outbox.into_apub(&outbox_data).await?))
}
@@ -104,7 +104,7 @@ pub(crate) async fn get_apub_community_moderators(
let id = ObjectId::new(generate_outbox_url(&community.actor_id)?);
let outbox_data = CommunityContext(community, context.get_ref().clone());
let moderators: ApubCommunityModerators = id
- .dereference::(&outbox_data, local_instance(&context), &mut 0)
+ .dereference(&outbox_data, local_instance(&context), &mut 0)
.await?;
Ok(create_apub_response(
&moderators.into_apub(&outbox_data).await?,
diff --git a/crates/apub/src/http/mod.rs b/crates/apub/src/http/mod.rs
index d5d940661..87a8a4127 100644
--- a/crates/apub/src/http/mod.rs
+++ b/crates/apub/src/http/mod.rs
@@ -7,10 +7,10 @@ use crate::{
CONTEXT,
};
use activitypub_federation::{
- core::inbox::{receive_activity, ActorPublicKey},
+ core::inbox::receive_activity,
data::Data,
deser::context::WithContext,
- traits::{ActivityHandler, ApubObject},
+ traits::{ActivityHandler, Actor, ApubObject},
APUB_JSON_CONTENT_TYPE,
};
use actix_web::{web, HttpRequest, HttpResponse};
@@ -42,7 +42,7 @@ pub async fn shared_inbox(
receive_lemmy_activity::(request, payload, context).await
}
-pub async fn receive_lemmy_activity(
+pub async fn receive_lemmy_activity(
request: HttpRequest,
payload: String,
context: web::Data,
@@ -52,8 +52,8 @@ where
+ DeserializeOwned
+ Send
+ 'static,
- Actor: ApubObject + ActorPublicKey + Send + 'static,
- for<'de2> ::ApubType: serde::Deserialize<'de2>,
+ ActorT: ApubObject + Actor + Send + 'static,
+ for<'de2> ::ApubType: serde::Deserialize<'de2>,
{
let activity_value: Value = serde_json::from_str(&payload)?;
let activity: Activity = serde_json::from_value(activity_value.clone())?;
@@ -67,7 +67,7 @@ where
static DATA: OnceCell> = OnceCell::new();
let data = DATA.get_or_init(|| Data::new(context.get_ref().clone()));
- receive_activity::(
+ receive_activity::(
request,
activity,
local_instance(&context),
diff --git a/crates/apub/src/lib.rs b/crates/apub/src/lib.rs
index e758e706d..910c66a70 100644
--- a/crates/apub/src/lib.rs
+++ b/crates/apub/src/lib.rs
@@ -1,6 +1,7 @@
use crate::fetcher::post_or_comment::PostOrComment;
use activitypub_federation::{
- core::{inbox::ActorPublicKey, signatures::PublicKey},
+ core::signatures::PublicKey,
+ traits::{Actor, ApubObject},
InstanceSettingsBuilder,
LocalInstance,
};
@@ -10,7 +11,6 @@ use lemmy_db_schema::{newtypes::DbUrl, source::activity::Activity, utils::DbPool
use lemmy_utils::{error::LemmyError, location_info, settings::structs::Settings};
use lemmy_websocket::LemmyContext;
use once_cell::sync::{Lazy, OnceCell};
-use std::env;
use url::{ParseError, Url};
pub mod activities;
@@ -33,7 +33,7 @@ fn local_instance(context: &LemmyContext) -> &'static LocalInstance {
let settings = InstanceSettingsBuilder::default()
.http_fetch_retry_limit(context.settings().http_fetch_retry_limit)
.worker_count(context.settings().federation.worker_count)
- .testing_send_sync(env::var("APUB_TESTING_SEND_SYNC").is_ok())
+ .debug(context.settings().federation.debug)
.verify_url_function(|url| check_apub_id_valid(url, &Settings::get()))
.build()
.expect("configure federation");
@@ -204,19 +204,11 @@ async fn insert_activity(
/// Common methods provided by ActivityPub actors (community and person). Not all methods are
/// implemented by all actors.
-pub trait ActorType: ActorPublicKey {
+pub trait ActorType: Actor + ApubObject {
fn actor_id(&self) -> Url;
fn private_key(&self) -> Option;
- fn inbox_url(&self) -> Url;
-
- fn shared_inbox_url(&self) -> Option;
-
- fn shared_inbox_or_inbox_url(&self) -> Url {
- self.shared_inbox_url().unwrap_or_else(|| self.inbox_url())
- }
-
fn get_public_key(&self) -> PublicKey {
PublicKey::new_main_key(self.actor_id(), self.public_key().to_string())
}
diff --git a/crates/apub/src/objects/comment.rs b/crates/apub/src/objects/comment.rs
index 30ddfdf60..f898c3657 100644
--- a/crates/apub/src/objects/comment.rs
+++ b/crates/apub/src/objects/comment.rs
@@ -168,7 +168,7 @@ impl ApubObject for ApubComment {
) -> Result {
let creator = note
.attributed_to
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let (post, parent_comment_id) = note.get_parents(context, request_counter).await?;
diff --git a/crates/apub/src/objects/community.rs b/crates/apub/src/objects/community.rs
index 4c381c1c4..ad75d37c5 100644
--- a/crates/apub/src/objects/community.rs
+++ b/crates/apub/src/objects/community.rs
@@ -13,8 +13,8 @@ use crate::{
ActorType,
};
use activitypub_federation::{
- core::{inbox::ActorPublicKey, object_id::ObjectId},
- traits::ApubObject,
+ core::object_id::ObjectId,
+ traits::{Actor, ApubObject},
};
use activitystreams_kinds::actor::GroupType;
use chrono::NaiveDateTime;
@@ -139,14 +139,14 @@ impl ApubObject for ApubCommunity {
group
.outbox
- .dereference::(&outbox_data, local_instance(context), request_counter)
+ .dereference(&outbox_data, local_instance(context), request_counter)
.await
.map_err(|e| debug!("{}", e))
.ok();
if let Some(moderators) = &group.moderators {
moderators
- .dereference::(&outbox_data, local_instance(context), request_counter)
+ .dereference(&outbox_data, local_instance(context), request_counter)
.await
.map_err(|e| debug!("{}", e))
.ok();
@@ -158,6 +158,20 @@ impl ApubObject for ApubCommunity {
}
}
+impl Actor for ApubCommunity {
+ fn public_key(&self) -> &str {
+ &self.public_key
+ }
+
+ fn inbox(&self) -> Url {
+ self.inbox_url.clone().into()
+ }
+
+ fn shared_inbox(&self) -> Option {
+ self.shared_inbox_url.clone().map(|s| s.into())
+ }
+}
+
impl ActorType for ApubCommunity {
fn actor_id(&self) -> Url {
self.actor_id.to_owned().into()
@@ -165,20 +179,6 @@ impl ActorType for ApubCommunity {
fn private_key(&self) -> Option {
self.private_key.to_owned()
}
-
- fn inbox_url(&self) -> Url {
- self.inbox_url.clone().into()
- }
-
- fn shared_inbox_url(&self) -> Option {
- self.shared_inbox_url.clone().map(|s| s.into())
- }
-}
-
-impl ActorPublicKey for ApubCommunity {
- fn public_key(&self) -> &str {
- &self.public_key
- }
}
impl ApubCommunity {
diff --git a/crates/apub/src/objects/instance.rs b/crates/apub/src/objects/instance.rs
index cd4ceb467..1ae5e735c 100644
--- a/crates/apub/src/objects/instance.rs
+++ b/crates/apub/src/objects/instance.rs
@@ -10,16 +10,16 @@ use crate::{
ActorType,
};
use activitypub_federation::{
- core::{inbox::ActorPublicKey, object_id::ObjectId},
+ core::object_id::ObjectId,
deser::values::MediaTypeHtml,
- traits::ApubObject,
+ traits::{Actor, ApubObject},
utils::verify_domains_match,
};
use chrono::NaiveDateTime;
use lemmy_api_common::utils::blocking;
use lemmy_db_schema::{
source::site::{Site, SiteForm},
- utils::naive_now,
+ utils::{naive_now, DbPool},
};
use lemmy_utils::{
error::LemmyError,
@@ -147,20 +147,16 @@ impl ActorType for ApubSite {
fn private_key(&self) -> Option {
self.private_key.to_owned()
}
-
- fn inbox_url(&self) -> Url {
- self.inbox_url.clone().into()
- }
-
- fn shared_inbox_url(&self) -> Option {
- None
- }
}
-impl ActorPublicKey for ApubSite {
+impl Actor for ApubSite {
fn public_key(&self) -> &str {
&self.public_key
}
+
+ fn inbox(&self) -> Url {
+ self.inbox_url.clone().into()
+ }
}
/// Instance actor is at the root path, so we simply need to clear the path and other unnecessary
@@ -181,13 +177,23 @@ pub(in crate::objects) async fn fetch_instance_actor_for_object(
// try to fetch the instance actor (to make things like instance rules available)
let instance_id = instance_actor_id_from_url(object_id);
let site = ObjectId::::new(instance_id.clone())
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await;
if let Err(e) = site {
debug!("Failed to dereference site for {}: {}", instance_id, e);
}
}
+pub(crate) async fn remote_instance_inboxes(pool: &DbPool) -> Result, LemmyError> {
+ Ok(
+ blocking(pool, Site::read_remote_sites)
+ .await??
+ .into_iter()
+ .map(|s| ApubSite::from(s).shared_inbox_or_inbox())
+ .collect(),
+ )
+}
+
#[cfg(test)]
pub(crate) mod tests {
use super::*;
diff --git a/crates/apub/src/objects/person.rs b/crates/apub/src/objects/person.rs
index 7b87f9011..d7e346aa5 100644
--- a/crates/apub/src/objects/person.rs
+++ b/crates/apub/src/objects/person.rs
@@ -13,8 +13,8 @@ use crate::{
ActorType,
};
use activitypub_federation::{
- core::{inbox::ActorPublicKey, object_id::ObjectId},
- traits::ApubObject,
+ core::object_id::ObjectId,
+ traits::{Actor, ApubObject},
utils::verify_domains_match,
};
use chrono::NaiveDateTime;
@@ -182,22 +182,22 @@ impl ActorType for ApubPerson {
fn private_key(&self) -> Option {
self.private_key.to_owned()
}
+}
- fn inbox_url(&self) -> Url {
+impl Actor for ApubPerson {
+ fn public_key(&self) -> &str {
+ &self.public_key
+ }
+
+ fn inbox(&self) -> Url {
self.inbox_url.clone().into()
}
- fn shared_inbox_url(&self) -> Option {
+ fn shared_inbox(&self) -> Option {
self.shared_inbox_url.clone().map(|s| s.into())
}
}
-impl ActorPublicKey for ApubPerson {
- fn public_key(&self) -> &str {
- &self.public_key
- }
-}
-
#[cfg(test)]
pub(crate) mod tests {
use super::*;
diff --git a/crates/apub/src/objects/post.rs b/crates/apub/src/objects/post.rs
index 65bcbda68..24424b9fe 100644
--- a/crates/apub/src/objects/post.rs
+++ b/crates/apub/src/objects/post.rs
@@ -152,7 +152,7 @@ impl ApubObject for ApubPost {
) -> Result {
let creator = page
.creator()?
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
let community = page.extract_community(context, request_counter).await?;
@@ -215,7 +215,7 @@ impl ApubObject for ApubPost {
// read existing, local post if any (for generating mod log)
let old_post = ObjectId::::new(page.id.clone())
- .dereference_local::(context)
+ .dereference_local(context)
.await;
let post = blocking(context.pool(), move |conn| Post::upsert(conn, &form)).await??;
diff --git a/crates/apub/src/objects/private_message.rs b/crates/apub/src/objects/private_message.rs
index 56363f779..aab069e8b 100644
--- a/crates/apub/src/objects/private_message.rs
+++ b/crates/apub/src/objects/private_message.rs
@@ -90,7 +90,7 @@ impl ApubObject for ApubPrivateMessage {
r#type: ChatMessageType::ChatMessage,
id: ObjectId::new(self.ap_id.clone()),
attributed_to: ObjectId::new(creator.actor_id),
- to: ObjectId::new(recipient.actor_id),
+ to: [ObjectId::new(recipient.actor_id)],
content: markdown_to_html(&self.content),
media_type: Some(MediaTypeHtml::Html),
source: Some(Source::new(self.content.clone())),
@@ -112,7 +112,7 @@ impl ApubObject for ApubPrivateMessage {
check_apub_id_valid_with_strictness(note.id.inner(), false, &Settings::get())?;
let person = note
.attributed_to
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
if person.banned {
return Err(LemmyError::from_message("Person is banned from site"));
@@ -128,11 +128,10 @@ impl ApubObject for ApubPrivateMessage {
) -> Result {
let creator = note
.attributed_to
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?;
- let recipient = note
- .to
- .dereference::(context, local_instance(context), request_counter)
+ let recipient = note.to[0]
+ .dereference(context, local_instance(context), request_counter)
.await?;
let form = PrivateMessageForm {
diff --git a/crates/apub/src/protocol/activities/community/report.rs b/crates/apub/src/protocol/activities/community/report.rs
index cd66c657e..4c2649eef 100644
--- a/crates/apub/src/protocol/activities/community/report.rs
+++ b/crates/apub/src/protocol/activities/community/report.rs
@@ -13,7 +13,7 @@ use url::Url;
pub struct Report {
pub(crate) actor: ObjectId,
#[serde(deserialize_with = "deserialize_one")]
- pub(crate) to: ObjectId,
+ pub(crate) to: [ObjectId; 1],
pub(crate) object: ObjectId,
pub(crate) summary: String,
#[serde(rename = "type")]
diff --git a/crates/apub/src/protocol/activities/create_or_update/private_message.rs b/crates/apub/src/protocol/activities/create_or_update/private_message.rs
index e0288498b..9cee8ddf3 100644
--- a/crates/apub/src/protocol/activities/create_or_update/private_message.rs
+++ b/crates/apub/src/protocol/activities/create_or_update/private_message.rs
@@ -12,7 +12,7 @@ pub struct CreateOrUpdatePrivateMessage {
pub(crate) id: Url,
pub(crate) actor: ObjectId,
#[serde(deserialize_with = "deserialize_one")]
- pub(crate) to: ObjectId,
+ pub(crate) to: [ObjectId; 1],
pub(crate) object: ChatMessage,
#[serde(rename = "type")]
pub(crate) kind: CreateOrUpdateType,
diff --git a/crates/apub/src/protocol/objects/chat_message.rs b/crates/apub/src/protocol/objects/chat_message.rs
index c2ee57e4e..152e8508f 100644
--- a/crates/apub/src/protocol/objects/chat_message.rs
+++ b/crates/apub/src/protocol/objects/chat_message.rs
@@ -21,7 +21,7 @@ pub struct ChatMessage {
pub(crate) id: ObjectId,
pub(crate) attributed_to: ObjectId,
#[serde(deserialize_with = "deserialize_one")]
- pub(crate) to: ObjectId,
+ pub(crate) to: [ObjectId; 1],
pub(crate) content: String,
pub(crate) media_type: Option,
diff --git a/crates/apub/src/protocol/objects/note.rs b/crates/apub/src/protocol/objects/note.rs
index cd17e65d5..f052e88b2 100644
--- a/crates/apub/src/protocol/objects/note.rs
+++ b/crates/apub/src/protocol/objects/note.rs
@@ -56,7 +56,7 @@ impl Note {
let parent = Box::pin(
self
.in_reply_to
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await?,
);
match parent.deref() {
diff --git a/crates/apub/src/protocol/objects/page.rs b/crates/apub/src/protocol/objects/page.rs
index 74db11afe..8aa5a49a0 100644
--- a/crates/apub/src/protocol/objects/page.rs
+++ b/crates/apub/src/protocol/objects/page.rs
@@ -93,7 +93,7 @@ impl Page {
/// Both stickied and locked need to be false on a newly created post (verified in [[CreatePost]].
pub(crate) async fn is_mod_action(&self, context: &LemmyContext) -> Result {
let old_post = ObjectId::::new(self.id.clone())
- .dereference_local::(context)
+ .dereference_local(context)
.await;
let stickied_changed = Page::is_stickied_changed(&old_post, &self.stickied);
@@ -139,7 +139,7 @@ impl Page {
if let Some(cid) = iter.next() {
let cid = ObjectId::new(cid.clone());
if let Ok(c) = cid
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await
{
break Ok(c);
@@ -154,7 +154,7 @@ impl Page {
.find(|a| a.kind == PersonOrGroupType::Group)
.map(|a| ObjectId::::new(a.id.clone().into_inner()))
.ok_or_else(|| LemmyError::from_message("page does not specify group"))?
- .dereference::(context, local_instance(context), request_counter)
+ .dereference(context, local_instance(context), request_counter)
.await
}
}
diff --git a/crates/db_schema/Cargo.toml b/crates/db_schema/Cargo.toml
index 483c9e945..e5f749387 100644
--- a/crates/db_schema/Cargo.toml
+++ b/crates/db_schema/Cargo.toml
@@ -23,7 +23,7 @@ url = { version = "2.2.2", features = ["serde"] }
strum = "0.24.0"
strum_macros = "0.24.0"
serde_json = { version = "1.0.79", features = ["preserve_order"], optional = true }
-activitypub_federation = { version = "0.1.0", optional = true }
+activitypub_federation = { version = "0.2.0", optional = true }
lemmy_utils = { version = "=0.16.5", path = "../utils", optional = true }
bcrypt = { version = "0.12.1", optional = true }
diesel = { version = "1.4.8", features = ["postgres","chrono","r2d2","serde_json"], optional = true }
diff --git a/crates/utils/src/settings/structs.rs b/crates/utils/src/settings/structs.rs
index d4b98e2fc..d6846f185 100644
--- a/crates/utils/src/settings/structs.rs
+++ b/crates/utils/src/settings/structs.rs
@@ -147,6 +147,10 @@ pub struct FederationConfig {
/// increase it.
#[default(64)]
pub worker_count: u64,
+ /// Use federation debug mode. Allows connecting to http and localhost urls. Also sends outgoing
+ /// activities synchronously for easier testing. Do not use in production.
+ #[default(false)]
+ pub debug: bool,
}
#[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]
@@ -195,40 +199,13 @@ pub struct SetupConfig {
#[doku(example = "admin")]
pub admin_username: String,
/// Password for the admin user. It must be at least 10 characters.
- #[doku(example = "my_passwd_longer_than_ten_characters")]
+ #[doku(example = "tf6HHDS4RolWfFhk4Rq9")]
pub admin_password: String,
/// Name of the site (can be changed later)
#[doku(example = "My Lemmy Instance")]
pub site_name: String,
/// Email for the admin user (optional, can be omitted and set later through the website)
+ #[doku(example = "user@example.com")]
#[default(None)]
pub admin_email: Option,
- #[default(None)]
- pub sidebar: Option,
- #[default(None)]
- pub description: Option,
- #[default(None)]
- pub icon: Option,
- #[default(None)]
- pub banner: Option,
- #[default(None)]
- pub enable_downvotes: Option,
- #[default(None)]
- pub open_registration: Option,
- #[default(None)]
- pub enable_nsfw: Option,
- #[default(None)]
- pub community_creation_admin_only: Option,
- #[default(None)]
- pub require_email_verification: Option,
- #[default(None)]
- pub require_application: Option,
- #[default(None)]
- pub application_question: Option,
- #[default(None)]
- pub private_instance: Option,
- #[default(None)]
- pub default_theme: Option,
- #[default(None)]
- pub default_post_listing_type: Option,
}
diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml
index 94d4ecb99..f76316744 100644
--- a/docker/federation/docker-compose.yml
+++ b/docker/federation/docker-compose.yml
@@ -40,7 +40,6 @@ services:
volumes:
- ./lemmy_alpha.hjson:/config/config.hjson
environment:
- - APUB_TESTING_SEND_SYNC
- RUST_BACKTRACE=1
- RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
depends_on:
@@ -69,7 +68,6 @@ services:
volumes:
- ./lemmy_beta.hjson:/config/config.hjson
environment:
- - APUB_TESTING_SEND_SYNC
- RUST_BACKTRACE=1
- RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
depends_on:
@@ -98,7 +96,6 @@ services:
volumes:
- ./lemmy_gamma.hjson:/config/config.hjson
environment:
- - APUB_TESTING_SEND_SYNC
- RUST_BACKTRACE=1
- RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
depends_on:
@@ -128,7 +125,6 @@ services:
volumes:
- ./lemmy_delta.hjson:/config/config.hjson
environment:
- - APUB_TESTING_SEND_SYNC
- RUST_BACKTRACE=1
- RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
depends_on:
@@ -158,7 +154,6 @@ services:
volumes:
- ./lemmy_epsilon.hjson:/config/config.hjson
environment:
- - APUB_TESTING_SEND_SYNC
- RUST_BACKTRACE=1
- RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
depends_on:
diff --git a/docker/federation/lemmy_alpha.hjson b/docker/federation/lemmy_alpha.hjson
index 6c0c54dff..246c1f5ca 100644
--- a/docker/federation/lemmy_alpha.hjson
+++ b/docker/federation/lemmy_alpha.hjson
@@ -19,6 +19,7 @@
federation: {
enabled: true
allowed_instances: ["lemmy-beta","lemmy-gamma","lemmy-delta","lemmy-epsilon"]
+ debug: true
}
captcha: {
enabled: false
diff --git a/docker/federation/lemmy_beta.hjson b/docker/federation/lemmy_beta.hjson
index b630dacae..87184f1ae 100644
--- a/docker/federation/lemmy_beta.hjson
+++ b/docker/federation/lemmy_beta.hjson
@@ -18,6 +18,7 @@
federation: {
enabled: true
allowed_instances: ["lemmy-alpha","lemmy-gamma","lemmy-delta","lemmy-epsilon"]
+ debug: true
}
captcha: {
enabled: false
diff --git a/docker/federation/lemmy_delta.hjson b/docker/federation/lemmy_delta.hjson
index 8d400fc09..9c1c7aee7 100644
--- a/docker/federation/lemmy_delta.hjson
+++ b/docker/federation/lemmy_delta.hjson
@@ -18,6 +18,7 @@
federation: {
enabled: true
allowed_instances: ["lemmy-beta"]
+ debug: true
}
captcha: {
enabled: false
diff --git a/docker/federation/lemmy_epsilon.hjson b/docker/federation/lemmy_epsilon.hjson
index 78b1a687e..c1b19f07f 100644
--- a/docker/federation/lemmy_epsilon.hjson
+++ b/docker/federation/lemmy_epsilon.hjson
@@ -18,6 +18,7 @@
federation: {
enabled: true
blocked_instances: ["lemmy-alpha"]
+ debug: true
}
captcha: {
enabled: false
diff --git a/docker/federation/lemmy_gamma.hjson b/docker/federation/lemmy_gamma.hjson
index 8d3f097a1..4d4791746 100644
--- a/docker/federation/lemmy_gamma.hjson
+++ b/docker/federation/lemmy_gamma.hjson
@@ -18,6 +18,7 @@
federation: {
enabled: true
allowed_instances: ["lemmy-alpha","lemmy-beta","lemmy-delta","lemmy-epsilon"]
+ debug: true
}
captcha: {
enabled: false
diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml
index c88abe3d2..dcfee9aaa 100644
--- a/docker/prod/docker-compose.yml
+++ b/docker/prod/docker-compose.yml
@@ -12,7 +12,7 @@ services:
restart: always
lemmy:
- image: dessalines/lemmy:0.16.5
+ image: dessalines/lemmy:0.16.4
ports:
- "127.0.0.1:8536:8536"
- "127.0.0.1:6669:6669"