]> Untitled Git - lemmy.git/commitdiff
Merge branch 'master' into federation
authorDessalines <tyhou13@gmx.com>
Thu, 2 Apr 2020 19:11:11 +0000 (15:11 -0400)
committerDessalines <tyhou13@gmx.com>
Thu, 2 Apr 2020 19:11:11 +0000 (15:11 -0400)
1  2 
.gitignore
server/Cargo.lock
server/Cargo.toml
server/config/defaults.hjson
server/src/apub/community.rs
server/src/apub/puller.rs
server/src/lib.rs
server/src/routes/nodeinfo.rs
server/src/settings.rs

diff --cc .gitignore
index 92377b4b65cc4446bace8b640f27e6368e3d5a2a,9f7fa1e3c6930299976d9bab212b53ec509d4d9c..5e221b03828c692dffef140ce8128a4ec99d49ad
@@@ -2,17 -1,10 +2,16 @@@
  ansible/inventory
  ansible/inventory_dev
  ansible/passwords/
- ansible/vars/
 +
 +# docker build files
  docker/lemmy_mine.hjson
  docker/dev/env_deploy.sh
 +docker/federation-test/volumes
 +docker/dev/volumes
 +
 +# local build files
  build/
 -.idea/
  ui/src/translations
 -docker/dev/volumes
 -docker/federation-test/volumes
 +
 +# ide config
 +.idea/
index 78e7ee1e84c152e4d69255b6ef45675bcffdf3fc,2a3bc03302b064db867ab4f09f6b8ffd832c1896..ceb09b75518d8c7b05f22f26bc441d9d24ad06a6
@@@ -1,69 -1,88 +1,69 @@@
  # 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.5.0-alpha.11"
++version = "0.5.0-alpha.16"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "f0fb876395ae7a1dd1c7d7de38f2cdb583918db16b46ee5b75d2e9bf7af1ef9f"
++checksum = "e7173513c9d586a1157f375835777e3b50498b6b7aab4411a7098b455ba995f0"
  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)",
 - "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
 + "activitystreams-derive",
 + "chrono",
 + "mime",
 + "serde 1.0.105",
 + "serde_json 1.0.50",
 + "thiserror",
 + "url",
  ]
  
  [[package]]
  name = "activitystreams-derive"
- version = "0.5.0-alpha.4"
 -version = "0.2.0"
 -source = "registry+https://github.com/rust-lang/crates.io-index"
 -dependencies = [
 - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
 - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
 -]
 -
 -[[package]]
 -name = "activitystreams-traits"
 -version = "0.2.0"
++version = "0.5.0-alpha.8"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "c2bc640808dceb2efac81e6bcb77a7f4e2e76af7fb60e88f966b48123b625d2f"
++checksum = "c7ff4a2be3b67d763e78794f622ef2d53da077521229774837f61963c4067b36"
  dependencies = [
 - "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
 - "thiserror 1.0.11 (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.11 (registry+https://github.com/rust-lang/crates.io-index)",
 - "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde_derive 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
 + "proc-macro2",
 + "quote",
 + "syn",
  ]
  
  [[package]]
  name = "actix"
  version = "0.9.0"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "a4af87564ff659dee8f9981540cac9418c45e910c8072fdedd643a262a38fcaf"
  dependencies = [
 - "actix-http 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "actix-rt 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "actix_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 - "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "trust-dns-resolver 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)",
 + "actix-http",
 + "actix-rt",
 + "actix_derive",
 + "bitflags",
 + "bytes",
 + "crossbeam-channel",
 + "derive_more",
 + "futures",
 + "lazy_static 1.4.0",
 + "log",
 + "parking_lot",
 + "pin-project",
 + "smallvec",
 + "tokio",
-  "tokio-util",
++ "tokio-util 0.2.0",
 + "trust-dns-proto",
 + "trust-dns-resolver",
  ]
  
  [[package]]
  name = "actix-codec"
  version = "0.2.0"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "09e55f0a5c2ca15795035d90c46bd0e73a5123b72f68f12596d6ba5282051380"
  dependencies = [
 - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 + "bitflags",
 + "bytes",
 + "futures-core",
 + "futures-sink",
 + "log",
 + "tokio",
-  "tokio-util",
++ "tokio-util 0.2.0",
  ]
  
  [[package]]
@@@ -371,18 -372,24 +371,27 @@@ dependencies = 
  
  [[package]]
  name = "aho-corasick"
 -version = "0.7.9"
 +version = "0.7.10"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada"
  dependencies = [
 - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 + "memchr 2.3.3",
  ]
  
 - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ [[package]]
+ name = "ansi_term"
+ version = "0.11.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
+ dependencies = [
++ "winapi 0.3.8",
+ ]
  [[package]]
  name = "arc-swap"
 -version = "0.4.4"
 +version = "0.4.5"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "d663a8e9a99154b5fb793032533f6328da35e23aac63d5c152279aa8ba356825"
  
  [[package]]
  name = "arrayvec"
