Remove remaining usages of old activitystreams library #70

Closed
nutomic wants to merge 6 commits from more-upgrade-apub-2 into main
16 changed files with 679 additions and 902 deletions

275
server/Cargo.lock generated vendored
View File

@ -111,9 +111,9 @@ dependencies = [
[[package]] [[package]]
name = "actix-files" name = "actix-files"
version = "0.3.0-alpha.1" version = "0.3.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b32e0fdd5998c2712549cbc39dff46c8754d55e3dd9f4d017d9e28de30cac6" checksum = "627f597ad98061816766201db8afc7444752992f2919b2e60f53a7fa27f01aed"
dependencies = [ dependencies = [
"actix-http", "actix-http",
"actix-service", "actix-service",
@ -132,9 +132,9 @@ dependencies = [
[[package]] [[package]]
name = "actix-http" name = "actix-http"
version = "2.0.0-alpha.4" version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd7ea0568480d199952a51de70271946da57c33cc0e8b83f54383e70958dff21" checksum = "33f501768e82e8548763b7f55309e2f8bcc7f9f4273c75b47af99ac2b2581f37"
dependencies = [ dependencies = [
"actix-codec", "actix-codec",
"actix-connect", "actix-connect",
@ -147,6 +147,7 @@ dependencies = [
"bitflags", "bitflags",
"brotli2", "brotli2",
"bytes", "bytes",
"cookie",
"copyless", "copyless",
"derive_more", "derive_more",
"either", "either",
@ -160,6 +161,7 @@ dependencies = [
"http", "http",
"httparse", "httparse",
"indexmap", "indexmap",
"itoa",
"language-tags", "language-tags",
"lazy_static", "lazy_static",
"log", "log",
@ -171,7 +173,7 @@ dependencies = [
"serde 1.0.114", "serde 1.0.114",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
"sha-1", "sha-1 0.9.1",
"slab", "slab",
"time 0.2.16", "time 0.2.16",
] ]
@ -260,16 +262,16 @@ dependencies = [
[[package]] [[package]]
name = "actix-threadpool" name = "actix-threadpool"
version = "0.3.2" version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91164716d956745c79dcea5e66d2aa04506549958accefcede5368c70f2fd4ff" checksum = "d209f04d002854b9afd3743032a27b066158817965bf5d036824d19ac2cc0e30"
dependencies = [ dependencies = [
"derive_more", "derive_more",
"futures-channel", "futures-channel",
"lazy_static", "lazy_static",
"log", "log",
"num_cpus", "num_cpus",
"parking_lot 0.10.2", "parking_lot 0.11.0",
"threadpool", "threadpool",
] ]
@ -313,9 +315,9 @@ dependencies = [
[[package]] [[package]]
name = "actix-web" name = "actix-web"
version = "3.0.0-alpha.3" version = "3.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bd6df56ec5f9a1a0d8335f156f36e1e8f76dbd736fa0cc0f6bc3a69be1e6124" checksum = "9125c29b7d9911bfdb4d0d4d8f1cf4fee4f21515cf2a405a423c30c245364297"
dependencies = [ dependencies = [
"actix-codec", "actix-codec",
"actix-http", "actix-http",
@ -353,24 +355,25 @@ dependencies = [
[[package]] [[package]]
name = "actix-web-actors" name = "actix-web-actors"
version = "3.0.0-alpha.1" version = "3.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b5efeb3907582f9c724ce27be093ab8aafabd97be828bc6750c0d467f5e1aa3" checksum = "55ef22b33c49a28dda61866d5573c5b8ceb080a099cd59e7371b78b48bbf1bc0"
dependencies = [ dependencies = [
"actix", "actix",
"actix-codec", "actix-codec",
"actix-http", "actix-http",
"actix-web", "actix-web",
"bytes", "bytes",
"futures", "futures-channel",
"futures-core",
"pin-project", "pin-project",
] ]
[[package]] [[package]]
name = "actix-web-codegen" name = "actix-web-codegen"
version = "0.2.2" version = "0.3.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a71bf475cbe07281d0b3696abb48212db118e7e23219f13596ce865235ff5766" checksum = "df9679f5b1f4c819de08b63b0a61a131b2fdc30b367c2c208984fda8eaa07fa0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -390,24 +393,18 @@ dependencies = [
[[package]] [[package]]
name = "addr2line" name = "addr2line"
version = "0.12.2" version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "602d785912f476e480434627e8732e6766b760c045bbf897d9dfaa9f4fbd399c" checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072"
dependencies = [ dependencies = [
"gimli", "gimli",
] ]
[[package]] [[package]]
name = "adler" name = "adler"
version = "0.2.2" version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccc9a9dd069569f212bc4330af9f17c4afb5e8ce185e83dbb14f1349dda18b10" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
[[package]]
name = "adler32"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567b077b825e468cc974f0020d4082ee6e03132512f207ef1a02fd5d00d1f32d"
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
@ -481,9 +478,9 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]] [[package]]
name = "awc" name = "awc"
version = "2.0.0-alpha.2" version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7038a9747cd5159b9f0550895eaf865c0143baa7e4eee834e9294d0a7e0e4be" checksum = "374057b508d4083208996be82141891c2e14c8885f45991b21c1621200ab6df3"
dependencies = [ dependencies = [
"actix-codec", "actix-codec",
"actix-http", "actix-http",
@ -505,14 +502,14 @@ dependencies = [
[[package]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.49" version = "0.3.50"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05100821de9e028f12ae3d189176b41ee198341eb8f369956407fea2f5cc666c" checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293"
dependencies = [ dependencies = [
"addr2line", "addr2line",
"cfg-if", "cfg-if",
"libc", "libc",
"miniz_oxide 0.3.7", "miniz_oxide",
"object", "object",
"rustc-demangle", "rustc-demangle",
] ]
@ -590,7 +587,7 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [ dependencies = [
"generic-array 0.14.2", "generic-array 0.14.3",
] ]
[[package]] [[package]]
@ -599,7 +596,7 @@ version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa136449e765dc7faa244561ccae839c394048667929af599b5d931ebe7b7f10" checksum = "fa136449e765dc7faa244561ccae839c394048667929af599b5d931ebe7b7f10"
dependencies = [ dependencies = [
"generic-array 0.14.2", "generic-array 0.14.3",
] ]
[[package]] [[package]]
@ -642,6 +639,15 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "buf-min"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6ae7069aad07c7cdefe6a22a671f00650728bd2331a4cc62e1e5d0becdf9ca4"
dependencies = [
"bytes",
]
[[package]] [[package]]
name = "bufstream" name = "bufstream"
version = "0.1.4" version = "0.1.4"
@ -668,12 +674,9 @@ checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "0.5.5" version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "118cf036fbb97d0816e3c34b2d7a1e8cfc60f68fcf63d550ddbe9bd5f59c213b" checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
dependencies = [
"loom",
]
[[package]] [[package]]
name = "bytestring" name = "bytestring"
@ -686,9 +689,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.57" version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fde55d2a2bfaa4c9668bbc63f531fbdeee3ffe188f4662511ce2c22b3eedebe" checksum = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518"
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
@ -698,9 +701,9 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.12" version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0fee792e164f78f5fe0c296cc2eb3688a2ca2b70cdff33040922d298203f0c4" checksum = "c74d84029116787153e02106bf53e66828452a4b325cc8652b788b5967c0a0b6"
dependencies = [ dependencies = [
"num-integer", "num-integer",
"num-traits 0.2.12", "num-traits 0.2.12",
@ -770,6 +773,16 @@ dependencies = [
"serde-hjson", "serde-hjson",
] ]
[[package]]
name = "cookie"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca761767cf3fa9068cc893ec8c247a22d0fd0535848e65640c0548bd1f8bbb36"
dependencies = [
"percent-encoding",
"time 0.2.16",
]
[[package]] [[package]]
name = "copyless" name = "copyless"
version = "0.1.5" version = "0.1.5"
@ -794,9 +807,9 @@ checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
[[package]] [[package]]
name = "cpuid-bool" name = "cpuid-bool"
version = "0.1.0" version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d375c433320f6c5057ae04a04376eef4d04ce2801448cf8863a78da99107be4" checksum = "ec6763c20301ab0dc67051d1b6f4cc9132ad9e6eddcb1f10c6c53ea6d6ae2183"
[[package]] [[package]]
name = "crc32fast" name = "crc32fast"
@ -950,7 +963,7 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
dependencies = [ dependencies = [
"generic-array 0.14.2", "generic-array 0.14.3",
] ]
[[package]] [[package]]
@ -1142,7 +1155,7 @@ dependencies = [
"cfg-if", "cfg-if",
"crc32fast", "crc32fast",
"libc", "libc",
"miniz_oxide 0.4.0", "miniz_oxide",
] ]
[[package]] [[package]]
@ -1292,19 +1305,6 @@ dependencies = [
"byteorder", "byteorder",
] ]
[[package]]
name = "generator"
version = "0.6.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "add72f17bb81521258fcc8a7a3245b1e184e916bfbe34f0ea89558f440df5c68"
dependencies = [
"cc",
"libc",
"log",
"rustc_version",
"winapi 0.3.9",
]
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.12.3" version = "0.12.3"
@ -1316,9 +1316,9 @@ dependencies = [
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.2" version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac746a5f3bbfdadd6106868134545e684693d54d9d44f6e9588a7d54af0bf980" checksum = "60fb4bb6bba52f78a471264d9a3b7d026cc0af47b22cd2cffbc0b787ca003e63"
dependencies = [ dependencies = [
"typenum", "typenum",
"version_check 0.9.2", "version_check 0.9.2",
@ -1337,15 +1337,15 @@ dependencies = [
[[package]] [[package]]
name = "gimli" name = "gimli"
version = "0.21.0" version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724"
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.2.5" version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" checksum = "993f9e0baeed60001cf565546b0d3dbe6a6ad23f2bd31644a133c641eccf6d53"
dependencies = [ dependencies = [
"bytes", "bytes",
"fnv", "fnv",
@ -1354,10 +1354,10 @@ dependencies = [
"futures-util", "futures-util",
"http", "http",
"indexmap", "indexmap",
"log",
"slab", "slab",
"tokio", "tokio",
"tokio-util 0.3.1", "tokio-util 0.3.1",
"tracing",
] ]
[[package]] [[package]]
@ -1371,9 +1371,9 @@ dependencies = [
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.1.14" version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9586eedd4ce6b3c498bc3b4dd92fc9f11166aa908a914071953768066c67909" checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@ -1481,9 +1481,9 @@ dependencies = [
[[package]] [[package]]
name = "instant" name = "instant"
version = "0.1.5" version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69da7ce1490173c2bf4d26bc8be429aaeeaf4cce6c4b970b7949651fa17655fe" checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485"
[[package]] [[package]]
name = "iovec" name = "iovec"
@ -1523,9 +1523,9 @@ checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.41" version = "0.3.42"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4b9172132a62451e56142bff9afc91c8e4a4500aa5b847da36815b63bfda916" checksum = "52732a3d3ad72c58ad2dc70624f9c17b46ecd0943b9a4f1ee37c4c18c5d983e2"
dependencies = [ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
@ -1585,7 +1585,6 @@ dependencies = [
name = "lemmy_server" name = "lemmy_server"
version = "0.0.1" version = "0.0.1"
dependencies = [ dependencies = [
"activitystreams",
"activitystreams-ext", "activitystreams-ext",
"activitystreams-new", "activitystreams-new",
"actix", "actix",
@ -1693,9 +1692,9 @@ dependencies = [
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.71" version = "0.2.72"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" checksum = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701"
[[package]] [[package]]
name = "linked-hash-map" name = "linked-hash-map"
@ -1724,33 +1723,22 @@ dependencies = [
[[package]] [[package]]
name = "lock_api" name = "lock_api"
version = "0.4.0" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de302ce1fe7482db13738fbaf2e21cfb06a986b89c0bf38d88abf16681aada4e" checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c"
dependencies = [ dependencies = [
"scopeguard", "scopeguard",
] ]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.8" version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "loom"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ecc775857611e1df29abba5c41355cdf540e7e9d4acfdf0f355eefee82330b7"
dependencies = [
"cfg-if",
"generator",
"scoped-tls",
]
[[package]] [[package]]
name = "lru-cache" name = "lru-cache"
version = "0.1.2" version = "0.1.2"
@ -1827,15 +1815,6 @@ dependencies = [
"unicase", "unicase",
] ]
[[package]]
name = "miniz_oxide"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
dependencies = [
"adler32",
]
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.4.0" version = "0.4.0"
@ -2060,7 +2039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733"
dependencies = [ dependencies = [
"instant", "instant",
"lock_api 0.4.0", "lock_api 0.4.1",
"parking_lot_core 0.8.0", "parking_lot_core 0.8.0",
] ]
@ -2150,7 +2129,7 @@ checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
dependencies = [ dependencies = [
"maplit", "maplit",
"pest", "pest",
"sha-1", "sha-1 0.8.2",
] ]
[[package]] [[package]]
@ -2187,9 +2166,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.17" version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33"
[[package]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
@ -2434,9 +2413,9 @@ dependencies = [
[[package]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.1.56" version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
[[package]] [[package]]
name = "regex" name = "regex"
@ -2559,12 +2538,6 @@ dependencies = [
"parking_lot 0.11.0", "parking_lot 0.11.0",
] ]
[[package]]
name = "scoped-tls"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28"
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
version = "1.1.0" version = "1.1.0"
@ -2703,6 +2676,19 @@ dependencies = [
"opaque-debug 0.2.3", "opaque-debug 0.2.3",
] ]
[[package]]
name = "sha-1"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "170a36ea86c864a3f16dd2687712dd6646f7019f301e57537c7f4dc9f5916770"
dependencies = [
"block-buffer 0.9.0",
"cfg-if",
"cpuid-bool",
"digest 0.9.0",
"opaque-debug 0.3.0",
]
[[package]] [[package]]
name = "sha1" name = "sha1"
version = "0.6.0" version = "0.6.0"
@ -2734,9 +2720,9 @@ dependencies = [
[[package]] [[package]]
name = "simple_asn1" name = "simple_asn1"
version = "0.4.0" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b25ecba7165254f0c97d6c22a64b1122a03634b18d20a34daf21e18f892e618" checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b"
dependencies = [ dependencies = [
"chrono", "chrono",
"num-bigint", "num-bigint",
@ -2751,9 +2737,9 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.4.0" version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" checksum = "3757cb9d89161a2f24e1cf78efa0c1fcff485d18e3f55e0aa3480824ddaa0f3f"
[[package]] [[package]]
name = "socket2" name = "socket2"
@ -2869,9 +2855,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.33" version = "1.0.34"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd" checksum = "936cae2873c940d92e697597c5eee105fb570cd5689c695806f672883653349b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -3076,6 +3062,26 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "tracing"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2e2a2de6b0d5cbb13fc21193a2296888eaab62b6044479aafb3c54c01c29fcd"
dependencies = [
"cfg-if",
"log",
"tracing-core",
]
[[package]]
name = "tracing-core"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94ae75f0d28ae10786f3b1895c55fe72e79928fd5ccdebb5438c75e93fec178f"
dependencies = [
"lazy_static",
]
[[package]] [[package]]
name = "trust-dns-proto" name = "trust-dns-proto"
version = "0.19.5" version = "0.19.5"
@ -3251,18 +3257,19 @@ dependencies = [
[[package]] [[package]]
name = "v_escape" name = "v_escape"
version = "0.7.4" version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" checksum = "b66158ce426982197fd44266d68125fd4000f1d42f5ee33ef02b500b4b6b0024"
dependencies = [ dependencies = [
"buf-min",
"v_escape_derive", "v_escape_derive",
] ]
[[package]] [[package]]
name = "v_escape_derive" name = "v_escape_derive"
version = "0.5.6" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" checksum = "cae7cffca0b1f9af9b20610f6fdeee9ffcce61417b5ad186a5d482dc904e24cd"
dependencies = [ dependencies = [
"nom 4.2.3", "nom 4.2.3",
"proc-macro2", "proc-macro2",
@ -3272,9 +3279,9 @@ dependencies = [
[[package]] [[package]]
name = "v_htmlescape" name = "v_htmlescape"
version = "0.4.5" version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" checksum = "f5fd25529cb2f78527b5ee507bcfb357b26d057b5e480853c26d49a4ead5c629"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"v_escape", "v_escape",
@ -3312,9 +3319,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.64" version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a634620115e4a229108b71bde263bb4220c483b3f07f5ba514ee8d15064c4c2" checksum = "f3edbcc9536ab7eababcc6d2374a0b7bfe13a2b6d562c5e07f370456b1a8f33d"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"wasm-bindgen-macro", "wasm-bindgen-macro",
@ -3322,9 +3329,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.64" version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e53963b583d18a5aa3aaae4b4c1cb535218246131ba22a71f05b518098571df" checksum = "89ed2fb8c84bfad20ea66b26a3743f3e7ba8735a69fe7d95118c33ec8fc1244d"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"lazy_static", "lazy_static",
@ -3337,9 +3344,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.64" version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fcfd5ef6eec85623b4c6e844293d4516470d8f19cd72d0d12246017eb9060b8" checksum = "eb071268b031a64d92fc6cf691715ca5a40950694d8f683c5bb43db7c730929e"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -3347,9 +3354,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.64" version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9adff9ee0e94b926ca81b57f57f86d5545cdcb1d259e21ec9bdd95b901754c75" checksum = "cf592c807080719d1ff2f245a687cbadb3ed28b2077ed7084b47aba8b691f2c6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -3360,15 +3367,15 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.64" version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f7b90ea6c632dd06fd765d44542e234d5e63d9bb917ecd64d79778a13bd79ae" checksum = "72b6c0220ded549d63860c78c38f3bcc558d1ca3f4efa74942c536ddbbb55e87"
[[package]] [[package]]
name = "web-sys" name = "web-sys"
version = "0.3.41" version = "0.3.42"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "863539788676619aac1a23e2df3655e96b32b0e05eb72ca34ba045ad573c625d" checksum = "8be2398f326b7ba09815d0b403095f34dd708579220d099caae89be0b32137b2"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"wasm-bindgen", "wasm-bindgen",

1
server/Cargo.toml vendored
View File

@ -18,7 +18,6 @@ lemmy_db = { path = "./lemmy_db" }
diesel = "1.4.4" diesel = "1.4.4"
diesel_migrations = "1.4.0" diesel_migrations = "1.4.0"
dotenv = "0.15.0" dotenv = "0.15.0"
activitystreams = "0.6.2"
activitystreams-new = { git = "https://git.asonix.dog/asonix/activitystreams-sketch" } activitystreams-new = { git = "https://git.asonix.dog/asonix/activitystreams-sketch" }
activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext" } activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext" }
bcrypt = "0.8.0" bcrypt = "0.8.0"

View File

@ -1,46 +1,29 @@
use crate::{ use crate::{
apub::{ apub::{
community::do_announce, extensions::signatures::sign, insert_activity, is_apub_id_valid, community::do_announce,
extensions::signatures::sign,
insert_activity,
is_apub_id_valid,
ActorType, ActorType,
}, },
request::retry_custom, request::retry_custom,
DbPool, LemmyError, DbPool,
LemmyError,
}; };
use activitystreams::{context, object::properties::ObjectProperties, public, Activity, Base}; use activitystreams_new::base::AnyBase;
use actix_web::client::Client; use actix_web::client::Client;
use lemmy_db::{community::Community, user::User_}; use lemmy_db::{community::Community, user::User_};
use log::debug; use log::debug;
use serde::Serialize;
use std::fmt::Debug;
use url::Url; use url::Url;
pub fn populate_object_props( pub async fn send_activity_to_community(
props: &mut ObjectProperties,
addressed_ccs: Vec<String>,
object_id: &str,
) -> Result<(), LemmyError> {
props
.set_context_xsd_any_uri(context())?
// TODO: the activity needs a seperate id from the object
.set_id(object_id)?
// TODO: should to/cc go on the Create, or on the Post? or on both?
// TODO: handle privacy on the receiving side (at least ignore anything thats not public)
.set_to_xsd_any_uri(public())?
.set_many_cc_xsd_any_uris(addressed_ccs)?;
Ok(())
}
pub async fn send_activity_to_community<A>(
creator: &User_, creator: &User_,
community: &Community, community: &Community,
to: Vec<String>, to: Vec<String>,
activity: A, activity: AnyBase,
client: &Client, client: &Client,
pool: &DbPool, pool: &DbPool,
) -> Result<(), LemmyError> ) -> Result<(), LemmyError> {
where
A: Activity + Base + Serialize + Debug + Clone + Send + 'static,
{
insert_activity(creator.id, activity.clone(), true, pool).await?; insert_activity(creator.id, activity.clone(), true, pool).await?;
// if this is a local community, we need to do an announce from the community instead // if this is a local community, we need to do an announce from the community instead
@ -54,15 +37,12 @@ where
} }
/// Send an activity to a list of recipients, using the correct headers etc. /// Send an activity to a list of recipients, using the correct headers etc.
pub async fn send_activity<A>( pub async fn send_activity(
client: &Client, client: &Client,
activity: &A, activity: &AnyBase,
actor: &dyn ActorType, actor: &dyn ActorType,
to: Vec<String>, to: Vec<String>,
) -> Result<(), LemmyError> ) -> Result<(), LemmyError> {
where
A: Serialize,
{
let activity = serde_json::to_string(&activity)?; let activity = serde_json::to_string(&activity)?;
debug!("Sending activitypub activity {} to {:?}", activity, to); debug!("Sending activitypub activity {} to {:?}", activity, to);

View File

@ -1,16 +1,25 @@
use crate::{ use crate::{
apub::{ apub::{
activities::send_activity_to_community, activities::send_activity_to_community,
create_apub_response, create_apub_tombstone_response, create_tombstone, fetch_webfinger_url, create_apub_response,
create_apub_tombstone_response,
create_tombstone,
fetch_webfinger_url,
fetcher::{ fetcher::{
get_or_fetch_and_insert_remote_comment, get_or_fetch_and_insert_remote_post, get_or_fetch_and_insert_remote_comment,
get_or_fetch_and_insert_remote_post,
get_or_fetch_and_upsert_remote_user, get_or_fetch_and_upsert_remote_user,
}, },
ActorType, ApubLikeableType, ApubObjectType, FromApub, ToApub, ActorType,
ApubLikeableType,
ApubObjectType,
FromApub,
ToApub,
}, },
blocking, blocking,
routes::DbPoolParam, routes::DbPoolParam,
DbPool, LemmyError, DbPool,
LemmyError,
}; };
use activitystreams_new::{ use activitystreams_new::{
activity::{Create, Delete, Dislike, Like, Remove, Undo, Update}, activity::{Create, Delete, Dislike, Like, Remove, Undo, Update},
@ -207,7 +216,15 @@ impl ApubObjectType for Comment {
// Set the mention tags // Set the mention tags
.set_many_tags(maa.get_tags()?); .set_many_tags(maa.get_tags()?);
send_activity_to_community(&creator, &community, maa.inboxes, create, client, pool).await?; send_activity_to_community(
&creator,
&community,
maa.inboxes,
create.into_any_base()?,
client,
pool,
)
.await?;
Ok(()) Ok(())
} }
@ -239,7 +256,15 @@ impl ApubObjectType for Comment {
// Set the mention tags // Set the mention tags
.set_many_tags(maa.get_tags()?); .set_many_tags(maa.get_tags()?);
send_activity_to_community(&creator, &community, maa.inboxes, update, client, pool).await?; send_activity_to_community(
&creator,
&community,
maa.inboxes,
update.into_any_base()?,
client,
pool,
)
.await?;
Ok(()) Ok(())
} }
@ -269,7 +294,7 @@ impl ApubObjectType for Comment {
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
delete, delete.into_any_base()?,
client, client,
pool, pool,
) )
@ -314,7 +339,7 @@ impl ApubObjectType for Comment {
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
undo, undo.into_any_base()?,
client, client,
pool, pool,
) )
@ -348,7 +373,7 @@ impl ApubObjectType for Comment {
&mod_, &mod_,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
remove, remove.into_any_base()?,
client, client,
pool, pool,
) )
@ -392,7 +417,7 @@ impl ApubObjectType for Comment {
&mod_, &mod_,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
undo, undo.into_any_base()?,
client, client,
pool, pool,
) )
@ -430,7 +455,7 @@ impl ApubLikeableType for Comment {
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
like, like.into_any_base()?,
client, client,
pool, pool,
) )
@ -465,7 +490,7 @@ impl ApubLikeableType for Comment {
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
dislike, dislike.into_any_base()?,
client, client,
pool, pool,
) )
@ -510,7 +535,7 @@ impl ApubLikeableType for Comment {
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
undo, undo.into_any_base()?,
client, client,
pool, pool,
) )

View File

@ -1,29 +1,34 @@
use crate::{ use crate::{
apub::{ apub::{
activities::{populate_object_props, send_activity}, activities::send_activity,
create_apub_response, create_apub_tombstone_response, create_tombstone, create_apub_response,
create_apub_tombstone_response,
create_tombstone,
extensions::group_extensions::GroupExtension, extensions::group_extensions::GroupExtension,
fetcher::get_or_fetch_and_upsert_remote_user, fetcher::get_or_fetch_and_upsert_remote_user,
get_shared_inbox, insert_activity, ActorType, FromApub, GroupExt, ToApub, get_shared_inbox,
insert_activity,
ActorType,
FromApub,
GroupExt,
ToApub,
}, },
blocking, blocking,
routes::DbPoolParam, routes::DbPoolParam,
DbPool, LemmyError, DbPool,
}; LemmyError,
use activitystreams::{
activity::{Accept, Announce, Delete, Remove, Undo},
Activity, Base, BaseBox,
}; };
use activitystreams_ext::Ext2; use activitystreams_ext::Ext2;
use activitystreams_new::{ use activitystreams_new::{
activity::Follow, activity::{Accept, Announce, Delete, Follow, Remove, Undo},
actor::{kind::GroupType, ApActor, Endpoints, Group}, actor::{kind::GroupType, ApActor, Endpoints, Group},
base::BaseExt, base::{AnyBase, BaseExt},
collection::UnorderedCollection, collection::UnorderedCollection,
context, context,
object::Tombstone, object::Tombstone,
prelude::*, prelude::*,
primitives::{XsdAnyUri, XsdDateTime}, primitives::{XsdAnyUri, XsdDateTime},
public,
}; };
use actix_web::{body::Body, client::Client, web, HttpResponse}; use actix_web::{body::Body, client::Client, web, HttpResponse};
use itertools::Itertools; use itertools::Itertools;
@ -34,8 +39,8 @@ use lemmy_db::{
user::User_, user::User_,
}; };
use lemmy_utils::convert_datetime; use lemmy_utils::convert_datetime;
use serde::{Deserialize, Serialize}; use serde::Deserialize;
use std::{fmt::Debug, str::FromStr}; use std::str::FromStr;
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct CommunityQuery { pub struct CommunityQuery {
@ -128,27 +133,23 @@ impl ActorType for Community {
/// As a local community, accept the follow request from a remote user. /// As a local community, accept the follow request from a remote user.
async fn send_accept_follow( async fn send_accept_follow(
&self, &self,
follow: &Follow, follow: Follow,
client: &Client, client: &Client,
pool: &DbPool, pool: &DbPool,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
let actor_uri = follow.actor.as_single_xsd_any_uri().unwrap().to_string(); let actor_uri = follow.actor.as_single_xsd_any_uri().unwrap().to_string();
let id = format!("{}/accept/{}", self.actor_id, uuid::Uuid::new_v4()); let id = format!("{}/accept/{}", self.actor_id, uuid::Uuid::new_v4());
let mut accept = Accept::new(); let mut accept = Accept::new(self.actor_id.to_owned(), follow.into_any_base()?);
accept
.object_props
.set_context_xsd_any_uri(context())?
.set_id(id)?;
accept
.accept_props
.set_actor_xsd_any_uri(self.actor_id.to_owned())?
.set_object_base_box(BaseBox::from_concrete(follow.clone())?)?;
let to = format!("{}/inbox", actor_uri); let to = format!("{}/inbox", actor_uri);
accept
.set_context(context())
.set_id(XsdAnyUri::from_str(&id)?)
.set_to(to.clone());
insert_activity(self.creator_id, accept.clone(), true, pool).await?; insert_activity(self.creator_id, accept.clone(), true, pool).await?;
send_activity(client, &accept, self, vec![to]).await?; send_activity(client, &accept.into_any_base()?, self, vec![to]).await?;
Ok(()) Ok(())
} }
@ -162,17 +163,12 @@ impl ActorType for Community {
let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4()); let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4());
let mut delete = Delete::default(); let mut delete = Delete::new(creator.actor_id.to_owned(), group.into_any_base()?);
populate_object_props(
&mut delete.object_props,
vec![self.get_followers_url()],
&id,
)?;
delete delete
.delete_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(group)?)?; .set_to(public())
.set_many_ccs(vec![self.get_followers_url()]);

This is probably much easier than that populate_object_props for everything anyway.

This is probably much easier than that populate_object_props for everything anyway.

Yes with the new library its much less verbose.

Yes with the new library its much less verbose.
insert_activity(self.creator_id, delete.clone(), true, pool).await?; insert_activity(self.creator_id, delete.clone(), true, pool).await?;
@ -181,7 +177,7 @@ impl ActorType for Community {
// Note: For an accept, since it was automatic, no one pushed a button, // Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor. // the community was the actor.
// But for delete, the creator is the actor, and does the signing // But for delete, the creator is the actor, and does the signing
send_activity(client, &delete, creator, inboxes).await?; send_activity(client, &delete.into_any_base()?, creator, inboxes).await?;
Ok(()) Ok(())
} }
@ -195,33 +191,22 @@ impl ActorType for Community {
let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4()); let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4());
let mut delete = Delete::default(); let mut delete = Delete::new(creator.actor_id.to_owned(), group.into_any_base()?);
populate_object_props(
&mut delete.object_props,
vec![self.get_followers_url()],
&id,
)?;
delete delete
.delete_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(group)?)?; .set_to(public())
.set_many_ccs(vec![self.get_followers_url()]);
// TODO // TODO
// Undo that fake activity // Undo that fake activity
let undo_id = format!("{}/undo/delete/{}", self.actor_id, uuid::Uuid::new_v4()); let undo_id = format!("{}/undo/delete/{}", self.actor_id, uuid::Uuid::new_v4());
let mut undo = Undo::default(); let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
populate_object_props(
&mut undo.object_props,
vec![self.get_followers_url()],
&undo_id,
)?;
undo undo
.undo_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&undo_id)?)
.set_object_base_box(delete)?; .set_to(public())
.set_many_ccs(vec![self.get_followers_url()]);
insert_activity(self.creator_id, undo.clone(), true, pool).await?; insert_activity(self.creator_id, undo.clone(), true, pool).await?;
@ -230,7 +215,7 @@ impl ActorType for Community {
// Note: For an accept, since it was automatic, no one pushed a button, // Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor. // the community was the actor.
// But for delete, the creator is the actor, and does the signing // But for delete, the creator is the actor, and does the signing
send_activity(client, &undo, creator, inboxes).await?; send_activity(client, &undo.into_any_base()?, creator, inboxes).await?;
Ok(()) Ok(())
} }
@ -244,17 +229,12 @@ impl ActorType for Community {
let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4()); let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4());
let mut remove = Remove::default(); let mut remove = Remove::new(mod_.actor_id.to_owned(), group.into_any_base()?);
populate_object_props(
&mut remove.object_props,
vec![self.get_followers_url()],
&id,
)?;
remove remove
.remove_props .set_context(context())
.set_actor_xsd_any_uri(mod_.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(group)?)?; .set_to(public())
.set_many_ccs(vec![self.get_followers_url()]);
insert_activity(mod_.id, remove.clone(), true, pool).await?; insert_activity(mod_.id, remove.clone(), true, pool).await?;
@ -263,7 +243,7 @@ impl ActorType for Community {
// Note: For an accept, since it was automatic, no one pushed a button, // Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor. // the community was the actor.
// But for delete, the creator is the actor, and does the signing // But for delete, the creator is the actor, and does the signing
send_activity(client, &remove, mod_, inboxes).await?; send_activity(client, &remove.into_any_base()?, mod_, inboxes).await?;
Ok(()) Ok(())
} }
@ -277,32 +257,21 @@ impl ActorType for Community {
let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4()); let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4());
let mut remove = Remove::default(); let mut remove = Remove::new(mod_.actor_id.to_owned(), group.into_any_base()?);
populate_object_props(
&mut remove.object_props,
vec![self.get_followers_url()],
&id,
)?;
remove remove
.remove_props .set_context(context())
.set_actor_xsd_any_uri(mod_.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(group)?)?; .set_to(public())
.set_many_ccs(vec![self.get_followers_url()]);
// Undo that fake activity // Undo that fake activity
let undo_id = format!("{}/undo/remove/{}", self.actor_id, uuid::Uuid::new_v4()); let undo_id = format!("{}/undo/remove/{}", self.actor_id, uuid::Uuid::new_v4());
let mut undo = Undo::default(); let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
populate_object_props(
&mut undo.object_props,
vec![self.get_followers_url()],
&undo_id,
)?;
undo undo
.undo_props .set_context(context())
.set_actor_xsd_any_uri(mod_.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&undo_id)?)
.set_object_base_box(remove)?; .set_to(public())
.set_many_ccs(vec![self.get_followers_url()]);
insert_activity(mod_.id, undo.clone(), true, pool).await?; insert_activity(mod_.id, undo.clone(), true, pool).await?;
@ -311,7 +280,7 @@ impl ActorType for Community {
// Note: For an accept, since it was automatic, no one pushed a button, // Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor. // the community was the actor.
// But for remove , the creator is the actor, and does the signing // But for remove , the creator is the actor, and does the signing
send_activity(client, &undo, mod_, inboxes).await?; send_activity(client, &undo.into_any_base()?, mod_, inboxes).await?;
Ok(()) Ok(())
} }
@ -358,7 +327,7 @@ impl FromApub for CommunityForm {
/// Parse an ActivityPub group received from another instance into a Lemmy community. /// Parse an ActivityPub group received from another instance into a Lemmy community.
async fn from_apub(group: &GroupExt, client: &Client, pool: &DbPool) -> Result<Self, LemmyError> { async fn from_apub(group: &GroupExt, client: &Client, pool: &DbPool) -> Result<Self, LemmyError> {
let creator_and_moderator_uris = group.attributed_to().unwrap(); let creator_and_moderator_uris = group.inner.attributed_to().unwrap();
let creator_uri = creator_and_moderator_uris let creator_uri = creator_and_moderator_uris
.as_many() .as_many()
.unwrap() .unwrap()
@ -371,23 +340,34 @@ impl FromApub for CommunityForm {
let creator = get_or_fetch_and_upsert_remote_user(creator_uri, client, pool).await?; let creator = get_or_fetch_and_upsert_remote_user(creator_uri, client, pool).await?;
Ok(CommunityForm { Ok(CommunityForm {
name: group.name().unwrap().as_single_xsd_string().unwrap().into(), name: group
.inner
.name()
.unwrap()
.as_single_xsd_string()
.unwrap()
.into(),
title: group.inner.preferred_username().unwrap().to_string(), title: group.inner.preferred_username().unwrap().to_string(),
// TODO: should be parsed as html and tags like <script> removed (or use markdown source) // TODO: should be parsed as html and tags like <script> removed (or use markdown source)
// -> same for post.content etc // -> same for post.content etc
description: group description: group
.inner
.content() .content()
.map(|s| s.as_single_xsd_string().unwrap().into()), .map(|s| s.as_single_xsd_string().unwrap().into()),
category_id: group.ext_one.category.identifier.parse::<i32>()?, category_id: group.ext_one.category.identifier.parse::<i32>()?,
creator_id: creator.id, creator_id: creator.id,
removed: None, removed: None,
published: group published: group
.inner
.published() .published()
.map(|u| u.as_ref().to_owned().naive_local()), .map(|u| u.as_ref().to_owned().naive_local()),
updated: group.updated().map(|u| u.as_ref().to_owned().naive_local()), updated: group
.inner
.updated()
.map(|u| u.as_ref().to_owned().naive_local()),
deleted: None, deleted: None,
nsfw: group.ext_one.sensitive, nsfw: group.ext_one.sensitive,
actor_id: group.id().unwrap().to_string(), actor_id: group.inner.id().unwrap().to_string(),
local: false, local: false,
private_key: None, private_key: None,
public_key: Some(group.ext_two.to_owned().public_key.public_key_pem), public_key: Some(group.ext_two.to_owned().public_key.public_key_pem),
@ -440,26 +420,20 @@ pub async fn get_apub_community_followers(
Ok(create_apub_response(&collection)) Ok(create_apub_response(&collection))
} }
pub async fn do_announce<A>( pub async fn do_announce(
activity: A, activity: AnyBase,
community: &Community, community: &Community,
sender: &dyn ActorType, sender: &dyn ActorType,
client: &Client, client: &Client,
pool: &DbPool, pool: &DbPool,
) -> Result<HttpResponse, LemmyError> ) -> Result<HttpResponse, LemmyError> {
where let id = format!("{}/announce/{}", community.actor_id, uuid::Uuid::new_v4());
A: Activity + Base + Serialize + Debug, let mut announce = Announce::new(community.actor_id.to_owned(), activity);
{
let mut announce = Announce::default();
populate_object_props(
&mut announce.object_props,
vec![community.get_followers_url()],
&format!("{}/announce/{}", community.actor_id, uuid::Uuid::new_v4()),
)?;
announce announce
.announce_props .set_context(context())
.set_actor_xsd_any_uri(community.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(activity)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
insert_activity(community.creator_id, announce.clone(), true, pool).await?; insert_activity(community.creator_id, announce.clone(), true, pool).await?;
@ -470,7 +444,7 @@ where
// this seems to be the "easiest" stable alternative for remove_item() // this seems to be the "easiest" stable alternative for remove_item()
to.retain(|x| *x != sender.get_shared_inbox_url()); to.retain(|x| *x != sender.get_shared_inbox_url());
send_activity(client, &announce, community, to).await?; send_activity(client, &announce.into_any_base()?, community, to).await?;
Ok(HttpResponse::Ok().finish()) Ok(HttpResponse::Ok().finish())
} }

View File

@ -2,14 +2,17 @@ use crate::{
apub::{ apub::{
extensions::signatures::verify, extensions::signatures::verify,
fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user}, fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user},
insert_activity, ActorType, insert_activity,
ActorType,
}, },
blocking, blocking,
routes::{ChatServerParam, DbPoolParam}, routes::{ChatServerParam, DbPoolParam},
LemmyError, LemmyError,
}; };
use activitystreams::activity::Undo; use activitystreams_new::{
use activitystreams_new::activity::Follow; activity::{Follow, Undo},
prelude::*,
};
use actix_web::{client::Client, web, HttpRequest, HttpResponse}; use actix_web::{client::Client, web, HttpRequest, HttpResponse};
use lemmy_db::{ use lemmy_db::{
community::{Community, CommunityFollower, CommunityFollowerForm}, community::{Community, CommunityFollower, CommunityFollowerForm},
@ -31,14 +34,9 @@ impl CommunityAcceptedObjects {
fn follow(&self) -> Result<Follow, LemmyError> { fn follow(&self) -> Result<Follow, LemmyError> {
match self { match self {
CommunityAcceptedObjects::Follow(f) => Ok(f.to_owned()), CommunityAcceptedObjects::Follow(f) => Ok(f.to_owned()),
CommunityAcceptedObjects::Undo(u) => Ok( CommunityAcceptedObjects::Undo(u) => {
u.undo_props Ok(Follow::from_any_base(u.object.as_one().unwrap().to_owned())?.unwrap())
.get_object_base_box() }
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Follow>()?,
),
} }
} }
} }
@ -107,7 +105,7 @@ async fn handle_follow(
}) })
.await?; .await?;
community.send_accept_follow(&follow, &client, &db).await?; community.send_accept_follow(follow, &client, &db).await?;
Ok(HttpResponse::Ok().finish()) Ok(HttpResponse::Ok().finish())
} }

View File

@ -1,5 +1,6 @@
use crate::LemmyError; use crate::LemmyError;
use activitystreams::{ext::Extension, Actor}; use activitystreams_ext::UnparsedExtension;
use activitystreams_new::unparsed::UnparsedMutExt;
use diesel::PgConnection; use diesel::PgConnection;
use lemmy_db::{category::Category, Crud}; use lemmy_db::{category::Category, Crud};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -37,4 +38,22 @@ impl GroupExtension {
} }
} }
impl<T> Extension<T> for GroupExtension where T: Actor {} impl<U> UnparsedExtension<U> for GroupExtension
where
U: UnparsedMutExt,
{
type Error = serde_json::Error;
fn try_from_unparsed(unparsed_mut: &mut U) -> Result<Self, Self::Error> {
Ok(GroupExtension {
category: unparsed_mut.remove("category")?,
sensitive: unparsed_mut.remove("sensitive")?,
})
}
fn try_into_unparsed(self, unparsed_mut: &mut U) -> Result<(), Self::Error> {
unparsed_mut.insert("category", self.category)?;
unparsed_mut.insert("sensitive", self.sensitive)?;
Ok(())
}
}

View File

@ -1,4 +1,5 @@
use activitystreams::{ext::Extension, Base}; use activitystreams_ext::UnparsedExtension;
use activitystreams_new::unparsed::UnparsedMutExt;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)] #[derive(Clone, Debug, Default, Deserialize, Serialize)]
@ -8,4 +9,22 @@ pub struct PageExtension {
pub sensitive: bool, pub sensitive: bool,
} }
impl<T> Extension<T> for PageExtension where T: Base {} impl<U> UnparsedExtension<U> for PageExtension
where
U: UnparsedMutExt,
{
type Error = serde_json::Error;
fn try_from_unparsed(unparsed_mut: &mut U) -> Result<Self, Self::Error> {
Ok(PageExtension {
comments_enabled: unparsed_mut.remove("commentsEnabled")?,
sensitive: unparsed_mut.remove("sensitive")?,
})
}
fn try_into_unparsed(self, unparsed_mut: &mut U) -> Result<(), Self::Error> {
unparsed_mut.insert("commentsEnabled", self.comments_enabled)?;
unparsed_mut.insert("sensitive", self.sensitive)?;

Its so tempting to add the stickied here. It'd be so much easier than using the "featured" as a separate list.

Its so tempting to add the stickied here. It'd be so much easier than using the "featured" as a separate list.

Hmm we could do that, its not part of the ActivityPub standard. Only thing is that we wouldnt be compatible with Mastodon, but our HTTP Signatures arent compatible with theirs either. So it might be a way to get things working, and later we do the proper, compatible implementation.

Or we just do it right from the start, its not that complicated.

Hmm we could do that, its not part of the ActivityPub standard. Only thing is that we wouldnt be compatible with Mastodon, but our HTTP Signatures arent compatible with theirs either. So it might be a way to get things working, and later we do the proper, compatible implementation. Or we just do it right from the start, its not that complicated.
Ok(())
}
}

View File

@ -1,5 +1,6 @@
use crate::{apub::ActorType, LemmyError}; use crate::{apub::ActorType, LemmyError};
use activitystreams::ext::Extension; use activitystreams_ext::UnparsedExtension;
use activitystreams_new::unparsed::UnparsedMutExt;
use actix_web::{client::ClientRequest, HttpRequest}; use actix_web::{client::ClientRequest, HttpRequest};
use http_signature_normalization_actix::{ use http_signature_normalization_actix::{
digest::{DigestClient, SignExt}, digest::{DigestClient, SignExt},
@ -98,4 +99,20 @@ impl PublicKey {
} }
} }
impl<T> Extension<T> for PublicKeyExtension where T: activitystreams::Actor {} impl<U> UnparsedExtension<U> for PublicKeyExtension
where
U: UnparsedMutExt,
{
type Error = serde_json::Error;
fn try_from_unparsed(unparsed_mut: &mut U) -> Result<Self, Self::Error> {
Ok(PublicKeyExtension {
public_key: unparsed_mut.remove("publicKey")?,
})
}
fn try_into_unparsed(self, unparsed_mut: &mut U) -> Result<(), Self::Error> {
unparsed_mut.insert("publicKey", self.public_key)?;
Ok(())
}
}

View File

@ -4,7 +4,8 @@ use crate::{
blocking, blocking,
request::{retry, RecvError}, request::{retry, RecvError},
routes::nodeinfo::{NodeInfo, NodeInfoWellKnown}, routes::nodeinfo::{NodeInfo, NodeInfoWellKnown},
DbPool, LemmyError, DbPool,
LemmyError,
}; };
use activitystreams_new::{base::BaseExt, object::Note, prelude::*, primitives::XsdAnyUri}; use activitystreams_new::{base::BaseExt, object::Note, prelude::*, primitives::XsdAnyUri};
use actix_web::client::Client; use actix_web::client::Client;
@ -20,7 +21,9 @@ use lemmy_db::{
post_view::PostView, post_view::PostView,
user::{UserForm, User_}, user::{UserForm, User_},
user_view::UserView, user_view::UserView,
Crud, Joinable, SearchType, Crud,
Joinable,
SearchType,
}; };
use lemmy_utils::get_apub_protocol_string; use lemmy_utils::get_apub_protocol_string;
use log::debug; use log::debug;

View File

@ -19,7 +19,8 @@ use crate::{
blocking, blocking,
request::{retry, RecvError}, request::{retry, RecvError},
routes::webfinger::WebFingerResponse, routes::webfinger::WebFingerResponse,
DbPool, LemmyError, DbPool,
LemmyError,
}; };
use activitystreams_ext::{Ext1, Ext2}; use activitystreams_ext::{Ext1, Ext2};
use activitystreams_new::{ use activitystreams_new::{
@ -239,7 +240,7 @@ pub trait ActorType {
#[allow(unused_variables)] #[allow(unused_variables)]
async fn send_accept_follow( async fn send_accept_follow(
&self, &self,
follow: &Follow, follow: Follow,
client: &Client, client: &Client,
pool: &DbPool, pool: &DbPool,
) -> Result<(), LemmyError>; ) -> Result<(), LemmyError>;

View File

@ -1,25 +1,31 @@
use crate::{ use crate::{
apub::{ apub::{
activities::{populate_object_props, send_activity_to_community}, activities::send_activity_to_community,
create_apub_response, create_apub_tombstone_response, create_tombstone, create_apub_response,
create_apub_tombstone_response,
create_tombstone,
extensions::page_extension::PageExtension, extensions::page_extension::PageExtension,
fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user}, fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user},
ActorType, ApubLikeableType, ApubObjectType, FromApub, PageExt, ToApub, ActorType,
ApubLikeableType,
ApubObjectType,
FromApub,
PageExt,
ToApub,
}, },
blocking, blocking,
routes::DbPoolParam, routes::DbPoolParam,
DbPool, LemmyError, DbPool,
}; LemmyError,
use activitystreams::{
activity::{Create, Delete, Dislike, Like, Remove, Undo, Update},
BaseBox,
}; };
use activitystreams_ext::Ext1; use activitystreams_ext::Ext1;
use activitystreams_new::{ use activitystreams_new::{
activity::{Create, Delete, Dislike, Like, Remove, Undo, Update},
context, context,
object::{kind::PageType, Image, Page, Tombstone}, object::{kind::PageType, Image, Page, Tombstone},
prelude::*, prelude::*,
primitives::{XsdAnyUri, XsdDateTime}, primitives::{XsdAnyUri, XsdDateTime},
public,
}; };
use actix_web::{body::Body, client::Client, web, HttpResponse}; use actix_web::{body::Body, client::Client, web, HttpResponse};
use lemmy_db::{ use lemmy_db::{
@ -30,6 +36,7 @@ use lemmy_db::{
}; };
use lemmy_utils::{convert_datetime, get_apub_protocol_string, settings::Settings}; use lemmy_utils::{convert_datetime, get_apub_protocol_string, settings::Settings};
use serde::Deserialize; use serde::Deserialize;
use std::str::FromStr;
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct PostQuery { pub struct PostQuery {
@ -265,22 +272,18 @@ impl ApubObjectType for Post {
let id = format!("{}/create/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/create/{}", self.ap_id, uuid::Uuid::new_v4());
let mut create = Create::new(); let mut create = Create::new(creator.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut create.object_props,
vec![community.get_followers_url()],
&id,
)?;
create create
.create_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
creator, creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
create, create.into_any_base()?,
client, client,
pool, pool,
) )
@ -302,22 +305,18 @@ impl ApubObjectType for Post {
let id = format!("{}/update/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/update/{}", self.ap_id, uuid::Uuid::new_v4());
let mut update = Update::new(); let mut update = Update::new(creator.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut update.object_props,
vec![community.get_followers_url()],
&id,
)?;
update update
.update_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
creator, creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
update, update.into_any_base()?,
client, client,
pool, pool,
) )
@ -337,24 +336,18 @@ impl ApubObjectType for Post {
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??; let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4());
let mut delete = Delete::default(); let mut delete = Delete::new(creator.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut delete.object_props,
vec![community.get_followers_url()],
&id,
)?;
delete delete
.delete_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
creator, creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
delete, delete.into_any_base()?,
client, client,
pool, pool,
) )
@ -374,40 +367,28 @@ impl ApubObjectType for Post {
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??; let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4());
let mut delete = Delete::default(); let mut delete = Delete::new(creator.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut delete.object_props,
vec![community.get_followers_url()],
&id,
)?;
delete delete
.delete_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
// TODO // TODO
// Undo that fake activity // Undo that fake activity
let undo_id = format!("{}/undo/delete/{}", self.ap_id, uuid::Uuid::new_v4()); let undo_id = format!("{}/undo/delete/{}", self.ap_id, uuid::Uuid::new_v4());
let mut undo = Undo::default(); let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
populate_object_props(
&mut undo.object_props,
vec![community.get_followers_url()],
&undo_id,
)?;
undo undo
.undo_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&undo_id)?)
.set_object_base_box(delete)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
creator, creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
undo, undo.into_any_base()?,
client, client,
pool, pool,
) )
@ -427,24 +408,18 @@ impl ApubObjectType for Post {
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??; let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4());
let mut remove = Remove::default(); let mut remove = Remove::new(mod_.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut remove.object_props,
vec![community.get_followers_url()],
&id,
)?;
remove remove
.remove_props .set_context(context())
.set_actor_xsd_any_uri(mod_.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
mod_, mod_,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
remove, remove.into_any_base()?,
client, client,
pool, pool,
) )
@ -464,39 +439,27 @@ impl ApubObjectType for Post {
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??; let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4());
let mut remove = Remove::default(); let mut remove = Remove::new(mod_.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut remove.object_props,
vec![community.get_followers_url()],
&id,
)?;
remove remove
.remove_props .set_context(context())
.set_actor_xsd_any_uri(mod_.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
// Undo that fake activity // Undo that fake activity
let undo_id = format!("{}/undo/remove/{}", self.ap_id, uuid::Uuid::new_v4()); let undo_id = format!("{}/undo/remove/{}", self.ap_id, uuid::Uuid::new_v4());
let mut undo = Undo::default(); let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
populate_object_props(
&mut undo.object_props,
vec![community.get_followers_url()],
&undo_id,
)?;
undo undo
.undo_props .set_context(context())
.set_actor_xsd_any_uri(mod_.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&undo_id)?)
.set_object_base_box(remove)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
mod_, mod_,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
undo, undo.into_any_base()?,
client, client,
pool, pool,
) )
@ -520,22 +483,18 @@ impl ApubLikeableType for Post {
let id = format!("{}/like/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/like/{}", self.ap_id, uuid::Uuid::new_v4());
let mut like = Like::new(); let mut like = Like::new(creator.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut like.object_props,
vec![community.get_followers_url()],
&id,
)?;
like like
.like_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
like, like.into_any_base()?,
client, client,
pool, pool,
) )
@ -556,22 +515,18 @@ impl ApubLikeableType for Post {
let id = format!("{}/dislike/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/dislike/{}", self.ap_id, uuid::Uuid::new_v4());
let mut dislike = Dislike::new(); let mut dislike = Dislike::new(creator.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut dislike.object_props,
vec![community.get_followers_url()],
&id,
)?;
dislike dislike
.dislike_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
dislike, dislike.into_any_base()?,
client, client,
pool, pool,
) )
@ -592,38 +547,28 @@ impl ApubLikeableType for Post {
let id = format!("{}/like/{}", self.ap_id, uuid::Uuid::new_v4()); let id = format!("{}/like/{}", self.ap_id, uuid::Uuid::new_v4());
let mut like = Like::new(); let mut like = Like::new(creator.actor_id.to_owned(), page.into_any_base()?);
populate_object_props(
&mut like.object_props,
vec![community.get_followers_url()],
&id,
)?;
like like
.like_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(BaseBox::from_concrete(page)?)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
// TODO // TODO
// Undo that fake activity // Undo that fake activity
let undo_id = format!("{}/undo/like/{}", self.ap_id, uuid::Uuid::new_v4()); let undo_id = format!("{}/undo/like/{}", self.ap_id, uuid::Uuid::new_v4());
let mut undo = Undo::default(); let mut undo = Undo::new(creator.actor_id.to_owned(), like.into_any_base()?);
populate_object_props(
&mut undo.object_props,
vec![community.get_followers_url()],
&undo_id,
)?;
undo undo
.undo_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&undo_id)?)
.set_object_base_box(like)?; .set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community( send_activity_to_community(
&creator, &creator,
&community, &community,
vec![community.get_shared_inbox_url()], vec![community.get_shared_inbox_url()],
undo, undo.into_any_base()?,
client, client,
pool, pool,
) )

