# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
-[[package]]
-name = "activitystreams"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "464cb473bfb402b857cc15b1153974c203a43f1485da4dda15cd17a738548958"
-dependencies = [
- "activitystreams-derive",
- "chrono",
- "mime",
- "serde 1.0.114",
- "serde_json",
- "thiserror",
- "url",
-]
-
-[[package]]
-name = "activitystreams-derive"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c39ba5929399e9f921055bac76dd8f47419fa5b6b6da1ac4c1e82b94ed0ac7b4"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
[[package]]
name = "activitystreams-ext"
version = "0.1.0"
-source = "git+https://git.asonix.dog/asonix/activitystreams-ext#e5c97f4ea9f60e49bc7ff27fb0fb515d3190fd25"
+source = "git+https://git.asonix.dog/asonix/activitystreams-ext?branch=main#9acc466c7cb550ada31b669a1c47ea088f1c8471"
dependencies = [
"activitystreams-new",
"serde 1.0.114",
[[package]]
name = "activitystreams-new"
version = "0.1.0"
-source = "git+https://git.asonix.dog/asonix/activitystreams-sketch#99c7e9aa5596eda846a1ebd5978ca72d11d4c08a"
+source = "git+https://git.asonix.dog/asonix/activitystreams-sketch?branch=main#857d5167dfa13054dd0d21d3d54f8147eea0d546"
dependencies = [
- "activitystreams",
+ "chrono",
+ "mime",
"serde 1.0.114",
"serde_json",
- "typed-builder",
+ "thiserror",
+ "url",
]
[[package]]
[[package]]
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"
-checksum = "23b32e0fdd5998c2712549cbc39dff46c8754d55e3dd9f4d017d9e28de30cac6"
+checksum = "627f597ad98061816766201db8afc7444752992f2919b2e60f53a7fa27f01aed"
dependencies = [
"actix-http",
"actix-service",
[[package]]
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"
-checksum = "fd7ea0568480d199952a51de70271946da57c33cc0e8b83f54383e70958dff21"
+checksum = "33f501768e82e8548763b7f55309e2f8bcc7f9f4273c75b47af99ac2b2581f37"
dependencies = [
"actix-codec",
"actix-connect",
"bitflags",
"brotli2",
"bytes",
+ "cookie",
"copyless",
"derive_more",
"either",
"http",
"httparse",
"indexmap",
+ "itoa",
"language-tags",
"lazy_static",
"log",
"serde 1.0.114",
"serde_json",
"serde_urlencoded",
- "sha-1",
+ "sha-1 0.9.1",
"slab",
"time 0.2.16",
]
[[package]]
name = "actix-threadpool"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91164716d956745c79dcea5e66d2aa04506549958accefcede5368c70f2fd4ff"
+checksum = "d209f04d002854b9afd3743032a27b066158817965bf5d036824d19ac2cc0e30"
dependencies = [
"derive_more",
"futures-channel",
"lazy_static",
"log",
"num_cpus",
- "parking_lot 0.10.2",
+ "parking_lot 0.11.0",
"threadpool",
]
[[package]]
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"
-checksum = "8bd6df56ec5f9a1a0d8335f156f36e1e8f76dbd736fa0cc0f6bc3a69be1e6124"
+checksum = "9125c29b7d9911bfdb4d0d4d8f1cf4fee4f21515cf2a405a423c30c245364297"
dependencies = [
"actix-codec",
"actix-http",
[[package]]
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"
-checksum = "2b5efeb3907582f9c724ce27be093ab8aafabd97be828bc6750c0d467f5e1aa3"
+checksum = "55ef22b33c49a28dda61866d5573c5b8ceb080a099cd59e7371b78b48bbf1bc0"
dependencies = [
"actix",
"actix-codec",
"actix-http",
"actix-web",
"bytes",
- "futures",
+ "futures-channel",
+ "futures-core",
"pin-project",
]
[[package]]
name = "actix-web-codegen"
-version = "0.2.2"
+version = "0.3.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a71bf475cbe07281d0b3696abb48212db118e7e23219f13596ce865235ff5766"
+checksum = "df9679f5b1f4c819de08b63b0a61a131b2fdc30b367c2c208984fda8eaa07fa0"
dependencies = [
"proc-macro2",
"quote",
[[package]]
name = "addr2line"
-version = "0.12.2"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "602d785912f476e480434627e8732e6766b760c045bbf897d9dfaa9f4fbd399c"
+checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccc9a9dd069569f212bc4330af9f17c4afb5e8ce185e83dbb14f1349dda18b10"
-
-[[package]]
-name = "adler32"
-version = "1.1.0"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567b077b825e468cc974f0020d4082ee6e03132512f207ef1a02fd5d00d1f32d"
+checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
[[package]]
name = "aho-corasick"
[[package]]
name = "awc"
-version = "2.0.0-alpha.2"
+version = "2.0.0-beta.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7038a9747cd5159b9f0550895eaf865c0143baa7e4eee834e9294d0a7e0e4be"
+checksum = "374057b508d4083208996be82141891c2e14c8885f45991b21c1621200ab6df3"
dependencies = [
"actix-codec",
"actix-http",
[[package]]
name = "backtrace"
-version = "0.3.49"
+version = "0.3.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05100821de9e028f12ae3d189176b41ee198341eb8f369956407fea2f5cc666c"
+checksum = "46254cf2fdcdf1badb5934448c1bcbe046a56537b3987d96c51a7afc5d03f293"
dependencies = [
"addr2line",
"cfg-if",
"libc",
- "miniz_oxide 0.3.7",
+ "miniz_oxide",
"object",
"rustc-demangle",
]
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
dependencies = [
- "generic-array 0.14.2",
+ "generic-array 0.14.3",
]
[[package]]
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa136449e765dc7faa244561ccae839c394048667929af599b5d931ebe7b7f10"
dependencies = [
- "generic-array 0.14.2",
+ "generic-array 0.14.3",
]
[[package]]
"libc",
]
+[[package]]
+name = "buf-min"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6ae7069aad07c7cdefe6a22a671f00650728bd2331a4cc62e1e5d0becdf9ca4"
+dependencies = [
+ "bytes",
+]
+
[[package]]
name = "bufstream"
version = "0.1.4"
[[package]]
name = "bytes"
-version = "0.5.5"
+version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "118cf036fbb97d0816e3c34b2d7a1e8cfc60f68fcf63d550ddbe9bd5f59c213b"
-dependencies = [
- "loom",
-]
+checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
[[package]]
name = "bytestring"
[[package]]
name = "cc"
-version = "1.0.57"
+version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fde55d2a2bfaa4c9668bbc63f531fbdeee3ffe188f4662511ce2c22b3eedebe"
+checksum = "f9a06fb2e53271d7c279ec1efea6ab691c35a2ae67ec0d91d7acec0caf13b518"
[[package]]
name = "cfg-if"
[[package]]
name = "chrono"
-version = "0.4.12"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0fee792e164f78f5fe0c296cc2eb3688a2ca2b70cdff33040922d298203f0c4"
+checksum = "c74d84029116787153e02106bf53e66828452a4b325cc8652b788b5967c0a0b6"
dependencies = [
"num-integer",
"num-traits 0.2.12",
"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]]
name = "copyless"
version = "0.1.5"
[[package]]
name = "cpuid-bool"
-version = "0.1.0"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d375c433320f6c5057ae04a04376eef4d04ce2801448cf8863a78da99107be4"
+checksum = "ec6763c20301ab0dc67051d1b6f4cc9132ad9e6eddcb1f10c6c53ea6d6ae2183"
[[package]]
name = "crc32fast"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
dependencies = [
- "generic-array 0.14.2",
+ "generic-array 0.14.3",
]
[[package]]
"cfg-if",
"crc32fast",
"libc",
- "miniz_oxide 0.4.0",
+ "miniz_oxide",
]
[[package]]
"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]]
name = "generic-array"
version = "0.12.3"
[[package]]
name = "generic-array"
-version = "0.14.2"
+version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac746a5f3bbfdadd6106868134545e684693d54d9d44f6e9588a7d54af0bf980"
+checksum = "60fb4bb6bba52f78a471264d9a3b7d026cc0af47b22cd2cffbc0b787ca003e63"
dependencies = [
"typenum",
"version_check 0.9.2",
[[package]]
name = "gimli"
-version = "0.21.0"
+version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c"
+checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724"
[[package]]
name = "h2"
-version = "0.2.5"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff"
+checksum = "993f9e0baeed60001cf565546b0d3dbe6a6ad23f2bd31644a133c641eccf6d53"
dependencies = [
"bytes",
"fnv",
"futures-util",
"http",
"indexmap",
- "log",
"slab",
"tokio",
"tokio-util 0.3.1",
+ "tracing",
]
[[package]]
[[package]]
name = "hermit-abi"
-version = "0.1.14"
+version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9586eedd4ce6b3c498bc3b4dd92fc9f11166aa908a914071953768066c67909"
+checksum = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9"
dependencies = [
"libc",
]
[[package]]
name = "instant"
-version = "0.1.5"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69da7ce1490173c2bf4d26bc8be429aaeeaf4cce6c4b970b7949651fa17655fe"
+checksum = "5b141fdc7836c525d4d594027d318c84161ca17aaf8113ab1f81ab93ae897485"
[[package]]
name = "iovec"
[[package]]
name = "js-sys"
-version = "0.3.41"
+version = "0.3.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4b9172132a62451e56142bff9afc91c8e4a4500aa5b847da36815b63bfda916"
+checksum = "52732a3d3ad72c58ad2dc70624f9c17b46ecd0943b9a4f1ee37c4c18c5d983e2"
dependencies = [
"wasm-bindgen",
]
"sha2",
"strum",
"strum_macros",
+ "url",
]
[[package]]
name = "lemmy_server"
version = "0.0.1"
dependencies = [
- "activitystreams",
"activitystreams-ext",
"activitystreams-new",
"actix",
[[package]]
name = "libc"
-version = "0.2.71"
+version = "0.2.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
+checksum = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701"
[[package]]
name = "linked-hash-map"
[[package]]
name = "lock_api"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de302ce1fe7482db13738fbaf2e21cfb06a986b89c0bf38d88abf16681aada4e"
+checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c"
dependencies = [
"scopeguard",
]
[[package]]
name = "log"
-version = "0.4.8"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
dependencies = [
"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]]
name = "lru-cache"
version = "0.1.2"
"unicase",
]
-[[package]]
-name = "miniz_oxide"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
-dependencies = [
- "adler32",
-]
-
[[package]]
name = "miniz_oxide"
version = "0.4.0"
checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733"
dependencies = [
"instant",
- "lock_api 0.4.0",
+ "lock_api 0.4.1",
"parking_lot_core 0.8.0",
]
dependencies = [
"maplit",
"pest",
- "sha-1",
+ "sha-1 0.8.2",
]
[[package]]
[[package]]
name = "pkg-config"
-version = "0.3.17"
+version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
+checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33"
[[package]]
name = "ppv-lite86"
[[package]]
name = "redox_syscall"
-version = "0.1.56"
+version = "0.1.57"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
+checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
[[package]]
name = "regex"
"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]]
name = "scopeguard"
version = "1.1.0"
"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]]
name = "sha1"
version = "0.6.0"
[[package]]
name = "simple_asn1"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b25ecba7165254f0c97d6c22a64b1122a03634b18d20a34daf21e18f892e618"
+checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b"
dependencies = [
"chrono",
"num-bigint",
[[package]]
name = "smallvec"
-version = "1.4.0"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
+checksum = "3757cb9d89161a2f24e1cf78efa0c1fcff485d18e3f55e0aa3480824ddaa0f3f"
[[package]]
name = "socket2"
[[package]]
name = "syn"
-version = "1.0.33"
+version = "1.0.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8d5d96e8cbb005d6959f119f773bfaebb5684296108fb32600c00cde305b2cd"
+checksum = "936cae2873c940d92e697597c5eee105fb570cd5689c695806f672883653349b"
dependencies = [
"proc-macro2",
"quote",
"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]]
name = "trust-dns-proto"
version = "0.19.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d"
-[[package]]
-name = "typed-builder"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85fc4459191c621a53ef6c6ca5642e6e0e5ccc61f3e5b8ad6b6ab5317f0200fb"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
[[package]]
name = "typenum"
version = "1.12.0"
[[package]]
name = "v_escape"
-version = "0.7.4"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6"
+checksum = "b66158ce426982197fd44266d68125fd4000f1d42f5ee33ef02b500b4b6b0024"
dependencies = [
+ "buf-min",
"v_escape_derive",
]
[[package]]
name = "v_escape_derive"
-version = "0.5.6"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae"
+checksum = "cae7cffca0b1f9af9b20610f6fdeee9ffcce61417b5ad186a5d482dc904e24cd"
dependencies = [
"nom 4.2.3",
"proc-macro2",
[[package]]
name = "v_htmlescape"
-version = "0.4.5"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41"
+checksum = "f5fd25529cb2f78527b5ee507bcfb357b26d057b5e480853c26d49a4ead5c629"
dependencies = [
"cfg-if",
"v_escape",
[[package]]
name = "wasm-bindgen"
-version = "0.2.64"
+version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a634620115e4a229108b71bde263bb4220c483b3f07f5ba514ee8d15064c4c2"
+checksum = "f3edbcc9536ab7eababcc6d2374a0b7bfe13a2b6d562c5e07f370456b1a8f33d"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.64"
+version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e53963b583d18a5aa3aaae4b4c1cb535218246131ba22a71f05b518098571df"
+checksum = "89ed2fb8c84bfad20ea66b26a3743f3e7ba8735a69fe7d95118c33ec8fc1244d"
dependencies = [
"bumpalo",
"lazy_static",
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.64"
+version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fcfd5ef6eec85623b4c6e844293d4516470d8f19cd72d0d12246017eb9060b8"
+checksum = "eb071268b031a64d92fc6cf691715ca5a40950694d8f683c5bb43db7c730929e"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.64"
+version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9adff9ee0e94b926ca81b57f57f86d5545cdcb1d259e21ec9bdd95b901754c75"
+checksum = "cf592c807080719d1ff2f245a687cbadb3ed28b2077ed7084b47aba8b691f2c6"
dependencies = [
"proc-macro2",
"quote",
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.64"
+version = "0.2.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f7b90ea6c632dd06fd765d44542e234d5e63d9bb917ecd64d79778a13bd79ae"
+checksum = "72b6c0220ded549d63860c78c38f3bcc558d1ca3f4efa74942c536ddbbb55e87"
[[package]]
name = "web-sys"
-version = "0.3.41"
+version = "0.3.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "863539788676619aac1a23e2df3655e96b32b0e05eb72ca34ba045ad573c625d"
+checksum = "8be2398f326b7ba09815d0b403095f34dd708579220d099caae89be0b32137b2"
dependencies = [
"js-sys",
"wasm-bindgen",
diesel = "1.4.4"
diesel_migrations = "1.4.0"
dotenv = "0.15.0"
-activitystreams = "0.6.2"
-activitystreams-new = { git = "https://git.asonix.dog/asonix/activitystreams-sketch" }
-activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext" }
+activitystreams-new = { git = "https://git.asonix.dog/asonix/activitystreams-sketch", branch = "main" }
+activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext", branch = "main" }
bcrypt = "0.8.0"
chrono = { version = "0.4.7", features = ["serde"] }
serde_json = { version = "1.0.52", features = ["preserve_order"]}
strum_macros = "0.18.0"
log = "0.4.0"
sha2 = "0.9"
-bcrypt = "0.8.0"
\ No newline at end of file
+bcrypt = "0.8.0"
+url = { version = "2.1.1", features = ["serde"] }
\ No newline at end of file
use super::{post::Post, *};
use crate::schema::{comment, comment_like, comment_saved};
+use url::{ParseError, Url};
// WITH RECURSIVE MyTree AS (
// SELECT * FROM comment WHERE parent_id IS NULL
pub local: bool,
}
+impl CommentForm {
+ pub fn get_ap_id(&self) -> Result<Url, ParseError> {
+ Url::parse(&self.ap_id)
+ }
+}
+
impl Crud<CommentForm> for Comment {
fn read(conn: &PgConnection, comment_id: i32) -> Result<Self, Error> {
use crate::schema::comment::dsl::*;
};
use diesel::{dsl::*, result::Error, *};
use serde::{Deserialize, Serialize};
+use url::{ParseError, Url};
#[derive(Queryable, Identifiable, PartialEq, Debug, Serialize, Deserialize)]
#[table_name = "post"]
pub local: bool,
}
+impl PostForm {
+ pub fn get_ap_id(&self) -> Result<Url, ParseError> {
+ Url::parse(&self.ap_id)
+ }
+}
+
impl Post {
pub fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> {
use crate::schema::post::dsl::*;
request::retry_custom,
DbPool, LemmyError,
};
-use activitystreams::{context, object::properties::ObjectProperties, public, Activity, Base};
+use activitystreams_new::base::AnyBase;
use actix_web::client::Client;
use lemmy_db::{community::Community, user::User_};
use log::debug;
-use serde::Serialize;
-use std::fmt::Debug;
use url::Url;
-pub fn populate_object_props(
- 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>(
+pub async fn send_activity_to_community(
creator: &User_,
community: &Community,
to: Vec<String>,
- activity: A,
+ activity: AnyBase,
client: &Client,
pool: &DbPool,
-) -> Result<(), LemmyError>
-where
- A: Activity + Base + Serialize + Debug + Clone + Send + 'static,
-{
+) -> Result<(), LemmyError> {
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
}
/// 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,
- activity: &A,
+ activity: &AnyBase,
actor: &dyn ActorType,
to: Vec<String>,
-) -> Result<(), LemmyError>
-where
- A: Serialize,
-{
+) -> Result<(), LemmyError> {
let activity = serde_json::to_string(&activity)?;
debug!("Sending activitypub activity {} to {:?}", activity, to);
link::Mention,
object::{kind::NoteType, Note, Tombstone},
prelude::*,
- primitives::XsdAnyUri,
public,
};
use actix_web::{body::Body, client::Client, web::Path, HttpResponse};
use log::debug;
use serde::Deserialize;
use serde_json::Error;
-use std::str::FromStr;
+use url::Url;
#[derive(Deserialize)]
pub struct CommentQuery {
comment
// Not needed when the Post is embedded in a collection (like for community outbox)
.set_context(context())
- .set_id(self.ap_id.parse::<XsdAnyUri>()?)
- .set_published(convert_datetime(self.published).into())
+ .set_id(Url::parse(&self.ap_id)?)
+ .set_published(convert_datetime(self.published))
.set_to(community.actor_id)
.set_many_in_reply_tos(in_reply_to_vec)
.set_content(self.content.to_owned())
.set_attributed_to(creator.actor_id);
if let Some(u) = self.updated {
- comment.set_updated(convert_datetime(u).into());
+ comment.set_updated(convert_datetime(u));
}
Ok(comment)
self.deleted,
&self.ap_id,
self.updated,
- NoteType.to_string(),
+ NoteType::Note.to_string(),
)
}
}
note: &Note,
client: &Client,
pool: &DbPool,
+ actor_id: &Url,
) -> Result<CommentForm, LemmyError> {
let creator_actor_id = ¬e
.attributed_to()
let creator = get_or_fetch_and_upsert_remote_user(creator_actor_id, client, pool).await?;
let mut in_reply_tos = note
- .in_reply_to
+ .in_reply_to()
.as_ref()
.unwrap()
.as_many()
.unwrap()
.iter()
.map(|i| i.as_xsd_any_uri().unwrap());
- let post_ap_id = in_reply_tos.next().unwrap().to_string();
+ let post_ap_id = in_reply_tos.next().unwrap();
// This post, or the parent comment might not yet exist on this server yet, fetch them.
let post = get_or_fetch_and_insert_remote_post(&post_ap_id, client, pool).await?;
// For deeply nested comments, FromApub automatically gets called recursively
let parent_id: Option<i32> = match in_reply_tos.next() {
Some(parent_comment_uri) => {
- let parent_comment_ap_id = &parent_comment_uri.to_string();
+ let parent_comment_ap_id = &parent_comment_uri;
let parent_comment =
get_or_fetch_and_insert_remote_comment(&parent_comment_ap_id, client, pool).await?;
.to_string(),
removed: None,
read: None,
- published: note
- .published()
- .map(|u| u.as_ref().to_owned().naive_local()),
- updated: note.updated().map(|u| u.as_ref().to_owned().naive_local()),
+ published: note.published().map(|u| u.to_owned().naive_local()),
+ updated: note.updated().map(|u| u.to_owned().naive_local()),
deleted: None,
- ap_id: note.id().unwrap().to_string(),
+ ap_id: note.id(actor_id.domain().unwrap())?.unwrap().to_string(),
local: false,
})
}
let mut create = Create::new(creator.actor_id.to_owned(), note.into_any_base()?);
create
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(maa.addressed_ccs.to_owned())
// Set the mention 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(())
}
let mut update = Update::new(creator.actor_id.to_owned(), note.into_any_base()?);
update
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(maa.addressed_ccs.to_owned())
// Set the mention 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(())
}
let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
delete
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
&creator,
&community,
vec![community.get_shared_inbox_url()],
- delete,
+ delete.into_any_base()?,
client,
pool,
)
let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
delete
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
undo
.set_context(context())
- .set_id(XsdAnyUri::from_str(&undo_id)?)
+ .set_id(Url::parse(&undo_id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
&creator,
&community,
vec![community.get_shared_inbox_url()],
- undo,
+ undo.into_any_base()?,
client,
pool,
)
let mut remove = Remove::new(mod_.actor_id.to_owned(), note.into_any_base()?);
remove
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
&mod_,
&community,
vec![community.get_shared_inbox_url()],
- remove,
+ remove.into_any_base()?,
client,
pool,
)
let mut remove = Remove::new(mod_.actor_id.to_owned(), note.into_any_base()?);
remove
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
undo
.set_context(context())
- .set_id(XsdAnyUri::from_str(&undo_id)?)
+ .set_id(Url::parse(&undo_id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
&mod_,
&community,
vec![community.get_shared_inbox_url()],
- undo,
+ undo.into_any_base()?,
client,
pool,
)
let mut like = Like::new(creator.actor_id.to_owned(), note.into_any_base()?);
like
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
&creator,
&community,
vec![community.get_shared_inbox_url()],
- like,
+ like.into_any_base()?,
client,
pool,
)
let mut dislike = Dislike::new(creator.actor_id.to_owned(), note.into_any_base()?);
dislike
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
&creator,
&community,
vec![community.get_shared_inbox_url()],
- dislike,
+ dislike.into_any_base()?,
client,
pool,
)
let mut like = Like::new(creator.actor_id.to_owned(), note.into_any_base()?);
like
.set_context(context())
- .set_id(XsdAnyUri::from_str(&id)?)
+ .set_id(Url::parse(&id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
let mut undo = Undo::new(creator.actor_id.to_owned(), like.into_any_base()?);
undo
.set_context(context())
- .set_id(XsdAnyUri::from_str(&undo_id)?)
+ .set_id(Url::parse(&undo_id)?)
.set_to(public())
.set_many_ccs(vec![community.get_followers_url()]);
&creator,
&community,
vec![community.get_shared_inbox_url()],
- undo,
+ undo.into_any_base()?,
client,
pool,
)
use crate::{
apub::{
- activities::{populate_object_props, send_activity},
- create_apub_response, create_apub_tombstone_response, create_tombstone,
- extensions::group_extensions::GroupExtension,
- fetcher::get_or_fetch_and_upsert_remote_user,
- get_shared_inbox, insert_activity, ActorType, FromApub, GroupExt, ToApub,
+ activities::send_activity, create_apub_response, create_apub_tombstone_response,
+ create_tombstone, extensions::group_extensions::GroupExtension,
+ fetcher::get_or_fetch_and_upsert_remote_user, get_shared_inbox, insert_activity, ActorType,
+ FromApub, GroupExt, ToApub,
},
blocking,
routes::DbPoolParam,
DbPool, LemmyError,
};
-use activitystreams::{
- activity::{Accept, Announce, Delete, Remove, Undo},
- Activity, Base, BaseBox,
-};
use activitystreams_ext::Ext2;
use activitystreams_new::{
- activity::Follow,
+ activity::{Accept, Announce, Delete, Follow, Remove, Undo},
actor::{kind::GroupType, ApActor, Endpoints, Group},
- base::BaseExt,
+ base::{AnyBase, BaseExt},
collection::UnorderedCollection,
context,
object::Tombstone,
prelude::*,
- primitives::{XsdAnyUri, XsdDateTime},
+ public,
};
use actix_web::{body::Body, client::Client, web, HttpResponse};
use itertools::Itertools;
user::User_,
};
use lemmy_utils::convert_datetime;
-use serde::{Deserialize, Serialize};
-use std::{fmt::Debug, str::FromStr};
+use serde::Deserialize;
+use url::Url;
#[derive(Deserialize)]
pub struct CommunityQuery {
let mut group = Group::new();
group
.set_context(context())
- .set_id(XsdAnyUri::from_str(&self.actor_id)?)
+ .set_id(Url::parse(&self.actor_id)?)
.set_name(self.name.to_owned())
- .set_published(XsdDateTime::from(convert_datetime(self.published)))
+ .set_published(convert_datetime(self.published))
.set_many_attributed_tos(moderators);
if let Some(u) = self.updated.to_owned() {
- group.set_updated(XsdDateTime::from(convert_datetime(u)));
+ group.set_updated(convert_datetime(u));
}
if let Some(d) = self.description.to_owned() {
// TODO: this should be html, also add source field with raw markdown
self.deleted,
&self.actor_id,
self.updated,
- GroupType.to_string(),
+ GroupType::Group.to_string(),
)
}
}
#[async_trait::async_trait(?Send)]
impl ActorType for Community {
- fn actor_id(&self) -> String {
+ fn actor_id_str(&self) -> String {
self.actor_id.to_owned()
}
/// As a local community, accept the follow request from a remote user.
async fn send_accept_follow(
&self,
- follow: &Follow,
+ follow: Follow,
client: &Client,
pool: &DbPool,
) -> 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 mut accept = Accept::new();
- 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 mut accept = Accept::new(self.actor_id.to_owned(), follow.into_any_base()?);
let to = format!("{}/inbox", actor_uri);
+ accept
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(to.clone());
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(())
}
let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4());
- let mut delete = Delete::default();
- populate_object_props(
- &mut delete.object_props,
- vec![self.get_followers_url()],
- &id,
- )?;
-
+ let mut delete = Delete::new(creator.actor_id.to_owned(), group.into_any_base()?);
delete
- .delete_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(group)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![self.get_followers_url()]);
insert_activity(self.creator_id, delete.clone(), true, pool).await?;
// Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor.
// 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(())
}
let id = format!("{}/delete/{}", self.actor_id, uuid::Uuid::new_v4());
- let mut delete = Delete::default();
- populate_object_props(
- &mut delete.object_props,
- vec![self.get_followers_url()],
- &id,
- )?;
-
+ let mut delete = Delete::new(creator.actor_id.to_owned(), group.into_any_base()?);
delete
- .delete_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(group)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![self.get_followers_url()]);
// TODO
// Undo that fake activity
let undo_id = format!("{}/undo/delete/{}", self.actor_id, uuid::Uuid::new_v4());
- let mut undo = Undo::default();
-
- populate_object_props(
- &mut undo.object_props,
- vec![self.get_followers_url()],
- &undo_id,
- )?;
-
+ let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
undo
- .undo_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(delete)?;
+ .set_context(context())
+ .set_id(Url::parse(&undo_id)?)
+ .set_to(public())
+ .set_many_ccs(vec![self.get_followers_url()]);
insert_activity(self.creator_id, undo.clone(), true, pool).await?;
// Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor.
// 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(())
}
let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4());
- let mut remove = Remove::default();
- populate_object_props(
- &mut remove.object_props,
- vec![self.get_followers_url()],
- &id,
- )?;
-
+ let mut remove = Remove::new(mod_.actor_id.to_owned(), group.into_any_base()?);
remove
- .remove_props
- .set_actor_xsd_any_uri(mod_.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(group)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![self.get_followers_url()]);
insert_activity(mod_.id, remove.clone(), true, pool).await?;
// Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor.
// 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(())
}
let id = format!("{}/remove/{}", self.actor_id, uuid::Uuid::new_v4());
- let mut remove = Remove::default();
- populate_object_props(
- &mut remove.object_props,
- vec![self.get_followers_url()],
- &id,
- )?;
-
+ let mut remove = Remove::new(mod_.actor_id.to_owned(), group.into_any_base()?);
remove
- .remove_props
- .set_actor_xsd_any_uri(mod_.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(group)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![self.get_followers_url()]);
// Undo that fake activity
let undo_id = format!("{}/undo/remove/{}", self.actor_id, uuid::Uuid::new_v4());
- let mut undo = Undo::default();
-
- populate_object_props(
- &mut undo.object_props,
- vec![self.get_followers_url()],
- &undo_id,
- )?;
-
+ let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
undo
- .undo_props
- .set_actor_xsd_any_uri(mod_.actor_id.to_owned())?
- .set_object_base_box(remove)?;
+ .set_context(context())
+ .set_id(Url::parse(&undo_id)?)
+ .set_to(public())
+ .set_many_ccs(vec![self.get_followers_url()]);
insert_activity(mod_.id, undo.clone(), true, pool).await?;
// Note: For an accept, since it was automatic, no one pushed a button,
// the community was the actor.
// 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(())
}
.await??;
let inboxes = inboxes
.into_iter()
- .map(|c| get_shared_inbox(&c.user_actor_id))
+ .map(|c| get_shared_inbox(&Url::parse(&c.user_actor_id).unwrap()))
.filter(|s| !s.is_empty())
.unique()
.collect();
type ApubType = GroupExt;
/// 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> {
- let creator_and_moderator_uris = group.attributed_to().unwrap();
+ async fn from_apub(
+ group: &GroupExt,
+ client: &Client,
+ pool: &DbPool,
+ actor_id: &Url,
+ ) -> Result<Self, LemmyError> {
+ let creator_and_moderator_uris = group.inner.attributed_to().unwrap();
let creator_uri = creator_and_moderator_uris
.as_many()
.unwrap()
let creator = get_or_fetch_and_upsert_remote_user(creator_uri, client, pool).await?;
Ok(CommunityForm {
- name: group.name().unwrap().as_single_xsd_string().unwrap().into(),
+ name: group
+ .inner
+ .name()
+ .unwrap()
+ .as_one()
+ .unwrap()
+ .as_xsd_string()
+ .unwrap()
+ .into(),
title: group.inner.preferred_username().unwrap().to_string(),
// TODO: should be parsed as html and tags like <script> removed (or use markdown source)
// -> same for post.content etc
description: group
+ .inner
.content()
.map(|s| s.as_single_xsd_string().unwrap().into()),
category_id: group.ext_one.category.identifier.parse::<i32>()?,
creator_id: creator.id,
removed: None,
- published: group
- .published()
- .map(|u| u.as_ref().to_owned().naive_local()),
- updated: group.updated().map(|u| u.as_ref().to_owned().naive_local()),
+ published: group.inner.published().map(|u| u.to_owned().naive_local()),
+ updated: group.inner.updated().map(|u| u.to_owned().naive_local()),
deleted: None,
nsfw: group.ext_one.sensitive,
- actor_id: group.id().unwrap().to_string(),
+ actor_id: group
+ .inner
+ .id(actor_id.domain().unwrap())?
+ .unwrap()
+ .to_string(),
local: false,
private_key: None,
public_key: Some(group.ext_two.to_owned().public_key.public_key_pem),
Ok(create_apub_response(&collection))
}
-pub async fn do_announce<A>(
- activity: A,
+pub async fn do_announce(
+ activity: AnyBase,
community: &Community,
sender: &dyn ActorType,
client: &Client,
pool: &DbPool,
-) -> Result<HttpResponse, LemmyError>
-where
- A: Activity + Base + Serialize + Debug,
-{
- 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()),
- )?;
+) -> Result<HttpResponse, LemmyError> {
+ let id = format!("{}/announce/{}", community.actor_id, uuid::Uuid::new_v4());
+ let mut announce = Announce::new(community.actor_id.to_owned(), activity);
announce
- .announce_props
- .set_actor_xsd_any_uri(community.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(activity)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
insert_activity(community.creator_id, announce.clone(), true, pool).await?;
// this seems to be the "easiest" stable alternative for remove_item()
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())
}
routes::{ChatServerParam, DbPoolParam},
LemmyError,
};
-use activitystreams::activity::Undo;
-use activitystreams_new::activity::Follow;
+use activitystreams_new::{
+ activity::{Follow, Undo},
+ prelude::*,
+};
use actix_web::{client::Client, web, HttpRequest, HttpResponse};
use lemmy_db::{
community::{Community, CommunityFollower, CommunityFollowerForm},
fn follow(&self) -> Result<Follow, LemmyError> {
match self {
CommunityAcceptedObjects::Follow(f) => Ok(f.to_owned()),
- CommunityAcceptedObjects::Undo(u) => Ok(
- u.undo_props
- .get_object_base_box()
- .to_owned()
- .unwrap()
- .to_owned()
- .into_concrete::<Follow>()?,
- ),
+ CommunityAcceptedObjects::Undo(u) => {
+ Ok(Follow::from_any_base(u.object().as_one().unwrap().to_owned())?.unwrap())
+ }
}
}
}
&community.name, &input
);
let follow = input.follow()?;
- let user_uri = follow.actor.as_single_xsd_any_uri().unwrap();
- let community_uri = follow.object.as_single_xsd_any_uri().unwrap().to_string();
+ let user_uri = follow.actor()?.as_single_xsd_any_uri().unwrap();
+ let community_uri = follow.object().as_single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, &client, &db).await?;
- let community = get_or_fetch_and_upsert_remote_community(&community_uri, &client, &db).await?;
+ let community = get_or_fetch_and_upsert_remote_community(community_uri, &client, &db).await?;
verify(&request, &user)?;
})
.await?;
- community.send_accept_follow(&follow, &client, &db).await?;
+ community.send_accept_follow(follow, &client, &db).await?;
Ok(HttpResponse::Ok().finish())
}
use crate::LemmyError;
-use activitystreams::{ext::Extension, Actor};
+use activitystreams_ext::UnparsedExtension;
+use activitystreams_new::unparsed::UnparsedMutExt;
use diesel::PgConnection;
use lemmy_db::{category::Category, Crud};
use serde::{Deserialize, Serialize};
}
}
-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(())
+ }
+}
-use activitystreams::{ext::Extension, Base};
+use activitystreams_ext::UnparsedExtension;
+use activitystreams_new::unparsed::UnparsedMutExt;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
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)?;
+ Ok(())
+ }
+}
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 http_signature_normalization_actix::{
digest::{DigestClient, SignExt},
actor: &dyn ActorType,
activity: String,
) -> Result<DigestClient<String>, LemmyError> {
- let signing_key_id = format!("{}#main-key", actor.actor_id());
+ let signing_key_id = format!("{}#main-key", actor.actor_id()?);
let private_key = actor.private_key();
let digest_client = request
}
}
-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(())
+ }
+}
routes::nodeinfo::{NodeInfo, NodeInfoWellKnown},
DbPool, LemmyError,
};
-use activitystreams_new::{base::BaseExt, object::Note, prelude::*, primitives::XsdAnyUri};
+use activitystreams_new::{base::BaseExt, object::Note, prelude::*};
use actix_web::client::Client;
use chrono::NaiveDateTime;
use diesel::{result::Error::NotFound, PgConnection};
users: vec![],
};
+ let domain = query_url.domain().unwrap();
let response = match fetch_remote_object::<SearchAcceptedObjects>(client, &query_url).await? {
SearchAcceptedObjects::Person(p) => {
- let user_uri = p.inner.id().unwrap();
+ let user_uri = p.inner.id(domain)?.unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
response
}
SearchAcceptedObjects::Group(g) => {
- let community_uri = g.inner.id().unwrap().to_string();
+ let community_uri = g.inner.id(domain)?.unwrap();
- let community =
- get_or_fetch_and_upsert_remote_community(&community_uri, client, pool).await?;
+ let community = get_or_fetch_and_upsert_remote_community(community_uri, client, pool).await?;
// TODO Maybe at some point in the future, fetch all the history of a community
// fetch_community_outbox(&c, conn)?;
response
}
SearchAcceptedObjects::Page(p) => {
- let post_form = PostForm::from_apub(&p, client, pool).await?;
+ let post_form = PostForm::from_apub(&p, client, pool, &query_url).await?;
let p = blocking(pool, move |conn| upsert_post(&post_form, conn)).await??;
response.posts = vec![blocking(pool, move |conn| PostView::read(conn, p.id, None)).await??];
response
}
SearchAcceptedObjects::Comment(c) => {
- let post_url = c.in_reply_to.as_ref().unwrap().as_many().unwrap();
+ let post_url = c.in_reply_to().as_ref().unwrap().as_many().unwrap();
// TODO: also fetch parent comments if any
let x = post_url.first().unwrap().as_xsd_any_uri().unwrap();
- let post = fetch_remote_object(client, x.as_url()).await?;
- let post_form = PostForm::from_apub(&post, client, pool).await?;
- let comment_form = CommentForm::from_apub(&c, client, pool).await?;
+ let post = fetch_remote_object(client, x).await?;
+ let post_form = PostForm::from_apub(&post, client, pool, &query_url).await?;
+ let comment_form = CommentForm::from_apub(&c, client, pool, &query_url).await?;
blocking(pool, move |conn| upsert_post(&post_form, conn)).await??;
let c = blocking(pool, move |conn| upsert_comment(&comment_form, conn)).await??;
/// Check if a remote user exists, create if not found, if its too old update it.Fetch a user, insert/update it in the database and return the user.
pub async fn get_or_fetch_and_upsert_remote_user(
- apub_id: &XsdAnyUri,
+ apub_id: &Url,
client: &Client,
pool: &DbPool,
) -> Result<User_, LemmyError> {
// If its older than a day, re-fetch it
Ok(u) if !u.local && should_refetch_actor(u.last_refreshed_at) => {
debug!("Fetching and updating from remote user: {}", apub_id);
- let person = fetch_remote_object::<PersonExt>(client, apub_id.as_url()).await?;
+ let person = fetch_remote_object::<PersonExt>(client, apub_id).await?;
- let mut uf = UserForm::from_apub(&person, client, pool).await?;
+ let mut uf = UserForm::from_apub(&person, client, pool, apub_id).await?;
uf.last_refreshed_at = Some(naive_now());
let user = blocking(pool, move |conn| User_::update(conn, u.id, &uf)).await??;
Ok(u) => Ok(u),
Err(NotFound {}) => {
debug!("Fetching and creating remote user: {}", apub_id);
- let person = fetch_remote_object::<PersonExt>(client, apub_id.as_url()).await?;
+ let person = fetch_remote_object::<PersonExt>(client, apub_id).await?;
- let uf = UserForm::from_apub(&person, client, pool).await?;
+ let uf = UserForm::from_apub(&person, client, pool, apub_id).await?;
let user = blocking(pool, move |conn| User_::create(conn, &uf)).await??;
Ok(user)
/// Check if a remote community exists, create if not found, if its too old update it.Fetch a community, insert/update it in the database and return the community.
pub async fn get_or_fetch_and_upsert_remote_community(
- apub_id: &str,
+ apub_id: &Url,
client: &Client,
pool: &DbPool,
) -> Result<Community, LemmyError> {
let apub_id_owned = apub_id.to_owned();
let community = blocking(pool, move |conn| {
- Community::read_from_actor_id(conn, &apub_id_owned)
+ Community::read_from_actor_id(conn, apub_id_owned.as_str())
})
.await?;
match community {
Ok(c) if !c.local && should_refetch_actor(c.last_refreshed_at) => {
debug!("Fetching and updating from remote community: {}", apub_id);
- let group = fetch_remote_object::<GroupExt>(client, &Url::parse(apub_id)?).await?;
+ let group = fetch_remote_object::<GroupExt>(client, apub_id).await?;
- let mut cf = CommunityForm::from_apub(&group, client, pool).await?;
+ let mut cf = CommunityForm::from_apub(&group, client, pool, apub_id).await?;
cf.last_refreshed_at = Some(naive_now());
let community = blocking(pool, move |conn| Community::update(conn, c.id, &cf)).await??;
Ok(c) => Ok(c),
Err(NotFound {}) => {
debug!("Fetching and creating remote community: {}", apub_id);
- let group = fetch_remote_object::<GroupExt>(client, &Url::parse(apub_id)?).await?;
+ let group = fetch_remote_object::<GroupExt>(client, apub_id).await?;
- let cf = CommunityForm::from_apub(&group, client, pool).await?;
+ let cf = CommunityForm::from_apub(&group, client, pool, apub_id).await?;
let community = blocking(pool, move |conn| Community::create(conn, &cf)).await??;
// Also add the community moderators too
let attributed_to = group.inner.attributed_to().unwrap();
- let creator_and_moderator_uris: Vec<&XsdAnyUri> = attributed_to
+ let creator_and_moderator_uris: Vec<&Url> = attributed_to
.as_many()
.unwrap()
.iter()
}
pub async fn get_or_fetch_and_insert_remote_post(
- post_ap_id: &str,
+ post_ap_id: &Url,
client: &Client,
pool: &DbPool,
) -> Result<Post, LemmyError> {
let post_ap_id_owned = post_ap_id.to_owned();
let post = blocking(pool, move |conn| {
- Post::read_from_apub_id(conn, &post_ap_id_owned)
+ Post::read_from_apub_id(conn, post_ap_id_owned.as_str())
})
.await?;
Ok(p) => Ok(p),
Err(NotFound {}) => {
debug!("Fetching and creating remote post: {}", post_ap_id);
- let post = fetch_remote_object::<PageExt>(client, &Url::parse(post_ap_id)?).await?;
- let post_form = PostForm::from_apub(&post, client, pool).await?;
+ let post = fetch_remote_object::<PageExt>(client, post_ap_id).await?;
+ let post_form = PostForm::from_apub(&post, client, pool, post_ap_id).await?;
let post = blocking(pool, move |conn| Post::create(conn, &post_form)).await??;
}
pub async fn get_or_fetch_and_insert_remote_comment(
- comment_ap_id: &str,
+ comment_ap_id: &Url,
client: &Client,
pool: &DbPool,
) -> Result<Comment, LemmyError> {
let comment_ap_id_owned = comment_ap_id.to_owned();
let comment = blocking(pool, move |conn| {
- Comment::read_from_apub_id(conn, &comment_ap_id_owned)
+ Comment::read_from_apub_id(conn, comment_ap_id_owned.as_str())
})
.await?;
"Fetching and creating remote comment and its parents: {}",
comment_ap_id
);
- let comment = fetch_remote_object::<Note>(client, &Url::parse(comment_ap_id)?).await?;
- let comment_form = CommentForm::from_apub(&comment, client, pool).await?;
+ let comment = fetch_remote_object::<Note>(client, comment_ap_id).await?;
+ let comment_form = CommentForm::from_apub(&comment, client, pool, comment_ap_id).await?;
let comment = blocking(pool, move |conn| Comment::create(conn, &comment_form)).await??;
actor::{ApActor, Group, Person},
object::{Page, Tombstone},
prelude::*,
- primitives::XsdAnyUri,
};
use actix_web::{body::Body, client::Client, HttpResponse};
use chrono::NaiveDateTime;
use lemmy_utils::{convert_datetime, get_apub_protocol_string, settings::Settings, MentionData};
use log::debug;
use serde::Serialize;
-use std::str::FromStr;
-use url::Url;
+use url::{ParseError, Url};
type GroupExt = Ext2<ApActor<Group>, GroupExtension, PublicKeyExtension>;
type PersonExt = Ext1<ApActor<Person>, PublicKeyExtension>;
let mut tombstone = Tombstone::new();
tombstone.set_id(object_id.parse()?);
tombstone.set_former_type(former_type);
- tombstone.set_deleted(convert_datetime(updated).into());
+ tombstone.set_deleted(convert_datetime(updated));
Ok(tombstone)
} else {
Err(format_err!("Cant convert to tombstone because updated time was None.").into())
apub: &Self::ApubType,
client: &Client,
pool: &DbPool,
+ actor_id: &Url,
) -> Result<Self, LemmyError>
where
Self: Sized;
) -> Result<(), LemmyError>;
}
-pub fn get_shared_inbox(actor_id: &str) -> String {
- let url = Url::parse(actor_id).unwrap();
+pub fn get_shared_inbox(actor_id: &Url) -> String {
format!(
"{}://{}{}/inbox",
- &url.scheme(),
- &url.host_str().unwrap(),
- if let Some(port) = url.port() {
+ &actor_id.scheme(),
+ &actor_id.host_str().unwrap(),
+ if let Some(port) = actor_id.port() {
format!(":{}", port)
} else {
"".to_string()
#[async_trait::async_trait(?Send)]
pub trait ActorType {
- fn actor_id(&self) -> String;
+ fn actor_id_str(&self) -> String;
fn public_key(&self) -> String;
fn private_key(&self) -> String;
#[allow(unused_variables)]
async fn send_accept_follow(
&self,
- follow: &Follow,
+ follow: Follow,
client: &Client,
pool: &DbPool,
) -> Result<(), LemmyError>;
/// For a given community, returns the inboxes of all followers.
async fn get_follower_inboxes(&self, pool: &DbPool) -> Result<Vec<String>, LemmyError>;
+ fn actor_id(&self) -> Result<Url, ParseError> {
+ Url::parse(&self.actor_id_str())
+ }
+
// TODO move these to the db rows
fn get_inbox_url(&self) -> String {
- format!("{}/inbox", &self.actor_id())
+ format!("{}/inbox", &self.actor_id_str())
}
+ // TODO: make this return `Result<Url, ParseError>
fn get_shared_inbox_url(&self) -> String {
- get_shared_inbox(&self.actor_id())
+ get_shared_inbox(&self.actor_id().unwrap())
}
fn get_outbox_url(&self) -> String {
- format!("{}/outbox", &self.actor_id())
+ format!("{}/outbox", &self.actor_id_str())
}
fn get_followers_url(&self) -> String {
- format!("{}/followers", &self.actor_id())
+ format!("{}/followers", &self.actor_id_str())
}
fn get_following_url(&self) -> String {
- format!("{}/following", &self.actor_id())
+ format!("{}/following", &self.actor_id_str())
}
fn get_liked_url(&self) -> String {
- format!("{}/liked", &self.actor_id())
+ format!("{}/liked", &self.actor_id_str())
}
fn get_public_key_ext(&self) -> PublicKeyExtension {
PublicKey {
- id: format!("{}#main-key", self.actor_id()),
- owner: self.actor_id(),
+ id: format!("{}#main-key", self.actor_id_str()),
+ owner: self.actor_id_str(),
public_key_pem: self.public_key(),
}
.to_ext()
pub async fn fetch_webfinger_url(
mention: &MentionData,
client: &Client,
-) -> Result<XsdAnyUri, LemmyError> {
+) -> Result<Url, LemmyError> {
let fetch_url = format!(
"{}://{}/.well-known/webfinger?resource=acct:{}@{}",
get_apub_protocol_string(),
link
.href
.to_owned()
- .map(|u| XsdAnyUri::from_str(&u))
+ .map(|u| Url::parse(&u))
.transpose()?
.ok_or_else(|| format_err!("No href found.").into())
}
use crate::{
apub::{
- activities::{populate_object_props, send_activity_to_community},
+ activities::send_activity_to_community,
create_apub_response, create_apub_tombstone_response, create_tombstone,
extensions::page_extension::PageExtension,
fetcher::{get_or_fetch_and_upsert_remote_community, get_or_fetch_and_upsert_remote_user},
routes::DbPoolParam,
DbPool, LemmyError,
};
-use activitystreams::{
- activity::{Create, Delete, Dislike, Like, Remove, Undo, Update},
- BaseBox,
-};
use activitystreams_ext::Ext1;
use activitystreams_new::{
+ activity::{Create, Delete, Dislike, Like, Remove, Undo, Update},
context,
object::{kind::PageType, Image, Page, Tombstone},
prelude::*,
- primitives::{XsdAnyUri, XsdDateTime},
+ public,
};
use actix_web::{body::Body, client::Client, web, HttpResponse};
use lemmy_db::{
};
use lemmy_utils::{convert_datetime, get_apub_protocol_string, settings::Settings};
use serde::Deserialize;
+use url::Url;
#[derive(Deserialize)]
pub struct PostQuery {
// TODO: need to set proper context defining sensitive/commentsEnabled fields
// https://git.asonix.dog/Aardwolf/activitystreams/issues/5
.set_context(context())
- .set_id(self.ap_id.parse::<XsdAnyUri>()?)
+ .set_id(self.ap_id.parse::<Url>()?)
// Use summary field to be consistent with mastodon content warning.
// https://mastodon.xyz/@Louisa/103987265222901387.json
.set_summary(self.name.to_owned())
- .set_published(convert_datetime(self.published).into())
+ .set_published(convert_datetime(self.published))
.set_to(community.actor_id)
.set_attributed_to(creator.actor_id);
}
if let Some(u) = self.updated {
- page.set_updated(XsdDateTime::from(convert_datetime(u)));
+ page.set_updated(convert_datetime(u));
}
let ext = PageExtension {
self.deleted,
&self.ap_id,
self.updated,
- PageType.to_string(),
+ PageType::Page.to_string(),
)
}
}
page: &PageExt,
client: &Client,
pool: &DbPool,
+ actor_id: &Url,
) -> Result<PostForm, LemmyError> {
let ext = &page.ext_one;
let creator_actor_id = page
.inner
- .attributed_to
+ .attributed_to()
.as_ref()
.unwrap()
.as_single_xsd_any_uri()
let community_actor_id = page
.inner
- .to
+ .to()
.as_ref()
.unwrap()
.as_single_xsd_any_uri()
- .unwrap()
- .as_str();
+ .unwrap();
let community =
get_or_fetch_and_upsert_remote_community(community_actor_id, client, pool).await?;
- let thumbnail_url = match &page.inner.image {
+ let thumbnail_url = match &page.inner.image() {
Some(any_image) => Image::from_any_base(any_image.to_owned().as_one().unwrap().to_owned())?
.unwrap()
- .url
+ .url()
.unwrap()
.as_single_xsd_any_uri()
.map(|u| u.to_string()),
let (embed_title, embed_description, embed_html) = match page.inner.preview() {
Some(preview) => {
- let preview_page = Page::from_any_base(preview.as_one().unwrap().to_owned())?.unwrap();
+ let preview_page = Page::from_any_base(preview.one().unwrap().to_owned())?.unwrap();
let name = preview_page
.name()
- .map(|n| n.as_single_xsd_string().unwrap().to_string());
+ .map(|n| n.as_one().unwrap().as_xsd_string().unwrap().to_string());
let summary = preview_page
.summary()
.map(|s| s.as_single_xsd_string().unwrap().to_string());
let url = page
.inner
- .url
+ .url()
.as_ref()
.map(|u| u.as_single_xsd_string().unwrap().to_string());
let body = page
.inner
- .content
+ .content()
.as_ref()
.map(|c| c.as_single_xsd_string().unwrap().to_string());
Ok(PostForm {
name: page
.inner
- .summary
+ .summary()
.as_ref()
.unwrap()
.as_single_xsd_string()
locked: Some(!ext.comments_enabled),
published: page
.inner
- .published
+ .published()
.as_ref()
- .map(|u| u.as_ref().to_owned().naive_local()),
+ .map(|u| u.to_owned().naive_local()),
updated: page
.inner
- .updated
+ .updated()
.as_ref()
- .map(|u| u.as_ref().to_owned().naive_local()),
+ .map(|u| u.to_owned().naive_local()),
deleted: None,
nsfw: ext.sensitive,
stickied: None, // -> put it in "featured" collection of the community
embed_description,
embed_html,
thumbnail_url,
- ap_id: page.inner.id().unwrap().to_string(),
+ ap_id: page
+ .inner
+ .id(actor_id.domain().unwrap())?
+ .unwrap()
+ .to_string(),
local: false,
})
}
let id = format!("{}/create/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut create = Create::new();
- populate_object_props(
- &mut create.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
+ let mut create = Create::new(creator.actor_id.to_owned(), page.into_any_base()?);
create
- .create_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
creator,
&community,
vec![community.get_shared_inbox_url()],
- create,
+ create.into_any_base()?,
client,
pool,
)
let id = format!("{}/update/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut update = Update::new();
- populate_object_props(
- &mut update.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
+ let mut update = Update::new(creator.actor_id.to_owned(), page.into_any_base()?);
update
- .update_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
creator,
&community,
vec![community.get_shared_inbox_url()],
- update,
+ update.into_any_base()?,
client,
pool,
)
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut delete = Delete::default();
-
- populate_object_props(
- &mut delete.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
-
+ let mut delete = Delete::new(creator.actor_id.to_owned(), page.into_any_base()?);
delete
- .delete_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
creator,
&community,
vec![community.get_shared_inbox_url()],
- delete,
+ delete.into_any_base()?,
client,
pool,
)
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/delete/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut delete = Delete::default();
-
- populate_object_props(
- &mut delete.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
-
+ let mut delete = Delete::new(creator.actor_id.to_owned(), page.into_any_base()?);
delete
- .delete_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
// TODO
// Undo that fake activity
let undo_id = format!("{}/undo/delete/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut undo = Undo::default();
-
- populate_object_props(
- &mut undo.object_props,
- vec![community.get_followers_url()],
- &undo_id,
- )?;
-
+ let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
undo
- .undo_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(delete)?;
+ .set_context(context())
+ .set_id(Url::parse(&undo_id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
creator,
&community,
vec![community.get_shared_inbox_url()],
- undo,
+ undo.into_any_base()?,
client,
pool,
)
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut remove = Remove::default();
-
- populate_object_props(
- &mut remove.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
-
+ let mut remove = Remove::new(mod_.actor_id.to_owned(), page.into_any_base()?);
remove
- .remove_props
- .set_actor_xsd_any_uri(mod_.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
mod_,
&community,
vec![community.get_shared_inbox_url()],
- remove,
+ remove.into_any_base()?,
client,
pool,
)
let community = blocking(pool, move |conn| Community::read(conn, community_id)).await??;
let id = format!("{}/remove/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut remove = Remove::default();
-
- populate_object_props(
- &mut remove.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
-
+ let mut remove = Remove::new(mod_.actor_id.to_owned(), page.into_any_base()?);
remove
- .remove_props
- .set_actor_xsd_any_uri(mod_.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
// Undo that fake activity
let undo_id = format!("{}/undo/remove/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut undo = Undo::default();
-
- populate_object_props(
- &mut undo.object_props,
- vec![community.get_followers_url()],
- &undo_id,
- )?;
-
+ let mut undo = Undo::new(mod_.actor_id.to_owned(), remove.into_any_base()?);
undo
- .undo_props
- .set_actor_xsd_any_uri(mod_.actor_id.to_owned())?
- .set_object_base_box(remove)?;
+ .set_context(context())
+ .set_id(Url::parse(&undo_id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
mod_,
&community,
vec![community.get_shared_inbox_url()],
- undo,
+ undo.into_any_base()?,
client,
pool,
)
let id = format!("{}/like/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut like = Like::new();
- populate_object_props(
- &mut like.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
+ let mut like = Like::new(creator.actor_id.to_owned(), page.into_any_base()?);
like
- .like_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
&creator,
&community,
vec![community.get_shared_inbox_url()],
- like,
+ like.into_any_base()?,
client,
pool,
)
let id = format!("{}/dislike/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut dislike = Dislike::new();
- populate_object_props(
- &mut dislike.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
+ let mut dislike = Dislike::new(creator.actor_id.to_owned(), page.into_any_base()?);
dislike
- .dislike_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
&creator,
&community,
vec![community.get_shared_inbox_url()],
- dislike,
+ dislike.into_any_base()?,
client,
pool,
)
let id = format!("{}/like/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut like = Like::new();
- populate_object_props(
- &mut like.object_props,
- vec![community.get_followers_url()],
- &id,
- )?;
+ let mut like = Like::new(creator.actor_id.to_owned(), page.into_any_base()?);
like
- .like_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(BaseBox::from_concrete(page)?)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
// TODO
// Undo that fake activity
let undo_id = format!("{}/undo/like/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut undo = Undo::default();
-
- populate_object_props(
- &mut undo.object_props,
- vec![community.get_followers_url()],
- &undo_id,
- )?;
-
+ let mut undo = Undo::new(creator.actor_id.to_owned(), like.into_any_base()?);
undo
- .undo_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(like)?;
+ .set_context(context())
+ .set_id(Url::parse(&undo_id)?)
+ .set_to(public())
+ .set_many_ccs(vec![community.get_followers_url()]);
send_activity_to_community(
&creator,
&community,
vec![community.get_shared_inbox_url()],
- undo,
+ undo.into_any_base()?,
client,
pool,
)
},
blocking, DbPool, LemmyError,
};
-use activitystreams::{
+use activitystreams_new::{
activity::{Create, Delete, Undo, Update},
context,
- object::{kind::NoteType, properties::ObjectProperties, Note},
+ object::{kind::NoteType, Note, Tombstone},
+ prelude::*,
};
-use activitystreams_new::object::Tombstone;
use actix_web::client::Client;
use lemmy_db::{
private_message::{PrivateMessage, PrivateMessageForm},
Crud,
};
use lemmy_utils::convert_datetime;
+use url::Url;
#[async_trait::async_trait(?Send)]
impl ToApub for PrivateMessage {
type Response = Note;
async fn to_apub(&self, pool: &DbPool) -> Result<Note, LemmyError> {
- let mut private_message = Note::default();
- let oprops: &mut ObjectProperties = private_message.as_mut();
+ let mut private_message = Note::new();
let creator_id = self.creator_id;
let creator = blocking(pool, move |conn| User_::read(conn, creator_id)).await??;
let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
- oprops
- .set_context_xsd_any_uri(context())?
- .set_id(self.ap_id.to_owned())?
- .set_published(convert_datetime(self.published))?
- .set_content_xsd_string(self.content.to_owned())?
- .set_to_xsd_any_uri(recipient.actor_id)?
- .set_attributed_to_xsd_any_uri(creator.actor_id)?;
+ private_message
+ .set_context(context())
+ .set_id(Url::parse(&self.ap_id.to_owned())?)
+ .set_published(convert_datetime(self.published))
+ .set_content(self.content.to_owned())
+ .set_to(recipient.actor_id)
+ .set_attributed_to(creator.actor_id);
if let Some(u) = self.updated {
- oprops.set_updated(convert_datetime(u))?;
+ private_message.set_updated(convert_datetime(u));
}
Ok(private_message)
self.deleted,
&self.ap_id,
self.updated,
- NoteType.to_string(),
+ NoteType::Note.to_string(),
)
}
}
note: &Note,
client: &Client,
pool: &DbPool,
+ actor_id: &Url,
) -> Result<PrivateMessageForm, LemmyError> {
- let oprops = ¬e.object_props;
- let creator_actor_id = &oprops.get_attributed_to_xsd_any_uri().unwrap();
+ let creator_actor_id = note
+ .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 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?;
Ok(PrivateMessageForm {
creator_id: creator.id,
recipient_id: recipient.id,
- content: oprops
- .get_content_xsd_string()
- .map(|c| c.to_string())
- .unwrap(),
- published: oprops
- .get_published()
- .map(|u| u.as_ref().to_owned().naive_local()),
- updated: oprops
- .get_updated()
- .map(|u| u.as_ref().to_owned().naive_local()),
+ content: note
+ .content()
+ .unwrap()
+ .as_single_xsd_string()
+ .unwrap()
+ .to_string(),
+ published: note.published().map(|u| u.to_owned().naive_local()),
+ updated: note.updated().map(|u| u.to_owned().naive_local()),
deleted: None,
read: None,
- ap_id: oprops.get_id().unwrap().to_string(),
+ ap_id: note.id(actor_id.domain().unwrap())?.unwrap().to_string(),
local: false,
})
}
let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
- let mut create = Create::new();
- create
- .object_props
- .set_context_xsd_any_uri(context())?
- .set_id(id)?;
+ let mut create = Create::new(creator.actor_id.to_owned(), note.into_any_base()?);
let to = format!("{}/inbox", recipient.actor_id);
-
create
- .create_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(note)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(to.clone());
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(())
}
let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
- let mut update = Update::new();
- update
- .object_props
- .set_context_xsd_any_uri(context())?
- .set_id(id)?;
+ let mut update = Update::new(creator.actor_id.to_owned(), note.into_any_base()?);
let to = format!("{}/inbox", recipient.actor_id);
-
update
- .update_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(note)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(to.clone());
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(())
}
let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
- let mut delete = Delete::new();
- delete
- .object_props
- .set_context_xsd_any_uri(context())?
- .set_id(id)?;
+ let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
let to = format!("{}/inbox", recipient.actor_id);
-
delete
- .delete_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(note)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(to.clone());
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(())
}
let recipient_id = self.recipient_id;
let recipient = blocking(pool, move |conn| User_::read(conn, recipient_id)).await??;
- let mut delete = Delete::new();
- delete
- .object_props
- .set_context_xsd_any_uri(context())?
- .set_id(id)?;
+ let mut delete = Delete::new(creator.actor_id.to_owned(), note.into_any_base()?);
let to = format!("{}/inbox", recipient.actor_id);
-
delete
- .delete_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(note)?;
+ .set_context(context())
+ .set_id(Url::parse(&id)?)
+ .set_to(to.clone());
// TODO
// Undo that fake activity
let undo_id = format!("{}/undo/delete/{}", self.ap_id, uuid::Uuid::new_v4());
- let mut undo = Undo::default();
-
- undo
- .object_props
- .set_context_xsd_any_uri(context())?
- .set_id(undo_id)?;
-
+ let mut undo = Undo::new(creator.actor_id.to_owned(), delete.into_any_base()?);
undo
- .undo_props
- .set_actor_xsd_any_uri(creator.actor_id.to_owned())?
- .set_object_base_box(delete)?;
+ .set_context(context())
+ .set_id(Url::parse(&undo_id)?)
+ .set_to(to.clone());
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(())
}
get_or_fetch_and_insert_remote_comment, 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, ActorType, FromApub, GroupExt, PageExt,
},
blocking,
routes::{ChatServerParam, DbPoolParam},
},
DbPool, LemmyError,
};
-use activitystreams::{
- activity::{Announce, Create, Delete, Dislike, Like, Remove, Undo, Update},
- Activity, Base, BaseBox,
+use activitystreams_new::{
+ activity::{ActorAndObjectRef, Announce, Create, Delete, Dislike, Like, Remove, Undo, Update},
+ base::{AnyBase, AsBase},
+ error::DomainError,
+ object::Note,
+ prelude::{ExtendsExt, *},
};
-use activitystreams_new::{object::Note, primitives::XsdAnyUri};
use actix_web::{client::Client, web, HttpRequest, HttpResponse};
use lemmy_db::{
comment::{Comment, CommentForm, CommentLike, CommentLikeForm},
naive_now,
post::{Post, PostForm, PostLike, PostLikeForm},
post_view::PostView,
+ user::User_,
Crud, Likeable,
};
use lemmy_utils::scrape_text_for_mentions;
use log::debug;
use serde::{Deserialize, Serialize};
use std::fmt::Debug;
+use url::Url;
#[serde(untagged)]
-#[derive(Serialize, Deserialize, Debug)]
+#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum SharedAcceptedObjects {
Create(Box<Create>),
Update(Box<Update>),
}
impl SharedAcceptedObjects {
- fn object(&self) -> Option<&BaseBox> {
+ // TODO: these shouldnt be necessary anymore
+ // https://git.asonix.dog/asonix/ap-relay/src/branch/main/src/apub.rs
+ fn object(&self) -> Option<AnyBase> {
match self {
- SharedAcceptedObjects::Create(c) => c.create_props.get_object_base_box(),
- SharedAcceptedObjects::Update(u) => u.update_props.get_object_base_box(),
- SharedAcceptedObjects::Like(l) => l.like_props.get_object_base_box(),
- SharedAcceptedObjects::Dislike(d) => d.dislike_props.get_object_base_box(),
- SharedAcceptedObjects::Delete(d) => d.delete_props.get_object_base_box(),
- SharedAcceptedObjects::Undo(d) => d.undo_props.get_object_base_box(),
- SharedAcceptedObjects::Remove(r) => r.remove_props.get_object_base_box(),
- SharedAcceptedObjects::Announce(a) => a.announce_props.get_object_base_box(),
+ SharedAcceptedObjects::Create(c) => c.object().to_owned().one(),
+ SharedAcceptedObjects::Update(u) => u.object().to_owned().one(),
+ SharedAcceptedObjects::Like(l) => l.object().to_owned().one(),
+ SharedAcceptedObjects::Dislike(d) => d.object().to_owned().one(),
+ SharedAcceptedObjects::Delete(d) => d.object().to_owned().one(),
+ SharedAcceptedObjects::Undo(d) => d.object().to_owned().one(),
+ SharedAcceptedObjects::Remove(r) => r.object().to_owned().one(),
+ SharedAcceptedObjects::Announce(a) => a.object().to_owned().one(),
}
}
- fn sender(&self) -> XsdAnyUri {
+ fn sender(&self) -> Result<&Url, DomainError> {
let uri = match self {
- SharedAcceptedObjects::Create(c) => c.create_props.get_actor_xsd_any_uri(),
- SharedAcceptedObjects::Update(u) => u.update_props.get_actor_xsd_any_uri(),
- SharedAcceptedObjects::Like(l) => l.like_props.get_actor_xsd_any_uri(),
- SharedAcceptedObjects::Dislike(d) => d.dislike_props.get_actor_xsd_any_uri(),
- SharedAcceptedObjects::Delete(d) => d.delete_props.get_actor_xsd_any_uri(),
- SharedAcceptedObjects::Undo(d) => d.undo_props.get_actor_xsd_any_uri(),
- SharedAcceptedObjects::Remove(r) => r.remove_props.get_actor_xsd_any_uri(),
- SharedAcceptedObjects::Announce(a) => a.announce_props.get_actor_xsd_any_uri(),
+ SharedAcceptedObjects::Create(c) => c.actor()?.as_single_xsd_any_uri(),
+ SharedAcceptedObjects::Update(u) => u.actor()?.as_single_xsd_any_uri(),
+ SharedAcceptedObjects::Like(l) => l.actor()?.as_single_xsd_any_uri(),
+ SharedAcceptedObjects::Dislike(d) => d.actor()?.as_single_xsd_any_uri(),
+ SharedAcceptedObjects::Delete(d) => d.actor()?.as_single_xsd_any_uri(),
+ SharedAcceptedObjects::Undo(d) => d.actor()?.as_single_xsd_any_uri(),
+ SharedAcceptedObjects::Remove(r) => r.actor()?.as_single_xsd_any_uri(),
+ SharedAcceptedObjects::Announce(a) => a.actor()?.as_single_xsd_any_uri(),
};
- uri.unwrap().clone()
+ Ok(uri.unwrap())
}
fn cc(&self) -> String {
- // TODO: there is probably an easier way to do this
- let oprops = match self {
- SharedAcceptedObjects::Create(c) => &c.object_props,
- SharedAcceptedObjects::Update(u) => &u.object_props,
- SharedAcceptedObjects::Like(l) => &l.object_props,
- SharedAcceptedObjects::Dislike(d) => &d.object_props,
- SharedAcceptedObjects::Delete(d) => &d.object_props,
- SharedAcceptedObjects::Undo(d) => &d.object_props,
- SharedAcceptedObjects::Remove(r) => &r.object_props,
- SharedAcceptedObjects::Announce(a) => &a.object_props,
+ let cc = match self {
+ SharedAcceptedObjects::Create(c) => c.cc().to_owned(),
+ SharedAcceptedObjects::Update(u) => u.cc().to_owned(),
+ SharedAcceptedObjects::Like(l) => l.cc().to_owned(),
+ SharedAcceptedObjects::Dislike(d) => d.cc().to_owned(),
+ SharedAcceptedObjects::Delete(d) => d.cc().to_owned(),
+ SharedAcceptedObjects::Undo(d) => d.cc().to_owned(),
+ SharedAcceptedObjects::Remove(r) => r.cc().to_owned(),
+ SharedAcceptedObjects::Announce(a) => a.cc().to_owned(),
};
- oprops
- .get_many_cc_xsd_any_uris()
+ cc.unwrap()
+ .clone()
+ .many()
.unwrap()
- .next()
+ .first()
+ .unwrap()
+ .as_xsd_any_uri()
.unwrap()
.to_string()
}
let json = serde_json::to_string(&activity)?;
debug!("Shared inbox received activity: {}", json);
- let object = activity.object().cloned().unwrap();
- let sender = &activity.sender();
- let cc = &activity.cc();
+ let sender = &activity.sender()?.clone();
+ let cc = activity.to_owned().cc();
// TODO: this is hacky, we should probably send the community id directly somehow
let to = cc.replace("/followers", "");
match get_or_fetch_and_upsert_remote_user(sender, &client, pool).await {
Ok(u) => verify(&request, &u)?,
Err(_) => {
- let c = get_or_fetch_and_upsert_remote_community(&sender.to_string(), &client, pool).await?;
+ let c = get_or_fetch_and_upsert_remote_community(sender, &client, pool).await?;
verify(&request, &c)?;
}
}
- match (activity, object.kind()) {
+ let object = activity.object().unwrap();
+ match (activity, object.kind_str()) {
(SharedAcceptedObjects::Create(c), Some("Page")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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")) => {
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,
(a, _) => receive_unhandled_activity(a),
}
// TODO: should pass in sender as ActorType, but thats a bit tricky in shared_inbox()
-async fn announce_activity_if_valid<A>(
- activity: A,
+async fn announce_activity_if_valid(
+ activity: AnyBase,
community_uri: &str,
- sender: &XsdAnyUri,
+ sender: &Url,
client: &Client,
pool: &DbPool,
-) -> Result<HttpResponse, LemmyError>
-where
- A: Activity + Base + Serialize + Debug,
-{
+) -> Result<HttpResponse, LemmyError> {
let community_uri = community_uri.to_owned();
let community = blocking(pool, move |conn| {
Community::read_from_actor_id(conn, &community_uri)
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let object = announce
- .announce_props
- .get_object_base_box()
- .unwrap()
- .to_owned();
+ let object = announce.to_owned().object().clone().one().unwrap();
// TODO: too much copy paste
- match object.kind() {
+ match object.kind_str() {
Some("Create") => {
- let create = object.into_concrete::<Create>()?;
- let inner_object = create.create_props.get_object_base_box().unwrap();
- match inner_object.kind() {
+ let create = Create::from_any_base(object)?.unwrap();
+ match create.object().as_single_kind_str() {
Some("Page") => receive_create_post(create, client, pool, chat_server).await,
Some("Note") => receive_create_comment(create, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce),
}
}
Some("Update") => {
- let update = object.into_concrete::<Update>()?;
- let inner_object = update.update_props.get_object_base_box().unwrap();
- match inner_object.kind() {
+ let update = Update::from_any_base(object)?.unwrap();
+ match update.object().as_single_kind_str() {
Some("Page") => receive_update_post(update, client, pool, chat_server).await,
Some("Note") => receive_update_comment(update, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce),
}
}
Some("Like") => {
- let like = object.into_concrete::<Like>()?;
- let inner_object = like.like_props.get_object_base_box().unwrap();
- match inner_object.kind() {
+ let like = Like::from_any_base(object)?.unwrap();
+ match like.object().as_single_kind_str() {
Some("Page") => receive_like_post(like, client, pool, chat_server).await,
Some("Note") => receive_like_comment(like, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce),
}
}
Some("Dislike") => {
- let dislike = object.into_concrete::<Dislike>()?;
- let inner_object = dislike.dislike_props.get_object_base_box().unwrap();
- match inner_object.kind() {
+ let dislike = Dislike::from_any_base(object)?.unwrap();
+ match dislike.object().as_single_kind_str() {
Some("Page") => receive_dislike_post(dislike, client, pool, chat_server).await,
Some("Note") => receive_dislike_comment(dislike, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce),
}
}
Some("Delete") => {
- let delete = object.into_concrete::<Delete>()?;
- let inner_object = delete.delete_props.get_object_base_box().unwrap();
- match inner_object.kind() {
+ let delete = Delete::from_any_base(object)?.unwrap();
+ match delete.object().as_single_kind_str() {
Some("Page") => receive_delete_post(delete, client, pool, chat_server).await,
Some("Note") => receive_delete_comment(delete, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce),
}
}
Some("Remove") => {
- let remove = object.into_concrete::<Remove>()?;
- let inner_object = remove.remove_props.get_object_base_box().unwrap();
- match inner_object.kind() {
+ let remove = Remove::from_any_base(object)?.unwrap();
+ match remove.object().as_single_kind_str() {
Some("Page") => receive_remove_post(remove, client, pool, chat_server).await,
Some("Note") => receive_remove_comment(remove, client, pool, chat_server).await,
_ => receive_unhandled_activity(announce),
}
}
Some("Undo") => {
- let undo = object.into_concrete::<Undo>()?;
- let inner_object = undo.undo_props.get_object_base_box().unwrap();
- match inner_object.kind() {
+ let undo = Undo::from_any_base(object)?.unwrap();
+ match undo.object().as_single_kind_str() {
Some("Delete") => receive_undo_delete(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,
Ok(HttpResponse::NotImplemented().finish())
}
+async fn get_user_from_activity<T, A>(
+ activity: &T,
+ client: &Client,
+ pool: &DbPool,
+) -> Result<User_, LemmyError>
+where
+ T: AsBase<A> + ActorAndObjectRef,
+{
+ let actor = activity.actor()?;
+ let user_uri = actor.as_single_xsd_any_uri().unwrap();
+ get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await
+}
+
async fn receive_create_post(
create: Create,
client: &Client,
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let page = create
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let user = get_user_from_activity(&create, client, pool).await?;
+ let page = PageExt::from_any_base(create.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, create, false, pool).await?;
- let post = PostForm::from_apub(&page, client, pool).await?;
+ let post = PostForm::from_apub(&page, client, pool, &user.actor_id()?).await?;
let inserted_post = blocking(pool, move |conn| Post::create(conn, &post)).await??;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let note = create
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let user = get_user_from_activity(&create, client, pool).await?;
+ let note = Note::from_any_base(create.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, create, false, pool).await?;
- let comment = CommentForm::from_apub(¬e, client, pool).await?;
+ let comment = CommentForm::from_apub(¬e, client, pool, &user.actor_id()?).await?;
let inserted_comment = blocking(pool, move |conn| Comment::create(conn, &comment)).await??;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let page = update
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let user = get_user_from_activity(&update, client, pool).await?;
+ let page = PageExt::from_any_base(update.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, update, false, pool).await?;
- let post = PostForm::from_apub(&page, client, pool).await?;
+ let post = PostForm::from_apub(&page, client, pool, &user.actor_id()?).await?;
- let post_id = get_or_fetch_and_insert_remote_post(&post.ap_id, client, pool)
+ let post_id = get_or_fetch_and_insert_remote_post(&post.get_ap_id()?, client, pool)
.await?
.id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let page = like
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let user = get_user_from_activity(&like, client, pool).await?;
+ let page = PageExt::from_any_base(like.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, like, false, pool).await?;
- let post = PostForm::from_apub(&page, client, pool).await?;
+ let post = PostForm::from_apub(&page, client, pool, &user.actor_id()?).await?;
- let post_id = get_or_fetch_and_insert_remote_post(&post.ap_id, client, pool)
+ let post_id = get_or_fetch_and_insert_remote_post(&post.get_ap_id()?, client, pool)
.await?
.id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let page = dislike
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let user = get_user_from_activity(&dislike, client, pool).await?;
+ let page = PageExt::from_any_base(dislike.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, dislike, false, pool).await?;
- let post = PostForm::from_apub(&page, client, pool).await?;
+ let post = PostForm::from_apub(&page, client, pool, &user.actor_id()?).await?;
- let post_id = get_or_fetch_and_insert_remote_post(&post.ap_id, client, pool)
+ let post_id = get_or_fetch_and_insert_remote_post(&post.get_ap_id()?, client, pool)
.await?
.id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let note = update
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let note = Note::from_any_base(update.object().to_owned().one().unwrap())?.unwrap();
+ let user = get_user_from_activity(&update, client, pool).await?;
insert_activity(user.id, update, false, pool).await?;
- let comment = CommentForm::from_apub(¬e, client, pool).await?;
+ let comment = CommentForm::from_apub(¬e, client, pool, &user.actor_id()?).await?;
- let comment_id = get_or_fetch_and_insert_remote_comment(&comment.ap_id, client, pool)
+ let comment_id = get_or_fetch_and_insert_remote_comment(&comment.get_ap_id()?, client, pool)
.await?
.id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let note = like
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let note = Note::from_any_base(like.object().to_owned().one().unwrap())?.unwrap();
+ let user = get_user_from_activity(&like, client, pool).await?;
insert_activity(user.id, like, false, pool).await?;
- let comment = CommentForm::from_apub(¬e, client, pool).await?;
+ let comment = CommentForm::from_apub(¬e, client, pool, &user.actor_id()?).await?;
- let comment_id = get_or_fetch_and_insert_remote_comment(&comment.ap_id, client, pool)
+ let comment_id = get_or_fetch_and_insert_remote_comment(&comment.get_ap_id()?, client, pool)
.await?
.id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let note = dislike
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let note = Note::from_any_base(dislike.object().to_owned().one().unwrap())?.unwrap();
+ let user = get_user_from_activity(&dislike, client, pool).await?;
insert_activity(user.id, dislike, false, pool).await?;
- let comment = CommentForm::from_apub(¬e, client, pool).await?;
+ let comment = CommentForm::from_apub(¬e, client, pool, &user.actor_id()?).await?;
- let comment_id = get_or_fetch_and_insert_remote_comment(&comment.ap_id, client, pool)
+ let comment_id = get_or_fetch_and_insert_remote_comment(&comment.get_ap_id()?, client, pool)
.await?
.id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
-
- let group = delete
- .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 group = GroupExt::from_any_base(delete.object().to_owned().one().unwrap())?.unwrap();
+ let user = get_user_from_activity(&delete, client, pool).await?;
insert_activity(user.id, delete, false, pool).await?;
- let community_actor_id = CommunityForm::from_apub(&group, client, pool)
+ let community_actor_id = CommunityForm::from_apub(&group, client, pool, &user.actor_id()?)
.await?
.actor_id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap();
-
- let group = remove
- .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_user_from_activity(&remove, client, pool).await?;
+ let group = GroupExt::from_any_base(remove.object().to_owned().one().unwrap())?.unwrap();
insert_activity(mod_.id, remove, false, pool).await?;
- let community_actor_id = CommunityForm::from_apub(&group, client, pool)
+ let community_actor_id = CommunityForm::from_apub(&group, client, pool, &mod_.actor_id()?)
.await?
.actor_id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
-
- let page = delete
- .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_user_from_activity(&delete, client, pool).await?;
+ let page = PageExt::from_any_base(delete.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, delete, false, pool).await?;
- let post_ap_id = PostForm::from_apub(&page, client, pool).await?.ap_id;
+ let post_ap_id = PostForm::from_apub(&page, client, pool, &user.actor_id()?)
+ .await?
+ .get_ap_id()?;
let post = get_or_fetch_and_insert_remote_post(&post_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap();
-
- let page = remove
- .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_user_from_activity(&remove, client, pool).await?;
+ let page = PageExt::from_any_base(remove.object().to_owned().one().unwrap())?.unwrap();
insert_activity(mod_.id, remove, false, pool).await?;
- let post_ap_id = PostForm::from_apub(&page, client, pool).await?.ap_id;
+ let post_ap_id = PostForm::from_apub(&page, client, pool, &mod_.actor_id()?)
+ .await?
+ .get_ap_id()?;
let post = get_or_fetch_and_insert_remote_post(&post_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
-
- let note = delete
- .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_user_from_activity(&delete, client, pool).await?;
+ let note = Note::from_any_base(delete.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, delete, false, pool).await?;
- let comment_ap_id = CommentForm::from_apub(¬e, client, pool).await?.ap_id;
+ let comment_ap_id = CommentForm::from_apub(¬e, client, pool, &user.actor_id()?)
+ .await?
+ .get_ap_id()?;
let comment = get_or_fetch_and_insert_remote_comment(&comment_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap();
-
- let note = remove
- .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_user_from_activity(&remove, client, pool).await?;
+ let note = Note::from_any_base(remove.object().to_owned().one().unwrap())?.unwrap();
insert_activity(mod_.id, remove, false, pool).await?;
- let comment_ap_id = CommentForm::from_apub(¬e, client, pool).await?.ap_id;
+ let comment_ap_id = CommentForm::from_apub(¬e, client, pool, &mod_.actor_id()?)
+ .await?
+ .get_ap_id()?;
let comment = get_or_fetch_and_insert_remote_comment(&comment_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let delete = undo
- .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 delete = Delete::from_any_base(undo.object().to_owned().one().unwrap())?.unwrap();
+ let type_ = delete.object().as_single_kind_str().unwrap();
match type_ {
"Note" => receive_undo_delete_comment(delete, client, pool, chat_server).await,
"Page" => receive_undo_delete_post(delete, client, pool, chat_server).await,
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let remove = undo
- .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 remove = Remove::from_any_base(undo.object().to_owned().one().unwrap())?.unwrap();
+ let type_ = remove.object().as_single_kind_str().unwrap();
match type_ {
"Note" => receive_undo_remove_comment(remove, client, pool, chat_server).await,
"Page" => receive_undo_remove_post(remove, client, pool, chat_server).await,
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
-
- let note = delete
- .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_user_from_activity(&delete, client, pool).await?;
+ let note = Note::from_any_base(delete.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, delete, false, pool).await?;
- let comment_ap_id = CommentForm::from_apub(¬e, client, pool).await?.ap_id;
+ let comment_ap_id = CommentForm::from_apub(¬e, client, pool, &user.actor_id()?)
+ .await?
+ .get_ap_id()?;
let comment = get_or_fetch_and_insert_remote_comment(&comment_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap();
-
- let note = remove
- .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_user_from_activity(&remove, client, pool).await?;
+ let note = Note::from_any_base(remove.object().to_owned().one().unwrap())?.unwrap();
insert_activity(mod_.id, remove, false, pool).await?;
- let comment_ap_id = CommentForm::from_apub(¬e, client, pool).await?.ap_id;
+ let comment_ap_id = CommentForm::from_apub(¬e, client, pool, &mod_.actor_id()?)
+ .await?
+ .get_ap_id()?;
let comment = get_or_fetch_and_insert_remote_comment(&comment_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
-
- let page = delete
- .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_user_from_activity(&delete, client, pool).await?;
+ let page = PageExt::from_any_base(delete.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, delete, false, pool).await?;
- let post_ap_id = PostForm::from_apub(&page, client, pool).await?.ap_id;
+ let post_ap_id = PostForm::from_apub(&page, client, pool, &user.actor_id()?)
+ .await?
+ .get_ap_id()?;
let post = get_or_fetch_and_insert_remote_post(&post_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap();
-
- let page = remove
- .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_user_from_activity(&remove, client, pool).await?;
+ let page = PageExt::from_any_base(remove.object().to_owned().one().unwrap())?.unwrap();
insert_activity(mod_.id, remove, false, pool).await?;
- let post_ap_id = PostForm::from_apub(&page, client, pool).await?.ap_id;
+ let post_ap_id = PostForm::from_apub(&page, client, pool, &mod_.actor_id()?)
+ .await?
+ .get_ap_id()?;
let post = get_or_fetch_and_insert_remote_post(&post_ap_id, client, pool).await?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let user_uri = delete.delete_props.get_actor_xsd_any_uri().unwrap();
-
- let group = delete
- .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_user_from_activity(&delete, client, pool).await?;
+ let group = GroupExt::from_any_base(delete.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, delete, false, pool).await?;
- let community_actor_id = CommunityForm::from_apub(&group, client, pool)
+ let community_actor_id = CommunityForm::from_apub(&group, client, pool, &user.actor_id()?)
.await?
.actor_id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let mod_uri = remove.remove_props.get_actor_xsd_any_uri().unwrap();
-
- let group = remove
- .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_user_from_activity(&remove, client, pool).await?;
+ let group = GroupExt::from_any_base(remove.object().to_owned().one().unwrap())?.unwrap();
insert_activity(mod_.id, remove, false, pool).await?;
- let community_actor_id = CommunityForm::from_apub(&group, client, pool)
+ let community_actor_id = CommunityForm::from_apub(&group, client, pool, &mod_.actor_id()?)
.await?
.actor_id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let like = undo
- .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 like = Like::from_any_base(undo.object().to_owned().one().unwrap())?.unwrap();
+ let type_ = like.object().as_single_kind_str().unwrap();
match type_ {
"Note" => receive_undo_like_comment(like, client, pool, chat_server).await,
"Page" => receive_undo_like_post(like, client, pool, chat_server).await,
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let note = like
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let user = get_user_from_activity(&like, client, pool).await?;
+ let note = Note::from_any_base(like.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, like, false, pool).await?;
- let comment = CommentForm::from_apub(¬e, client, pool).await?;
+ let comment = CommentForm::from_apub(¬e, client, pool, &user.actor_id()?).await?;
- let comment_id = get_or_fetch_and_insert_remote_comment(&comment.ap_id, client, pool)
+ let comment_id = get_or_fetch_and_insert_remote_comment(&comment.get_ap_id()?, client, pool)
.await?
.id;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let page = like
- .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 = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
+ let user = get_user_from_activity(&like, client, pool).await?;
+ let page = PageExt::from_any_base(like.object().to_owned().one().unwrap())?.unwrap();
insert_activity(user.id, like, false, pool).await?;
- let post = PostForm::from_apub(&page, client, pool).await?;
+ let post = PostForm::from_apub(&page, client, pool, &user.actor_id()?).await?;
- let post_id = get_or_fetch_and_insert_remote_post(&post.ap_id, client, pool)
+ let post_id = get_or_fetch_and_insert_remote_post(&post.get_ap_id()?, client, pool)
.await?
.id;
context,
object::{Image, Tombstone},
prelude::*,
- primitives::{XsdAnyUri, XsdDateTime},
};
use actix_web::{body::Body, client::Client, web, HttpResponse};
-use failure::_core::str::FromStr;
use lemmy_db::{
naive_now,
user::{UserForm, User_},
};
use lemmy_utils::convert_datetime;
use serde::Deserialize;
+use url::Url;
#[derive(Deserialize)]
pub struct UserQuery {
let mut person = Person::new();
person
.set_context(context())
- .set_id(XsdAnyUri::from_str(&self.actor_id)?)
+ .set_id(Url::parse(&self.actor_id)?)
.set_name(self.name.to_owned())
- .set_published(XsdDateTime::from(convert_datetime(self.published)));
+ .set_published(convert_datetime(self.published));
if let Some(u) = self.updated {
- person.set_updated(XsdDateTime::from(convert_datetime(u)));
+ person.set_updated(convert_datetime(u));
}
if let Some(avatar_url) = &self.avatar {
#[async_trait::async_trait(?Send)]
impl ActorType for User_ {
- fn actor_id(&self) -> String {
+ fn actor_id_str(&self) -> String {
self.actor_id.to_owned()
}
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(())
}
// TODO
// Undo that fake activity
let undo_id = format!("{}/undo/follow/{}", self.actor_id, uuid::Uuid::new_v4());
- let mut undo = Undo::new(self.actor_id.parse::<XsdAnyUri>()?, follow.into_any_base()?);
+ let mut undo = Undo::new(Url::parse(&self.actor_id)?, follow.into_any_base()?);
undo.set_context(context()).set_id(undo_id.parse()?);
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(())
}
async fn send_accept_follow(
&self,
- _follow: &Follow,
+ _follow: Follow,
_client: &Client,
_pool: &DbPool,
) -> Result<(), LemmyError> {
impl FromApub for UserForm {
type ApubType = PersonExt;
/// Parse an ActivityPub person received from another instance into a Lemmy user.
- async fn from_apub(person: &PersonExt, _: &Client, _: &DbPool) -> Result<Self, LemmyError> {
+ async fn from_apub(
+ person: &PersonExt,
+ _: &Client,
+ _: &DbPool,
+ actor_id: &Url,
+ ) -> Result<Self, LemmyError> {
let avatar = match person.icon() {
Some(any_image) => Image::from_any_base(any_image.as_one().unwrap().clone())
.unwrap()
.unwrap()
- .url
+ .url()
.unwrap()
.as_single_xsd_any_uri()
.map(|u| u.to_string()),
name: person
.name()
.unwrap()
- .as_single_xsd_string()
+ .one()
.unwrap()
- .into(),
+ .as_xsd_string()
+ .unwrap()
+ .to_string(),
preferred_username: person.inner.preferred_username().map(|u| u.to_string()),
password_encrypted: "".to_string(),
admin: false,
banned: false,
email: None,
avatar,
- updated: person
- .updated()
- .map(|u| u.as_ref().to_owned().naive_local()),
+ updated: person.updated().map(|u| u.to_owned().naive_local()),
show_nsfw: false,
theme: "".to_string(),
default_sort_type: 0,
show_avatars: false,
send_notifications_to_email: false,
matrix_user_id: None,
- actor_id: person.id().unwrap().to_string(),
+ actor_id: person.id(actor_id.domain().unwrap())?.unwrap().to_string(),
bio: person
+ .inner
.summary()
.map(|s| s.as_single_xsd_string().unwrap().into()),
local: false,
websocket::{server::SendUserRoomMessage, UserOperation},
DbPool, LemmyError,
};
-use activitystreams::{
+use activitystreams_new::{
activity::{Accept, Create, Delete, Undo, Update},
object::Note,
+ prelude::*,
};
use actix_web::{client::Client, web, HttpRequest, HttpResponse};
use lemmy_db::{
client: &Client,
pool: &DbPool,
) -> Result<HttpResponse, LemmyError> {
- let community_uri = accept
- .accept_props
- .get_actor_xsd_any_uri()
- .unwrap()
- .to_string();
+ let community_uri = accept.actor()?.to_owned().single_xsd_any_uri().unwrap();
let community = get_or_fetch_and_upsert_remote_community(&community_uri, client, pool).await?;
verify(request, &community)?;
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let note = create
- .create_props
- .get_object_base_box()
- .to_owned()
- .unwrap()
- .to_owned()
- .into_concrete::<Note>()?;
+ let user_uri = &create.actor()?.to_owned().single_xsd_any_uri().unwrap();
+ let note = Note::from_any_base(create.object().as_one().unwrap().to_owned())?.unwrap();
- 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)?;
insert_activity(user.id, create, false, pool).await?;
- let private_message = PrivateMessageForm::from_apub(¬e, client, pool).await?;
+ let private_message = PrivateMessageForm::from_apub(¬e, client, pool, user_uri).await?;
let inserted_private_message = blocking(pool, move |conn| {
PrivateMessage::create(conn, &private_message)
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let note = update
- .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 note = Note::from_any_base(update.object().as_one().unwrap().to_owned())?.unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
verify(request, &user)?;
insert_activity(user.id, update, false, pool).await?;
- let private_message_form = PrivateMessageForm::from_apub(¬e, client, pool).await?;
+ let private_message_form = PrivateMessageForm::from_apub(¬e, client, pool, user_uri).await?;
let private_message_ap_id = private_message_form.ap_id.clone();
let private_message = blocking(pool, move |conn| {
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- 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_uri = &delete.actor()?.to_owned().single_xsd_any_uri().unwrap();
+ let note = Note::from_any_base(delete.object().as_one().unwrap().to_owned())?.unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
verify(request, &user)?;
insert_activity(user.id, delete, false, pool).await?;
- let private_message_form = PrivateMessageForm::from_apub(¬e, client, pool).await?;
+ let private_message_form = PrivateMessageForm::from_apub(¬e, client, pool, user_uri).await?;
let private_message_ap_id = private_message_form.ap_id;
let private_message = blocking(pool, move |conn| {
pool: &DbPool,
chat_server: ChatServerParam,
) -> Result<HttpResponse, LemmyError> {
- let delete = undo
- .undo_props
- .get_object_base_box()
- .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 delete = Delete::from_any_base(undo.object().as_one().unwrap().to_owned())?.unwrap();
+ let note = Note::from_any_base(delete.object().as_one().unwrap().to_owned())?.unwrap();
+ let user_uri = &delete.actor()?.to_owned().single_xsd_any_uri().unwrap();
let user = get_or_fetch_and_upsert_remote_user(&user_uri, client, pool).await?;
verify(request, &user)?;
insert_activity(user.id, delete, false, pool).await?;
- let private_message = PrivateMessageForm::from_apub(¬e, client, pool).await?;
+ let private_message = PrivateMessageForm::from_apub(¬e, client, pool, user_uri).await?;
let private_message_ap_id = private_message.ap_id.clone();
let private_message_id = blocking(pool, move |conn| {