@@@ -401,13 -406,12 +410,13 @@@ checksum = "71938f30533e4d95a6d17aa5309
  
  [[package]]
  name = "async-trait"
- version = "0.1.26"
 -version = "0.1.24"
++version = "0.1.29"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "21a03abb7c9b93ae229356151a083d26218c0358866a2a59d4280c856e9482e6"
++checksum = "bab5c215748dc1ad11a145359b1067107ae0f8ca5e99844fa64067ed5bf198e3"
  dependencies = [
 - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
 - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
 + "proc-macro2",
 + "quote",
 + "syn",
  ]
  
  [[package]]
@@@ -621,11 -602,18 +630,11 @@@ checksum = "130aac562c0dd69c56b3b1cc8ff
  
  [[package]]
  name = "bytestring"
--version = "0.1.4"
 -source = "registry+https://github.com/rust-lang/crates.io-index"
 -dependencies = [
 - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 -]
 -
 -[[package]]
 -name = "c2-chacha"
 -version = "0.2.3"
++version = "0.1.5"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "fc267467f58ef6cc8874064c62a0423eb0d099362c8a23edd1c6d044f46eead4"
++checksum = "fc7c05fa5172da78a62d9949d662d2ac89d4cc7355d7b49adee5163f1fb3f363"
  dependencies = [
 - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 + "bytes",
  ]
  
  [[package]]
@@@ -644,23 -630,51 +653,55 @@@ checksum = "4785bdd1c96b2a846b2bd7cc02e
  name = "chrono"
  version = "0.4.11"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2"
  dependencies = [
 - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 + "num-integer",
 + "num-traits 0.2.11",
 + "serde 1.0.105",
 + "time",
  ]
  
 - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
 - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ [[package]]
+ name = "clap"
+ version = "2.33.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
+ dependencies = [
++ "ansi_term",
++ "atty",
++ "bitflags",
++ "strsim 0.8.0",
++ "textwrap",
++ "unicode-width",
++ "vec_map",
+ ]
  [[package]]
  name = "cloudabi"
  version = "0.0.3"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
  dependencies = [
 - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 + "bitflags",
  ]
  
 - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "entities 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 - "twoway 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "unicode_categories 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ [[package]]
+ name = "comrak"
+ version = "0.7.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "e17058cc536cf290563e88787d7b9e6030ce4742943017cc2ffb71f88034021c"
+ dependencies = [
++ "clap",
++ "entities",
++ "lazy_static 1.4.0",
++ "pest",
++ "pest_derive",
++ "regex 1.3.6",
++ "twoway",
++ "typed-arena",
++ "unicode_categories",
+ ]
  [[package]]
  name = "config"
  version = "0.10.1"
@@@ -994,11 -976,15 +1035,17 @@@ checksum = "a246d82be1c9d791c5dfde9a2bd
  name = "encoding_rs"
  version = "0.8.22"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28"
  dependencies = [
 - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 + "cfg-if",
  ]
  
+ [[package]]
+ name = "entities"
+ version = "1.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca"
  [[package]]
  name = "enum-as-inner"
  version = "0.3.2"
@@@ -1238,21 -1199,20 +1285,21 @@@ dependencies = 
  
  [[package]]
  name = "h2"
- version = "0.2.3"
 -version = "0.2.2"
++version = "0.2.4"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "7938e6aa2a31df4e21f224dc84704bd31c089a6d1355c535b03667371cccc843"
++checksum = "377038bf3c89d18d6ca1431e7a5027194fbd724ca10592b9487ede5e8e144f42"
  dependencies = [
 - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 + "bytes",
 + "fnv",
 + "futures-core",
 + "futures-sink",
 + "futures-util",
 + "http",
 + "indexmap",
 + "log",
 + "slab",
 + "tokio",
-  "tokio-util",
++ "tokio-util 0.3.1",
  ]
  
  [[package]]
@@@ -1266,11 -1225,10 +1313,11 @@@ dependencies = 
  
  [[package]]
  name = "hermit-abi"
--version = "0.1.8"
++version = "0.1.10"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8"
++checksum = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e"
  dependencies = [
 - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
 + "libc",
  ]
  
  [[package]]
@@@ -1475,38 -1412,38 +1522,39 @@@ checksum = "e2abad23fbc42b3700f2f279844
  name = "lemmy_server"
  version = "0.0.1"
  dependencies = [
 - "activitypub 0.2.0 (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)",
 - "actix-web 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "actix-web-actors 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "bcrypt 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
 - "comrak 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "config 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "diesel 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "diesel_migrations 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "dotenv 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 - "hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "isahc 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "jsonwebtoken 7.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lettre 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lettre_email 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 - "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "regex 1.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 - "rss 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)",
 - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "strum 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "strum_macros 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)",
 + "activitystreams",
 + "actix",
 + "actix-files",
 + "actix-rt",
 + "actix-web",
 + "actix-web-actors",
 + "bcrypt",
 + "chrono",