View File

@ -1,16 +1,24 @@
use crate::{ use crate::{
apub::{ apub::{
activities::send_activity, create_tombstone, fetcher::get_or_fetch_and_upsert_remote_user, activities::send_activity,
insert_activity, ApubObjectType, FromApub, ToApub, create_tombstone,
fetcher::get_or_fetch_and_upsert_remote_user,
insert_activity,
ApubObjectType,
FromApub,
ToApub,
}, },
blocking, DbPool, LemmyError, blocking,
DbPool,
LemmyError,
}; };
use activitystreams::{ use activitystreams_new::{
activity::{Create, Delete, Undo, Update}, activity::{Create, Delete, Undo, Update},
context, context,
object::{kind::NoteType, properties::ObjectProperties, Note}, object::{kind::NoteType, Note, Tombstone},
prelude::*,
primitives::{XsdAnyUri, XsdDateTime},
}; };
use activitystreams_new::object::Tombstone;
use actix_web::client::Client; use actix_web::client::Client;
use lemmy_db::{ use lemmy_db::{
private_message::{PrivateMessage, PrivateMessageForm}, private_message::{PrivateMessage, PrivateMessageForm},
@ -18,14 +26,14 @@ use lemmy_db::{
Crud, Crud,
}; };
use lemmy_utils::convert_datetime; use lemmy_utils::convert_datetime;
use std::str::FromStr;
#[async_trait::async_trait(?Send)] #[async_trait::async_trait(?Send)]
impl ToApub for PrivateMessage { impl ToApub for PrivateMessage {
type Response = Note; type Response = Note;
async fn to_apub(&self, pool: &DbPool) -> Result<Note, LemmyError> { async fn to_apub(&self, pool: &DbPool) -> Result<Note, LemmyError> {
let mut private_message = Note::default(); let mut private_message = Note::new();
let oprops: &mut ObjectProperties = private_message.as_mut();
let creator_id = self.creator_id; let creator_id = self.creator_id;
let creator = blocking(pool, move |conn| User_::read(conn, creator_id)).await??; let creator = blocking(pool, move |conn| User_::read(conn, creator_id)).await??;
@ -33,16 +41,16 @@ impl ToApub for PrivateMessage {
let recipient_id = self.recipient_id; let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??; let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
oprops private_message
.set_context_xsd_any_uri(context())? .set_context(context())
.set_id(self.ap_id.to_owned())? .set_id(XsdAnyUri::from_str(&self.ap_id.to_owned())?)
.set_published(convert_datetime(self.published))? .set_published(XsdDateTime::from(convert_datetime(self.published)))
.set_content_xsd_string(self.content.to_owned())? .set_content(self.content.to_owned())
.set_to_xsd_any_uri(recipient.actor_id)? .set_to(recipient.actor_id)
.set_attributed_to_xsd_any_uri(creator.actor_id)?; .set_attributed_to(creator.actor_id);
if let Some(u) = self.updated { if let Some(u) = self.updated {
oprops.set_updated(convert_datetime(u))?; private_message.set_updated(XsdDateTime::from(convert_datetime(u)));
} }
Ok(private_message) Ok(private_message)
@ -68,31 +76,35 @@ impl FromApub for PrivateMessageForm {
client: &Client, client: &Client,
pool: &DbPool, pool: &DbPool,
) -> Result<PrivateMessageForm, LemmyError> { ) -> Result<PrivateMessageForm, LemmyError> {
let oprops = &note.object_props; let creator_actor_id = note
let creator_actor_id = &oprops.get_attributed_to_xsd_any_uri().unwrap(); .attributed_to()
.unwrap()
.clone()
.single_xsd_any_uri()
.unwrap();
let creator = get_or_fetch_and_upsert_remote_user(&creator_actor_id, client, pool).await?; let creator = get_or_fetch_and_upsert_remote_user(&creator_actor_id, client, pool).await?;
let recipient_actor_id = &oprops.get_to_xsd_any_uri().unwrap(); let recipient_actor_id = note.to().unwrap().clone().single_xsd_any_uri().unwrap();
let recipient = get_or_fetch_and_upsert_remote_user(&recipient_actor_id, client, pool).await?; let recipient = get_or_fetch_and_upsert_remote_user(&recipient_actor_id, client, pool).await?;
Ok(PrivateMessageForm { Ok(PrivateMessageForm {
creator_id: creator.id, creator_id: creator.id,
recipient_id: recipient.id, recipient_id: recipient.id,
content: oprops content: note
.get_content_xsd_string() .content()
.map(|c| c.to_string()) .unwrap()
.unwrap(), .as_single_xsd_string()
published: oprops .unwrap()
.get_published() .to_string(),
.map(|u| u.as_ref().to_owned().naive_local()), published: note
updated: oprops .published()
.get_updated()
.map(|u| u.as_ref().to_owned().naive_local()), .map(|u| u.as_ref().to_owned().naive_local()),
updated: note.updated().map(|u| u.as_ref().to_owned().naive_local()),
deleted: None, deleted: None,
read: None, read: None,
ap_id: oprops.get_id().unwrap().to_string(), ap_id: note.id().unwrap().to_string(),
local: false, local: false,
}) })
} }
@ -113,21 +125,16 @@ impl ApubObjectType for PrivateMessage {
let recipient_id = self.recipient_id; let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??; let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
let mut create = Create::new(); let mut create = Create::new(creator.actor_id.to_owned(), note.into_any_base()?);
create
.object_props
.set_context_xsd_any_uri(context())?
.set_id(id)?;
let to = format!("{}/inbox", recipient.actor_id); let to = format!("{}/inbox", recipient.actor_id);
create create
.create_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(note)?; .set_to(to.clone());
insert_activity(creator.id, create.clone(), true, pool).await?; insert_activity(creator.id, create.clone(), true, pool).await?;
send_activity(client, &create, creator, vec![to]).await?; send_activity(client, &create.into_any_base()?, creator, vec![to]).await?;
Ok(()) Ok(())
} }
@ -144,21 +151,16 @@ impl ApubObjectType for PrivateMessage {
let recipient_id = self.recipient_id; let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??; let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
let mut update = Update::new(); let mut update = Update::new(creator.actor_id.to_owned(), note.into_any_base()?);
update
.object_props
.set_context_xsd_any_uri(context())?
.set_id(id)?;
let to = format!("{}/inbox", recipient.actor_id); let to = format!("{}/inbox", recipient.actor_id);
update update
.update_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(note)?; .set_to(to.clone());
insert_activity(creator.id, update.clone(), true, pool).await?; insert_activity(creator.id, update.clone(), true, pool).await?;
send_activity(client, &update, creator, vec![to]).await?; send_activity(client, &update.into_any_base()?, creator, vec![to]).await?;
Ok(()) Ok(())
} }
@ -174,21 +176,16 @@ impl ApubObjectType for PrivateMessage {
let recipient_id = self.recipient_id; let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??; let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
let mut delete = Delete::new(); let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
delete
.object_props
.set_context_xsd_any_uri(context())?
.set_id(id)?;
let to = format!("{}/inbox", recipient.actor_id); let to = format!("{}/inbox", recipient.actor_id);
delete delete
.delete_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(note)?; .set_to(to.clone());
insert_activity(creator.id, delete.clone(), true, pool).await?; insert_activity(creator.id, delete.clone(), true, pool).await?;
send_activity(client, &delete, creator, vec![to]).await?; send_activity(client, &delete.into_any_base()?, creator, vec![to]).await?;
Ok(()) Ok(())
} }
@ -204,36 +201,25 @@ impl ApubObjectType for PrivateMessage {
let recipient_id = self.recipient_id; let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??; let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
let mut delete = Delete::new(); let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
delete
.object_props
.set_context_xsd_any_uri(context())?
.set_id(id)?;
let to = format!("{}/inbox", recipient.actor_id); let to = format!("{}/inbox", recipient.actor_id);
delete delete
.delete_props .set_context(context())
.set_actor_xsd_any_uri(creator.actor_id.to_owned())? .set_id(XsdAnyUri::from_str(&id)?)
.set_object_base_box(note)?; .set_to(to.clone());
// TODO // TODO
// Undo that fake activity // Undo that fake activity
let undo_id = format!("{}/undo/delete/{}", self.ap_id, uuid::Uuid::new_v4()); let undo_id = format!("{}/undo/delete/{}", self.ap_id, uuid::Uuid::new_v4());
let mut undo = Undo::default(); let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
undo undo
.object_props .set_context(context())
.set_context_xsd_any_uri(context())? .set_id(XsdAnyUri::from_str(&undo_id)?)
.set_id(undo_id)?; .set_to(to.clone());
undo
.undo_props
.set_actor_xsd_any_uri(creator.actor_id.to_owned())?
.set_object_base_box(delete)?;
insert_activity(creator.id, undo.clone(), true, pool).await?; insert_activity(creator.id, undo.clone(), true, pool).await?;
send_activity(client, &undo, creator, vec![to]).await?; send_activity(client, &undo.into_any_base()?, creator, vec![to]).await?;
Ok(()) Ok(())
} }

View File

@ -8,10 +8,15 @@ use crate::{
community::do_announce, community::do_announce,
extensions::signatures::verify, extensions::signatures::verify,
fetcher::{ fetcher::{
get_or_fetch_and_insert_remote_comment, get_or_fetch_and_insert_remote_post, get_or_fetch_and_insert_remote_comment,
get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user, get_or_fetch_and_insert_remote_post,
get_or_fetch_and_upsert_remote_community,
get_or_fetch_and_upsert_remote_user,
}, },
insert_activity, FromApub, GroupExt, PageExt, insert_activity,
FromApub,
GroupExt,
PageExt,
}, },
blocking, blocking,
routes::{ChatServerParam, DbPoolParam}, routes::{ChatServerParam, DbPoolParam},
@ -19,13 +24,16 @@ use crate::{
server::{SendComment, SendCommunityRoomMessage, SendPost}, server::{SendComment, SendCommunityRoomMessage, SendPost},
UserOperation, UserOperation,
}, },
DbPool, LemmyError, DbPool,
LemmyError,
}; };
use activitystreams::{ use activitystreams_new::{
activity::{Announce, Create, Delete, Dislike, Like, Remove, Undo, Update}, activity::{Announce, Create, Delete, Dislike, Like, Remove, Undo, Update},
Activity, Base, BaseBox, base::AnyBase,
object::Note,
prelude::{ExtendsExt, *},
primitives::XsdAnyUri,
}; };
use activitystreams_new::{object::Note, primitives::XsdAnyUri};
use actix_web::{client::Client, web, HttpRequest, HttpResponse}; use actix_web::{client::Client, web, HttpRequest, HttpResponse};
use lemmy_db::{ use lemmy_db::{
comment::{Comment, CommentForm, CommentLike, CommentLikeForm}, comment::{Comment, CommentForm, CommentLike, CommentLikeForm},
@ -35,7 +43,8 @@ use lemmy_db::{
naive_now, naive_now,
post::{Post, PostForm, PostLike, PostLikeForm}, post::{Post, PostForm, PostLike, PostLikeForm},
post_view::PostView, post_view::PostView,
Crud, Likeable, Crud,
Likeable,
}; };
use lemmy_utils::scrape_text_for_mentions; use lemmy_utils::scrape_text_for_mentions;
use log::debug; use log::debug;
@ -43,7 +52,7 @@ use serde::{Deserialize, Serialize};
use std::fmt::Debug; use std::fmt::Debug;
#[serde(untagged)] #[serde(untagged)]
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub enum SharedAcceptedObjects { pub enum SharedAcceptedObjects {
Create(Box<Create>), Create(Box<Create>),
Update(Box<Update>), Update(Box<Update>),
@ -56,47 +65,50 @@ pub enum SharedAcceptedObjects {
} }
impl SharedAcceptedObjects { impl SharedAcceptedObjects {
fn object(&self) -> Option<&BaseBox> { // TODO: these shouldnt be necessary anymore
fn object(&self) -> Option<AnyBase> {
match self { match self {
SharedAcceptedObjects::Create(c) => c.create_props.get_object_base_box(), SharedAcceptedObjects::Create(c) => c.object().to_owned().one(),
SharedAcceptedObjects::Update(u) => u.update_props.get_object_base_box(), SharedAcceptedObjects::Update(u) => u.object().to_owned().one(),
SharedAcceptedObjects::Like(l) => l.like_props.get_object_base_box(), SharedAcceptedObjects::Like(l) => l.object().to_owned().one(),
SharedAcceptedObjects::Dislike(d) => d.dislike_props.get_object_base_box(), SharedAcceptedObjects::Dislike(d) => d.object().to_owned().one(),
SharedAcceptedObjects::Delete(d) => d.delete_props.get_object_base_box(), SharedAcceptedObjects::Delete(d) => d.object().to_owned().one(),
SharedAcceptedObjects::Undo(d) => d.undo_props.get_object_base_box(), SharedAcceptedObjects::Undo(d) => d.object().to_owned().one(),
SharedAcceptedObjects::Remove(r) => r.remove_props.get_object_base_box(), SharedAcceptedObjects::Remove(r) => r.object().to_owned().one(),
SharedAcceptedObjects::Announce(a) => a.announce_props.get_object_base_box(), SharedAcceptedObjects::Announce(a) => a.object().to_owned().one(),
} }
} }
fn sender(&self) -> XsdAnyUri { fn sender(&self) -> XsdAnyUri {
let uri = match self { let uri = match self {
SharedAcceptedObjects::Create(c) => c.create_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Create(c) => c.actor.to_owned().single_xsd_any_uri(),
SharedAcceptedObjects::Update(u) => u.update_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Update(u) => u.actor.to_owned().single_xsd_any_uri(),
SharedAcceptedObjects::Like(l) => l.like_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Like(l) => l.actor.to_owned().single_xsd_any_uri(),
SharedAcceptedObjects::Dislike(d) => d.dislike_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Dislike(d) => d.actor.to_owned().single_xsd_any_uri(),
SharedAcceptedObjects::Delete(d) => d.delete_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Delete(d) => d.actor.to_owned().single_xsd_any_uri(),
SharedAcceptedObjects::Undo(d) => d.undo_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Undo(d) => d.actor.to_owned().single_xsd_any_uri(),
SharedAcceptedObjects::Remove(r) => r.remove_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Remove(r) => r.actor.to_owned().single_xsd_any_uri(),
SharedAcceptedObjects::Announce(a) => a.announce_props.get_actor_xsd_any_uri(), SharedAcceptedObjects::Announce(a) => a.actor.to_owned().single_xsd_any_uri(),
}; };
uri.unwrap().clone() uri.unwrap()
} }
fn cc(&self) -> String { fn cc(&self) -> String {
// TODO: there is probably an easier way to do this let cc = match self {
let oprops = match self { SharedAcceptedObjects::Create(c) => c.cc().to_owned(),
SharedAcceptedObjects::Create(c) => &c.object_props, SharedAcceptedObjects::Update(u) => u.cc().to_owned(),
SharedAcceptedObjects::Update(u) => &u.object_props, SharedAcceptedObjects::Like(l) => l.cc().to_owned(),
SharedAcceptedObjects::Like(l) => &l.object_props, SharedAcceptedObjects::Dislike(d) => d.cc().to_owned(),
SharedAcceptedObjects::Dislike(d) => &d.object_props, SharedAcceptedObjects::Delete(d) => d.cc().to_owned(),
SharedAcceptedObjects::Delete(d) => &d.object_props, SharedAcceptedObjects::Undo(d) => d.cc().to_owned(),
SharedAcceptedObjects::Undo(d) => &d.object_props, SharedAcceptedObjects::Remove(r) => r.cc().to_owned(),
SharedAcceptedObjects::Remove(r) => &r.object_props, SharedAcceptedObjects::Announce(a) => a.cc().to_owned(),
SharedAcceptedObjects::Announce(a) => &a.object_props,
}; };
oprops cc.unwrap()
.get_many_cc_xsd_any_uris() .clone()
.many()
.unwrap() .unwrap()
.next() .first()
.unwrap()
.as_xsd_any_uri()
.unwrap() .unwrap()
.to_string() .to_string()
} }
@ -117,9 +129,8 @@ pub async fn shared_inbox(
let json = serde_json::to_string(&activity)?; let json = serde_json::to_string(&activity)?;
debug!("Shared inbox received activity: {}", json); debug!("Shared inbox received activity: {}", json);
let object = activity.object().cloned().unwrap(); let sender = &activity.to_owned().sender();
let sender = &activity.sender(); let cc = activity.to_owned().cc();
let cc = &activity.cc();
// TODO: this is hacky, we should probably send the community id directly somehow // TODO: this is hacky, we should probably send the community id directly somehow
let to = cc.replace("/followers", ""); let to = cc.replace("/followers", "");
@ -132,74 +143,75 @@ pub async fn shared_inbox(
} }
} }
match (activity, object.kind()) { let object = activity.object().unwrap();
match (activity, object.kind_str()) {
(SharedAcceptedObjects::Create(c), Some("Page")) => { (SharedAcceptedObjects::Create(c), Some("Page")) => {
receive_create_post((*c).clone(), client, pool, chat_server).await?; receive_create_post((*c).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Create>(*c, &to, sender, client, pool).await announce_activity_if_valid(c.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Update(u), Some("Page")) => { (SharedAcceptedObjects::Update(u), Some("Page")) => {
receive_update_post((*u).clone(), client, pool, chat_server).await?; receive_update_post((*u).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Update>(*u, &to, sender, client, pool).await announce_activity_if_valid(u.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Like(l), Some("Page")) => { (SharedAcceptedObjects::Like(l), Some("Page")) => {
receive_like_post((*l).clone(), client, pool, chat_server).await?; receive_like_post((*l).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Like>(*l, &to, sender, client, pool).await announce_activity_if_valid(l.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Dislike(d), Some("Page")) => { (SharedAcceptedObjects::Dislike(d), Some("Page")) => {
receive_dislike_post((*d).clone(), client, pool, chat_server).await?; receive_dislike_post((*d).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Dislike>(*d, &to, sender, client, pool).await announce_activity_if_valid(d.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Delete(d), Some("Page")) => { (SharedAcceptedObjects::Delete(d), Some("Page")) => {
receive_delete_post((*d).clone(), client, pool, chat_server).await?; receive_delete_post((*d).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Delete>(*d, &to, sender, client, pool).await announce_activity_if_valid(d.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Remove(r), Some("Page")) => { (SharedAcceptedObjects::Remove(r), Some("Page")) => {
receive_remove_post((*r).clone(), client, pool, chat_server).await?; receive_remove_post((*r).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Remove>(*r, &to, sender, client, pool).await announce_activity_if_valid(r.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Create(c), Some("Note")) => { (SharedAcceptedObjects::Create(c), Some("Note")) => {
receive_create_comment((*c).clone(), client, pool, chat_server).await?; receive_create_comment((*c).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Create>(*c, &to, sender, client, pool).await announce_activity_if_valid(c.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Update(u), Some("Note")) => { (SharedAcceptedObjects::Update(u), Some("Note")) => {
receive_update_comment((*u).clone(), client, pool, chat_server).await?; receive_update_comment((*u).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Update>(*u, &to, sender, client, pool).await announce_activity_if_valid(u.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Like(l), Some("Note")) => { (SharedAcceptedObjects::Like(l), Some("Note")) => {
receive_like_comment((*l).clone(), client, pool, chat_server).await?; receive_like_comment((*l).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Like>(*l, &to, sender, client, pool).await announce_activity_if_valid(l.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Dislike(d), Some("Note")) => { (SharedAcceptedObjects::Dislike(d), Some("Note")) => {
receive_dislike_comment((*d).clone(), client, pool, chat_server).await?; receive_dislike_comment((*d).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Dislike>(*d, &to, sender, client, pool).await announce_activity_if_valid(d.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Delete(d), Some("Note")) => { (SharedAcceptedObjects::Delete(d), Some("Note")) => {
receive_delete_comment((*d).clone(), client, pool, chat_server).await?; receive_delete_comment((*d).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Delete>(*d, &to, sender, client, pool).await announce_activity_if_valid(d.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Remove(r), Some("Note")) => { (SharedAcceptedObjects::Remove(r), Some("Note")) => {
receive_remove_comment((*r).clone(), client, pool, chat_server).await?; receive_remove_comment((*r).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Remove>(*r, &to, sender, client, pool).await announce_activity_if_valid(r.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Delete(d), Some("Group")) => { (SharedAcceptedObjects::Delete(d), Some("Group")) => {
receive_delete_community((*d).clone(), client, pool, chat_server).await?; receive_delete_community((*d).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Delete>(*d, &to, sender, client, pool).await announce_activity_if_valid(d.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Remove(r), Some("Group")) => { (SharedAcceptedObjects::Remove(r), Some("Group")) => {
receive_remove_community((*r).clone(), client, pool, chat_server).await?; receive_remove_community((*r).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Remove>(*r, &to, sender, client, pool).await announce_activity_if_valid(r.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Undo(u), Some("Delete")) => { (SharedAcceptedObjects::Undo(u), Some("Delete")) => {
receive_undo_delete((*u).clone(), client, pool, chat_server).await?; receive_undo_delete((*u).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Undo>(*u, &to, sender, client, pool).await announce_activity_if_valid(u.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Undo(u), Some("Remove")) => { (SharedAcceptedObjects::Undo(u), Some("Remove")) => {
receive_undo_remove((*u).clone(), client, pool, chat_server).await?; receive_undo_remove((*u).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Undo>(*u, &to, sender, client, pool).await announce_activity_if_valid(u.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Undo(u), Some("Like")) => { (SharedAcceptedObjects::Undo(u), Some("Like")) => {
receive_undo_like((*u).clone(), client, pool, chat_server).await?; receive_undo_like((*u).clone(), client, pool, chat_server).await?;
announce_activity_if_valid::<Undo>(*u, &to, sender, client, pool).await announce_activity_if_valid(u.into_any_base()?, &to, sender, client, pool).await
} }
(SharedAcceptedObjects::Announce(a), _) => receive_announce(a, client, pool, chat_server).await, (SharedAcceptedObjects::Announce(a), _) => receive_announce(a, client, pool, chat_server).await,
(a, _) => receive_unhandled_activity(a), (a, _) => receive_unhandled_activity(a),
@ -207,16 +219,13 @@ pub async fn shared_inbox(
} }
// TODO: should pass in sender as ActorType, but thats a bit tricky in shared_inbox() // TODO: should pass in sender as ActorType, but thats a bit tricky in shared_inbox()
async fn announce_activity_if_valid<A>( async fn announce_activity_if_valid(
activity: A, activity: AnyBase,
community_uri: &str, community_uri: &str,
sender: &XsdAnyUri, sender: &XsdAnyUri,
client: &Client, client: &Client,
pool: &DbPool, pool: &DbPool,
) -> Result<HttpResponse, LemmyError> ) -> Result<HttpResponse, LemmyError> {
where
A: Activity + Base + Serialize + Debug,
{
let community_uri = community_uri.to_owned(); let community_uri = community_uri.to_owned();
let community = blocking(pool, move |conn| { let community = blocking(pool, move |conn| {
Community::read_from_actor_id(conn, &community_uri) Community::read_from_actor_id(conn, &community_uri)
@ -238,71 +247,60 @@ async fn receive_announce(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let object = announce let object = announce.to_owned().object.one().unwrap();
.announce_props
.get_object_base_box()
.unwrap()
.to_owned();
// TODO: too much copy paste // TODO: too much copy paste
match object.kind() { match object.kind_str() {
Some("Create") => { Some("Create") => {
let create = object.into_concrete::<Create>()?; let create = Create::from_any_base(object)?.unwrap();
let inner_object = create.create_props.get_object_base_box().unwrap(); match create.object.as_single_kind_str() {
match inner_object.kind() {
Some("Page") => receive_create_post(create, client, pool, chat_server).await, Some("Page") => receive_create_post(create, client, pool, chat_server).await,
Some("Note") => receive_create_comment(create, client, pool, chat_server).await, Some("Note") => receive_create_comment(create, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce), _ => receive_unhandled_activity(announce),
} }
} }
Some("Update") => { Some("Update") => {
let update = object.into_concrete::<Update>()?; let update = Update::from_any_base(object)?.unwrap();
let inner_object = update.update_props.get_object_base_box().unwrap(); match update.object.as_single_kind_str() {
match inner_object.kind() {
Some("Page") => receive_update_post(update, client, pool, chat_server).await, Some("Page") => receive_update_post(update, client, pool, chat_server).await,
Some("Note") => receive_update_comment(update, client, pool, chat_server).await, Some("Note") => receive_update_comment(update, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce), _ => receive_unhandled_activity(announce),
} }
} }
Some("Like") => { Some("Like") => {
let like = object.into_concrete::<Like>()?; let like = Like::from_any_base(object)?.unwrap();
let inner_object = like.like_props.get_object_base_box().unwrap(); match like.object.as_single_kind_str() {
match inner_object.kind() {
Some("Page") => receive_like_post(like, client, pool, chat_server).await, Some("Page") => receive_like_post(like, client, pool, chat_server).await,
Some("Note") => receive_like_comment(like, client, pool, chat_server).await, Some("Note") => receive_like_comment(like, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce), _ => receive_unhandled_activity(announce),
} }
} }
Some("Dislike") => { Some("Dislike") => {
let dislike = object.into_concrete::<Dislike>()?; let dislike = Dislike::from_any_base(object)?.unwrap();
let inner_object = dislike.dislike_props.get_object_base_box().unwrap(); match dislike.object.as_single_kind_str() {
match inner_object.kind() {
Some("Page") => receive_dislike_post(dislike, client, pool, chat_server).await, Some("Page") => receive_dislike_post(dislike, client, pool, chat_server).await,
Some("Note") => receive_dislike_comment(dislike, client, pool, chat_server).await, Some("Note") => receive_dislike_comment(dislike, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce), _ => receive_unhandled_activity(announce),
} }
} }
Some("Delete") => { Some("Delete") => {
let delete = object.into_concrete::<Delete>()?; let delete = Delete::from_any_base(object)?.unwrap();
let inner_object = delete.delete_props.get_object_base_box().unwrap(); match delete.object.as_single_kind_str() {
match inner_object.kind() {
Some("Page") => receive_delete_post(delete, client, pool, chat_server).await, Some("Page") => receive_delete_post(delete, client, pool, chat_server).await,
Some("Note") => receive_delete_comment(delete, client, pool, chat_server).await, Some("Note") => receive_delete_comment(delete, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce), _ => receive_unhandled_activity(announce),
} }
} }
Some("Remove") => { Some("Remove") => {
let remove = object.into_concrete::<Remove>()?; let remove = Remove::from_any_base(object)?.unwrap();
let inner_object = remove.remove_props.get_object_base_box().unwrap(); match remove.object.as_single_kind_str() {
match inner_object.kind() {
Some("Page") => receive_remove_post(remove, client, pool, chat_server).await, Some("Page") => receive_remove_post(remove, client, pool, chat_server).await,
Some("Note") => receive_remove_comment(remove, client, pool, chat_server).await, Some("Note") => receive_remove_comment(remove, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce), _ => receive_unhandled_activity(announce),
} }
} }
Some("Undo") => { Some("Undo") => {
let undo = object.into_concrete::<Undo>()?; let undo = Undo::from_any_base(object)?.unwrap();
let inner_object = undo.undo_props.get_object_base_box().unwrap(); match undo.object.as_single_kind_str() {
match inner_object.kind() {
Some("Delete") => receive_undo_delete(undo, client, pool, chat_server).await, Some("Delete") => receive_undo_delete(undo, client, pool, chat_server).await,
Some("Remove") => receive_undo_remove(undo, client, pool, chat_server).await, Some("Remove") => receive_undo_remove(undo, client, pool, chat_server).await,
Some("Like") => receive_undo_like(undo, client, pool, chat_server).await, Some("Like") => receive_undo_like(undo, client, pool, chat_server).await,
@ -327,15 +325,9 @@ async fn receive_create_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let page = create let page = PageExt::from_any_base(create.object.to_owned().one().unwrap())?.unwrap();
.create_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let user_uri = create.create_props.get_actor_xsd_any_uri().unwrap(); let user_uri = create.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -369,15 +361,9 @@ async fn receive_create_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = create let note = Note::from_any_base(create.object.to_owned().one().unwrap())?.unwrap();
.create_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = create.create_props.get_actor_xsd_any_uri().unwrap(); let user_uri = create.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -424,15 +410,9 @@ async fn receive_update_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let page = update let page = PageExt::from_any_base(update.object.to_owned().one().unwrap())?.unwrap();
.update_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let user_uri = update.update_props.get_actor_xsd_any_uri().unwrap(); let user_uri = update.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -466,15 +446,9 @@ async fn receive_like_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let page = like let page = PageExt::from_any_base(like.object.to_owned().one().unwrap())?.unwrap();
.like_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let user_uri = like.like_props.get_actor_xsd_any_uri().unwrap(); let user_uri = like.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -517,15 +491,9 @@ async fn receive_dislike_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let page = dislike let page = PageExt::from_any_base(dislike.object.to_owned().one().unwrap())?.unwrap();
.dislike_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let user_uri = dislike.dislike_props.get_actor_xsd_any_uri().unwrap(); let user_uri = dislike.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -568,15 +536,9 @@ async fn receive_update_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = update let note = Note::from_any_base(update.object.to_owned().one().unwrap())?.unwrap();
.update_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = update.update_props.get_actor_xsd_any_uri().unwrap(); let user_uri = update.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -623,15 +585,9 @@ async fn receive_like_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = like let note = Note::from_any_base(like.object.to_owned().one().unwrap())?.unwrap();
.like_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = like.like_props.get_actor_xsd_any_uri().unwrap(); let user_uri = like.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -681,15 +637,9 @@ async fn receive_dislike_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = dislike let note = Note::from_any_base(dislike.object.to_owned().one().unwrap())?.unwrap();
.dislike_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = dislike.dislike_props.get_actor_xsd_any_uri().unwrap(); let user_uri = dislike.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -739,15 +689,9 @@ async fn receive_delete_community(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap(); let user_uri = delete.actor.to_owned().single_xsd_any_uri().unwrap();
let group = delete let group = GroupExt::from_any_base(delete.object.to_owned().one().unwrap())?.unwrap();
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<GroupExt>()?;
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -812,15 +756,9 @@ async fn receive_remove_community(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap(); let mod_uri = remove.actor.to_owned().single_xsd_any_uri().unwrap();
let group = remove let group = GroupExt::from_any_base(remove.object.to_owned().one().unwrap())?.unwrap();
.remove_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<GroupExt>()?;
let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?;
@ -885,15 +823,9 @@ async fn receive_delete_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap(); let user_uri = delete.actor.to_owned().single_xsd_any_uri().unwrap();
let page = delete let page = PageExt::from_any_base(delete.object.to_owned().one().unwrap())?.unwrap();
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -947,15 +879,9 @@ async fn receive_remove_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap(); let mod_uri = remove.actor.to_owned().single_xsd_any_uri().unwrap();
let page = remove let page = PageExt::from_any_base(remove.object.to_owned().one().unwrap())?.unwrap();
.remove_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?;
@ -1009,15 +935,9 @@ async fn receive_delete_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap(); let user_uri = delete.actor.to_owned().single_xsd_any_uri().unwrap();
let note = delete let note = Note::from_any_base(delete.object.to_owned().one().unwrap())?.unwrap();
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -1073,15 +993,9 @@ async fn receive_remove_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap(); let mod_uri = remove.actor.to_owned().single_xsd_any_uri().unwrap();
let note = remove let note = Note::from_any_base(remove.object.to_owned().one().unwrap())?.unwrap();
.remove_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?;
@ -1137,22 +1051,9 @@ async fn receive_undo_delete(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let delete = undo let delete = Delete::from_any_base(undo.object.to_owned().one().unwrap())?.unwrap();
.undo_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Delete>()?;
let type_ = delete
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.kind()
.unwrap();
let type_ = delete.object.as_single_kind_str().unwrap();
match type_ { match type_ {
"Note" => receive_undo_delete_comment(delete, client, pool, chat_server).await, "Note" => receive_undo_delete_comment(delete, client, pool, chat_server).await,
"Page" => receive_undo_delete_post(delete, client, pool, chat_server).await, "Page" => receive_undo_delete_post(delete, client, pool, chat_server).await,
@ -1167,22 +1068,9 @@ async fn receive_undo_remove(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let remove = undo let remove = Remove::from_any_base(undo.object.to_owned().one().unwrap())?.unwrap();
.undo_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Remove>()?;
let type_ = remove
.remove_props
.get_object_base_box()
.to_owned()
.unwrap()
.kind()
.unwrap();
let type_ = remove.object.as_single_kind_str().unwrap();
match type_ { match type_ {
"Note" => receive_undo_remove_comment(remove, client, pool, chat_server).await, "Note" => receive_undo_remove_comment(remove, client, pool, chat_server).await,
"Page" => receive_undo_remove_post(remove, client, pool, chat_server).await, "Page" => receive_undo_remove_post(remove, client, pool, chat_server).await,
@ -1197,15 +1085,9 @@ async fn receive_undo_delete_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap(); let user_uri = delete.actor.to_owned().single_xsd_any_uri().unwrap();
let note = delete let note = Note::from_any_base(delete.object.to_owned().one().unwrap())?.unwrap();
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -1261,15 +1143,9 @@ async fn receive_undo_remove_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap(); let mod_uri = remove.actor.to_owned().single_xsd_any_uri().unwrap();
let note = remove let note = Note::from_any_base(remove.object.to_owned().one().unwrap())?.unwrap();
.remove_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?;
@ -1325,15 +1201,9 @@ async fn receive_undo_delete_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap(); let user_uri = delete.actor.to_owned().single_xsd_any_uri().unwrap();
let page = delete let page = PageExt::from_any_base(delete.object.to_owned().one().unwrap())?.unwrap();
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -1387,15 +1257,9 @@ async fn receive_undo_remove_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap(); let mod_uri = remove.actor.to_owned().single_xsd_any_uri().unwrap();
let page = remove let page = PageExt::from_any_base(remove.object.to_owned().one().unwrap())?.unwrap();
.remove_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?;
@ -1449,15 +1313,9 @@ async fn receive_undo_delete_community(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap(); let user_uri = delete.actor.to_owned().single_xsd_any_uri().unwrap();
let group = delete let group = GroupExt::from_any_base(delete.object.to_owned().one().unwrap())?.unwrap();
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<GroupExt>()?;
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -1522,15 +1380,9 @@ async fn receive_undo_remove_community(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap(); let mod_uri = remove.actor.to_owned().single_xsd_any_uri().unwrap();
let group = remove let group = GroupExt::from_any_base(remove.object.to_owned().one().unwrap())?.unwrap();
.remove_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<GroupExt>()?;
let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?; let mod_ = get_or_fetch_and_upsert_remote_user(&mod_uri, client, pool).await?;
@ -1595,22 +1447,9 @@ async fn receive_undo_like(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let like = undo let like = Like::from_any_base(undo.object.to_owned().one().unwrap())?.unwrap();
.undo_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Like>()?;
let type_ = like
.like_props
.get_object_base_box()
.to_owned()
.unwrap()
.kind()
.unwrap();
let type_ = like.object.as_single_kind_str().unwrap();
match type_ { match type_ {
"Note" => receive_undo_like_comment(like, client, pool, chat_server).await, "Note" => receive_undo_like_comment(like, client, pool, chat_server).await,
"Page" => receive_undo_like_post(like, client, pool, chat_server).await, "Page" => receive_undo_like_post(like, client, pool, chat_server).await,
@ -1624,15 +1463,9 @@ async fn receive_undo_like_comment(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = like let note = Note::from_any_base(like.object.to_owned().one().unwrap())?.unwrap();
.like_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = like.like_props.get_actor_xsd_any_uri().unwrap(); let user_uri = like.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
@ -1678,15 +1511,9 @@ async fn receive_undo_like_post(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let page = like let page = PageExt::from_any_base(like.object.to_owned().one().unwrap())?.unwrap();
.like_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<PageExt>()?;
let user_uri = like.like_props.get_actor_xsd_any_uri().unwrap(); let user_uri = like.actor.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;

View File

@ -1,12 +1,18 @@
use crate::{ use crate::{
api::claims::Claims, api::claims::Claims,
apub::{ apub::{
activities::send_activity, create_apub_response, insert_activity, ActorType, FromApub, activities::send_activity,
PersonExt, ToApub, create_apub_response,
insert_activity,
ActorType,
FromApub,
PersonExt,
ToApub,
}, },
blocking, blocking,
routes::DbPoolParam, routes::DbPoolParam,
DbPool, LemmyError, DbPool,
LemmyError,
}; };
use activitystreams_ext::Ext1; use activitystreams_ext::Ext1;
use activitystreams_new::{ use activitystreams_new::{
@ -105,7 +111,7 @@ impl ActorType for User_ {
insert_activity(self.id, follow.clone(), true, pool).await?; insert_activity(self.id, follow.clone(), true, pool).await?;
send_activity(client, &follow, self, vec![to]).await?; send_activity(client, &follow.into_any_base()?, self, vec![to]).await?;
Ok(()) Ok(())
} }
@ -129,7 +135,7 @@ impl ActorType for User_ {
insert_activity(self.id, undo.clone(), true, pool).await?; insert_activity(self.id, undo.clone(), true, pool).await?;
send_activity(client, &undo, self, vec![to]).await?; send_activity(client, &undo.into_any_base()?, self, vec![to]).await?;
Ok(()) Ok(())
} }
@ -171,7 +177,7 @@ impl ActorType for User_ {
async fn send_accept_follow( async fn send_accept_follow(
&self, &self,
_follow: &Follow, _follow: Follow,
_client: &Client, _client: &Client,
_pool: &DbPool, _pool: &DbPool,
) -> Result<(), LemmyError> { ) -> Result<(), LemmyError> {
@ -225,6 +231,7 @@ impl FromApub for UserForm {
matrix_user_id: None, matrix_user_id: None,
actor_id: person.id().unwrap().to_string(), actor_id: person.id().unwrap().to_string(),
bio: person bio: person
.inner
.summary() .summary()
.map(|s| s.as_single_xsd_string().unwrap().into()), .map(|s| s.as_single_xsd_string().unwrap().into()),
local: false, local: false,

View File

@ -3,16 +3,19 @@ use crate::{
apub::{ apub::{
extensions::signatures::verify, extensions::signatures::verify,
fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user}, fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user},
insert_activity, FromApub, insert_activity,
FromApub,
}, },
blocking, blocking,
routes::{ChatServerParam, DbPoolParam}, routes::{ChatServerParam, DbPoolParam},
websocket::{server::SendUserRoomMessage, UserOperation}, websocket::{server::SendUserRoomMessage, UserOperation},
DbPool, LemmyError, DbPool,
LemmyError,
}; };
use activitystreams::{ use activitystreams_new::{
activity::{Accept, Create, Delete, Undo, Update}, activity::{Accept, Create, Delete, Undo, Update},
object::Note, object::Note,
prelude::*,
}; };
use actix_web::{client::Client, web, HttpRequest, HttpResponse}; use actix_web::{client::Client, web, HttpRequest, HttpResponse};
use lemmy_db::{ use lemmy_db::{
@ -21,7 +24,8 @@ use lemmy_db::{
private_message::{PrivateMessage, PrivateMessageForm}, private_message::{PrivateMessage, PrivateMessageForm},
private_message_view::PrivateMessageView, private_message_view::PrivateMessageView,
user::User_, user::User_,
Crud, Followable, Crud,
Followable,
}; };
use log::debug; use log::debug;
use serde::Deserialize; use serde::Deserialize;
@ -77,8 +81,9 @@ async fn receive_accept(
pool: &DbPool, pool: &DbPool,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let community_uri = accept let community_uri = accept
.accept_props .actor()
.get_actor_xsd_any_uri() .to_owned()
.single_xsd_any_uri()
.unwrap() .unwrap()
.to_string(); .to_string();
@ -113,17 +118,10 @@ async fn receive_create_private_message(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = create let user_uri = &create.actor().to_owned().single_xsd_any_uri().unwrap();
.create_props let note = Note::from_any_base(create.object.as_one().unwrap().to_owned())?.unwrap();
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = create.create_props.get_actor_xsd_any_uri().unwrap(); let user = get_or_fetch_and_upsert_remote_user(user_uri, client, pool).await?;
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
verify(request, &user)?; verify(request, &user)?;
insert_activity(user.id, create, false, pool).await?; insert_activity(user.id, create, false, pool).await?;
@ -161,15 +159,8 @@ async fn receive_update_private_message(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = update let user_uri = update.actor().to_owned().single_xsd_any_uri().unwrap();
.update_props let note = Note::from_any_base(update.object.as_one().unwrap().to_owned())?.unwrap();
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = update.update_props.get_actor_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
verify(request, &user)?; verify(request, &user)?;
@ -217,15 +208,8 @@ async fn receive_delete_private_message(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let note = delete let user_uri = delete.actor().to_owned().single_xsd_any_uri().unwrap();
.delete_props let note = Note::from_any_base(delete.object.as_one().unwrap().to_owned())?.unwrap();
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
verify(request, &user)?; verify(request, &user)?;
@ -285,23 +269,9 @@ async fn receive_undo_delete_private_message(
pool: &DbPool, pool: &DbPool,
chat_server: ChatServerParam, chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> { ) -> Result<HttpResponse, LemmyError> {
let delete = undo let delete = Delete::from_any_base(undo.object.as_one().unwrap().to_owned())?.unwrap();
.undo_props let note = Note::from_any_base(delete.object.as_one().unwrap().to_owned())?.unwrap();
.get_object_base_box() let user_uri = delete.actor().to_owned().single_xsd_any_uri().unwrap();
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Delete>()?;
let note = delete
.delete_props
.get_object_base_box()
.to_owned()
.unwrap()
.to_owned()
.into_concrete::<Note>()?;
let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?; let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
verify(request, &user)?; verify(request, &user)?;