From 9779518dc1d2bb04deb673cc4d9e5fadae87575e Mon Sep 17 00:00:00 2001 From: asonix Date: Sun, 16 Jul 2023 22:32:55 -0500 Subject: [PATCH 01/60] Allow rel attribute in local & footer blurb Patch from Jaehong Kang --- src/config.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/config.rs b/src/config.rs index bf58533..5b185dc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -291,7 +291,15 @@ impl Config { pub(crate) fn footer_blurb(&self) -> Option> { if let Some(blurb) = &self.footer_blurb { if !blurb.is_empty() { - return Some(crate::templates::Html(ammonia::clean(blurb))); + return Some(crate::templates::Html( + ammonia::Builder::new() + .add_tag_attributes("a", &["rel"]) + .add_tag_attributes("area", &["rel"]) + .add_tag_attributes("link", &["rel"]) + .link_rel(None) + .clean(blurb) + .to_string() + )); } } @@ -301,7 +309,15 @@ impl Config { pub(crate) fn local_blurb(&self) -> Option> { if let Some(blurb) = &self.local_blurb { if !blurb.is_empty() { - return Some(crate::templates::Html(ammonia::clean(blurb))); + return Some(crate::templates::Html( + ammonia::Builder::new() + .add_tag_attributes("a", &["rel"]) + .add_tag_attributes("area", &["rel"]) + .add_tag_attributes("link", &["rel"]) + .link_rel(None) + .clean(blurb) + .to_string() + )); } } From fb6d8af1ca860e16aad6ac6859578a17d3e0d3d3 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 19 Jul 2023 20:23:11 -0500 Subject: [PATCH 02/60] Update flake, dependencies --- Cargo.lock | 468 ++++++++++++++++++++++++++-------------------- Cargo.toml | 2 +- flake.lock | 12 +- src/data/actor.rs | 2 +- 4 files changed, 274 insertions(+), 210 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0a02148..d797e50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "activitystreams" -version = "0.7.0-alpha.24" +version = "0.7.0-alpha.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e673a517c3cd11c3b1870be31f2c95580e30f9ca79e89082ba94325097ed9c4" +checksum = "9c140d4bd704e9acd758c4392e222af44c66d1a29165937c9b33c7df7b697678" dependencies = [ "activitystreams-kinds", "iri-string", @@ -43,7 +43,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes", "futures-core", "futures-sink", @@ -67,7 +67,7 @@ dependencies = [ "actix-utils", "ahash 0.8.3", "base64 0.21.2", - "bitflags", + "bitflags 1.3.2", "brotli", "bytes", "bytestring", @@ -95,12 +95,12 @@ dependencies = [ [[package]] name = "actix-macros" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.26", ] [[package]] @@ -238,6 +238,15 @@ dependencies = [ "thiserror", ] +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -370,9 +379,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" @@ -419,7 +428,7 @@ dependencies = [ "thiserror", "time", "tokio", - "toml 0.7.4", + "toml 0.7.6", "tracing", "tracing-actix-web", "tracing-awc", @@ -469,18 +478,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] @@ -525,13 +534,13 @@ dependencies = [ [[package]] name = "axum" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +checksum = "a6a1de45611fdb535bfde7b7de4fd54f4fd2b17b1737c0a59b69bf9b92074b8c" dependencies = [ "async-trait", "axum-core", - "bitflags", + "bitflags 1.3.2", "bytes", "futures-util", "http", @@ -618,6 +627,21 @@ dependencies = [ "uuid", ] +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.1" @@ -655,6 +679,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "block-buffer" version = "0.10.4" @@ -762,9 +792,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.6" +version = "4.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6320c6d1c98b6981da7bb2dcecbd0be9dc98d42165fa8326b21000f7dbfde6d0" +checksum = "5b0827b011f6f8ab38590295339817b0d26f344aa4932c3ced71b45b0c54b4a9" dependencies = [ "clap_builder", "clap_derive", @@ -773,27 +803,26 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.5" +version = "4.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e53afce1efce6ed1f633cf0e57612fe51db54a1ee4fd8f8503d078fe02d69ae" +checksum = "9441b403be87be858db6a23edb493e7f694761acdc3343d5a0fcaafd304cbc9e" dependencies = [ "anstream", "anstyle", - "bitflags", "clap_lex", "strsim", ] [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] @@ -841,9 +870,9 @@ dependencies = [ [[package]] name = "console-subscriber" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ab2224a0311582eb03adba4caaf18644f7b1f10a760803a803b9b605187fc7" +checksum = "d4cf42660ac07fcebed809cfe561dd8730bcd35b075215e6479c516bcd0d11cb" dependencies = [ "console-api", "crossbeam-channel", @@ -865,9 +894,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" +checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" [[package]] name = "convert_case" @@ -877,9 +906,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "cpufeatures" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -942,7 +971,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "874c6e2d19f8d4a285083b11a3241bfbe01ac3ed85f26e1e6b34888d960552bd" dependencies = [ "derive_more", - "indexmap", + "indexmap 1.9.3", "nom", ] @@ -983,12 +1012,12 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.4.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d" dependencies = [ "cfg-if", - "hashbrown 0.12.3", + "hashbrown 0.14.0", "lock_api", "once_cell", "parking_lot_core 0.9.8", @@ -996,9 +1025,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56acb310e15652100da43d130af8d97b509e95af61aab1c5a7939ef24337ee17" +checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" dependencies = [ "const-oid", "pem-rfc7468", @@ -1071,6 +1100,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "erasable" version = "1.2.1" @@ -1218,7 +1253,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] @@ -1282,10 +1317,16 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.19" +name = "gimli" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "h2" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -1293,7 +1334,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -1311,13 +1352,19 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038" dependencies = [ "ahash 0.8.3", ] +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "hdrhistogram" version = "7.5.2" @@ -1339,18 +1386,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "html5ever" @@ -1438,9 +1476,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -1462,13 +1500,14 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ + "futures-util", "http", "hyper", - "rustls 0.21.2", + "rustls 0.21.5", "tokio", "tokio-rustls 0.24.1", ] @@ -1511,6 +1550,16 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + [[package]] name = "inout" version = "0.1.3" @@ -1529,22 +1578,11 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys", -] - [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "iri-string" @@ -1558,12 +1596,11 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", + "hermit-abi", "rustix", "windows-sys", ] @@ -1588,9 +1625,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" @@ -1629,9 +1666,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.146" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libm" @@ -1647,9 +1684,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "local-channel" @@ -1687,11 +1724,11 @@ checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lru" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" +checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" dependencies = [ - "hashbrown 0.13.2", + "hashbrown 0.13.1", ] [[package]] @@ -1735,7 +1772,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -1767,9 +1804,9 @@ dependencies = [ [[package]] name = "metrics" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa8ebbd1a9e57bbab77b9facae7f5136aea44c356943bf9a198f647da64285d6" +checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5" dependencies = [ "ahash 0.8.3", "metrics-macros", @@ -1784,7 +1821,7 @@ checksum = "8a4964177ddfdab1e3a2b37aec7cf320e14169abb0ed73999f558136409178d5" dependencies = [ "base64 0.21.2", "hyper", - "indexmap", + "indexmap 1.9.3", "ipnet", "metrics", "metrics-util", @@ -1801,20 +1838,20 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] name = "metrics-util" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111cb375987443c3de8d503580b536f77dc8416d32db62d9456db5d93bd7ac47" +checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" dependencies = [ - "aho-corasick 0.7.20", + "aho-corasick 1.0.2", "crossbeam-epoch", "crossbeam-utils", - "hashbrown 0.13.2", - "indexmap", + "hashbrown 0.13.1", + "indexmap 1.9.3", "metrics", "num_cpus", "ordered-float", @@ -1944,9 +1981,9 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2399c9463abc5f909349d8aa9ba080e0b88b3ce2885389b60b993f39b1a56905" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" dependencies = [ "byteorder", "lazy_static", @@ -2005,14 +2042,23 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -2069,7 +2115,7 @@ dependencies = [ "fnv", "futures-channel", "futures-util", - "indexmap", + "indexmap 1.9.3", "once_cell", "pin-project-lite", "thiserror", @@ -2184,9 +2230,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pathdiff" @@ -2211,9 +2257,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9" +checksum = "0d2d1d55045829d65aad9d389139882ad623b33b904e7c9f1b10c5b8927298e5" dependencies = [ "thiserror", "ucd-trie", @@ -2221,9 +2267,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b" +checksum = "5f94bca7e7a599d89dea5dfa309e217e7906c3c007fb9c3299c40b10d6a315d3" dependencies = [ "pest", "pest_generator", @@ -2231,22 +2277,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190" +checksum = "99d490fe7e8556575ff6911e45567ab95e71617f43781e5c05490dc8d75c965c" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] name = "pest_meta" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0" +checksum = "2674c66ebb4b4d9036012091b537aae5878970d6999f81a265034d85b136b341" dependencies = [ "once_cell", "pest", @@ -2293,29 +2339,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -2346,9 +2392,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.3.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "767eb9f07d4a5ebcb39bbf2d452058a93c011373abf6832e24194a1c3f004794" +checksum = "edc55135a600d700580e406b4de0d59cb9ad25e344a3a091a97ded2622ec4ec6" [[package]] name = "ppv-lite86" @@ -2388,9 +2434,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.60" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -2445,9 +2491,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.28" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] @@ -2498,7 +2544,7 @@ version = "10.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -2516,7 +2562,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -2525,18 +2571,19 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.4" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick 1.0.2", "memchr", - "regex-syntax 0.7.2", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", ] [[package]] @@ -2548,6 +2595,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick 1.0.2", + "memchr", + "regex-syntax 0.7.4", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -2556,9 +2614,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" @@ -2584,7 +2642,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.2", + "rustls 0.21.5", "rustls-pemfile", "serde", "serde_json", @@ -2624,7 +2682,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" dependencies = [ "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "serde", ] @@ -2705,6 +2763,12 @@ dependencies = [ "ordered-multimap", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2722,13 +2786,12 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.20" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", "windows-sys", @@ -2748,9 +2811,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.2" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f" +checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" dependencies = [ "log", "ring", @@ -2760,18 +2823,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ "base64 0.21.2", ] [[package]] name = "rustls-webpki" -version = "0.100.1" +version = "0.101.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +checksum = "15f36a6828982f422756984e47912a7a51dcbc2a197aa791158f8ca61cd8204e" dependencies = [ "ring", "untrusted", @@ -2779,21 +2842,21 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -2807,35 +2870,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.164" +version = "1.0.173" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "e91f70896d6720bc714a4a57d22fc91f1db634680e65c8efe13323f1fa38d53f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.173" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "a6250dde8342e0232232be9ca3db7aa40aceb5a3e5dd9bddbc00d99a007cde49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] name = "serde_json" -version = "1.0.97" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" +checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" dependencies = [ "itoa", "ryu", @@ -2844,9 +2907,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" dependencies = [ "serde", ] @@ -2964,9 +3027,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" @@ -3045,9 +3108,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.18" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ "proc-macro2", "quote", @@ -3104,7 +3167,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "303db260110c238e3af77bb9dff18bf7a5b5196f783059b0852aab75f91d5a16" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes", "chrono", "derive_more", @@ -3154,22 +3217,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] @@ -3184,9 +3247,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" dependencies = [ "itoa", "serde", @@ -3202,9 +3265,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" dependencies = [ "time-core", ] @@ -3226,11 +3289,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -3261,7 +3325,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] @@ -3281,7 +3345,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.2", + "rustls 0.21.5", "tokio", ] @@ -3321,9 +3385,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" dependencies = [ "serde", "serde_spanned", @@ -3333,20 +3397,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.10" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ - "indexmap", + "indexmap 2.0.0", "serde", "serde_spanned", "toml_datetime", @@ -3421,7 +3485,7 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", - "indexmap", + "indexmap 1.9.3", "pin-project", "pin-project-lite", "rand", @@ -3478,7 +3542,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", ] [[package]] @@ -3583,9 +3647,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicase" @@ -3604,9 +3668,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -3655,9 +3719,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.3.4" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa2982af2eec27de306107c027578ff7f423d65f7250e40ce0fea8f45248b81" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ "getrandom", "serde", @@ -3711,7 +3775,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", "wasm-bindgen-shared", ] @@ -3745,7 +3809,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.26", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3831,9 +3895,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -3888,9 +3952,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.7" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index d6358f9..4784b49 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ actix-web = { version = "4.0.1", default-features = false, features = [ "compress-gzip", ] } actix-webfinger = "0.4.0" -activitystreams = "0.7.0-alpha.21" +activitystreams = "0.7.0-alpha.25" activitystreams-ext = "0.1.0-alpha.3" ammonia = "3.1.0" awc = { version = "3.0.0", default-features = false, features = ["rustls"] } diff --git a/flake.lock b/flake.lock index 0cb587b..fc0942e 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1687171271, - "narHash": "sha256-BJlq+ozK2B1sJDQXS3tzJM5a+oVZmi1q0FlBK/Xqv7M=", + "lastModified": 1689068808, + "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", "owner": "numtide", "repo": "flake-utils", - "rev": "abfb11bd1aec8ced1c9bb9adfe68018230f4fb3c", + "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1687412861, - "narHash": "sha256-Z/g0wbL68C+mSGerYS2quv9FXQ1RRP082cAC0Bh4vcs=", + "lastModified": 1689679375, + "narHash": "sha256-LHUC52WvyVDi9PwyL1QCpaxYWBqp4ir4iL6zgOkmcb8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e603dc5f061ca1d8a19b3ede6a8cf9c9fcba6cdc", + "rev": "684c17c429c42515bafb3ad775d2a710947f3d67", "type": "github" }, "original": { diff --git a/src/data/actor.rs b/src/data/actor.rs index af6fb78..9c446f7 100644 --- a/src/data/actor.rs +++ b/src/data/actor.rs @@ -97,6 +97,6 @@ impl ActorCache { fn get_inbox(actor: &AcceptedActors) -> Result<&IriString, Error> { Ok(actor .endpoints()? - .and_then(|e| e.shared_inbox) + .and_then(|e| e.shared_inbox.as_ref()) .unwrap_or(actor.inbox()?)) } From 4651fcc9d261396814a998d1207c7fa64ed43614 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 19 Jul 2023 20:25:24 -0500 Subject: [PATCH 03/60] Update bcrypt, lru --- Cargo.lock | 20 +++++++++++++++----- Cargo.toml | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d797e50..910a74c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -309,6 +309,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "ammonia" version = "3.3.0" @@ -662,9 +668,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bcrypt" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df288bec72232f78c1ec5fe4e8f1d108aa0265476e93097593c803c8c02062a" +checksum = "28d1c9c15093eb224f0baa400f38fcd713fc1391a6f1c389d886beef146d60a3" dependencies = [ "base64 0.21.2", "blowfish", @@ -1364,6 +1370,10 @@ name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash 0.8.3", + "allocator-api2", +] [[package]] name = "hdrhistogram" @@ -1724,11 +1734,11 @@ checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "lru" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718e8fae447df0c7e1ba7f5189829e63fd536945c8988d61444c19039f16b670" +checksum = "eedb2bdbad7e0634f83989bf596f497b070130daaa398ab22d84c39e266deec5" dependencies = [ - "hashbrown 0.13.1", + "hashbrown 0.14.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4784b49..1f9960f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ activitystreams = "0.7.0-alpha.25" activitystreams-ext = "0.1.0-alpha.3" ammonia = "3.1.0" awc = { version = "3.0.0", default-features = false, features = ["rustls"] } -bcrypt = "0.14" +bcrypt = "0.15" base64 = "0.21" clap = { version = "4.0.0", features = ["derive"] } config = "0.13.0" @@ -41,7 +41,7 @@ console-subscriber = { version = "0.1", optional = true } dashmap = "5.1.0" dotenv = "0.15.0" futures-util = "0.3.17" -lru = "0.10.0" +lru = "0.11.0" metrics = "0.21.0" metrics-exporter-prometheus = { version = "0.12.0", default-features = false, features = [ "http-listener", From bcdef5caa105dcf947da6dec755ee17fd66dd682 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 21 Jul 2023 16:29:58 -0500 Subject: [PATCH 04/60] Don't clippy dependencies --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index a486d75..d1c5c83 100644 --- a/.drone.yml +++ b/.drone.yml @@ -22,7 +22,7 @@ steps: pull: always commands: - rustup component add clippy - - cargo clippy -- -D warnings + - cargo clippy --no-deps -- -D warnings trigger: event: From a65ff19f6a8db14fd7b17e2a6fed5783210a7864 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 21 Jul 2023 16:36:07 -0500 Subject: [PATCH 05/60] Remove unneeded mut --- src/collector.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/collector.rs b/src/collector.rs index 56a533d..b5674c7 100644 --- a/src/collector.rs +++ b/src/collector.rs @@ -159,7 +159,7 @@ impl Snapshot { let entry = merging.entry(name).or_insert_with(HashMap::new); for counter in counters { - let mut merge_counter = entry + let merge_counter = entry .entry(counter.labels.clone()) .or_insert_with(MergeCounter::default); if key == *start { From 09436746c81447f183af1f6515c79b22c1b417f8 Mon Sep 17 00:00:00 2001 From: asonix Date: Mon, 24 Jul 2023 13:19:40 -0500 Subject: [PATCH 06/60] Update dependencies --- Cargo.lock | 102 ++++++++++++++++++++++++++++------------------------- Cargo.toml | 2 +- 2 files changed, 55 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 910a74c..047b580 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,7 +100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -484,18 +484,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] name = "async-trait" -version = "0.1.71" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -798,9 +798,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.17" +version = "4.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0827b011f6f8ab38590295339817b0d26f344aa4932c3ced71b45b0c54b4a9" +checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" dependencies = [ "clap_builder", "clap_derive", @@ -809,9 +809,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.17" +version = "4.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9441b403be87be858db6a23edb493e7f694761acdc3343d5a0fcaafd304cbc9e" +checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" dependencies = [ "anstream", "anstyle", @@ -828,7 +828,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -1087,9 +1087,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" @@ -1151,12 +1151,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "flate2" @@ -1259,7 +1256,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -1633,6 +1630,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -1848,7 +1854,7 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -2042,9 +2048,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", "libm", @@ -2295,7 +2301,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -2364,7 +2370,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -2501,9 +2507,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.31" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -2733,9 +2739,9 @@ dependencies = [ [[package]] name = "rsass" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a43695dd28122f6c684273de89796a56a98e02e9694b8ab57b160fdc6e6d69af" +checksum = "ff273c95b8e067372ea9386d76e5aa28f36ff0cbb2b85f208921665070587a06" dependencies = [ "arc-swap", "fastrand", @@ -2750,13 +2756,13 @@ dependencies = [ [[package]] name = "ructe" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c86c1631418815c5947a34be5872806586c65398754ec91cc2df35a8e26ba8" +checksum = "9b0a930679d54e46fa4e66be3d9a333026da04d2b659e42aab4dfd1586452815" dependencies = [ "base64 0.21.2", "bytecount", - "itertools 0.10.5", + "itertools 0.11.0", "md5", "mime", "nom", @@ -2886,22 +2892,22 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.173" +version = "1.0.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91f70896d6720bc714a4a57d22fc91f1db634680e65c8efe13323f1fa38d53f" +checksum = "5d25439cd7397d044e2748a6fe2432b5e85db703d6d097bd014b3c0ad1ebff0b" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.173" +version = "1.0.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6250dde8342e0232232be9ca3db7aa40aceb5a3e5dd9bddbc00d99a007cde49" +checksum = "b23f7ade6f110613c0d63858ddb8b94c1041f550eab58a16b371bdf2c9c80ab4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -3118,9 +3124,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -3227,22 +3233,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -3335,7 +3341,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -3552,7 +3558,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", ] [[package]] @@ -3711,9 +3717,9 @@ dependencies = [ [[package]] name = "urlencoding" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "utf-8" @@ -3785,7 +3791,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", "wasm-bindgen-shared", ] @@ -3819,7 +3825,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.26", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/Cargo.toml b/Cargo.toml index 1f9960f..47b65c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -98,7 +98,7 @@ version = "0.7.5" [build-dependencies] anyhow = "1.0" dotenv = "0.15.0" -ructe = { version = "0.16.0", features = ["sass", "mime03"] } +ructe = { version = "0.17.0", features = ["sass", "mime03"] } toml = "0.7.0" [profile.dev.package.rsa] From 582f311a20cd56a4a8252a646e10c5f5eb50a8ab Mon Sep 17 00:00:00 2001 From: asonix Date: Mon, 24 Jul 2023 13:20:09 -0500 Subject: [PATCH 07/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 047b580..31dd8f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.85" +version = "0.3.86" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 47b65c2..201bbe1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.85" +version = "0.3.86" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 08d4a73..d56d2d0 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.85"; + version = "0.3.86"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From d1c6f6ff5d93cd3474fef75712d7017cfc709386 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 25 Jul 2023 14:45:15 -0500 Subject: [PATCH 08/60] Make delivery concurrency configurable --- src/config.rs | 13 +++++++++++-- src/jobs.rs | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/config.rs b/src/config.rs index 5b185dc..b7c9a2d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -45,6 +45,7 @@ pub(crate) struct ParsedConfig { local_blurb: Option, prometheus_addr: Option, prometheus_port: Option, + deliver_concurrency: u64, client_pool_size: usize, } @@ -69,6 +70,7 @@ pub struct Config { local_domains: Vec, local_blurb: Option, prometheus_config: Option, + deliver_concurrency: u64, client_pool_size: usize, } @@ -137,6 +139,7 @@ impl std::fmt::Debug for Config { .field("local_domains", &self.local_domains) .field("local_blurb", &self.local_blurb) .field("prometheus_config", &self.prometheus_config) + .field("deliver_concurrency", &self.deliver_concurrency) .field("client_pool_size", &self.client_pool_size) .finish() } @@ -167,6 +170,7 @@ impl Config { .set_default("local_blurb", None as Option<&str>)? .set_default("prometheus_addr", None as Option<&str>)? .set_default("prometheus_port", None as Option)? + .set_default("deliver_concurrency", 8u64)? .set_default("client_pool_size", 20u64)? .add_source(Environment::default()) .build()?; @@ -239,10 +243,15 @@ impl Config { local_domains, local_blurb: config.local_blurb, prometheus_config, + deliver_concurrency: config.deliver_concurrency, client_pool_size: config.client_pool_size, }) } + pub(crate) fn deliver_concurrency(&self) -> u64 { + self.deliver_concurrency + } + pub(crate) fn prometheus_bind_address(&self) -> Option { let config = self.prometheus_config.as_ref()?; @@ -298,7 +307,7 @@ impl Config { .add_tag_attributes("link", &["rel"]) .link_rel(None) .clean(blurb) - .to_string() + .to_string(), )); } } @@ -316,7 +325,7 @@ impl Config { .add_tag_attributes("link", &["rel"]) .link_rel(None) .clean(blurb) - .to_string() + .to_string(), )); } } diff --git a/src/jobs.rs b/src/jobs.rs index e2b6aef..ceae891 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -45,6 +45,8 @@ pub(crate) fn create_workers( media: MediaCache, config: Config, ) -> JobServer { + let deliver_concurrency = config.deliver_concurrency(); + let queue_handle = WorkerConfig::new(Storage::new(ActixTimer), move |queue_handle| { JobState::new( state.clone(), @@ -68,7 +70,7 @@ pub(crate) fn create_workers( .register::() .set_worker_count("maintenance", 2) .set_worker_count("apub", 2) - .set_worker_count("deliver", 8) + .set_worker_count("deliver", deliver_concurrency) .start(); queue_handle.every(Duration::from_secs(60 * 5), Listeners); From de97adc2d676bf1dcb76bbca55439ed383024a9a Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 25 Jul 2023 14:45:46 -0500 Subject: [PATCH 09/60] Update dependencies (minor & point) --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31dd8f3..76a256c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3968,9 +3968,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" +checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" dependencies = [ "memchr", ] From d365e34f47a65dbb1237007c6e95a56ee0b1745a Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 25 Jul 2023 14:46:44 -0500 Subject: [PATCH 10/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76a256c..c179ed7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.86" +version = "0.3.87" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 201bbe1..44a7c8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.86" +version = "0.3.87" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index d56d2d0..34bcfe7 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.86"; + version = "0.3.87"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From dfbd5c90356f194d3607a38325c8089d10fa81e9 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 25 Jul 2023 14:48:09 -0500 Subject: [PATCH 11/60] Add deliver_concurrency to readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 66a6544..320e2ce 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ LOCAL_BLURB="

Welcome to my cool relay where I have cool relay things happenin PROMETHEUS_ADDR=0.0.0.0 PROMETHEUS_PORT=9000 CLIENT_POOL_SIZE=20 +DELIVER_CONCURRENCY=8 ``` #### Descriptions @@ -160,6 +161,9 @@ Optional - How many connections the relay should maintain per thread. This value by the number of cores available to the relay. This defaults to 20, so a 4-core machine will have a maximum of 160 simultaneous outbound connections. If you run into problems related to "Too many open files", you can either decrease this number or increase the ulimit for your system. +##### `DELIVER_CONCURRENCY` +Optional - How many deliver requests the relay should allow to be in-flight per thread. the default +is 8 ### Subscribing Mastodon admins can subscribe to this relay by adding the `/inbox` route to their relay settings. From 970672a392cf8ce8e3bc82ae01dbdb4826b3847e Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 25 Jul 2023 16:06:56 -0500 Subject: [PATCH 12/60] Make client timeout configurable --- README.md | 4 ++++ src/config.rs | 9 +++++++++ src/data/state.rs | 1 + src/main.rs | 6 +++++- src/requests.rs | 7 ++++--- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 320e2ce..e1d7733 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ LOCAL_DOMAINS=masto.asonix.dog LOCAL_BLURB="

Welcome to my cool relay where I have cool relay things happening. I hope you enjoy your stay!

" PROMETHEUS_ADDR=0.0.0.0 PROMETHEUS_PORT=9000 +CLIENT_TIMEOUT=10 CLIENT_POOL_SIZE=20 DELIVER_CONCURRENCY=8 ``` @@ -156,6 +157,9 @@ Optional - description for the relay Optional - Address to bind to for serving the prometheus scrape endpoint ##### `PROMETHEUS_PORT` Optional - Port to bind to for serving the prometheus scrape endpoint +##### `CLIENT_TIMEOUT` +Optional - How long the relay will hold open a connection (in seconds) to a remote server during +fetches and deliveries. This defaults to 10 ##### `CLIENT_POOL_SIZE` Optional - How many connections the relay should maintain per thread. This value will be multiplied by the number of cores available to the relay. This defaults to 20, so a 4-core machine will have a diff --git a/src/config.rs b/src/config.rs index b7c9a2d..414de76 100644 --- a/src/config.rs +++ b/src/config.rs @@ -46,6 +46,7 @@ pub(crate) struct ParsedConfig { prometheus_addr: Option, prometheus_port: Option, deliver_concurrency: u64, + client_timeout: u64, client_pool_size: usize, } @@ -71,6 +72,7 @@ pub struct Config { local_blurb: Option, prometheus_config: Option, deliver_concurrency: u64, + client_timeout: u64, client_pool_size: usize, } @@ -140,6 +142,7 @@ impl std::fmt::Debug for Config { .field("local_blurb", &self.local_blurb) .field("prometheus_config", &self.prometheus_config) .field("deliver_concurrency", &self.deliver_concurrency) + .field("client_timeout", &self.client_timeout) .field("client_pool_size", &self.client_pool_size) .finish() } @@ -171,6 +174,7 @@ impl Config { .set_default("prometheus_addr", None as Option<&str>)? .set_default("prometheus_port", None as Option)? .set_default("deliver_concurrency", 8u64)? + .set_default("client_timeout", 10u64)? .set_default("client_pool_size", 20u64)? .add_source(Environment::default()) .build()?; @@ -244,10 +248,15 @@ impl Config { local_blurb: config.local_blurb, prometheus_config, deliver_concurrency: config.deliver_concurrency, + client_timeout: config.client_timeout, client_pool_size: config.client_pool_size, }) } + pub(crate) fn client_timeout(&self) -> u64 { + self.client_timeout + } + pub(crate) fn deliver_concurrency(&self) -> u64 { self.deliver_concurrency } diff --git a/src/data/state.rs b/src/data/state.rs index d6c484b..e673668 100644 --- a/src/data/state.rs +++ b/src/data/state.rs @@ -48,6 +48,7 @@ impl State { self.breakers.clone(), self.last_online.clone(), config.client_pool_size(), + config.client_timeout(), ) } diff --git a/src/main.rs b/src/main.rs index 6ce2f22..e837c4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -148,7 +148,11 @@ fn client_main(config: Config, args: Args) -> JoinHandle Result<(), anyhow::Error> { - let client = requests::build_client(&config.user_agent(), config.client_pool_size()); + let client = requests::build_client( + &config.user_agent(), + config.client_pool_size(), + config.client_timeout(), + ); if !args.blocks().is_empty() || !args.allowed().is_empty() { if args.undo() { diff --git a/src/requests.rs b/src/requests.rs index a1fc8ef..f7d2169 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -166,7 +166,7 @@ thread_local! { static CLIENT: std::cell::OnceCell = std::cell::OnceCell::new(); } -pub(crate) fn build_client(user_agent: &str, pool_size: usize) -> Client { +pub(crate) fn build_client(user_agent: &str, pool_size: usize, timeout_seconds: u64) -> Client { CLIENT.with(|client| { client .get_or_init(|| { @@ -176,7 +176,7 @@ pub(crate) fn build_client(user_agent: &str, pool_size: usize) -> Client { .connector(connector) .wrap(Tracing) .add_default_header(("User-Agent", user_agent.to_string())) - .timeout(Duration::from_secs(15)) + .timeout(Duration::from_secs(timeout_seconds)) .finish() }) .clone() @@ -191,10 +191,11 @@ impl Requests { breakers: Breakers, last_online: Arc, pool_size: usize, + timeout_seconds: u64, ) -> Self { Requests { pool_size, - client: build_client(&user_agent, pool_size), + client: build_client(&user_agent, pool_size, timeout_seconds), key_id, user_agent, private_key, From 8ff4961ded75688fbff08cc60498172d2ae0c3ae Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 25 Jul 2023 16:07:18 -0500 Subject: [PATCH 13/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c179ed7..e898b8a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.87" +version = "0.3.88" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 44a7c8f..4aaeb51 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.87" +version = "0.3.88" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 34bcfe7..5a74dc7 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.87"; + version = "0.3.88"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From d97cc4e5a4a1a305bba383f19e859217026911f4 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 26 Jul 2023 18:03:21 -0500 Subject: [PATCH 14/60] Use custom threadpool for client signatures --- Cargo.lock | 58 +++++++++++++++++----- Cargo.toml | 3 +- src/data/state.rs | 3 +- src/error.rs | 6 +++ src/jobs.rs | 7 ++- src/main.rs | 15 ++++-- src/requests.rs | 120 ++++++++++++++++++++++++++++++++++++++++++++-- 7 files changed, 189 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e898b8a..616689f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -409,6 +409,7 @@ dependencies = [ "console-subscriber", "dashmap", "dotenv", + "flume", "futures-util", "http-signature-normalization-actix", "lru", @@ -1165,6 +1166,19 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1315,8 +1329,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1444,9 +1460,9 @@ dependencies = [ [[package]] name = "http-signature-normalization-actix" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dc95d9ca3b4e2f93a97e5ccf9f26992c69a272e0abad8807180f0a9e9b59e31" +checksum = "218124b6b0c6ef27526493f50faf00b7cf8a3840bb1d5268f6ee8eef753b8225" dependencies = [ "actix-http", "actix-rt", @@ -1677,7 +1693,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin", + "spin 0.5.2", ] [[package]] @@ -1943,6 +1959,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + [[package]] name = "never" version = "0.1.0" @@ -2685,7 +2710,7 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi", @@ -2848,9 +2873,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.1" +version = "0.101.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f36a6828982f422756984e47912a7a51dcbc2a197aa791158f8ca61cd8204e" +checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" dependencies = [ "ring", "untrusted", @@ -2892,18 +2917,18 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.175" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d25439cd7397d044e2748a6fe2432b5e85db703d6d097bd014b3c0ad1ebff0b" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.175" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23f7ade6f110613c0d63858ddb8b94c1041f550eab58a16b371bdf2c9c80ab4" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", @@ -2912,9 +2937,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -3063,6 +3088,15 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "spki" version = "0.7.2" diff --git a/Cargo.toml b/Cargo.toml index 4aaeb51..9b965a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ config = "0.13.0" console-subscriber = { version = "0.1", optional = true } dashmap = "5.1.0" dotenv = "0.15.0" +flume = "0.10.14" futures-util = "0.3.17" lru = "0.11.0" metrics = "0.21.0" @@ -88,7 +89,7 @@ default-features = false features = ["background-jobs-actix", "error-logging"] [dependencies.http-signature-normalization-actix] -version = "0.8.0" +version = "0.9.1" default-features = false features = ["client", "server", "sha-2"] diff --git a/src/data/state.rs b/src/data/state.rs index e673668..c095efc 100644 --- a/src/data/state.rs +++ b/src/data/state.rs @@ -40,7 +40,7 @@ impl State { self.node_cache.clone() } - pub(crate) fn requests(&self, config: &Config) -> Requests { + pub(crate) fn requests(&self, config: &Config, spawner: crate::requests::Spawner) -> Requests { Requests::new( config.generate_url(UrlKind::MainKey).to_string(), self.private_key.clone(), @@ -49,6 +49,7 @@ impl State { self.last_online.clone(), config.client_pool_size(), config.client_timeout(), + spawner, ) } diff --git a/src/error.rs b/src/error.rs index c72b8b5..d03c995 100644 --- a/src/error.rs +++ b/src/error.rs @@ -242,3 +242,9 @@ impl From for ErrorKind { ErrorKind::Rsa(e) } } + +impl From for ErrorKind { + fn from(_: http_signature_normalization_actix::Canceled) -> Self { + Self::Canceled + } +} diff --git a/src/jobs.rs b/src/jobs.rs index ceae891..b32c1d2 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -17,7 +17,7 @@ use crate::{ data::{ActorCache, MediaCache, NodeCache, State}, error::{Error, ErrorKind}, jobs::{process_listeners::Listeners, record_last_online::RecordLastOnline}, - requests::Requests, + requests::{Requests, Spawner}, }; use background_jobs::{ memory_storage::{ActixTimer, Storage}, @@ -44,6 +44,7 @@ pub(crate) fn create_workers( actors: ActorCache, media: MediaCache, config: Config, + spawner: Spawner, ) -> JobServer { let deliver_concurrency = config.deliver_concurrency(); @@ -54,6 +55,7 @@ pub(crate) fn create_workers( JobServer::new(queue_handle), media.clone(), config.clone(), + spawner.clone(), ) }) .register::() @@ -110,9 +112,10 @@ impl JobState { job_server: JobServer, media: MediaCache, config: Config, + spawner: Spawner, ) -> Self { JobState { - requests: state.requests(&config), + requests: state.requests(&config, spawner), node_cache: state.node_cache(), actors, config, diff --git a/src/main.rs b/src/main.rs index e837c4d..d012102 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,6 +33,8 @@ mod requests; mod routes; mod telegram; +use crate::requests::Spawner; + use self::{ args::Args, config::Config, @@ -257,12 +259,19 @@ async fn do_server_main( let keys = config.open_keys()?; + let spawner = Spawner::build()?; + let bind_address = config.bind_address(); let server = HttpServer::new(move || { - let requests = state.requests(&config); + let requests = state.requests(&config, spawner.clone()); - let job_server = - create_workers(state.clone(), actors.clone(), media.clone(), config.clone()); + let job_server = create_workers( + state.clone(), + actors.clone(), + media.clone(), + config.clone(), + spawner.clone(), + ); let app = App::new() .app_data(web::Data::new(db.clone())) diff --git a/src/requests.rs b/src/requests.rs index f7d2169..ba95b53 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -7,7 +7,7 @@ use actix_web::http::header::Date; use awc::{error::SendRequestError, Client, ClientResponse, Connector}; use base64::{engine::general_purpose::STANDARD, Engine}; use dashmap::DashMap; -use http_signature_normalization_actix::prelude::*; +use http_signature_normalization_actix::{prelude::*, Canceled, Spawn}; use rand::thread_rng; use rsa::{ pkcs1v15::SigningKey, @@ -16,7 +16,12 @@ use rsa::{ RsaPrivateKey, }; use std::{ - sync::Arc, + panic::AssertUnwindSafe, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + thread::JoinHandle, time::{Duration, SystemTime}, }; use tracing_awc::Tracing; @@ -145,7 +150,7 @@ pub(crate) struct Requests { key_id: String, user_agent: String, private_key: RsaPrivateKey, - config: Config, + config: Config, breakers: Breakers, last_online: Arc, } @@ -192,6 +197,7 @@ impl Requests { last_online: Arc, pool_size: usize, timeout_seconds: u64, + spawner: Spawner, ) -> Self { Requests { pool_size, @@ -199,7 +205,7 @@ impl Requests { key_id, user_agent, private_key, - config: Config::default().mastodon_compat(), + config: Config::new().mastodon_compat().spawner(spawner), breakers, last_online, } @@ -415,3 +421,109 @@ impl Signer { Ok(STANDARD.encode(signature.to_bytes().as_ref())) } } + +fn signature_thread( + receiver: flume::Receiver>, + shutdown: flume::Receiver<()>, +) { + let stopping = AtomicBool::new(false); + while !stopping.load(Ordering::Acquire) { + flume::Selector::new() + .recv(&receiver, |res| match res { + Ok(f) => { + let res = std::panic::catch_unwind(AssertUnwindSafe(move || { + (f)(); + })); + + if let Err(e) = res { + tracing::warn!("Signature fn panicked: {e:?}"); + } + } + Err(_) => { + tracing::warn!("Receive error, stopping"); + stopping.store(true, Ordering::Release) + } + }) + .recv(&shutdown, |_| { + tracing::warn!("Stopping"); + stopping.store(true, Ordering::Release) + }) + .wait(); + } +} + +#[derive(Clone, Debug)] +pub(crate) struct Spawner { + sender: flume::Sender>, + threads: Option>>>, + shutdown: flume::Sender<()>, +} + +impl Spawner { + pub(crate) fn build() -> std::io::Result { + let threads = std::thread::available_parallelism() + .map(usize::from) + .unwrap_or(1); + + let (sender, receiver) = flume::bounded(8); + let (shutdown, shutdown_rx) = flume::bounded(threads); + + let threads = (0..threads) + .map(|i| { + let receiver = receiver.clone(); + let shutdown_rx = shutdown_rx.clone(); + std::thread::Builder::new() + .name(format!("signature-thread-{i}")) + .spawn(move || { + signature_thread(receiver, shutdown_rx); + }) + }) + .collect::, _>>()?; + + Ok(Spawner { + sender, + threads: Some(Arc::new(threads)), + shutdown, + }) + } +} + +impl Drop for Spawner { + fn drop(&mut self) { + if let Some(threads) = self.threads.take().and_then(Arc::into_inner) { + for _ in &threads { + let _ = self.shutdown.send(()); + } + + for thread in threads { + let _ = thread.join(); + } + } + } +} + +impl Spawn for Spawner { + type Future = std::pin::Pin>>>; + + fn spawn_blocking(&self, func: Func) -> Self::Future + where + Func: FnOnce() -> Out + Send + 'static, + Out: Send + 'static, + { + let sender = self.sender.clone(); + + Box::pin(async move { + let (tx, rx) = flume::bounded(1); + + let _ = sender + .send_async(Box::new(move || { + if tx.send((func)()).is_err() { + tracing::warn!("Requestor hung up"); + } + })) + .await; + + rx.recv_async().await.map_err(|_| Canceled) + }) + } +} From 7cfebd927ed9c5a54419913c02392bbfbc308aaa Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 26 Jul 2023 18:04:09 -0500 Subject: [PATCH 15/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- src/requests.rs | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 616689f..c34699e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.88" +version = "0.3.89" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 9b965a6..90b5fd8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.88" +version = "0.3.89" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 5a74dc7..e742317 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.88"; + version = "0.3.89"; src = ./.; cargoLock.lockFile = ./Cargo.lock; diff --git a/src/requests.rs b/src/requests.rs index ba95b53..be59bcd 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -189,6 +189,7 @@ pub(crate) fn build_client(user_agent: &str, pool_size: usize, timeout_seconds: } impl Requests { + #[allow(clippy::too_many_arguments)] pub(crate) fn new( key_id: String, private_key: RsaPrivateKey, From 73c7150f97cf0509e451379f5055fa245721910a Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 26 Jul 2023 18:11:44 -0500 Subject: [PATCH 16/60] Use spawner for CPU-bound operations --- src/extractors.rs | 35 +++++++++++++++++++++++-------- src/main.rs | 5 +++-- src/middleware/verifier.rs | 43 ++++++++++++++++++++++---------------- 3 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/extractors.rs b/src/extractors.rs index f56b9af..0311d6b 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -1,6 +1,6 @@ use actix_web::{ dev::Payload, - error::{BlockingError, ParseError}, + error::ParseError, http::{ header::{from_one_raw_str, Header, HeaderName, HeaderValue, TryIntoHeaderValue}, StatusCode, @@ -10,11 +10,11 @@ use actix_web::{ }; use bcrypt::{BcryptError, DEFAULT_COST}; use futures_util::future::LocalBoxFuture; -use http_signature_normalization_actix::prelude::InvalidHeaderValue; +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; +use crate::{db::Db, requests::Spawner}; #[derive(Clone)] pub(crate) struct AdminConfig { @@ -40,7 +40,7 @@ pub(crate) struct Admin { impl Admin { fn prepare_verify( req: &HttpRequest, - ) -> Result<(Data, Data, XApiToken), Error> { + ) -> Result<(Data, Data, Data, XApiToken), Error> { let hashed_api_token = req .app_data::>() .ok_or_else(Error::missing_config)? @@ -53,16 +53,23 @@ impl Admin { .ok_or_else(Error::missing_db)? .clone(); - Ok((db, hashed_api_token, x_api_token)) + let spawner = req + .app_data::>() + .ok_or_else(Error::missing_spawner)? + .clone(); + + Ok((db, hashed_api_token, spawner, x_api_token)) } #[tracing::instrument(level = "debug", skip_all)] async fn verify( hashed_api_token: Data, + spawner: Data, x_api_token: XApiToken, ) -> Result<(), Error> { let span = tracing::Span::current(); - if actix_web::web::block(move || span.in_scope(|| hashed_api_token.verify(x_api_token))) + if spawner + .spawn_blocking(move || span.in_scope(|| hashed_api_token.verify(x_api_token))) .await .map_err(Error::canceled)?? { @@ -107,6 +114,13 @@ impl Error { } } + fn missing_spawner() -> Self { + Error { + context: SpanTrace::capture().to_string(), + kind: ErrorKind::MissingSpawner, + } + } + fn bcrypt_verify(e: BcryptError) -> Self { Error { context: SpanTrace::capture().to_string(), @@ -128,7 +142,7 @@ impl Error { } } - fn canceled(_: BlockingError) -> Self { + fn canceled(_: Canceled) -> Self { Error { context: SpanTrace::capture().to_string(), kind: ErrorKind::Canceled, @@ -147,6 +161,9 @@ enum ErrorKind { #[error("Missing Db")] MissingDb, + #[error("Missing Spawner")] + MissingSpawner, + #[error("Panic in verify")] Canceled, @@ -182,8 +199,8 @@ impl FromRequest for Admin { let now = Instant::now(); let res = Self::prepare_verify(req); Box::pin(async move { - let (db, c, t) = res?; - Self::verify(c, t).await?; + let (db, c, s, t) = res?; + Self::verify(c, s, t).await?; metrics::histogram!( "relay.admin.verify", now.elapsed().as_micros() as f64 / 1_000_000_f64 diff --git a/src/main.rs b/src/main.rs index d012102..1e635e2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -281,7 +281,8 @@ async fn do_server_main( .app_data(web::Data::new(config.clone())) .app_data(web::Data::new(job_server)) .app_data(web::Data::new(media.clone())) - .app_data(web::Data::new(collector.clone())); + .app_data(web::Data::new(collector.clone())) + .app_data(web::Data::new(spawner.clone())); let app = if let Some(data) = config.admin_config() { app.app_data(data) @@ -299,7 +300,7 @@ async fn do_server_main( web::resource("/inbox") .wrap(config.digest_middleware()) .wrap(VerifySignature::new( - MyVerify(requests, actors.clone(), state.clone()), + MyVerify(requests, actors.clone(), state.clone(), spawner.clone()), Default::default(), )) .wrap(DebugPayload(config.debug())) diff --git a/src/middleware/verifier.rs b/src/middleware/verifier.rs index 6528b83..4845329 100644 --- a/src/middleware/verifier.rs +++ b/src/middleware/verifier.rs @@ -2,12 +2,11 @@ use crate::{ apub::AcceptedActors, data::{ActorCache, State}, error::{Error, ErrorKind}, - requests::Requests, + requests::{Requests, Spawner}, }; use activitystreams::{base::BaseExt, iri, iri_string::types::IriString}; -use actix_web::web; use base64::{engine::general_purpose::STANDARD, Engine}; -use http_signature_normalization_actix::{prelude::*, verify::DeprecatedAlgorithm}; +use http_signature_normalization_actix::{prelude::*, verify::DeprecatedAlgorithm, Spawn}; use rsa::{ pkcs1v15::Signature, pkcs1v15::VerifyingKey, pkcs8::DecodePublicKey, sha2::Sha256, signature::Verifier, RsaPublicKey, @@ -15,7 +14,7 @@ use rsa::{ use std::{future::Future, pin::Pin}; #[derive(Clone, Debug)] -pub(crate) struct MyVerify(pub Requests, pub ActorCache, pub State); +pub(crate) struct MyVerify(pub Requests, pub ActorCache, pub State, pub Spawner); impl MyVerify { #[tracing::instrument("Verify request", skip(self, signature, signing_string))] @@ -55,7 +54,13 @@ impl MyVerify { None => (), }; - let res = do_verify(&actor.public_key, signature.clone(), signing_string.clone()).await; + let res = do_verify( + &self.3, + &actor.public_key, + signature.clone(), + signing_string.clone(), + ) + .await; if let Err(e) = res { if !was_cached { @@ -85,7 +90,7 @@ impl MyVerify { // Now we make sure we fetch an updated actor let actor = self.1.get_no_cache(&actor_id, &self.0).await?; - do_verify(&actor.public_key, signature, signing_string).await?; + do_verify(&self.3, &actor.public_key, signature, signing_string).await?; Ok(true) } @@ -116,6 +121,7 @@ impl PublicKeyResponse { #[tracing::instrument("Verify signature")] async fn do_verify( + spawner: &Spawner, public_key: &str, signature: String, signing_string: String, @@ -123,21 +129,22 @@ async fn do_verify( let public_key = RsaPublicKey::from_public_key_pem(public_key.trim())?; let span = tracing::Span::current(); - web::block(move || { - span.in_scope(|| { - let decoded = STANDARD.decode(signature)?; - let signature = - Signature::try_from(decoded.as_slice()).map_err(ErrorKind::ReadSignature)?; + spawner + .spawn_blocking(move || { + span.in_scope(|| { + let decoded = STANDARD.decode(signature)?; + let signature = + Signature::try_from(decoded.as_slice()).map_err(ErrorKind::ReadSignature)?; - let verifying_key = VerifyingKey::::new(public_key); - verifying_key - .verify(signing_string.as_bytes(), &signature) - .map_err(ErrorKind::VerifySignature)?; + let verifying_key = VerifyingKey::::new(public_key); + verifying_key + .verify(signing_string.as_bytes(), &signature) + .map_err(ErrorKind::VerifySignature)?; - Ok(()) as Result<(), Error> + Ok(()) as Result<(), Error> + }) }) - }) - .await??; + .await??; Ok(()) } From 5d526c60fe2562c2f5e202e2ae8ddaf218d4ac33 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 26 Jul 2023 19:29:03 -0500 Subject: [PATCH 17/60] Clippy :( --- src/extractors.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extractors.rs b/src/extractors.rs index 0311d6b..1fddee7 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -37,10 +37,10 @@ pub(crate) struct Admin { db: Data, } +type PrepareTuple = (Data, Data, Data, XApiToken); + impl Admin { - fn prepare_verify( - req: &HttpRequest, - ) -> Result<(Data, Data, Data, XApiToken), Error> { + fn prepare_verify(req: &HttpRequest) -> Result { let hashed_api_token = req .app_data::>() .ok_or_else(Error::missing_config)? From 11d81683e3a8cb5ec3ffcba72f97e80bfd79b3c0 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 26 Jul 2023 22:51:07 -0500 Subject: [PATCH 18/60] Add logging around parallelism --- src/requests.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/requests.rs b/src/requests.rs index be59bcd..c8c4199 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -464,11 +464,14 @@ impl Spawner { pub(crate) fn build() -> std::io::Result { let threads = std::thread::available_parallelism() .map(usize::from) + .map_err(|e| tracing::warn!("Failed to get parallelism, {e}")) .unwrap_or(1); let (sender, receiver) = flume::bounded(8); let (shutdown, shutdown_rx) = flume::bounded(threads); + tracing::warn!("Launching {threads} signature threads"); + let threads = (0..threads) .map(|i| { let receiver = receiver.clone(); From 78dcce5a08b3ba25f5271721b4cd26b98c98f310 Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 26 Jul 2023 22:51:41 -0500 Subject: [PATCH 19/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c34699e..68e5b29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.89" +version = "0.3.90" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 90b5fd8..7ad223e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.89" +version = "0.3.90" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index e742317..3d56fd3 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.89"; + version = "0.3.90"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 8071c6ce3f781a7021197fa6e20f776fcebadbbf Mon Sep 17 00:00:00 2001 From: asonix Date: Wed, 26 Jul 2023 23:04:04 -0500 Subject: [PATCH 20/60] Make signature threads configurable --- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 5 +++++ relay.nix | 2 +- src/config.rs | 14 ++++++++++++++ src/main.rs | 2 +- src/requests.rs | 7 +------ 7 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68e5b29..43f4dd3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.90" +version = "0.3.91" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 7ad223e..ce4e026 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.90" +version = "0.3.91" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/README.md b/README.md index e1d7733..24b1566 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ PROMETHEUS_PORT=9000 CLIENT_TIMEOUT=10 CLIENT_POOL_SIZE=20 DELIVER_CONCURRENCY=8 +SIGNATURE_THREADS=2 ``` #### Descriptions @@ -168,6 +169,10 @@ files", you can either decrease this number or increase the ulimit for your syst ##### `DELIVER_CONCURRENCY` Optional - How many deliver requests the relay should allow to be in-flight per thread. the default is 8 +##### `SIGNATURE_THREADS` +Optional - Override number of threads used for signing and verifying requests. Default is +`std::thread::available_parallelism()` (It tries to detect how many cores you have). If it cannot +detect the correct number of cores, it falls back to 1. ### Subscribing Mastodon admins can subscribe to this relay by adding the `/inbox` route to their relay settings. diff --git a/relay.nix b/relay.nix index 3d56fd3..caccc38 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.90"; + version = "0.3.91"; src = ./.; cargoLock.lockFile = ./Cargo.lock; diff --git a/src/config.rs b/src/config.rs index 414de76..be46fc6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -48,6 +48,7 @@ pub(crate) struct ParsedConfig { deliver_concurrency: u64, client_timeout: u64, client_pool_size: usize, + signature_threads: Option, } #[derive(Clone)] @@ -74,6 +75,7 @@ pub struct Config { deliver_concurrency: u64, client_timeout: u64, client_pool_size: usize, + signature_threads: Option, } #[derive(Clone)] @@ -144,6 +146,7 @@ impl std::fmt::Debug for Config { .field("deliver_concurrency", &self.deliver_concurrency) .field("client_timeout", &self.client_timeout) .field("client_pool_size", &self.client_pool_size) + .field("signature_threads", &self.signature_threads) .finish() } } @@ -176,6 +179,7 @@ impl Config { .set_default("deliver_concurrency", 8u64)? .set_default("client_timeout", 10u64)? .set_default("client_pool_size", 20u64)? + .set_default("signature_threads", None as Option)? .add_source(Environment::default()) .build()?; @@ -250,6 +254,16 @@ impl Config { deliver_concurrency: config.deliver_concurrency, client_timeout: config.client_timeout, client_pool_size: config.client_pool_size, + signature_threads: config.signature_threads, + }) + } + + pub(crate) fn signature_threads(&self) -> usize { + self.signature_threads.unwrap_or_else(|| { + std::thread::available_parallelism() + .map(usize::from) + .map_err(|e| tracing::warn!("Failed to get parallelism, {e}")) + .unwrap_or(1) }) } diff --git a/src/main.rs b/src/main.rs index 1e635e2..e151937 100644 --- a/src/main.rs +++ b/src/main.rs @@ -259,7 +259,7 @@ async fn do_server_main( let keys = config.open_keys()?; - let spawner = Spawner::build()?; + let spawner = Spawner::build(config.signature_threads())?; let bind_address = config.bind_address(); let server = HttpServer::new(move || { diff --git a/src/requests.rs b/src/requests.rs index c8c4199..8883dba 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -461,12 +461,7 @@ pub(crate) struct Spawner { } impl Spawner { - pub(crate) fn build() -> std::io::Result { - let threads = std::thread::available_parallelism() - .map(usize::from) - .map_err(|e| tracing::warn!("Failed to get parallelism, {e}")) - .unwrap_or(1); - + pub(crate) fn build(threads: usize) -> std::io::Result { let (sender, receiver) = flume::bounded(8); let (shutdown, shutdown_rx) = flume::bounded(threads); From 240eee730c8ffedb6ef52c72ae14c353de7d8520 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 09:26:16 -0500 Subject: [PATCH 21/60] Add more metrics around spawn-blocking --- src/requests.rs | 86 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/src/requests.rs b/src/requests.rs index 8883dba..6dfe6f7 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -22,7 +22,7 @@ use std::{ Arc, }, thread::JoinHandle, - time::{Duration, SystemTime}, + time::{Duration, Instant, SystemTime}, }; use tracing_awc::Tracing; @@ -234,7 +234,7 @@ impl Requests { if let Ok(bytes) = res.body().await { if let Ok(s) = String::from_utf8(bytes.as_ref().to_vec()) { if !s.is_empty() { - tracing::warn!("Response from {parsed_url}, {s}"); + tracing::debug!("Response from {parsed_url}, {s}"); } } } @@ -426,15 +426,22 @@ impl Signer { fn signature_thread( receiver: flume::Receiver>, shutdown: flume::Receiver<()>, + id: usize, ) { + let guard = MetricsGuard::guard(id); let stopping = AtomicBool::new(false); + while !stopping.load(Ordering::Acquire) { flume::Selector::new() .recv(&receiver, |res| match res { Ok(f) => { + let start = Instant::now(); + metrics::increment_counter!("relay.signature-thread.operation.start", "id" => id.to_string()); let res = std::panic::catch_unwind(AssertUnwindSafe(move || { (f)(); })); + metrics::increment_counter!("relay.signature-thread.operation.end", "complete" => res.is_ok().to_string(), "id" => id.to_string()); + metrics::histogram!("relay.signature-thread.operation.duration", start.elapsed().as_secs_f64(), "id" => id.to_string()); if let Err(e) = res { tracing::warn!("Signature fn panicked: {e:?}"); @@ -445,12 +452,18 @@ fn signature_thread( stopping.store(true, Ordering::Release) } }) - .recv(&shutdown, |_| { - tracing::warn!("Stopping"); + .recv(&shutdown, |res| { + if res.is_ok() { + tracing::warn!("Stopping"); + } else { + tracing::warn!("Shutdown receive error, stopping"); + } stopping.store(true, Ordering::Release) }) .wait(); } + + guard.disarm(); } #[derive(Clone, Debug)] @@ -460,6 +473,35 @@ pub(crate) struct Spawner { shutdown: flume::Sender<()>, } +struct MetricsGuard { + id: usize, + start: Instant, + armed: bool, +} + +impl MetricsGuard { + fn guard(id: usize) -> Self { + metrics::increment_counter!("relay.signature-thread.launched", "id" => id.to_string()); + + Self { + id, + start: Instant::now(), + armed: true, + } + } + + fn disarm(mut self) { + self.armed = false; + } +} + +impl Drop for MetricsGuard { + fn drop(&mut self) { + metrics::increment_counter!("relay.signature-thread.closed", "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); + metrics::histogram!("relay.signature-thread.duration", self.start.elapsed().as_secs_f64(), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); + } +} + impl Spawner { pub(crate) fn build(threads: usize) -> std::io::Result { let (sender, receiver) = flume::bounded(8); @@ -474,7 +516,7 @@ impl Spawner { std::thread::Builder::new() .name(format!("signature-thread-{i}")) .spawn(move || { - signature_thread(receiver, shutdown_rx); + signature_thread(receiver, shutdown_rx, i); }) }) .collect::, _>>()?; @@ -501,6 +543,37 @@ impl Drop for Spawner { } } +async fn timer(fut: Fut) -> Fut::Output +where + Fut: std::future::Future, +{ + let id = uuid::Uuid::new_v4(); + + metrics::increment_counter!("relay.spawner.wait-timer.start"); + + let mut interval = actix_rt::time::interval(Duration::from_secs(5)); + + // pass the first tick (instant) + interval.tick().await; + + let mut fut = std::pin::pin!(fut); + + let mut counter = 0; + loop { + tokio::select! { + out = &mut fut => { + metrics::increment_counter!("relay.spawner.wait-timer.end"); + return out; + } + _ = interval.tick() => { + counter += 1; + metrics::increment_counter!("relay.spawner.wait-timer.pending"); + tracing::warn!("Blocking operation {id} is taking a long time, {} seconds", counter * 5); + } + } + } +} + impl Spawn for Spawner { type Future = std::pin::Pin>>>; @@ -518,11 +591,12 @@ impl Spawn for Spawner { .send_async(Box::new(move || { if tx.send((func)()).is_err() { tracing::warn!("Requestor hung up"); + metrics::increment_counter!("relay.spawner.disconnected"); } })) .await; - rx.recv_async().await.map_err(|_| Canceled) + timer(rx.recv_async()).await.map_err(|_| Canceled) }) } } From 2a7fed743fb3c5f15b9e97a42fdcd77ce22604b9 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 09:26:49 -0500 Subject: [PATCH 22/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 43f4dd3..2934c9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.91" +version = "0.3.92" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index ce4e026..7c647ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.91" +version = "0.3.92" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index caccc38..9331747 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.91"; + version = "0.3.92"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 05c266c23ca31bc697223a580111db40bfc966f8 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 09:55:13 -0500 Subject: [PATCH 23/60] Give verify & admin a different queue than deliver --- src/main.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index e151937..86aac68 100644 --- a/src/main.rs +++ b/src/main.rs @@ -260,6 +260,7 @@ async fn do_server_main( let keys = config.open_keys()?; let spawner = Spawner::build(config.signature_threads())?; + let verify_spawner = Spawner::build((config.signature_threads() / 2).max(1))?; let bind_address = config.bind_address(); let server = HttpServer::new(move || { @@ -282,7 +283,7 @@ async fn do_server_main( .app_data(web::Data::new(job_server)) .app_data(web::Data::new(media.clone())) .app_data(web::Data::new(collector.clone())) - .app_data(web::Data::new(spawner.clone())); + .app_data(web::Data::new(verify_spawner.clone())); let app = if let Some(data) = config.admin_config() { app.app_data(data) @@ -300,7 +301,12 @@ async fn do_server_main( web::resource("/inbox") .wrap(config.digest_middleware()) .wrap(VerifySignature::new( - MyVerify(requests, actors.clone(), state.clone(), spawner.clone()), + MyVerify( + requests, + actors.clone(), + state.clone(), + verify_spawner.clone(), + ), Default::default(), )) .wrap(DebugPayload(config.debug())) From fff9bf112d8e515dbdb00300b3b148762f845472 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 09:57:13 -0500 Subject: [PATCH 24/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2934c9e..9a98304 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.92" +version = "0.3.93" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 7c647ee..123bfec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.92" +version = "0.3.93" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 9331747..a8f4037 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.92"; + version = "0.3.93"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 769f7451f984c2f4f4de888d0529b4de64249ee5 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 10:19:20 -0500 Subject: [PATCH 25/60] Simplify signature thread --- src/data/state.rs | 3 +- src/extractors.rs | 2 +- src/jobs.rs | 3 +- src/main.rs | 4 +- src/middleware/verifier.rs | 3 +- src/requests.rs | 190 +------------------------------------ src/spawner.rs | 157 ++++++++++++++++++++++++++++++ 7 files changed, 170 insertions(+), 192 deletions(-) create mode 100644 src/spawner.rs diff --git a/src/data/state.rs b/src/data/state.rs index c095efc..7dcc0dd 100644 --- a/src/data/state.rs +++ b/src/data/state.rs @@ -4,6 +4,7 @@ use crate::{ db::Db, error::Error, requests::{Breakers, Requests}, + spawner::Spawner, }; use activitystreams::iri_string::types::IriString; use actix_web::web; @@ -40,7 +41,7 @@ impl State { self.node_cache.clone() } - pub(crate) fn requests(&self, config: &Config, spawner: crate::requests::Spawner) -> Requests { + pub(crate) fn requests(&self, config: &Config, spawner: Spawner) -> Requests { Requests::new( config.generate_url(UrlKind::MainKey).to_string(), self.private_key.clone(), diff --git a/src/extractors.rs b/src/extractors.rs index 1fddee7..2301ee4 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -14,7 +14,7 @@ use http_signature_normalization_actix::{prelude::InvalidHeaderValue, Canceled, use std::{convert::Infallible, str::FromStr, time::Instant}; use tracing_error::SpanTrace; -use crate::{db::Db, requests::Spawner}; +use crate::{db::Db, spawner::Spawner}; #[derive(Clone)] pub(crate) struct AdminConfig { diff --git a/src/jobs.rs b/src/jobs.rs index b32c1d2..7635b3c 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -17,7 +17,8 @@ use crate::{ data::{ActorCache, MediaCache, NodeCache, State}, error::{Error, ErrorKind}, jobs::{process_listeners::Listeners, record_last_online::RecordLastOnline}, - requests::{Requests, Spawner}, + requests::Requests, + spawner::Spawner, }; use background_jobs::{ memory_storage::{ActixTimer, Storage}, diff --git a/src/main.rs b/src/main.rs index 86aac68..0133d86 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,10 +31,9 @@ mod jobs; mod middleware; mod requests; mod routes; +mod spawner; mod telegram; -use crate::requests::Spawner; - use self::{ args::Args, config::Config, @@ -43,6 +42,7 @@ use self::{ jobs::create_workers, middleware::{DebugPayload, MyVerify, RelayResolver, Timings}, routes::{actor, healthz, inbox, index, nodeinfo, nodeinfo_meta, statics}, + spawner::Spawner, }; fn init_subscriber( diff --git a/src/middleware/verifier.rs b/src/middleware/verifier.rs index 4845329..f5cfad7 100644 --- a/src/middleware/verifier.rs +++ b/src/middleware/verifier.rs @@ -2,7 +2,8 @@ use crate::{ apub::AcceptedActors, data::{ActorCache, State}, error::{Error, ErrorKind}, - requests::{Requests, Spawner}, + requests::Requests, + spawner::Spawner, }; use activitystreams::{base::BaseExt, iri, iri_string::types::IriString}; use base64::{engine::general_purpose::STANDARD, Engine}; diff --git a/src/requests.rs b/src/requests.rs index 6dfe6f7..f1cd1bc 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -1,13 +1,14 @@ use crate::{ data::LastOnline, error::{Error, ErrorKind}, + spawner::Spawner, }; use activitystreams::iri_string::types::IriString; use actix_web::http::header::Date; use awc::{error::SendRequestError, Client, ClientResponse, Connector}; use base64::{engine::general_purpose::STANDARD, Engine}; use dashmap::DashMap; -use http_signature_normalization_actix::{prelude::*, Canceled, Spawn}; +use http_signature_normalization_actix::prelude::*; use rand::thread_rng; use rsa::{ pkcs1v15::SigningKey, @@ -16,13 +17,8 @@ use rsa::{ RsaPrivateKey, }; use std::{ - panic::AssertUnwindSafe, - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, - }, - thread::JoinHandle, - time::{Duration, Instant, SystemTime}, + sync::Arc, + time::{Duration, SystemTime}, }; use tracing_awc::Tracing; @@ -422,181 +418,3 @@ impl Signer { Ok(STANDARD.encode(signature.to_bytes().as_ref())) } } - -fn signature_thread( - receiver: flume::Receiver>, - shutdown: flume::Receiver<()>, - id: usize, -) { - let guard = MetricsGuard::guard(id); - let stopping = AtomicBool::new(false); - - while !stopping.load(Ordering::Acquire) { - flume::Selector::new() - .recv(&receiver, |res| match res { - Ok(f) => { - let start = Instant::now(); - metrics::increment_counter!("relay.signature-thread.operation.start", "id" => id.to_string()); - let res = std::panic::catch_unwind(AssertUnwindSafe(move || { - (f)(); - })); - metrics::increment_counter!("relay.signature-thread.operation.end", "complete" => res.is_ok().to_string(), "id" => id.to_string()); - metrics::histogram!("relay.signature-thread.operation.duration", start.elapsed().as_secs_f64(), "id" => id.to_string()); - - if let Err(e) = res { - tracing::warn!("Signature fn panicked: {e:?}"); - } - } - Err(_) => { - tracing::warn!("Receive error, stopping"); - stopping.store(true, Ordering::Release) - } - }) - .recv(&shutdown, |res| { - if res.is_ok() { - tracing::warn!("Stopping"); - } else { - tracing::warn!("Shutdown receive error, stopping"); - } - stopping.store(true, Ordering::Release) - }) - .wait(); - } - - guard.disarm(); -} - -#[derive(Clone, Debug)] -pub(crate) struct Spawner { - sender: flume::Sender>, - threads: Option>>>, - shutdown: flume::Sender<()>, -} - -struct MetricsGuard { - id: usize, - start: Instant, - armed: bool, -} - -impl MetricsGuard { - fn guard(id: usize) -> Self { - metrics::increment_counter!("relay.signature-thread.launched", "id" => id.to_string()); - - Self { - id, - start: Instant::now(), - armed: true, - } - } - - fn disarm(mut self) { - self.armed = false; - } -} - -impl Drop for MetricsGuard { - fn drop(&mut self) { - metrics::increment_counter!("relay.signature-thread.closed", "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); - metrics::histogram!("relay.signature-thread.duration", self.start.elapsed().as_secs_f64(), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); - } -} - -impl Spawner { - pub(crate) fn build(threads: usize) -> std::io::Result { - let (sender, receiver) = flume::bounded(8); - let (shutdown, shutdown_rx) = flume::bounded(threads); - - tracing::warn!("Launching {threads} signature threads"); - - let threads = (0..threads) - .map(|i| { - let receiver = receiver.clone(); - let shutdown_rx = shutdown_rx.clone(); - std::thread::Builder::new() - .name(format!("signature-thread-{i}")) - .spawn(move || { - signature_thread(receiver, shutdown_rx, i); - }) - }) - .collect::, _>>()?; - - Ok(Spawner { - sender, - threads: Some(Arc::new(threads)), - shutdown, - }) - } -} - -impl Drop for Spawner { - fn drop(&mut self) { - if let Some(threads) = self.threads.take().and_then(Arc::into_inner) { - for _ in &threads { - let _ = self.shutdown.send(()); - } - - for thread in threads { - let _ = thread.join(); - } - } - } -} - -async fn timer(fut: Fut) -> Fut::Output -where - Fut: std::future::Future, -{ - let id = uuid::Uuid::new_v4(); - - metrics::increment_counter!("relay.spawner.wait-timer.start"); - - let mut interval = actix_rt::time::interval(Duration::from_secs(5)); - - // pass the first tick (instant) - interval.tick().await; - - let mut fut = std::pin::pin!(fut); - - let mut counter = 0; - loop { - tokio::select! { - out = &mut fut => { - metrics::increment_counter!("relay.spawner.wait-timer.end"); - return out; - } - _ = interval.tick() => { - counter += 1; - metrics::increment_counter!("relay.spawner.wait-timer.pending"); - tracing::warn!("Blocking operation {id} is taking a long time, {} seconds", counter * 5); - } - } - } -} - -impl Spawn for Spawner { - type Future = std::pin::Pin>>>; - - fn spawn_blocking(&self, func: Func) -> Self::Future - where - Func: FnOnce() -> Out + Send + 'static, - Out: Send + 'static, - { - let sender = self.sender.clone(); - - Box::pin(async move { - let (tx, rx) = flume::bounded(1); - - let _ = sender - .send_async(Box::new(move || { - if tx.send((func)()).is_err() { - tracing::warn!("Requestor hung up"); - metrics::increment_counter!("relay.spawner.disconnected"); - } - })) - .await; - - timer(rx.recv_async()).await.map_err(|_| Canceled) - }) - } -} diff --git a/src/spawner.rs b/src/spawner.rs new file mode 100644 index 0000000..a0aaa5c --- /dev/null +++ b/src/spawner.rs @@ -0,0 +1,157 @@ +use http_signature_normalization_actix::{Canceled, Spawn}; +use std::{ + panic::AssertUnwindSafe, + sync::Arc, + thread::JoinHandle, + time::{Duration, Instant}, +}; + +fn signature_thread(receiver: flume::Receiver>, id: usize) { + let guard = MetricsGuard::guard(id); + + while let Ok(f) = receiver.recv() { + let start = Instant::now(); + metrics::increment_counter!("relay.signature-thread.operation.start", "id" => id.to_string()); + let res = std::panic::catch_unwind(AssertUnwindSafe(move || { + (f)(); + })); + metrics::increment_counter!("relay.signature-thread.operation.end", "complete" => res.is_ok().to_string(), "id" => id.to_string()); + metrics::histogram!("relay.signature-thread.operation.duration", start.elapsed().as_secs_f64(), "id" => id.to_string()); + + if let Err(e) = res { + tracing::warn!("Signature fn panicked: {e:?}"); + } + } + + guard.disarm(); +} + +#[derive(Clone, Debug)] +pub(crate) struct Spawner { + sender: Option>>, + threads: Option>>>, +} + +struct MetricsGuard { + id: usize, + start: Instant, + armed: bool, +} + +impl MetricsGuard { + fn guard(id: usize) -> Self { + metrics::increment_counter!("relay.signature-thread.launched", "id" => id.to_string()); + + Self { + id, + start: Instant::now(), + armed: true, + } + } + + fn disarm(mut self) { + self.armed = false; + } +} + +impl Drop for MetricsGuard { + fn drop(&mut self) { + metrics::increment_counter!("relay.signature-thread.closed", "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); + metrics::histogram!("relay.signature-thread.duration", self.start.elapsed().as_secs_f64(), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); + tracing::warn!("Stopping signature thread"); + } +} + +impl Spawner { + pub(crate) fn build(threads: usize) -> std::io::Result { + let (sender, receiver) = flume::bounded(8); + + tracing::warn!("Launching {threads} signature threads"); + + let threads = (0..threads) + .map(|i| { + let receiver = receiver.clone(); + std::thread::Builder::new() + .name(format!("signature-thread-{i}")) + .spawn(move || { + signature_thread(receiver, i); + }) + }) + .collect::, _>>()?; + + Ok(Spawner { + sender: Some(sender), + threads: Some(Arc::new(threads)), + }) + } +} + +impl Drop for Spawner { + fn drop(&mut self) { + self.sender.take(); + + if let Some(threads) = self.threads.take().and_then(Arc::into_inner) { + for thread in threads { + let _ = thread.join(); + } + } + } +} + +async fn timer(fut: Fut) -> Fut::Output +where + Fut: std::future::Future, +{ + let id = uuid::Uuid::new_v4(); + + metrics::increment_counter!("relay.spawner.wait-timer.start"); + + let mut interval = actix_rt::time::interval(Duration::from_secs(5)); + + // pass the first tick (instant) + interval.tick().await; + + let mut fut = std::pin::pin!(fut); + + let mut counter = 0; + loop { + tokio::select! { + out = &mut fut => { + metrics::increment_counter!("relay.spawner.wait-timer.end"); + return out; + } + _ = interval.tick() => { + counter += 1; + metrics::increment_counter!("relay.spawner.wait-timer.pending"); + tracing::warn!("Blocking operation {id} is taking a long time, {} seconds", counter * 5); + } + } + } +} + +impl Spawn for Spawner { + type Future = std::pin::Pin>>>; + + fn spawn_blocking(&self, func: Func) -> Self::Future + where + Func: FnOnce() -> Out + Send + 'static, + Out: Send + 'static, + { + let sender = self.sender.as_ref().expect("Sender exists").clone(); + + Box::pin(async move { + let (tx, rx) = flume::bounded(1); + + let _ = sender + .send_async(Box::new(move || { + if tx.try_send((func)()).is_err() { + tracing::warn!("Requestor hung up"); + metrics::increment_counter!("relay.spawner.disconnected"); + } + })) + .await; + + timer(rx.recv_async()).await.map_err(|_| Canceled) + }) + } +} From 5de244b8481862028c882dd3b9b995f764e5cb9d Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 10:39:24 -0500 Subject: [PATCH 26/60] Add complete to signature thread duration --- src/spawner.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/spawner.rs b/src/spawner.rs index a0aaa5c..5b765cb 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -12,11 +12,9 @@ fn signature_thread(receiver: flume::Receiver>, id: usi while let Ok(f) = receiver.recv() { let start = Instant::now(); metrics::increment_counter!("relay.signature-thread.operation.start", "id" => id.to_string()); - let res = std::panic::catch_unwind(AssertUnwindSafe(move || { - (f)(); - })); + let res = std::panic::catch_unwind(AssertUnwindSafe(f)); metrics::increment_counter!("relay.signature-thread.operation.end", "complete" => res.is_ok().to_string(), "id" => id.to_string()); - metrics::histogram!("relay.signature-thread.operation.duration", start.elapsed().as_secs_f64(), "id" => id.to_string()); + metrics::histogram!("relay.signature-thread.operation.duration", start.elapsed().as_secs_f64(), "complete" => res.is_ok().to_string(), "id" => id.to_string()); if let Err(e) = res { tracing::warn!("Signature fn panicked: {e:?}"); From f24685e700bbabfc166fbcdf5c98eac76c0f9515 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 10:53:01 -0500 Subject: [PATCH 27/60] Allow naming spawner threads --- src/main.rs | 4 ++-- src/spawner.rs | 39 ++++++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0133d86..9cd1fd4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -259,8 +259,8 @@ async fn do_server_main( let keys = config.open_keys()?; - let spawner = Spawner::build(config.signature_threads())?; - let verify_spawner = Spawner::build((config.signature_threads() / 2).max(1))?; + let spawner = Spawner::build("signature-thread", config.signature_threads())?; + let verify_spawner = Spawner::build("verify-thread", (config.signature_threads() / 8).max(1))?; let bind_address = config.bind_address(); let server = HttpServer::new(move || { diff --git a/src/spawner.rs b/src/spawner.rs index 5b765cb..a6c4c87 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -6,18 +6,22 @@ use std::{ time::{Duration, Instant}, }; -fn signature_thread(receiver: flume::Receiver>, id: usize) { - let guard = MetricsGuard::guard(id); +fn spawner_thread( + receiver: flume::Receiver>, + name: &'static str, + id: usize, +) { + let guard = MetricsGuard::guard(name, id); while let Ok(f) = receiver.recv() { let start = Instant::now(); - metrics::increment_counter!("relay.signature-thread.operation.start", "id" => id.to_string()); + metrics::increment_counter!(format!("relay.{name}.operation.start"), "id" => id.to_string()); let res = std::panic::catch_unwind(AssertUnwindSafe(f)); - metrics::increment_counter!("relay.signature-thread.operation.end", "complete" => res.is_ok().to_string(), "id" => id.to_string()); - metrics::histogram!("relay.signature-thread.operation.duration", start.elapsed().as_secs_f64(), "complete" => res.is_ok().to_string(), "id" => id.to_string()); + metrics::increment_counter!(format!("relay.{name}.operation.end"), "complete" => res.is_ok().to_string(), "id" => id.to_string()); + metrics::histogram!(format!("relay.{name}.operation.duration"), start.elapsed().as_secs_f64(), "complete" => res.is_ok().to_string(), "id" => id.to_string()); if let Err(e) = res { - tracing::warn!("Signature fn panicked: {e:?}"); + tracing::warn!("{name} fn panicked: {e:?}"); } } @@ -26,21 +30,24 @@ fn signature_thread(receiver: flume::Receiver>, id: usi #[derive(Clone, Debug)] pub(crate) struct Spawner { + name: &'static str, sender: Option>>, threads: Option>>>, } struct MetricsGuard { + name: &'static str, id: usize, start: Instant, armed: bool, } impl MetricsGuard { - fn guard(id: usize) -> Self { - metrics::increment_counter!("relay.signature-thread.launched", "id" => id.to_string()); + fn guard(name: &'static str, id: usize) -> Self { + metrics::increment_counter!(format!("relay.{name}.launched"), "id" => id.to_string()); Self { + name, id, start: Instant::now(), armed: true, @@ -54,30 +61,31 @@ impl MetricsGuard { impl Drop for MetricsGuard { fn drop(&mut self) { - metrics::increment_counter!("relay.signature-thread.closed", "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); - metrics::histogram!("relay.signature-thread.duration", self.start.elapsed().as_secs_f64(), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); - tracing::warn!("Stopping signature thread"); + metrics::increment_counter!(format!("relay.{}.closed", self.name), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); + metrics::histogram!(format!("relay.{}.duration", self.name), self.start.elapsed().as_secs_f64(), "clean" => (!self.armed).to_string(), "id" => self.id.to_string()); + tracing::warn!("Stopping {} - {}", self.name, self.id); } } impl Spawner { - pub(crate) fn build(threads: usize) -> std::io::Result { + pub(crate) fn build(name: &'static str, threads: usize) -> std::io::Result { let (sender, receiver) = flume::bounded(8); - tracing::warn!("Launching {threads} signature threads"); + tracing::warn!("Launching {threads} {name}s"); let threads = (0..threads) .map(|i| { let receiver = receiver.clone(); std::thread::Builder::new() - .name(format!("signature-thread-{i}")) + .name(format!("{name}-{i}")) .spawn(move || { - signature_thread(receiver, i); + spawner_thread(receiver, name, i); }) }) .collect::, _>>()?; Ok(Spawner { + name, sender: Some(sender), threads: Some(Arc::new(threads)), }) @@ -89,6 +97,7 @@ impl Drop for Spawner { self.sender.take(); if let Some(threads) = self.threads.take().and_then(Arc::into_inner) { + tracing::warn!("Joining {}s", self.name); for thread in threads { let _ = thread.join(); } From f3ff8ae5f7632320813b3d9f0ad6cd8c9792529c Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 11:08:20 -0500 Subject: [PATCH 28/60] Split available signature threads between sign & verify --- src/config.rs | 14 ++++++++------ src/main.rs | 22 ++++++++++++++++++++-- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/config.rs b/src/config.rs index be46fc6..3cbf79d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -259,12 +259,14 @@ impl Config { } pub(crate) fn signature_threads(&self) -> usize { - self.signature_threads.unwrap_or_else(|| { - std::thread::available_parallelism() - .map(usize::from) - .map_err(|e| tracing::warn!("Failed to get parallelism, {e}")) - .unwrap_or(1) - }) + self.signature_threads + .unwrap_or_else(|| { + std::thread::available_parallelism() + .map(usize::from) + .map_err(|e| tracing::warn!("Failed to get parallelism, {e}")) + .unwrap_or(1) + }) + .max(1) } pub(crate) fn client_timeout(&self) -> u64 { diff --git a/src/main.rs b/src/main.rs index 9cd1fd4..cc60996 100644 --- a/src/main.rs +++ b/src/main.rs @@ -242,6 +242,8 @@ fn server_main( actix_rt::spawn(do_server_main(db, actors, media, collector, config)) } +const VERIFY_RATIO: usize = 7; + async fn do_server_main( db: Db, actors: ActorCache, @@ -259,8 +261,24 @@ async fn do_server_main( let keys = config.open_keys()?; - let spawner = Spawner::build("signature-thread", config.signature_threads())?; - let verify_spawner = Spawner::build("verify-thread", (config.signature_threads() / 8).max(1))?; + let (signature_threads, verify_threads) = match config.signature_threads() { + 0 | 1 => (1, 1), + n if n <= VERIFY_RATIO => { + let verify_threads = (n / VERIFY_RATIO).max(1); + let signature_threads = n.saturating_sub(verify_threads).max(n); + + (signature_threads, verify_threads) + } + n => { + let verify_threads = (n / VERIFY_RATIO).max(1); + let signature_threads = n.saturating_sub(verify_threads).max(VERIFY_RATIO); + + (signature_threads, verify_threads) + } + }; + + let spawner = Spawner::build("signature-thread", signature_threads)?; + let verify_spawner = Spawner::build("verify-thread", verify_threads)?; let bind_address = config.bind_address(); let server = HttpServer::new(move || { From 433c981a215e583de603c91c8c72ec6addd10a25 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 11:10:29 -0500 Subject: [PATCH 29/60] Simplify < RATIO, bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- src/main.rs | 7 +------ 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a98304..cab5210 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.93" +version = "0.3.94" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 123bfec..83309f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.93" +version = "0.3.94" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index a8f4037..cda2de5 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.93"; + version = "0.3.94"; src = ./.; cargoLock.lockFile = ./Cargo.lock; diff --git a/src/main.rs b/src/main.rs index cc60996..ccdb69f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -263,12 +263,7 @@ async fn do_server_main( let (signature_threads, verify_threads) = match config.signature_threads() { 0 | 1 => (1, 1), - n if n <= VERIFY_RATIO => { - let verify_threads = (n / VERIFY_RATIO).max(1); - let signature_threads = n.saturating_sub(verify_threads).max(n); - - (signature_threads, verify_threads) - } + n if n <= VERIFY_RATIO => (n, 1), n => { let verify_threads = (n / VERIFY_RATIO).max(1); let signature_threads = n.saturating_sub(verify_threads).max(VERIFY_RATIO); From a500824a7de7579cb682f743fe37d22334d59f60 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 11:21:44 -0500 Subject: [PATCH 30/60] Shorten thread names --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index ccdb69f..5800564 100644 --- a/src/main.rs +++ b/src/main.rs @@ -272,8 +272,8 @@ async fn do_server_main( } }; - let spawner = Spawner::build("signature-thread", signature_threads)?; - let verify_spawner = Spawner::build("verify-thread", verify_threads)?; + let spawner = Spawner::build("sign-cpu", signature_threads)?; + let verify_spawner = Spawner::build("verify-cpu", verify_threads)?; let bind_address = config.bind_address(); let server = HttpServer::new(move || { From f86bbc95ae4e49ed1d4e83652d8276b5350c3de0 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 12:20:05 -0500 Subject: [PATCH 31/60] Pass spawner to digest middleware --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/main.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cab5210..c609dbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1460,9 +1460,9 @@ dependencies = [ [[package]] name = "http-signature-normalization-actix" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "218124b6b0c6ef27526493f50faf00b7cf8a3840bb1d5268f6ee8eef753b8225" +checksum = "7978cadb8c73ab0d7115a4260e8a64188212ce44d11f0b0109c4beebc6bbb5c9" dependencies = [ "actix-http", "actix-rt", diff --git a/Cargo.toml b/Cargo.toml index 83309f3..4c6ad95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -89,7 +89,7 @@ default-features = false features = ["background-jobs-actix", "error-logging"] [dependencies.http-signature-normalization-actix] -version = "0.9.1" +version = "0.10.0" default-features = false features = ["client", "server", "sha-2"] diff --git a/src/main.rs b/src/main.rs index 5800564..18b7c48 100644 --- a/src/main.rs +++ b/src/main.rs @@ -312,7 +312,7 @@ async fn do_server_main( .service(web::resource("/media/{path}").route(web::get().to(routes::media))) .service( web::resource("/inbox") - .wrap(config.digest_middleware()) + .wrap(config.digest_middleware().spawner(verify_spawner.clone())) .wrap(VerifySignature::new( MyVerify( requests, @@ -320,7 +320,7 @@ async fn do_server_main( state.clone(), verify_spawner.clone(), ), - Default::default(), + http_signature_normalization_actix::Config::new(), )) .wrap(DebugPayload(config.debug())) .route(web::post().to(inbox)), From f06316c6b237c2c3a048cc0ff6ce4f4d06300170 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 12:20:41 -0500 Subject: [PATCH 32/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c609dbd..8d65a37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.94" +version = "0.3.95" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 4c6ad95..0d7ed66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.94" +version = "0.3.95" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index cda2de5..37a3d12 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.94"; + version = "0.3.95"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 7438b0c5d01882de9604bd0c276426a5e812040b Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 13:09:03 -0500 Subject: [PATCH 33/60] Use verify spawner in all cases in verify path --- src/main.rs | 2 +- src/requests.rs | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 18b7c48..a2d933a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -315,7 +315,7 @@ async fn do_server_main( .wrap(config.digest_middleware().spawner(verify_spawner.clone())) .wrap(VerifySignature::new( MyVerify( - requests, + requests.spawner(verify_spawner.clone()), actors.clone(), state.clone(), verify_spawner.clone(), diff --git a/src/requests.rs b/src/requests.rs index f1cd1bc..ee88272 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -208,6 +208,11 @@ impl Requests { } } + pub(crate) fn spawner(mut self, spawner: Spawner) -> Self { + self.config = self.config.spawner(spawner); + self + } + pub(crate) fn reset_breaker(&self, iri: &IriString) { self.breakers.succeed(iri); } From ef57576c576b889cf602c4e9464a638895a07ba0 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 13:10:00 -0500 Subject: [PATCH 34/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8d65a37..6766db2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.95" +version = "0.3.96" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 0d7ed66..a000f57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.95" +version = "0.3.96" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 37a3d12..00937bd 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.95"; + version = "0.3.96"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 927f15c4ca69bbbb6b7da3ca90ff30d1c71f46ff Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 13:11:00 -0500 Subject: [PATCH 35/60] Update dependencies (minor & point) --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6766db2..61df8ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2917,18 +2917,18 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.176" +version = "1.0.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" +checksum = "63ba2516aa6bf82e0b19ca8b50019d52df58455d3cf9bdaf6315225fdd0c560a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.176" +version = "1.0.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" +checksum = "401797fe7833d72109fedec6bfcbe67c0eed9b99772f26eb8afd261f0abc6fd3" dependencies = [ "proc-macro2", "quote", From 5430da58aaa49298400efe716f2ad91bb7ea7837 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 13:14:46 -0500 Subject: [PATCH 36/60] Update description in nix file --- relay.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relay.nix b/relay.nix index 00937bd..b262a68 100644 --- a/relay.nix +++ b/relay.nix @@ -18,7 +18,7 @@ rustPlatform.buildRustPackage { passthru.tests = { inherit (nixosTests) relay; }; meta = with lib; { - description = "A simple image hosting service"; + description = "An ActivityPub relay"; homepage = "https://git.asonix.dog/asonix/relay"; license = with licenses; [ agpl3Plus ]; }; From e63e1f975eaaae4693d883d24e6a79db2492034c Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 13:39:31 -0500 Subject: [PATCH 37/60] Use verify spawner in routes --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index a2d933a..7832880 100644 --- a/src/main.rs +++ b/src/main.rs @@ -290,7 +290,9 @@ async fn do_server_main( let app = App::new() .app_data(web::Data::new(db.clone())) .app_data(web::Data::new(state.clone())) - .app_data(web::Data::new(requests.clone())) + .app_data(web::Data::new( + requests.clone().spawner(verify_spawner.clone()), + )) .app_data(web::Data::new(actors.clone())) .app_data(web::Data::new(config.clone())) .app_data(web::Data::new(job_server)) From 60abec2b96e5cd0d7fa5d9b3a6f1105bb3e3ec60 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 27 Jul 2023 13:48:01 -0500 Subject: [PATCH 38/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 61df8ff..a2ed729 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.96" +version = "0.3.97" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index a000f57..bdbcc14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.96" +version = "0.3.97" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index b262a68..f34363d 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.96"; + version = "0.3.97"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 795d3238ad9906e0f422965db588015206913a7c Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 28 Jul 2023 17:46:23 -0500 Subject: [PATCH 39/60] Hide nodes that failed breakers from index page --- src/data/state.rs | 4 ++++ src/requests.rs | 2 +- src/routes/index.rs | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/data/state.rs b/src/data/state.rs index 7dcc0dd..19798d3 100644 --- a/src/data/state.rs +++ b/src/data/state.rs @@ -93,6 +93,10 @@ impl State { self.object_cache.write().unwrap().put(object_id, actor_id); } + pub(crate) fn is_connected(&self, iri: &IriString) -> bool { + self.breakers.should_try(iri) + } + #[tracing::instrument(level = "debug", name = "Building state", skip_all)] pub(crate) async fn build(db: Db) -> Result { let private_key = if let Ok(Some(key)) = db.private_key().await { diff --git a/src/requests.rs b/src/requests.rs index ee88272..e693c31 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -39,7 +39,7 @@ impl std::fmt::Debug for Breakers { } impl Breakers { - fn should_try(&self, url: &IriString) -> bool { + pub(crate) fn should_try(&self, url: &IriString) -> bool { if let Some(authority) = url.authority_str() { if let Some(breaker) = self.inner.get(authority) { breaker.should_try() diff --git a/src/routes/index.rs b/src/routes/index.rs index cdd2a91..0d1bb23 100644 --- a/src/routes/index.rs +++ b/src/routes/index.rs @@ -42,6 +42,10 @@ pub(crate) async fn route( let mut local = Vec::new(); for node in all_nodes { + if !state.is_connected(&node.base) { + continue; + } + if node .base .authority_str() From 731a8310706f17178423733b4ef9d435b2400e7f Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 28 Jul 2023 17:47:51 -0500 Subject: [PATCH 40/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a2ed729..a96ba69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.97" +version = "0.3.98" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index bdbcc14..46efd66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.97" +version = "0.3.98" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index f34363d..219d604 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.97"; + version = "0.3.98"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 2cbe4864c36c2b775756b851486a93427081c9aa Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 4 Aug 2023 18:34:42 -0500 Subject: [PATCH 41/60] Switch to ring for crypto --- Cargo.lock | 8 ++++---- Cargo.toml | 7 ++++--- src/config.rs | 3 +-- src/error.rs | 11 ++++++---- src/middleware/verifier.rs | 21 +++++++++---------- src/requests.rs | 41 +++++++++++++++++++++++++------------- 6 files changed, 54 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a96ba69..92028b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -423,6 +423,7 @@ dependencies = [ "pin-project-lite", "quanta", "rand", + "ring", "rsa", "rsa-magic-public-key", "ructe", @@ -1460,9 +1461,9 @@ dependencies = [ [[package]] name = "http-signature-normalization-actix" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7978cadb8c73ab0d7115a4260e8a64188212ce44d11f0b0109c4beebc6bbb5c9" +checksum = "f16b1af0de27fe75ea5c1da8da1ce826274cc623bda49eb5e9395aa4ea0b34d4" dependencies = [ "actix-http", "actix-rt", @@ -1471,7 +1472,7 @@ dependencies = [ "base64 0.13.1", "futures-util", "http-signature-normalization", - "sha2", + "ring", "thiserror", "tokio", "tracing", @@ -2743,7 +2744,6 @@ dependencies = [ "pkcs1", "pkcs8", "rand_core", - "sha2", "signature", "spki", "subtle", diff --git a/Cargo.toml b/Cargo.toml index 46efd66..0e6c638 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,7 +55,8 @@ opentelemetry-otlp = "0.12" pin-project-lite = "0.2.9" quanta = "0.11.0" rand = "0.8" -rsa = { version = "0.9", features = ["sha2"] } +ring = "0.16.20" +rsa = { version = "0.9" } rsa-magic-public-key = "0.8.0" rustls = "0.20.7" rustls-pemfile = "1.0.1" @@ -89,9 +90,9 @@ default-features = false features = ["background-jobs-actix", "error-logging"] [dependencies.http-signature-normalization-actix] -version = "0.10.0" +version = "0.10.1" default-features = false -features = ["client", "server", "sha-2"] +features = ["client", "server", "ring"] [dependencies.tracing-actix-web] version = "0.7.5" diff --git a/src/config.rs b/src/config.rs index 3cbf79d..9dfa589 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,8 +11,7 @@ use activitystreams::{ }, }; use config::Environment; -use http_signature_normalization_actix::prelude::VerifyDigest; -use rsa::sha2::{Digest, Sha256}; +use http_signature_normalization_actix::{digest::ring::Sha256, prelude::VerifyDigest}; use rustls::{Certificate, PrivateKey}; use std::{ io::BufReader, diff --git a/src/error.rs b/src/error.rs index d03c995..e009a7c 100644 --- a/src/error.rs +++ b/src/error.rs @@ -81,6 +81,9 @@ pub(crate) enum ErrorKind { #[error("Couldn't encode public key, {0}")] Spki(#[from] rsa::pkcs8::spki::Error), + #[error("Couldn't sign request")] + SignRequest, + #[error("Couldn't parse IRI, {0}")] ParseIri(#[from] activitystreams::iri_string::validate::Error), @@ -105,11 +108,11 @@ pub(crate) enum ErrorKind { #[error("Couldn't sign digest")] Signature(#[from] rsa::signature::Error), - #[error("Couldn't read signature")] - ReadSignature(rsa::signature::Error), - #[error("Couldn't verify signature")] - VerifySignature(rsa::signature::Error), + VerifySignature, + + #[error("Failed to encode key der")] + DerEncode, #[error("Couldn't parse the signature header")] HeaderValidation(#[from] actix_web::http::header::InvalidHeaderValue), diff --git a/src/middleware/verifier.rs b/src/middleware/verifier.rs index f5cfad7..8fa8bb0 100644 --- a/src/middleware/verifier.rs +++ b/src/middleware/verifier.rs @@ -8,10 +8,7 @@ use crate::{ use activitystreams::{base::BaseExt, iri, iri_string::types::IriString}; use base64::{engine::general_purpose::STANDARD, Engine}; use http_signature_normalization_actix::{prelude::*, verify::DeprecatedAlgorithm, Spawn}; -use rsa::{ - pkcs1v15::Signature, pkcs1v15::VerifyingKey, pkcs8::DecodePublicKey, sha2::Sha256, - signature::Verifier, RsaPublicKey, -}; +use rsa::{pkcs1::EncodeRsaPublicKey, pkcs8::DecodePublicKey, RsaPublicKey}; use std::{future::Future, pin::Pin}; #[derive(Clone, Debug)] @@ -128,19 +125,23 @@ async fn do_verify( signing_string: String, ) -> Result<(), Error> { let public_key = RsaPublicKey::from_public_key_pem(public_key.trim())?; + let public_key_der = public_key + .to_pkcs1_der() + .map_err(|_| ErrorKind::DerEncode)?; + let public_key = ring::signature::UnparsedPublicKey::new( + &ring::signature::RSA_PKCS1_2048_8192_SHA256, + public_key_der, + ); let span = tracing::Span::current(); spawner .spawn_blocking(move || { span.in_scope(|| { let decoded = STANDARD.decode(signature)?; - let signature = - Signature::try_from(decoded.as_slice()).map_err(ErrorKind::ReadSignature)?; - let verifying_key = VerifyingKey::::new(public_key); - verifying_key - .verify(signing_string.as_bytes(), &signature) - .map_err(ErrorKind::VerifySignature)?; + public_key + .verify(signing_string.as_bytes(), decoded.as_slice()) + .map_err(|_| ErrorKind::VerifySignature)?; Ok(()) as Result<(), Error> }) diff --git a/src/requests.rs b/src/requests.rs index e693c31..8b77028 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -8,14 +8,12 @@ use actix_web::http::header::Date; use awc::{error::SendRequestError, Client, ClientResponse, Connector}; use base64::{engine::general_purpose::STANDARD, Engine}; use dashmap::DashMap; -use http_signature_normalization_actix::prelude::*; -use rand::thread_rng; -use rsa::{ - pkcs1v15::SigningKey, - sha2::{Digest, Sha256}, - signature::{RandomizedSigner, SignatureEncoding}, - RsaPrivateKey, +use http_signature_normalization_actix::{digest::ring::Sha256, prelude::*}; +use ring::{ + rand::SystemRandom, + signature::{RsaKeyPair, RSA_PKCS1_SHA256}, }; +use rsa::{pkcs1::EncodeRsaPrivateKey, RsaPrivateKey}; use std::{ sync::Arc, time::{Duration, SystemTime}, @@ -145,7 +143,8 @@ pub(crate) struct Requests { client: Client, key_id: String, user_agent: String, - private_key: RsaPrivateKey, + private_key: Arc, + rng: SystemRandom, config: Config, breakers: Breakers, last_online: Arc, @@ -196,12 +195,16 @@ impl Requests { timeout_seconds: u64, spawner: Spawner, ) -> Self { + let private_key_der = private_key.to_pkcs1_der().expect("Can encode der"); + let private_key = ring::signature::RsaKeyPair::from_der(private_key_der.as_bytes()) + .expect("Key is valid"); Requests { pool_size, client: build_client(&user_agent, pool_size, timeout_seconds), key_id, user_agent, - private_key, + private_key: Arc::new(private_key), + rng: SystemRandom::new(), config: Config::new().mastodon_compat().spawner(spawner), breakers, last_online, @@ -407,19 +410,29 @@ impl Requests { fn signer(&self) -> Signer { Signer { private_key: self.private_key.clone(), + rng: self.rng.clone(), } } } struct Signer { - private_key: RsaPrivateKey, + private_key: Arc, + rng: SystemRandom, } impl Signer { fn sign(&self, signing_string: &str) -> Result { - let signing_key = SigningKey::::new(self.private_key.clone()); - let signature = - signing_key.try_sign_with_rng(&mut thread_rng(), signing_string.as_bytes())?; - Ok(STANDARD.encode(signature.to_bytes().as_ref())) + let mut signature = vec![0; self.private_key.public_modulus_len()]; + + self.private_key + .sign( + &RSA_PKCS1_SHA256, + &self.rng, + signing_string.as_bytes(), + &mut signature, + ) + .map_err(|_| ErrorKind::SignRequest)?; + + Ok(STANDARD.encode(&signature)) } } From cdbde9519e6c81e7bafe45d6c3750eb47547e9fe Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 4 Aug 2023 18:35:52 -0500 Subject: [PATCH 42/60] Update dependencies (minor & point) --- Cargo.lock | 129 +++++++++++++++++++++++++++++------------------------ 1 file changed, 71 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 92028b8..8a6ff3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,7 +100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -486,7 +486,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -497,7 +497,7 @@ checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -542,9 +542,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a1de45611fdb535bfde7b7de4fd54f4fd2b17b1737c0a59b69bf9b92074b8c" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", @@ -768,9 +768,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "6c6b2562119bf28c3439f7f02db99faf0aa1a8cdfe5772a2ee155d32227239f0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -830,7 +833,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -1042,6 +1045,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" +dependencies = [ + "serde", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -1126,9 +1138,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -1271,7 +1283,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -1531,7 +1543,7 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.5", + "rustls 0.21.6", "tokio", "tokio-rustls 0.24.1", ] @@ -1717,9 +1729,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "local-channel" @@ -1810,9 +1822,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" [[package]] name = "md5" @@ -1871,7 +1883,7 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -2299,9 +2311,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2d1d55045829d65aad9d389139882ad623b33b904e7c9f1b10c5b8927298e5" +checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" dependencies = [ "thiserror", "ucd-trie", @@ -2309,9 +2321,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f94bca7e7a599d89dea5dfa309e217e7906c3c007fb9c3299c40b10d6a315d3" +checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" dependencies = [ "pest", "pest_generator", @@ -2319,22 +2331,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d490fe7e8556575ff6911e45567ab95e71617f43781e5c05490dc8d75c965c" +checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] name = "pest_meta" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674c66ebb4b4d9036012091b537aae5878970d6999f81a265034d85b136b341" +checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" dependencies = [ "once_cell", "pest", @@ -2396,7 +2408,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -2434,9 +2446,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc55135a600d700580e406b4de0d59cb9ad25e344a3a091a97ded2622ec4ec6" +checksum = "f32154ba0af3a075eefa1eda8bb414ee928f62303a54ea85b8d6638ff1a6ee9e" [[package]] name = "ppv-lite86" @@ -2624,7 +2636,7 @@ checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick 1.0.2", "memchr", - "regex-automata 0.3.3", + "regex-automata 0.3.4", "regex-syntax 0.7.4", ] @@ -2639,9 +2651,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" dependencies = [ "aho-corasick 1.0.2", "memchr", @@ -2684,7 +2696,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.5", + "rustls 0.21.6", "rustls-pemfile", "serde", "serde_json", @@ -2764,9 +2776,9 @@ dependencies = [ [[package]] name = "rsass" -version = "0.28.0" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff273c95b8e067372ea9386d76e5aa28f36ff0cbb2b85f208921665070587a06" +checksum = "0e5c4ce6e9720b51f90dbd5f38c011d0e409fab722ee6b9bb15f5e5550500353" dependencies = [ "arc-swap", "fastrand", @@ -2827,9 +2839,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.4" +version = "0.38.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +checksum = "1ee020b1716f0a80e2ace9b03441a749e402e86712f15f16fe8a8f75afac732f" dependencies = [ "bitflags 2.3.3", "errno", @@ -2852,9 +2864,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.5" +version = "0.21.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", @@ -2917,22 +2929,22 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.177" +version = "1.0.181" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63ba2516aa6bf82e0b19ca8b50019d52df58455d3cf9bdaf6315225fdd0c560a" +checksum = "6d3e73c93c3240c0bda063c239298e633114c69a888c3e37ca8bb33f343e9890" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.177" +version = "1.0.181" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401797fe7833d72109fedec6bfcbe67c0eed9b99772f26eb8afd261f0abc6fd3" +checksum = "be02f6cb0cd3a5ec20bbcfbcbd749f57daddb1a0882dc2e46a6c236c90b977ed" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3158,9 +3170,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -3282,7 +3294,7 @@ checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3297,10 +3309,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.23" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "b0fdd63d58b18d663fbdf70e049f00a22c8e42be082203be7f26589213cd75ea" dependencies = [ + "deranged", "itoa", "serde", "time-core", @@ -3315,9 +3328,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" dependencies = [ "time-core", ] @@ -3375,7 +3388,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3395,7 +3408,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.5", + "rustls 0.21.6", "tokio", ] @@ -3592,7 +3605,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3825,7 +3838,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", "wasm-bindgen-shared", ] @@ -3859,7 +3872,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4002,9 +4015,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" +checksum = "f46aab759304e4d7b2075a9aecba26228bb073ee8c50db796b2c72c676b5d807" dependencies = [ "memchr", ] From 2f57c855a41c2e706659934be6fb6966258e7771 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 4 Aug 2023 19:01:05 -0500 Subject: [PATCH 43/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a6ff3a..75bcfdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "ap-relay" -version = "0.3.98" +version = "0.3.99" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 0e6c638..74218d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.98" +version = "0.3.99" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 219d604..9836682 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.98"; + version = "0.3.99"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 73b429ab51d6dee43a28222adb97374011d294a4 Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 5 Aug 2023 12:47:52 -0500 Subject: [PATCH 44/60] Update opentelemetry --- Cargo.lock | 122 +++++++++++++++++------------------------------------ Cargo.toml | 10 ++--- 2 files changed, 44 insertions(+), 88 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 75bcfdb..7069d7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -467,28 +467,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" -[[package]] -name = "async-stream" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.28", -] - [[package]] name = "async-trait" version = "0.1.72" @@ -875,7 +853,7 @@ checksum = "c2895653b4d9f1538a83970077cb01dfc77a4810524e51a110944688e916b18e" dependencies = [ "prost", "prost-types", - "tonic 0.9.2", + "tonic", "tracing-core", ] @@ -897,7 +875,7 @@ dependencies = [ "thread_local", "tokio", "tokio-stream", - "tonic 0.9.2", + "tonic", "tracing", "tracing-core", "tracing-subscriber", @@ -2121,9 +2099,9 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "opentelemetry" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" +checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" dependencies = [ "opentelemetry_api", "opentelemetry_sdk", @@ -2131,45 +2109,54 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af72d59a4484654ea8eb183fea5ae4eb6a41d7ac3e3bae5f4d2a282a3a7d3ca" +checksum = "7e5e5a5c4135864099f3faafbe939eb4d7f9b80ebf68a8448da961b32a7c1275" dependencies = [ "async-trait", - "futures", - "futures-util", + "futures-core", "http", - "opentelemetry", "opentelemetry-proto", + "opentelemetry-semantic-conventions", + "opentelemetry_api", + "opentelemetry_sdk", "prost", "thiserror", "tokio", - "tonic 0.8.3", + "tonic", ] [[package]] name = "opentelemetry-proto" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045f8eea8c0fa19f7d48e7bc3128a39c2e5c533d5c61298c548dfefc1064474c" +checksum = "b1e3f814aa9f8c905d0ee4bde026afd3b2577a97c10e1699912e3e44f0c4cbeb" dependencies = [ - "futures", - "futures-util", - "opentelemetry", + "opentelemetry_api", + "opentelemetry_sdk", "prost", - "tonic 0.8.3", + "tonic", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73c9f9340ad135068800e7f1b24e9e09ed9e7143f5bf8518ded3d3ec69789269" +dependencies = [ + "opentelemetry", ] [[package]] name = "opentelemetry_api" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" +checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" dependencies = [ - "fnv", "futures-channel", "futures-util", "indexmap 1.9.3", + "js-sys", "once_cell", "pin-project-lite", "thiserror", @@ -2178,21 +2165,22 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b3a2a91fdbfdd4d212c0dcc2ab540de2c2bcbbd90be17de7a7daf8822d010c1" +checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" dependencies = [ "async-trait", "crossbeam-channel", - "dashmap", - "fnv", "futures-channel", "futures-executor", "futures-util", "once_cell", "opentelemetry_api", + "ordered-float", "percent-encoding", "rand", + "regex", + "serde_json", "thiserror", "tokio", "tokio-stream", @@ -3480,38 +3468,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tonic" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost", - "prost-derive", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - [[package]] name = "tonic" version = "0.9.2" @@ -3587,9 +3543,9 @@ dependencies = [ [[package]] name = "tracing-actix-web" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce52ffaf2d544e317d3bef63f49a6a22022866505fa4840a4339b1756834a2a9" +checksum = "5c0b08ce08cbde6a96fc1e4ebb8132053e53ec7a5cd27eef93ede6b73ebbda06" dependencies = [ "actix-web", "pin-project", @@ -3610,9 +3566,9 @@ dependencies = [ [[package]] name = "tracing-awc" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa1a68fce4d1a7fad459f81ddcafbdd7c6f6bcda5c7e07d5f42db637931fac7" +checksum = "afd0c52e66eec56d4fbddbfa1d15261ee48a78360d7d3ee3d3900c4c3489d8ad" dependencies = [ "actix-http", "actix-service", @@ -3666,9 +3622,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00a39dcf9bfc1742fa4d6215253b33a6e474be78275884c216fc2a06267b3600" +checksum = "fc09e402904a5261e42cf27aea09ccb7d5318c6717a9eec3d8e2e65c56b18f19" dependencies = [ "once_cell", "opentelemetry", diff --git a/Cargo.toml b/Cargo.toml index 74218d0..306f61f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,8 +50,8 @@ metrics-exporter-prometheus = { version = "0.12.0", default-features = false, fe metrics-util = "0.15.0" mime = "0.3.16" minify-html = "0.11.0" -opentelemetry = { version = "0.19", features = ["rt-tokio"] } -opentelemetry-otlp = "0.12" +opentelemetry = { version = "0.20", features = ["rt-tokio"] } +opentelemetry-otlp = "0.13" pin-project-lite = "0.2.9" quanta = "0.11.0" rand = "0.8" @@ -71,11 +71,11 @@ teloxide = { version = "0.12.0", default-features = false, features = [ thiserror = "1.0" time = { version = "0.3.17", features = ["serde"] } tracing = "0.1" -tracing-awc = "0.1.7" +tracing-awc = "0.1.8" tracing-error = "0.2" tracing-futures = "0.2" tracing-log = "0.1" -tracing-opentelemetry = "0.19" +tracing-opentelemetry = "0.20" tracing-subscriber = { version = "0.3", features = [ "ansi", "env-filter", @@ -95,7 +95,7 @@ default-features = false features = ["client", "server", "ring"] [dependencies.tracing-actix-web] -version = "0.7.5" +version = "0.7.6" [build-dependencies] anyhow = "1.0" From 75df271b589e33cda797625f55700ec498ef15b7 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 17 Aug 2023 17:09:35 -0500 Subject: [PATCH 45/60] Switch from awc to reqwest, enable HTTP Proxies --- Cargo.lock | 321 ++++++++++++++++++++++--------------------- Cargo.toml | 14 +- README.md | 12 +- src/admin/client.rs | 50 ++++--- src/config.rs | 46 ++++++- src/data/state.rs | 50 +++---- src/error.rs | 18 ++- src/extractors.rs | 6 + src/jobs.rs | 13 +- src/jobs/contact.rs | 3 + src/jobs/deliver.rs | 2 +- src/jobs/instance.rs | 6 + src/jobs/nodeinfo.rs | 5 +- src/main.rs | 85 ++++++++---- src/requests.rs | 129 ++++++----------- src/routes/index.rs | 2 +- src/routes/media.rs | 2 +- src/spawner.rs | 29 ++++ 18 files changed, 454 insertions(+), 339 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7069d7d..bb9b6ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,7 +100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -140,7 +140,7 @@ dependencies = [ "futures-util", "mio", "num_cpus", - "socket2", + "socket2 0.4.9", "tokio", "tracing", ] @@ -167,7 +167,6 @@ dependencies = [ "actix-service", "actix-utils", "futures-core", - "http", "log", "pin-project-lite", "tokio-rustls 0.23.4", @@ -219,20 +218,19 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2", + "socket2 0.4.9", "time", "url", ] [[package]] name = "actix-webfinger" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e64f0f9b28305d38058daaff76a608684a43cbf67e9a9289bdd124a2a45b5e" +checksum = "74a22b44deff50693521b489885151fd65a2a596f7aef6d8c0753485b8915082" dependencies = [ "actix-rt", "actix-web", - "awc", "serde", "serde_derive", "thiserror", @@ -287,9 +285,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -375,9 +373,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" dependencies = [ "anstyle", "windows-sys", @@ -385,9 +383,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ap-relay" @@ -400,7 +398,6 @@ dependencies = [ "actix-webfinger", "ammonia", "anyhow", - "awc", "background-jobs", "base64 0.21.2", "bcrypt", @@ -412,6 +409,7 @@ dependencies = [ "flume", "futures-util", "http-signature-normalization-actix", + "http-signature-normalization-reqwest", "lru", "metrics", "metrics-exporter-prometheus", @@ -423,6 +421,9 @@ dependencies = [ "pin-project-lite", "quanta", "rand", + "reqwest", + "reqwest-middleware", + "reqwest-tracing", "ring", "rsa", "rsa-magic-public-key", @@ -439,7 +440,6 @@ dependencies = [ "toml 0.7.6", "tracing", "tracing-actix-web", - "tracing-awc", "tracing-error", "tracing-futures", "tracing-log", @@ -469,13 +469,13 @@ checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" [[package]] name = "async-trait" -version = "0.1.72" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -484,40 +484,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "awc" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ef547a81796eb2dfe9b345aba34c2e08391a0502493711395b36dd64052b69" -dependencies = [ - "actix-codec", - "actix-http", - "actix-rt", - "actix-service", - "actix-tls", - "actix-utils", - "ahash 0.7.6", - "base64 0.21.2", - "bytes", - "cfg-if", - "derive_more", - "futures-core", - "futures-util", - "h2", - "http", - "itoa", - "log", - "mime", - "percent-encoding", - "pin-project-lite", - "rand", - "rustls 0.20.8", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", -] - [[package]] name = "axum" version = "0.6.20" @@ -667,9 +633,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "block-buffer" @@ -746,9 +712,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6b2562119bf28c3439f7f02db99faf0aa1a8cdfe5772a2ee155d32227239f0" +checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" dependencies = [ "libc", ] @@ -781,9 +747,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.19" +version = "4.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" +checksum = "b417ae4361bca3f5de378294fc7472d3c4ed86a5ef9f49e93ae722f432aae8d2" dependencies = [ "clap_builder", "clap_derive", @@ -792,9 +758,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.19" +version = "4.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" +checksum = "9c90dc0f0e42c64bff177ca9d7be6fcc9ddb0f26a6e062174a61c84dd6c644d4" dependencies = [ "anstream", "anstyle", @@ -811,7 +777,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -883,9 +849,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "convert_case" @@ -1014,9 +980,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ "const-oid", "pem-rfc7468", @@ -1149,9 +1115,9 @@ checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", @@ -1261,7 +1227,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -1458,7 +1424,6 @@ dependencies = [ "actix-http", "actix-rt", "actix-web", - "awc", "base64 0.13.1", "futures-util", "http-signature-normalization", @@ -1470,6 +1435,22 @@ dependencies = [ "tracing-futures", ] +[[package]] +name = "http-signature-normalization-reqwest" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cfb84663420ec12c4422820bfdf5e8e5e57467892587f43ac432e73ebce880" +dependencies = [ + "async-trait", + "base64 0.13.1", + "http-signature-normalization", + "httpdate", + "reqwest", + "reqwest-middleware", + "ring", + "thiserror", +] + [[package]] name = "httparse" version = "1.8.0" @@ -1478,9 +1459,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -1505,7 +1486,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -1741,9 +1722,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru" @@ -1861,7 +1842,7 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -1870,7 +1851,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" dependencies = [ - "aho-corasick 1.0.2", + "aho-corasick 1.0.4", "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.13.1", @@ -2327,7 +2308,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -2381,29 +2362,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pin-utils" @@ -2533,9 +2514,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -2618,13 +2599,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ - "aho-corasick 1.0.2", + "aho-corasick 1.0.4", "memchr", - "regex-automata 0.3.4", + "regex-automata 0.3.6", "regex-syntax 0.7.4", ] @@ -2639,11 +2620,11 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ - "aho-corasick 1.0.2", + "aho-corasick 1.0.4", "memchr", "regex-syntax 0.7.4", ] @@ -2702,6 +2683,37 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest-middleware" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff44108c7925d082f2861e683a88618b68235ad9cdc60d64d9d1188efc951cdb" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "serde", + "task-local-extensions", + "thiserror", +] + +[[package]] +name = "reqwest-tracing" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b97ad83c2fc18113346b7158d79732242002427c30f620fa817c1f32901e0a8" +dependencies = [ + "anyhow", + "async-trait", + "getrandom", + "matchit", + "reqwest", + "reqwest-middleware", + "task-local-extensions", + "tracing", +] + [[package]] name = "ring" version = "0.16.20" @@ -2827,11 +2839,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.6" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee020b1716f0a80e2ace9b03441a749e402e86712f15f16fe8a8f75afac732f" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "errno", "libc", "linux-raw-sys", @@ -2873,9 +2885,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.2" +version = "0.101.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" +checksum = "261e9e0888cba427c3316e6322805653c9425240b6fd96cee7cb671ab70ab8d0" dependencies = [ "ring", "untrusted", @@ -2917,29 +2929,29 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.181" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d3e73c93c3240c0bda063c239298e633114c69a888c3e37ca8bb33f343e9890" +checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.181" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be02f6cb0cd3a5ec20bbcfbcbd749f57daddb1a0882dc2e46a6c236c90b977ed" +checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -3082,6 +3094,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "spin" version = "0.5.2" @@ -3158,9 +3180,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.28" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -3185,6 +3207,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "teloxide" version = "0.12.2" @@ -3267,22 +3298,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -3340,11 +3371,10 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.29.1" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", @@ -3352,7 +3382,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.3", "tokio-macros", "tracing", "windows-sys", @@ -3376,7 +3406,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", ] [[package]] @@ -3561,22 +3591,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", -] - -[[package]] -name = "tracing-awc" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afd0c52e66eec56d4fbddbfa1d15261ee48a78360d7d3ee3d3900c4c3489d8ad" -dependencies = [ - "actix-http", - "actix-service", - "awc", - "bytes", - "futures-core", - "pin-project-lite", - "tracing", + "syn 2.0.29", ] [[package]] @@ -3794,7 +3809,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -3828,7 +3843,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3914,9 +3929,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "27f51fb4c64f8b770a823c043c7fad036323e1c48f55287b7bbb7987b2fcdf3b" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -3929,51 +3944,51 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "fde1bb55ae4ce76a597a8566d82c57432bc69c039449d61572a7a353da28f68c" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "1513e8d48365a78adad7322fd6b5e4c4e99d92a69db8df2d435b25b1f1f286d4" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "60587c0265d2b842298f5858e1a5d79d146f9ee0c37be5782e92a6eb5e1d7a83" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "224fe0e0ffff5d2ea6a29f82026c8f43870038a0ffc247aa95a52b47df381ac4" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "62fc52a0f50a088de499712cbc012df7ebd94e2d6eb948435449d76a6287e7ad" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "2093925509d91ea3d69bcd20238f4c2ecdb1a29d3c281d026a09705d0dd35f3d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "b6ade45bc8bf02ae2aa34a9d54ba660a1a58204da34ba793c00d83ca3730b5f1" [[package]] name = "winnow" -version = "0.5.3" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46aab759304e4d7b2075a9aecba26228bb073ee8c50db796b2c72c676b5d807" +checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97" dependencies = [ "memchr", ] diff --git a/Cargo.toml b/Cargo.toml index 306f61f..f67b019 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,11 +28,10 @@ actix-web = { version = "4.0.1", default-features = false, features = [ "compress-brotli", "compress-gzip", ] } -actix-webfinger = "0.4.0" +actix-webfinger = { version = "0.5.0", default-features = false } activitystreams = "0.7.0-alpha.25" activitystreams-ext = "0.1.0-alpha.3" ammonia = "3.1.0" -awc = { version = "3.0.0", default-features = false, features = ["rustls"] } bcrypt = "0.15" base64 = "0.21" clap = { version = "4.0.0", features = ["derive"] } @@ -55,6 +54,9 @@ opentelemetry-otlp = "0.13" pin-project-lite = "0.2.9" quanta = "0.11.0" rand = "0.8" +reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "stream"]} +reqwest-middleware = "0.2" +reqwest-tracing = "0.4.5" ring = "0.16.20" rsa = { version = "0.9" } rsa-magic-public-key = "0.8.0" @@ -71,7 +73,6 @@ teloxide = { version = "0.12.0", default-features = false, features = [ thiserror = "1.0" time = { version = "0.3.17", features = ["serde"] } tracing = "0.1" -tracing-awc = "0.1.8" tracing-error = "0.2" tracing-futures = "0.2" tracing-log = "0.1" @@ -92,7 +93,12 @@ features = ["background-jobs-actix", "error-logging"] [dependencies.http-signature-normalization-actix] version = "0.10.1" default-features = false -features = ["client", "server", "ring"] +features = ["server", "ring"] + +[dependencies.http-signature-normalization-reqwest] +version = "0.10.0" +default-features = false +features = ["middleware", "ring"] [dependencies.tracing-actix-web] version = "0.7.6" diff --git a/README.md b/README.md index 24b1566..72c2e22 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,6 @@ LOCAL_BLURB="

Welcome to my cool relay where I have cool relay things happenin PROMETHEUS_ADDR=0.0.0.0 PROMETHEUS_PORT=9000 CLIENT_TIMEOUT=10 -CLIENT_POOL_SIZE=20 DELIVER_CONCURRENCY=8 SIGNATURE_THREADS=2 ``` @@ -161,11 +160,6 @@ Optional - Port to bind to for serving the prometheus scrape endpoint ##### `CLIENT_TIMEOUT` Optional - How long the relay will hold open a connection (in seconds) to a remote server during fetches and deliveries. This defaults to 10 -##### `CLIENT_POOL_SIZE` -Optional - How many connections the relay should maintain per thread. This value will be multiplied -by the number of cores available to the relay. This defaults to 20, so a 4-core machine will have a -maximum of 160 simultaneous outbound connections. If you run into problems related to "Too many open -files", you can either decrease this number or increase the ulimit for your system. ##### `DELIVER_CONCURRENCY` Optional - How many deliver requests the relay should allow to be in-flight per thread. the default is 8 @@ -173,6 +167,12 @@ is 8 Optional - Override number of threads used for signing and verifying requests. Default is `std::thread::available_parallelism()` (It tries to detect how many cores you have). If it cannot detect the correct number of cores, it falls back to 1. +##### 'PROXY_URL' +Optional - URL of an HTTP proxy to forward outbound requests through +##### 'PROXY_USERNAME' +Optional - username to provide to the HTTP proxy set with `PROXY_URL` through HTTP Basic Auth +##### 'PROXY_PASSWORD' +Optional - password to provide to the HTTP proxy set with `PROXY_URL` through HTTP Basic Auth ### Subscribing Mastodon admins can subscribe to this relay by adding the `/inbox` route to their relay settings. diff --git a/src/admin/client.rs b/src/admin/client.rs index fdb1687..88151e1 100644 --- a/src/admin/client.rs +++ b/src/admin/client.rs @@ -3,12 +3,14 @@ use crate::{ collector::Snapshot, config::{AdminUrlKind, Config}, error::{Error, ErrorKind}, + extractors::XApiToken, }; -use awc::Client; +use actix_web::http::header::Header; +use reqwest_middleware::ClientWithMiddleware; use serde::de::DeserializeOwned; pub(crate) async fn allow( - client: &Client, + client: &ClientWithMiddleware, config: &Config, domains: Vec, ) -> Result<(), Error> { @@ -16,7 +18,7 @@ pub(crate) async fn allow( } pub(crate) async fn disallow( - client: &Client, + client: &ClientWithMiddleware, config: &Config, domains: Vec, ) -> Result<(), Error> { @@ -24,7 +26,7 @@ pub(crate) async fn disallow( } pub(crate) async fn block( - client: &Client, + client: &ClientWithMiddleware, config: &Config, domains: Vec, ) -> Result<(), Error> { @@ -32,35 +34,50 @@ pub(crate) async fn block( } pub(crate) async fn unblock( - client: &Client, + client: &ClientWithMiddleware, config: &Config, domains: Vec, ) -> Result<(), Error> { post_domains(client, config, domains, AdminUrlKind::Unblock).await } -pub(crate) async fn allowed(client: &Client, config: &Config) -> Result { +pub(crate) async fn allowed( + client: &ClientWithMiddleware, + config: &Config, +) -> Result { get_results(client, config, AdminUrlKind::Allowed).await } -pub(crate) async fn blocked(client: &Client, config: &Config) -> Result { +pub(crate) async fn blocked( + client: &ClientWithMiddleware, + config: &Config, +) -> Result { get_results(client, config, AdminUrlKind::Blocked).await } -pub(crate) async fn connected(client: &Client, config: &Config) -> Result { +pub(crate) async fn connected( + client: &ClientWithMiddleware, + config: &Config, +) -> Result { get_results(client, config, AdminUrlKind::Connected).await } -pub(crate) async fn stats(client: &Client, config: &Config) -> Result { +pub(crate) async fn stats( + client: &ClientWithMiddleware, + config: &Config, +) -> Result { get_results(client, config, AdminUrlKind::Stats).await } -pub(crate) async fn last_seen(client: &Client, config: &Config) -> Result { +pub(crate) async fn last_seen( + client: &ClientWithMiddleware, + config: &Config, +) -> Result { get_results(client, config, AdminUrlKind::LastSeen).await } async fn get_results( - client: &Client, + client: &ClientWithMiddleware, config: &Config, url_kind: AdminUrlKind, ) -> Result { @@ -68,9 +85,9 @@ async fn get_results( let iri = config.generate_admin_url(url_kind); - let mut res = client + let res = client .get(iri.as_str()) - .insert_header(x_api_token) + .header(XApiToken::name(), x_api_token.to_string()) .send() .await .map_err(|e| ErrorKind::SendRequest(iri.to_string(), e.to_string()))?; @@ -88,7 +105,7 @@ async fn get_results( } async fn post_domains( - client: &Client, + client: &ClientWithMiddleware, config: &Config, domains: Vec, url_kind: AdminUrlKind, @@ -99,8 +116,9 @@ async fn post_domains( let res = client .post(iri.as_str()) - .insert_header(x_api_token) - .send_json(&Domains { domains }) + .header(XApiToken::name(), x_api_token.to_string()) + .json(&Domains { domains }) + .send() .await .map_err(|e| ErrorKind::SendRequest(iri.to_string(), e.to_string()))?; diff --git a/src/config.rs b/src/config.rs index 9dfa589..35520fd 100644 --- a/src/config.rs +++ b/src/config.rs @@ -46,7 +46,9 @@ pub(crate) struct ParsedConfig { prometheus_port: Option, deliver_concurrency: u64, client_timeout: u64, - client_pool_size: usize, + proxy_url: Option, + proxy_username: Option, + proxy_password: Option, signature_threads: Option, } @@ -73,7 +75,7 @@ pub struct Config { prometheus_config: Option, deliver_concurrency: u64, client_timeout: u64, - client_pool_size: usize, + proxy_config: Option, signature_threads: Option, } @@ -89,6 +91,12 @@ struct PrometheusConfig { port: u16, } +#[derive(Clone, Debug)] +struct ProxyConfig { + url: IriString, + auth: Option<(String, String)>, +} + #[derive(Debug)] pub enum UrlKind { Activity, @@ -144,7 +152,7 @@ impl std::fmt::Debug for Config { .field("prometheus_config", &self.prometheus_config) .field("deliver_concurrency", &self.deliver_concurrency) .field("client_timeout", &self.client_timeout) - .field("client_pool_size", &self.client_pool_size) + .field("proxy_config", &self.proxy_config) .field("signature_threads", &self.signature_threads) .finish() } @@ -177,7 +185,9 @@ impl Config { .set_default("prometheus_port", None as Option)? .set_default("deliver_concurrency", 8u64)? .set_default("client_timeout", 10u64)? - .set_default("client_pool_size", 20u64)? + .set_default("proxy_url", None as Option<&str>)? + .set_default("proxy_username", None as Option<&str>)? + .set_default("proxy_password", None as Option<&str>)? .set_default("signature_threads", None as Option)? .add_source(Environment::default()) .build()?; @@ -220,6 +230,26 @@ impl Config { (None, None) => None, }; + let proxy_config = match (config.proxy_username, config.proxy_password) { + (Some(username), Some(password)) => config.proxy_url.map(|url| ProxyConfig { + url, + auth: Some((username, password)), + }), + (Some(_), None) => { + tracing::warn!( + "PROXY_USERNAME is set but PROXY_PASSWORD is not set, not setting Proxy Auth" + ); + config.proxy_url.map(|url| ProxyConfig { url, auth: None }) + } + (None, Some(_)) => { + tracing::warn!( + "PROXY_PASSWORD is set but PROXY_USERNAME is not set, not setting Proxy Auth" + ); + config.proxy_url.map(|url| ProxyConfig { url, auth: None }) + } + (None, None) => config.proxy_url.map(|url| ProxyConfig { url, auth: None }), + }; + let source_url = match Self::git_hash() { Some(hash) => format!( "{}{}{hash}", @@ -252,7 +282,7 @@ impl Config { prometheus_config, deliver_concurrency: config.deliver_concurrency, client_timeout: config.client_timeout, - client_pool_size: config.client_pool_size, + proxy_config, signature_threads: config.signature_threads, }) } @@ -468,8 +498,10 @@ impl Config { ) } - pub(crate) fn client_pool_size(&self) -> usize { - self.client_pool_size + pub(crate) fn proxy_config(&self) -> Option<(&IriString, Option<(&str, &str)>)> { + self.proxy_config.as_ref().map(|ProxyConfig { url, auth }| { + (url, auth.as_ref().map(|(u, p)| (u.as_str(), p.as_str()))) + }) } pub(crate) fn source_code(&self) -> &IriString { diff --git a/src/data/state.rs b/src/data/state.rs index 19798d3..d3b699d 100644 --- a/src/data/state.rs +++ b/src/data/state.rs @@ -1,5 +1,4 @@ use crate::{ - config::{Config, UrlKind}, data::NodeCache, db::Db, error::Error, @@ -10,6 +9,7 @@ use activitystreams::iri_string::types::IriString; use actix_web::web; use lru::LruCache; use rand::thread_rng; +use reqwest_middleware::ClientWithMiddleware; use rsa::{RsaPrivateKey, RsaPublicKey}; use std::sync::{Arc, RwLock}; @@ -17,10 +17,10 @@ use super::LastOnline; #[derive(Clone)] pub struct State { + pub(crate) requests: Requests, pub(crate) public_key: RsaPublicKey, - private_key: RsaPrivateKey, object_cache: Arc>>, - node_cache: NodeCache, + pub(crate) node_cache: NodeCache, breakers: Breakers, pub(crate) last_online: Arc, pub(crate) db: Db, @@ -37,23 +37,6 @@ impl std::fmt::Debug for State { } impl State { - pub(crate) fn node_cache(&self) -> NodeCache { - self.node_cache.clone() - } - - pub(crate) fn requests(&self, config: &Config, spawner: Spawner) -> Requests { - Requests::new( - config.generate_url(UrlKind::MainKey).to_string(), - self.private_key.clone(), - config.user_agent(), - self.breakers.clone(), - self.last_online.clone(), - config.client_pool_size(), - config.client_timeout(), - spawner, - ) - } - #[tracing::instrument( level = "debug", name = "Get inboxes for other domains", @@ -98,7 +81,12 @@ impl State { } #[tracing::instrument(level = "debug", name = "Building state", skip_all)] - pub(crate) async fn build(db: Db) -> Result { + pub(crate) async fn build( + db: Db, + key_id: String, + spawner: Spawner, + client: ClientWithMiddleware, + ) -> Result { let private_key = if let Ok(Some(key)) = db.private_key().await { tracing::debug!("Using existing key"); key @@ -117,16 +105,28 @@ impl State { let public_key = private_key.to_public_key(); - let state = State { - public_key, + let breakers = Breakers::default(); + let last_online = Arc::new(LastOnline::empty()); + + let requests = Requests::new( + key_id, private_key, + breakers.clone(), + last_online.clone(), + spawner, + client, + ); + + let state = State { + requests, + public_key, object_cache: Arc::new(RwLock::new(LruCache::new( (1024 * 8).try_into().expect("nonzero"), ))), node_cache: NodeCache::new(db.clone()), - breakers: Breakers::default(), + breakers, db, - last_online: Arc::new(LastOnline::empty()), + last_online, }; Ok(state) diff --git a/src/error.rs b/src/error.rs index e009a7c..e1461db 100644 --- a/src/error.rs +++ b/src/error.rs @@ -5,7 +5,7 @@ use actix_web::{ http::StatusCode, HttpResponse, }; -use http_signature_normalization_actix::PrepareSignError; +use http_signature_normalization_reqwest::SignError; use std::{convert::Infallible, fmt::Debug, io}; use tracing_error::SpanTrace; @@ -84,6 +84,12 @@ pub(crate) enum ErrorKind { #[error("Couldn't sign request")] SignRequest, + #[error("Couldn't make request")] + Reqwest(#[from] reqwest::Error), + + #[error("Couldn't build client")] + ReqwestMiddleware(#[from] reqwest_middleware::Error), + #[error("Couldn't parse IRI, {0}")] ParseIri(#[from] activitystreams::iri_string::validate::Error), @@ -102,8 +108,8 @@ pub(crate) enum ErrorKind { #[error("Couldn't do the json thing, {0}")] Json(#[from] serde_json::Error), - #[error("Couldn't build signing string, {0}")] - PrepareSign(#[from] PrepareSignError), + #[error("Couldn't sign request, {0}")] + Sign(#[from] SignError), #[error("Couldn't sign digest")] Signature(#[from] rsa::signature::Error), @@ -251,3 +257,9 @@ impl From for ErrorKind { Self::Canceled } } + +impl From for ErrorKind { + fn from(_: http_signature_normalization_reqwest::Canceled) -> Self { + Self::Canceled + } +} diff --git a/src/extractors.rs b/src/extractors.rs index 2301ee4..3226398 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -243,3 +243,9 @@ impl FromStr for XApiToken { Ok(XApiToken(s.to_string())) } } + +impl std::fmt::Display for XApiToken { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} diff --git a/src/jobs.rs b/src/jobs.rs index 7635b3c..6298938 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -14,11 +14,9 @@ pub(crate) use self::{ use crate::{ config::Config, - data::{ActorCache, MediaCache, NodeCache, State}, + data::{ActorCache, MediaCache, State}, error::{Error, ErrorKind}, jobs::{process_listeners::Listeners, record_last_online::RecordLastOnline}, - requests::Requests, - spawner::Spawner, }; use background_jobs::{ memory_storage::{ActixTimer, Storage}, @@ -45,7 +43,6 @@ pub(crate) fn create_workers( actors: ActorCache, media: MediaCache, config: Config, - spawner: Spawner, ) -> JobServer { let deliver_concurrency = config.deliver_concurrency(); @@ -56,7 +53,6 @@ pub(crate) fn create_workers( JobServer::new(queue_handle), media.clone(), config.clone(), - spawner.clone(), ) }) .register::() @@ -84,12 +80,10 @@ pub(crate) fn create_workers( #[derive(Clone, Debug)] pub(crate) struct JobState { - requests: Requests, state: State, actors: ActorCache, config: Config, media: MediaCache, - node_cache: NodeCache, job_server: JobServer, } @@ -113,15 +107,12 @@ impl JobState { job_server: JobServer, media: MediaCache, config: Config, - spawner: Spawner, ) -> Self { JobState { - requests: state.requests(&config, spawner), - node_cache: state.node_cache(), + state, actors, config, media, - state, job_server, } } diff --git a/src/jobs/contact.rs b/src/jobs/contact.rs index 3c880af..f59affe 100644 --- a/src/jobs/contact.rs +++ b/src/jobs/contact.rs @@ -32,6 +32,7 @@ impl QueryContact { async fn perform(self, state: JobState) -> Result<(), Error> { let contact_outdated = state + .state .node_cache .is_contact_outdated(self.actor_id.clone()) .await; @@ -41,6 +42,7 @@ impl QueryContact { } let contact = match state + .state .requests .fetch::(&self.contact_id) .await @@ -57,6 +59,7 @@ impl QueryContact { to_contact(contact).ok_or(ErrorKind::Extract("contact"))?; state + .state .node_cache .set_contact(self.actor_id, username, display_name, url, avatar) .await?; diff --git a/src/jobs/deliver.rs b/src/jobs/deliver.rs index 72f4aec..10c5fce 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> { - if let Err(e) = state.requests.deliver(&self.to, &self.data).await { + if let Err(e) = state.state.requests.deliver(&self.to, &self.data).await { if e.is_breaker() { tracing::debug!("Not trying due to failed breaker"); return Ok(()); diff --git a/src/jobs/instance.rs b/src/jobs/instance.rs index 59826b5..2b44e60 100644 --- a/src/jobs/instance.rs +++ b/src/jobs/instance.rs @@ -40,6 +40,7 @@ impl QueryInstance { InstanceApiType::Mastodon => { let mastodon_instance_uri = iri!(format!("{scheme}://{authority}/api/v1/instance")); state + .state .requests .fetch_json::(&mastodon_instance_uri) .await @@ -47,6 +48,7 @@ impl QueryInstance { InstanceApiType::Misskey => { let msky_meta_uri = iri!(format!("{scheme}://{authority}/api/meta")); state + .state .requests .fetch_json_msky::(&msky_meta_uri) .await @@ -58,10 +60,12 @@ impl QueryInstance { #[tracing::instrument(name = "Query instance", skip(state))] async fn perform(self, state: JobState) -> Result<(), Error> { let contact_outdated = state + .state .node_cache .is_contact_outdated(self.actor_id.clone()) .await; let instance_outdated = state + .state .node_cache .is_instance_outdated(self.actor_id.clone()) .await; @@ -123,6 +127,7 @@ impl QueryInstance { let avatar = state.config.generate_url(UrlKind::Media(uuid)); state + .state .node_cache .set_contact( self.actor_id.clone(), @@ -137,6 +142,7 @@ impl QueryInstance { let description = ammonia::clean(&description); state + .state .node_cache .set_instance( self.actor_id, diff --git a/src/jobs/nodeinfo.rs b/src/jobs/nodeinfo.rs index fa4812f..60f41ce 100644 --- a/src/jobs/nodeinfo.rs +++ b/src/jobs/nodeinfo.rs @@ -27,6 +27,7 @@ impl QueryNodeinfo { #[tracing::instrument(name = "Query node info", skip(state))] async fn perform(self, state: JobState) -> Result<(), Error> { if !state + .state .node_cache .is_nodeinfo_outdated(self.actor_id.clone()) .await @@ -42,6 +43,7 @@ impl QueryNodeinfo { let well_known_uri = iri!(format!("{scheme}://{authority}/.well-known/nodeinfo")); let well_known = match state + .state .requests .fetch_json::(&well_known_uri) .await @@ -60,7 +62,7 @@ impl QueryNodeinfo { return Ok(()); }; - let nodeinfo = match state.requests.fetch_json::(&href).await { + let nodeinfo = match state.state.requests.fetch_json::(&href).await { Ok(nodeinfo) => nodeinfo, Err(e) if e.is_breaker() => { tracing::debug!("Not retrying due to failed breaker"); @@ -70,6 +72,7 @@ impl QueryNodeinfo { }; state + .state .node_cache .set_info( self.actor_id.clone(), diff --git a/src/main.rs b/src/main.rs index 7832880..482a260 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,17 +1,21 @@ // need this for ructe #![allow(clippy::needless_borrow)] +use std::time::Duration; + use activitystreams::iri_string::types::IriString; use actix_rt::task::JoinHandle; use actix_web::{middleware::Compress, web, App, HttpServer}; use collector::MemoryCollector; #[cfg(feature = "console")] use console_subscriber::ConsoleLayer; +use error::Error; use http_signature_normalization_actix::middleware::VerifySignature; use metrics_exporter_prometheus::PrometheusBuilder; use metrics_util::layers::FanoutBuilder; use opentelemetry::{sdk::Resource, KeyValue}; use opentelemetry_otlp::WithExportConfig; +use reqwest_middleware::ClientWithMiddleware; use rustls::ServerConfig; use tracing_actix_web::TracingLogger; use tracing_error::ErrorLayer; @@ -34,6 +38,8 @@ mod routes; mod spawner; mod telegram; +use crate::config::UrlKind; + use self::{ args::Args, config::Config, @@ -100,6 +106,38 @@ fn init_subscriber( Ok(()) } +fn build_client( + user_agent: &str, + timeout_seconds: u64, + proxy: Option<(&IriString, Option<(&str, &str)>)>, +) -> Result { + let builder = reqwest::Client::builder().user_agent(user_agent.to_string()); + + let builder = if let Some((url, auth)) = proxy { + let proxy = reqwest::Proxy::all(url.as_str())?; + + let proxy = if let Some((username, password)) = auth { + proxy.basic_auth(username, password) + } else { + proxy + }; + + builder.proxy(proxy) + } else { + builder + }; + + let client = builder + .timeout(Duration::from_secs(timeout_seconds)) + .build()?; + + let client_with_middleware = reqwest_middleware::ClientBuilder::new(client) + .with(reqwest_tracing::TracingMiddleware::default()) + .build(); + + Ok(client_with_middleware) +} + #[actix_rt::main] async fn main() -> Result<(), anyhow::Error> { dotenv::dotenv().ok(); @@ -150,11 +188,11 @@ fn client_main(config: Config, args: Args) -> JoinHandle Result<(), anyhow::Error> { - let client = requests::build_client( + let client = build_client( &config.user_agent(), - config.client_pool_size(), config.client_timeout(), - ); + config.proxy_config(), + )?; if !args.blocks().is_empty() || !args.allowed().is_empty() { if args.undo() { @@ -251,15 +289,13 @@ async fn do_server_main( collector: MemoryCollector, config: Config, ) -> Result<(), anyhow::Error> { + let client = build_client( + &config.user_agent(), + config.client_timeout(), + config.proxy_config(), + )?; + tracing::warn!("Creating state"); - let state = State::build(db.clone()).await?; - - if let Some((token, admin_handle)) = config.telegram_info() { - tracing::warn!("Creating telegram handler"); - telegram::start(admin_handle.to_owned(), db.clone(), token); - } - - let keys = config.open_keys()?; let (signature_threads, verify_threads) = match config.signature_threads() { 0 | 1 => (1, 1), @@ -272,26 +308,29 @@ async fn do_server_main( } }; - let spawner = Spawner::build("sign-cpu", signature_threads)?; let verify_spawner = Spawner::build("verify-cpu", verify_threads)?; + let sign_spawner = Spawner::build("sign-cpu", signature_threads)?; + + let key_id = config.generate_url(UrlKind::MainKey).to_string(); + let state = State::build(db.clone(), key_id, sign_spawner, client).await?; + + if let Some((token, admin_handle)) = config.telegram_info() { + tracing::warn!("Creating telegram handler"); + telegram::start(admin_handle.to_owned(), db.clone(), token); + } + + let keys = config.open_keys()?; let bind_address = config.bind_address(); let server = HttpServer::new(move || { - let requests = state.requests(&config, spawner.clone()); - - let job_server = create_workers( - state.clone(), - actors.clone(), - media.clone(), - config.clone(), - spawner.clone(), - ); + let job_server = + create_workers(state.clone(), actors.clone(), media.clone(), config.clone()); let app = App::new() .app_data(web::Data::new(db.clone())) .app_data(web::Data::new(state.clone())) .app_data(web::Data::new( - requests.clone().spawner(verify_spawner.clone()), + state.requests.clone().spawner(verify_spawner.clone()), )) .app_data(web::Data::new(actors.clone())) .app_data(web::Data::new(config.clone())) @@ -317,7 +356,7 @@ async fn do_server_main( .wrap(config.digest_middleware().spawner(verify_spawner.clone())) .wrap(VerifySignature::new( MyVerify( - requests.spawner(verify_spawner.clone()), + state.requests.clone().spawner(verify_spawner.clone()), actors.clone(), state.clone(), verify_spawner.clone(), diff --git a/src/requests.rs b/src/requests.rs index 8b77028..1921f27 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -5,10 +5,10 @@ use crate::{ }; use activitystreams::iri_string::types::IriString; use actix_web::http::header::Date; -use awc::{error::SendRequestError, Client, ClientResponse, Connector}; use base64::{engine::general_purpose::STANDARD, Engine}; use dashmap::DashMap; -use http_signature_normalization_actix::{digest::ring::Sha256, prelude::*}; +use http_signature_normalization_reqwest::{digest::ring::Sha256, prelude::*}; +use reqwest_middleware::ClientWithMiddleware; use ring::{ rand::SystemRandom, signature::{RsaKeyPair, RSA_PKCS1_SHA256}, @@ -18,7 +18,6 @@ use std::{ sync::Arc, time::{Duration, SystemTime}, }; -use tracing_awc::Tracing; const ONE_SECOND: u64 = 1; const ONE_MINUTE: u64 = 60 * ONE_SECOND; @@ -139,10 +138,8 @@ impl Default for Breaker { #[derive(Clone)] pub(crate) struct Requests { - pool_size: usize, - client: Client, + client: ClientWithMiddleware, key_id: String, - user_agent: String, private_key: Arc, rng: SystemRandom, config: Config, @@ -153,66 +150,39 @@ pub(crate) struct Requests { impl std::fmt::Debug for Requests { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Requests") - .field("pool_size", &self.pool_size) .field("key_id", &self.key_id) - .field("user_agent", &self.user_agent) .field("config", &self.config) .field("breakers", &self.breakers) .finish() } } -thread_local! { - static CLIENT: std::cell::OnceCell = std::cell::OnceCell::new(); -} - -pub(crate) fn build_client(user_agent: &str, pool_size: usize, timeout_seconds: u64) -> Client { - CLIENT.with(|client| { - client - .get_or_init(|| { - let connector = Connector::new().limit(pool_size); - - Client::builder() - .connector(connector) - .wrap(Tracing) - .add_default_header(("User-Agent", user_agent.to_string())) - .timeout(Duration::from_secs(timeout_seconds)) - .finish() - }) - .clone() - }) -} - impl Requests { #[allow(clippy::too_many_arguments)] pub(crate) fn new( key_id: String, private_key: RsaPrivateKey, - user_agent: String, breakers: Breakers, last_online: Arc, - pool_size: usize, - timeout_seconds: u64, spawner: Spawner, + client: ClientWithMiddleware, ) -> Self { let private_key_der = private_key.to_pkcs1_der().expect("Can encode der"); let private_key = ring::signature::RsaKeyPair::from_der(private_key_der.as_bytes()) .expect("Key is valid"); Requests { - pool_size, - client: build_client(&user_agent, pool_size, timeout_seconds), + client, key_id, - user_agent, private_key: Arc::new(private_key), rng: SystemRandom::new(), - config: Config::new().mastodon_compat().spawner(spawner), + config: Config::new_with_spawner(spawner).mastodon_compat(), breakers, last_online, } } pub(crate) fn spawner(mut self, spawner: Spawner) -> Self { - self.config = self.config.spawner(spawner); + self.config = self.config.set_spawner(spawner); self } @@ -223,27 +193,26 @@ impl Requests { async fn check_response( &self, parsed_url: &IriString, - res: Result, - ) -> Result { + res: Result, + ) -> Result { if res.is_err() { self.breakers.fail(&parsed_url); } - let mut res = - res.map_err(|e| ErrorKind::SendRequest(parsed_url.to_string(), e.to_string()))?; + let res = res?; - if res.status().is_server_error() { + let status = res.status(); + + if status.is_server_error() { self.breakers.fail(&parsed_url); - if let Ok(bytes) = res.body().await { - if let Ok(s) = String::from_utf8(bytes.as_ref().to_vec()) { - if !s.is_empty() { - tracing::debug!("Response from {parsed_url}, {s}"); - } + if let Ok(s) = res.text().await { + if !s.is_empty() { + tracing::debug!("Response from {parsed_url}, {s}"); } } - return Err(ErrorKind::Status(parsed_url.to_string(), res.status()).into()); + return Err(ErrorKind::Status(parsed_url.to_string(), status).into()); } self.last_online.mark_seen(&parsed_url); @@ -265,21 +234,18 @@ impl Requests { where T: serde::de::DeserializeOwned, { - let mut res = self + let body = self .do_deliver( url, &serde_json::json!({}), "application/json", "application/json", ) + .await? + .bytes() .await?; - let body = res - .body() - .await - .map_err(|e| ErrorKind::ReceiveResponse(url.to_string(), e.to_string()))?; - - Ok(serde_json::from_slice(body.as_ref())?) + Ok(serde_json::from_slice(&body)?) } #[tracing::instrument(name = "Fetch Activity+Json", skip(self), fields(signing_string))] @@ -294,18 +260,13 @@ impl Requests { where T: serde::de::DeserializeOwned, { - let mut res = self.do_fetch_response(url, accept).await?; + let body = self.do_fetch_response(url, accept).await?.bytes().await?; - let body = res - .body() - .await - .map_err(|e| ErrorKind::ReceiveResponse(url.to_string(), e.to_string()))?; - - Ok(serde_json::from_slice(body.as_ref())?) + Ok(serde_json::from_slice(&body)?) } #[tracing::instrument(name = "Fetch response", skip(self), fields(signing_string))] - pub(crate) async fn fetch_response(&self, url: &IriString) -> Result { + pub(crate) async fn fetch_response(&self, url: &IriString) -> Result { self.do_fetch_response(url, "*/*").await } @@ -313,7 +274,7 @@ impl Requests { &self, url: &IriString, accept: &str, - ) -> Result { + ) -> Result { if !self.breakers.should_try(url) { return Err(ErrorKind::Breaker.into()); } @@ -321,23 +282,18 @@ impl Requests { let signer = self.signer(); let span = tracing::Span::current(); - let res = self + let request = self .client .get(url.as_str()) - .insert_header(("Accept", accept)) - .insert_header(Date(SystemTime::now().into())) - .no_decompress() - .signature( - self.config.clone(), - self.key_id.clone(), - move |signing_string| { - span.record("signing_string", signing_string); - span.in_scope(|| signer.sign(signing_string)) - }, - ) - .await? - .send() - .await; + .header("Accept", accept) + .header("Date", Date(SystemTime::now().into()).to_string()) + .signature(&self.config, self.key_id.clone(), move |signing_string| { + span.record("signing_string", signing_string); + span.in_scope(|| signer.sign(signing_string)) + }) + .await?; + + let res = self.client.execute(request).await; let res = self.check_response(url, res).await?; @@ -369,7 +325,7 @@ impl Requests { item: &T, content_type: &str, accept: &str, - ) -> Result + ) -> Result where T: serde::ser::Serialize + std::fmt::Debug, { @@ -381,12 +337,12 @@ impl Requests { let span = tracing::Span::current(); let item_string = serde_json::to_string(item)?; - let (req, body) = self + let request = self .client .post(inbox.as_str()) - .insert_header(("Accept", accept)) - .insert_header(("Content-Type", content_type)) - .insert_header(Date(SystemTime::now().into())) + .header("Accept", accept) + .header("Content-Type", content_type) + .header("Date", Date(SystemTime::now().into()).to_string()) .signature_with_digest( self.config.clone(), self.key_id.clone(), @@ -397,10 +353,9 @@ impl Requests { span.in_scope(|| signer.sign(signing_string)) }, ) - .await? - .split(); + .await?; - let res = req.send_body(body).await; + let res = self.client.execute(request).await; let res = self.check_response(inbox, res).await?; diff --git a/src/routes/index.rs b/src/routes/index.rs index 0d1bb23..7c94759 100644 --- a/src/routes/index.rs +++ b/src/routes/index.rs @@ -36,7 +36,7 @@ pub(crate) async fn route( state: web::Data, config: web::Data, ) -> Result { - let all_nodes = state.node_cache().nodes().await?; + let all_nodes = state.node_cache.nodes().await?; let mut nodes = Vec::new(); let mut local = Vec::new(); diff --git a/src/routes/media.rs b/src/routes/media.rs index 7cc3ed9..b99caef 100644 --- a/src/routes/media.rs +++ b/src/routes/media.rs @@ -19,7 +19,7 @@ pub(crate) async fn route( response.insert_header((name.clone(), value.clone())); } - return Ok(response.body(BodyStream::new(res))); + return Ok(response.body(BodyStream::new(res.bytes_stream()))); } Ok(HttpResponse::NotFound().finish()) diff --git a/src/spawner.rs b/src/spawner.rs index a6c4c87..3b611d7 100644 --- a/src/spawner.rs +++ b/src/spawner.rs @@ -162,3 +162,32 @@ impl Spawn for Spawner { }) } } + +impl http_signature_normalization_reqwest::Spawn for Spawner { + type Future = std::pin::Pin> + Send>> where T: Send; + + fn spawn_blocking(&self, func: Func) -> Self::Future + where + Func: FnOnce() -> Out + Send + 'static, + Out: Send + 'static, + { + let sender = self.sender.as_ref().expect("Sender exists").clone(); + + Box::pin(async move { + let (tx, rx) = flume::bounded(1); + + let _ = sender + .send_async(Box::new(move || { + if tx.try_send((func)()).is_err() { + tracing::warn!("Requestor hung up"); + metrics::increment_counter!("relay.spawner.disconnected"); + } + })) + .await; + + timer(rx.recv_async()) + .await + .map_err(|_| http_signature_normalization_reqwest::Canceled) + }) + } +} From 4d4093c15ac914fa96969ff80893414380877fa7 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 17 Aug 2023 17:10:24 -0500 Subject: [PATCH 46/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bb9b6ed..5d82676 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,7 +389,7 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ap-relay" -version = "0.3.99" +version = "0.3.100" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index f67b019..628cb88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.99" +version = "0.3.100" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 9836682..c825be5 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.99"; + version = "0.3.100"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 927fb91a5ef21879185f099eab2d1836a922f904 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 17 Aug 2023 17:11:08 -0500 Subject: [PATCH 47/60] Update flume --- Cargo.lock | 5 ++--- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d82676..2d7def7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1125,14 +1125,13 @@ dependencies = [ [[package]] name = "flume" -version = "0.10.14" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", "nanorand", - "pin-project", "spin 0.9.8", ] diff --git a/Cargo.toml b/Cargo.toml index 628cb88..4aafc44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ config = "0.13.0" console-subscriber = { version = "0.1", optional = true } dashmap = "5.1.0" dotenv = "0.15.0" -flume = "0.10.14" +flume = "0.11.0" futures-util = "0.3.17" lru = "0.11.0" metrics = "0.21.0" From a8ba53fe11bb8e664ac1a4473df5a2693b8dbfb8 Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 26 Aug 2023 12:20:36 -0500 Subject: [PATCH 48/60] Update flake --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index fc0942e..2a20bfa 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1689068808, - "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=", + "lastModified": 1692799911, + "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", "owner": "numtide", "repo": "flake-utils", - "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4", + "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1689679375, - "narHash": "sha256-LHUC52WvyVDi9PwyL1QCpaxYWBqp4ir4iL6zgOkmcb8=", + "lastModified": 1693003285, + "narHash": "sha256-5nm4yrEHKupjn62MibENtfqlP6pWcRTuSKrMiH9bLkc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "684c17c429c42515bafb3ad775d2a710947f3d67", + "rev": "5690c4271f2998c304a45c91a0aeb8fb69feaea7", "type": "github" }, "original": { From 9b1fad0e2e2114f6b4e21be4b051109e9f8e3430 Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 29 Aug 2023 22:15:32 -0500 Subject: [PATCH 49/60] Update rustls --- Cargo.lock | 389 ++++++++++++++++++++-------------------------------- Cargo.toml | 8 +- src/main.rs | 2 +- 3 files changed, 154 insertions(+), 245 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d7def7..3b6019d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" +checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" dependencies = [ "actix-codec", "actix-rt", @@ -66,8 +66,8 @@ dependencies = [ "actix-tls", "actix-utils", "ahash 0.8.3", - "base64 0.21.2", - "bitflags 1.3.2", + "base64 0.21.3", + "bitflags 2.4.0", "brotli", "bytes", "bytestring", @@ -118,9 +118,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" +checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" dependencies = [ "actix-macros", "futures-core", @@ -129,9 +129,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" +checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" dependencies = [ "actix-rt", "actix-service", @@ -139,8 +139,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "num_cpus", - "socket2 0.4.9", + "socket2 0.5.3", "tokio", "tracing", ] @@ -158,19 +157,22 @@ dependencies = [ [[package]] name = "actix-tls" -version = "3.0.3" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fde0cf292f7cdc7f070803cb9a0d45c018441321a78b1042ffbbb81ec333297" +checksum = "72616e7fbec0aa99c6f3164677fa48ff5a60036d0799c98cab894a44f3e0efc3" dependencies = [ - "actix-codec", "actix-rt", "actix-service", "actix-utils", "futures-core", - "log", + "impl-more", "pin-project-lite", - "tokio-rustls 0.23.4", + "rustls", + "rustls-webpki", + "tokio", + "tokio-rustls", "tokio-util", + "tracing", "webpki-roots", ] @@ -186,9 +188,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.3.1" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" +checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" dependencies = [ "actix-codec", "actix-http", @@ -198,7 +200,7 @@ dependencies = [ "actix-service", "actix-tls", "actix-utils", - "ahash 0.7.6", + "ahash 0.8.3", "bytes", "bytestring", "cfg-if", @@ -206,7 +208,6 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "http", "itoa", "language-tags", "log", @@ -218,7 +219,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.4.9", + "socket2 0.5.3", "time", "url", ] @@ -238,9 +239,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -285,9 +286,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] @@ -326,32 +327,25 @@ dependencies = [ "url", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "anstream" -version = "0.3.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" [[package]] name = "anstyle-parse" @@ -373,9 +367,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" +checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" dependencies = [ "anstyle", "windows-sys", @@ -399,7 +393,7 @@ dependencies = [ "ammonia", "anyhow", "background-jobs", - "base64 0.21.2", + "base64 0.21.3", "bcrypt", "clap", "config", @@ -428,7 +422,7 @@ dependencies = [ "rsa", "rsa-magic-public-key", "ructe", - "rustls 0.20.8", + "rustls", "rustls-pemfile", "serde", "serde_json", @@ -581,9 +575,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -602,9 +596,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "base64ct" @@ -618,7 +612,7 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d1c9c15093eb224f0baa400f38fcd713fc1391a6f1c389d886beef146d60a3" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "blowfish", "getrandom", "subtle", @@ -712,9 +706,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", ] @@ -727,11 +721,10 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "f56b4c72906975ca04becb8a30e102dfecddd0c06181e3e95ddc444be28881f8" dependencies = [ - "android-tzdata", "num-traits", ] @@ -747,9 +740,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.22" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b417ae4361bca3f5de378294fc7472d3c4ed86a5ef9f49e93ae722f432aae8d2" +checksum = "7c8d502cbaec4595d2e7d5f61e318f05417bd2b66fdc3809498f0d3fdf0bea27" dependencies = [ "clap_builder", "clap_derive", @@ -758,9 +751,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.22" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c90dc0f0e42c64bff177ca9d7be6fcc9ddb0f26a6e062174a61c84dd6c644d4" +checksum = "5891c7bc0edb3e1c2204fc5e94009affabeb1821c9e5fdc3959536c5c0bb984d" dependencies = [ "anstream", "anstyle", @@ -770,9 +763,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a" dependencies = [ "heck", "proc-macro2", @@ -782,9 +775,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "colorchoice" @@ -967,9 +960,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.5.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", "hashbrown 0.14.0", @@ -991,9 +984,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7684a49fb1af197853ef7b2ee694bc1f5b4179556f1e5710e1760c5db6f5e929" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" dependencies = [ "serde", ] @@ -1051,9 +1044,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] @@ -1080,27 +1073,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "errno" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "event-listener" version = "2.5.3" @@ -1293,15 +1265,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "h2" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -1501,9 +1473,9 @@ dependencies = [ "futures-util", "http", "hyper", - "rustls 0.21.6", + "rustls", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", ] [[package]] @@ -1534,6 +1506,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "impl-more" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" + [[package]] name = "indexmap" version = "1.9.3" @@ -1588,17 +1566,6 @@ dependencies = [ "serde", ] -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix", - "windows-sys", -] - [[package]] name = "itertools" version = "0.9.0" @@ -1685,12 +1652,6 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" -[[package]] -name = "linux-raw-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" - [[package]] name = "local-channel" version = "0.1.3" @@ -1792,9 +1753,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f478948fd84d9f8e86967bf432640e46adfb5a4bd4f14ef7e864ab38220534ae" [[package]] name = "memoffset" @@ -1822,7 +1783,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a4964177ddfdab1e3a2b37aec7cf320e14169abb0ed73999f558136409178d5" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "hyper", "indexmap 1.9.3", "ipnet", @@ -1850,7 +1811,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4de2ed6e491ed114b40b732e4d1659a9d53992ebd87490c44a6ffe23739d973e" dependencies = [ - "aho-corasick 1.0.4", + "aho-corasick 1.0.5", "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.13.1", @@ -1982,9 +1943,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -2064,9 +2025,9 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" dependencies = [ "memchr", ] @@ -2168,9 +2129,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "3.7.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc2dbde8f8a79f2102cc474ceb0ad68e3b80b85289ea62389b60e66777e4213" +checksum = "2a54938017eacd63036332b4ae5c8a49fc8c0c1d6d629893057e4f13609edd06" dependencies = [ "num-traits", ] @@ -2381,9 +2342,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -2414,9 +2375,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32154ba0af3a075eefa1eda8bb414ee928f62303a54ea85b8d6638ff1a6ee9e" +checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" [[package]] name = "ppv-lite86" @@ -2598,14 +2559,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.3" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" dependencies = [ - "aho-corasick 1.0.4", + "aho-corasick 1.0.5", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "regex-automata 0.3.7", + "regex-syntax 0.7.5", ] [[package]] @@ -2619,13 +2580,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" dependencies = [ - "aho-corasick 1.0.4", + "aho-corasick 1.0.5", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.7.5", ] [[package]] @@ -2636,17 +2597,17 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "reqwest" -version = "0.11.18" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "bytes", "encoding_rs", "futures-core", @@ -2664,13 +2625,13 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.6", + "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls", "tokio-util", "tower-service", "url", @@ -2699,9 +2660,9 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b97ad83c2fc18113346b7158d79732242002427c30f620fa817c1f32901e0a8" +checksum = "14b1e66540e0cac90acadaf7109bf99c90d95abcc94b4c096bfa16a2d7aa7a71" dependencies = [ "anyhow", "async-trait", @@ -2767,7 +2728,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88ca6a6947c6fe6454c93c3bb65b92f9680e6f9e906e75e30631110f2227344c" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "num-bigint-dig", "rsa", "thiserror", @@ -2796,7 +2757,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b0a930679d54e46fa4e66be3d9a333026da04d2b659e42aab4dfd1586452815" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "bytecount", "itertools 0.11.0", "md5", @@ -2836,36 +2797,11 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.38.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls" -version = "0.21.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring", @@ -2879,14 +2815,14 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", ] [[package]] name = "rustls-webpki" -version = "0.101.3" +version = "0.101.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261e9e0888cba427c3316e6322805653c9425240b6fd96cee7cb671ab70ab8d0" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ "ring", "untrusted", @@ -2928,18 +2864,18 @@ checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.183" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.183" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", @@ -3042,9 +2978,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "sketches-ddsketch" @@ -3054,9 +2990,9 @@ checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -3327,9 +3263,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fdd63d58b18d663fbdf70e049f00a22c8e42be082203be7f26589213cd75ea" +checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" dependencies = [ "deranged", "itoa", @@ -3346,9 +3282,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" +checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" dependencies = [ "time-core", ] @@ -3408,24 +3344,13 @@ dependencies = [ "syn 2.0.29", ] -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls 0.21.6", + "rustls", "tokio", ] @@ -3505,7 +3430,7 @@ checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" dependencies = [ "async-trait", "axum", - "base64 0.21.2", + "base64 0.21.3", "bytes", "futures-core", "futures-util", @@ -3686,9 +3611,9 @@ checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -3722,9 +3647,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -3855,9 +3780,9 @@ checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-streams" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" dependencies = [ "futures-util", "js-sys", @@ -3876,24 +3801,11 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" [[package]] name = "winapi" @@ -3928,9 +3840,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f51fb4c64f8b770a823c043c7fad036323e1c48f55287b7bbb7987b2fcdf3b" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -3943,62 +3855,63 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde1bb55ae4ce76a597a8566d82c57432bc69c039449d61572a7a353da28f68c" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1513e8d48365a78adad7322fd6b5e4c4e99d92a69db8df2d435b25b1f1f286d4" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60587c0265d2b842298f5858e1a5d79d146f9ee0c37be5782e92a6eb5e1d7a83" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224fe0e0ffff5d2ea6a29f82026c8f43870038a0ffc247aa95a52b47df381ac4" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62fc52a0f50a088de499712cbc012df7ebd94e2d6eb948435449d76a6287e7ad" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2093925509d91ea3d69bcd20238f4c2ecdb1a29d3c281d026a09705d0dd35f3d" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.3" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6ade45bc8bf02ae2aa34a9d54ba660a1a58204da34ba793c00d83ca3730b5f1" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4aafc44..389057c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,11 +23,7 @@ default = [] [dependencies] anyhow = "1.0" actix-rt = "2.7.0" -actix-web = { version = "4.0.1", default-features = false, features = [ - "rustls", - "compress-brotli", - "compress-gzip", -] } +actix-web = { version = "4.4.0", default-features = false, features = ["compress-brotli", "compress-gzip", "rustls-0_21"] } actix-webfinger = { version = "0.5.0", default-features = false } activitystreams = "0.7.0-alpha.25" activitystreams-ext = "0.1.0-alpha.3" @@ -60,7 +56,7 @@ reqwest-tracing = "0.4.5" ring = "0.16.20" rsa = { version = "0.9" } rsa-magic-public-key = "0.8.0" -rustls = "0.20.7" +rustls = "0.21.0" rustls-pemfile = "1.0.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/src/main.rs b/src/main.rs index 482a260..eaa6d3d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -399,7 +399,7 @@ async fn do_server_main( .with_no_client_auth() .with_single_cert(certs, key)?; server - .bind_rustls(bind_address, server_config)? + .bind_rustls_021(bind_address, server_config)? .run() .await?; } else { From 53b14c33293a477a0369cdd20f79742ce72c7b8e Mon Sep 17 00:00:00 2001 From: asonix Date: Tue, 29 Aug 2023 23:05:41 -0500 Subject: [PATCH 50/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3b6019d..d3a92b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -383,7 +383,7 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ap-relay" -version = "0.3.100" +version = "0.3.101" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 389057c..674b2c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.100" +version = "0.3.101" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index c825be5..c747968 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.100"; + version = "0.3.101"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From ea926f73c449121bbd988ddd91f2361eb7b4d09a Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 8 Sep 2023 18:39:37 -0600 Subject: [PATCH 51/60] Update dependencies (minor & point) --- Cargo.lock | 108 ++++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3a92b8..7bbd7ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,7 +100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -431,7 +431,7 @@ dependencies = [ "thiserror", "time", "tokio", - "toml 0.7.6", + "toml 0.7.7", "tracing", "tracing-actix-web", "tracing-error", @@ -469,7 +469,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -691,9 +691,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bytestring" @@ -721,9 +721,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56b4c72906975ca04becb8a30e102dfecddd0c06181e3e95ddc444be28881f8" +checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" dependencies = [ "num-traits", ] @@ -740,20 +740,19 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.1" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c8d502cbaec4595d2e7d5f61e318f05417bd2b66fdc3809498f0d3fdf0bea27" +checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.4.1" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5891c7bc0edb3e1c2204fc5e94009affabeb1821c9e5fdc3959536c5c0bb984d" +checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" dependencies = [ "anstream", "anstyle", @@ -763,14 +762,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1198,7 +1197,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1688,9 +1687,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eedb2bdbad7e0634f83989bf596f497b070130daaa398ab22d84c39e266deec5" +checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" dependencies = [ "hashbrown 0.14.0", ] @@ -1753,9 +1752,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.6.1" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f478948fd84d9f8e86967bf432640e46adfb5a4bd4f14ef7e864ab38220534ae" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "memoffset" @@ -1802,7 +1801,7 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -2025,9 +2024,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -2240,19 +2239,20 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" +checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" +checksum = "a2bee7be22ce7918f641a33f08e3f43388c7656772244e2bbb2477f44cc9021a" dependencies = [ "pest", "pest_generator", @@ -2260,22 +2260,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" +checksum = "d1511785c5e98d79a05e8a6bc34b4ac2168a0e3e92161862030ad84daa223141" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] name = "pest_meta" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" +checksum = "b42f0394d3123e33353ca5e1e89092e533d2cc490389f2bd6131c43c634ebc5f" dependencies = [ "once_cell", "pest", @@ -2337,7 +2337,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -2559,13 +2559,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick 1.0.5", "memchr", - "regex-automata 0.3.7", + "regex-automata 0.3.8", "regex-syntax 0.7.5", ] @@ -2580,9 +2580,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick 1.0.5", "memchr", @@ -2879,7 +2879,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -3115,9 +3115,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" dependencies = [ "proc-macro2", "quote", @@ -3233,22 +3233,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -3341,7 +3341,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -3390,9 +3390,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "de0a3ab2091e52d7299a39d098e200114a972df0a7724add02a273aa9aada592" dependencies = [ "serde", "serde_spanned", @@ -3411,9 +3411,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.0.0", "serde", @@ -3515,7 +3515,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -3733,7 +3733,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", "wasm-bindgen-shared", ] @@ -3767,7 +3767,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", "wasm-bindgen-backend", "wasm-bindgen-shared", ] From 5a6fbbcb7730ebde6e771621260a70cd4e0d8aae Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 8 Sep 2023 18:41:55 -0600 Subject: [PATCH 52/60] Update tracing-opentelemetry --- Cargo.lock | 6 ++++-- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7bbd7ab..4baced8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3561,12 +3561,14 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc09e402904a5261e42cf27aea09ccb7d5318c6717a9eec3d8e2e65c56b18f19" +checksum = "75327c6b667828ddc28f5e3f169036cb793c3f588d83bf0f262a7f062ffed3c8" dependencies = [ "once_cell", "opentelemetry", + "opentelemetry_sdk", + "smallvec", "tracing", "tracing-core", "tracing-log", diff --git a/Cargo.toml b/Cargo.toml index 674b2c0..1a3c9a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,7 +72,7 @@ tracing = "0.1" tracing-error = "0.2" tracing-futures = "0.2" tracing-log = "0.1" -tracing-opentelemetry = "0.20" +tracing-opentelemetry = "0.21" tracing-subscriber = { version = "0.3", features = [ "ansi", "env-filter", From 804d22ee81cbafa18a141ebd6cec1a23d8a2d376 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 8 Sep 2023 19:11:24 -0600 Subject: [PATCH 53/60] Enable different breaker failure cases for different endpoints Additionally, don't count 4xx towards succeeding a breaker --- src/data/actor.rs | 6 ++- src/jobs/contact.rs | 3 +- src/jobs/deliver.rs | 8 +++- src/jobs/instance.rs | 11 ++++- src/jobs/nodeinfo.rs | 10 ++++- src/middleware/verifier.rs | 8 +++- src/requests.rs | 85 +++++++++++++++++++++++++++++++------- src/routes/media.rs | 10 ++++- 8 files changed, 114 insertions(+), 27 deletions(-) diff --git a/src/data/actor.rs b/src/data/actor.rs index 9c446f7..2966222 100644 --- a/src/data/actor.rs +++ b/src/data/actor.rs @@ -2,7 +2,7 @@ use crate::{ apub::AcceptedActors, db::{Actor, Db}, error::{Error, ErrorKind}, - requests::Requests, + requests::{BreakerStrategy, Requests}, }; use activitystreams::{iri_string::types::IriString, prelude::*}; use std::time::{Duration, SystemTime}; @@ -71,7 +71,9 @@ impl ActorCache { id: &IriString, requests: &Requests, ) -> Result { - let accepted_actor = requests.fetch::(id).await?; + let accepted_actor = requests + .fetch::(id, BreakerStrategy::Require2XX) + .await?; let input_authority = id.authority_components().ok_or(ErrorKind::MissingDomain)?; let accepted_actor_id = accepted_actor diff --git a/src/jobs/contact.rs b/src/jobs/contact.rs index f59affe..c3c3765 100644 --- a/src/jobs/contact.rs +++ b/src/jobs/contact.rs @@ -2,6 +2,7 @@ use crate::{ apub::AcceptedActors, error::{Error, ErrorKind}, jobs::JobState, + requests::BreakerStrategy, }; use activitystreams::{iri_string::types::IriString, object::Image, prelude::*}; use background_jobs::ActixJob; @@ -44,7 +45,7 @@ impl QueryContact { let contact = match state .state .requests - .fetch::(&self.contact_id) + .fetch::(&self.contact_id, BreakerStrategy::Allow404AndBelow) .await { Ok(contact) => contact, diff --git a/src/jobs/deliver.rs b/src/jobs/deliver.rs index 10c5fce..0f936e4 100644 --- a/src/jobs/deliver.rs +++ b/src/jobs/deliver.rs @@ -1,6 +1,7 @@ use crate::{ error::Error, jobs::{debug_object, JobState}, + requests::BreakerStrategy, }; use activitystreams::iri_string::types::IriString; use background_jobs::{ActixJob, Backoff}; @@ -35,7 +36,12 @@ impl Deliver { #[tracing::instrument(name = "Deliver", skip(state))] async fn permform(self, state: JobState) -> Result<(), Error> { - if let Err(e) = state.state.requests.deliver(&self.to, &self.data).await { + if let Err(e) = state + .state + .requests + .deliver(&self.to, &self.data, BreakerStrategy::Allow401AndBelow) + .await + { if e.is_breaker() { tracing::debug!("Not trying due to failed breaker"); return Ok(()); diff --git a/src/jobs/instance.rs b/src/jobs/instance.rs index 2b44e60..a0f3da1 100644 --- a/src/jobs/instance.rs +++ b/src/jobs/instance.rs @@ -2,6 +2,7 @@ use crate::{ config::UrlKind, error::{Error, ErrorKind}, jobs::{Boolish, JobState}, + requests::BreakerStrategy, }; use activitystreams::{iri, iri_string::types::IriString}; use background_jobs::ActixJob; @@ -42,7 +43,10 @@ impl QueryInstance { state .state .requests - .fetch_json::(&mastodon_instance_uri) + .fetch_json::( + &mastodon_instance_uri, + BreakerStrategy::Allow404AndBelow, + ) .await } InstanceApiType::Misskey => { @@ -50,7 +54,10 @@ impl QueryInstance { state .state .requests - .fetch_json_msky::(&msky_meta_uri) + .fetch_json_msky::( + &msky_meta_uri, + BreakerStrategy::Allow404AndBelow, + ) .await .map(|res| res.into()) } diff --git a/src/jobs/nodeinfo.rs b/src/jobs/nodeinfo.rs index 60f41ce..f9d78a3 100644 --- a/src/jobs/nodeinfo.rs +++ b/src/jobs/nodeinfo.rs @@ -1,6 +1,7 @@ use crate::{ error::{Error, ErrorKind}, jobs::{Boolish, JobState, QueryContact}, + requests::BreakerStrategy, }; use activitystreams::{iri, iri_string::types::IriString, primitives::OneOrMany}; use background_jobs::ActixJob; @@ -45,7 +46,7 @@ impl QueryNodeinfo { let well_known = match state .state .requests - .fetch_json::(&well_known_uri) + .fetch_json::(&well_known_uri, BreakerStrategy::Allow404AndBelow) .await { Ok(well_known) => well_known, @@ -62,7 +63,12 @@ impl QueryNodeinfo { return Ok(()); }; - let nodeinfo = match state.state.requests.fetch_json::(&href).await { + let nodeinfo = match state + .state + .requests + .fetch_json::(&href, BreakerStrategy::Require2XX) + .await + { Ok(nodeinfo) => nodeinfo, Err(e) if e.is_breaker() => { tracing::debug!("Not retrying due to failed breaker"); diff --git a/src/middleware/verifier.rs b/src/middleware/verifier.rs index 8fa8bb0..91debe5 100644 --- a/src/middleware/verifier.rs +++ b/src/middleware/verifier.rs @@ -2,7 +2,7 @@ use crate::{ apub::AcceptedActors, data::{ActorCache, State}, error::{Error, ErrorKind}, - requests::Requests, + requests::{BreakerStrategy, Requests}, spawner::Spawner, }; use activitystreams::{base::BaseExt, iri, iri_string::types::IriString}; @@ -70,7 +70,11 @@ impl MyVerify { actor_id } else { - match self.0.fetch::(&public_key_id).await { + match self + .0 + .fetch::(&public_key_id, BreakerStrategy::Require2XX) + .await + { Ok(res) => res.actor_id().ok_or(ErrorKind::MissingId), Err(e) => { if e.is_gone() { diff --git a/src/requests.rs b/src/requests.rs index 1921f27..08c1002 100644 --- a/src/requests.rs +++ b/src/requests.rs @@ -24,6 +24,16 @@ const ONE_MINUTE: u64 = 60 * ONE_SECOND; const ONE_HOUR: u64 = 60 * ONE_MINUTE; const ONE_DAY: u64 = 24 * ONE_HOUR; +#[derive(Debug)] +pub(crate) enum BreakerStrategy { + // Requires a successful response + Require2XX, + // Allows HTTP 2xx-401 + Allow401AndBelow, + // Allows HTTP 2xx-404 + Allow404AndBelow, +} + #[derive(Clone)] pub(crate) struct Breakers { inner: Arc>, @@ -193,6 +203,7 @@ impl Requests { async fn check_response( &self, parsed_url: &IriString, + strategy: BreakerStrategy, res: Result, ) -> Result { if res.is_err() { @@ -203,7 +214,13 @@ impl Requests { let status = res.status(); - if status.is_server_error() { + let success = match strategy { + BreakerStrategy::Require2XX => status.is_success(), + BreakerStrategy::Allow401AndBelow => (200..=401).contains(&status.as_u16()), + BreakerStrategy::Allow404AndBelow => (200..=404).contains(&status.as_u16()), + }; + + if !success { self.breakers.fail(&parsed_url); if let Ok(s) = res.text().await { @@ -215,22 +232,33 @@ impl Requests { return Err(ErrorKind::Status(parsed_url.to_string(), status).into()); } - self.last_online.mark_seen(&parsed_url); - self.breakers.succeed(&parsed_url); + // only actually succeed a breaker on 2xx response + if status.is_success() { + self.last_online.mark_seen(&parsed_url); + self.breakers.succeed(&parsed_url); + } Ok(res) } #[tracing::instrument(name = "Fetch Json", skip(self), fields(signing_string))] - pub(crate) async fn fetch_json(&self, url: &IriString) -> Result + pub(crate) async fn fetch_json( + &self, + url: &IriString, + strategy: BreakerStrategy, + ) -> Result where T: serde::de::DeserializeOwned, { - self.do_fetch(url, "application/json").await + self.do_fetch(url, "application/json", strategy).await } #[tracing::instrument(name = "Fetch Json", skip(self), fields(signing_string))] - pub(crate) async fn fetch_json_msky(&self, url: &IriString) -> Result + pub(crate) async fn fetch_json_msky( + &self, + url: &IriString, + strategy: BreakerStrategy, + ) -> Result where T: serde::de::DeserializeOwned, { @@ -240,6 +268,7 @@ impl Requests { &serde_json::json!({}), "application/json", "application/json", + strategy, ) .await? .bytes() @@ -249,31 +278,50 @@ impl Requests { } #[tracing::instrument(name = "Fetch Activity+Json", skip(self), fields(signing_string))] - pub(crate) async fn fetch(&self, url: &IriString) -> Result + pub(crate) async fn fetch( + &self, + url: &IriString, + strategy: BreakerStrategy, + ) -> Result where T: serde::de::DeserializeOwned, { - self.do_fetch(url, "application/activity+json").await + self.do_fetch(url, "application/activity+json", strategy) + .await } - async fn do_fetch(&self, url: &IriString, accept: &str) -> Result + async fn do_fetch( + &self, + url: &IriString, + accept: &str, + strategy: BreakerStrategy, + ) -> Result where T: serde::de::DeserializeOwned, { - let body = self.do_fetch_response(url, accept).await?.bytes().await?; + let body = self + .do_fetch_response(url, accept, strategy) + .await? + .bytes() + .await?; Ok(serde_json::from_slice(&body)?) } #[tracing::instrument(name = "Fetch response", skip(self), fields(signing_string))] - pub(crate) async fn fetch_response(&self, url: &IriString) -> Result { - self.do_fetch_response(url, "*/*").await + pub(crate) async fn fetch_response( + &self, + url: &IriString, + strategy: BreakerStrategy, + ) -> Result { + self.do_fetch_response(url, "*/*", strategy).await } pub(crate) async fn do_fetch_response( &self, url: &IriString, accept: &str, + strategy: BreakerStrategy, ) -> Result { if !self.breakers.should_try(url) { return Err(ErrorKind::Breaker.into()); @@ -295,7 +343,7 @@ impl Requests { let res = self.client.execute(request).await; - let res = self.check_response(url, res).await?; + let res = self.check_response(url, strategy, res).await?; Ok(res) } @@ -305,7 +353,12 @@ impl Requests { skip_all, fields(inbox = inbox.to_string().as_str(), signing_string) )] - pub(crate) async fn deliver(&self, inbox: &IriString, item: &T) -> Result<(), Error> + pub(crate) async fn deliver( + &self, + inbox: &IriString, + item: &T, + strategy: BreakerStrategy, + ) -> Result<(), Error> where T: serde::ser::Serialize + std::fmt::Debug, { @@ -314,6 +367,7 @@ impl Requests { item, "application/activity+json", "application/activity+json", + strategy, ) .await?; Ok(()) @@ -325,6 +379,7 @@ impl Requests { item: &T, content_type: &str, accept: &str, + strategy: BreakerStrategy, ) -> Result where T: serde::ser::Serialize + std::fmt::Debug, @@ -357,7 +412,7 @@ impl Requests { let res = self.client.execute(request).await; - let res = self.check_response(inbox, res).await?; + let res = self.check_response(inbox, strategy, res).await?; Ok(res) } diff --git a/src/routes/media.rs b/src/routes/media.rs index b99caef..4c9b260 100644 --- a/src/routes/media.rs +++ b/src/routes/media.rs @@ -1,4 +1,8 @@ -use crate::{data::MediaCache, error::Error, requests::Requests}; +use crate::{ + data::MediaCache, + error::Error, + requests::{BreakerStrategy, Requests}, +}; use actix_web::{body::BodyStream, web, HttpResponse}; use uuid::Uuid; @@ -11,7 +15,9 @@ pub(crate) async fn route( let uuid = uuid.into_inner(); if let Some(url) = media.get_url(uuid).await? { - let res = requests.fetch_response(&url).await?; + let res = requests + .fetch_response(&url, BreakerStrategy::Allow404AndBelow) + .await?; let mut response = HttpResponse::build(res.status()); From 6714fe48ed316b50642e7f27b6a73ecb86e6c0c0 Mon Sep 17 00:00:00 2001 From: asonix Date: Fri, 8 Sep 2023 19:15:19 -0600 Subject: [PATCH 54/60] Bump version, enable tokio_unstable for console --- .cargo/config | 2 +- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.cargo/config b/.cargo/config index 5dbf2c8..bff29e6 100644 --- a/.cargo/config +++ b/.cargo/config @@ -1,2 +1,2 @@ [build] -# rustflags = ["--cfg", "tokio_unstable"] +rustflags = ["--cfg", "tokio_unstable"] diff --git a/Cargo.lock b/Cargo.lock index 4baced8..ffc7886 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -383,7 +383,7 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ap-relay" -version = "0.3.101" +version = "0.3.102" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 1a3c9a0..370982e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.101" +version = "0.3.102" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index c747968..656cb68 100644 --- a/relay.nix +++ b/relay.nix @@ -6,12 +6,13 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.101"; + version = "0.3.102"; src = ./.; cargoLock.lockFile = ./Cargo.lock; PROTOC = "${protobuf}/bin/protoc"; PROTOC_INCLUDE = "${protobuf}/include"; + RUSTFLAGS = "--cfg tokio_unstable"; nativeBuildInputs = [ ]; From 206db2079fb76cfcd7b12274e9d75a46f59c35ab Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 9 Sep 2023 16:46:22 -0400 Subject: [PATCH 55/60] Remove futures-util dependency --- Cargo.lock | 12 +++++++++++- Cargo.toml | 2 +- src/extractors.rs | 3 +-- src/future.rs | 3 +++ src/jobs/deliver_many.rs | 2 +- src/main.rs | 1 + src/middleware/payload.rs | 33 +++++++++++++++++---------------- src/middleware/webfinger.rs | 2 +- 8 files changed, 36 insertions(+), 22 deletions(-) create mode 100644 src/future.rs diff --git a/Cargo.lock b/Cargo.lock index ffc7886..c360ce0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -401,7 +401,6 @@ dependencies = [ "dashmap", "dotenv", "flume", - "futures-util", "http-signature-normalization-actix", "http-signature-normalization-reqwest", "lru", @@ -427,6 +426,7 @@ dependencies = [ "serde", "serde_json", "sled", + "streem", "teloxide", "thiserror", "time", @@ -3064,6 +3064,16 @@ dependencies = [ "der", ] +[[package]] +name = "streem" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56bcbf3c75c402c87b9a1947202c83bbc566ba9f4b788ee3d39db75f20c840a2" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "string_cache" version = "0.8.7" diff --git a/Cargo.toml b/Cargo.toml index 370982e..f3e58d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,6 @@ console-subscriber = { version = "0.1", optional = true } dashmap = "5.1.0" dotenv = "0.15.0" flume = "0.11.0" -futures-util = "0.3.17" lru = "0.11.0" metrics = "0.21.0" metrics-exporter-prometheus = { version = "0.12.0", default-features = false, features = [ @@ -80,6 +79,7 @@ tracing-subscriber = { version = "0.3", features = [ ] } tokio = { version = "1", features = ["macros", "sync"] } uuid = { version = "1", features = ["v4", "serde"] } +streem = "0.1.0" [dependencies.background-jobs] version = "0.15.0" diff --git a/src/extractors.rs b/src/extractors.rs index 3226398..385ce9a 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -9,12 +9,11 @@ use actix_web::{ FromRequest, HttpMessage, HttpRequest, HttpResponse, ResponseError, }; use bcrypt::{BcryptError, DEFAULT_COST}; -use futures_util::future::LocalBoxFuture; 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, spawner::Spawner}; +use crate::{db::Db, future::LocalBoxFuture, spawner::Spawner}; #[derive(Clone)] pub(crate) struct AdminConfig { diff --git a/src/future.rs b/src/future.rs new file mode 100644 index 0000000..905a931 --- /dev/null +++ b/src/future.rs @@ -0,0 +1,3 @@ +use std::{future::Future, pin::Pin}; + +pub(crate) type LocalBoxFuture<'a, T> = Pin + 'a>>; diff --git a/src/jobs/deliver_many.rs b/src/jobs/deliver_many.rs index fc9107c..f932a12 100644 --- a/src/jobs/deliver_many.rs +++ b/src/jobs/deliver_many.rs @@ -1,10 +1,10 @@ use crate::{ error::Error, + future::LocalBoxFuture, jobs::{debug_object, Deliver, JobState}, }; use activitystreams::iri_string::types::IriString; use background_jobs::ActixJob; -use futures_util::future::LocalBoxFuture; #[derive(Clone, serde::Deserialize, serde::Serialize)] pub(crate) struct DeliverMany { diff --git a/src/main.rs b/src/main.rs index eaa6d3d..0373afb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,6 +31,7 @@ mod data; mod db; mod error; mod extractors; +mod future; mod jobs; mod middleware; mod requests; diff --git a/src/middleware/payload.rs b/src/middleware/payload.rs index bae7774..c23a271 100644 --- a/src/middleware/payload.rs +++ b/src/middleware/payload.rs @@ -4,14 +4,11 @@ use actix_web::{ web::BytesMut, HttpMessage, }; -use futures_util::{ - future::TryFutureExt, - stream::{once, TryStreamExt}, -}; use std::{ future::{ready, Ready}, task::{Context, Poll}, }; +use streem::IntoStreamer; #[derive(Clone, Debug)] pub(crate) struct DebugPayload(pub bool); @@ -53,19 +50,23 @@ where fn call(&self, mut req: ServiceRequest) -> Self::Future { if self.0 && req.method() == Method::POST { - let pl = req.take_payload(); + let mut pl = req.take_payload().into_streamer(); + req.set_payload(Payload::Stream { - payload: Box::pin(once( - pl.try_fold(BytesMut::new(), |mut acc, bytes| async { - acc.extend(bytes); - Ok(acc) - }) - .map_ok(|bytes| { - let bytes = bytes.freeze(); - tracing::info!("{}", String::from_utf8_lossy(&bytes)); - bytes - }), - )), + payload: Box::pin(streem::try_from_fn(|yielder| async move { + let mut buf = BytesMut::new(); + + while let Some(bytes) = pl.try_next().await? { + buf.extend(bytes); + } + + let bytes = buf.freeze(); + tracing::info!("{}", String::from_utf8_lossy(&bytes)); + + yielder.yield_ok(bytes).await; + + Ok(()) + })), }); self.1.call(req) diff --git a/src/middleware/webfinger.rs b/src/middleware/webfinger.rs index 9ccbe0e..0590408 100644 --- a/src/middleware/webfinger.rs +++ b/src/middleware/webfinger.rs @@ -1,10 +1,10 @@ use crate::{ config::{Config, UrlKind}, data::State, + future::LocalBoxFuture, }; use actix_web::web::Data; use actix_webfinger::{Resolver, Webfinger}; -use futures_util::future::LocalBoxFuture; use rsa_magic_public_key::AsMagicPublicKey; pub(crate) struct RelayResolver; From f4839d688e3c51a6739f63ac2d2de0e94fba36ff Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 9 Sep 2023 16:52:53 -0400 Subject: [PATCH 56/60] Update dependencies (minor & point) --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c360ce0..9faac02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -431,7 +431,7 @@ dependencies = [ "thiserror", "time", "tokio", - "toml 0.7.7", + "toml 0.7.8", "tracing", "tracing-actix-web", "tracing-error", @@ -2884,9 +2884,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2" dependencies = [ "itoa", "ryu", @@ -3066,9 +3066,9 @@ dependencies = [ [[package]] name = "streem" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56bcbf3c75c402c87b9a1947202c83bbc566ba9f4b788ee3d39db75f20c840a2" +checksum = "641396a5ae90767cb12d21832444ab760841ee887717d802b2c456c4f8199114" dependencies = [ "futures-core", "pin-project-lite", @@ -3400,9 +3400,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0a3ab2091e52d7299a39d098e200114a972df0a7724add02a273aa9aada592" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", From 2a5e769afb7b9a7b9694f3e9880fcf15ffb036a8 Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 9 Sep 2023 17:30:07 -0400 Subject: [PATCH 57/60] Update http-signature-normalization-actix --- Cargo.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9faac02..09e3c6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1387,17 +1387,18 @@ dependencies = [ [[package]] name = "http-signature-normalization-actix" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16b1af0de27fe75ea5c1da8da1ce826274cc623bda49eb5e9395aa4ea0b34d4" +checksum = "c82b0217cd33ff0d3530558a2a762017585b0c3d0bd208ddc6b3944c13660b7f" dependencies = [ "actix-http", "actix-rt", "actix-web", "base64 0.13.1", - "futures-util", + "futures-core", "http-signature-normalization", "ring", + "streem", "thiserror", "tokio", "tracing", From ae3d19a774260b6de936394e56cf662c5a4b499f Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 9 Sep 2023 17:31:42 -0400 Subject: [PATCH 58/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 09e3c6a..d65d690 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -383,7 +383,7 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ap-relay" -version = "0.3.102" +version = "0.3.103" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index f3e58d7..93b91df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.102" +version = "0.3.103" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 656cb68..9d56b9b 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.102"; + version = "0.3.103"; src = ./.; cargoLock.lockFile = ./Cargo.lock; From 9ebed87cde937e7d49f182b64e99d31e6f64ae29 Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 9 Sep 2023 18:09:24 -0400 Subject: [PATCH 59/60] Update http-signature-normalization-actix --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d65d690..1aca782 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1387,9 +1387,9 @@ dependencies = [ [[package]] name = "http-signature-normalization-actix" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82b0217cd33ff0d3530558a2a762017585b0c3d0bd208ddc6b3944c13660b7f" +checksum = "c8d7de237db731e75fbfa0ebeeb70e366f5f9cdcf45af4a41eca8516b80162ca" dependencies = [ "actix-http", "actix-rt", From a0f9827e180e2d9d2aa5cea3b2cce578b18394ca Mon Sep 17 00:00:00 2001 From: asonix Date: Sat, 9 Sep 2023 18:10:31 -0400 Subject: [PATCH 60/60] Bump version --- Cargo.lock | 2 +- Cargo.toml | 2 +- relay.nix | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1aca782..3dd5d19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -383,7 +383,7 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "ap-relay" -version = "0.3.103" +version = "0.3.104" dependencies = [ "activitystreams", "activitystreams-ext", diff --git a/Cargo.toml b/Cargo.toml index 93b91df..603b5ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "ap-relay" description = "A simple activitypub relay" -version = "0.3.103" +version = "0.3.104" authors = ["asonix "] license = "AGPL-3.0" readme = "README.md" diff --git a/relay.nix b/relay.nix index 9d56b9b..487fa65 100644 --- a/relay.nix +++ b/relay.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage { pname = "relay"; - version = "0.3.103"; + version = "0.3.104"; src = ./.; cargoLock.lockFile = ./Cargo.lock;