++ "comrak",
 + "config",
 + "diesel",
 + "diesel_migrations",
 + "dotenv",
 + "env_logger",
 + "failure",
 + "hjson",
 + "htmlescape",
 + "isahc",
 + "jsonwebtoken",
 + "lazy_static 1.4.0",
 + "lettre",
 + "lettre_email",
 + "log",
 + "percent-encoding",
 + "rand 0.7.3",
 + "regex 1.3.6",
 + "rss",
 + "serde 1.0.105",
 + "serde_json 1.0.50",
 + "sha2",
 + "strum",
 + "strum_macros",
 + "url",
  ]
  
  [[package]]
@@@ -1620,11 -1547,15 +1668,17 @@@ dependencies = 
  name = "lru-cache"
  version = "0.1.2"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
  dependencies = [
 - "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
 + "linked-hash-map 0.5.2",
  ]
  
+ [[package]]
+ name = "maplit"
+ version = "1.0.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
  [[package]]
  name = "match_cfg"
  version = "0.1.0"
@@@ -1929,8 -1830,46 +1983,51 @@@ dependencies = 
  name = "percent-encoding"
  version = "2.1.0"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
  
 - "ucd-trie 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ [[package]]
+ name = "pest"
+ version = "2.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
+ dependencies = [
 - "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pest_generator 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
++ "ucd-trie",
+ ]
+ [[package]]
+ name = "pest_derive"
+ version = "2.1.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
+ dependencies = [
 - "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pest_meta 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
 - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
++ "pest",
++ "pest_generator",
+ ]
+ [[package]]
+ name = "pest_generator"
+ version = "2.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55"
+ dependencies = [
 - "maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pest 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
++ "pest",
++ "pest_meta",
++ "proc-macro2",
++ "quote",
++ "syn",
+ ]
+ [[package]]
+ name = "pest_meta"
+ version = "2.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
+ dependencies = [
++ "maplit",
++ "pest",
++ "sha-1",
+ ]
  [[package]]
  name = "pin-project"
  version = "0.4.8"
@@@ -1986,9 -1918,13 +2083,9 @@@ dependencies = 
  
  [[package]]
  name = "proc-macro-hack"
- version = "0.5.14"
 -version = "0.5.11"
++version = "0.5.15"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "fcfdefadc3d57ca21cf17990a28ef4c0f7c61383a28cb7604cf4a18e6ede1420"
 -dependencies = [
 - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
 - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
 -]
++checksum = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63"
  
  [[package]]
  name = "proc-macro-nested"
@@@ -1998,11 -1933,10 +2095,11 @@@ checksum = "8e946095f9d3ed29ec38de908c2
  
  [[package]]
  name = "proc-macro2"
--version = "1.0.9"
++version = "1.0.10"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435"
++checksum = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3"
  dependencies = [
 - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 + "unicode-xid",
  ]
  
  [[package]]
@@@ -2363,24 -2259,22 +2460,25 @@@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f
  
  [[package]]
  name = "security-framework"
--version = "0.4.1"
++version = "0.4.2"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "97bbedbe81904398b6ebb054b3e912f99d55807125790f3198ac990d98def5b0"
++checksum = "572dfa3a0785509e7a44b5b4bebcf94d41ba34e9ed9eb9df722545c3b3c4144a"
  dependencies = [
 - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "security-framework-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 + "bitflags",
 + "core-foundation",
 + "core-foundation-sys",
++ "libc",
 + "security-framework-sys",
  ]
  
  [[package]]
  name = "security-framework-sys"
--version = "0.4.1"
++version = "0.4.2"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "06fd2f23e31ef68dd2328cc383bd493142e46107a3a0e24f7d734e3f3b80fe4c"
++checksum = "8ddb15a5fec93b7021b8a9e96009c5d8d51c15673569f7c0f6b7204e5b7b404f"
  dependencies = [
 - "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
 + "core-foundation-sys",
 + "libc",
  ]
  
  [[package]]
@@@ -2487,14 -2371,24 +2585,26 @@@ dependencies = 
  name = "serde_urlencoded"
  version = "0.6.1"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97"
  dependencies = [
 - "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
 - "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)",
 - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 + "dtoa 0.4.5",
 + "itoa 0.4.5",
 + "serde 1.0.105",
 + "url",
  ]
  
 - "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ [[package]]
+ name = "sha-1"
+ version = "0.8.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
+ dependencies = [
++ "block-buffer",
++ "digest",
++ "fake-simd",
++ "opaque-debug",
+ ]
  [[package]]
  name = "sha1"
  version = "0.6.0"
@@@ -2560,14 -2447,13 +2670,14 @@@ checksum = "5c2fb2ec9bcd216a5b0d0ccf31a
  
  [[package]]
  name = "socket2"
--version = "0.3.11"
++version = "0.3.12"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "e8b74de517221a2cb01a53349cf54182acdc31a074727d3079068448c0676d85"
++checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918"
  dependencies = [
 - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
 - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)",
 - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
 + "cfg-if",
 + "libc",
 + "redox_syscall",
 + "winapi 0.3.8",
  ]
  
  [[package]]
