diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 39a81445..9b8a6933 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,6 +17,8 @@ on: pull_request: branches: - "master" + paths: + - "Dockerfile" workflow_dispatch: jobs: diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml new file mode 100644 index 00000000..4386b19f --- /dev/null +++ b/.github/workflows/rust.yaml @@ -0,0 +1,33 @@ +name: Rust build and test + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +env: + CARGO_TERM_COLOR: always + +jobs: + check: + name: Rust project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install latest nightly + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + components: rustfmt, clippy + + - name: Run cargo build + uses: actions-rs/cargo@v1 + with: + command: build + + - name: Run cargo test + uses: actions-rs/cargo@v1 + with: + command: test diff --git a/Cargo.lock b/Cargo.lock index da27c482..803be086 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,19 +3,29 @@ version = 3 [[package]] -name = "addr2line" -version = "0.14.1" +name = "Inflector" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" dependencies = [ "gimli", ] [[package]] name = "adler" -version = "0.2.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" @@ -25,9 +35,9 @@ checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] @@ -56,9 +66,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9" +checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" dependencies = [ "concurrent-queue", "event-listener", @@ -67,16 +77,16 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146" +checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", "once_cell", - "vec-arena", + "slab", ] [[package]] @@ -94,34 +104,33 @@ dependencies = [ "num_cpus", "once_cell", "tokio 0.2.25", - "tokio 1.9.0", + "tokio 1.11.0", ] [[package]] name = "async-io" -version = "1.3.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd" +checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" dependencies = [ "concurrent-queue", - "fastrand", "futures-lite", "libc", "log", - "nb-connect", "once_cell", "parking", "polling", - "vec-arena", + "slab", + "socket2 0.4.1", "waker-fn", "winapi 0.3.9", ] [[package]] name = "async-lock" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1996609732bde4a9988bc42125f55f2af5f3c36370e27c778d5191a4a1b63bfb" +checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" dependencies = [ "event-listener", ] @@ -137,9 +146,9 @@ dependencies = [ [[package]] name = "async-std" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f06685bad74e0570f5213741bea82158279a4103d988e57bfada11ad230341" +checksum = "f8056f1455169ab86dd47b47391e4ab0cbd25410a70e9fe675544f49bafaf952" dependencies = [ "async-attributes", "async-channel", @@ -157,7 +166,7 @@ dependencies = [ "memchr", "num_cpus", "once_cell", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "pin-utils", "slab", "wasm-bindgen-futures", @@ -211,7 +220,7 @@ dependencies = [ "futures-io", "futures-util", "log", - "pin-project 1.0.5", + "pin-project", "tungstenite", ] @@ -255,11 +264,12 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.56" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01" dependencies = [ "addr2line", + "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", @@ -273,6 +283,12 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" +[[package]] +name = "base32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" + [[package]] name = "base64" version = "0.7.0" @@ -315,15 +331,15 @@ checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitvec" -version = "0.19.4" +version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ba35e9565969edb811639dbebfe34edc0368e472c5018474c8eb2543397f81" +checksum = "8942c8d352ae1838c9dda0b0ca2ab657696ef2232a20147cf1b30ae1a9cb4321" dependencies = [ "funty", "radium", @@ -351,7 +367,7 @@ dependencies = [ "block-padding", "byte-tools", "byteorder", - "generic-array 0.12.3", + "generic-array 0.12.4", ] [[package]] @@ -388,9 +404,9 @@ dependencies = [ [[package]] name = "bson" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b6553abdb9d2d8f262f0b5bccf807321d5b7d1a12796bcede8e1f150e85f2e" +checksum = "903a4f4c7aa97921f1703acac1fd524e9e082b3228edd34dde07758c0c92c672" dependencies = [ "base64 0.13.0", "chrono", @@ -405,9 +421,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" [[package]] name = "byte-tools" @@ -417,9 +433,9 @@ checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" @@ -429,9 +445,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cache-padded" @@ -441,9 +457,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cc" -version = "1.0.66" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" [[package]] name = "cfg-if" @@ -467,6 +483,7 @@ dependencies = [ "libc", "num-integer", "num-traits", + "serde", "time 0.1.44", "wasm-bindgen", "winapi 0.3.9", @@ -492,9 +509,9 @@ dependencies = [ [[package]] name = "const_fn" -version = "0.4.5" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" +checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" [[package]] name = "constant_time_eq" @@ -509,7 +526,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f1c7727e460397e56abc4bddc1d49e07a1ad78fc98eb2e1c8f032a58a2f80d" dependencies = [ "percent-encoding", - "time 0.2.25", + "time 0.2.27", "version_check", ] @@ -530,37 +547,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] -name = "cpuid-bool" -version = "0.1.2" +name = "cpufeatures" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ - "autocfg 1.0.1", "cfg-if 1.0.0", "lazy_static", ] [[package]] name = "crypto-mac" -version = "0.7.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ - "generic-array 0.12.3", + "generic-array 0.14.4", "subtle", ] [[package]] name = "ctor" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8f45d9ad417bcef4817d614a501ab55cdd96a6fdb24f49aab89a54acfd66b19" +checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" dependencies = [ "quote", "syn", @@ -568,9 +587,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.7" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b57a92e9749e10f25a171adcebfafe72991d45e7ec2dcb853e8f83d9dafaeb08" +checksum = "377c9b002a72a0b2c1a18c62e2f3864bdfea4a015e3683a96e24aa45dd6c02d1" dependencies = [ "nix", "winapi 0.3.9", @@ -582,8 +601,18 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.10.2", + "darling_macro 0.10.2", +] + +[[package]] +name = "darling" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +dependencies = [ + "darling_core 0.13.0", + "darling_macro 0.13.0", ] [[package]] @@ -600,13 +629,38 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core", + "darling_core 0.10.2", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +dependencies = [ + "darling_core 0.13.0", "quote", "syn", ] @@ -671,7 +725,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array 0.12.3", + "generic-array 0.12.4", ] [[package]] @@ -737,9 +791,9 @@ dependencies = [ [[package]] name = "erased-serde" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0465971a8cc1fa2455c8465aaa377131e1f1cf4983280f474a13e68793aa770c" +checksum = "3de9ad4541d99dc22b59134e7ff8dc3d6c988c89ecd7324bf10a8362b07a2afa" dependencies = [ "serde", ] @@ -772,9 +826,9 @@ checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fastrand" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" dependencies = [ "instant", ] @@ -816,9 +870,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", "percent-encoding", @@ -854,9 +908,9 @@ checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" [[package]] name = "futures" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" dependencies = [ "futures-channel", "futures-core", @@ -869,9 +923,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d31b7ec7efab6eefc7c57233bb10b847986139d88cc2f5a02a1ae6871a1846" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" dependencies = [ "futures-core", "futures-sink", @@ -879,15 +933,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e5145dde8da7d1b3892dad07a9c98fc04bc39892b1ecc9692cf53e2b780a65" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" [[package]] name = "futures-executor" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" dependencies = [ "futures-core", "futures-task", @@ -896,31 +950,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28be053525281ad8259d47e4de5de657b25e7bac113458555bb4b70bc6870500" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" [[package]] name = "futures-lite" -version = "1.11.3" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4481d0cd0de1d204a4fa55e7d45f07b1d958abcb06714b3446438e2eff695fb" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" dependencies = [ "fastrand", "futures-core", "futures-io", "memchr", "parking", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "waker-fn", ] [[package]] name = "futures-macro" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c287d25add322d9f9abdcdc5927ca398917996600182178774032e9f8258fedd" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" dependencies = [ + "autocfg 1.0.1", "proc-macro-hack", "proc-macro2", "quote", @@ -929,18 +984,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5c69029bda2e743fddd0582d1083951d65cc9539aebf8812f36c3491342d6" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" [[package]] name = "futures-task" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13de07eb8ea81ae445aca7b69f5f7bf15d7bf4912d8ca37d6645c77ae8a58d86" -dependencies = [ - "once_cell", -] +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" [[package]] name = "futures-timer" @@ -950,10 +1002,11 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632a8cd0f2a4b3fdea1657f08bde063848c3bd00f9bbf6e256b8be78802e624b" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" dependencies = [ + "autocfg 1.0.1", "futures-channel", "futures-core", "futures-io", @@ -961,7 +1014,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "pin-utils", "proc-macro-hack", "proc-macro-nested", @@ -983,9 +1036,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" dependencies = [ "typenum", ] @@ -1013,9 +1066,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1024,9 +1077,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.23.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" [[package]] name = "glob" @@ -1060,7 +1113,7 @@ dependencies = [ "nonzero_ext", "parking_lot", "quanta", - "rand 0.8.3", + "rand 0.8.4", "smallvec", ] @@ -1086,11 +1139,11 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" +checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "fnv", "futures-core", "futures-sink", @@ -1098,21 +1151,21 @@ dependencies = [ "http", "indexmap", "slab", - "tokio 1.9.0", - "tokio-util 0.6.7", + "tokio 1.11.0", + "tokio-util 0.6.8", "tracing", ] [[package]] name = "handlebars" -version = "3.5.2" +version = "3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964d0e99a61fe9b1b347389b77ebf8b7e1587b70293676aaca7d27e59b9073b2" +checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3" dependencies = [ "log", "pest", "pest_derive", - "quick-error 2.0.0", + "quick-error 2.0.1", "serde", "serde_json", ] @@ -1129,33 +1182,33 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "hex" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hive_pubsub" @@ -1172,12 +1225,12 @@ dependencies = [ [[package]] name = "hmac" -version = "0.7.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ "crypto-mac", - "digest 0.8.1", + "digest 0.9.0", ] [[package]] @@ -1197,7 +1250,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "fnv", "itoa", ] @@ -1214,20 +1267,20 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" +checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "http", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", ] [[package]] name = "httparse" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" [[package]] name = "httpdate" @@ -1266,7 +1319,7 @@ dependencies = [ "httparse", "httpdate 0.3.2", "itoa", - "pin-project 1.0.5", + "pin-project", "socket2 0.3.19", "tokio 0.2.25", "tower-service", @@ -1276,23 +1329,23 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.11" +version = "0.14.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" +checksum = "13f67199e765030fa08fe0bd581af683f0d5bc04ea09c2b1102012c5fb90e7fd" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "futures-channel", "futures-core", "futures-util", - "h2 0.3.3", + "h2 0.3.4", "http", - "http-body 0.4.2", + "http-body 0.4.3", "httparse", "httpdate 1.0.1", "itoa", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "socket2 0.4.1", - "tokio 1.9.0", + "tokio 1.11.0", "tower-service", "tracing", "want", @@ -1333,10 +1386,10 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.0.1", - "hyper 0.14.11", + "bytes 1.1.0", + "hyper 0.14.12", "native-tls", - "tokio 1.9.0", + "tokio 1.11.0", "tokio-native-tls", ] @@ -1348,9 +1401,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de910d521f7cc3135c4de8db1cb910e0b5ed1dc6f57c381cd07e8e661ce10094" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -1359,9 +1412,9 @@ dependencies = [ [[package]] name = "if_chain" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7280c75fb2e2fc47080ec80ccc481376923acb04501957fc38f935c3de5088" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "impl_ops" @@ -1371,12 +1424,12 @@ checksum = "90f97a5f38dd3ccfbe7aa80f4a0c00930f21b922c74195be0201c51028f22dcf" [[package]] name = "indexmap" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg 1.0.1", - "hashbrown 0.9.1", + "hashbrown 0.11.2", "serde", ] @@ -1397,9 +1450,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" dependencies = [ "cfg-if 1.0.0", ] @@ -1427,21 +1480,21 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "js-sys" -version = "0.3.47" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cfb73131c35423a367daf8cbd24100af0d077668c8c2943f0e7dd775fef0f65" +checksum = "1866b355d9c878e5e607473cbe3f63282c0b7aad2db1dbebf55076c686918254" dependencies = [ "wasm-bindgen", ] @@ -1499,9 +1552,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.98" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" +checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21" [[package]] name = "linked-hash-map" @@ -1520,9 +1573,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] @@ -1579,26 +1632,35 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "md-5" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18af3dcaf2b0219366cdb4e2af65a6101457b415c3d1a5c71dd9c2b7c77b9c8" +checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "opaque-debug 0.2.3", + "block-buffer 0.9.0", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg 1.0.1", +] [[package]] name = "mime" @@ -1618,9 +1680,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg 1.0.1", @@ -1681,9 +1743,9 @@ dependencies = [ [[package]] name = "mongodb" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af18a0f10c2355e5b9382603076c84159923dd434d0287fe6bf9c1a656dbc09c" +checksum = "dd2a1cb6fd58c27e51ee650dca3b6924c4ce533dc0384f05b3219709ea1f1eb6" dependencies = [ "async-trait", "base64 0.11.0", @@ -1706,7 +1768,7 @@ dependencies = [ "serde", "serde_bytes", "serde_with", - "sha-1 0.8.2", + "sha-1 0.9.8", "sha2", "socket2 0.3.19", "stringprep", @@ -1721,7 +1783,7 @@ dependencies = [ "uuid", "version_check", "webpki", - "webpki-roots 0.18.0", + "webpki-roots 0.21.1", ] [[package]] @@ -1730,7 +1792,7 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "408327e2999b839cd1af003fc01b2019a6c10a1361769542203f6fedc5179680" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "encoding_rs", "futures-util", "http", @@ -1738,35 +1800,26 @@ dependencies = [ "log", "mime", "spin 0.9.2", - "tokio 1.9.0", - "tokio-util 0.6.7", + "tokio 1.11.0", + "tokio-util 0.6.8", "twoway", "version_check", ] -[[package]] -name = "nanoid" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6226bc4e142124cb44e309a37a04cd9bb10e740d8642855441d3b14808f635e" -dependencies = [ - "rand 0.6.5", -] - [[package]] name = "nanoid" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" dependencies = [ - "rand 0.8.3", + "rand 0.8.4", ] [[package]] name = "native-tls" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ "lazy_static", "libc", @@ -1780,16 +1833,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nb-connect" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8123a81538e457d44b933a02faf885d3fe8408806b23fa700e8f01c6c3a98998" -dependencies = [ - "libc", - "winapi 0.3.9", -] - [[package]] name = "net2" version = "0.2.37" @@ -1803,14 +1846,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.18.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" +checksum = "cf1e25ee6b412c2a1e3fcb6a4499a5c1bfe7f43e014bdce9a6b6666e5aa2d187" dependencies = [ "bitflags", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", + "memoffset", ] [[package]] @@ -1824,11 +1868,12 @@ dependencies = [ [[package]] name = "nom" -version = "6.1.0" +version = "6.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6f70b46d6325aa300f1c7bb3d470127dfc27806d8ea6bf294ee0ce643ce2b1" +checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" dependencies = [ "bitvec", + "funty", "memchr", "version_check", ] @@ -1879,9 +1924,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" +checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" dependencies = [ "derivative", "num_enum_derive", @@ -1889,9 +1934,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.5.1" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" +checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1901,15 +1946,18 @@ dependencies = [ [[package]] name = "object" -version = "0.23.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" +checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" +dependencies = [ + "memchr", +] [[package]] name = "once_cell" -version = "1.5.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "opaque-debug" @@ -1925,29 +1973,29 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.32" +version = "0.10.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038d43985d1ddca7a9900630d8cd031b56e4794eecc2e9ea39dd17aa04399a70" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" dependencies = [ "bitflags", "cfg-if 1.0.0", "foreign-types", - "lazy_static", "libc", + "once_cell", "openssl-sys", ] [[package]] name = "openssl-probe" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.60" +version = "0.9.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921fc71883267538946025deffb622905ecad223c28efbfdef9bb59a0175f3e6" +checksum = "1996d2d305e561b70d1ee0c53f1542833f4e1ac6ce9a6708b6ff2738ca67dc82" dependencies = [ "autocfg 1.0.1", "cc", @@ -1958,9 +2006,9 @@ dependencies = [ [[package]] name = "os_info" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d2536ab8ff7605e8dc7044ec2f3eb0d49750cb559af9e5373c4564a3706cdd" +checksum = "6ac91020bfed8cc3f8aa450d4c3b5fa1d3373fc091c8a92009f3b27749d5a227" dependencies = [ "log", "winapi 0.3.9", @@ -1974,9 +2022,9 @@ checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", @@ -1985,25 +2033,24 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.1.57", + "redox_syscall", "smallvec", "winapi 0.3.9", ] [[package]] name = "pbkdf2" -version = "0.3.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" +checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" dependencies = [ - "byteorder", "crypto-mac", ] @@ -2092,12 +2139,12 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc1437ada0f3a97d538f0bb608137bf53c53969028cab74c89893e1e9a12f0e" +checksum = "d43f3220d96e0080cc9ea234978ccd80d904eafb17be31bb0f76daaea6493082" dependencies = [ "phf_shared", - "rand 0.8.3", + "rand 0.8.4", ] [[package]] @@ -2125,38 +2172,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "0.4.27" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" dependencies = [ - "pin-project-internal 0.4.27", -] - -[[package]] -name = "pin-project" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96fa8ebb90271c4477f144354485b8068bd8f6b78b428b01ba892ca26caf0b63" -dependencies = [ - "pin-project-internal 1.0.5", + "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "0.4.27" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2", "quote", @@ -2165,15 +2192,15 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" +checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" @@ -2189,14 +2216,14 @@ checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" [[package]] name = "polling" -version = "2.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4" +checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", "log", - "wepoll-sys", + "wepoll-ffi", "winapi 0.3.9", ] @@ -2208,10 +2235,11 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "proc-macro-crate" -version = "0.1.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "41fdbd1df62156fbc5945f4762632564d7d038153091c3fcf1067f6aef7cff92" dependencies = [ + "thiserror", "toml", ] @@ -2253,9 +2281,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" dependencies = [ "unicode-xid", ] @@ -2291,9 +2319,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick-error" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ac73b1112776fc109b2e61909bc46c7e1bf0d7f690ffb1676553acce16d5cda" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" @@ -2306,9 +2334,9 @@ dependencies = [ [[package]] name = "quoted_printable" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b080c5db639b292ac79cbd34be0cfc5d36694768d8341109634d90b86930e2" +checksum = "1238256b09923649ec89b08104c4dfe9f6cb2fea734a5db5384e44916d59e9c5" [[package]] name = "r2d2" @@ -2362,14 +2390,14 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.1", - "rand_hc 0.3.0", + "rand_chacha 0.3.1", + "rand_core 0.6.3", + "rand_hc 0.3.1", ] [[package]] @@ -2394,12 +2422,12 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.1", + "rand_core 0.6.3", ] [[package]] @@ -2428,11 +2456,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.3", ] [[package]] @@ -2455,11 +2483,11 @@ dependencies = [ [[package]] name = "rand_hc" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ - "rand_core 0.6.1", + "rand_core 0.6.3", ] [[package]] @@ -2527,24 +2555,30 @@ dependencies = [ [[package]] name = "rauth" -version = "0.3.0" -source = "git+https://github.com/insertish/rauth?rev=19bef300ecc269c028e3d746f0a2f09842d3b37b#19bef300ecc269c028e3d746f0a2f09842d3b37b" +version = "1.0.0" +source = "git+https://github.com/insertish/rauth?rev=ad2f5ad1657f4b20c8e483cc1d6c513ff9b22ae1#ad2f5ad1657f4b20c8e483cc1d6c513ff9b22ae1" dependencies = [ + "async-std", + "base32", "chrono", + "futures", "handlebars", "json", "lazy_static", "lettre", "mongodb", - "nanoid 0.3.0", + "nanoid", + "rand 0.8.4", "regex", "reqwest 0.11.4", "rocket", "rust-argon2", "serde", "serde_json", + "totp-lite", "ulid", - "validator", + "validator 0.14.0", + "wither", ] [[package]] @@ -2558,15 +2592,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] @@ -2593,21 +2621,20 @@ dependencies = [ [[package]] name = "regex" -version = "1.4.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.22" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "remove_dir_all" @@ -2640,7 +2667,7 @@ dependencies = [ "mime", "mime_guess", "percent-encoding", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "rustls 0.18.1", "serde", "serde_json", @@ -2662,13 +2689,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246e9f61b9bb77df069a947682be06e31ac43ea37862e244a69f177694ea6d22" dependencies = [ "base64 0.13.0", - "bytes 1.0.1", + "bytes 1.1.0", "encoding_rs", "futures-core", "futures-util", "http", - "http-body 0.4.2", - "hyper 0.14.11", + "http-body 0.4.3", + "hyper 0.14.12", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -2677,11 +2704,11 @@ dependencies = [ "mime", "native-tls", "percent-encoding", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "serde", "serde_json", "serde_urlencoded", - "tokio 1.9.0", + "tokio 1.11.0", "tokio-native-tls", "url", "wasm-bindgen", @@ -2721,7 +2748,7 @@ dependencies = [ "log", "many-to-many", "mongodb", - "nanoid 0.4.0", + "nanoid", "num_enum", "once_cell", "phf", @@ -2736,7 +2763,7 @@ dependencies = [ "serde_json", "ulid", "url", - "validator", + "validator 0.11.0", "web-push", ] @@ -2785,7 +2812,7 @@ dependencies = [ "atomic", "atty", "binascii", - "bytes 1.0.1", + "bytes 1.1.0", "either", "figment", "futures", @@ -2795,8 +2822,8 @@ dependencies = [ "multer", "num_cpus", "parking_lot", - "pin-project-lite 0.2.4", - "rand 0.8.3", + "pin-project-lite 0.2.7", + "rand 0.8.4", "ref-cast", "rocket_codegen", "rocket_http", @@ -2804,10 +2831,10 @@ dependencies = [ "serde_json", "state", "tempfile", - "time 0.2.25", - "tokio 1.9.0", + "time 0.2.27", + "tokio 1.11.0", "tokio-stream", - "tokio-util 0.6.7", + "tokio-util 0.6.8", "ubyte", "version_check", "yansi", @@ -2864,7 +2891,7 @@ dependencies = [ "cookie", "either", "http", - "hyper 0.14.11", + "hyper 0.14.12", "indexmap", "log", "memchr", @@ -2872,14 +2899,14 @@ dependencies = [ "parking_lot", "pear", "percent-encoding", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "ref-cast", "serde", "smallvec", "stable-pattern", "state", - "time 0.2.25", - "tokio 1.9.0", + "time 0.2.27", + "tokio 1.11.0", "uncased", ] @@ -2897,9 +2924,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_version" @@ -2938,9 +2965,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" [[package]] name = "ryu" @@ -2987,9 +3014,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "sct" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ "ring", "untrusted 0.7.1", @@ -2997,9 +3024,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.0.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1759c2e3c8580017a484a7ac56d3abc5a6c1feadf88db2f3633f12ae4268c69" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" dependencies = [ "bitflags", "core-foundation", @@ -3010,9 +3037,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.0.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f99b9d5e26d2a71633cc4f2ebae7cc9f874044e0c351a27e17892d76dce5678b" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" dependencies = [ "core-foundation-sys", "libc", @@ -3035,9 +3062,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.123" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" dependencies = [ "serde_derive", ] @@ -3053,9 +3080,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.123" +version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2", "quote", @@ -3064,9 +3091,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.62" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea1c6153794552ea7cf7cf63b1231a25de00ec90db326ba6264440fa08e31486" +checksum = "a7f9e390c27c3c0ce8bc5d725f6e4d30a29d26659494aa4b17535f7522c5c950" dependencies = [ "indexmap", "itoa", @@ -3088,21 +3115,22 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.6.2" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42fa8fb0da0bf5aa7dd5d8fe1f9ec769833eb7cf97ff89942903809e600de908" +checksum = "062b87e45d8f26714eacfaef0ed9a583e2bfd50ebd96bdd3c200733bd5758e2c" dependencies = [ + "rustversion", "serde", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1197ff7de45494f290c1e3e1a6f80e108974681984c87a3e480991ef3d0f1950" +checksum = "98c1fcca18d55d1763e1c16873c4bde0ac3ef75179a28c7b372917e0494625be" dependencies = [ - "darling", + "darling 0.13.0", "proc-macro2", "quote", "syn", @@ -3122,13 +3150,13 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.9.3" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4b312c3731e3fe78a185e6b9b911a7aa715b8e31cce117975219aab2acf285d" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpuid-bool", + "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -3141,36 +3169,37 @@ checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" [[package]] name = "sha2" -version = "0.8.2" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +checksum = "9204c41a1597a8c5af23c82d1c921cb01ec0a4c59e07a9c7306062829a3903f3" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", ] [[package]] name = "signal-hook-registry" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "siphasher" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729a25c17d72b06c68cb47955d44fda88ad2d3e7d77e025663fdd69b93dd71a1" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" [[package]] name = "slab" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "smallvec" @@ -3222,9 +3251,9 @@ dependencies = [ [[package]] name = "standback" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2beb4d1860a61f571530b3f855a1b538d0200f7871c63331ecd6f17b1f014f8" +checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" dependencies = [ "version_check", ] @@ -3311,15 +3340,15 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "1.0.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.74" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" +checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84" dependencies = [ "proc-macro2", "quote", @@ -3328,9 +3357,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa" dependencies = [ "proc-macro2", "quote", @@ -3346,9 +3375,9 @@ checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" [[package]] name = "tap" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36474e732d1affd3a6ed582781b3683df3d0563714c59c39591e8ff707cf078e" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" @@ -3358,8 +3387,8 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if 1.0.0", "libc", - "rand 0.8.3", - "redox_syscall 0.2.4", + "rand 0.8.4", + "redox_syscall", "remove_dir_all", "winapi 0.3.9", ] @@ -3375,33 +3404,24 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "thread_local" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" -dependencies = [ - "once_cell", -] - [[package]] name = "time" version = "0.1.44" @@ -3415,9 +3435,9 @@ dependencies = [ [[package]] name = "time" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1195b046942c221454c2539395f85413b33383a067449d78aab2b7b052a142f7" +checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" dependencies = [ "const_fn", "libc", @@ -3440,9 +3460,9 @@ dependencies = [ [[package]] name = "time-macros-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" +checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" dependencies = [ "proc-macro-hack", "proc-macro2", @@ -3453,9 +3473,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" dependencies = [ "tinyvec_macros", ] @@ -3480,25 +3500,25 @@ dependencies = [ "memchr", "mio 0.6.23", "num_cpus", - "pin-project-lite 0.1.11", + "pin-project-lite 0.1.12", "slab", "tokio-macros 0.2.6", ] [[package]] name = "tokio" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7b349f11a7047e6d1276853e612d152f5e8a352c61917887cc2169e2366b4c" +checksum = "b4efe6fc2395938c8155973d7be49fe8d03a843726e285e100a8a383cc0154ce" dependencies = [ "autocfg 1.0.1", - "bytes 1.0.1", + "bytes 1.1.0", "libc", "memchr", "mio 0.7.13", "num_cpus", "once_cell", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "signal-hook-registry", "tokio-macros 1.3.0", "winapi 0.3.9", @@ -3533,7 +3553,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ "native-tls", - "tokio 1.9.0", + "tokio 1.11.0", ] [[package]] @@ -3567,8 +3587,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" dependencies = [ "futures-core", - "pin-project-lite 0.2.4", - "tokio 1.9.0", + "pin-project-lite 0.2.7", + "tokio 1.11.0", ] [[package]] @@ -3591,22 +3611,22 @@ dependencies = [ "futures-core", "futures-sink", "log", - "pin-project-lite 0.1.11", + "pin-project-lite 0.1.12", "tokio 0.2.25", ] [[package]] name = "tokio-util" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" +checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" dependencies = [ - "bytes 1.0.1", + "bytes 1.1.0", "futures-core", "futures-sink", "log", - "pin-project-lite 0.2.4", - "tokio 1.9.0", + "pin-project-lite 0.2.7", + "tokio 1.11.0", ] [[package]] @@ -3618,6 +3638,18 @@ dependencies = [ "serde", ] +[[package]] +name = "totp-lite" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b18009e8be74bfb2e2cc59a63d078d95c042858a1ca1128a294e1f9ce225148b" +dependencies = [ + "digest 0.9.0", + "hmac", + "sha-1 0.9.8", + "sha2", +] + [[package]] name = "tower-service" version = "0.3.1" @@ -3626,43 +3658,44 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d40a22fd029e33300d8d89a5cc8ffce18bb7c587662f54629e94c9de5487f3" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.4", + "pin-project-lite 0.2.7", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "2ca517f43f0fb96e0c3072ed5c275fe5eece87e8cb52f4a77b69226d3b1c9df8" dependencies = [ "lazy_static", ] [[package]] name = "tracing-futures" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project 0.4.27", + "pin-project", "tracing", ] [[package]] name = "trust-dns-proto" -version = "0.19.6" +version = "0.19.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53861fcb288a166aae4c508ae558ed18b53838db728d4d310aad08270a7d4c2b" +checksum = "1cad71a0c0d68ab9941d2fb6e82f8fb2e86d9945b94e1661dd0aaea2b88215a9" dependencies = [ "async-trait", "backtrace", + "cfg-if 1.0.0", "enum-as-inner", "futures", "idna", @@ -3677,11 +3710,10 @@ dependencies = [ [[package]] name = "trust-dns-resolver" -version = "0.19.6" +version = "0.19.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759e8efc40465547b0dfce9500d733c65f969a4cbbfbe3ccf68daaa46ef179e" +checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" dependencies = [ - "backtrace", "cfg-if 0.1.10", "futures", "ipconfig", @@ -3715,7 +3747,7 @@ dependencies = [ "input_buffer", "log", "rand 0.7.3", - "sha-1 0.9.3", + "sha-1 0.9.8", "url", "utf-8", ] @@ -3743,9 +3775,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" [[package]] name = "ubyte" @@ -3810,33 +3842,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] +checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" [[package]] name = "unicode-normalization" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "untrusted" @@ -3864,9 +3893,9 @@ dependencies = [ [[package]] name = "utf-8" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" @@ -3874,7 +3903,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.2", + "getrandom 0.2.3", ] [[package]] @@ -3891,7 +3920,23 @@ dependencies = [ "serde_json", "url", "validator_derive", - "validator_types", + "validator_types 0.11.0", +] + +[[package]] +name = "validator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0f08911ab0fee2c5009580f04615fa868898ee57de10692a45da0c3bcc3e5e" +dependencies = [ + "idna", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_types 0.14.0", ] [[package]] @@ -3907,7 +3952,7 @@ dependencies = [ "quote", "regex", "syn", - "validator_types", + "validator_types 0.11.0", ] [[package]] @@ -3917,31 +3962,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "add324da7950ac1f76b1c16ce8b5406147953d5d6a2ac1c5da93785f2cfc738b" [[package]] -name = "value-bag" -version = "1.0.0-alpha.6" +name = "validator_types" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b676010e055c99033117c2343b33a40a30b91fecd6c49055ac9cd2d6c305ab1" +checksum = "ded9d97e1d42327632f5f3bae6403c04886e2de3036261ef42deebd931a6a291" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "value-bag" +version = "1.0.0-alpha.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd320e1520f94261153e96f7534476ad869c14022aee1e59af7c778075d840ae" dependencies = [ "ctor", + "version_check", ] [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" - -[[package]] -name = "vec-arena" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "waker-fn" @@ -3973,9 +4023,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" +checksum = "5e68338db6becec24d3c7977b5bf8a48be992c934b5d07177e3931f5dc9b076c" dependencies = [ "cfg-if 1.0.0", "serde", @@ -3985,9 +4035,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" +checksum = "f34c405b4f0658583dba0c1c7c9b694f3cac32655db463b56c254a1c75269523" dependencies = [ "bumpalo", "lazy_static", @@ -4000,9 +4050,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.20" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94" +checksum = "a87d738d4abc4cf22f6eb142f5b9a81301331ee3c767f2fef2fda4e325492060" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4012,9 +4062,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" +checksum = "b9d5a6580be83b19dc570a8f9c324251687ab2184e57086f71625feb57ec77c8" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4022,9 +4072,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" +checksum = "e3775a030dc6f5a0afd8a84981a21cc92a781eb429acef9ecce476d0c9113e92" dependencies = [ "proc-macro2", "quote", @@ -4035,9 +4085,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" +checksum = "c279e376c7a8e8752a8f1eaa35b7b0bee6bb9fb0cdacfa97cc3f1f289c87e2b4" [[package]] name = "web-push" @@ -4066,9 +4116,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.47" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c40dc691fc48003eba817c38da7113c15698142da971298003cac3ef175680b3" +checksum = "0a84d70d1ec7d2da2d26a5bd78f4bca1b8c3254805363ce743b7a05bc30d195a" dependencies = [ "js-sys", "wasm-bindgen", @@ -4084,15 +4134,6 @@ dependencies = [ "untrusted 0.7.1", ] -[[package]] -name = "webpki-roots" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4" -dependencies = [ - "webpki", -] - [[package]] name = "webpki-roots" version = "0.20.0" @@ -4103,10 +4144,19 @@ dependencies = [ ] [[package]] -name = "wepoll-sys" -version = "3.0.1" +name = "webpki-roots" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb14dea929042224824779fbc82d9fab8d2e6d3cbc0ac404de8edf489e77ff" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" dependencies = [ "cc", ] @@ -4178,6 +4228,37 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "wither" +version = "0.9.0" +source = "git+https://github.com/insertish/wither?branch=master#25226946ff9a2cafac390968b317df83eaafe31f" +dependencies = [ + "async-trait", + "chrono", + "futures", + "log", + "mongodb", + "serde", + "thiserror", + "ulid", + "wither_derive", +] + +[[package]] +name = "wither_derive" +version = "0.9.0" +source = "git+https://github.com/insertish/wither?branch=master#25226946ff9a2cafac390968b317df83eaafe31f" +dependencies = [ + "Inflector", + "async-trait", + "darling 0.10.2", + "proc-macro-error", + "proc-macro2", + "quote", + "serde", + "syn", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index b3c02b41..f6ff533c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ edition = "2018" [dependencies] # Utility +url = "2.2.2" log = "0.4.11" dotenv = "0.15.0" linkify = "0.6.0" @@ -18,7 +19,6 @@ once_cell = "1.4.1" env_logger = "0.7.1" lazy_static = "1.4.0" ctrlc = { version = "3.0", features = ["termination"] } -url = "2.2.2" # Lang. Utilities regex = "1" @@ -48,7 +48,7 @@ async-std = { version = "1.8.0", features = ["tokio1", "tokio02", "attributes"] web-push = "0.7.2" many-to-many = "0.1.2" lettre = "0.10.0-alpha.4" -rauth = { git = "https://github.com/insertish/rauth", rev = "19bef300ecc269c028e3d746f0a2f09842d3b37b" } +rauth = { git = "https://github.com/insertish/rauth", rev = "ad2f5ad1657f4b20c8e483cc1d6c513ff9b22ae1" } hive_pubsub = { git = "https://gitlab.insrt.uk/insert/hive", rev = "a89826df2b30166220e68a6ed01a58b751456604", features = ["mongo"] } # web diff --git a/assets/templates/reset.txt b/assets/templates/reset.txt new file mode 100644 index 00000000..6da746ec --- /dev/null +++ b/assets/templates/reset.txt @@ -0,0 +1,5 @@ +You requested a password reset, if you did not perform this action you can safely ignore this email. + +Reset your password here: {{url}} + +Sent by Revolt. \ No newline at end of file diff --git a/assets/templates/verify.txt b/assets/templates/verify.txt new file mode 100644 index 00000000..7bfbd58e --- /dev/null +++ b/assets/templates/verify.txt @@ -0,0 +1,6 @@ +You're almost there! +If you did not perform this action you can safely ignore this email. + +Please verify your account here: {{url}} + +Sent by Revolt. \ No newline at end of file diff --git a/set_version.sh b/set_version.sh index ff61a82a..783f4f68 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.2-alpha.2 +export version=0.5.3-alpha.1 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/channel.rs b/src/database/entities/channel.rs index a1ba6c4a..a0c7ed1f 100644 --- a/src/database/entities/channel.rs +++ b/src/database/entities/channel.rs @@ -13,14 +13,6 @@ use mongodb::{ use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct LastMessage { - #[serde(rename = "_id")] - id: String, - author: String, - short: String, -} - #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "channel_type")] pub enum Channel { @@ -36,7 +28,7 @@ pub enum Channel { active: bool, recipients: Vec, #[serde(skip_serializing_if = "Option::is_none")] - last_message: Option, + last_message_id: Option, }, Group { #[serde(rename = "_id")] @@ -53,7 +45,7 @@ pub enum Channel { #[serde(skip_serializing_if = "Option::is_none")] icon: Option, #[serde(skip_serializing_if = "Option::is_none")] - last_message: Option, + last_message_id: Option, #[serde(skip_serializing_if = "Option::is_none")] permissions: Option, @@ -75,7 +67,7 @@ pub enum Channel { #[serde(skip_serializing_if = "Option::is_none")] icon: Option, #[serde(skip_serializing_if = "Option::is_none")] - last_message: Option, + last_message_id: Option, #[serde(skip_serializing_if = "Option::is_none")] default_permissions: Option, diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 468c2aba..c853841e 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -8,15 +8,13 @@ use crate::{ use futures::StreamExt; use mongodb::options::UpdateOptions; use mongodb::{ - bson::{doc, to_bson, DateTime}, - options::FindOptions, + bson::{doc, to_bson, DateTime, Document}, }; +use rauth::entities::{Model, Session}; use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; use ulid::Ulid; -use web_push::{ - ContentEncoding, SubscriptionInfo, VapidSignatureBuilder, WebPushClient, WebPushMessageBuilder, -}; +use web_push::{ContentEncoding, SubscriptionInfo, SubscriptionKeys, VapidSignatureBuilder, WebPushClient, WebPushMessageBuilder}; use std::time::SystemTime; #[derive(Serialize, Deserialize, Debug, Clone)] @@ -173,7 +171,6 @@ impl Message { nonce: None, channel, author, - content, attachments: None, edited: None, @@ -198,76 +195,19 @@ impl Message { let ss = self.clone(); let c_clone = channel.clone(); async_std::task::spawn(async move { - let mut set = if let Content::Text(text) = &ss.content { - doc! { - "last_message": { - "_id": ss.id.clone(), - "author": ss.author.clone(), - "short": text.chars().take(128).collect::() - } - } - } else { - doc! {} - }; - // ! MARK AS ACTIVE - // ! FIXME: temp code + let last_message_id = ss.id.clone(); + let mut set = doc! { "last_message_id": last_message_id }; + let channels = get_collection("channels"); match &c_clone { Channel::DirectMessage { id, .. } => { + // ! MARK AS ACTIVE set.insert("active", true); - channels - .update_one( - doc! { "_id": id }, - doc! { - "$set": set - }, - None, - ) - .await - /*.map_err(|_| Error::DatabaseError { - operation: "update_one", - with: "channel", - })?;*/ - .unwrap(); - } - Channel::Group { id, .. } => { - if let Content::Text(_) = &ss.content { - channels - .update_one( - doc! { "_id": id }, - doc! { - "$set": set - }, - None, - ) - .await - /*.map_err(|_| Error::DatabaseError { - operation: "update_one", - with: "channel", - })?;*/ - .unwrap(); - } - } - Channel::TextChannel { id, .. } => { - if let Content::Text(_) = &ss.content { - channels - .update_one( - doc! { "_id": id }, - doc! { - "$set": { - "last_message": &ss.id - } - }, - None, - ) - .await - /*.map_err(|_| Error::DatabaseError { - operation: "update_one", - with: "channel", - })?;*/ - .unwrap(); - } + update_channels_last_message(&channels, id, &set).await; + }, + Channel::Group { id, .. } | Channel::TextChannel { id, .. } => { + update_channels_last_message(&channels, id, &set).await; } _ => {} } @@ -335,60 +275,47 @@ impl Message { } // Fetch their corresponding sessions. - if let Ok(mut cursor) = get_collection("accounts") - .find( - doc! { - "_id": { - "$in": target_ids - }, - "sessions.subscription": { - "$exists": true - } - }, - FindOptions::builder() - .projection(doc! { "sessions": 1 }) - .build(), - ) - .await - { - let mut subscriptions = vec![]; - while let Some(result) = cursor.next().await { - if let Ok(doc) = result { - if let Ok(sessions) = doc.get_array("sessions") { - for session in sessions { - if let Some(doc) = session.as_document() { - if let Ok(sub) = doc.get_document("subscription") { - let endpoint = sub.get_str("endpoint").unwrap().to_string(); - let p256dh = sub.get_str("p256dh").unwrap().to_string(); - let auth = sub.get_str("auth").unwrap().to_string(); - - subscriptions - .push(SubscriptionInfo::new(endpoint, p256dh, auth)); - } - } + if target_ids.len() > 0 { + if let Ok(mut cursor) = Session::find( + &get_db(), + doc! { + "_id": { + "$in": target_ids + }, + "subscription": { + "$exists": true } - } - } - } - - if subscriptions.len() > 0 { + }, + None + ) + .await { let enc = serde_json::to_string(&PushNotification::new(self, &c_clone).await).unwrap(); let client = WebPushClient::new(); let key = base64::decode_config(VAPID_PRIVATE_KEY.clone(), base64::URL_SAFE).unwrap(); - for subscription in subscriptions { - let mut builder = WebPushMessageBuilder::new(&subscription).unwrap(); - let sig_builder = VapidSignatureBuilder::from_pem( - std::io::Cursor::new(&key), - &subscription, - ) - .unwrap(); - let signature = sig_builder.build().unwrap(); - builder.set_vapid_signature(signature); - builder.set_payload(ContentEncoding::AesGcm, enc.as_bytes()); - let m = builder.build().unwrap(); - client.send(m).await.ok(); + while let Some(Ok(session)) = cursor.next().await { + if let Some(sub) = session.subscription { + let subscription = SubscriptionInfo { + endpoint: sub.endpoint, + keys: SubscriptionKeys { + auth: sub.auth, + p256dh: sub.p256dh + } + }; + + let mut builder = WebPushMessageBuilder::new(&subscription).unwrap(); + let sig_builder = VapidSignatureBuilder::from_pem( + std::io::Cursor::new(&key), + &subscription, + ) + .unwrap(); + let signature = sig_builder.build().unwrap(); + builder.set_vapid_signature(signature); + builder.set_payload(ContentEncoding::AesGcm, enc.as_bytes()); + let m = builder.build().unwrap(); + client.send(m).await.ok(); + } } } } @@ -482,7 +409,7 @@ impl Message { let attachment_ids: Vec = attachments.iter().map(|f| f.id.to_string()).collect(); get_collection("attachments") - .update_one( + .update_many( doc! { "_id": { "$in": attachment_ids @@ -497,7 +424,7 @@ impl Message { ) .await .map_err(|_| Error::DatabaseError { - operation: "update_one", + operation: "update_many", with: "attachment", })?; } @@ -505,3 +432,15 @@ impl Message { Ok(()) } } + +async fn update_channels_last_message(channels: &Collection, channel_id: &String, set: &Document) { + channels + .update_one( + doc! { "_id": channel_id }, + doc! { "$set": set }, + None, + ) + .await + .expect("Server should not run with no, or a corrupted db"); + +} diff --git a/src/database/entities/microservice/january.rs b/src/database/entities/microservice/january.rs index 39df9ef0..28820451 100644 --- a/src/database/entities/microservice/january.rs +++ b/src/database/entities/microservice/january.rs @@ -1,6 +1,7 @@ use crate::util::{ result::{Error, Result}, variables::JANUARY_URL, + variables::MAX_EMBED_COUNT, }; use linkify::{LinkFinder, LinkKind}; use regex::Regex; @@ -46,6 +47,9 @@ pub enum Special { None, YouTube { id: String, + + #[serde(skip_serializing_if = "Option::is_none")] + timestamp: Option, }, Twitch { content_type: TwitchType, @@ -100,11 +104,15 @@ impl Embed { pub async fn generate(content: String) -> Result> { lazy_static! { static ref RE_CODE: Regex = Regex::new("```(?:.|\n)+?```|`(?:.|\n)+?`").unwrap(); + static ref RE_IGNORED: Regex = Regex::new("()").unwrap(); } // Ignore code blocks. let content = RE_CODE.replace_all(&content, ""); + // Ignore all content between angle brackets starting with http. + let content = RE_IGNORED.replace_all(&content, ""); + let content = content // Ignore quoted lines. .split("\n") @@ -120,35 +128,55 @@ impl Embed { .collect::>() .join("\n"); - // ! FIXME: allow multiple links - // ! FIXME: prevent generation if link is surrounded with < > let mut finder = LinkFinder::new(); finder.kinds(&[LinkKind::Url]); - let links: Vec<_> = finder.links(&content).collect(); + let links: Vec<_> = finder.links(&content).take(*MAX_EMBED_COUNT).collect(); if links.len() == 0 { return Err(Error::LabelMe); } - let link = &links[0]; + let mut embeds: Vec = Vec::new(); - let client = reqwest::Client::new(); - let result = client - .get(&format!("{}/embed", *JANUARY_URL)) - .query(&[("url", link.as_str())]) - .send() - .await; + let mut link_index = 0; - match result { - Err(_) => return Err(Error::LabelMe), - Ok(result) => match result.status() { - reqwest::StatusCode::OK => { - let res: Embed = result.json().await.map_err(|_| Error::InvalidOperation)?; + // ! FIXME: batch request to january? + while link_index < links.len() { + let link = &links[link_index]; - Ok(vec![res]) - } - _ => return Err(Error::LabelMe), - }, + // Check if we already processed this link. + if link_index != 0 && links.iter().take(link_index).any(|x| x.as_str() == link.as_str()) { + link_index = link_index + 1; + continue; + } + + let client = reqwest::Client::new(); + let result = client + .get(&format!("{}/embed", *JANUARY_URL)) + .query(&[("url", link.as_str())]) + .send() + .await; + + if result.is_err() { + link_index = link_index + 1; + continue; + } + + let response = result.unwrap(); + if response.status().is_success() { + let res: Embed = response.json().await.map_err(|_| Error::InvalidOperation)?; + + embeds.push(res); + } + + link_index = link_index + 1; + } + + // Prevent database update when no embeds are found. + if embeds.len() > 0 { + Ok(embeds) + } else { + Err(Error::LabelMe) } } } diff --git a/src/database/entities/server.rs b/src/database/entities/server.rs index 14cb3945..dd09a2a3 100644 --- a/src/database/entities/server.rs +++ b/src/database/entities/server.rs @@ -92,7 +92,7 @@ pub struct Server { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, - + pub channels: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub categories: Option>, @@ -108,6 +108,9 @@ pub struct Server { #[serde(skip_serializing_if = "Option::is_none")] pub banner: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub flags: Option, + #[serde(skip_serializing_if = "if_false", default)] pub nsfw: bool } diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs index 3873c995..8d06463f 100644 --- a/src/database/entities/user.rs +++ b/src/database/entities/user.rs @@ -16,6 +16,7 @@ use crate::database::*; use crate::notifications::websocket::is_online; use crate::util::result::{Error, Result}; use crate::util::variables::EARLY_ADOPTER_BADGE; +use crate::util::variables::MAX_SERVER_COUNT; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub enum RelationshipStatus { @@ -323,4 +324,10 @@ impl User { .collect::>() .await) } + + /// Check if this user can acquire another server. + pub async fn can_acquire_server(id: &str) -> Result { + let server_ids = User::fetch_server_ids(&id).await?; + Ok(server_ids.len() < *MAX_SERVER_COUNT) + } } diff --git a/src/database/guards/user.rs b/src/database/guards/user.rs index 2f498849..48253b84 100644 --- a/src/database/guards/user.rs +++ b/src/database/guards/user.rs @@ -1,7 +1,7 @@ use crate::database::*; use mongodb::bson::{doc, from_document}; -use rauth::auth::Session; +use rauth::entities::Session; use rocket::http::Status; use rocket::request::{self, FromRequest, Outcome, Request}; @@ -15,7 +15,7 @@ impl<'r> FromRequest<'r> for User { .get("x-bot-token") .next() .map(|x| x.to_string()); - + if let Some(bot_token) = header_bot_token { return if let Ok(result) = get_collection("bots") .find_one( @@ -40,7 +40,10 @@ impl<'r> FromRequest<'r> for User { if let Some(doc) = result { Outcome::Success(from_document(doc).unwrap()) } else { - Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + Outcome::Failure(( + Status::Forbidden, + rauth::util::Error::InvalidSession, + )) } } else { Outcome::Failure(( @@ -62,32 +65,34 @@ impl<'r> FromRequest<'r> for User { with: "bot", }, )) - } + }; } else { - let session: Session = request.guard::().await.unwrap(); - - if let Ok(result) = get_collection("users") - .find_one( - doc! { - "_id": &session.user_id - }, - None, - ) - .await - { - if let Some(doc) = result { - Outcome::Success(from_document(doc).unwrap()) + if let Outcome::Success(session) = request.guard::().await { + if let Ok(result) = get_collection("users") + .find_one( + doc! { + "_id": &session.user_id + }, + None, + ) + .await + { + if let Some(doc) = result { + Outcome::Success(from_document(doc).unwrap()) + } else { + Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + } } else { - Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) + Outcome::Failure(( + Status::InternalServerError, + rauth::util::Error::DatabaseError { + operation: "find_one", + with: "user", + }, + )) } } else { - Outcome::Failure(( - Status::InternalServerError, - rauth::util::Error::DatabaseError { - operation: "find_one", - with: "user", - }, - )) + Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession)) } } } diff --git a/src/database/migrations/init.rs b/src/database/migrations/init.rs index 7bb929a8..4dae83a4 100644 --- a/src/database/migrations/init.rs +++ b/src/database/migrations/init.rs @@ -71,39 +71,6 @@ pub async fn create_database() { .await .expect("Failed to create pubsub collection."); - db.run_command( - doc! { - "createIndexes": "accounts", - "indexes": [ - { - "key": { - "email": 1 - }, - "name": "email", - "unique": true, - "collation": { - "locale": "en", - "strength": 2 - } - }, - { - "key": { - "email_normalised": 1 - }, - "name": "email_normalised", - "unique": true, - "collation": { - "locale": "en", - "strength": 2 - } - } - ] - }, - None, - ) - .await - .expect("Failed to create account index."); - db.run_command( doc! { "createIndexes": "users", diff --git a/src/database/migrations/mod.rs b/src/database/migrations/mod.rs index 0067518b..8470444d 100644 --- a/src/database/migrations/mod.rs +++ b/src/database/migrations/mod.rs @@ -10,10 +10,13 @@ pub async fn run_migrations() { .list_database_names(None, None) .await .expect("Failed to fetch database names."); - + if list.iter().position(|x| x == "revolt").is_none() { init::create_database().await; } else { scripts::migrate_database().await; } + + // panic!("https://pbs.twimg.com/media/EDTpB5JWwAUvyxd.jpg"); + rauth::entities::sync_models(&super::get_db()).await; } diff --git a/src/database/migrations/scripts.rs b/src/database/migrations/scripts.rs index 14e30e8c..c4e6bfbb 100644 --- a/src/database/migrations/scripts.rs +++ b/src/database/migrations/scripts.rs @@ -2,7 +2,7 @@ use crate::database::{permissions, get_collection, get_db, PermissionTuple}; use futures::StreamExt; use log::info; -use mongodb::{bson::{doc, from_document, to_document}, options::FindOptions}; +use mongodb::{bson::{Document, doc, from_bson, from_document, to_document}, options::FindOptions}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] @@ -11,7 +11,7 @@ struct MigrationInfo { revision: i32, } -pub const LATEST_REVISION: i32 = 8; +pub const LATEST_REVISION: i32 = 10; pub async fn migrate_database() { let migrations = get_collection("migrations"); @@ -212,6 +212,138 @@ pub async fn run_migrations(revision: i32) -> i32 { .expect("Failed to create bots collection."); } + if revision <= 8 { + info!("Running migration [revision 8 / 2021-09-10]: Update to rAuth version 1."); + + get_db() + .run_command( + doc! { + "dropIndexes": "accounts", + "index": ["email", "email_normalised"] + }, + None, + ) + .await + .expect("Failed to delete legacy account indexes."); + + let col = get_collection("sessions"); + let mut cursor = get_collection("accounts") + .find(doc! { }, None) + .await + .unwrap(); + + while let Some(doc) = cursor.next().await { + if let Ok(account) = doc { + let id = account.get_str("_id").unwrap(); + if let Some(sessions) = account.get("sessions") { + #[derive(Deserialize)] + struct Session { + id: String, + token: String, + friendly_name: String, + subscription: Option, + } + + let sessions = from_bson::>(sessions.clone()).unwrap(); + for session in sessions { + info!("Converting session {} to new format.", &session.id); + + let mut doc = doc! { + "_id": session.id, + "token": session.token, + "user_id": id.clone(), + "name": session.friendly_name, + }; + + if let Some(sub) = session.subscription { + doc.insert("subscription", sub); + } + + col.insert_one(doc, None).await.ok(); + } + } else { + info!("Account doesn't have any sessions!"); + } + } + } + + get_collection("accounts") + .update_many( + doc! { }, + doc! { + "$unset": { + "sessions": 1, + }, + "$set": { + "mfa": { + "recovery_codes": [] + } + } + }, + None + ) + .await + .unwrap(); + } + + if revision <= 9 { + info!("Running migration [revision 9 / 2021-09-14]: Switch from last_message to last_message_id."); + + let mut cursor = get_collection("channels") + .find(doc! { }, None) + .await + .unwrap(); + + while let Some(doc) = cursor.next().await { + if let Ok(channel) = doc { + let channel_id = channel.get_str("_id").unwrap(); + if let Some(last_message) = channel.get("last_message") { + #[derive(Serialize, Deserialize, Debug, Clone)] + pub struct Obj { + #[serde(rename = "_id")] + id: String, + } + + #[derive(Serialize, Deserialize, Debug, Clone)] + #[serde(untagged)] + pub enum LastMessage { + Obj(Obj), + Id(String) + } + + let lm = from_bson::(last_message.clone()).unwrap(); + let id = match lm { + LastMessage::Obj(Obj { id }) => id, + LastMessage::Id(id) => id + }; + + info!("Converting session {} to new format.", &channel_id); + get_collection("channels") + .update_one( + doc! { + "_id": channel_id + }, + doc! { + "$set": { + "last_message_id": id + }, + "$unset": { + "last_message": 1, + } + }, + None + ) + .await + .unwrap(); + } else { + info!("{} has no last_message.", &channel_id); + } + } + } + } + + // Need to migrate fields on attachments, change `user_id`, `object_id`, etc to `parent`. + // Reminder to update LATEST_REVISION when adding new migrations. LATEST_REVISION } diff --git a/src/main.rs b/src/main.rs index d0756e0c..ea939b6d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,20 +21,18 @@ pub mod util; pub mod version; use async_std::task; -use chrono::Duration; use futures::join; use log::info; -use rauth::options::{EmailVerification, Options, SMTP}; use rauth::{ - auth::Auth, - options::{Template, Templates}, + config::{Captcha, Config, EmailVerification, SMTPSettings, Template, Templates}, + logic::Auth, }; -use std::str::FromStr; -use rocket_cors::AllowedOrigins; use rocket::catchers; +use rocket_cors::AllowedOrigins; +use std::str::FromStr; use util::variables::{ - APP_URL, HCAPTCHA_KEY, INVITE_ONLY, PUBLIC_URL, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, - SMTP_USERNAME, USE_EMAIL, USE_HCAPTCHA, + APP_URL, HCAPTCHA_KEY, INVITE_ONLY, SMTP_FROM, SMTP_HOST, SMTP_PASSWORD, SMTP_USERNAME, + USE_EMAIL, USE_HCAPTCHA, }; #[async_std::main] @@ -71,79 +69,67 @@ async fn launch_web() { let cors = rocket_cors::CorsOptions { allowed_origins: AllowedOrigins::All, allowed_methods: [ - "Get", - "Put", - "Post", - "Delete", - "Options", - "Head", - "Trace", - "Connect", - "Patch", + "Get", "Put", "Post", "Delete", "Options", "Head", "Trace", "Connect", "Patch", ] - .iter() - .map(|s| FromStr::from_str(s).unwrap()) - .collect(), + .iter() + .map(|s| FromStr::from_str(s).unwrap()) + .collect(), ..Default::default() } .to_cors() .expect("Failed to create CORS."); - let mut options = Options::new() - .base_url(format!("{}/auth", *PUBLIC_URL)) - .email_verification(if *USE_EMAIL { + let mut config = Config { + email_verification: if *USE_EMAIL { EmailVerification::Enabled { - success_redirect_uri: format!("{}/login", *APP_URL), - welcome_redirect_uri: format!("{}/welcome", *APP_URL), - password_reset_url: Some(format!("{}/login/reset", *APP_URL)), - - verification_expiry: Duration::days(1), - password_reset_expiry: Duration::hours(1), - - templates: Templates { - verify_email: Template { - title: "Verify your Revolt account.", - text: "You're almost there! -If you did not perform this action you can safely ignore this email. - -Please verify your account here: {{url}}", - html: None, - }, - reset_password: Template { - title: "Reset your Revolt password.", - text: "You requested a password reset, if you did not perform this action you can safely ignore this email. - -Reset your password here: {{url}}", - html: None, - }, - welcome: None, - }, - - smtp: SMTP { + smtp: SMTPSettings { from: (*SMTP_FROM).to_string(), host: (*SMTP_HOST).to_string(), username: (*SMTP_USERNAME).to_string(), password: (*SMTP_PASSWORD).to_string(), + reply_to: Some("support@revolt.chat".into()), + port: None, + use_tls: None, + }, + expiry: Default::default(), + templates: Templates { + verify: Template { + title: "Verify your Revolt account.".into(), + text: include_str!("../assets/templates/verify.txt").into(), + url: format!("{}/login/verify/", *APP_URL), + html: None, + }, + reset: Template { + title: "Reset your Revolt password.".into(), + text: include_str!("../assets/templates/reset.txt").into(), + url: format!("{}/login/reset/", *APP_URL), + html: None, + }, + welcome: None, }, } } else { EmailVerification::Disabled - }); + }, + ..Default::default() + }; if *INVITE_ONLY { - options = options.invite_only_collection(database::get_collection("invites")) + config.invite_only = true; } if *USE_HCAPTCHA { - options = options.hcaptcha_secret(HCAPTCHA_KEY.clone()); + config.captcha = Captcha::HCaptcha { + secret: HCAPTCHA_KEY.clone(), + }; } - let auth = Auth::new(database::get_collection("accounts"), options); + let auth = Auth::new(database::get_db(), config); let rocket = rocket::build(); - routes::mount(rocket) .mount("/", rocket_cors::catch_all_options_routes()) - .mount("/auth", rauth::routes::routes()) + .mount("/auth/account", rauth::web::account::routes()) + .mount("/auth/session", rauth::web::session::routes()) .manage(auth) .manage(cors.clone()) .attach(cors) diff --git a/src/notifications/events.rs b/src/notifications/events.rs index 5ec1fc85..314359e5 100644 --- a/src/notifications/events.rs +++ b/src/notifications/events.rs @@ -1,6 +1,5 @@ use hive_pubsub::PubSub; use mongodb::bson::doc; -use rauth::auth::Session; use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; @@ -19,24 +18,24 @@ pub enum WebSocketError { } #[derive(Deserialize, Debug)] -pub struct BotAuth { - pub token: String +pub struct Auth { + pub token: String, } -#[derive(Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Clone)] #[serde(untagged)] -pub enum AuthType { - User(Session), - Bot(BotAuth) +pub enum Ping { + Binary(Vec), + Number(usize) } #[derive(Deserialize, Debug)] #[serde(tag = "type")] pub enum ServerboundNotification { - Authenticate(AuthType), + Authenticate(Auth), BeginTyping { channel: String }, EndTyping { channel: String }, - Ping { data: Vec } + Ping { data: Ping, responded: Option<()> }, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -50,7 +49,7 @@ pub enum RemoveUserField { #[derive(Serialize, Deserialize, Debug, Clone)] pub enum RemoveChannelField { Icon, - Description + Description, } #[derive(Serialize, Deserialize, Debug, Clone)] @@ -85,8 +84,9 @@ pub enum ClientboundNotification { users: Vec, servers: Vec, channels: Vec, - members: Vec + members: Vec, }, + Pong { data: Ping }, Message(Message), MessageUpdate { @@ -159,11 +159,11 @@ pub enum ClientboundNotification { role_id: String, data: Value, #[serde(skip_serializing_if = "Option::is_none")] - clear: Option + clear: Option, }, ServerRoleDelete { id: String, - role_id: String + role_id: String, }, UserUpdate { @@ -222,8 +222,7 @@ pub async fn prehandle_hook(notification: &ClientboundNotification) -> Result<() subscribe_if_exists(recipient.clone(), channel_id.to_string()).ok(); } } - Channel::TextChannel { server, .. } - | Channel::VoiceChannel { server, .. } => { + Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { // ! FIXME: write a better algorithm? let members = Server::fetch_member_ids(server).await?; for member in members { diff --git a/src/notifications/websocket.rs b/src/notifications/websocket.rs index a9a02d60..992c9e68 100644 --- a/src/notifications/websocket.rs +++ b/src/notifications/websocket.rs @@ -1,28 +1,28 @@ use crate::database::*; -use crate::notifications::events::{AuthType, BotAuth}; +use crate::notifications::events::Ping; use crate::util::variables::WS_HOST; use super::subscriptions; use async_std::net::{TcpListener, TcpStream}; use async_std::task; -use async_tungstenite::tungstenite::{Message, handshake::server}; -use futures::channel::{oneshot, mpsc::{unbounded, UnboundedSender}}; +use async_tungstenite::tungstenite::{handshake::server, Message}; +use futures::channel::{ + mpsc::{unbounded, UnboundedSender}, + oneshot, +}; use futures::stream::TryStreamExt; use futures::{pin_mut, prelude::*}; use hive_pubsub::PubSub; use log::{debug, info}; use many_to_many::ManyToMany; use mongodb::bson::doc; -use rauth::{ - auth::{Auth}, - options::Options, -}; +use rauth::entities::{Model, Session}; use rmp_serde; -use url::Url; use std::collections::HashMap; use std::net::SocketAddr; use std::sync::{Arc, Mutex, RwLock}; +use url::Url; use super::{ events::{ClientboundNotification, ServerboundNotification, WebSocketError}, @@ -51,28 +51,43 @@ pub async fn launch_server() { #[derive(Debug, Clone)] enum MSGFormat { JSON, - MSGPACK + MSGPACK, } struct HeaderCallback { - sender: oneshot::Sender + sender: oneshot::Sender, } impl server::Callback for HeaderCallback { - fn on_request(self, request: &server::Request, response: server::Response) -> Result { + fn on_request( + self, + request: &server::Request, + response: server::Response, + ) -> Result { // we dont get some of the data sometimes so im generating a fake url with the only data we actually need - let url = format!("ws://example.com?{}", request.uri().query().unwrap_or("?format=json")); - let mut query: HashMap<_, _> = url.parse::().unwrap().query_pairs().into_owned().collect(); // should be safe to use unwrap here as we just made the url ourself + let url = format!( + "ws://example.com?{}", + request.uri().query().unwrap_or("?format=json") + ); + let mut query: HashMap<_, _> = url + .parse::() + .unwrap() + .query_pairs() + .into_owned() + .collect(); // should be safe to use unwrap here as we just made the url ourself let format_query: Option = query.remove("format"); let format = match format_query.as_deref().unwrap_or("json") { "msgpack" => MSGFormat::MSGPACK, "json" => MSGFormat::JSON, - _ => panic!("unknown format") // TODO: not use panic + _ => MSGFormat::JSON, // Fallback to JSON. }; - self.sender.send(format).unwrap(); // TODO: not use unwrap - Ok(response) + if self.sender.send(format).is_ok() { + Ok(response) + } else { + Err(server::ErrorResponse::new(None)) + } } } @@ -81,12 +96,13 @@ async fn accept(stream: TcpStream) { .peer_addr() .expect("Connected streams should have a peer address."); let (sender, receiver) = oneshot::channel::(); - - let ws_stream = async_tungstenite::accept_hdr_async_with_config(stream, HeaderCallback { sender }, None) - .await - .expect("Error during websocket handshake."); - let msg_format = receiver.await.unwrap(); // TODO: not use unwrap + let ws_stream = + async_tungstenite::accept_hdr_async_with_config(stream, HeaderCallback { sender }, None) + .await + .expect("Error during websocket handshake."); + + let msg_format = receiver.await.unwrap(); // TODO: not use unwrap info!("User established WebSocket connection from {}.", &addr); @@ -102,8 +118,8 @@ async fn accept(stream: TcpStream) { } MSGFormat::MSGPACK => match rmp_serde::to_vec_named(¬ification) { Ok(v) => Message::Binary(v), - Err(_) => return - } + Err(_) => return, + }, }; if let Err(_) = tx.unbounded_send(res) { @@ -118,21 +134,27 @@ async fn accept(stream: TcpStream) { let mutex = mutex_generator(); let maybe_decoded = match msg { - Message::Text(text) => serde_json::from_str::(&text).map_err(|e| e.to_string()), - Message::Binary(vec) => rmp_serde::decode::from_read::<&[u8], ServerboundNotification>(vec.as_slice()).map_err(|e| e.to_string()), - Message::Ping(vec) => Ok(ServerboundNotification::Ping { data: vec }), - _ => return Ok(()) + Message::Text(text) => { + serde_json::from_str::(&text).map_err(|e| e.to_string()) + } + Message::Binary(vec) => { + rmp_serde::decode::from_read::<&[u8], ServerboundNotification>(vec.as_slice()) + .map_err(|e| e.to_string()) + } + Message::Ping(vec) => Ok(ServerboundNotification::Ping { data: Ping::Binary(vec), responded: Some(()) }), + _ => return Ok(()), }; let notification = match maybe_decoded { Err(why) => { send(ClientboundNotification::Error( WebSocketError::MalformedData { - msg: why.to_string() - })); - return Ok(()) - }, - Ok(n) => n + msg: why.to_string(), + }, + )); + return Ok(()); + } + Ok(n) => n, }; match notification { @@ -147,34 +169,20 @@ async fn accept(stream: TcpStream) { } } - if let Some(id) = match auth { - AuthType::User(new_session) => { - if let Ok(validated_session) = - Auth::new(get_collection("accounts"), Options::new()) - .verify_session(new_session) - .await - { - Some(validated_session.user_id.clone()) - } else { - None - } - } - AuthType::Bot(BotAuth { token }) => { - if let Ok(doc) = get_collection("bots") - .find_one( - doc! { "token": token }, - None - ).await { - if let Some(doc) = doc { - Some(doc.get_str("_id").unwrap().to_string()) - } else { - None - } - } else { - None - } - } - } { + let id = if let Ok(Some(session)) = + Session::find_one(&get_db(), doc! { "token": &auth.token }, None).await + { + Some(session.user_id) + } else if let Ok(Some(bot)) = get_collection("bots") + .find_one(doc! { "token": auth.token }, None) + .await + { + Some(bot.get_str("_id").unwrap().to_string()) + } else { + None + }; + + if let Some(id) = id { if let Ok(user) = (Ref { id: id.clone() }).fetch_user().await { let is_invisible = if let Some(status) = &user.status { if let Some(presence) = &status.presence { @@ -229,7 +237,7 @@ async fn accept(stream: TcpStream) { data: json!({ "online": true }), - clear: None + clear: None, } .publish_as_user(id); } @@ -297,8 +305,12 @@ async fn accept(stream: TcpStream) { return Ok(()); } } - ServerboundNotification::Ping { data } => { - info!("Ping received from User {}. Payload: {:?}", &addr, data); + ServerboundNotification::Ping { data, responded } => { + debug!("Ping received from connection {}. Payload: {:?}", &addr, data); + + if responded.is_none() { + send(ClientboundNotification::Pong { data }); + } } } Ok(()) @@ -329,7 +341,7 @@ async fn accept(stream: TcpStream) { data: json!({ "online": false }), - clear: None + clear: None, } .publish_as_user(id); } diff --git a/src/routes/channels/group_create.rs b/src/routes/channels/group_create.rs index 7d0ce530..d70ebb05 100644 --- a/src/routes/channels/group_create.rs +++ b/src/routes/channels/group_create.rs @@ -78,7 +78,7 @@ pub async fn req(user: User, info: Json) -> Result { owner: user.id, recipients: set.into_iter().collect::>(), icon: None, - last_message: None, + last_message_id: None, permissions: None, nsfw: info.nsfw.unwrap_or_default() }; diff --git a/src/routes/invites/invite_join.rs b/src/routes/invites/invite_join.rs index f6a4d834..df80030a 100644 --- a/src/routes/invites/invite_join.rs +++ b/src/routes/invites/invite_join.rs @@ -1,5 +1,6 @@ use crate::database::*; use crate::util::result::{Error, Result}; +use crate::util::variables::MAX_SERVER_COUNT; use rocket::serde::json::Value; @@ -8,6 +9,12 @@ pub async fn req(user: User, target: Ref) -> Result { if user.bot.is_some() { return Err(Error::IsBot) } + + if !User::can_acquire_server(&user.id).await? { + Err(Error::TooManyServers { + max: *MAX_SERVER_COUNT, + })? + } let target = target.fetch_invite().await?; diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 1e647e31..03a2902b 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,7 +1,8 @@ -pub use rocket::response::Redirect; pub use rocket::http::Status; +pub use rocket::response::Redirect; use rocket::{Build, Rocket}; +mod bots; mod channels; mod invites; mod onboard; @@ -10,7 +11,6 @@ mod root; mod servers; mod sync; mod users; -mod bots; pub fn mount(rocket: Rocket) -> Rocket { rocket diff --git a/src/routes/onboard/complete.rs b/src/routes/onboard/complete.rs index 54f2e330..8a51cac4 100644 --- a/src/routes/onboard/complete.rs +++ b/src/routes/onboard/complete.rs @@ -2,7 +2,7 @@ use crate::database::*; use crate::util::result::{Error, Result, EmptyResponse}; use mongodb::bson::doc; -use rauth::auth::Session; +use rauth::entities::Session; use regex::Regex; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; diff --git a/src/routes/onboard/hello.rs b/src/routes/onboard/hello.rs index 050e7561..ca4f1ca8 100644 --- a/src/routes/onboard/hello.rs +++ b/src/routes/onboard/hello.rs @@ -1,6 +1,6 @@ use crate::database::*; -use rauth::auth::Session; +use rauth::entities::Session; use rocket::serde::json::Value; #[get("/hello")] diff --git a/src/routes/push/subscribe.rs b/src/routes/push/subscribe.rs index 2b28b6f2..343e953c 100644 --- a/src/routes/push/subscribe.rs +++ b/src/routes/push/subscribe.rs @@ -1,37 +1,19 @@ use crate::database::*; use crate::util::result::{EmptyResponse, Error, Result}; -use mongodb::bson::{doc, to_document}; -use rauth::auth::Session; +use mongodb::bson::doc; +use rauth::entities::{Model, Session, WebPushSubscription}; use rocket::serde::json::Json; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize)] -pub struct Subscription { - endpoint: String, - p256dh: String, - auth: String, -} #[post("/subscribe", data = "")] -pub async fn req(session: Session, data: Json) -> Result { - let data = data.into_inner(); - get_collection("accounts") - .update_one( - doc! { - "_id": session.user_id, - "sessions.id": session.id.unwrap() - }, - doc! { - "$set": { - "sessions.$.subscription": to_document(&data) - .map_err(|_| Error::DatabaseError { operation: "to_document", with: "subscription" })? - } - }, - None, - ) +pub async fn req(mut session: Session, data: Json) -> Result { + session.subscription = Some(data.into_inner()); + session + .save(&get_db(), None) .await - .map_err(|_| Error::DatabaseError { operation: "update_one", with: "account" })?; - - Ok(EmptyResponse {}) + .map(|_| EmptyResponse) + .map_err(|_| Error::DatabaseError { + operation: "save", + with: "session", + }) } diff --git a/src/routes/push/unsubscribe.rs b/src/routes/push/unsubscribe.rs index 19deaeb9..68521171 100644 --- a/src/routes/push/unsubscribe.rs +++ b/src/routes/push/unsubscribe.rs @@ -1,29 +1,18 @@ use crate::database::*; -use crate::util::result::{Error, Result, EmptyResponse}; +use crate::util::result::{EmptyResponse, Error, Result}; use mongodb::bson::doc; -use rauth::auth::Session; +use rauth::entities::{Model, Session}; #[post("/unsubscribe")] -pub async fn req(session: Session) -> Result { - get_collection("accounts") - .update_one( - doc! { - "_id": session.user_id, - "sessions.id": session.id.unwrap() - }, - doc! { - "$unset": { - "sessions.$.subscription": 1 - } - }, - None, - ) +pub async fn req(mut session: Session) -> Result { + session.subscription = None; + session + .save(&get_db(), None) .await + .map(|_| EmptyResponse) .map_err(|_| Error::DatabaseError { - operation: "to_document", - with: "subscription", - })?; - - Ok(EmptyResponse {}) + operation: "save", + with: "session", + }) } diff --git a/src/routes/root.rs b/src/routes/root.rs index 1b0a15d4..7dae4ff7 100644 --- a/src/routes/root.rs +++ b/src/routes/root.rs @@ -1,7 +1,11 @@ -use crate::util::{ratelimit::RateLimitGuard, variables::{ - APP_URL, AUTUMN_URL, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, JANUARY_URL, USE_AUTUMN, - USE_EMAIL, USE_HCAPTCHA, USE_JANUARY, USE_VOSO, VAPID_PUBLIC_KEY, VOSO_URL, VOSO_WS_HOST, -}}; +use crate::util::{ + ratelimit::RateLimitGuard, + variables::{ + APP_URL, AUTUMN_URL, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, JANUARY_URL, + USE_AUTUMN, USE_EMAIL, USE_HCAPTCHA, USE_JANUARY, USE_VOSO, VAPID_PUBLIC_KEY, VOSO_URL, + VOSO_WS_HOST, + }, +}; use mongodb::bson::doc; use rocket::{http::Status, serde::json::Value}; diff --git a/src/routes/servers/channel_create.rs b/src/routes/servers/channel_create.rs index 12520ed5..abfc4207 100644 --- a/src/routes/servers/channel_create.rs +++ b/src/routes/servers/channel_create.rs @@ -79,7 +79,7 @@ pub async fn req(user: User, target: Ref, info: Json) -> Result { name: info.name, description: info.description, icon: None, - last_message: None, + last_message_id: None, default_permissions: None, role_permissions: HashMap::new(), diff --git a/src/routes/servers/server_create.rs b/src/routes/servers/server_create.rs index 88c664ae..c2a2dcf6 100644 --- a/src/routes/servers/server_create.rs +++ b/src/routes/servers/server_create.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use crate::database::*; use crate::util::result::{Error, Result}; +use crate::util::variables::MAX_SERVER_COUNT; use mongodb::bson::doc; use rocket::serde::json::{Json, Value}; @@ -27,6 +28,12 @@ pub async fn req(user: User, info: Json) -> Result { if user.bot.is_some() { return Err(Error::IsBot) } + + if !User::can_acquire_server(&user.id).await? { + Err(Error::TooManyServers { + max: *MAX_SERVER_COUNT, + })? + } let info = info.into_inner(); info.validate() @@ -77,6 +84,8 @@ pub async fn req(user: User, info: Json) -> Result { icon: None, banner: None, + + flags: None, nsfw: info.nsfw.unwrap_or_default() }; @@ -88,7 +97,7 @@ pub async fn req(user: User, info: Json) -> Result { description: None, icon: None, - last_message: None, + last_message_id: None, default_permissions: None, role_permissions: HashMap::new(), diff --git a/src/routes/sync/get_settings.rs b/src/routes/sync/get_settings.rs index 93bb1d86..bcdc8d80 100644 --- a/src/routes/sync/get_settings.rs +++ b/src/routes/sync/get_settings.rs @@ -14,9 +14,9 @@ pub struct Options { #[post("/settings/fetch", data = "")] pub async fn req(user: User, options: Json) -> Result { if user.bot.is_some() { - return Err(Error::IsBot) + return Err(Error::IsBot); } - + let options = options.into_inner(); let mut projection = doc! { "_id": 0, diff --git a/src/routes/sync/get_unreads.rs b/src/routes/sync/get_unreads.rs index a83149a7..efd41202 100644 --- a/src/routes/sync/get_unreads.rs +++ b/src/routes/sync/get_unreads.rs @@ -7,8 +7,8 @@ use rocket::serde::json::Value; #[get("/unreads")] pub async fn req(user: User) -> Result { if user.bot.is_some() { - return Err(Error::IsBot) + return Err(Error::IsBot); } - + Ok(json!(User::fetch_unreads(&user.id).await?)) } diff --git a/src/routes/sync/set_settings.rs b/src/routes/sync/set_settings.rs index 18f6867b..a4f42d1d 100644 --- a/src/routes/sync/set_settings.rs +++ b/src/routes/sync/set_settings.rs @@ -1,6 +1,6 @@ use crate::database::*; use crate::notifications::events::ClientboundNotification; -use crate::util::result::{Error, Result, EmptyResponse}; +use crate::util::result::{EmptyResponse, Error, Result}; use chrono::prelude::*; use mongodb::bson::{doc, to_bson}; @@ -20,7 +20,7 @@ pub struct Options { #[post("/settings/set?", data = "")] pub async fn req(user: User, data: Json, options: Options) -> Result { if user.bot.is_some() { - return Err(Error::IsBot) + return Err(Error::IsBot); } let data = data.into_inner(); diff --git a/src/routes/users/change_username.rs b/src/routes/users/change_username.rs index 95a08ca5..2c4a8c55 100644 --- a/src/routes/users/change_username.rs +++ b/src/routes/users/change_username.rs @@ -3,9 +3,8 @@ use crate::notifications::events::ClientboundNotification; use crate::util::result::{Error, Result, EmptyResponse}; use mongodb::bson::doc; -use rauth::auth::{Auth, Session}; +use rauth::entities::Account; use regex::Regex; -use rocket::State; use rocket::serde::json::Json; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -26,8 +25,7 @@ pub struct Data { #[patch("/<_ignore_id>/username", data = "")] pub async fn req( - auth: &State, - session: Session, + account: Account, user: User, data: Json, _ignore_id: String, @@ -39,8 +37,7 @@ pub async fn req( data.validate() .map_err(|error| Error::FailedValidation { error })?; - auth.verify_password(&session, data.password.clone()) - .await + account.verify_password(&data.password) .map_err(|_| Error::InvalidCredentials)?; let mut set = doc! {}; diff --git a/src/routes/users/fetch_self.rs b/src/routes/users/fetch_self.rs new file mode 100755 index 00000000..12ba8141 --- /dev/null +++ b/src/routes/users/fetch_self.rs @@ -0,0 +1,9 @@ +use crate::database::*; +use crate::util::result::{Result}; + +use rocket::serde::json::Value; + +#[get("/@me")] +pub async fn req(user: User) -> Result { + Ok(json!(user)) +} diff --git a/src/routes/users/mod.rs b/src/routes/users/mod.rs index c9805545..a28b649b 100644 --- a/src/routes/users/mod.rs +++ b/src/routes/users/mod.rs @@ -14,10 +14,12 @@ mod get_default_avatar; mod open_dm; mod remove_friend; mod unblock_user; +mod fetch_self; pub fn routes() -> Vec { routes![ // User Information + fetch_self::req, fetch_user::req, edit_user::req, change_username::req, diff --git a/src/routes/users/open_dm.rs b/src/routes/users/open_dm.rs index 64bef6a2..18072ab1 100644 --- a/src/routes/users/open_dm.rs +++ b/src/routes/users/open_dm.rs @@ -40,7 +40,7 @@ pub async fn req(user: User, target: Ref) -> Result { id, active: false, recipients: vec![user.id, target.id], - last_message: None, + last_message_id: None, } }; diff --git a/src/util/result.rs b/src/util/result.rs index 6279a598..ddcbe1ab 100644 --- a/src/util/result.rs +++ b/src/util/result.rs @@ -43,6 +43,9 @@ pub enum Error { UnknownServer, InvalidRole, Banned, + TooManyServers{ + max: usize, + }, // ? Bot related errors. ReachedMaximumBots, @@ -111,6 +114,7 @@ impl<'r> Responder<'r, 'static> for Error { Error::UnknownServer => Status::NotFound, Error::InvalidRole => Status::NotFound, Error::Banned => Status::Forbidden, + Error::TooManyServers { .. } => Status::Forbidden, Error::ReachedMaximumBots => Status::BadRequest, Error::IsBot => Status::BadRequest, diff --git a/src/util/variables.rs b/src/util/variables.rs index 8f087a24..198b0ab9 100644 --- a/src/util/variables.rs +++ b/src/util/variables.rs @@ -64,6 +64,10 @@ lazy_static! { env::var("REVOLT_MAX_GROUP_SIZE").unwrap_or_else(|_| "50".to_string()).parse().unwrap(); pub static ref MAX_BOT_COUNT: usize = env::var("REVOLT_MAX_BOT_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap(); + pub static ref MAX_EMBED_COUNT: usize = + env::var("REVOLT_MAX_EMBED_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap(); + pub static ref MAX_SERVER_COUNT: usize = + env::var("REVOLT_MAX_SERVER_COUNT").unwrap_or_else(|_| "100".to_string()).parse().unwrap(); pub static ref EARLY_ADOPTER_BADGE: i64 = env::var("REVOLT_EARLY_ADOPTER_BADGE").unwrap_or_else(|_| "0".to_string()).parse().unwrap(); } diff --git a/src/version.rs b/src/version.rs index 25a82cc9..528324c5 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.2-alpha.2"; +pub const VERSION: &str = "0.5.3-alpha.1";