diff --git a/Cargo.lock b/Cargo.lock index f1aaa07..c2aa5df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,11 +39,11 @@ dependencies = [ [[package]] name = "actix-codec" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "bytes", "futures-core", "futures-sink", @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129d4c88e98860e1758c5de288d1632b07970a16d59bdf7b8d66053d582bb71f" +checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743" dependencies = [ "actix-codec", "actix-rt", @@ -66,7 +66,7 @@ dependencies = [ "actix-tls", "actix-utils", "ahash 0.8.7", - "base64 0.21.7", + "base64", "bitflags 2.4.2", "brotli", "bytes", @@ -157,9 +157,9 @@ dependencies = [ [[package]] name = "actix-tls" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929e47cc23865cdb856e59673cfba2d28f00b3bbd060dfc80e33a00a3cea8317" +checksum = "d4cce60a2f2b477bc72e5cde0af1812a6e82d8fd85b5570a5dcf2a5bf2c5be5f" dependencies = [ "actix-rt", "actix-service", @@ -167,11 +167,11 @@ dependencies = [ "futures-core", "impl-more", "pin-project-lite", + "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.25.0", "tokio-util", "tracing", - "webpki-roots", ] [[package]] @@ -186,9 +186,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.4.1" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43428f3bf11dee6d166b00ec2df4e3aa8cc1606aaa0b7433c146852e2f4e03b" +checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984" dependencies = [ "actix-codec", "actix-http", @@ -342,9 +342,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220" [[package]] name = "anstyle-parse" @@ -382,19 +382,19 @@ checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" [[package]] name = "ap-relay" -version = "0.3.106" +version = "0.3.108" dependencies = [ "activitystreams", "activitystreams-ext", "actix-web", "actix-webfinger", "ammonia", - "anyhow", "async-cpupool", "background-jobs", - "base64 0.21.7", + "base64", "bcrypt", "clap", + "color-eyre", "config", "console-subscriber", "dashmap", @@ -421,8 +421,9 @@ dependencies = [ "rsa", "rsa-magic-public-key", "ructe", - "rustls", - "rustls-pemfile", + "rustls 0.22.2", + "rustls-channel-resolver", + "rustls-pemfile 2.0.0", "serde", "serde_json", "sled", @@ -431,7 +432,7 @@ dependencies = [ "thiserror", "time", "tokio", - "toml 0.8.8", + "toml", "tracing", "tracing-actix-web", "tracing-error", @@ -563,9 +564,9 @@ dependencies = [ [[package]] name = "background-jobs" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65f83277b60c9c889210ef54207cca1a8f7e6de916ad616ce4140d477c8a6094" +checksum = "50954581739942ccbf39f7723a250dd3044c32de2e2c7e5f8cf53cb35200136b" dependencies = [ "background-jobs-core", "background-jobs-metrics", @@ -574,11 +575,10 @@ dependencies = [ [[package]] name = "background-jobs-core" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ac54b76a9cb9bdf6bdb7a485181e9f9ab95e930aa34b6a74ebda76d04d6b11" +checksum = "dc0f2054eb1262a98306ef87d115c368aa1d38ecdf1cc5af08021e13eb0e55a8" dependencies = [ - "anyhow", "async-trait", "event-listener", "metrics", @@ -592,9 +592,9 @@ dependencies = [ [[package]] name = "background-jobs-metrics" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "119b921bdadd3bd666f8418054933e33b9d279203b8029c5881e3174c2821f79" +checksum = "617da80f3fe8fe9b042d07cab58cf92ba3098b2112c4c499a27f333ebab401d2" dependencies = [ "async-trait", "background-jobs-core", @@ -606,11 +606,10 @@ dependencies = [ [[package]] name = "background-jobs-tokio" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18cbc0bda6c07ffca4146ac88d93f93f93f374012a0c425c3a8b7fd34ccce4e" +checksum = "35759bf19b8b461e8d079f60565bf2ff8a76de36cdbe44d14de34cf4ae15c065" dependencies = [ - "anyhow", "async-trait", "background-jobs-core", "metrics", @@ -636,12 +635,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -669,7 +662,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d1c9c15093eb224f0baa400f38fcd713fc1391a6f1c389d886beef146d60a3" dependencies = [ - "base64 0.21.7", + "base64", "blowfish", "getrandom", "subtle", @@ -748,9 +741,9 @@ checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytecheck" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" dependencies = [ "bytecheck_derive", "ptr_meta", @@ -759,9 +752,9 @@ dependencies = [ [[package]] name = "bytecheck_derive" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" dependencies = [ "proc-macro2", "quote", @@ -812,9 +805,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "num-traits", ] @@ -869,6 +862,33 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "colorchoice" version = "1.0.0" @@ -886,20 +906,16 @@ dependencies = [ [[package]] name = "config" -version = "0.13.4" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" +checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" dependencies = [ - "async-trait", - "json5", "lazy_static", "nom", "pathdiff", - "ron", - "rust-ini", "serde", "serde_json", - "toml 0.5.11", + "toml", "yaml-rust", ] @@ -1190,12 +1206,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - [[package]] name = "dotenv" version = "0.15.0" @@ -1274,6 +1284,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fastrand" version = "2.0.1" @@ -1488,7 +1508,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.2", "slab", "tokio", "tokio-util", @@ -1530,7 +1550,7 @@ version = "7.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" dependencies = [ - "base64 0.21.7", + "base64", "byteorder", "flate2", "nom", @@ -1603,7 +1623,7 @@ dependencies = [ "actix-http", "actix-rt", "actix-web", - "base64 0.21.7", + "base64", "futures-core", "http-signature-normalization", "ring", @@ -1622,7 +1642,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86048ef6b1d59bcb2cdde0100bb16b1a29ce78ab6dd4a90706ba0791a2831b5a" dependencies = [ "async-trait", - "base64 0.21.7", + "base64", "http-signature-normalization", "httpdate", "reqwest", @@ -1682,9 +1702,9 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls", + "rustls 0.21.10", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", ] [[package]] @@ -1721,6 +1741,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.9.3" @@ -1733,9 +1759,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1804,9 +1830,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -1826,17 +1852,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - [[package]] name = "language-tags" version = "0.3.2" @@ -1854,9 +1869,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1929,9 +1944,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +checksum = "db2c024b41519440580066ba82aab04092b333e09066a5eb86c7c4890df31f22" dependencies = [ "hashbrown 0.14.3", ] @@ -2011,7 +2026,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a4c4718a371ddfb7806378f23617876eea8b82e5ff1324516bcd283249d9ea" dependencies = [ - "base64 0.21.7", + "base64", "hyper", "indexmap 1.9.3", "ipnet", @@ -2080,7 +2095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "697a6b40dffdc5de10c0cbd709dc2bc2039cea9dab8aaa636eb9a49d6b411780" dependencies = [ "aho-corasick 0.7.20", - "itertools 0.12.0", + "itertools 0.12.1", "lazy_static", "memchr", "rustc-hash", @@ -2106,9 +2121,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -2210,6 +2225,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.45" @@ -2286,7 +2307,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.1.0", + "indexmap 2.2.2", "js-sys", "once_cell", "pin-project-lite", @@ -2365,16 +2386,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.3", -] - [[package]] name = "outref" version = "0.1.0" @@ -2387,6 +2398,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "parcel_selectors" version = "0.26.4" @@ -2511,51 +2528,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pest" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "pest_meta" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" -dependencies = [ - "once_cell", - "pest", - "sha2", -] - [[package]] name = "phf" version = "0.10.1" @@ -2638,18 +2610,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", @@ -2739,9 +2711,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -2949,13 +2921,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick 1.1.2", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -2970,9 +2942,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick 1.1.2", "memchr", @@ -2993,20 +2965,20 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rend" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ "bytecheck", ] [[package]] name = "reqwest" -version = "0.11.23" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "encoding_rs", "futures-core", @@ -3024,14 +2996,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", - "rustls-pemfile", + "rustls 0.21.10", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tokio-util", "tower-service", "url", @@ -3060,9 +3033,9 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b1e66540e0cac90acadaf7109bf99c90d95abcc94b4c096bfa16a2d7aa7a71" +checksum = "5a0152176687dd5cfe7f507ac1cb1a491c679cfe483afd133a7db7aaea818bb3" dependencies = [ "anyhow", "async-trait", @@ -3090,9 +3063,9 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.43" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527a97cdfef66f65998b5f3b637c26f5a5ec09cc52a3f9932313ac645f4190f5" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" dependencies = [ "bitvec", "bytecheck", @@ -3108,26 +3081,15 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.43" +version = "0.7.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c462a1328c8e67e4d6dbad1eb0355dd43e8ab432c6e227a43657f16ade5033" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "ron" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" -dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", - "serde", -] - [[package]] name = "rsa" version = "0.9.6" @@ -3154,7 +3116,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88ca6a6947c6fe6454c93c3bb65b92f9680e6f9e906e75e30631110f2227344c" dependencies = [ - "base64 0.21.7", + "base64", "num-bigint-dig", "rsa", "thiserror", @@ -3183,7 +3145,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b0a930679d54e46fa4e66be3d9a333026da04d2b659e42aab4dfd1586452815" dependencies = [ - "base64 0.21.7", + "base64", "bytecount", "itertools 0.11.0", "md5", @@ -3192,16 +3154,6 @@ dependencies = [ "rsass", ] -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if", - "ordered-multimap", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -3231,19 +3183,59 @@ checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.2", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-channel-resolver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbd1941204442f051576a9a7ea8e8db074ad7fd43db1eb3378c3633f9f9e166" +dependencies = [ + "nanorand", + "rustls 0.22.2", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.7", + "base64", ] +[[package]] +name = "rustls-pemfile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +dependencies = [ + "base64", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -3254,6 +3246,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -3296,18 +3299,18 @@ checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", @@ -3316,9 +3319,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -3369,17 +3372,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sharded-slab" version = "0.1.7" @@ -3431,9 +3423,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "sketches-ddsketch" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" +checksum = "85636c14b73d81f541e525f585c0a2109e6744e1565b5c1668e31c70c10ed65c" [[package]] name = "slab" @@ -3462,9 +3454,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2593d31f82ead8df961d8bd23a64c2ccf2eb5dd34b0a34bfb4dd54011c72009e" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" @@ -3737,12 +3729,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -3757,10 +3750,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -3781,9 +3775,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -3826,7 +3820,18 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.10", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.2", + "rustls-pki-types", "tokio", ] @@ -3857,18 +3862,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.11" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "c6a4b9e8023eb94392d3dca65d717c53abc5dad49c07cb65bb8fcd87115fa325" dependencies = [ "serde", "serde_spanned", @@ -3887,11 +3883,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", @@ -3906,7 +3902,7 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-trait", "axum", - "base64 0.21.7", + "base64", "bytes", "futures-core", "futures-util", @@ -3935,7 +3931,7 @@ dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.21.7", + "base64", "bytes", "h2", "http", @@ -4110,12 +4106,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - [[package]] name = "unicase" version = "2.7.0" @@ -4184,9 +4174,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "atomic", "getrandom", @@ -4294,9 +4284,9 @@ checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -4327,9 +4317,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "winapi" @@ -4487,9 +4477,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "a7cad8365489051ae9f054164e459304af2e7e9bb407c958076c8bf4aef52da5" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 86e2d02..b1a7018 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.106" +version = "0.3.108" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" -repository = "https://git.asonix.dog/asonix/ap-relay" +repository = "https://git.asonix.dog/asonix/relay" keywords = ["activitypub", "relay"] edition = "2021" build = "src/build.rs" @@ -21,8 +21,7 @@ default = [] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -anyhow = "1.0" -actix-web = { version = "4.4.0", default-features = false, features = ["compress-brotli", "compress-gzip", "rustls-0_21"] } +actix-web = { version = "4.4.0", default-features = false, features = ["compress-brotli", "compress-gzip", "rustls-0_22"] } actix-webfinger = { version = "0.5.0", default-features = false } activitystreams = "0.7.0-alpha.25" activitystreams-ext = "0.1.0-alpha.3" @@ -31,7 +30,8 @@ async-cpupool = "0.2.0" bcrypt = "0.15" base64 = "0.21" clap = { version = "4.0.0", features = ["derive"] } -config = "0.13.0" +color-eyre = "0.6.2" +config = { version = "0.14.0", default-features = false, features = ["toml", "json", "yaml"] } console-subscriber = { version = "0.2", optional = true } dashmap = "5.1.0" dotenv = "0.15.0" @@ -57,11 +57,13 @@ reqwest-tracing = "0.4.5" ring = "0.17.5" rsa = { version = "0.9" } rsa-magic-public-key = "0.8.0" -rustls = "0.21.0" -rustls-pemfile = "1.0.1" +rustls = "0.22.0" +rustls-channel-resolver = "0.2.0" +rustls-pemfile = "2" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" sled = "0.34.7" +streem = "0.2.0" teloxide = { version = "0.12.0", default-features = false, features = [ "ctrlc_handler", "macros", @@ -80,10 +82,9 @@ tracing-subscriber = { version = "0.3", features = [ ] } tokio = { version = "1", features = ["full", "tracing"] } uuid = { version = "1", features = ["v4", "serde"] } -streem = "0.2.0" [dependencies.background-jobs] -version = "0.17.0" +version = "0.18.0" default-features = false features = ["error-logging", "metrics", "tokio"] @@ -101,7 +102,7 @@ features = ["middleware", "ring"] version = "0.7.9" [build-dependencies] -anyhow = "1.0" +color-eyre = "0.6.2" dotenv = "0.15.0" ructe = { version = "0.17.0", features = ["sass", "mime03"] } toml = "0.8.0" diff --git a/relay.nix b/relay.nix index f37ab32..4af63f2 100644 --- a/relay.nix +++ b/relay.nix @@ -5,7 +5,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.106"; + version = "0.3.108"; src = ./.; cargoLock.lockFile = ./Cargo.lock; diff --git a/src/build.rs b/src/build.rs index f21d5bb..31062d2 100644 --- a/src/build.rs +++ b/src/build.rs @@ -21,7 +21,7 @@ fn git_info() { } } -fn version_info() -> Result<(), anyhow::Error> { +fn version_info() -> color_eyre::Result<()> { let cargo_toml = Path::new(&std::env::var("CARGO_MANIFEST_DIR")?).join("Cargo.toml"); let mut file = File::open(cargo_toml)?; @@ -42,7 +42,7 @@ fn version_info() -> Result<(), anyhow::Error> { Ok(()) } -fn main() -> Result<(), anyhow::Error> { +fn main() -> color_eyre::Result<()> { dotenv::dotenv().ok(); git_info(); diff --git a/src/config.rs b/src/config.rs index 35520fd..bba4fd6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,9 +12,8 @@ use activitystreams::{ }; use config::Environment; use http_signature_normalization_actix::{digest::ring::Sha256, prelude::VerifyDigest}; -use rustls::{Certificate, PrivateKey}; +use rustls::sign::CertifiedKey; use std::{ - io::BufReader, net::{IpAddr, SocketAddr}, path::PathBuf, }; @@ -312,43 +311,34 @@ impl Config { Some((config.addr, config.port).into()) } - pub(crate) fn open_keys(&self) -> Result, PrivateKey)>, Error> { + pub(crate) async fn open_keys(&self) -> Result, Error> { let tls = if let Some(tls) = &self.tls { tls } else { - tracing::warn!("No TLS config present"); + tracing::info!("No TLS config present"); return Ok(None); }; - let mut certs_reader = BufReader::new(std::fs::File::open(&tls.cert)?); - let certs = rustls_pemfile::certs(&mut certs_reader)?; + let certs_bytes = tokio::fs::read(&tls.cert).await?; + let certs = + rustls_pemfile::certs(&mut certs_bytes.as_slice()).collect::, _>>()?; if certs.is_empty() { tracing::warn!("No certs read from certificate file"); return Ok(None); } - let mut key_reader = BufReader::new(std::fs::File::open(&tls.key)?); - let key = rustls_pemfile::read_one(&mut key_reader)?; - - let certs = certs.into_iter().map(Certificate).collect(); - - let key = if let Some(key) = key { - match key { - rustls_pemfile::Item::RSAKey(der) => PrivateKey(der), - rustls_pemfile::Item::PKCS8Key(der) => PrivateKey(der), - rustls_pemfile::Item::ECKey(der) => PrivateKey(der), - _ => { - tracing::warn!("Unknown key format: {:?}", key); - return Ok(None); - } - } + let key_bytes = tokio::fs::read(&tls.key).await?; + let key = if let Some(key) = rustls_pemfile::private_key(&mut key_bytes.as_slice())? { + key } else { tracing::warn!("Failed to read private key"); return Ok(None); }; - Ok(Some((certs, key))) + let key = rustls::crypto::ring::sign::any_supported_type(&key)?; + + Ok(Some(CertifiedKey::new(certs, key))) } pub(crate) fn footer_blurb(&self) -> Option> { diff --git a/src/error.rs b/src/error.rs index f83d931..05d5d1e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -4,54 +4,82 @@ use actix_web::{ http::StatusCode, HttpResponse, }; +use background_jobs::BoxError; +use color_eyre::eyre::Error as Report; use http_signature_normalization_reqwest::SignError; -use std::{convert::Infallible, fmt::Debug, io}; +use std::{convert::Infallible, io, sync::Arc}; use tokio::task::JoinError; -use tracing_error::SpanTrace; + +#[derive(Clone)] +struct ArcKind { + kind: Arc, +} + +impl std::fmt::Debug for ArcKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.kind.fmt(f) + } +} + +impl std::fmt::Display for ArcKind { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.kind.fmt(f) + } +} + +impl std::error::Error for ArcKind { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + self.kind.source() + } +} pub(crate) struct Error { - context: String, - kind: ErrorKind, + kind: ArcKind, + display: Box, + debug: Box, } impl Error { + fn kind(&self) -> &ErrorKind { + &self.kind.kind + } + pub(crate) fn is_breaker(&self) -> bool { - matches!(self.kind, ErrorKind::Breaker) + matches!(self.kind(), ErrorKind::Breaker) } pub(crate) fn is_not_found(&self) -> bool { - matches!(self.kind, ErrorKind::Status(_, StatusCode::NOT_FOUND)) + matches!(self.kind(), ErrorKind::Status(_, StatusCode::NOT_FOUND)) } pub(crate) fn is_bad_request(&self) -> bool { - matches!(self.kind, ErrorKind::Status(_, StatusCode::BAD_REQUEST)) + matches!(self.kind(), ErrorKind::Status(_, StatusCode::BAD_REQUEST)) } pub(crate) fn is_gone(&self) -> bool { - matches!(self.kind, ErrorKind::Status(_, StatusCode::GONE)) + matches!(self.kind(), ErrorKind::Status(_, StatusCode::GONE)) } pub(crate) fn is_malformed_json(&self) -> bool { - matches!(self.kind, ErrorKind::Json(_)) + matches!(self.kind(), ErrorKind::Json(_)) } } impl std::fmt::Debug for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "{:?}", self.kind) + f.write_str(&self.debug) } } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "{}", self.kind)?; - std::fmt::Display::fmt(&self.context, f) + f.write_str(&self.display) } } impl std::error::Error for Error { fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - self.kind.source() + self.kind().source() } } @@ -60,25 +88,36 @@ where ErrorKind: From, { fn from(error: T) -> Self { + let kind = ArcKind { + kind: Arc::new(ErrorKind::from(error)), + }; + let report = Report::new(kind.clone()); + let display = format!("{report}"); + let debug = format!("{report:?}"); + Error { - context: SpanTrace::capture().to_string(), - kind: error.into(), + kind, + display: Box::from(display), + debug: Box::from(debug), } } } #[derive(Debug, thiserror::Error)] pub(crate) enum ErrorKind { - #[error("Error queueing job, {0}")] - Queue(anyhow::Error), + #[error("Error in extractor")] + Extractor(#[from] crate::extractors::ErrorKind), - #[error("Error in configuration, {0}")] + #[error("Error queueing job")] + Queue(#[from] BoxError), + + #[error("Error in configuration")] Config(#[from] config::ConfigError), - #[error("Couldn't parse key, {0}")] + #[error("Couldn't parse key")] Pkcs8(#[from] rsa::pkcs8::Error), - #[error("Couldn't encode public key, {0}")] + #[error("Couldn't encode public key")] Spki(#[from] rsa::pkcs8::spki::Error), #[error("Couldn't sign request")] @@ -87,33 +126,36 @@ pub(crate) enum ErrorKind { #[error("Couldn't make request")] Reqwest(#[from] reqwest::Error), - #[error("Couldn't build client")] + #[error("Couldn't make request")] ReqwestMiddleware(#[from] reqwest_middleware::Error), - #[error("Couldn't parse IRI, {0}")] + #[error("Couldn't parse IRI")] ParseIri(#[from] activitystreams::iri_string::validate::Error), - #[error("Couldn't normalize IRI, {0}")] + #[error("Couldn't normalize IRI")] NormalizeIri(#[from] std::collections::TryReserveError), - #[error("Couldn't perform IO, {0}")] + #[error("Couldn't perform IO")] Io(#[from] io::Error), #[error("Couldn't sign string, {0}")] Rsa(rsa::errors::Error), - #[error("Couldn't use db, {0}")] + #[error("Couldn't use db")] Sled(#[from] sled::Error), - #[error("Couldn't do the json thing, {0}")] + #[error("Couldn't do the json thing")] Json(#[from] serde_json::Error), - #[error("Couldn't sign request, {0}")] + #[error("Couldn't sign request")] Sign(#[from] SignError), #[error("Couldn't sign digest")] Signature(#[from] rsa::signature::Error), + #[error("Couldn't prepare TLS private key")] + PrepareKey(#[from] rustls::Error), + #[error("Couldn't verify signature")] VerifySignature, @@ -144,10 +186,10 @@ pub(crate) enum ErrorKind { #[error("Wrong ActivityPub kind, {0}")] Kind(String), - #[error("Too many CPUs, {0}")] + #[error("Too many CPUs")] CpuCount(#[from] std::num::TryFromIntError), - #[error("{0}")] + #[error("Host mismatch")] HostMismatch(#[from] CheckError), #[error("Couldn't flush buffer")] @@ -201,7 +243,7 @@ pub(crate) enum ErrorKind { impl ResponseError for Error { fn status_code(&self) -> StatusCode { - match self.kind { + match self.kind() { ErrorKind::NotAllowed(_) | ErrorKind::WrongActor(_) | ErrorKind::BadActor(_, _) => { StatusCode::FORBIDDEN } @@ -221,7 +263,7 @@ impl ResponseError for Error { .insert_header(("Content-Type", "application/activity+json")) .body( serde_json::to_string(&serde_json::json!({ - "error": self.kind.to_string(), + "error": self.kind().to_string(), })) .unwrap_or_else(|_| "{}".to_string()), ) diff --git a/src/extractors.rs b/src/extractors.rs index 3d97ab2..d179906 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -1,19 +1,15 @@ use actix_web::{ dev::Payload, error::ParseError, - http::{ - header::{from_one_raw_str, Header, HeaderName, HeaderValue, TryIntoHeaderValue}, - StatusCode, - }, + http::header::{from_one_raw_str, Header, HeaderName, HeaderValue, TryIntoHeaderValue}, web::Data, - FromRequest, HttpMessage, HttpRequest, HttpResponse, ResponseError, + FromRequest, HttpMessage, HttpRequest, }; use bcrypt::{BcryptError, DEFAULT_COST}; use http_signature_normalization_actix::{prelude::InvalidHeaderValue, Canceled, Spawn}; use std::{convert::Infallible, str::FromStr, time::Instant}; -use tracing_error::SpanTrace; -use crate::{db::Db, future::LocalBoxFuture, spawner::Spawner}; +use crate::{db::Db, error::Error, future::LocalBoxFuture, spawner::Spawner}; #[derive(Clone)] pub(crate) struct AdminConfig { @@ -83,74 +79,42 @@ impl Admin { } } -#[derive(Debug, thiserror::Error)] -#[error("Failed authentication")] -pub(crate) struct Error { - context: String, - #[source] - kind: ErrorKind, -} - impl Error { fn invalid() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::Invalid, - } + Error::from(ErrorKind::Invalid) } fn missing_config() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::MissingConfig, - } + Error::from(ErrorKind::MissingConfig) } fn missing_db() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::MissingDb, - } + Error::from(ErrorKind::MissingDb) } fn missing_spawner() -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::MissingSpawner, - } + Error::from(ErrorKind::MissingSpawner) } fn bcrypt_verify(e: BcryptError) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::BCryptVerify(e), - } + Error::from(ErrorKind::BCryptVerify(e)) } fn bcrypt_hash(e: BcryptError) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::BCryptHash(e), - } + Error::from(ErrorKind::BCryptHash(e)) } fn parse_header(e: ParseError) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::ParseHeader(e), - } + Error::from(ErrorKind::ParseHeader(e)) } fn canceled(_: Canceled) -> Self { - Error { - context: SpanTrace::capture().to_string(), - kind: ErrorKind::Canceled, - } + Error::from(ErrorKind::Canceled) } } #[derive(Debug, thiserror::Error)] -enum ErrorKind { +pub(crate) enum ErrorKind { #[error("Invalid API Token")] Invalid, @@ -176,20 +140,6 @@ enum ErrorKind { ParseHeader(#[source] ParseError), } -impl ResponseError for Error { - fn status_code(&self) -> StatusCode { - match self.kind { - ErrorKind::Invalid | ErrorKind::ParseHeader(_) => StatusCode::BAD_REQUEST, - _ => StatusCode::INTERNAL_SERVER_ERROR, - } - } - - fn error_response(&self) -> HttpResponse { - HttpResponse::build(self.status_code()) - .json(serde_json::json!({ "msg": self.kind.to_string() })) - } -} - impl FromRequest for Admin { type Error = Error; type Future = LocalBoxFuture<'static, Result>; diff --git a/src/jobs/apub/announce.rs b/src/jobs/apub/announce.rs index 833c483..73bc508 100644 --- a/src/jobs/apub/announce.rs +++ b/src/jobs/apub/announce.rs @@ -64,12 +64,13 @@ fn generate_announce( impl Job for Announce { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Announce"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/follow.rs b/src/jobs/apub/follow.rs index d916ffc..2b38bfb 100644 --- a/src/jobs/apub/follow.rs +++ b/src/jobs/apub/follow.rs @@ -113,12 +113,13 @@ fn generate_accept_follow( impl Job for Follow { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Follow"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/forward.rs b/src/jobs/apub/forward.rs index 7336fe8..0640ba2 100644 --- a/src/jobs/apub/forward.rs +++ b/src/jobs/apub/forward.rs @@ -49,12 +49,13 @@ impl Forward { impl Job for Forward { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Forward"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/reject.rs b/src/jobs/apub/reject.rs index 7a1bf40..d1d23db 100644 --- a/src/jobs/apub/reject.rs +++ b/src/jobs/apub/reject.rs @@ -35,12 +35,13 @@ impl Reject { impl Job for Reject { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Reject"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/apub/undo.rs b/src/jobs/apub/undo.rs index e45f06c..31c8797 100644 --- a/src/jobs/apub/undo.rs +++ b/src/jobs/apub/undo.rs @@ -50,12 +50,13 @@ impl Undo { impl Job for Undo { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::apub::Undo"; const QUEUE: &'static str = "apub"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/contact.rs b/src/jobs/contact.rs index 7e475f3..5213ca6 100644 --- a/src/jobs/contact.rs +++ b/src/jobs/contact.rs @@ -87,13 +87,14 @@ fn to_contact(contact: AcceptedActors) -> Option<(String, String, IriString, Iri impl Job for QueryContact { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::QueryContact"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/deliver.rs b/src/jobs/deliver.rs index 74af9f7..89c84d4 100644 --- a/src/jobs/deliver.rs +++ b/src/jobs/deliver.rs @@ -35,7 +35,7 @@ impl Deliver { } #[tracing::instrument(name = "Deliver", skip(state))] - async fn permform(self, state: JobState) -> Result<(), Error> { + async fn perform(self, state: JobState) -> Result<(), Error> { if let Err(e) = state .state .requests @@ -58,13 +58,14 @@ impl Deliver { impl Job for Deliver { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::Deliver"; const QUEUE: &'static str = "deliver"; const BACKOFF: Backoff = Backoff::Exponential(8); fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.permform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/deliver_many.rs b/src/jobs/deliver_many.rs index 8f7b413..8e063fe 100644 --- a/src/jobs/deliver_many.rs +++ b/src/jobs/deliver_many.rs @@ -47,12 +47,13 @@ impl DeliverMany { impl Job for DeliverMany { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::DeliverMany"; const QUEUE: &'static str = "deliver"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/instance.rs b/src/jobs/instance.rs index c7bb12f..a892fbb 100644 --- a/src/jobs/instance.rs +++ b/src/jobs/instance.rs @@ -167,13 +167,14 @@ impl QueryInstance { impl Job for QueryInstance { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::QueryInstance"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/nodeinfo.rs b/src/jobs/nodeinfo.rs index 41de14c..ce6a326 100644 --- a/src/jobs/nodeinfo.rs +++ b/src/jobs/nodeinfo.rs @@ -106,13 +106,14 @@ impl QueryNodeinfo { impl Job for QueryNodeinfo { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::QueryNodeinfo"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/process_listeners.rs b/src/jobs/process_listeners.rs index 96435b3..00f61a1 100644 --- a/src/jobs/process_listeners.rs +++ b/src/jobs/process_listeners.rs @@ -25,12 +25,13 @@ impl Listeners { impl Job for Listeners { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::Listeners"; const QUEUE: &'static str = "maintenance"; fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/jobs/record_last_online.rs b/src/jobs/record_last_online.rs index 59333f4..afaac74 100644 --- a/src/jobs/record_last_online.rs +++ b/src/jobs/record_last_online.rs @@ -15,13 +15,14 @@ impl RecordLastOnline { impl Job for RecordLastOnline { type State = JobState; - type Future = BoxFuture<'static, anyhow::Result<()>>; + type Error = Error; + type Future = BoxFuture<'static, Result<(), Self::Error>>; const NAME: &'static str = "relay::jobs::RecordLastOnline"; const QUEUE: &'static str = "maintenance"; const BACKOFF: Backoff = Backoff::Linear(1); fn run(self, state: Self::State) -> Self::Future { - Box::pin(async move { self.perform(state).await.map_err(Into::into) }) + Box::pin(self.perform(state)) } } diff --git a/src/main.rs b/src/main.rs index 4172e17..3bd94ad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,7 @@ use tokio::task::JoinHandle; use tracing_actix_web::TracingLogger; use tracing_error::ErrorLayer; use tracing_log::LogTracer; -use tracing_subscriber::{filter::Targets, fmt::format::FmtSpan, layer::SubscriberExt, Layer}; +use tracing_subscriber::{filter::Targets, layer::SubscriberExt, Layer}; mod admin; mod apub; @@ -56,16 +56,15 @@ use self::{ fn init_subscriber( software_name: &'static str, opentelemetry_url: Option<&IriString>, -) -> Result<(), anyhow::Error> { +) -> color_eyre::Result<()> { LogTracer::init()?; + color_eyre::install()?; let targets: Targets = std::env::var("RUST_LOG") - .unwrap_or_else(|_| "warn,actix_web=debug,actix_server=debug,tracing_actix_web=info".into()) + .unwrap_or_else(|_| "info".into()) .parse()?; - let format_layer = tracing_subscriber::fmt::layer() - .with_span_events(FmtSpan::NEW | FmtSpan::CLOSE) - .with_filter(targets.clone()); + let format_layer = tracing_subscriber::fmt::layer().with_filter(targets.clone()); #[cfg(feature = "console")] let console_layer = ConsoleLayer::builder() @@ -142,7 +141,7 @@ fn build_client( } #[tokio::main] -async fn main() -> Result<(), anyhow::Error> { +async fn main() -> color_eyre::Result<()> { dotenv::dotenv().ok(); let config = Config::build()?; @@ -168,30 +167,30 @@ async fn main() -> Result<(), anyhow::Error> { .add_recorder(recorder) .add_recorder(collector.clone()) .build(); - metrics::set_global_recorder(recorder).map_err(|e| anyhow::anyhow!("{e}"))?; + metrics::set_global_recorder(recorder).map_err(|e| color_eyre::eyre::eyre!("{e}"))?; } else { collector.install()?; } - tracing::warn!("Opening DB"); + tracing::info!("Opening DB"); let db = Db::build(&config)?; - tracing::warn!("Building caches"); + tracing::info!("Building caches"); let actors = ActorCache::new(db.clone()); let media = MediaCache::new(db.clone()); server_main(db, actors, media, collector, config).await?; - tracing::warn!("Application exit"); + tracing::info!("Application exit"); Ok(()) } -fn client_main(config: Config, args: Args) -> JoinHandle> { +fn client_main(config: Config, args: Args) -> JoinHandle> { tokio::spawn(do_client_main(config, args)) } -async fn do_client_main(config: Config, args: Args) -> Result<(), anyhow::Error> { +async fn do_client_main(config: Config, args: Args) -> color_eyre::Result<()> { let client = build_client( &config.user_agent(), config.client_timeout(), @@ -282,14 +281,14 @@ async fn server_main( media: MediaCache, collector: MemoryCollector, config: Config, -) -> Result<(), anyhow::Error> { +) -> color_eyre::Result<()> { let client = build_client( &config.user_agent(), config.client_timeout(), config.proxy_config(), )?; - tracing::warn!("Creating state"); + tracing::info!("Creating state"); let (signature_threads, verify_threads) = match config.signature_threads() { 0 | 1 => (1, 1), @@ -309,15 +308,19 @@ async fn server_main( let state = State::build(db.clone(), key_id, sign_spawner.clone(), client).await?; if let Some((token, admin_handle)) = config.telegram_info() { - tracing::warn!("Creating telegram handler"); + tracing::info!("Creating telegram handler"); telegram::start(admin_handle.to_owned(), db.clone(), token); } - let keys = config.open_keys()?; + let cert_resolver = config + .open_keys() + .await? + .map(rustls_channel_resolver::channel::<32>); let bind_address = config.bind_address(); let sign_spawner2 = sign_spawner.clone(); let verify_spawner2 = verify_spawner.clone(); + let config2 = config.clone(); let server = HttpServer::new(move || { let job_server = create_workers(state.clone(), actors.clone(), media.clone(), config.clone()) @@ -387,27 +390,42 @@ async fn server_main( ) }); - if let Some((certs, key)) = keys { - tracing::warn!("Binding to {}:{} with TLS", bind_address.0, bind_address.1); + if let Some((cert_tx, cert_rx)) = cert_resolver { + let handle = tokio::spawn(async move { + let mut interval = tokio::time::interval(Duration::from_secs(30)); + interval.tick().await; + + loop { + interval.tick().await; + + match config2.open_keys().await { + Ok(Some(key)) => cert_tx.update(key), + Ok(None) => tracing::warn!("Missing TLS keys"), + Err(e) => tracing::error!("Failed to read TLS keys {e}"), + } + } + }); + + tracing::info!("Binding to {}:{} with TLS", bind_address.0, bind_address.1); let server_config = ServerConfig::builder() - .with_safe_default_cipher_suites() - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions()? .with_no_client_auth() - .with_single_cert(certs, key)?; + .with_cert_resolver(cert_rx); server - .bind_rustls_021(bind_address, server_config)? + .bind_rustls_0_22(bind_address, server_config)? .run() .await?; + + handle.abort(); + let _ = handle.await; } else { - tracing::warn!("Binding to {}:{}", bind_address.0, bind_address.1); + tracing::info!("Binding to {}:{}", bind_address.0, bind_address.1); server.bind(bind_address)?.run().await?; } sign_spawner2.close().await; verify_spawner2.close().await; - tracing::warn!("Server closed"); + tracing::info!("Server closed"); Ok(()) } diff --git a/src/spawner.rs b/src/spawner.rs index b19aeff..8065022 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -8,7 +8,7 @@ pub(crate) struct Spawner { } impl Spawner { - pub(crate) fn build(name: &'static str, threads: u16) -> anyhow::Result { + pub(crate) fn build(name: &'static str, threads: u16) -> color_eyre::Result { let pool = CpuPool::configure() .name(name) .max_threads(threads)