@@@ -2586,8 -2470,12 +2696,14 @@@ checksum = "7f3eb36b47e512f8f1c9e3d10c2
  name = "strsim"
  version = "0.5.2"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "67f84c44fbb2f91db7fef94554e6b2ac05909c9c0b0bc23bb98d3a1aebfe7f7c"
  
+ [[package]]
+ name = "strsim"
+ version = "0.8.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
  [[package]]
  name = "strsim"
  version = "0.9.3"
@@@ -2653,29 -2535,34 +2769,38 @@@ dependencies = 
  name = "termcolor"
  version = "1.1.0"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f"
  dependencies = [
 - "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 + "winapi-util",
  ]
  
 - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ [[package]]
+ name = "textwrap"
+ version = "0.11.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+ dependencies = [
++ "unicode-width",
+ ]
  [[package]]
  name = "thiserror"
- version = "1.0.13"
 -version = "1.0.11"
++version = "1.0.14"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "e3711fd1c4e75b3eff12ba5c40dba762b6b65c5476e8174c1a664772060c49bf"
++checksum = "f0570dc61221295909abdb95c739f2e74325e14293b2026b0a7e195091ec54ae"
  dependencies = [
 - "thiserror-impl 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)",
 + "thiserror-impl",
  ]
  
  [[package]]
  name = "thiserror-impl"
- version = "1.0.13"
 -version = "1.0.11"
++version = "1.0.14"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "ae2b85ba4c9aa32dd3343bd80eb8d22e9b54b7688c17ea3907f236885353b233"
++checksum = "227362df41d566be41a28f64401e07a043157c21c14b9785a0d8e256f940a8fd"
  dependencies = [
 - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
 - "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
 + "proc-macro2",
 + "quote",
 + "syn",
  ]
  
  [[package]]
@@@ -2728,39 -2610,37 +2853,53 @@@ dependencies = 
  
  [[package]]
  name = "tokio"
--version = "0.2.13"
++version = "0.2.15"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616"
++checksum = "619cdb2245c40c42d563089b72e80c5df659513d667a017598439ef7a7b1ffe1"
  dependencies = [
 - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)",
 - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)",
 - "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "signal-hook-registry 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
 + "bytes",
 + "fnv",
 + "futures-core",
 + "iovec",
 + "lazy_static 1.4.0",
 + "libc",
 + "memchr 2.3.3",
 + "mio",
 + "mio-uds",
 + "pin-project-lite",
 + "signal-hook-registry",
 + "slab",
 + "winapi 0.3.8",
  ]
  
  [[package]]
  name = "tokio-util"
  version = "0.2.0"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 - "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 - "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
 +checksum = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930"
 +dependencies = [
 + "bytes",
 + "futures-core",
 + "futures-sink",
 + "log",
 + "pin-project-lite",
 + "tokio",
 +]
 +
++[[package]]
++name = "tokio-util"
++version = "0.3.1"
++source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499"
+ dependencies = [
++ "bytes",
++ "futures-core",
++ "futures-sink",
++ "log",
++ "pin-project-lite",
++ "tokio",
+ ]
  [[package]]
  name = "toml"
  version = "0.5.6"
@@@ -2794,27 -2672,49 +2933,55 @@@ dependencies = 
  name = "trust-dns-resolver"
  version = "0.18.0-alpha.2"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "6f90b1502b226f8b2514c6d5b37bafa8c200d7ca4102d57dc36ee0f3b7a04a2f"
  dependencies = [
 - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
 - "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 - "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 - "ipconfig 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
 - "lru-cache 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 - "resolv-conf 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
 - "trust-dns-proto 0.18.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)",
 + "cfg-if",
 + "failure",
 + "futures",
 + "ipconfig",
 + "lazy_static 1.4.0",
 + "log",
 + "lru-cache",
 + "resolv-conf",
 + "smallvec",
 + "tokio",
 + "trust-dns-proto",
  ]
  
 - "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 - "unchecked-index 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ [[package]]
+ name = "twoway"
+ version = "0.2.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "6b40075910de3a912adbd80b5d8bad6ad10a23eeb1f5bf9d4006839e899ba5bc"
+ dependencies = [
++ "memchr 2.3.3",
++ "unchecked-index",
+ ]
+ [[package]]
+ name = "typed-arena"
+ version = "1.7.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d"
  [[package]]
  name = "typenum"
  version = "1.11.2"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9"
  
+ [[package]]
+ name = "ucd-trie"
+ version = "0.1.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
+ [[package]]
+ name = "unchecked-index"
+ version = "0.2.2"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c"
  [[package]]
  name = "unicase"
  version = "2.6.0"
@@@ -2846,14 -2743,22 +3013,26 @@@ dependencies = 
  name = "unicode-segmentation"
  version = "1.6.0"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
  
