# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
-name = "activitypub"
-version = "0.2.0"
+name = "activitystreams"
+version = "0.4.0-alpha.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "activitystreams-derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "activitystreams-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "activitystreams-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "activitystreams-derive 0.4.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thiserror 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "typetag 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "activitystreams-derive"
-version = "0.2.0"
+version = "0.4.0-alpha.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
]
-[[package]]
-name = "activitystreams-traits"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
- "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "activitystreams-types"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "activitystreams-derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "activitystreams-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
[[package]]
name = "actix"
version = "0.9.0"
"serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "ctor"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "darling"
version = "0.10.2"
"termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "erased-serde"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "error-chain"
version = "0.12.1"
"wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "ghost"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "h2"
version = "0.1.26"
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
+[[package]]
+name = "inventory"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ctor 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ghost 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "inventory-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "inventory-impl"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "iovec"
version = "0.1.4"
name = "lemmy_server"
version = "0.0.1"
dependencies = [
- "activitypub 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "activitystreams 0.4.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)",
"actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"actix-files 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
"strum 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
"strum_macros 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
"idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
"dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
[[package]]
name = "thiserror"
-version = "1.0.9"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
- "thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thiserror-impl 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.9"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
"smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"socket2 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)",
"tokio 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
- "url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
version = "1.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
+[[package]]
+name = "typetag"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)",
+ "inventory 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)",
+ "typetag-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "typetag-impl"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "syn 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
[[package]]
name = "unicase"
version = "2.6.0"
[[package]]
name = "url"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[metadata]
-"checksum activitypub 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d538a21b137ec0f63cc579ef4afa4ab13aa85b4f8af15a033683edd97c50718d"
-"checksum activitystreams-derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "65608fdeae5eb05485d5b71a3d2242d76b2b7413608c196d47eb4dff3eed7b85"
-"checksum activitystreams-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0c2a3958d240f40eff1f31b5f679a6e0d4ce2a16812886a3ec0164f3a2ca517"
-"checksum activitystreams-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0598820663a59e5eaafeeedd3a7f7efc93db4ed6172905baec05503095ba5c0e"
+"checksum activitystreams 0.4.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cb3bd10f03af2030e904226c7c1d86ba96e8993f93f7f73959ea78833c00a314"
+"checksum activitystreams-derive 0.4.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbb2213ea81c06ac7d5ce5947be3c1c4623bea2ce2303884cb9acdd29c067cb4"
"checksum actix 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4af87564ff659dee8f9981540cac9418c45e910c8072fdedd643a262a38fcaf"
"checksum actix-codec 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "09e55f0a5c2ca15795035d90c46bd0e73a5123b72f68f12596d6ba5282051380"
"checksum actix-connect 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2b61480a8d30c94d5c883d79ef026b02ad6809931b0a4bb703f9545cd8c986"
"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"
"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
+"checksum ctor 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "47c5e5ac752e18207b12e16b10631ae5f7f68f8805f335f9b817ead83d9ffce1"
"checksum darling 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
"checksum darling_core 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
"checksum darling_macro 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
"checksum encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28"
"checksum enum-as-inner 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "900a6c7fbe523f4c2884eaf26b57b81bb69b6810a01a236390a7ac021d09492e"
"checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
+"checksum erased-serde 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "cd7d80305c9bd8cd78e3c753eb9fb110f83621e5211f1a3afffcc812b104daf9"
"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9"
"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9"
"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08"
"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"
"checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407"
+"checksum ghost 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a36606a68532b5640dc86bb1f33c64b45c4682aad4c50f3937b317ea387f3d6"
"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462"
"checksum h2 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9433d71e471c1736fd5a61b671fc0b148d7a2992f666c958d03cd8feb3b88d1"
"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
"checksum indexmap 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2"
+"checksum inventory 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2bf98296081bd2cb540acc09ef9c97f22b7e487841520350293605db1b2c7a27"
+"checksum inventory-impl 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0a8e30575afe28eea36a9a39136b70b2fb6b0dd0a212a5bd1f30a498395c0274"
"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
"checksum ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa79fa216fbe60834a9c0737d7fcd30425b32d1c58854663e24d4c4b328ed83f"
"checksum itoa 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae3088ea4baeceb0284ee9eea42f591226e6beaecf65373e41b38d95a1b8e7a1"
"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
-"checksum thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6f357d1814b33bc2dc221243f8424104bfe72dbe911d5b71b3816a2dff1c977e"
-"checksum thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2e25d25307eb8436894f727aba8f65d07adf02e5b35a13cebed48bd282bfef"
+"checksum thiserror 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ee14bf8e6767ab4c687c9e8bc003879e042a96fd67a3ba5934eadb6536bef4db"
+"checksum thiserror-impl 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)" = "a7b51e1fbc44b5a0840be594fbc0f960be09050f2617e61e6aa43bef97cd3ef4"
"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382"
"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b"
"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
+"checksum typetag 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6ebb2c484029d695fb68a06d80e1536c68d491b3e0cf874c66abed255e831cfe"
+"checksum typetag-impl 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b63fd4799e4d0ec5cf0b055ebb8e2c3a657bbf76a84f6edc77ca60780e000204"
"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
"checksum unicode-normalization 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b561e267b2326bb4cebfc0ef9e68355c7abe6c6f522aeac2f5bf95d56c59bdcf"
"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
"checksum untrusted 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece"
"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
-"checksum url 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61"
+"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb"
"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a"
"checksum v_escape 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6"
diesel_migrations = "1.4.0"
dotenv = "0.15.0"
bcrypt = "0.6.1"
-activitypub = "0.2.0"
+activitystreams = "0.4.0-alpha.3"
chrono = { version = "0.4.7", features = ["serde"] }
failure = "0.1.5"
serde_json = { version = "1.0.45", features = ["preserve_order"]}
htmlescape = "0.3.1"
config = "0.10.1"
hjson = "0.8.2"
-reqwest = "0.9.24"
\ No newline at end of file
+reqwest = "0.9.24"
+url = "2.1.1"
\ No newline at end of file
-use crate::apub::group_wrapper::GroupHelper;
use crate::apub::make_apub_endpoint;
+use crate::convert_datetime;
use crate::db::community::Community;
use crate::db::community_view::CommunityFollowerView;
use crate::db::establish_unpooled_connection;
-use activitypub::{actor::Group, collection::UnorderedCollection, context};
+use activitystreams::{
+ actor::apub::Group, collection::apub::UnorderedCollection, context,
+ object::properties::ObjectProperties,
+};
use actix_web::body::Body;
use actix_web::web::Path;
use actix_web::HttpResponse;
+use failure::Error;
use serde::Deserialize;
-use serde_json::{Value};
impl Community {
- pub fn as_group(&self) -> Group {
+ pub fn as_group(&self) -> Result<Group, Error> {
let base_url = make_apub_endpoint("c", &self.id);
let mut group = Group::default();
-
- group.object_props.set_context_object(context()).ok();
- Group::set_id(&mut group, &base_url);
-
- Group::set_title(&mut group, &self.title);
- Group::set_published(&mut group, self.published);
- Group::set_updated(&mut group, self.updated);
- Group::set_creator_id(&mut group, make_apub_endpoint("u", &self.creator_id));
-
- Group::set_description(&mut group, &self.description);
-
- group.ap_actor_props.inbox = Value::String(format!("{}/inbox", &base_url));
- group.ap_actor_props.outbox = Value::String(format!("{}/outbox", &base_url));
- group.ap_actor_props.followers = Some(Value::String(format!("{}/followers", &base_url)));
+ let oprops: &mut ObjectProperties = group.as_mut();
+
+ oprops
+ .set_context_xsd_any_uri(context())?
+ .set_id(base_url.to_owned())?
+ .set_name_xsd_string(self.title.to_owned())?
+ .set_published(convert_datetime(self.published))?
+ .set_attributed_to_xsd_any_uri(make_apub_endpoint("u", &self.creator_id))?;
+
+ if let Some(u) = self.updated.to_owned() {
+ oprops.set_updated(convert_datetime(u))?;
+ }
+ if let Some(d) = self.description.to_owned() {
+ oprops.set_summary_xsd_string(d)?;
+ }
group
+ .ap_actor_props
+ .set_inbox(format!("{}/inbox", &base_url))?
+ .set_outbox(format!("{}/outbox", &base_url))?
+ .set_followers(format!("{}/followers", &base_url))?;
+
+ Ok(group)
}
- pub fn followers_as_collection(&self) -> UnorderedCollection {
+ pub fn followers_as_collection(&self) -> Result<UnorderedCollection, Error> {
let base_url = make_apub_endpoint("c", &self.name);
- let mut collection = UnorderedCollection::default();
- collection.object_props.set_context_object(context()).ok();
- collection.object_props.set_id_string(base_url).ok();
-
let connection = establish_unpooled_connection();
//As we are an object, we validated that the community id was valid
let community_followers = CommunityFollowerView::for_community(&connection, self.id).unwrap();
+ let mut collection = UnorderedCollection::default();
+ let oprops: &mut ObjectProperties = collection.as_mut();
+ oprops
+ .set_context_xsd_any_uri(context())?
+ .set_id(base_url)?;
collection
.collection_props
- .set_total_items_u64(community_followers.len() as u64)
- .unwrap();
- collection
+ .set_total_items(community_followers.len() as u64)?;
+ Ok(collection)
}
}
community_name: String,
}
-pub async fn get_apub_community(info: Path<CommunityQuery>) -> HttpResponse<Body> {
+pub async fn get_apub_community(info: Path<CommunityQuery>) -> Result<HttpResponse<Body>, Error> {
let connection = establish_unpooled_connection();
if let Ok(community) = Community::read_from_name(&connection, info.community_name.to_owned()) {
- HttpResponse::Ok()
- .content_type("application/activity+json")
- .body(serde_json::to_string(&community.as_group()).unwrap())
+ Ok(
+ HttpResponse::Ok()
+ .content_type("application/activity+json")
+ .body(serde_json::to_string(&community.as_group()?).unwrap()),
+ )
} else {
- HttpResponse::NotFound().finish()
+ Ok(HttpResponse::NotFound().finish())
}
}
-pub async fn get_apub_community_followers(info: Path<CommunityQuery>) -> HttpResponse<Body> {
+pub async fn get_apub_community_followers(
+ info: Path<CommunityQuery>,
+) -> Result<HttpResponse<Body>, Error> {
let connection = establish_unpooled_connection();
if let Ok(community) = Community::read_from_name(&connection, info.community_name.to_owned()) {
- HttpResponse::Ok()
- .content_type("application/activity+json")
- .body(serde_json::to_string(&community.followers_as_collection()).unwrap())
+ Ok(
+ HttpResponse::Ok()
+ .content_type("application/activity+json")
+ .body(serde_json::to_string(&community.followers_as_collection()?).unwrap()),
+ )
} else {
- HttpResponse::NotFound().finish()
+ Ok(HttpResponse::NotFound().finish())
}
}
+++ /dev/null
-use crate::to_datetime_utc;
-use activitypub::actor::Group;
-use chrono::{DateTime, NaiveDateTime};
-use failure::Error;
-use serde_json::Value;
-
-pub trait GroupHelper {
- fn set_id(group: &mut Group, id: &str);
- fn get_id(group: &Group) -> Result<String, Error>;
-
- fn set_title(group: &mut Group, title: &str);
- fn get_title(group: &Group) -> Result<String, Error>;
-
- fn set_description(group: &mut Group, description: &Option<String>);
- fn get_description(group: &Group) -> Result<Option<String>, Error>;
-
- fn set_creator_id(group: &mut Group, creator_id: String);
- fn get_creator_id(group: &Group) -> Result<String, Error>;
-
- fn set_published(group: &mut Group, published: NaiveDateTime);
- fn get_published(group: &Group) -> Result<NaiveDateTime, Error>;
-
- fn set_updated(group: &mut Group, updated: Option<NaiveDateTime>);
- fn get_updated(group: &Group) -> Result<Option<NaiveDateTime>, Error>;
-}
-
-// TODO: something is crashing and not reporting the error
-impl GroupHelper for Group {
- fn set_id(group: &mut Group, id: &str) {
- group.object_props.id = Some(Value::String(id.to_string()));
- }
- fn get_id(group: &Group) -> Result<String, Error> {
- Ok(get_string_value(group.clone().object_props.id))
- }
-
- fn set_title(group: &mut Group, title: &str) {
- group.object_props.name = Some(Value::String(title.to_string()));
- }
- fn get_title(group: &Group) -> Result<String, Error> {
- Ok(get_string_value(group.to_owned().object_props.name))
- }
-
- fn set_description(group: &mut Group, description: &Option<String>) {
- group.object_props.summary = description.as_ref().map(|d| Value::String(d.to_string()));
- }
- fn get_description(group: &Group) -> Result<Option<String>, Error> {
- Ok(get_string_value_opt(group.to_owned().object_props.summary))
- }
-
- fn set_creator_id(group: &mut Group, creator_id: String) {
- group.object_props.attributed_to = Some(Value::String(creator_id.to_string()));
- }
- fn get_creator_id(group: &Group) -> Result<String, Error> {
- Ok(get_string_value(group.clone().object_props.attributed_to))
- }
-
- fn set_published(group: &mut Group, published: NaiveDateTime) {
- group.object_props.published = Some(Value::String(to_datetime_utc(published).to_string()))
- }
- fn get_published(group: &Group) -> Result<NaiveDateTime, Error> {
- let str = get_string_value(group.to_owned().object_props.published);
- // TODO: date parsing is failing, no idea if this is even the right format
- dbg!(&str);
- let date = DateTime::parse_from_rfc2822(&str)?;
- dbg!(&date);
- Ok(date.naive_local())
- }
-
- fn set_updated(group: &mut Group, updated: Option<NaiveDateTime>) {
- group.object_props.updated = updated.map(|u| Value::String(u.to_string()));
- }
- fn get_updated(group: &Group) -> Result<Option<NaiveDateTime>, Error> {
- let str = get_string_value_opt(group.to_owned().object_props.updated);
- match str {
- Some(s) => Ok(Some(DateTime::parse_from_rfc2822(&s)?.naive_local())),
- None => Ok(None),
- }
- }
-}
-
-fn get_string_value_opt(value: Option<Value>) -> Option<String> {
- value
- .as_ref()
- .map(Value::as_str)
- .flatten()
- .map(str::to_string)
-}
-
-fn get_string_value(value: Option<Value>) -> String {
- get_string_value_opt(value).unwrap()
-}
pub mod community;
-pub mod group_wrapper;
pub mod post;
pub mod puller;
pub mod user;
use failure::Error;
use std::fmt::Display;
+use url::Url;
#[cfg(test)]
mod tests {
let person = user.as_person();
assert_eq!(
format!("https://{}/federation/u/thom", Settings::get().hostname),
- person.object_props.id_string().unwrap()
+ person.unwrap().object_props.get_id().unwrap().to_string()
);
}
let group = community.as_group();
assert_eq!(
format!("https://{}/federation/c/Test", Settings::get().hostname),
- group.object_props.id_string().unwrap()
+ group.unwrap().object_props.get_id().unwrap().to_string()
);
}
let page = post.as_page();
assert_eq!(
format!("https://{}/federation/post/62", Settings::get().hostname),
- page.object_props.id_string().unwrap()
+ page.unwrap().object_props.get_id().unwrap().to_string()
);
}
}
// TODO: this should take an enum community/user/post for `point`
// TODO: also not sure what exactly `value` should be (numeric id, name string, ...)
-pub fn make_apub_endpoint<S: Display, T: Display>(point: S, value: T) -> String {
- format!(
+pub fn make_apub_endpoint<S: Display, T: Display>(point: S, value: T) -> Url {
+ Url::parse(&format!(
"{}://{}/federation/{}/{}",
get_apub_protocol_string(),
Settings::get().hostname,
point,
value
- )
+ ))
+ .unwrap()
}
/// Parses an ID generated by `make_apub_endpoint()`. Will break when federating with anything
/// that is not Lemmy. This is just a crutch until we change the database to store URLs as ID.
pub fn parse_apub_endpoint(id: &str) -> Result<(&str, &str), Error> {
- let split = id.split("/").collect::<Vec<&str>>();
+ let split = id.split('/').collect::<Vec<&str>>();
Ok((split[4], split[5]))
}
use crate::apub::make_apub_endpoint;
+use crate::convert_datetime;
use crate::db::post::Post;
-use crate::to_datetime_utc;
-use activitypub::{context, object::Page};
+use activitystreams::{context, object::apub::Page, object::properties::ObjectProperties};
+use failure::Error;
impl Post {
- pub fn as_page(&self) -> Page {
+ pub fn as_page(&self) -> Result<Page, Error> {
let base_url = make_apub_endpoint("post", self.id);
let mut page = Page::default();
+ let oprops: &mut ObjectProperties = page.as_mut();
- page.object_props.set_context_object(context()).ok();
- page.object_props.set_id_string(base_url).ok();
- page.object_props.set_name_string(self.name.to_owned()).ok();
+ oprops
+ .set_context_xsd_any_uri(context())?
+ .set_id(base_url)?
+ .set_name_xsd_string(self.name.to_owned())?
+ .set_published(convert_datetime(self.published))?
+ .set_attributed_to_xsd_any_uri(make_apub_endpoint("u", &self.creator_id))?;
if let Some(body) = &self.body {
- page.object_props.set_content_string(body.to_owned()).ok();
+ oprops.set_content_xsd_string(body.to_owned())?;
}
if let Some(url) = &self.url {
- page.object_props.set_url_string(url.to_owned()).ok();
+ oprops.set_url_xsd_any_uri(url.to_owned())?;
}
- //page.object_props.set_attributed_to_string
-
- page
- .object_props
- .set_published_utctime(to_datetime_utc(self.published))
- .ok();
- if let Some(updated) = self.updated {
- page
- .object_props
- .set_updated_utctime(to_datetime_utc(updated))
- .ok();
+ if let Some(u) = self.updated {
+ oprops.set_updated(convert_datetime(u))?;
}
- page
+ Ok(page)
}
}
+
+// TODO: need to serve this via actix
extern crate reqwest;
-use self::reqwest::Error;
use crate::api::community::{GetCommunityResponse, ListCommunitiesResponse};
use crate::api::post::GetPosts;
-use crate::apub::group_wrapper::GroupHelper;
+use crate::apub::parse_apub_endpoint;
use crate::db::community_view::CommunityView;
use crate::settings::Settings;
-use activitypub::actor::Group;
-use crate::apub::parse_apub_endpoint;
+use activitystreams::actor::apub::Group;
+use failure::Error;
// TODO: right now all of the data is requested on demand, for production we will need to store
// things in the local database to not ruin the performance
admins: vec![],
community: CommunityView {
// TODO: we need to merge id and name into a single thing (stuff like @user@instance.com)
- id: parse_apub_endpoint(&Group::get_id(&community)?)?.1.parse::<i32>()?,
+ id: parse_apub_endpoint(&community.object_props.get_id().unwrap().to_string())?
+ .1
+ .parse::<i32>()?,
name,
- title: Group::get_title(&community)?,
- description: Group::get_description(&community)?,
+ title: community
+ .object_props
+ .get_name_xsd_string()
+ .unwrap()
+ .to_string(),
+ description: community
+ .object_props
+ .get_summary_xsd_string()
+ .map(|s| s.to_string()),
category_id: -1,
- creator_id: parse_apub_endpoint(&Group::get_creator_id(&community)?)?.1.parse::<i32>()?,
+ creator_id: parse_apub_endpoint(
+ &community
+ .object_props
+ .get_attributed_to_xsd_any_uri()
+ .unwrap()
+ .to_string(),
+ )?
+ .1
+ .parse::<i32>()?,
removed: false,
- published: Group::get_published(&community)?,
- updated: Group::get_updated(&community)?,
+ published: community
+ .object_props
+ .get_published()
+ .unwrap()
+ .as_ref()
+ .naive_local()
+ .to_owned(),
+ updated: community
+ .object_props
+ .get_updated()
+ .map(|u| u.as_ref().to_owned().naive_local()),
deleted: false,
nsfw: false,
creator_name: "".to_string(),
use crate::apub::make_apub_endpoint;
+use crate::convert_datetime;
use crate::db::establish_unpooled_connection;
use crate::db::user::User_;
-use crate::to_datetime_utc;
-use activitypub::{actor::Person, context};
+use activitystreams::{actor::apub::Person, context, object::properties::ObjectProperties};
use actix_web::body::Body;
use actix_web::web::Path;
use actix_web::HttpResponse;
+use failure::Error;
use serde::Deserialize;
impl User_ {
- pub fn as_person(&self) -> Person {
+ pub fn as_person(&self) -> Result<Person, Error> {
let base_url = make_apub_endpoint("u", &self.name);
+
let mut person = Person::default();
- person.object_props.set_context_object(context()).ok();
- person.object_props.set_id_string(base_url.to_string()).ok();
- person
- .object_props
- .set_name_string(self.name.to_owned())
- .ok();
- person
- .object_props
- .set_published_utctime(to_datetime_utc(self.published))
- .ok();
- if let Some(updated) = self.updated {
- person
- .object_props
- .set_updated_utctime(to_datetime_utc(updated))
- .ok();
+ let oprops: &mut ObjectProperties = person.as_mut();
+ oprops
+ .set_context_xsd_any_uri(context())?
+ .set_id(base_url.to_string())?
+ .set_published(convert_datetime(self.published))?;
+
+ if let Some(u) = self.updated {
+ oprops.set_updated(convert_datetime(u))?;
}
- person
- .ap_actor_props
- .set_inbox_string(format!("{}/inbox", &base_url))
- .ok();
- person
- .ap_actor_props
- .set_outbox_string(format!("{}/outbox", &base_url))
- .ok();
- person
- .ap_actor_props
- .set_following_string(format!("{}/following", &base_url))
- .ok();
- person
- .ap_actor_props
- .set_liked_string(format!("{}/liked", &base_url))
- .ok();
if let Some(i) = &self.preferred_username {
- person
- .ap_actor_props
- .set_preferred_username_string(i.to_string())
- .ok();
+ oprops.set_name_xsd_string(i.to_owned())?;
}
person
+ .ap_actor_props
+ .set_inbox(format!("{}/inbox", &base_url))?
+ .set_outbox(format!("{}/outbox", &base_url))?
+ .set_following(format!("{}/following", &base_url))?
+ .set_liked(format!("{}/liked", &base_url))?;
+
+ Ok(person)
}
}
user_name: String,
}
-pub async fn get_apub_user(info: Path<UserQuery>) -> HttpResponse<Body> {
+pub async fn get_apub_user(info: Path<UserQuery>) -> Result<HttpResponse<Body>, Error> {
let connection = establish_unpooled_connection();
if let Ok(user) = User_::find_by_email_or_username(&connection, &info.user_name) {
- HttpResponse::Ok()
- .content_type("application/activity+json")
- .body(serde_json::to_string(&user.as_person()).unwrap())
+ Ok(
+ HttpResponse::Ok()
+ .content_type("application/activity+json")
+ .body(serde_json::to_string(&user.as_person()?).unwrap()),
+ )
} else {
- HttpResponse::NotFound().finish()
+ Ok(HttpResponse::NotFound().finish())
}
}
pub mod websocket;
use crate::settings::Settings;
-use chrono::{DateTime, NaiveDateTime, Utc};
+use chrono::{DateTime, FixedOffset, Local, NaiveDateTime};
use lettre::smtp::authentication::{Credentials, Mechanism};
use lettre::smtp::extension::ClientId;
use lettre::smtp::ConnectionReuseParameters;
use rand::{thread_rng, Rng};
use regex::{Regex, RegexBuilder};
-pub fn to_datetime_utc(ndt: NaiveDateTime) -> DateTime<Utc> {
- DateTime::<Utc>::from_utc(ndt, Utc)
-}
-
pub fn naive_now() -> NaiveDateTime {
chrono::prelude::Utc::now().naive_utc()
}
NaiveDateTime::from_timestamp(time, 0)
}
+pub fn convert_datetime(datetime: NaiveDateTime) -> DateTime<FixedOffset> {
+ let now = Local::now();
+ DateTime::<FixedOffset>::from_utc(datetime, *now.offset())
+}
+
pub fn is_email_regex(test: &str) -> bool {
EMAIL_REGEX.is_match(test)
}