From 6bf5dbabeebc047d1eb1e62e88d507c876007b78 Mon Sep 17 00:00:00 2001 From: Geometrically <18202329+Geometrically@users.noreply.github.com> Date: Sat, 5 Feb 2022 23:08:30 -0700 Subject: [PATCH] Upgrade to Actix V2, bump SQLX version, code cleanup, intergrate ratelimiter (#288) * Upgrade to Actix V2, bump SQLX version, code cleanup, intergrate ratelimiter * Add pack file path validation * Fix compilation error caused by incorrect merge --- .env | 2 +- Cargo.lock | 1897 +++++++++------------------- Cargo.toml | 21 +- build.rs | 57 +- sqlx-data.json | 226 ++-- src/database/models/categories.rs | 19 +- src/database/models/report_item.rs | 19 +- src/database/models/team_item.rs | 1 - src/database/postgres_database.rs | 32 +- src/file_hosting/mock.rs | 8 +- src/file_hosting/s3_host.rs | 10 +- src/main.rs | 46 +- src/ratelimit/errors.rs | 45 + src/ratelimit/memory.rs | 252 ++++ src/ratelimit/middleware.rs | 279 ++++ src/ratelimit/mod.rs | 64 + src/routes/auth.rs | 4 +- src/routes/maven.rs | 16 +- src/routes/project_creation.rs | 8 +- src/routes/v1/versions.rs | 4 +- src/routes/version_creation.rs | 8 +- src/routes/version_file.rs | 6 +- src/scheduler.rs | 7 +- src/util/auth.rs | 2 +- src/util/ext.rs | 2 +- src/validate/mod.rs | 14 +- src/validate/pack.rs | 17 + 27 files changed, 1417 insertions(+), 1649 deletions(-) create mode 100644 src/ratelimit/errors.rs create mode 100644 src/ratelimit/memory.rs create mode 100644 src/ratelimit/middleware.rs create mode 100644 src/ratelimit/mod.rs diff --git a/.env b/.env index 8385b8f3c..1dfa7e9eb 100644 --- a/.env +++ b/.env @@ -37,6 +37,6 @@ VERSION_INDEX_INTERVAL=1800 GITHUB_CLIENT_ID=none GITHUB_CLIENT_SECRET=none -RATE_LIMIT_IGNORE_IPS='[]' +RATE_LIMIT_IGNORE_IPS='["127.0.0.1"]' WHITELISTED_MODPACK_DOMAINS='["cdn.modrinth.com", "edge.forgecdn.net", "github.com", "raw.githubusercontent.com"]' \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 68f4acb47..b5bb58ea7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,151 +4,103 @@ version = 3 [[package]] name = "actix" -version = "0.10.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be241f88f3b1e7e9a3fbe3b5a8a0f6915b5a1d7ee0d9a248d3376d01068cc60" +checksum = "3720d0064a0ce5c0de7bd93bdb0a6caebab2a9b5668746145d7b3b0c5da02914" dependencies = [ "actix-rt", "actix_derive", "bitflags", - "bytes 0.5.6", - "crossbeam-channel 0.4.4", - "derive_more", - "futures-channel", + "bytes 1.1.0", + "crossbeam-channel", + "futures-core", + "futures-sink", + "futures-task", "futures-util", "log", "once_cell", "parking_lot", - "pin-project 0.4.28", + "pin-project-lite 0.2.8", "smallvec", - "tokio 0.2.25", - "tokio-util 0.3.1", - "trust-dns-proto", - "trust-dns-resolver", + "tokio 1.16.1", + "tokio-util 0.6.9", ] [[package]] name = "actix-codec" -version = "0.3.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78d1833b3838dbe990df0f1f87baf640cf6146e898166afe401839d1b001e570" +checksum = "a36c014a3e811624313b51a227b775ecba55d36ef9462bbaac7d4f13e54c9271" dependencies = [ "bitflags", - "bytes 0.5.6", + "bytes 1.1.0", "futures-core", "futures-sink", "log", - "pin-project 0.4.28", - "tokio 0.2.25", - "tokio-util 0.3.1", -] - -[[package]] -name = "actix-connect" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177837a10863f15ba8d3ae3ec12fac1099099529ed20083a27fdfe247381d0dc" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "derive_more", - "either", - "futures-util", - "http", - "log", - "trust-dns-proto", - "trust-dns-resolver", + "memchr", + "pin-project-lite 0.2.8", + "tokio 1.16.1", + "tokio-util 0.6.9", ] [[package]] name = "actix-cors" -version = "0.5.4" +version = "0.6.0-beta.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36b133d8026a9f209a9aeeeacd028e7451bcca975f592881b305d37983f303d7" +checksum = "d4f1bd0e31c745df129f0e94efd374d21f2a455bcc386c15d78ed9a9e7d4dd50" dependencies = [ + "actix-service", + "actix-utils", "actix-web", "derive_more", "futures-util", "log", "once_cell", - "tinyvec", -] - -[[package]] -name = "actix-files" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51e8a9146c12fce92a6e4c24b8c4d9b05268130bfd8d61bc587e822c32ce689" -dependencies = [ - "actix-service", - "actix-web", - "bitflags", - "bytes 0.5.6", - "derive_more", - "futures-core", - "futures-util", - "log", - "mime", - "mime_guess", - "percent-encoding", - "v_htmlescape", + "smallvec", ] [[package]] name = "actix-http" -version = "2.2.1" +version = "3.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cb8958da437716f3f31b0e76f8daf36554128517d7df37ceba7df00f09622ee" +checksum = "08aac516b88cb8cfbfa834c76b58607ffac75946d947dcb6a9ffc5673e1e875d" dependencies = [ - "actix", "actix-codec", - "actix-connect", "actix-rt", "actix-service", - "actix-threadpool", "actix-utils", - "base64 0.13.0", + "ahash 0.7.6", + "base64", "bitflags", - "brotli2", - "bytes 0.5.6", - "cookie", - "copyless", + "brotli", + "bytes 1.1.0", + "bytestring", "derive_more", - "either", "encoding_rs", "flate2", - "futures-channel", "futures-core", - "futures-util", - "fxhash", - "h2 0.2.7", + "h2 0.3.11", "http", "httparse", - "indexmap", - "itoa", + "httpdate 1.0.2", + "itoa 1.0.1", "language-tags", - "lazy_static", + "local-channel", "log", "mime", "percent-encoding", - "pin-project 1.0.8", - "rand 0.7.3", - "regex", - "serde", - "serde_json", - "serde_urlencoded", - "sha-1", - "slab", - "time 0.2.27", + "pin-project-lite 0.2.8", + "rand 0.8.4", + "sha-1 0.10.0", + "smallvec", + "zstd", ] [[package]] name = "actix-macros" -version = "0.1.3" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ca8ce00b267af8ccebbd647de0d61e0674b6e61185cc7a592ff88772bed655" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ "quote", "syn", @@ -156,47 +108,30 @@ dependencies = [ [[package]] name = "actix-multipart" -version = "0.3.0" +version = "0.4.0-beta.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774bfeb11b54bf9c857a005b8ab893293da4eaff79261a66a9200dab7f5ab6e3" +checksum = "c59b1f14a8b2bc14df9be544d173f5390da5b62d531e406fd0f0ce9b825fea5a" dependencies = [ - "actix-service", "actix-utils", "actix-web", - "bytes 0.5.6", + "bytes 1.1.0", "derive_more", - "futures-util", + "futures-core", "httparse", + "local-waker", "log", "mime", "twoway", ] -[[package]] -name = "actix-ratelimit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cab6838f2c71885e4985a61ab96ea9968121c2a41ef416b76875f61091f7d73" -dependencies = [ - "actix", - "actix-http", - "actix-web", - "backoff", - "dashmap", - "failure", - "futures", - "log", - "r2d2-memcache", - "redis", -] - [[package]] name = "actix-router" -version = "0.2.7" +version = "0.5.0-rc.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad299af73649e1fc893e333ccf86f377751eb95ff875d095131574c6f43452c" +checksum = "cb6506dbef336634ff35d994d58daa0a412ea23751f15f9b4dcac4d594b1ed1f" dependencies = [ "bytestring", + "firestorm", "http", "log", "regex", @@ -205,115 +140,59 @@ dependencies = [ [[package]] name = "actix-rt" -version = "1.1.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227" +checksum = "cdf3f2183be1241ed4dd22611850b85d38de0b08a09f1f7bcccbd0809084b359" dependencies = [ "actix-macros", - "actix-threadpool", - "copyless", - "futures-channel", - "futures-util", - "smallvec", - "tokio 0.2.25", + "futures-core", + "tokio 1.16.1", ] [[package]] name = "actix-server" -version = "1.0.4" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45407e6e672ca24784baa667c5d32ef109ccdd8d5e0b5ebb9ef8a67f4dfb708e" +checksum = "d9e7472ac180abb0a8e592b653744345983a7a14f44691c8394a799d0df4dbbf" dependencies = [ - "actix-codec", "actix-rt", "actix-service", "actix-utils", - "futures-channel", + "futures-core", "futures-util", "log", - "mio 0.6.23", - "mio-uds", + "mio 0.8.0", "num_cpus", - "slab", - "socket2 0.3.19", + "socket2 0.4.4", + "tokio 1.16.1", ] [[package]] name = "actix-service" -version = "1.0.6" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0052435d581b5be835d11f4eb3bce417c8af18d87ddf8ace99f8e67e595882bb" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" dependencies = [ - "futures-util", - "pin-project 0.4.28", -] - -[[package]] -name = "actix-testing" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47239ca38799ab74ee6a8a94d1ce857014b2ac36f242f70f3f75a66f691e791c" -dependencies = [ - "actix-macros", - "actix-rt", - "actix-server", - "actix-service", - "log", - "socket2 0.3.19", -] - -[[package]] -name = "actix-threadpool" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d209f04d002854b9afd3743032a27b066158817965bf5d036824d19ac2cc0e30" -dependencies = [ - "derive_more", - "futures-channel", - "lazy_static", - "log", - "num_cpus", - "parking_lot", - "threadpool", -] - -[[package]] -name = "actix-tls" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24789b7d7361cf5503a504ebe1c10806896f61e96eca9a7350e23001aca715fb" -dependencies = [ - "actix-codec", - "actix-service", - "actix-utils", - "futures-util", + "futures-core", + "paste", + "pin-project-lite 0.2.8", ] [[package]] name = "actix-utils" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9022dec56632d1d7979e59af14f0597a28a830a9c1c7fec8b2327eb9f16b5a" +checksum = "e491cbaac2e7fc788dfff99ff48ef317e23b3cf63dbaf7aaab6418f40f92aa94" dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "bitflags", - "bytes 0.5.6", - "either", - "futures-channel", - "futures-sink", - "futures-util", - "log", - "pin-project 0.4.28", - "slab", + "local-waker", + "pin-project-lite 0.2.8", ] [[package]] name = "actix-web" -version = "3.3.2" +version = "4.0.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e641d4a172e7faa0862241a20ff4f1f5ab0ab7c279f00c2d4587b77483477b86" +checksum = "73170d019de2d82c0d826c1f315c3106134bd764e9247505ba6f0d78d22dfe9e" dependencies = [ "actix-codec", "actix-http", @@ -322,38 +201,39 @@ dependencies = [ "actix-rt", "actix-server", "actix-service", - "actix-testing", - "actix-threadpool", - "actix-tls", "actix-utils", "actix-web-codegen", - "awc", - "bytes 0.5.6", + "ahash 0.7.6", + "bytes 1.1.0", + "cfg-if 1.0.0", + "cookie", "derive_more", "encoding_rs", - "futures-channel", "futures-core", "futures-util", - "fxhash", + "itoa 1.0.1", + "language-tags", "log", "mime", - "pin-project 1.0.8", + "once_cell", + "pin-project-lite 0.2.8", "regex", "serde", "serde_json", "serde_urlencoded", - "socket2 0.3.19", - "time 0.2.27", - "tinyvec", + "smallvec", + "socket2 0.4.4", + "time 0.3.7", "url", ] [[package]] name = "actix-web-codegen" -version = "0.4.0" +version = "0.5.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad26f77093333e0e7c6ffe54ebe3582d908a104e448723eec6d43d08b07143fb" +checksum = "4d0976042e6ddc82c7d0dedd64d39959bc26d9bba098b2f6c32a73fbef784eaf" dependencies = [ + "actix-router", "proc-macro2", "quote", "syn", @@ -361,24 +241,15 @@ dependencies = [ [[package]] name = "actix_derive" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95aceadaf327f18f0df5962fedc1bde2f870566a0b9f65c89508a3b1f79334c" +checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli", -] - [[package]] name = "adler" version = "1.0.2" @@ -393,19 +264,13 @@ checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" [[package]] name = "ahash" -version = "0.4.7" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" - -[[package]] -name = "ahash" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "796540673305a66d127804eef19ad696f1f204b8c1025aaca4958c17eab32877" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.4", "once_cell", - "version_check 0.9.3", + "version_check", ] [[package]] @@ -418,10 +283,19 @@ dependencies = [ ] [[package]] -name = "ascii" -version = "0.9.3" +name = "alloc-no-stdlib" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" +checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +dependencies = [ + "alloc-no-stdlib", +] [[package]] name = "async-channel" @@ -478,7 +352,7 @@ dependencies = [ "parking", "polling", "slab", - "socket2 0.4.2", + "socket2 0.4.4", "waker-fn", "winapi 0.3.9", ] @@ -511,7 +385,7 @@ dependencies = [ "async-global-executor", "async-io", "async-lock", - "crossbeam-utils 0.8.5", + "crossbeam-utils", "futures-channel", "futures-core", "futures-io", @@ -522,7 +396,7 @@ dependencies = [ "memchr", "num_cpus", "once_cell", - "pin-project-lite 0.2.7", + "pin-project-lite 0.2.8", "pin-utils", "slab", "wasm-bindgen-futures", @@ -530,15 +404,15 @@ dependencies = [ [[package]] name = "async-task" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0" +checksum = "677d306121baf53310a3fd342d88dc0824f6bbeace68347593658525565abee8" [[package]] name = "async-trait" -version = "0.1.51" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" +checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" dependencies = [ "proc-macro2", "quote", @@ -592,30 +466,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "awc" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b381e490e7b0cfc37ebc54079b0413d8093ef43d14a4e4747083f7fa47a9e691" -dependencies = [ - "actix-codec", - "actix-http", - "actix-rt", - "actix-service", - "base64 0.13.0", - "bytes 0.5.6", - "cfg-if 1.0.0", - "derive_more", - "futures-core", - "log", - "mime", - "percent-encoding", - "rand 0.7.3", - "serde", - "serde_json", - "serde_urlencoded", -] - [[package]] name = "aws-creds" version = "0.24.1" @@ -623,7 +473,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad53a54cb2c99990e96eefacde6f143dc6d471ab70809d26d360292be421d490" dependencies = [ "attohttpc", - "dirs", + "dirs 3.0.2", "rust-ini", "serde", "serde-xml-rs", @@ -641,43 +491,6 @@ dependencies = [ "simpl", ] -[[package]] -name = "backoff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721c249ab59cbc483ad4294c9ee2671835c1e43e9ffc277e6b4ecfef733cfdc5" -dependencies = [ - "instant", - "rand 0.7.3", -] - -[[package]] -name = "backtrace" -version = "0.3.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base-x" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - [[package]] name = "base64" version = "0.13.0" @@ -699,6 +512,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03588e54c62ae6d763e2a80090d50353b785795361b4ff5b3bf0a5097fc31c0b" +dependencies = [ + "generic-array", +] + [[package]] name = "blocking" version = "1.1.0" @@ -714,45 +536,31 @@ dependencies = [ ] [[package]] -name = "brotli-sys" -version = "0.3.2" +name = "brotli" +version = "3.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" +checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39" dependencies = [ - "cc", - "libc", + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", ] [[package]] -name = "brotli2" -version = "0.3.2" +name = "brotli-decompressor" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" +checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" dependencies = [ - "brotli-sys", - "libc", + "alloc-no-stdlib", + "alloc-stdlib", ] -[[package]] -name = "buf-min" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa17aa1cf56bdd6bb30518767d00e58019d326f3f05d8c3e0730b549d332ea83" -dependencies = [ - "bytes 0.5.6", -] - -[[package]] -name = "build_const" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" - [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" [[package]] name = "byteorder" @@ -804,43 +612,24 @@ dependencies = [ [[package]] name = "cache-padded" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" - -[[package]] -name = "cargo-platform" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714a157da7991e23d90686b9524b9e12e0407a108647f52e9328f4b3d51ac7f" -dependencies = [ - "cargo-platform", - "semver 0.11.0", - "semver-parser 0.10.2", - "serde", - "serde_json", -] +checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] name = "castaway" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed247d1586918e46f2bbe0f13b06498db8dab5a8c1093f156652e9f2e0a73fc3" +checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -868,19 +657,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "combine" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" -dependencies = [ - "ascii", - "byteorder", - "either", - "memchr", - "unreachable", -] - [[package]] name = "concurrent-queue" version = "1.2.2" @@ -890,12 +666,6 @@ dependencies = [ "cache-padded", ] -[[package]] -name = "const_fn" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" - [[package]] name = "convert_case" version = "0.4.0" @@ -904,21 +674,15 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cookie" -version = "0.14.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" +checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" dependencies = [ "percent-encoding", - "time 0.2.27", - "version_check 0.9.3", + "time 0.3.7", + "version_check", ] -[[package]] -name = "copyless" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" - [[package]] name = "core-foundation" version = "0.9.2" @@ -946,71 +710,65 @@ dependencies = [ [[package]] name = "crc" -version = "1.8.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" dependencies = [ - "build_const", + "crc-catalog", ] +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + [[package]] name = "crc32fast" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" +checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "crossbeam-channel" -version = "0.4.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" -dependencies = [ - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", + "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b10ddc024425c88c2ad148c1b0fd53f4c6d38db9697c9f1588381212fa657c9" +checksum = "4dd435b205a4842da59efd07628f921c096bc1cc0a156835b4fa0bcb9a19bcce" dependencies = [ "cfg-if 1.0.0", - "crossbeam-utils 0.8.5", + "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.7.2" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" dependencies = [ - "autocfg", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "lazy_static", ] [[package]] -name = "crossbeam-utils" -version = "0.8.5" +name = "crypto-common" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +checksum = "683d6b536309245c849479fba3da410962a43ed8e51c26b729208ec0ac2798d0" dependencies = [ - "cfg-if 1.0.0", - "lazy_static", + "generic-array", ] [[package]] @@ -1025,9 +783,9 @@ dependencies = [ [[package]] name = "crypto-mac" -version = "0.10.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" +checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" dependencies = [ "generic-array", "subtle", @@ -1045,24 +803,24 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc6d233563261f8db6ffb83bbaad5a73837a6e6b28868e926337ebbdece0be3" +checksum = "7de97b894edd5b5bcceef8b78d7da9b75b1d2f2f9a910569d0bde3dd31d84939" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", - "socket2 0.4.2", + "socket2 0.4.4", "winapi 0.3.9", ] [[package]] name = "curl-sys" -version = "0.4.51+curl-7.80.0" +version = "0.4.52+curl-7.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d130987e6a6a34fe0889e1083022fa48cd90e6709a84be3fb8dd95801de5af20" +checksum = "14b8c2d1023ea5fded5b7b892e4b8e95f70038a421126a056761a84246a28971" dependencies = [ "cc", "libc", @@ -1076,9 +834,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757c0ded2af11d8e739c4daea1ac623dd1624b06c844cf3f5a39f1bdbd99bb12" +checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" dependencies = [ "darling_core", "darling_macro", @@ -1086,9 +844,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c34d8efb62d0c2d7f60ece80f75e5c63c1588ba68032740494b0b9a996466e3" +checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" dependencies = [ "fnv", "ident_case", @@ -1100,9 +858,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade7bff147130fe5e6d39f089c6bd49ec0250f35d70b2eebf72afdfc919f15cc" +checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" dependencies = [ "darling_core", "quote", @@ -1119,16 +877,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "debugid" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91cf5a8c2f2097e2a32627123508635d47ce10563d999ec1a95addf08b502ba" -dependencies = [ - "serde", - "uuid", -] - [[package]] name = "derive_more" version = "0.99.17" @@ -1138,7 +886,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version", "syn", ] @@ -1151,6 +899,17 @@ dependencies = [ "generic-array", ] +[[package]] +name = "digest" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b697d66081d42af4fba142d56918a3cb21dc8eb63372c6b85d14f44fb9c5979b" +dependencies = [ + "block-buffer 0.10.1", + "crypto-common", + "generic-array", +] + [[package]] name = "dirs" version = "3.0.2" @@ -1160,6 +919,15 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-sys" version = "0.3.6" @@ -1171,12 +939,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - [[package]] name = "dlv-list" version = "0.2.3" @@ -1192,12 +954,6 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" -[[package]] -name = "dtoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" - [[package]] name = "either" version = "1.6.1" @@ -1209,37 +965,13 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.29" +version = "0.8.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" +checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "enum-as-inner" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd53b3fde38a39a06b2e66dc282f3e86191e53bd04cc499929c15742beae3df8" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "env_logger" version = "0.8.4" @@ -1255,41 +987,25 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" - -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] +checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" [[package]] name = "fastrand" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" dependencies = [ "instant", ] +[[package]] +name = "firestorm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d3d6188b8804df28032815ea256b6955c9625c24da7525f387a7af02fbb8f01" + [[package]] name = "flate2" version = "1.0.22" @@ -1351,9 +1067,9 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd0210d8c325c245ff06fd95a3b13689a1a276ac8cfa8e8720cb840bfb84b9e" +checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" dependencies = [ "futures-channel", "futures-core", @@ -1366,9 +1082,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc8cd39e3dbf865f7340dce6a2d401d24fd37c6fe6c4f0ee0de8bfca2252d27" +checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" dependencies = [ "futures-core", "futures-sink", @@ -1376,15 +1092,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629316e42fe7c2a0b9a65b47d159ceaa5453ab14e8f0a3c5eedbb8cd55b4a445" +checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" [[package]] name = "futures-executor" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b808bf53348a36cab739d7e04755909b9fcaaa69b7d7e588b37b6ec62704c97" +checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" dependencies = [ "futures-core", "futures-task", @@ -1392,10 +1108,21 @@ dependencies = [ ] [[package]] -name = "futures-io" -version = "0.3.18" +name = "futures-intrusive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e481354db6b5c353246ccf6a728b0c5511d752c08da7260546fc0933869daa11" +checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" [[package]] name = "futures-lite" @@ -1408,15 +1135,15 @@ dependencies = [ "futures-io", "memchr", "parking", - "pin-project-lite 0.2.7", + "pin-project-lite 0.2.8", "waker-fn", ] [[package]] name = "futures-macro" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89f17b21645bc4ed773c69af9c9a0effd4a3f1a3876eadd453469f8854e7fdd" +checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" dependencies = [ "proc-macro2", "quote", @@ -1425,15 +1152,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "996c6442437b62d21a32cd9906f9c41e7dc1e19a9579843fad948696769305af" +checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" [[package]] name = "futures-task" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabf1872aaab32c886832f2276d2f5399887e2bd613698a02359e4ea83f8de12" +checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" [[package]] name = "futures-timer" @@ -1443,9 +1170,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d22213122356472061ac0f1ab2cee28d2bac8491410fd68c2af53d1cedb83e" +checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" dependencies = [ "futures-channel", "futures-core", @@ -1454,28 +1181,19 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.7", + "pin-project-lite 0.2.8", "pin-utils", "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" dependencies = [ "typenum", - "version_check 0.9.3", + "version_check", ] [[package]] @@ -1491,32 +1209,25 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if 1.0.0", "libc", "wasi 0.10.2+wasi-snapshot-preview1", ] -[[package]] -name = "gimli" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" - [[package]] name = "gloo-timers" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47204a46aaff920a1ea58b11d03dec6f704287d27561724a4631e450654a891f" +checksum = "4d12a7f4e95cfe710f1d624fb1210b7d961a5fb05c4fd942f4feab06e61f590e" dependencies = [ "futures-channel", "futures-core", "js-sys", "wasm-bindgen", - "web-sys", ] [[package]] @@ -1561,9 +1272,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.7" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" +checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e" dependencies = [ "bytes 1.1.0", "fnv", @@ -1573,7 +1284,7 @@ dependencies = [ "http", "indexmap", "slab", - "tokio 1.14.0", + "tokio 1.16.1", "tokio-util 0.6.9", "tracing", ] @@ -1588,28 +1299,22 @@ dependencies = [ "autocfg", ] -[[package]] -name = "hashbrown" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" -dependencies = [ - "ahash 0.4.7", -] - [[package]] name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.6", +] [[package]] name = "hashlink" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d99cf782f0dc4372d26846bec3de7804ceb5df083c2d4462c0b8d2330e894fa8" +checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" dependencies = [ - "hashbrown 0.9.1", + "hashbrown 0.11.2", ] [[package]] @@ -1643,39 +1348,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "deae6d9dbb35ec2c502d62b8f7b1c000a0822c3b0794ba36b3149c0a1c840dff" dependencies = [ "crypto-mac 0.9.1", - "digest", + "digest 0.9.0", ] [[package]] name = "hmac" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" dependencies = [ - "crypto-mac 0.10.1", - "digest", -] - -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi 0.3.9", + "crypto-mac 0.11.1", + "digest 0.9.0", ] [[package]] name = "http" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" dependencies = [ "bytes 1.1.0", "fnv", - "itoa", + "itoa 1.0.1", ] [[package]] @@ -1696,7 +1390,7 @@ checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ "bytes 1.1.0", "http", - "pin-project-lite 0.2.7", + "pin-project-lite 0.2.8", ] [[package]] @@ -1738,8 +1432,8 @@ dependencies = [ "http-body 0.3.1", "httparse", "httpdate 0.3.2", - "itoa", - "pin-project 1.0.8", + "itoa 0.4.8", + "pin-project", "socket2 0.3.19", "tokio 0.2.25", "tower-service", @@ -1749,23 +1443,23 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.15" +version = "0.14.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" +checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" dependencies = [ "bytes 1.1.0", "futures-channel", "futures-core", "futures-util", - "h2 0.3.7", + "h2 0.3.11", "http", "http-body 0.4.4", "httparse", "httpdate 1.0.2", - "itoa", - "pin-project-lite 0.2.7", - "socket2 0.4.2", - "tokio 1.14.0", + "itoa 0.4.8", + "pin-project-lite 0.2.8", + "socket2 0.4.4", + "tokio 1.16.1", "tower-service", "tracing", "want", @@ -1791,9 +1485,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes 1.1.0", - "hyper 0.14.15", + "hyper 0.14.16", "native-tls", - "tokio 1.14.0", + "tokio 1.16.1", "tokio-native-tls", ] @@ -1822,9 +1516,9 @@ checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" dependencies = [ "autocfg", "hashbrown 0.11.2", @@ -1848,18 +1542,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ipconfig" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" -dependencies = [ - "socket2 0.3.19", - "widestring", - "winapi 0.3.9", - "winreg 0.6.2", -] - [[package]] name = "ipnet" version = "2.3.1" @@ -1874,7 +1556,7 @@ checksum = "d140e84730d325378912ede32d7cd53ef1542725503b3353e5ec8113c7c6f588" dependencies = [ "async-channel", "castaway", - "crossbeam-utils 0.8.5", + "crossbeam-utils", "curl", "curl-sys", "encoding_rs", @@ -1895,9 +1577,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" dependencies = [ "either", ] @@ -1909,10 +1591,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] -name = "js-sys" -version = "0.3.55" +name = "itoa" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" dependencies = [ "wasm-bindgen", ] @@ -1940,17 +1637,17 @@ dependencies = [ name = "labrinth" version = "0.2.0" dependencies = [ + "actix", "actix-cors", - "actix-files", "actix-multipart", - "actix-ratelimit", "actix-rt", "actix-web", "async-trait", - "base64 0.13.0", + "base64", "bitflags", - "bytes 0.5.6", + "bytes 1.1.0", "chrono", + "dashmap", "dotenv", "env_logger", "futures", @@ -1961,10 +1658,8 @@ dependencies = [ "meilisearch-sdk", "rand 0.7.3", "regex", - "reqwest 0.10.10", + "reqwest 0.11.9", "rust-s3", - "sentry", - "sentry-actix", "serde", "serde_json", "serde_with", @@ -1972,6 +1667,7 @@ dependencies = [ "sha2", "sqlx", "thiserror", + "tokio-stream", "url", "urlencoding", "validator", @@ -1983,9 +1679,9 @@ dependencies = [ [[package]] name = "language-tags" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy_static" @@ -1995,9 +1691,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.108" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" [[package]] name = "libnghttp2-sys" @@ -2022,16 +1718,28 @@ dependencies = [ ] [[package]] -name = "linked-hash-map" -version = "0.5.4" +name = "local-channel" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "6246c68cf195087205a0512559c97e15eaf95198bf0e206d662092cdcb03fe9f" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "902eb695eb0591864543cbfbf6d742510642a605a61fc5e97fe6ceb5a30ac4fb" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] @@ -2046,41 +1754,20 @@ dependencies = [ "value-bag", ] -[[package]] -name = "lru-cache" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - [[package]] name = "matches" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - [[package]] name = "md-5" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" dependencies = [ - "block-buffer", - "digest", + "block-buffer 0.9.0", + "digest 0.9.0", "opaque-debug", ] @@ -2105,20 +1792,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "memcache" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abda83a771818756924a798597a604cb33fde8ad61b49797c353f4505c4a9a83" -dependencies = [ - "byteorder", - "enum_dispatch", - "openssl", - "r2d2", - "rand 0.8.4", - "url", -] - [[package]] name = "memchr" version = "2.4.1" @@ -2190,14 +1863,16 @@ dependencies = [ ] [[package]] -name = "mio-uds" -version = "0.6.8" +name = "mio" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" dependencies = [ - "iovec", "libc", - "mio 0.6.23", + "log", + "miow 0.3.7", + "ntapi", + "winapi 0.3.9", ] [[package]] @@ -2250,16 +1925,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "nom" -version = "4.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -dependencies = [ - "memchr", - "version_check 0.1.5", -] - [[package]] name = "nom" version = "7.1.0" @@ -2268,7 +1933,7 @@ checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" dependencies = [ "memchr", "minimal-lexical", - "version_check 0.9.3", + "version_check", ] [[package]] @@ -2301,28 +1966,28 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", ] [[package]] -name = "object" -version = "0.27.1" +name = "num_threads" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +checksum = "97ba99ba6393e2c3734791401b66902d981cb03bf190af674ca69949b6d5fb15" dependencies = [ - "memchr", + "libc", ] [[package]] name = "once_cell" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" [[package]] name = "opaque-debug" @@ -2346,15 +2011,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.71" +version = "0.9.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df13d165e607909b363a4757a6f133f8a818a74e9d3a98d09c6128e15fa4c73" +checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" dependencies = [ "autocfg", "cc", @@ -2404,55 +2069,32 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "paste" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" + [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - [[package]] name = "pin-project" -version = "0.4.28" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918192b5c59119d51e0cd221f4d49dde9112824ba717369e903c97d076083d0f" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" dependencies = [ - "pin-project-internal 0.4.28", -] - -[[package]] -name = "pin-project" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" -dependencies = [ - "pin-project-internal 1.0.8", + "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "0.4.28" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" dependencies = [ "proc-macro2", "quote", @@ -2467,9 +2109,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" [[package]] name = "pin-utils" @@ -2479,9 +2121,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.22" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" [[package]] name = "polling" @@ -2498,9 +2140,9 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro-error" @@ -2512,7 +2154,7 @@ dependencies = [ "proc-macro2", "quote", "syn", - "version_check 0.9.3", + "version_check", ] [[package]] @@ -2523,60 +2165,27 @@ checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2", "quote", - "version_check 0.9.3", + "version_check", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" dependencies = [ "unicode-xid", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" -version = "1.0.10" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" dependencies = [ "proc-macro2", ] -[[package]] -name = "r2d2" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545c5bc2b880973c9c10e4067418407a0ccaa3091781d1671d46eb35107cb26f" -dependencies = [ - "log", - "parking_lot", - "scheduled-thread-pool", -] - -[[package]] -name = "r2d2-memcache" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b9d7bc44a11909bffe6bf1e4bddae23215ecd6186695e4766d6b57d819f640" -dependencies = [ - "memcache", - "r2d2", -] - [[package]] name = "rand" version = "0.7.3" @@ -2637,7 +2246,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.4", ] [[package]] @@ -2658,26 +2267,6 @@ dependencies = [ "rand_core 0.6.3", ] -[[package]] -name = "redis" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eeb1fe3fc011cde97315f370bc88e4db3c23b08709a04915921e02b1d363b20" -dependencies = [ - "bytes 0.5.6", - "combine", - "dtoa", - "futures-executor", - "futures-util", - "itoa", - "percent-encoding", - "pin-project-lite 0.1.12", - "sha1", - "tokio 0.2.25", - "tokio-util 0.2.0", - "url", -] - [[package]] name = "redox_syscall" version = "0.2.10" @@ -2693,7 +2282,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.4", "redox_syscall", ] @@ -2729,7 +2318,7 @@ version = "0.10.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" dependencies = [ - "base64 0.13.0", + "base64", "bytes 0.5.6", "encoding_rs", "futures-core", @@ -2746,7 +2335,7 @@ dependencies = [ "mime_guess", "native-tls", "percent-encoding", - "pin-project-lite 0.2.7", + "pin-project-lite 0.2.8", "serde", "serde_json", "serde_urlencoded", @@ -2756,23 +2345,24 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.7.0", + "winreg", ] [[package]] name = "reqwest" -version = "0.11.7" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bea77bc708afa10e59905c3d4af7c8fd43c9214251673095ff8b14345fcbc5" +checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" dependencies = [ - "base64 0.13.0", + "base64", "bytes 1.1.0", "encoding_rs", "futures-core", "futures-util", + "h2 0.3.11", "http", "http-body 0.4.4", - "hyper 0.14.15", + "hyper 0.14.16", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -2781,27 +2371,17 @@ dependencies = [ "mime", "native-tls", "percent-encoding", - "pin-project-lite 0.2.7", + "pin-project-lite 0.2.8", "serde", "serde_json", "serde_urlencoded", - "tokio 1.14.0", + "tokio 1.16.1", "tokio-native-tls", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.7.0", -] - -[[package]] -name = "resolv-conf" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" -dependencies = [ - "hostname", - "quick-error", + "winreg", ] [[package]] @@ -2838,7 +2418,7 @@ dependencies = [ "async-std", "aws-creds", "aws-region", - "base64 0.13.0", + "base64", "cfg-if 1.0.0", "chrono", "futures", @@ -2859,46 +2439,22 @@ dependencies = [ "uuid", ] -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.4", + "semver", ] [[package]] name = "rustls" -version = "0.18.1" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ - "base64 0.12.3", + "base64", "log", "ring", "sct", @@ -2907,15 +2463,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" +checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" [[package]] name = "ryu" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" [[package]] name = "schannel" @@ -2927,15 +2483,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "scheduled-thread-pool" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6f74fd1204073fa02d5d5d68bec8021be4c38690b61264b2fdb48083d0e7d7" -dependencies = [ - "parking_lot", -] - [[package]] name = "scopeguard" version = "1.1.0" @@ -2954,9 +2501,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ "bitflags", "core-foundation", @@ -2967,9 +2514,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", @@ -2977,150 +2524,15 @@ dependencies = [ [[package]] name = "semver" -version = "0.9.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser 0.7.0", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser 0.10.2", - "serde", -] - -[[package]] -name = "semver" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[package]] -name = "sentry" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27c425b07c7186018e2ef9ac3a25b01dae78b05a7ef604d07f216b9f59b42b4" -dependencies = [ - "httpdate 0.3.2", - "reqwest 0.11.7", - "sentry-backtrace", - "sentry-contexts", - "sentry-core", - "sentry-log", - "sentry-panic", -] - -[[package]] -name = "sentry-actix" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e598117e51949a9eb8703523582efd09e1440d95b97188e8289ba8f7e297c6f" -dependencies = [ - "actix-web", - "futures-util", - "sentry-core", -] - -[[package]] -name = "sentry-backtrace" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80a5b9d9be0a0e25b2aaa5f3e9815d7fc6b8904f800c41800e5583652b5ca733" -dependencies = [ - "backtrace", - "lazy_static", - "regex", - "sentry-core", -] - -[[package]] -name = "sentry-contexts" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2410b212de9b2eb7427d2bf9a1f4f5cb2aa14359863d982066ead00d6de9bce0" -dependencies = [ - "hostname", - "lazy_static", - "libc", - "regex", - "rustc_version 0.3.3", - "sentry-core", - "uname", -] - -[[package]] -name = "sentry-core" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbbe485e384cb5540940e65d729820ffcbedc0c902fcb27081e44dacfe6a0c34" -dependencies = [ - "lazy_static", - "rand 0.8.4", - "sentry-types", - "serde", - "serde_json", -] - -[[package]] -name = "sentry-log" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "647143f672410ae5f242acd40f9f8f39729aff5ac7e856d91450fdfc30c2e960" -dependencies = [ - "log", - "sentry-core", -] - -[[package]] -name = "sentry-panic" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89cf195cff04a50b90e6b9ac8b4874dc63b8e0a466f193702801ef98baa9bd90" -dependencies = [ - "sentry-backtrace", - "sentry-core", -] - -[[package]] -name = "sentry-types" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5e777cff85b44538ac766a9604676b7180d01d2566e76b2ac41426c734498c" -dependencies = [ - "chrono", - "debugid", - "serde", - "serde_json", - "thiserror", - "url", - "uuid", -] +checksum = "0486718e92ec9a68fbed73bb5ef687d71103b142595b406835649bebd33f72c7" [[package]] name = "serde" -version = "1.0.130" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] @@ -3139,9 +2551,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.130" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", @@ -3150,24 +2562,24 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.72" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" dependencies = [ "indexmap", - "itoa", + "itoa 1.0.1", "ryu", "serde", ] [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa", + "itoa 1.0.1", "ryu", "serde", ] @@ -3201,29 +2613,49 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", + "digest 0.9.0", "opaque-debug", ] [[package]] -name = "sha1" -version = "0.6.0" +name = "sha-1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.1", +] + +[[package]] +name = "sha1" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "sha2" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ - "block-buffer", + "block-buffer 0.9.0", "cfg-if 1.0.0", "cpufeatures", - "digest", + "digest 0.9.0", "opaque-debug", ] @@ -3261,9 +2693,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "socket2" @@ -3278,9 +2710,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", "winapi 0.3.9", @@ -3299,15 +2731,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" dependencies = [ "itertools", - "nom 7.1.0", + "nom", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.4.2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a98f9bf17b690f026b6fec565293a995b46dfbd6293debcb654dcffd2d1b34" +checksum = "692749de69603d81e016212199d73a2e14ee20e2def7d7914919e8db5d4d48b9" dependencies = [ "sqlx-core", "sqlx-macros", @@ -3315,29 +2747,32 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.4.2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36bb6a2ca3345a86493bc3b71eabc2c6c16a8bb1aa476cf5303bee27f67627d7" +checksum = "518be6f6fff5ca76f985d434f9c37f3662af279642acf730388f271dff7b9016" dependencies = [ - "ahash 0.6.3", + "ahash 0.7.6", "atoi", - "base64 0.13.0", + "base64", "bitflags", "byteorder", - "bytes 0.5.6", + "bytes 1.1.0", "chrono", "crc", - "crossbeam-channel 0.5.1", + "crossbeam-channel", "crossbeam-queue", - "crossbeam-utils 0.8.5", + "crossbeam-utils", + "dirs 4.0.0", "either", "futures-channel", "futures-core", + "futures-intrusive", "futures-util", "hashlink", "hex", - "hmac 0.10.1", - "itoa", + "hmac 0.11.0", + "indexmap", + "itoa 1.0.1", "libc", "log", "md-5", @@ -3345,16 +2780,18 @@ dependencies = [ "once_cell", "parking_lot", "percent-encoding", - "rand 0.7.3", + "rand 0.8.4", "rustls", "serde", - "sha-1", + "serde_json", + "sha-1 0.9.8", "sha2", "smallvec", "sqlformat", "sqlx-rt", "stringprep", "thiserror", + "tokio-stream", "url", "webpki", "webpki-roots", @@ -3363,17 +2800,15 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.4.2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5ada8b3b565331275ce913368565a273a74faf2a34da58c4dc010ce3286844" +checksum = "38e45140529cf1f90a5e1c2e561500ca345821a1c513652c8f486bbf07407cc8" dependencies = [ - "cargo_metadata", "dotenv", "either", - "futures", "heck", "hex", - "lazy_static", + "once_cell", "proc-macro2", "quote", "serde", @@ -3387,75 +2822,16 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.2.0" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63fc5454c9dd7aaea3a0eeeb65ca40d06d0d8e7413a8184f7c3a3ffa5056190b" +checksum = "8061cbaa91ee75041514f67a09398c65a64efed72c90151ecd47593bad53da99" dependencies = [ "actix-rt", - "actix-threadpool", "once_cell", - "tokio 0.2.25", + "tokio 1.16.1", "tokio-rustls", ] -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check 0.9.3", -] - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version 0.2.3", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "stringprep" version = "0.1.2" @@ -3480,36 +2856,24 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if 1.0.0", + "fastrand", "libc", - "rand 0.8.4", "redox_syscall", "remove_dir_all", "winapi 0.3.9", @@ -3544,15 +2908,6 @@ dependencies = [ "syn", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - [[package]] name = "time" version = "0.1.43" @@ -3565,41 +2920,21 @@ dependencies = [ [[package]] name = "time" -version = "0.2.27" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" +checksum = "004cbc98f30fa233c61a38bc77e96a9106e65c88f2d3bef182ae952027e5753d" dependencies = [ - "const_fn", + "itoa 1.0.1", "libc", - "standback", - "stdweb", + "num_threads", "time-macros", - "version_check 0.9.3", - "winapi 0.3.9", ] [[package]] name = "time-macros" -version = "0.1.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] - -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn", -] +checksum = "25eb0ca3468fc0acc11828786797f6ef9aa1555e4a211a60d64cc8e4d1be47d6" [[package]] name = "tinyvec" @@ -3627,31 +2962,28 @@ dependencies = [ "futures-core", "iovec", "lazy_static", - "libc", "memchr", "mio 0.6.23", - "mio-uds", - "num_cpus", "pin-project-lite 0.1.12", - "signal-hook-registry", "slab", "tokio-macros", - "winapi 0.3.9", ] [[package]] name = "tokio" -version = "1.14.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" dependencies = [ - "autocfg", "bytes 1.1.0", "libc", "memchr", "mio 0.7.14", "num_cpus", - "pin-project-lite 0.2.7", + "once_cell", + "parking_lot", + "pin-project-lite 0.2.8", + "signal-hook-registry", "winapi 0.3.9", ] @@ -3673,19 +3005,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ "native-tls", - "tokio 1.14.0", + "tokio 1.16.1", ] [[package]] name = "tokio-rustls" -version = "0.14.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12831b255bcfa39dc0436b01e19fea231a37db570686c06ee72c423479f889a" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls", + "tokio 1.16.1", + "webpki", +] + +[[package]] +name = "tokio-stream" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" dependencies = [ "futures-core", - "rustls", - "tokio 0.2.25", - "webpki", + "pin-project-lite 0.2.8", + "tokio 1.16.1", ] [[package]] @@ -3698,20 +3040,6 @@ dependencies = [ "tokio 0.2.25", ] -[[package]] -name = "tokio-util" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" -dependencies = [ - "bytes 0.5.6", - "futures-core", - "futures-sink", - "log", - "pin-project-lite 0.1.12", - "tokio 0.2.25", -] - [[package]] name = "tokio-util" version = "0.3.1" @@ -3720,7 +3048,6 @@ checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" dependencies = [ "bytes 0.5.6", "futures-core", - "futures-io", "futures-sink", "log", "pin-project-lite 0.1.12", @@ -3737,8 +3064,8 @@ dependencies = [ "futures-core", "futures-sink", "log", - "pin-project-lite 0.2.7", - "tokio 1.14.0", + "pin-project-lite 0.2.8", + "tokio 1.16.1", ] [[package]] @@ -3749,22 +3076,22 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "2d8d93354fe2a8e50d5953f5ae2e47a3fc2ef03292e7ea46e3cc38f549525fb9" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.7", + "pin-project-lite 0.2.8", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" dependencies = [ "proc-macro2", "quote", @@ -3773,9 +3100,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23" dependencies = [ "lazy_static", ] @@ -3786,49 +3113,10 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project 1.0.8", + "pin-project", "tracing", ] -[[package]] -name = "trust-dns-proto" -version = "0.19.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cad71a0c0d68ab9941d2fb6e82f8fb2e86d9945b94e1661dd0aaea2b88215a9" -dependencies = [ - "async-trait", - "cfg-if 1.0.0", - "enum-as-inner", - "futures", - "idna", - "lazy_static", - "log", - "rand 0.7.3", - "smallvec", - "thiserror", - "tokio 0.2.25", - "url", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.19.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" -dependencies = [ - "cfg-if 0.1.10", - "futures", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "resolv-conf", - "smallvec", - "thiserror", - "tokio 0.2.25", - "trust-dns-proto", -] - [[package]] name = "try-lock" version = "0.2.3" @@ -3847,24 +3135,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "uname" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" -dependencies = [ - "libc", -] +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "unchecked-index" @@ -3878,7 +3151,7 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "version_check 0.9.3", + "version_check", ] [[package]] @@ -3914,15 +3187,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - [[package]] name = "untrusted" version = "0.7.1" @@ -3939,7 +3203,6 @@ dependencies = [ "idna", "matches", "percent-encoding", - "serde", ] [[package]] @@ -3953,42 +3216,6 @@ name = "uuid" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.3", - "serde", -] - -[[package]] -name = "v_escape" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e0ab5fab1db278a9413d2ea794cb66f471f898c5b020c3c394f6447625d9d4" -dependencies = [ - "buf-min", - "v_escape_derive", -] - -[[package]] -name = "v_escape_derive" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29769400af8b264944b851c961a4a6930e76604f59b1fcd51246bab6a296c8c" -dependencies = [ - "nom 4.2.3", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "v_htmlescape" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f9a8af610ad6f7fc9989c9d2590d9764bc61f294884e9ee93baa58795174572" -dependencies = [ - "cfg-if 1.0.0", - "v_escape", -] [[package]] name = "validator" @@ -4036,7 +3263,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79923f7731dc61ebfba3633098bf3ac533bbd35ccd8c57e7088d9a5eebe0263f" dependencies = [ "ctor", - "version_check 0.9.3", + "version_check", ] [[package]] @@ -4047,21 +3274,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.1.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waker-fn" @@ -4093,9 +3308,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" dependencies = [ "cfg-if 1.0.0", "serde", @@ -4105,9 +3320,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" dependencies = [ "bumpalo", "lazy_static", @@ -4120,9 +3335,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -4132,9 +3347,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4142,9 +3357,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" dependencies = [ "proc-macro2", "quote", @@ -4155,15 +3370,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" dependencies = [ "js-sys", "wasm-bindgen", @@ -4207,12 +3422,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "widestring" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" - [[package]] name = "winapi" version = "0.2.8" @@ -4256,15 +3465,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "winreg" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "winreg" version = "0.7.0" @@ -4325,3 +3525,32 @@ dependencies = [ "thiserror", "time 0.1.43", ] + +[[package]] +name = "zstd" +version = "0.9.2+zstd.1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.3+zstd.1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.2+zstd.1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" +dependencies = [ + "cc", + "libc", +] diff --git a/Cargo.toml b/Cargo.toml index 1e2e254da..026d67d3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,15 +12,15 @@ path = "src/main.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -actix-web = "3.3.2" -actix-rt = "1.1.1" -actix-files = "0.5.0" -actix-multipart = "0.3.0" -actix-cors = "0.5.4" -actix-ratelimit = "0.3.0" +actix = "0.12.0" +actix-web = "4.0.0-rc.2" +actix-rt = "2.6.0" +tokio-stream = "0.1.8" +actix-multipart = "0.4.0-beta.13" +actix-cors = "0.6.0-beta.8" meilisearch-sdk = "0.6.0" -reqwest = { version = "0.10.8", features = ["json"] } +reqwest = { version = "0.11.9", features = ["json"] } yaserde = "0.6.0" yaserde_derive = "0.6.0" @@ -54,9 +54,8 @@ futures-timer = "3.0.2" rust-s3 = "0.26.1" async-trait = "0.1.41" -sqlx = { version = "0.4.2", features = ["runtime-actix-rustls", "postgres", "chrono", "offline", "macros", "migrate"] } +sqlx = { version = "0.5.10", features = ["runtime-actix-rustls", "postgres", "chrono", "offline", "macros", "migrate"] } -sentry = { version = "0.22.0", features = ["log"] } -sentry-actix = "0.22.0" +bytes = "1.1.0" -bytes = "0.5.6" +dashmap = "4.0.2" \ No newline at end of file diff --git a/build.rs b/build.rs index 238813892..3a8149ef0 100644 --- a/build.rs +++ b/build.rs @@ -1,58 +1,3 @@ -use std::fs; -use std::path::{Path, PathBuf}; fn main() { - let dir = std::env::var("OUT_DIR").unwrap(); - let mut target = PathBuf::from(dir); - target.pop(); - target.pop(); - target.pop(); - target.push("migrations"); - println!("Output: {}", target.to_str().unwrap()); - copy("migrations", target).unwrap(); -} - -pub fn copy, V: AsRef>(from: U, to: V) -> Result<(), std::io::Error> { - let mut stack = vec![PathBuf::from(from.as_ref())]; - - let output_root = PathBuf::from(to.as_ref()); - let input_root = PathBuf::from(from.as_ref()).components().count(); - - while let Some(working_path) = stack.pop() { - println!("process: {:?}", &working_path); - - // Generate a relative path - let src: PathBuf = working_path.components().skip(input_root).collect(); - - // Create a destination if missing - let dest = if src.components().count() == 0 { - output_root.clone() - } else { - output_root.join(&src) - }; - if fs::metadata(&dest).is_err() { - println!(" mkdir: {:?}", dest); - fs::create_dir_all(&dest)?; - } - - for entry in fs::read_dir(working_path)? { - let entry = entry?; - let path = entry.path(); - if path.is_dir() { - stack.push(path); - } else { - match path.file_name() { - Some(filename) => { - let dest_path = dest.join(filename); - println!(" copy: {:?} -> {:?}", &path, &dest_path); - fs::copy(&path, &dest_path)?; - } - None => { - println!("failed: {:?}", path); - } - } - } - } - } - - Ok(()) + println!("cargo:rerun-if-changed=migrations"); } diff --git a/sqlx-data.json b/sqlx-data.json index efa7cad86..0b8872934 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -1209,28 +1209,6 @@ ] } }, - "49b2829b22f6ca82b3f62ea7962d8af22098cfa5a1fc1e06312bf1d3df382280": { - "query": "\n INSERT INTO categories (category, project_type, icon)\n VALUES ($1, $2, $3)\n ON CONFLICT (category, project_type, icon) DO NOTHING\n RETURNING id\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Int4", - "Varchar" - ] - }, - "nullable": [ - false - ] - } - }, "4a4b4166248877eefcd63603945fdcd392f76812bdec7c70f8ffeb06ee7e737f": { "query": "\n SELECT m.id FROM mods m\n INNER JOIN team_members tm ON tm.team_id = m.team_id\n WHERE tm.user_id = $1 AND tm.role = $2\n ", "describe": { @@ -2190,68 +2168,6 @@ ] } }, - "7367664a589891e560eef5f80bb82220b438e3344eb60074c6b3174a02a72f4e": { - "query": "\n SELECT r.id, rt.name, r.mod_id, r.version_id, r.user_id, r.body, r.reporter, r.created\n FROM reports r\n INNER JOIN report_types rt ON rt.id = r.report_type_id\n WHERE r.id = ANY($1)\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "name", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "mod_id", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "version_id", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "user_id", - "type_info": "Int8" - }, - { - "ordinal": 5, - "name": "body", - "type_info": "Varchar" - }, - { - "ordinal": 6, - "name": "reporter", - "type_info": "Int8" - }, - { - "ordinal": 7, - "name": "created", - "type_info": "Timestamptz" - } - ], - "parameters": { - "Left": [ - "Int8Array" - ] - }, - "nullable": [ - false, - false, - true, - true, - true, - false, - false, - false - ] - } - }, "73bdd6c9e7cd8c1ed582261aebdee0f8fd2734e712ef288a2608564c918009cb": { "query": "\n DELETE FROM versions WHERE id = $1\n ", "describe": { @@ -2314,6 +2230,28 @@ ] } }, + "7795938e2b23d06b32dc6d79f6b2b8e7ed24bbf4fa61cb3000259ba3d2ecbc6f": { + "query": "\n INSERT INTO categories (category, project_type, icon)\n VALUES ($1, $2, $3)\n ON CONFLICT (category) DO NOTHING\n RETURNING id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Int4", + "Varchar" + ] + }, + "nullable": [ + false + ] + } + }, "78a60cf0febcc6e35b8ffe38f2c021c13ab660c81c4775bbb26004d30242a1a8": { "query": "\n SELECT gv.id id, gv.version version_, gv.type type_, gv.created created, gv.major major FROM game_versions gv\n WHERE major = $1\n ORDER BY created DESC\n ", "describe": { @@ -2614,6 +2552,42 @@ "nullable": [] } }, + "885ca4b21e05079d30dcf3b65619c95b544a10b7b08c3184278a0fe5ebc44b86": { + "query": "\n SELECT c.id id, c.category category, c.icon icon, pt.name project_type\n FROM categories c\n INNER JOIN project_types pt ON c.project_type = pt.id\n ORDER BY c.id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "category", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "icon", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "project_type", + "type_info": "Varchar" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + false + ] + } + }, "89310b2bc5f020744a9a42dae6f15dfebc1544cdd754939f0d09714353f2aa7c": { "query": "\n SELECT id, team_id, role, permissions, accepted\n FROM team_members\n WHERE user_id = $1\n ", "describe": { @@ -4133,6 +4107,27 @@ "nullable": [] } }, + "bc605f80a615c7d0ca9c8207f8b0c5dc1b8f2ad0f9b3346a00078d59e5e3e253": { + "query": "\n INSERT INTO loaders (loader, icon)\n VALUES ($1, $2)\n ON CONFLICT (loader) DO NOTHING\n RETURNING id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar", + "Varchar" + ] + }, + "nullable": [ + false + ] + } + }, "bc91841f9672608a28bd45a862919f2bd34fac0b3479e3b4b67a9f6bea2a562a": { "query": "\n UPDATE mods\n SET issues_url = $1\n WHERE (id = $2)\n ", "describe": { @@ -4570,27 +4565,6 @@ "nullable": [] } }, - "cc8eeb14e2069b9e4f92b224d42b283e569258d61be3cc3b3f7564f0dadac89b": { - "query": "\n INSERT INTO loaders (loader, icon)\n VALUES ($1, $2)\n ON CONFLICT (loader, icon) DO NOTHING\n RETURNING id\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar", - "Varchar" - ] - }, - "nullable": [ - false - ] - } - }, "ccd913bb2f3006ffe881ce2fc4ef1e721d18fe2eed6ac62627046c955129610c": { "query": "SELECT EXISTS(SELECT 1 FROM files WHERE id=$1)", "describe": { @@ -4982,37 +4956,63 @@ ] } }, - "d7744589d9e20c48f6f726a8a540822c1e521b791ebc2fee86a1108d442aedb8": { - "query": "\n SELECT c.id id, c.category category, c.icon icon, pt.name project_type\n FROM categories c\n INNER JOIN project_types pt ON c.project_type = pt.id\n ", + "d7127fd7f257cc7779841108c75f6fd8b20f9619bef1cacd0fbaf011cf0b25b3": { + "query": "\n SELECT r.id, rt.name, r.mod_id, r.version_id, r.user_id, r.body, r.reporter, r.created\n FROM reports r\n INNER JOIN report_types rt ON rt.id = r.report_type_id\n WHERE r.id = ANY($1)\n ORDER BY r.created DESC\n ", "describe": { "columns": [ { "ordinal": 0, "name": "id", - "type_info": "Int4" + "type_info": "Int8" }, { "ordinal": 1, - "name": "category", + "name": "name", "type_info": "Varchar" }, { "ordinal": 2, - "name": "icon", - "type_info": "Varchar" + "name": "mod_id", + "type_info": "Int8" }, { "ordinal": 3, - "name": "project_type", + "name": "version_id", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "user_id", + "type_info": "Int8" + }, + { + "ordinal": 5, + "name": "body", "type_info": "Varchar" + }, + { + "ordinal": 6, + "name": "reporter", + "type_info": "Int8" + }, + { + "ordinal": 7, + "name": "created", + "type_info": "Timestamptz" } ], "parameters": { - "Left": [] + "Left": [ + "Int8Array" + ] }, "nullable": [ false, false, + true, + true, + true, + false, false, false ] diff --git a/src/database/models/categories.rs b/src/database/models/categories.rs index 8a9105b80..7a42b5007 100644 --- a/src/database/models/categories.rs +++ b/src/database/models/categories.rs @@ -141,6 +141,7 @@ impl Category { SELECT c.id id, c.category category, c.icon icon, pt.name project_type FROM categories c INNER JOIN project_types pt ON c.project_type = pt.id + ORDER BY c.id " ) .fetch_many(exec) @@ -162,8 +163,6 @@ impl Category { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; - let result = sqlx::query!( " DELETE FROM categories @@ -227,7 +226,7 @@ impl<'a> CategoryBuilder<'a> { " INSERT INTO categories (category, project_type, icon) VALUES ($1, $2, $3) - ON CONFLICT (category, project_type, icon) DO NOTHING + ON CONFLICT (category) DO NOTHING RETURNING id ", self.name, @@ -336,8 +335,6 @@ impl Loader { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; - let result = sqlx::query!( " DELETE FROM loaders @@ -398,7 +395,7 @@ impl<'a> LoaderBuilder<'a> { " INSERT INTO loaders (loader, icon) VALUES ($1, $2) - ON CONFLICT (loader, icon) DO NOTHING + ON CONFLICT (loader) DO NOTHING RETURNING id ", self.name, @@ -597,8 +594,6 @@ impl GameVersion { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; - let result = sqlx::query!( " DELETE FROM game_versions @@ -761,8 +756,6 @@ impl License { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; - let result = sqlx::query!( " DELETE FROM licenses @@ -909,8 +902,6 @@ impl DonationPlatform { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; - let result = sqlx::query!( " DELETE FROM donation_platforms @@ -1046,8 +1037,6 @@ impl ReportType { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; - let result = sqlx::query!( " DELETE FROM report_types @@ -1199,8 +1188,6 @@ impl ProjectType { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; - let result = sqlx::query!( " DELETE FROM project_types diff --git a/src/database/models/report_item.rs b/src/database/models/report_item.rs index 8ba40f9d6..89f7060b4 100644 --- a/src/database/models/report_item.rs +++ b/src/database/models/report_item.rs @@ -100,20 +100,21 @@ impl Report { FROM reports r INNER JOIN report_types rt ON rt.id = r.report_type_id WHERE r.id = ANY($1) + ORDER BY r.created DESC ", &report_ids_parsed ) .fetch_many(exec) .try_filter_map(|e| async { - Ok(e.right().map(|row| QueryReport { - id: ReportId(row.id), - report_type: row.name, - project_id: row.mod_id.map(ProjectId), - version_id: row.version_id.map(VersionId), - user_id: row.user_id.map(UserId), - body: row.body, - reporter: UserId(row.reporter), - created: row.created, + Ok(e.right().map(|x| QueryReport { + id: ReportId(x.id), + report_type: x.name, + project_id: x.mod_id.map(ProjectId), + version_id: x.version_id.map(VersionId), + user_id: x.user_id.map(UserId), + body: x.body, + reporter: UserId(x.reporter), + created: x.created, })) }) .try_collect::>() diff --git a/src/database/models/team_item.rs b/src/database/models/team_item.rs index e7d67e890..0542589d1 100644 --- a/src/database/models/team_item.rs +++ b/src/database/models/team_item.rs @@ -403,7 +403,6 @@ impl TeamMember { where E: sqlx::Executor<'a, Database = sqlx::Postgres>, { - use sqlx::Done; let result = sqlx::query!( " DELETE FROM team_members diff --git a/src/database/postgres_database.rs b/src/database/postgres_database.rs index fcbd81d78..993c49dc5 100644 --- a/src/database/postgres_database.rs +++ b/src/database/postgres_database.rs @@ -1,10 +1,7 @@ use log::info; -use sqlx::migrate::{Migrate, MigrateDatabase, Migrator}; +use sqlx::migrate::MigrateDatabase; use sqlx::postgres::{PgPool, PgPoolOptions}; use sqlx::{Connection, PgConnection, Postgres}; -use std::path::Path; - -const MIGRATION_FOLDER: &str = "migrations"; pub async fn connect() -> Result { info!("Initializing database connection"); @@ -34,31 +31,14 @@ pub async fn check_for_migrations() -> Result<(), sqlx::Error> { info!("Creating database..."); Postgres::create_database(uri).await?; } + info!("Applying migrations..."); - run_migrations(uri).await?; - Ok(()) -} - -pub async fn run_migrations(uri: &str) -> Result<(), sqlx::Error> { - let migrator = Migrator::new(Path::new(MIGRATION_FOLDER)).await?; let mut conn: PgConnection = PgConnection::connect(uri).await?; - - conn.ensure_migrations_table().await?; - - let (version, dirty) = conn.version().await?.unwrap_or((0, false)); - - if dirty { - panic!("The database is dirty! Please check your database status."); - } - - for migration in migrator.iter() { - if migration.version > version { - let _elapsed = conn.apply(migration).await?; - } else { - conn.validate(migration).await?; - } - } + sqlx::migrate!() + .run(&mut conn) + .await + .expect("Error while running database migrations!"); Ok(()) } diff --git a/src/file_hosting/mock.rs b/src/file_hosting/mock.rs index a7c1e9612..44199d32b 100644 --- a/src/file_hosting/mock.rs +++ b/src/file_hosting/mock.rs @@ -1,6 +1,6 @@ use super::{DeleteFileData, FileHost, FileHostingError, UploadFileData}; use async_trait::async_trait; -use bytes::{Buf, Bytes}; +use bytes::Bytes; use sha2::Digest; pub struct MockHost(()); @@ -22,10 +22,10 @@ impl FileHost for MockHost { let path = std::path::Path::new(&dotenv::var("MOCK_FILE_PATH").unwrap()) .join(file_name.replace("../", "")); std::fs::create_dir_all(path.parent().ok_or(FileHostingError::InvalidFilename)?)?; - let content_sha1 = sha1::Sha1::from(file_bytes.bytes()).hexdigest(); - let content_sha512 = format!("{:x}", sha2::Sha512::digest(file_bytes.bytes())); + let content_sha1 = sha1::Sha1::from(&*file_bytes).hexdigest(); + let content_sha512 = format!("{:x}", sha2::Sha512::digest(&*file_bytes)); - std::fs::write(path, file_bytes.bytes())?; + std::fs::write(path, &*file_bytes)?; Ok(UploadFileData { file_id: String::from("MOCK_FILE_ID"), file_name: file_name.to_string(), diff --git a/src/file_hosting/s3_host.rs b/src/file_hosting/s3_host.rs index 617813652..471126739 100644 --- a/src/file_hosting/s3_host.rs +++ b/src/file_hosting/s3_host.rs @@ -1,6 +1,6 @@ use crate::file_hosting::{DeleteFileData, FileHost, FileHostingError, UploadFileData}; use async_trait::async_trait; -use bytes::{Buf, Bytes}; +use bytes::Bytes; use s3::bucket::Bucket; use s3::creds::Credentials; use s3::region::Region; @@ -42,14 +42,10 @@ impl FileHost for S3Host { file_bytes: Bytes, ) -> Result { let content_sha1 = sha1::Sha1::from(&file_bytes).hexdigest(); - let content_sha512 = format!("{:x}", sha2::Sha512::digest(file_bytes.bytes())); + let content_sha512 = format!("{:x}", sha2::Sha512::digest(&*file_bytes)); self.bucket - .put_object_with_content_type( - format!("/{}", file_name), - file_bytes.bytes(), - content_type, - ) + .put_object_with_content_type(format!("/{}", file_name), &*file_bytes, content_type) .await?; Ok(UploadFileData { diff --git a/src/main.rs b/src/main.rs index 61f2a79d3..dbf8cd72d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,13 @@ use crate::file_hosting::S3Host; +use crate::ratelimit::errors::ARError; +use crate::ratelimit::memory::{MemoryStore, MemoryStoreActor}; +use crate::ratelimit::middleware::RateLimiter; use crate::util::env::{parse_strings_from_var, parse_var}; use actix_cors::Cors; -use actix_ratelimit::errors::ARError; -use actix_ratelimit::{MemoryStore, MemoryStoreActor, RateLimiter}; use actix_web::{http, web, App, HttpServer}; use env_logger::Env; use gumdrop::Options; use log::{error, info, warn}; -use rand::Rng; use search::indexing::index_projects; use search::indexing::IndexingSettings; use std::sync::atomic::Ordering; @@ -17,6 +17,7 @@ mod database; mod file_hosting; mod health; mod models; +mod ratelimit; mod routes; mod scheduler; mod search; @@ -90,14 +91,6 @@ async fn main() -> std::io::Result<()> { info!("Skipping initial indexing"); } - // DSN is from SENTRY_DSN env variable. - // Has no effect if not set. - let sentry = sentry::init(()); - if sentry.is_enabled() { - info!("Enabled Sentry integration"); - std::env::set_var("RUST_BACKTRACE", "1"); - } - database::check_for_migrations() .await .expect("An error occurred while running migrations."); @@ -266,37 +259,28 @@ async fn main() -> std::io::Result<()> { header.to_str().map_err(|_| ARError::IdentificationError)? } else { connection_info - .remote_addr() + .peer_addr() .ok_or(ARError::IdentificationError)? } } else { connection_info - .remote_addr() + .peer_addr() .ok_or(ARError::IdentificationError)? }); - let ignore_ips = - parse_strings_from_var("RATE_LIMIT_IGNORE_IPS").unwrap_or_default(); - - if ignore_ips.contains(&ip) { - // At an even distribution of numbers, this will allow at the most - // 18000 requests per minute from the frontend, which is reasonable - // (300 requests per second) - let random = rand::thread_rng().gen_range(1, 30); - return Ok(format!("{}-{}", ip, random)); - } - Ok(ip) }) .with_interval(std::time::Duration::from_secs(60)) - .with_max_requests(300), + .with_max_requests(300) + .with_ignore_ips( + parse_strings_from_var("RATE_LIMIT_IGNORE_IPS").unwrap_or_default(), + ), ) - .wrap(sentry_actix::Sentry::new()) - .data(pool.clone()) - .data(file_host.clone()) - .data(indexing_queue.clone()) - .data(search_config.clone()) - .data(ip_salt.clone()) + .app_data(pool.clone()) + .app_data(file_host.clone()) + .app_data(indexing_queue.clone()) + .app_data(search_config.clone()) + .app_data(ip_salt.clone()) .configure(routes::v1_config) .configure(routes::v2_config) .service(routes::index_get) diff --git a/src/ratelimit/errors.rs b/src/ratelimit/errors.rs new file mode 100644 index 000000000..8e425cbb0 --- /dev/null +++ b/src/ratelimit/errors.rs @@ -0,0 +1,45 @@ +//! Errors that can occur during middleware processing stage +use actix_web::ResponseError; +use log::*; +use thiserror::Error; + +/// Custom error type. Useful for logging and debugging different kinds of errors. +/// This type can be converted to Actix Error, which defaults to +/// InternalServerError +/// +#[derive(Debug, Error)] +pub enum ARError { + /// Read/Write error on store + #[error("read/write operatiion failed: {0}")] + ReadWriteError(String), + + /// Identifier error + #[error("client identification failed")] + IdentificationError, + /// Limited Error + #[error("You are being ratelimited. Please wait {reset} seconds. {remaining}/{max_requests} remaining.")] + LimitedError { + max_requests: usize, + remaining: usize, + reset: u64, + }, +} + +impl ResponseError for ARError { + fn error_response(&self) -> actix_web::web::HttpResponse { + match self { + Self::LimitedError { + max_requests, + remaining, + reset, + } => { + let mut response = actix_web::web::HttpResponse::TooManyRequests(); + response.insert_header(("x-ratelimit-limit", max_requests.to_string())); + response.insert_header(("x-ratelimit-remaining", remaining.to_string())); + response.insert_header(("x-ratelimit-reset", reset.to_string())); + response.body(self.to_string()) + } + _ => actix_web::web::HttpResponse::build(self.status_code()).body(self.to_string()), + } + } +} diff --git a/src/ratelimit/memory.rs b/src/ratelimit/memory.rs new file mode 100644 index 000000000..988120f91 --- /dev/null +++ b/src/ratelimit/memory.rs @@ -0,0 +1,252 @@ +//! In memory store for rate limiting +use actix::prelude::*; +use dashmap::DashMap; +use futures::future::{self}; +use log::*; +use std::sync::Arc; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +use crate::ratelimit::errors::ARError; +use crate::ratelimit::{ActorMessage, ActorResponse}; + +/// Type used to create a concurrent hashmap store +#[derive(Clone)] +pub struct MemoryStore { + inner: Arc>, +} + +impl MemoryStore { + /// Create a new hashmap + /// + /// # Example + /// ```rust + /// use actix_ratelimit::MemoryStore; + /// + /// let store = MemoryStore::new(); + /// ``` + pub fn new() -> Self { + debug!("Creating new MemoryStore"); + MemoryStore { + inner: Arc::new(DashMap::::new()), + } + } + + #[allow(dead_code)] + /// Create a new hashmap with the provided capacity + pub fn with_capacity(capacity: usize) -> Self { + debug!("Creating new MemoryStore"); + MemoryStore { + inner: Arc::new(DashMap::::with_capacity( + capacity, + )), + } + } +} + +/// Actor for memory store +pub struct MemoryStoreActor { + inner: Arc>, +} + +impl From for MemoryStoreActor { + fn from(store: MemoryStore) -> Self { + MemoryStoreActor { inner: store.inner } + } +} + +impl MemoryStoreActor { + /// Starts the memory actor and returns it's address + pub fn start(self) -> Addr { + debug!("Started memory store"); + Supervisor::start(|_| self) + } +} + +impl Actor for MemoryStoreActor { + type Context = Context; +} + +impl Supervised for MemoryStoreActor { + fn restarting(&mut self, _: &mut Self::Context) { + debug!("Restarting memory store"); + } +} + +impl Handler for MemoryStoreActor { + type Result = ActorResponse; + fn handle(&mut self, msg: ActorMessage, ctx: &mut Self::Context) -> Self::Result { + match msg { + ActorMessage::Set { key, value, expiry } => { + debug!("Inserting key {} with expiry {}", &key, &expiry.as_secs()); + let future_key = String::from(&key); + let now = SystemTime::now(); + let now = now.duration_since(UNIX_EPOCH).unwrap(); + self.inner.insert(key, (value, now + expiry)); + ctx.notify_later(ActorMessage::Remove(future_key), expiry); + ActorResponse::Set(Box::pin(future::ready(Ok(())))) + } + ActorMessage::Update { key, value } => match self.inner.get_mut(&key) { + Some(mut c) => { + let val_mut: &mut (usize, Duration) = c.value_mut(); + if val_mut.0 > value { + val_mut.0 -= value; + } else { + val_mut.0 = 0; + } + let new_val = val_mut.0; + ActorResponse::Update(Box::pin(future::ready(Ok(new_val)))) + } + None => { + return ActorResponse::Update(Box::pin(future::ready(Err( + ARError::ReadWriteError("memory store: read failed!".to_string()), + )))) + } + }, + ActorMessage::Get(key) => { + if self.inner.contains_key(&key) { + let val = match self.inner.get(&key) { + Some(c) => c, + None => { + return ActorResponse::Get(Box::pin(future::ready(Err( + ARError::ReadWriteError("memory store: read failed!".to_string()), + )))) + } + }; + let val = val.value().0; + ActorResponse::Get(Box::pin(future::ready(Ok(Some(val))))) + } else { + ActorResponse::Get(Box::pin(future::ready(Ok(None)))) + } + } + ActorMessage::Expire(key) => { + let c = match self.inner.get(&key) { + Some(d) => d, + None => { + return ActorResponse::Expire(Box::pin(future::ready(Err( + ARError::ReadWriteError("memory store: read failed!".to_string()), + )))) + } + }; + let dur = c.value().1; + let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); + let res = dur.checked_sub(now).unwrap_or_else(|| Duration::new(0, 0)); + ActorResponse::Expire(Box::pin(future::ready(Ok(res)))) + } + ActorMessage::Remove(key) => { + debug!("Removing key: {}", &key); + let val = match self.inner.remove::(&key) { + Some(c) => c, + None => { + return ActorResponse::Remove(Box::pin(future::ready(Err( + ARError::ReadWriteError("memory store: remove failed!".to_string()), + )))) + } + }; + let val = val.1; + ActorResponse::Remove(Box::pin(future::ready(Ok(val.0)))) + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[actix_rt::test] + async fn test_set() { + let store = MemoryStore::new(); + let addr = MemoryStoreActor::from(store.clone()).start(); + let res = addr + .send(ActorMessage::Set { + key: "hello".to_string(), + value: 30usize, + expiry: Duration::from_secs(5), + }) + .await; + let res = res.expect("Failed to send msg"); + match res { + ActorResponse::Set(c) => match c.await { + Ok(()) => {} + Err(e) => panic!("Shouldn't happen {}", &e), + }, + _ => panic!("Shouldn't happen!"), + } + } + + #[actix_rt::test] + async fn test_get() { + let store = MemoryStore::new(); + let addr = MemoryStoreActor::from(store.clone()).start(); + let expiry = Duration::from_secs(5); + let res = addr + .send(ActorMessage::Set { + key: "hello".to_string(), + value: 30usize, + expiry: expiry, + }) + .await; + let res = res.expect("Failed to send msg"); + match res { + ActorResponse::Set(c) => match c.await { + Ok(()) => {} + Err(e) => panic!("Shouldn't happen {}", &e), + }, + _ => panic!("Shouldn't happen!"), + } + let res2 = addr.send(ActorMessage::Get("hello".to_string())).await; + let res2 = res2.expect("Failed to send msg"); + match res2 { + ActorResponse::Get(c) => match c.await { + Ok(d) => { + let d = d.unwrap(); + assert_eq!(d, 30usize); + } + Err(e) => panic!("Shouldn't happen {}", &e), + }, + _ => panic!("Shouldn't happen!"), + }; + } + + #[actix_rt::test] + async fn test_expiry() { + let store = MemoryStore::new(); + let addr = MemoryStoreActor::from(store.clone()).start(); + let expiry = Duration::from_secs(3); + let res = addr + .send(ActorMessage::Set { + key: "hello".to_string(), + value: 30usize, + expiry: expiry, + }) + .await; + let res = res.expect("Failed to send msg"); + match res { + ActorResponse::Set(c) => match c.await { + Ok(()) => {} + Err(e) => panic!("Shouldn't happen {}", &e), + }, + _ => panic!("Shouldn't happen!"), + } + assert_eq!(addr.connected(), true); + + let res3 = addr.send(ActorMessage::Expire("hello".to_string())).await; + let res3 = res3.expect("Failed to send msg"); + match res3 { + ActorResponse::Expire(c) => match c.await { + Ok(dur) => { + let now = Duration::from_secs(3); + if dur > now { + panic!("Expiry is invalid!"); + } else if dur > now + Duration::from_secs(4) { + panic!("Expiry is invalid!"); + } + } + Err(e) => { + panic!("Shouldn't happen: {}", &e); + } + }, + _ => panic!("Shouldn't happen!"), + }; + } +} diff --git a/src/ratelimit/middleware.rs b/src/ratelimit/middleware.rs new file mode 100644 index 000000000..cb528f926 --- /dev/null +++ b/src/ratelimit/middleware.rs @@ -0,0 +1,279 @@ +//! RateLimiter middleware for actix application +use crate::ratelimit::errors::ARError; +use crate::ratelimit::{ActorMessage, ActorResponse}; +use actix::dev::*; +use actix_web::{ + dev::{Service, ServiceRequest, ServiceResponse, Transform}, + error::Error as AWError, + http::header::{HeaderName, HeaderValue}, +}; +use futures::future::{ok, Ready}; +use log::*; +use std::{ + cell::RefCell, + future::Future, + ops::Fn, + pin::Pin, + rc::Rc, + task::{Context, Poll}, + time::Duration, +}; + +/// Type that implements the ratelimit middleware. +/// +/// This accepts _interval_ which specifies the +/// window size, _max_requests_ which specifies the maximum number of requests in that window, and +/// _store_ which is essentially a data store used to store client access information. Entry is removed from +/// the store after _interval_. +/// +/// # Example +/// ```rust +/// # use std::time::Duration; +/// use actix_ratelimit::{MemoryStore, MemoryStoreActor}; +/// use actix_ratelimit::RateLimiter; +/// +/// #[actix_rt::main] +/// async fn main() { +/// let store = MemoryStore::new(); +/// let ratelimiter = RateLimiter::new( +/// MemoryStoreActor::from(store.clone()).start()) +/// .with_interval(Duration::from_secs(60)) +/// .with_max_requests(100); +/// } +/// ``` +pub struct RateLimiter +where + T: Handler + Send + Sync + 'static, + T::Context: ToEnvelope, +{ + interval: Duration, + max_requests: usize, + store: Addr, + identifier: Rc Result>>, + ignore_ips: Vec, +} + +impl RateLimiter +where + T: Handler + Send + Sync + 'static, + ::Context: ToEnvelope, +{ + /// Creates a new instance of `RateLimiter` with the provided address of `StoreActor`. + pub fn new(store: Addr) -> Self { + let identifier = |req: &ServiceRequest| { + let connection_info = req.connection_info(); + let ip = connection_info + .peer_addr() + .ok_or(ARError::IdentificationError)?; + Ok(String::from(ip)) + }; + RateLimiter { + interval: Duration::from_secs(0), + max_requests: 0, + store, + identifier: Rc::new(Box::new(identifier)), + ignore_ips: Vec::new(), + } + } + + /// Specify the interval. The counter for a client is reset after this interval + pub fn with_interval(mut self, interval: Duration) -> Self { + self.interval = interval; + self + } + + /// Specify the maximum number of requests allowed in the given interval. + pub fn with_max_requests(mut self, max_requests: usize) -> Self { + self.max_requests = max_requests; + self + } + + /// Sets IPs that should be ignored by the ratelimiter + pub fn with_ignore_ips(mut self, ignore_ips: Vec) -> Self { + self.ignore_ips = ignore_ips; + self + } + + /// Function to get the identifier for the client request + pub fn with_identifier Result + 'static>( + mut self, + identifier: F, + ) -> Self { + self.identifier = Rc::new(Box::new(identifier)); + self + } +} + +impl Transform for RateLimiter +where + T: Handler + Send + Sync + 'static, + T::Context: ToEnvelope, + S: Service, Error = AWError> + 'static, + S::Future: 'static, + B: 'static, +{ + type Response = ServiceResponse; + type Error = S::Error; + type Transform = RateLimitMiddleware; + type InitError = (); + type Future = Ready>; + + fn new_transform(&self, service: S) -> Self::Future { + ok(RateLimitMiddleware { + service: Rc::new(RefCell::new(service)), + store: self.store.clone(), + max_requests: self.max_requests, + interval: self.interval.as_secs(), + identifier: self.identifier.clone(), + ignore_ips: self.ignore_ips.clone(), + }) + } +} + +/// Service factory for RateLimiter +pub struct RateLimitMiddleware +where + S: 'static, + T: Handler + 'static, +{ + service: Rc>, + store: Addr, + // Exists here for the sole purpose of knowing the max_requests and interval from RateLimiter + max_requests: usize, + interval: u64, + identifier: Rc Result + 'static>>, + ignore_ips: Vec, +} + +impl Service for RateLimitMiddleware +where + T: Handler + 'static, + S: Service, Error = AWError> + 'static, + S::Future: 'static, + B: 'static, + T::Context: ToEnvelope, +{ + type Response = ServiceResponse; + type Error = S::Error; + type Future = Pin>>>; + + fn poll_ready(&self, cx: &mut Context<'_>) -> Poll> { + self.service.borrow_mut().poll_ready(cx) + } + + fn call(&self, req: ServiceRequest) -> Self::Future { + let store = self.store.clone(); + let srv = self.service.clone(); + let max_requests = self.max_requests; + let interval = Duration::from_secs(self.interval); + let identifier = self.identifier.clone(); + let ignore_ips = self.ignore_ips.clone(); + Box::pin(async move { + let identifier: String = (identifier)(&req)?; + if ignore_ips.contains(&identifier) { + let fut = srv.call(req); + let res = fut.await?; + return Ok(res); + } + let remaining: ActorResponse = store + .send(ActorMessage::Get(String::from(&identifier))) + .await + .map_err(|_| ARError::IdentificationError)?; + match remaining { + ActorResponse::Get(opt) => { + let opt = opt.await?; + if let Some(c) = opt { + // Existing entry in store + let expiry = store + .send(ActorMessage::Expire(String::from(&identifier))) + .await + .map_err(|_| ARError::ReadWriteError("Setting timeout".to_string()))?; + let reset: Duration = match expiry { + ActorResponse::Expire(dur) => dur.await?, + _ => unreachable!(), + }; + if c == 0 { + info!("Limit exceeded for client: {}", &identifier); + Err(ARError::LimitedError { + max_requests, + remaining: c, + reset: reset.as_secs(), + } + .into()) + } else { + // Decrement value + let res: ActorResponse = store + .send(ActorMessage::Update { + key: identifier, + value: 1, + }) + .await + .map_err(|_| { + ARError::ReadWriteError("Decrementing ratelimit".to_string()) + })?; + let updated_value: usize = match res { + ActorResponse::Update(c) => c.await?, + _ => unreachable!(), + }; + // Execute the request + let fut = srv.call(req); + let mut res = fut.await?; + let headers = res.headers_mut(); + // Safe unwraps, since usize is always convertible to string + headers.insert( + HeaderName::from_static("x-ratelimit-limit"), + HeaderValue::from_str(max_requests.to_string().as_str())?, + ); + headers.insert( + HeaderName::from_static("x-ratelimit-remaining"), + HeaderValue::from_str(updated_value.to_string().as_str())?, + ); + headers.insert( + HeaderName::from_static("x-ratelimit-reset"), + HeaderValue::from_str(reset.as_secs().to_string().as_str())?, + ); + Ok(res) + } + } else { + // New client, create entry in store + let current_value = max_requests - 1; + let res = store + .send(ActorMessage::Set { + key: String::from(&identifier), + value: current_value, + expiry: interval, + }) + .await + .map_err(|_| { + ARError::ReadWriteError("Creating store entry".to_string()) + })?; + match res { + ActorResponse::Set(c) => c.await?, + _ => unreachable!(), + } + let fut = srv.call(req); + let mut res = fut.await?; + let headers = res.headers_mut(); + // Safe unwraps, since usize is always convertible to string + headers.insert( + HeaderName::from_static("x-ratelimit-limit"), + HeaderValue::from_str(max_requests.to_string().as_str()).unwrap(), + ); + headers.insert( + HeaderName::from_static("x-ratelimit-remaining"), + HeaderValue::from_str(current_value.to_string().as_str()).unwrap(), + ); + headers.insert( + HeaderName::from_static("x-ratelimit-reset"), + HeaderValue::from_str(interval.as_secs().to_string().as_str()).unwrap(), + ); + Ok(res) + } + } + _ => { + unreachable!(); + } + } + }) + } +} diff --git a/src/ratelimit/mod.rs b/src/ratelimit/mod.rs new file mode 100644 index 000000000..2d659c87e --- /dev/null +++ b/src/ratelimit/mod.rs @@ -0,0 +1,64 @@ +use std::future::Future; +use std::marker::Send; +use std::pin::Pin; +use std::time::Duration; + +use crate::ratelimit::errors::ARError; +use actix::dev::*; + +pub mod errors; +pub mod memory; +/// The code for this module was directly taken from https://github.com/TerminalWitchcraft/actix-ratelimit +/// with some modifications including upgrading it to Actix 4! +pub mod middleware; + +/// Represents message that can be handled by a `StoreActor` +pub enum ActorMessage { + /// Get the remaining count based on the provided identifier + Get(String), + /// Set the count of the client identified by `key` to `value` valid for `expiry` + Set { + key: String, + value: usize, + expiry: Duration, + }, + /// Change the value of count for the client identified by `key` by `value` + Update { key: String, value: usize }, + /// Get the expiration time for the client. + Expire(String), + /// Remove the client from the store + Remove(String), +} + +impl Message for ActorMessage { + type Result = ActorResponse; +} + +/// Wrapper type for `Pin>` type +pub type Output = Pin> + Send>>; + +/// Represents data returned in response to `Messages` by a `StoreActor` +pub enum ActorResponse { + /// Returned in response to [Messages::Get](enum.Messages.html) + Get(Output>), + /// Returned in response to [Messages::Set](enum.Messages.html) + Set(Output<()>), + /// Returned in response to [Messages::Update](enum.Messages.html) + Update(Output), + /// Returned in response to [Messages::Expire](enum.Messages.html) + Expire(Output), + /// Returned in response to [Messages::Remove](enum.Messages.html) + Remove(Output), +} + +impl MessageResponse for ActorResponse +where + A: Actor, + M: actix::Message, +{ + fn handle(self, _: &mut A::Context, tx: Option>) { + if let Some(tx) = tx { + let _ = tx.send(self); + } + } +} diff --git a/src/routes/auth.rs b/src/routes/auth.rs index e38ef4b1d..37b9a5c7a 100644 --- a/src/routes/auth.rs +++ b/src/routes/auth.rs @@ -117,7 +117,7 @@ pub async fn init( ); Ok(HttpResponse::TemporaryRedirect() - .header("Location", &*url) + .append_header(("Location", &*url)) .json(AuthorizationInit { url })) } @@ -235,7 +235,7 @@ pub async fn auth_callback( }; Ok(HttpResponse::TemporaryRedirect() - .header("Location", &*redirect_url) + .append_header(("Location", &*redirect_url)) .json(AuthorizationInit { url: redirect_url })) } else { Err(AuthorizationError::InvalidCredentialsError) diff --git a/src/routes/maven.rs b/src/routes/maven.rs index 5de4c213c..e010d61bd 100644 --- a/src/routes/maven.rs +++ b/src/routes/maven.rs @@ -53,11 +53,12 @@ pub struct MavenPom { #[get("maven/modrinth/{id}/maven-metadata.xml")] pub async fn maven_metadata( req: HttpRequest, - web::Path((project_id,)): web::Path<(String,)>, + params: web::Path<(String,)>, pool: web::Data, ) -> Result { + let project_id = params.into_inner().0; let project_data = - database::models::Project::get_full_from_slug_or_project_id(&project_id, &**pool).await?; + database::models::Project::get_full_from_slug_or_project_id(&*project_id, &**pool).await?; let data = if let Some(data) = project_data { data @@ -142,9 +143,10 @@ fn find_file<'a>( #[get("maven/modrinth/{id}/{versionnum}/{file}")] pub async fn version_file( req: HttpRequest, - web::Path((project_id, vnum, file)): web::Path<(String, String, String)>, + params: web::Path<(String, String, String)>, pool: web::Data, ) -> Result { + let (project_id, vnum, file) = params.into_inner(); let project_data = database::models::Project::get_full_from_slug_or_project_id(&project_id, &**pool).await?; @@ -200,7 +202,7 @@ pub async fn version_file( .body(yaserde::ser::to_string(&respdata).map_err(ApiError::XmlError)?)); } else if let Some(selected_file) = find_file(&project_id, &project, &version, &file) { return Ok(HttpResponse::TemporaryRedirect() - .header("location", &*selected_file.url) + .append_header(("location", &*selected_file.url)) .body("")); } @@ -210,9 +212,10 @@ pub async fn version_file( #[get("maven/modrinth/{id}/{versionnum}/{file}.sha1")] pub async fn version_file_sha1( req: HttpRequest, - web::Path((project_id, vnum, file)): web::Path<(String, String, String)>, + params: web::Path<(String, String, String)>, pool: web::Data, ) -> Result { + let (project_id, vnum, file) = params.into_inner(); let project_data = database::models::Project::get_full_from_slug_or_project_id(&project_id, &**pool).await?; @@ -260,9 +263,10 @@ pub async fn version_file_sha1( #[get("maven/modrinth/{id}/{versionnum}/{file}.sha512")] pub async fn version_file_sha512( req: HttpRequest, - web::Path((project_id, vnum, file)): web::Path<(String, String, String)>, + params: web::Path<(String, String, String)>, pool: web::Data, ) -> Result { + let (project_id, vnum, file) = params.into_inner(); let project_data = database::models::Project::get_full_from_slug_or_project_id(&project_id, &**pool).await?; diff --git a/src/routes/project_creation.rs b/src/routes/project_creation.rs index 22ed0b4e9..8b83ee076 100644 --- a/src/routes/project_creation.rs +++ b/src/routes/project_creation.rs @@ -323,9 +323,7 @@ pub async fn project_create_inner( ))) })?; - let content_disposition = field.content_disposition().ok_or_else(|| { - CreateError::MissingValueError(String::from("Missing content disposition")) - })?; + let content_disposition = field.content_disposition(); let name = content_disposition .get_name() .ok_or_else(|| CreateError::MissingValueError(String::from("Missing content name")))?; @@ -409,9 +407,7 @@ pub async fn project_create_inner( while let Some(item) = payload.next().await { let mut field: Field = item.map_err(CreateError::MultipartError)?; - let content_disposition = field.content_disposition().ok_or_else(|| { - CreateError::MissingValueError("Missing content disposition".to_string()) - })?; + let content_disposition = field.content_disposition().clone(); let name = content_disposition .get_name() diff --git a/src/routes/v1/versions.rs b/src/routes/v1/versions.rs index b49242211..dd9a9f368 100644 --- a/src/routes/v1/versions.rs +++ b/src/routes/v1/versions.rs @@ -254,7 +254,7 @@ pub async fn download_version( if let Some(id) = result { let real_ip = req.connection_info(); - let ip_option = real_ip.borrow().remote_addr(); + let ip_option = real_ip.borrow().peer_addr(); if let Some(ip) = ip_option { let hash = sha1::Sha1::from(format!("{}{}", ip, pepper.pepper)).hexdigest(); @@ -312,7 +312,7 @@ pub async fn download_version( } } Ok(HttpResponse::TemporaryRedirect() - .header("Location", &*id.url) + .append_header(("Location", &*id.url)) .json(DownloadRedirect { url: id.url })) } else { Ok(HttpResponse::NotFound().body("")) diff --git a/src/routes/version_creation.rs b/src/routes/version_creation.rs index a69b6afd8..a88d420c5 100644 --- a/src/routes/version_creation.rs +++ b/src/routes/version_creation.rs @@ -106,9 +106,7 @@ async fn version_create_inner( while let Some(item) = payload.next().await { let mut field: Field = item.map_err(CreateError::MultipartError)?; - let content_disposition = field.content_disposition().ok_or_else(|| { - CreateError::MissingValueError("Missing content disposition".to_string()) - })?; + let content_disposition = field.content_disposition().clone(); let name = content_disposition .get_name() .ok_or_else(|| CreateError::MissingValueError("Missing content name".to_string()))?; @@ -511,9 +509,7 @@ async fn upload_file_to_version_inner( while let Some(item) = payload.next().await { let mut field: Field = item.map_err(CreateError::MultipartError)?; - let content_disposition = field.content_disposition().ok_or_else(|| { - CreateError::MissingValueError("Missing content disposition".to_string()) - })?; + let content_disposition = field.content_disposition().clone(); let name = content_disposition .get_name() .ok_or_else(|| CreateError::MissingValueError("Missing content name".to_string()))?; diff --git a/src/routes/version_file.rs b/src/routes/version_file.rs index df5a33cea..f52d112c7 100644 --- a/src/routes/version_file.rs +++ b/src/routes/version_file.rs @@ -105,7 +105,7 @@ pub async fn download_version( transaction.commit().await?; Ok(HttpResponse::TemporaryRedirect() - .header("Location", &*id.url) + .append_header(("Location", &*id.url)) .json(DownloadRedirect { url: id.url })) } else { Ok(HttpResponse::NotFound().body("")) @@ -128,10 +128,10 @@ async fn download_version_inner( if let Some(header) = req.headers().get("CF-Connecting-IP") { header.to_str().ok() } else { - real_ip.borrow().remote_addr() + real_ip.borrow().peer_addr() } } else { - real_ip.borrow().remote_addr() + real_ip.borrow().peer_addr() }; if let Some(ip) = ip_option { diff --git a/src/scheduler.rs b/src/scheduler.rs index ced311271..ef16ca98a 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -18,8 +18,10 @@ impl Scheduler { F: FnMut() -> R + Send + 'static, R: std::future::Future + Send + 'static, { - let future = time::interval(interval).for_each_concurrent(2, move |_| task()); - self.arbiter.send(future); + let future = + IntervalStream::new(time::interval(interval)).for_each_concurrent(2, move |_| task()); + + self.arbiter.spawn(future); } } @@ -72,6 +74,7 @@ pub enum VersionIndexingError { use crate::util::env::parse_var; use serde::Deserialize; +use tokio_stream::wrappers::IntervalStream; #[derive(Deserialize)] struct InputFormat<'a> { diff --git a/src/util/auth.rs b/src/util/auth.rs index 141f62df5..335aea4d0 100644 --- a/src/util/auth.rs +++ b/src/util/auth.rs @@ -3,7 +3,7 @@ use crate::database::models; use crate::database::models::project_item::QueryProject; use crate::models::users::{Role, User, UserId}; use crate::routes::ApiError; -use actix_web::http::HeaderMap; +use actix_web::http::header::HeaderMap; use actix_web::web; use serde::{Deserialize, Serialize}; use sqlx::PgPool; diff --git a/src/util/ext.rs b/src/util/ext.rs index ccc30b447..6093ce998 100644 --- a/src/util/ext.rs +++ b/src/util/ext.rs @@ -16,7 +16,7 @@ pub fn project_file_type(ext: &str) -> Option<&str> { match ext { "jar" => Some("application/java-archive"), "zip" => Some("application/zip"), - "mrpack" => Some("application/zip"), + "mrpack" => Some("application/x-modrinth-modpack+zip"), _ => None, } } diff --git a/src/validate/mod.rs b/src/validate/mod.rs index 7eb5b3593..cdf8852f3 100644 --- a/src/validate/mod.rs +++ b/src/validate/mod.rs @@ -22,7 +22,7 @@ pub enum ValidationError { #[error("Invalid Input: {0}")] InvalidInputError(std::borrow::Cow<'static, str>), #[error("Error while managing threads")] - BlockingError, + BlockingError(#[from] actix_web::error::BlockingError), } #[derive(Eq, PartialEq)] @@ -67,7 +67,7 @@ pub async fn validate_file( game_versions: Vec, all_game_versions: Vec, ) -> Result { - let res = actix_web::web::block(move || { + actix_web::web::block(move || { let reader = std::io::Cursor::new(data); let mut zip = zip::ZipArchive::new(reader)?; @@ -103,15 +103,7 @@ pub async fn validate_file( Ok(ValidationResult::Pass) } }) - .await; - - match res { - Ok(x) => Ok(x), - Err(err) => match err { - actix_web::error::BlockingError::Canceled => Err(ValidationError::BlockingError), - actix_web::error::BlockingError::Error(err) => Err(err), - }, - } + .await? } fn game_version_supported( diff --git a/src/validate/pack.rs b/src/validate/pack.rs index c8187fa3c..854cecee7 100644 --- a/src/validate/pack.rs +++ b/src/validate/pack.rs @@ -4,6 +4,7 @@ use crate::util::validate::validation_errors_to_string; use crate::validate::{SupportedGameVersions, ValidationError, ValidationResult}; use serde::{Deserialize, Serialize}; use std::io::{Cursor, Read}; +use std::path::Component; use validator::Validate; use zip::ZipArchive; @@ -155,6 +156,22 @@ impl super::Validator for PackValidator { "All pack files must provide a SHA1 hash!".into(), )); } + + let path = std::path::Path::new(file.path) + .components() + .next() + .ok_or_else(|| { + ValidationError::InvalidInputError("Invalid pack file path!".into()) + })?; + + match path { + Component::CurDir | Component::Normal(_) => {} + _ => { + return Err(ValidationError::InvalidInputError( + "Invalid pack file path!".into(), + )) + } + }; } Ok(ValidationResult::Pass)