+ [[package]]
+ name = "unicode-width"
+ version = "0.1.7"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479"
  [[package]]
  name = "unicode-xid"
  version = "0.2.0"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
  
+ [[package]]
+ name = "unicode_categories"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
  [[package]]
  name = "untrusted"
  version = "0.7.0"
@@@ -2921,8 -2819,12 +3100,14 @@@ dependencies = 
  name = "vcpkg"
  version = "0.2.8"
  source = "registry+https://github.com/rust-lang/crates.io-index"
 +checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168"
  
+ [[package]]
+ name = "vec_map"
+ version = "0.8.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
++checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
  [[package]]
  name = "version_check"
  version = "0.1.5"
@@@ -3041,11 -2929,10 +3226,11 @@@ checksum = "ac3b87c63620426dd9b991e5ce0
  
  [[package]]
  name = "winapi-util"
--version = "0.1.3"
++version = "0.1.4"
  source = "registry+https://github.com/rust-lang/crates.io-index"
- checksum = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80"
++checksum = "fa515c5163a99cc82bab70fd3bfdd36d827be85de63737b40fcef2ce084a436e"
  dependencies = [
 - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
 + "winapi 0.3.8",
  ]
  
  [[package]]
index 83dfb43efb913da473a432c27c8950fc10989e62,5a4fdcece840fbddb6817e819c3c61037a09133f..1455428d7c2bdb053c864a9ed14a191a7f9c791d
@@@ -8,8 -8,8 +8,8 @@@ edition = "2018
  diesel = { version = "1.4.2", features = ["postgres","chrono", "r2d2", "64-column-tables"] }
  diesel_migrations = "1.4.0"
  dotenv = "0.15.0"
- activitystreams = "0.5.0-alpha.10"
++activitystreams = "0.5.0-alpha.16"
  bcrypt = "0.6.2"
 -activitypub = "0.2.0"
  chrono = { version = "0.4.7", features = ["serde"] }
  failure = "0.1.5"
  serde_json = { version = "1.0.48", features = ["preserve_order"]}
@@@ -34,6 -34,6 +34,7 @@@ rss = "1.9.0
  htmlescape = "0.3.1"
  config = "0.10.1"
  hjson = "0.8.2"
 +url = "2.1.1"
  percent-encoding = "2.1.0"
  isahc = "0.9"
+ comrak = "0.7"
Simple merge
index 2f533b977e2d42c3fc593938a66a8f289e1c5c6f,32f14eeb28f7309b6832c9b51555f4aa7027505c..d914c08df07a4f85d789d6b86b2fe1da859688c9
@@@ -15,105 -7,103 +15,105 @@@ use activitystreams::
  use actix_web::body::Body;
  use actix_web::web::Path;
  use actix_web::HttpResponse;
 +use actix_web::{web, Result};
 +use diesel::r2d2::{ConnectionManager, Pool};
 +use diesel::PgConnection;
 +use failure::Error;
  use serde::Deserialize;
  
 -impl Community {
 -  pub fn as_group(&self) -> Group {
 -    let base_url = make_apub_endpoint("c", &self.name);
 -
 -    let mut group = Group::default();
 -
 -    group.object_props.set_context_object(context()).ok();
 -    group.object_props.set_id_string(base_url.to_string()).ok();
 -    group
 -      .object_props
 -      .set_name_string(self.name.to_owned())
 -      .ok();
 -    group
 -      .object_props
 -      .set_published_utctime(to_datetime_utc(self.published))
 -      .ok();
 -    if let Some(updated) = self.updated {
 -      group
 -        .object_props
 -        .set_updated_utctime(to_datetime_utc(updated))
 -        .ok();
 -    }
 -
 -    if let Some(description) = &self.description {
 -      group
 -        .object_props
 -        .set_summary_string(description.to_string())
 -        .ok();
 -    }
 -
 -    group
 -      .ap_actor_props
 -      .set_inbox_string(format!("{}/inbox", &base_url))
 -      .ok();
 -    group
 -      .ap_actor_props
 -      .set_outbox_string(format!("{}/outbox", &base_url))
 -      .ok();
 -    group
 -      .ap_actor_props
 -      .set_followers_string(format!("{}/followers", &base_url))
 -      .ok();
 +#[derive(Deserialize)]
 +pub struct CommunityQuery {
 +  community_name: String,
 +}
  
 -    group
 +pub async fn get_apub_community(
 +  info: Path<CommunityQuery>,
 +  db: web::Data<Pool<ConnectionManager<PgConnection>>>,
 +) -> Result<HttpResponse<Body>, Error> {
 +  let community = Community::read_from_name(&&db.get()?, info.community_name.to_owned())?;
 +  let base_url = make_apub_endpoint(EndpointType::Community, &community.name);
 +
 +  let mut group = Group::default();
 +  let oprops: &mut ObjectProperties = group.as_mut();
 +
 +  oprops
 +    .set_context_xsd_any_uri(context())?
 +    .set_id(base_url.to_owned())?
 +    .set_name_xsd_string(community.title.to_owned())?
 +    .set_published(convert_datetime(community.published))?
 +    .set_attributed_to_xsd_any_uri(make_apub_endpoint(
 +      EndpointType::User,
 +      &community.creator_id.to_string(),
 +    ))?;
 +
 +  if let Some(u) = community.updated.to_owned() {
 +    oprops.set_updated(convert_datetime(u))?;
 +  }
 +  if let Some(d) = community.description {
 +    oprops.set_summary_xsd_string(d)?;
    }
  
 -  pub fn followers_as_collection(&self) -> UnorderedCollection {
 -    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 actor_props = ApActorProperties::default();
  
 -    let ap_followers = community_followers
 -      .iter()
 -      .map(|follower| make_apub_endpoint("u", &follower.user_name))
 -      .collect();
 +  actor_props
 +    .set_inbox(format!("{}/inbox", &base_url))?
 +    .set_outbox(format!("{}/outbox", &base_url))?
 +    .set_followers(format!("{}/followers", &base_url))?;
  
 -    collection
 -      .collection_props
 -      .set_items_string_vec(ap_followers)
 -      .unwrap();
 -    collection
 -  }
 +  Ok(create_apub_response(&group.extend(actor_props)))
  }
  
 -#[derive(Deserialize)]
 -pub struct CommunityQuery {
 -  community_name: String,
 -}
 +pub async fn get_apub_community_followers(
 +  info: Path<CommunityQuery>,
 +  db: web::Data<Pool<ConnectionManager<PgConnection>>>,
 +) -> Result<HttpResponse<Body>, Error> {
 +  let community = Community::read_from_name(&&db.get()?, info.community_name.to_owned())?;
 +  let base_url = make_apub_endpoint(EndpointType::Community, &community.name);
  
 -pub async fn get_apub_community(info: Path<CommunityQuery>) -> HttpResponse<Body> {
    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())
 -  } else {
 -    HttpResponse::NotFound().finish()
 -  }
 +  //As we are an object, we validated that the community id was valid
 +  let community_followers =
 +    CommunityFollowerView::for_community(&connection, community.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(community_followers.len() as u64)?;
 +  Ok(create_apub_response(&collection))
  }
  
 -pub async fn get_apub_community_followers(info: Path<CommunityQuery>) -> HttpResponse<Body> {
 -  let connection = establish_unpooled_connection();
 +pub async fn get_apub_community_outbox(
 +  info: Path<CommunityQuery>,
 +  db: web::Data<Pool<ConnectionManager<PgConnection>>>,
 +) -> Result<HttpResponse<Body>, Error> {
 +  let community = Community::read_from_name(&&db.get()?, info.community_name.to_owned())?;
 +  let base_url = make_apub_endpoint(EndpointType::Community, &community.name);
  
 -  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())
 -  } else {
 -    HttpResponse::NotFound().finish()
 -  }
 +  let connection = establish_unpooled_connection();
 +  //As we are an object, we validated that the community id was valid
 +  let community_posts: Vec<PostView> = PostQueryBuilder::create(&connection)
 +    .for_community_id(community.id)
 +    .list()
 +    .unwrap();
 +
 +  let mut collection = OrderedCollection::default();
 +  let oprops: &mut ObjectProperties = collection.as_mut();
 +  oprops
 +    .set_context_xsd_any_uri(context())?
 +    .set_id(base_url)?;
 +  collection
 +    .collection_props
-     .set_many_items_object_boxs(
++    .set_many_items_base_boxes(
 +      community_posts
 +        .iter()
 +        .map(|c| c.as_page().unwrap())
 +        .collect(),
 +    )?
 +    .set_total_items(community_posts.len() as u64)?;
 +
 +  Ok(create_apub_response(&collection))
  }
index 43cc2f8c8b7e121da267fa323a172cf1d13a7591,0000000000000000000000000000000000000000..a9ac10861ad823d006763fc1746c50b68bf5d21b
mode 100644,000000..100644
--- /dev/null
@@@ -1,230 -1,0 +1,230 @@@
- use activitystreams::object::ObjectBox;
 +use crate::api::community::{GetCommunityResponse, ListCommunitiesResponse};
 +use crate::api::post::GetPostsResponse;
 +use crate::apub::get_apub_protocol_string;
 +use crate::db::community_view::CommunityView;
 +use crate::db::post_view::PostView;
 +use crate::naive_now;
 +use crate::routes::nodeinfo::{NodeInfo, NodeInfoWellKnown};
 +use crate::settings::Settings;
 +use activitystreams::actor::{properties::ApActorProperties, Group};
 +use activitystreams::collection::{OrderedCollection, UnorderedCollection};
 +use activitystreams::ext::Ext;
-   let items = outbox.collection_props.get_many_items_object_boxs();
 +use activitystreams::object::Page;
++use activitystreams::BaseBox;
 +use failure::Error;
 +use isahc::prelude::*;
 +use log::warn;
 +use serde::Deserialize;
 +
 +fn fetch_node_info(domain: &str) -> Result<NodeInfo, Error> {
 +  let well_known_uri = format!(
 +    "{}://{}/.well-known/nodeinfo",
 +    get_apub_protocol_string(),
 +    domain
 +  );
 +  let well_known = fetch_remote_object::<NodeInfoWellKnown>(&well_known_uri)?;
 +  Ok(fetch_remote_object::<NodeInfo>(&well_known.links.href)?)
 +}
 +
 +fn fetch_communities_from_instance(domain: &str) -> Result<Vec<CommunityView>, Error> {
 +  let node_info = fetch_node_info(domain)?;
 +  if node_info.software.name != "lemmy" {
 +    return Err(format_err!(
 +      "{} is not a Lemmy instance, federation is not supported",
 +      domain
 +    ));
 +  }
 +
 +  // TODO: follow pagination (seems like page count is missing?)
 +  // TODO: see if there is any standard for discovering remote actors, so we dont have to rely on lemmy apis
 +  let communities_uri = format!(
 +    "http://{}/api/v1/communities/list?sort=Hot&local_only=true",
 +    domain
 +  );
 +  let communities1 = fetch_remote_object::<ListCommunitiesResponse>(&communities_uri)?;
 +  let mut communities2 = communities1.communities;
 +  for c in &mut communities2 {
 +    c.name = format_community_name(&c.name, domain);
 +  }
 +  Ok(communities2)
 +}
 +
 +fn get_remote_community_uri(identifier: &str) -> String {
 +  let x: Vec<&str> = identifier.split('@').collect();
 +  let name = x[0].replace("!", "");
 +  let instance = x[1];
 +  format!("http://{}/federation/c/{}", instance, name)
 +}
 +
 +fn fetch_remote_object<Response>(uri: &str) -> Result<Response, Error>
 +where
 +  Response: for<'de> Deserialize<'de>,
 +{
 +  if Settings::get().federation.tls_enabled && !uri.starts_with("https") {
 +    return Err(format_err!("Activitypub uri is insecure: {}", uri));
 +  }
 +  // TODO: should cache responses here when we are in production
 +  // TODO: this function should return a future
 +  let text = isahc::get(uri)?.text()?;
 +  let res: Response = serde_json::from_str(&text)?;
 +  Ok(res)
 +}
 +
 +pub fn get_remote_community_posts(identifier: &str) -> Result<GetPostsResponse, Error> {
 +  let community =
 +    fetch_remote_object::<Ext<Group, ApActorProperties>>(&get_remote_community_uri(identifier))?;
 +  let outbox_uri = &community.extension.get_outbox().to_string();
 +  let outbox = fetch_remote_object::<OrderedCollection>(outbox_uri)?;
-     .map(|obox: &ObjectBox| {
++  let items = outbox.collection_props.get_many_items_base_boxes();
 +
 +  let posts: Vec<PostView> = items
 +    .unwrap()
++    .map(|obox: &BaseBox| {
 +      let page: Page = obox.clone().to_concrete::<Page>().unwrap();
 +      PostView {
 +        id: -1,
 +        name: page.object_props.get_name_xsd_string().unwrap().to_string(),
 +        url: page
 +          .object_props
 +          .get_url_xsd_any_uri()
 +          .map(|u| u.to_string()),
 +        body: page
 +          .object_props
 +          .get_content_xsd_string()
 +          .map(|c| c.to_string()),
 +        creator_id: -1,
 +        community_id: -1,
 +        removed: false,
 +        locked: false,
 +        published: page
 +          .object_props
 +          .get_published()
 +          .unwrap()
 +          .as_ref()
 +          .naive_local()
 +          .to_owned(),
 +        updated: page
 +          .object_props
 +          .get_updated()
 +          .map(|u| u.as_ref().to_owned().naive_local()),
 +        deleted: false,
 +        nsfw: false,
 +        stickied: false,
 +        embed_title: None,
 +        embed_description: None,
 +        embed_html: None,
 +        thumbnail_url: None,
 +        banned: false,
 +        banned_from_community: false,
 +        creator_name: "".to_string(),
 +        creator_avatar: None,
 +        community_name: "".to_string(),
 +        community_removed: false,
 +        community_deleted: false,
 +        community_nsfw: false,
 +        number_of_comments: -1,
 +        score: -1,
 +        upvotes: -1,
 +        downvotes: -1,
 +        hot_rank: -1,
 +        newest_activity_time: naive_now(),
 +        user_id: None,
 +        my_vote: None,
 +        subscribed: None,
 +        read: None,
 +        saved: None,
 +      }
 +    })
 +    .collect();
 +  Ok(GetPostsResponse { posts })
 +}
 +
 +pub fn get_remote_community(identifier: &str) -> Result<GetCommunityResponse, failure::Error> {
 +  let community =
 +    fetch_remote_object::<Ext<Group, ApActorProperties>>(&get_remote_community_uri(identifier))?;
 +  let followers_uri = &community.extension.get_followers().unwrap().to_string();
 +  let outbox_uri = &community.extension.get_outbox().to_string();
 +  let outbox = fetch_remote_object::<OrderedCollection>(outbox_uri)?;
 +  let followers = fetch_remote_object::<UnorderedCollection>(followers_uri)?;
 +  // TODO: this is only for testing until we can call that function from GetPosts
 +  // (once string ids are supported)
 +  //dbg!(get_remote_community_posts(identifier)?);
 +
 +  Ok(GetCommunityResponse {
 +    moderators: vec![],
 +    admins: vec![],
 +    community: CommunityView {
 +      // TODO: we need to merge id and name into a single thing (stuff like @user@instance.com)
 +      id: 1337, //community.object_props.get_id()
 +      name: identifier.to_string(),
 +      title: community
 +        .as_ref()
 +        .get_name_xsd_string()
 +        .unwrap()
 +        .to_string(),
 +      description: community
 +        .as_ref()
 +        .get_summary_xsd_string()
 +        .map(|s| s.to_string()),
 +      category_id: -1,
 +      creator_id: -1, //community.object_props.get_attributed_to_xsd_any_uri()
 +      removed: false,
 +      published: community
 +        .as_ref()
 +        .get_published()
 +        .unwrap()
 +        .as_ref()
 +        .naive_local()
 +        .to_owned(),
 +      updated: community
 +        .as_ref()
 +        .get_updated()
 +        .map(|u| u.as_ref().to_owned().naive_local()),
 +      deleted: false,
 +      nsfw: false,
 +      creator_name: "".to_string(),
 +      creator_avatar: None,
 +      category_name: "".to_string(),
 +      number_of_subscribers: *followers
 +        .collection_props
 +        .get_total_items()
 +        .unwrap()
 +        .as_ref() as i64, // TODO: need to use the same type
 +      number_of_posts: *outbox.collection_props.get_total_items().unwrap().as_ref() as i64,
 +      number_of_comments: -1,
 +      hot_rank: -1,
 +      user_id: None,
 +      subscribed: None,
 +    },
 +    online: 0,
 +  })
 +}
 +
 +pub fn get_following_instances() -> Vec<&'static str> {
 +  Settings::get()
 +    .federation
 +    .followed_instances
 +    .split(',')
 +    .collect()
 +}
 +
 +pub fn get_all_communities() -> Result<Vec<CommunityView>, Error> {
 +  let mut communities_list: Vec<CommunityView> = vec![];
 +  for instance in &get_following_instances() {
 +    match fetch_communities_from_instance(instance) {
 +      Ok(mut c) => communities_list.append(c.as_mut()),
 +      Err(e) => warn!("Failed to fetch instance list from remote instance: {}", e),
 +    };
 +  }
 +  Ok(communities_list)
 +}
 +
 +/// If community is on local instance, don't include the @instance part. This is only for displaying
 +/// to the user and should never be used otherwise.
 +pub fn format_community_name(name: &str, instance: &str) -> String {
 +  if instance == Settings::get().hostname {
 +    format!("!{}", name)
 +  } else {
 +    format!("!{}@{}", name, instance)
 +  }
 +}
index 0012c73fe439b85e4800c1d2cf2bc7bcb64bf56e,8257dab9a6720a126143090915da494a977d0552..9f882b7f8bffd5101c52cd4060cb60767b51bd78
@@@ -15,9 -16,9 +16,10 @@@ pub extern crate dotenv
  pub extern crate jsonwebtoken;
  pub extern crate lettre;
  pub extern crate lettre_email;
 +extern crate log;
  pub extern crate rand;
  pub extern crate regex;
+ pub extern crate rss;
  pub extern crate serde;
  pub extern crate serde_json;
  pub extern crate sha2;
index abfae1eda0ae6f5d143548f0f5f052519e7a4968,1263cef848076bc8fadf6e86baba98c92c3d2f70..662089b3043d491c087c923e5778865e14b4a366
@@@ -1,5 -1,3 +1,4 @@@
- extern crate lazy_static;
 +use crate::apub::get_apub_protocol_string;
  use crate::db::site_view::SiteView;
  use crate::version;
  use crate::Settings;
index 3928f74e1ef189886fbdde3451e1d669c5fcd766,875323e96e125c837cb52110ccd2001f115d4936..29d5966bafc173fbf4dfa32db844a6181fffcc02
@@@ -17,9 -17,17 +17,17 @@@ pub struct Settings 
    pub front_end_dir: String,
    pub rate_limit: RateLimitConfig,
    pub email: Option<EmailConfig>,
 -  pub federation_enabled: bool,
 +  pub federation: Federation,
  }
  
+ #[derive(Debug, Deserialize)]
+ pub struct Setup {
+   pub admin_username: String,
+   pub admin_password: String,
+   pub admin_email: Option<String>,
+   pub site_name: String,
+ }
  #[derive(Debug, Deserialize)]
  pub struct RateLimitConfig {
    pub message: i32,