diff --git a/.woodpecker.yml b/.woodpecker.yml index 50403711e..078561be6 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -157,7 +157,7 @@ steps: CARGO_HOME: .cargo_home commands: - rustup component add clippy - - cargo clippy --workspace --tests --all-targets --features console -- -D warnings + - cargo clippy --workspace --tests --all-targets -- -D warnings when: *slow_check_paths cargo_build: @@ -240,10 +240,13 @@ steps: publish_release_docker: image: woodpeckerci/plugin-docker-buildx - secrets: [docker_username, docker_password] settings: repo: dessalines/lemmy dockerfile: docker/Dockerfile + username: + from_secret: docker_username + password: + from_secret: docker_password platforms: linux/amd64, linux/arm64 build_args: - RUST_RELEASE_MODE=release @@ -253,10 +256,13 @@ steps: nightly_build: image: woodpeckerci/plugin-docker-buildx - secrets: [docker_username, docker_password] settings: repo: dessalines/lemmy dockerfile: docker/Dockerfile + username: + from_secret: docker_username + password: + from_secret: docker_password platforms: linux/amd64,linux/arm64 build_args: - RUST_RELEASE_MODE=release diff --git a/Cargo.lock b/Cargo.lock index a41b48b94..1eb85bc4e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,8 +16,9 @@ checksum = "8f27d075294830fcab6f66e320dab524bc6d048f4a151698e153205559113772" [[package]] name = "activitypub_federation" -version = "0.5.8" -source = "git+https://github.com/LemmyNet/activitypub-federation-rust.git?branch=nested-comments-stack-overflow#4b94af9ea0580226aaa10a4abb004d0b8ca10eae" +version = "0.6.0-alpha2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4877d467ddf2fac85e9ee33aba6f2560df14125b8bfa864f85ab40e9b87753a9" dependencies = [ "activitystreams-kinds", "actix-web", @@ -31,6 +32,7 @@ dependencies = [ "futures", "futures-core", "http 0.2.12", + "http 1.1.0", "http-signature-normalization", "http-signature-normalization-reqwest", "httpdate", @@ -40,8 +42,8 @@ dependencies = [ "pin-project-lite", "rand", "regex", - "reqwest 0.11.27", - "reqwest-middleware 0.2.5", + "reqwest 0.12.7", + "reqwest-middleware", "rsa", "serde", "serde_json", @@ -249,7 +251,7 @@ dependencies = [ "pin-project-lite", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tokio-util", "tracing", ] @@ -266,9 +268,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.8.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1988c02af8d2b718c05bc4aeb6a66395b7cdf32858c2c71131e5637a8c05a9ff" +checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" dependencies = [ "actix-codec", "actix-http", @@ -289,6 +291,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", + "impl-more", "itoa", "language-tags", "log", @@ -611,7 +614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", - "axum-core 0.3.4", + "axum-core", "bitflags 1.3.2", "bytes", "futures-util", @@ -632,33 +635,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "axum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" -dependencies = [ - "async-trait", - "axum-core 0.4.3", - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper 1.0.1", - "tower", - "tower-layer", - "tower-service", -] - [[package]] name = "axum-core" version = "0.3.4" @@ -676,26 +652,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "axum-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 0.1.2", - "tower-layer", - "tower-service", -] - [[package]] name = "backtrace" version = "0.3.71" @@ -1153,38 +1109,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787" dependencies = [ "futures-core", - "prost 0.12.6", - "prost-types 0.12.6", + "prost", + "prost-types", "tonic 0.10.2", "tracing-core", ] -[[package]] -name = "console-api" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ed14aa9c9f927213c6e4f3ef75faaad3406134efe84ba2cb7983431d5f0931" -dependencies = [ - "futures-core", - "prost 0.13.1", - "prost-types 0.13.1", - "tonic 0.12.1", - "tracing-core", -] - [[package]] name = "console-subscriber" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e" dependencies = [ - "console-api 0.6.0", + "console-api", "crossbeam-channel", "crossbeam-utils", "futures-task", "hdrhistogram", "humantime", - "prost-types 0.12.6", + "prost-types", "serde", "serde_json", "thread_local", @@ -1196,32 +1139,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "console-subscriber" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e3a111a37f3333946ebf9da370ba5c5577b18eb342ec683eb488dd21980302" -dependencies = [ - "console-api 0.8.0", - "crossbeam-channel", - "crossbeam-utils", - "futures-task", - "hdrhistogram", - "humantime", - "hyper-util", - "prost 0.13.1", - "prost-types 0.13.1", - "serde", - "serde_json", - "thread_local", - "tokio", - "tokio-stream", - "tonic 0.12.1", - "tracing", - "tracing-core", - "tracing-subscriber", -] - [[package]] name = "const-oid" version = "0.9.6" @@ -1689,6 +1606,17 @@ dependencies = [ "chrono", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "doku" version = "0.21.1" @@ -2380,16 +2308,16 @@ dependencies = [ [[package]] name = "http-signature-normalization-reqwest" -version = "0.10.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cfb84663420ec12c4422820bfdf5e8e5e57467892587f43ac432e73ebce880" +checksum = "b8822f7eab343cae1ce3bd3b6d0b9b58c72adaf3463627cfe150f8f5406f27aa" dependencies = [ "async-trait", - "base64 0.13.1", + "base64 0.22.1", "http-signature-normalization", "httpdate", - "reqwest 0.11.27", - "reqwest-middleware 0.2.5", + "reqwest 0.12.7", + "reqwest-middleware", "sha2", "thiserror", "tokio", @@ -2458,20 +2386,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.30", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.2" @@ -2482,12 +2396,12 @@ dependencies = [ "http 1.1.0", "hyper 1.4.1", "hyper-util", - "rustls 0.23.12", + "rustls", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tower-service", - "webpki-roots 0.26.3", + "webpki-roots", ] [[package]] @@ -2502,19 +2416,6 @@ dependencies = [ "tokio-io-timeout", ] -[[package]] -name = "hyper-timeout" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" -dependencies = [ - "hyper 1.4.1", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - [[package]] name = "hyper-tls" version = "0.5.0" @@ -2591,6 +2492,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2617,6 +2636,18 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd69211b9b519e98303c015e21a007e293db403b6c85b9b124e133d25e242cdd" +dependencies = [ + "icu_normalizer", + "icu_properties", + "smallvec", + "utf8_iter", +] + [[package]] name = "image" version = "0.24.9" @@ -2694,15 +2725,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.12.1" @@ -2853,8 +2875,8 @@ dependencies = [ "moka", "pretty_assertions", "regex", - "reqwest 0.11.27", - "reqwest-middleware 0.2.5", + "reqwest 0.12.7", + "reqwest-middleware", "rosetta-i18n", "serde", "serde_with", @@ -2905,7 +2927,7 @@ dependencies = [ "futures", "html2md", "html2text", - "http 0.2.12", + "http 1.1.0", "itertools 0.13.0", "lemmy_api_common", "lemmy_db_schema", @@ -2914,7 +2936,7 @@ dependencies = [ "lemmy_utils", "moka", "pretty_assertions", - "reqwest 0.11.27", + "reqwest 0.12.7", "serde", "serde_json", "serde_with", @@ -2965,7 +2987,7 @@ dependencies = [ "moka", "pretty_assertions", "regex", - "rustls 0.23.12", + "rustls", "serde", "serde_json", "serde_with", @@ -3054,7 +3076,7 @@ dependencies = [ "lemmy_utils", "mockall", "moka", - "reqwest 0.11.27", + "reqwest 0.12.7", "serde_json", "serial_test", "test-context", @@ -3075,19 +3097,19 @@ dependencies = [ "anyhow", "chrono", "futures", + "http 1.1.0", "lemmy_api_common", "lemmy_db_schema", "lemmy_db_views", "lemmy_db_views_actor", "lemmy_utils", - "reqwest 0.11.27", - "reqwest-middleware 0.2.5", + "reqwest 0.12.7", + "reqwest-middleware", "rss", "serde", "tokio", "tracing", "url", - "urlencoding", ] [[package]] @@ -3101,7 +3123,6 @@ dependencies = [ "chrono", "clap", "clokwerk", - "console-subscriber 0.4.0", "diesel", "diesel-async", "futures-util", @@ -3113,23 +3134,18 @@ dependencies = [ "lemmy_federate", "lemmy_routes", "lemmy_utils", - "opentelemetry 0.19.0", - "opentelemetry-otlp 0.12.0", "pict-rs", "pretty_assertions", "prometheus", - "reqwest 0.11.27", - "reqwest-middleware 0.2.5", - "reqwest-tracing 0.4.8", - "rustls 0.23.12", + "reqwest 0.12.7", + "reqwest-middleware", + "reqwest-tracing", + "rustls", "serde_json", "serial_test", "tokio", "tracing", "tracing-actix-web", - "tracing-error", - "tracing-log 0.2.0", - "tracing-opentelemetry 0.19.0", "tracing-subscriber", "url", ] @@ -3147,14 +3163,14 @@ dependencies = [ "enum-map", "futures", "html2text", - "http 0.2.12", + "http 1.1.0", "itertools 0.13.0", "lettre", "markdown-it", "pretty_assertions", "regex", - "reqwest 0.11.27", - "reqwest-middleware 0.2.5", + "reqwest 0.12.7", + "reqwest-middleware", "rosetta-build", "rosetta-i18n", "serde", @@ -3163,7 +3179,6 @@ dependencies = [ "strum", "tokio", "tracing", - "tracing-error", "ts-rs", "url", "urlencoding", @@ -3172,9 +3187,9 @@ dependencies = [ [[package]] name = "lettre" -version = "0.11.7" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a62049a808f1c4e2356a2a380bd5f2aca3b011b0b482cf3b914ba1731426969" +checksum = "1658ac89b01055e3ba23d66ecf6f8b97388ebe34ce125e49f8ef71234fb8aaba" dependencies = [ "async-trait", "base64 0.22.1", @@ -3185,18 +3200,19 @@ dependencies = [ "futures-io", "futures-util", "httpdate", - "idna 0.5.0", + "idna 1.0.2", "mime", "nom", "percent-encoding", "quoted_printable", - "rustls 0.23.12", + "rustls", "rustls-pemfile 2.1.2", + "rustls-pki-types", "socket2", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "url", - "webpki-roots 0.26.3", + "webpki-roots", ] [[package]] @@ -3242,6 +3258,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "local-channel" version = "0.1.5" @@ -3489,16 +3511,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3788,33 +3800,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "opentelemetry" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf9b1c4e9a6c4de793c632496fa490bdc0e1eea73f0c91394f7b6990935d22" -dependencies = [ - "async-trait", - "crossbeam-channel", - "futures", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand", - "thiserror", -] - -[[package]] -name = "opentelemetry" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4b8347cc26099d3aeee044065ecc3ae11469796b4d65d065a23a584ed92a6f" -dependencies = [ - "opentelemetry_api", - "opentelemetry_sdk 0.19.0", -] - [[package]] name = "opentelemetry" version = "0.23.0" @@ -3829,24 +3814,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "opentelemetry-otlp" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af72d59a4484654ea8eb183fea5ae4eb6a41d7ac3e3bae5f4d2a282a3a7d3ca" -dependencies = [ - "async-trait", - "futures", - "futures-util", - "http 0.2.12", - "opentelemetry 0.19.0", - "opentelemetry-proto 0.2.0", - "prost 0.11.9", - "thiserror", - "tokio", - "tonic 0.8.3", -] - [[package]] name = "opentelemetry-otlp" version = "0.16.0" @@ -3856,78 +3823,27 @@ dependencies = [ "async-trait", "futures-core", "http 0.2.12", - "opentelemetry 0.23.0", - "opentelemetry-proto 0.6.0", - "opentelemetry_sdk 0.23.0", - "prost 0.12.6", + "opentelemetry", + "opentelemetry-proto", + "opentelemetry_sdk", + "prost", "thiserror", "tokio", "tonic 0.11.0", ] -[[package]] -name = "opentelemetry-proto" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045f8eea8c0fa19f7d48e7bc3128a39c2e5c533d5c61298c548dfefc1064474c" -dependencies = [ - "futures", - "futures-util", - "opentelemetry 0.19.0", - "prost 0.11.9", - "tonic 0.8.3", -] - [[package]] name = "opentelemetry-proto" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "984806e6cf27f2b49282e2a05e288f30594f3dbc74eb7a6e99422bc48ed78162" dependencies = [ - "opentelemetry 0.23.0", - "opentelemetry_sdk 0.23.0", - "prost 0.12.6", + "opentelemetry", + "opentelemetry_sdk", + "prost", "tonic 0.11.0", ] -[[package]] -name = "opentelemetry_api" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" -dependencies = [ - "fnv", - "futures-channel", - "futures-util", - "indexmap 1.9.3", - "once_cell", - "pin-project-lite", - "thiserror", - "urlencoding", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b3a2a91fdbfdd4d212c0dcc2ab540de2c2bcbbd90be17de7a7daf8822d010c1" -dependencies = [ - "async-trait", - "crossbeam-channel", - "dashmap", - "fnv", - "futures-channel", - "futures-executor", - "futures-util", - "once_cell", - "opentelemetry_api", - "percent-encoding", - "rand", - "thiserror", - "tokio", - "tokio-stream", -] - [[package]] name = "opentelemetry_sdk" version = "0.23.0" @@ -3941,7 +3857,7 @@ dependencies = [ "glob", "lazy_static", "once_cell", - "opentelemetry 0.23.0", + "opentelemetry", "ordered-float", "percent-encoding", "rand", @@ -4154,7 +4070,7 @@ dependencies = [ "clap", "color-eyre", "config", - "console-subscriber 0.2.0", + "console-subscriber", "dashmap", "diesel", "diesel-async", @@ -4165,15 +4081,15 @@ dependencies = [ "metrics", "metrics-exporter-prometheus", "mime", - "opentelemetry 0.23.0", - "opentelemetry-otlp 0.16.0", - "opentelemetry_sdk 0.23.0", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", "pin-project-lite", "refinery", - "reqwest 0.12.5", - "reqwest-middleware 0.3.2", - "reqwest-tracing 0.5.2", - "rustls 0.23.12", + "reqwest 0.12.7", + "reqwest-middleware", + "reqwest-tracing", + "rustls", "rustls-channel-resolver", "rustls-pemfile 2.1.2", "rusty-s3", @@ -4195,12 +4111,12 @@ dependencies = [ "tracing", "tracing-actix-web", "tracing-error", - "tracing-log 0.2.0", - "tracing-opentelemetry 0.24.0", + "tracing-log", + "tracing-opentelemetry", "tracing-subscriber", "url", "uuid", - "webpki-roots 0.26.3", + "webpki-roots", ] [[package]] @@ -4466,16 +4382,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "prost" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" -dependencies = [ - "bytes", - "prost-derive 0.11.9", -] - [[package]] name = "prost" version = "0.12.6" @@ -4483,30 +4389,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" dependencies = [ "bytes", - "prost-derive 0.12.6", -] - -[[package]] -name = "prost" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc" -dependencies = [ - "bytes", - "prost-derive 0.13.1", -] - -[[package]] -name = "prost-derive" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" -dependencies = [ - "anyhow", - "itertools 0.10.5", - "proc-macro2", - "quote", - "syn 1.0.109", + "prost-derive", ] [[package]] @@ -4522,35 +4405,13 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "prost-derive" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" -dependencies = [ - "anyhow", - "itertools 0.13.0", - "proc-macro2", - "quote", - "syn 2.0.72", -] - [[package]] name = "prost-types" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" dependencies = [ - "prost 0.12.6", -] - -[[package]] -name = "prost-types" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee5168b05f49d4b0ca581206eb14a7b22fafd963efe729ac48eb03266e25cc2" -dependencies = [ - "prost 0.13.1", + "prost", ] [[package]] @@ -4612,6 +4473,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc" +dependencies = [ + "encoding_rs", + "memchr", +] + [[package]] name = "quinn" version = "0.11.2" @@ -4623,7 +4494,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.12", + "rustls", "thiserror", "tokio", "tracing", @@ -4639,7 +4510,7 @@ dependencies = [ "rand", "ring", "rustc-hash", - "rustls 0.23.12", + "rustls", "slab", "thiserror", "tinyvec", @@ -4852,7 +4723,6 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "async-compression", "base64 0.21.7", "bytes", "encoding_rs", @@ -4862,18 +4732,15 @@ dependencies = [ "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", - "hyper-rustls 0.24.2", "hyper-tls", "ipnet", "js-sys", "log", "mime", - "mime_guess", "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.12", "rustls-pemfile 1.0.4", "serde", "serde_json", @@ -4882,33 +4749,31 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls 0.24.1", - "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", "web-sys", - "webpki-roots 0.25.4", - "winreg 0.50.0", + "winreg", ] [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ + "async-compression", "base64 0.22.1", "bytes", + "futures-channel", "futures-core", "futures-util", "http 1.1.0", "http-body 1.0.1", "http-body-util", "hyper 1.4.1", - "hyper-rustls 0.27.2", + "hyper-rustls", "hyper-util", "ipnet", "js-sys", @@ -4918,7 +4783,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.12", + "rustls", "rustls-pemfile 2.1.2", "rustls-pki-types", "serde", @@ -4926,7 +4791,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper 1.0.1", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls", "tokio-util", "tower-service", "url", @@ -4934,35 +4799,20 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.3", - "winreg 0.52.0", + "webpki-roots", + "windows-registry", ] [[package]] name = "reqwest-middleware" -version = "0.2.5" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" -dependencies = [ - "anyhow", - "async-trait", - "http 0.2.12", - "reqwest 0.11.27", - "serde", - "task-local-extensions", - "thiserror", -] - -[[package]] -name = "reqwest-middleware" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39346a33ddfe6be00cbc17a34ce996818b97b230b87229f10114693becca1268" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" dependencies = [ "anyhow", "async-trait", "http 1.1.0", - "reqwest 0.12.5", + "reqwest 0.12.7", "serde", "thiserror", "tower-service", @@ -4970,35 +4820,17 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.4.8" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190838e54153d7a7e2ea98851304b3ce92daeabf14c54d32b01b84a3e636f683" -dependencies = [ - "anyhow", - "async-trait", - "getrandom", - "matchit 0.7.3", - "opentelemetry 0.16.0", - "reqwest 0.11.27", - "reqwest-middleware 0.2.5", - "task-local-extensions", - "tracing", - "tracing-opentelemetry 0.16.0", -] - -[[package]] -name = "reqwest-tracing" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e45dcad05dc210fdb0278d62a679eb768730af808f8cb552f810da89bdbe76d" +checksum = "bfdd9bfa64c72233d8dd99ab7883efcdefe9e16d46488ecb9228b71a2e2ceb45" dependencies = [ "anyhow", "async-trait", "getrandom", "http 1.1.0", "matchit 0.8.4", - "reqwest 0.12.5", - "reqwest-middleware 0.3.2", + "reqwest 0.12.7", + "reqwest-middleware", "tracing", ] @@ -5086,14 +4918,14 @@ dependencies = [ [[package]] name = "rss" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f374fd66bb795938b78c021db1662d43a8ffbc42ec1ac25429fc4833b732751" +checksum = "27e92048f840d98c6d6dd870af9101610ea9ff413f11f1bcebf4f4c31d96d957" dependencies = [ "atom_syndication", "derive_builder", "never", - "quick-xml 0.31.0", + "quick-xml 0.36.1", ] [[package]] @@ -5130,18 +4962,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.12" @@ -5153,7 +4973,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.6", + "rustls-webpki", "subtle", "zeroize", ] @@ -5165,7 +4985,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fede2a247359da6b4998f7723ec6468c2d6a577a5d8c17e54f21806426ad2290" dependencies = [ "nanorand", - "rustls 0.23.12", + "rustls", ] [[package]] @@ -5193,16 +5013,6 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted 0.9.0", -] - [[package]] name = "rustls-webpki" version = "0.102.6" @@ -5289,16 +5099,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted 0.9.0", -] - [[package]] name = "sdd" version = "2.1.0" @@ -5642,6 +5442,12 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "stacker" version = "0.1.15" @@ -5787,6 +5593,20 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] [[package]] name = "syntect" @@ -5837,15 +5657,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" -[[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 = "tempfile" version = "3.10.1" @@ -5972,6 +5783,16 @@ version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ab95735ea2c8fd51154d01e39cf13912a78071c2d89abc49a7ef102a7dd725a" +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -6091,10 +5912,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8e98c31c29b2666fb28720739e11476166be4ead1610a37dcd7414bb124413a" dependencies = [ "aws-lc-rs", - "rustls 0.23.12", + "rustls", "tokio", "tokio-postgres", - "tokio-rustls 0.26.0", + "tokio-rustls", "x509-cert", ] @@ -6105,30 +5926,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04fb792ccd6bbcd4bba408eb8a292f70fc4a3589e5d793626f45190e6454b6ab" dependencies = [ "ring", - "rustls 0.23.12", + "rustls", "tokio", "tokio-postgres", - "tokio-rustls 0.26.0", + "tokio-rustls", "x509-certificate", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.12", + "rustls", "rustls-pki-types", "tokio", ] @@ -6146,9 +5957,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -6216,38 +6027,6 @@ dependencies = [ "winnow 0.6.18", ] -[[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 0.6.20", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-timeout 0.4.1", - "percent-encoding", - "pin-project", - "prost 0.11.9", - "prost-derive 0.11.9", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - [[package]] name = "tonic" version = "0.10.2" @@ -6256,17 +6035,17 @@ checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" dependencies = [ "async-stream", "async-trait", - "axum 0.6.20", + "axum", "base64 0.21.7", "bytes", "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", - "hyper-timeout 0.4.1", + "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.6", + "prost", "tokio", "tokio-stream", "tower", @@ -6283,47 +6062,17 @@ checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" dependencies = [ "async-stream", "async-trait", - "axum 0.6.20", + "axum", "base64 0.21.7", "bytes", "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "hyper 0.14.30", - "hyper-timeout 0.4.1", + "hyper-timeout", "percent-encoding", "pin-project", - "prost 0.12.6", - "tokio", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38659f4a91aba8598d27821589f5db7dddd94601e7a01b1e485a50e5484c7401" -dependencies = [ - "async-stream", - "async-trait", - "axum 0.7.5", - "base64 0.22.1", - "bytes", - "h2 0.4.5", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.4.1", - "hyper-timeout 0.5.1", - "hyper-util", - "percent-encoding", - "pin-project", - "prost 0.13.1", - "socket2", + "prost", "tokio", "tokio-stream", "tower", @@ -6400,10 +6149,10 @@ checksum = "4ee9e39a66d9b615644893ffc1704d2a89b5b315b7fd0228ad3182ca9a306b19" dependencies = [ "actix-web", "mutually_exclusive_features", - "opentelemetry 0.23.0", + "opentelemetry", "pin-project", "tracing", - "tracing-opentelemetry 0.24.0", + "tracing-opentelemetry", "uuid", ] @@ -6438,27 +6187,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "tracing-log" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - [[package]] name = "tracing-log" version = "0.2.0" @@ -6470,33 +6198,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-opentelemetry" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ffbf13a0f8b054a4e59df3a173b818e9c6177c02789871f2073977fd0062076" -dependencies = [ - "opentelemetry 0.16.0", - "tracing", - "tracing-core", - "tracing-log 0.1.4", - "tracing-subscriber", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00a39dcf9bfc1742fa4d6215253b33a6e474be78275884c216fc2a06267b3600" -dependencies = [ - "once_cell", - "opentelemetry 0.19.0", - "tracing", - "tracing-core", - "tracing-log 0.1.4", - "tracing-subscriber", -] - [[package]] name = "tracing-opentelemetry" version = "0.24.0" @@ -6505,12 +6206,12 @@ checksum = "f68803492bf28ab40aeccaecc7021096bd256baf7ca77c3d425d89b35a7be4e4" dependencies = [ "js-sys", "once_cell", - "opentelemetry 0.23.0", - "opentelemetry_sdk 0.23.0", + "opentelemetry", + "opentelemetry_sdk", "smallvec", "tracing", "tracing-core", - "tracing-log 0.2.0", + "tracing-log", "tracing-subscriber", "web-time", ] @@ -6542,7 +6243,7 @@ dependencies = [ "thread_local", "tracing", "tracing-core", - "tracing-log 0.2.0", + "tracing-log", "tracing-serde", ] @@ -6629,15 +6330,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -6719,12 +6411,24 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -6917,12 +6621,6 @@ dependencies = [ "url", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - [[package]] name = "webpki-roots" version = "0.26.3" @@ -6995,6 +6693,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -7163,14 +6891,16 @@ dependencies = [ ] [[package]] -name = "winreg" -version = "0.52.0" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "x509-cert" @@ -7246,6 +6976,30 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.6.6" @@ -7287,6 +7041,27 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -7307,6 +7082,28 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "zstd" version = "0.13.2" diff --git a/Cargo.toml b/Cargo.toml index 5c74e7cad..58ea0a2dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,15 +37,6 @@ debug = 0 [features] embed-pictrs = ["pict-rs"] -# This feature requires building with `tokio_unstable` flag, see documentation: -# https://docs.rs/tokio/latest/tokio/#unstable-features -console = [ - "console-subscriber", - "opentelemetry", - "opentelemetry-otlp", - "tracing-opentelemetry", - "reqwest-tracing/opentelemetry_0_16", -] json-log = ["tracing-subscriber/json"] default = [] @@ -100,7 +91,7 @@ lemmy_db_views = { version = "=0.19.6-beta.7", path = "./crates/db_views" } lemmy_db_views_actor = { version = "=0.19.6-beta.7", path = "./crates/db_views_actor" } lemmy_db_views_moderator = { version = "=0.19.6-beta.7", path = "./crates/db_views_moderator" } lemmy_federate = { version = "=0.19.6-beta.7", path = "./crates/federate" } -activitypub_federation = { git = "https://github.com/LemmyNet/activitypub-federation-rust.git", branch = "nested-comments-stack-overflow", default-features = false, features = [ +activitypub_federation = { version = "0.6.0-alpha2", default-features = false, features = [ "actix-web", ] } diesel = "2.1.6" @@ -108,7 +99,7 @@ diesel_migrations = "2.1.0" diesel-async = "0.4.1" serde = { version = "1.0.204", features = ["derive"] } serde_with = "3.9.0" -actix-web = { version = "4.8.0", default-features = false, features = [ +actix-web = { version = "4.9.0", default-features = false, features = [ "macros", "rustls-0_23", "compress-brotli", @@ -117,19 +108,17 @@ actix-web = { version = "4.8.0", default-features = false, features = [ "cookies", ] } tracing = "0.1.40" -tracing-actix-web = { version = "0.7.11", default-features = false } -tracing-error = "0.2.0" -tracing-log = "0.2.0" +tracing-actix-web = { version = "0.7.10", default-features = false } tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } url = { version = "2.5.2", features = ["serde"] } -reqwest = { version = "0.11.27", default-features = false, features = [ +reqwest = { version = "0.12.7", default-features = false, features = [ "json", "blocking", "gzip", "rustls-tls", ] } -reqwest-middleware = "0.2.5" -reqwest-tracing = "0.4.8" +reqwest-middleware = "0.3.3" +reqwest-tracing = "0.5.3" clokwerk = "0.4.0" doku = { version = "0.21.1", features = ["url-2"] } bcrypt = "0.15.1" @@ -152,10 +141,8 @@ diesel-derive-enum = { version = "2.1.0", features = ["postgres"] } strum = { version = "0.26.3", features = ["derive"] } itertools = "0.13.0" futures = "0.3.30" -http = "0.2.12" +http = "1.1" rosetta-i18n = "0.1.3" -opentelemetry = { version = "0.19.0", features = ["rt-tokio"] } -tracing-opentelemetry = { version = "0.19.0" } ts-rs = { version = "7.1.1", features = [ "serde-compat", "chrono-impl", @@ -188,8 +175,6 @@ diesel-async = { workspace = true } actix-web = { workspace = true } tracing = { workspace = true } tracing-actix-web = { workspace = true } -tracing-error = { workspace = true } -tracing-log = { workspace = true } tracing-subscriber = { workspace = true } url = { workspace = true } reqwest = { workspace = true } @@ -197,10 +182,6 @@ reqwest-middleware = { workspace = true } reqwest-tracing = { workspace = true } clokwerk = { workspace = true } serde_json = { workspace = true } -tracing-opentelemetry = { workspace = true, optional = true } -opentelemetry = { workspace = true, optional = true } -console-subscriber = { version = "0.4.0", optional = true } -opentelemetry-otlp = { version = "0.12.0", optional = true } pict-rs = { version = "0.5.16", optional = true } rustls = { workspace = true } tokio.workspace = true diff --git a/crates/api/src/local_user/list_logins.rs b/crates/api/src/local_user/list_logins.rs index 013236dcd..b5aaf8972 100644 --- a/crates/api/src/local_user/list_logins.rs +++ b/crates/api/src/local_user/list_logins.rs @@ -1,5 +1,5 @@ use actix_web::web::{Data, Json}; -use lemmy_api_common::context::LemmyContext; +use lemmy_api_common::{context::LemmyContext, person::ListLoginsResponse}; use lemmy_db_schema::source::login_token::LoginToken; use lemmy_db_views::structs::LocalUserView; use lemmy_utils::error::LemmyResult; @@ -7,8 +7,8 @@ use lemmy_utils::error::LemmyResult; pub async fn list_logins( context: Data, local_user_view: LocalUserView, -) -> LemmyResult>> { +) -> LemmyResult> { let logins = LoginToken::list(&mut context.pool(), local_user_view.local_user.id).await?; - Ok(Json(logins)) + Ok(Json(ListLoginsResponse { logins })) } diff --git a/crates/api/src/local_user/save_settings.rs b/crates/api/src/local_user/save_settings.rs index 193f9d269..13bdd3646 100644 --- a/crates/api/src/local_user/save_settings.rs +++ b/crates/api/src/local_user/save_settings.rs @@ -135,7 +135,6 @@ pub async fn save_user_settings( blur_nsfw: data.blur_nsfw, auto_expand: data.auto_expand, show_bot_accounts: data.show_bot_accounts, - show_scores: data.show_scores, default_sort_type, default_listing_type, theme: data.theme.clone(), diff --git a/crates/api_common/src/person.rs b/crates/api_common/src/person.rs index f61f784c2..29e9ef084 100644 --- a/crates/api_common/src/person.rs +++ b/crates/api_common/src/person.rs @@ -1,7 +1,7 @@ use lemmy_db_schema::{ newtypes::{CommentReplyId, CommunityId, LanguageId, PersonId, PersonMentionId}, sensitive::SensitiveString, - source::site::Site, + source::{login_token::LoginToken, site::Site}, CommentSortType, ListingType, PostListingMode, @@ -441,3 +441,10 @@ pub struct ListMedia { pub struct ListMediaResponse { pub images: Vec, } + +#[derive(Debug, Serialize, Deserialize, Clone)] +#[cfg_attr(feature = "full", derive(TS))] +#[cfg_attr(feature = "full", ts(export))] +pub struct ListLoginsResponse { + pub logins: Vec, +} diff --git a/crates/api_common/src/site.rs b/crates/api_common/src/site.rs index 3850de1c6..5311eca9c 100644 --- a/crates/api_common/src/site.rs +++ b/crates/api_common/src/site.rs @@ -11,10 +11,12 @@ use lemmy_db_schema::{ RegistrationApplicationId, }, source::{ + community::Community, federation_queue_state::FederationQueueState, instance::Instance, language::Language, local_site_url_blocklist::LocalSiteUrlBlocklist, + person::Person, tagline::Tagline, }, ListingType, @@ -33,12 +35,9 @@ use lemmy_db_views::structs::{ SiteView, }; use lemmy_db_views_actor::structs::{ - CommunityBlockView, CommunityFollowerView, CommunityModeratorView, CommunityView, - InstanceBlockView, - PersonBlockView, PersonView, }; use lemmy_db_views_moderator::structs::{ @@ -337,9 +336,9 @@ pub struct MyUserInfo { pub local_user_view: LocalUserView, pub follows: Vec, pub moderates: Vec, - pub community_blocks: Vec, - pub instance_blocks: Vec, - pub person_blocks: Vec, + pub community_blocks: Vec, + pub instance_blocks: Vec, + pub person_blocks: Vec, pub discussion_languages: Vec, } diff --git a/crates/api_crud/src/site/read.rs b/crates/api_crud/src/site/read.rs index c633bebde..d2a13ac5e 100644 --- a/crates/api_crud/src/site/read.rs +++ b/crates/api_crud/src/site/read.rs @@ -5,19 +5,15 @@ use lemmy_api_common::{ }; use lemmy_db_schema::source::{ actor_language::{LocalUserLanguage, SiteLanguage}, + community_block::CommunityBlock, + instance_block::InstanceBlock, language::Language, local_site_url_blocklist::LocalSiteUrlBlocklist, + person_block::PersonBlock, tagline::Tagline, }; use lemmy_db_views::structs::{CustomEmojiView, LocalUserView, SiteView}; -use lemmy_db_views_actor::structs::{ - CommunityBlockView, - CommunityFollowerView, - CommunityModeratorView, - InstanceBlockView, - PersonBlockView, - PersonView, -}; +use lemmy_db_views_actor::structs::{CommunityFollowerView, CommunityModeratorView, PersonView}; use lemmy_utils::{ error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult}, CACHE_DURATION_API, @@ -81,9 +77,9 @@ pub async fn get_site( discussion_languages, ) = lemmy_db_schema::try_join_with_pool!(pool => ( |pool| CommunityFollowerView::for_person(pool, person_id), - |pool| CommunityBlockView::for_person(pool, person_id), - |pool| InstanceBlockView::for_person(pool, person_id), - |pool| PersonBlockView::for_person(pool, person_id), + |pool| CommunityBlock::for_person(pool, person_id), + |pool| InstanceBlock::for_person(pool, person_id), + |pool| PersonBlock::for_person(pool, person_id), |pool| CommunityModeratorView::for_person(pool, person_id, Some(&local_user_view.local_user)), |pool| LocalUserLanguage::read(pool, local_user_id) )) diff --git a/crates/apub/assets/lemmy/activities/block/block_user.json b/crates/apub/assets/lemmy/activities/block/block_user.json index a07d3786c..f6d6170c3 100644 --- a/crates/apub/assets/lemmy/activities/block/block_user.json +++ b/crates/apub/assets/lemmy/activities/block/block_user.json @@ -8,6 +8,6 @@ "type": "Block", "removeData": true, "summary": "spam post", - "expires": "2021-11-01T12:23:50.151874Z", + "endTime": "2021-11-01T12:23:50.151874Z", "id": "http://enterprise.lemmy.ml/activities/block/5d42fffb-0903-4625-86d4-0b39bb344fc2" } diff --git a/crates/apub/assets/lemmy/activities/block/undo_block_user.json b/crates/apub/assets/lemmy/activities/block/undo_block_user.json index 5dadc0781..922b5e777 100644 --- a/crates/apub/assets/lemmy/activities/block/undo_block_user.json +++ b/crates/apub/assets/lemmy/activities/block/undo_block_user.json @@ -11,7 +11,7 @@ "type": "Block", "removeData": true, "summary": "spam post", - "expires": "2021-11-01T12:23:50.151874Z", + "endTime": "2021-11-01T12:23:50.151874Z", "id": "http://enterprise.lemmy.ml/activities/block/726f43ab-bd0e-4ab3-89c8-627e976f553c" }, "cc": ["http://enterprise.lemmy.ml/c/main"], diff --git a/crates/apub/src/activities/block/block_user.rs b/crates/apub/src/activities/block/block_user.rs index 48408c4fb..e6c97c424 100644 --- a/crates/apub/src/activities/block/block_user.rs +++ b/crates/apub/src/activities/block/block_user.rs @@ -74,7 +74,6 @@ impl BlockUser { &context.settings().get_protocol_and_hostname(), )?, audience, - expires, end_time: expires, }) } @@ -157,7 +156,7 @@ impl ActivityHandler for BlockUser { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> LemmyResult<()> { insert_received_activity(&self.id, context).await?; - let expires = self.expires.or(self.end_time).map(Into::into); + let expires = self.end_time.map(Into::into); let mod_person = self.actor.dereference(context).await?; let blocked_person = self.object.dereference(context).await?; let target = self.target.dereference(context).await?; diff --git a/crates/apub/src/activities/block/undo_block_user.rs b/crates/apub/src/activities/block/undo_block_user.rs index b92320b2d..69f3eeebf 100644 --- a/crates/apub/src/activities/block/undo_block_user.rs +++ b/crates/apub/src/activities/block/undo_block_user.rs @@ -98,7 +98,7 @@ impl ActivityHandler for UndoBlockUser { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> LemmyResult<()> { insert_received_activity(&self.id, context).await?; - let expires = self.object.expires.or(self.object.end_time).map(Into::into); + let expires = self.object.end_time.map(Into::into); let mod_person = self.actor.dereference(context).await?; let blocked_person = self.object.object.dereference(context).await?; match self.object.target.dereference(context).await? { diff --git a/crates/apub/src/api/resolve_object.rs b/crates/apub/src/api/resolve_object.rs index 3f2591241..4c592aeeb 100644 --- a/crates/apub/src/api/resolve_object.rs +++ b/crates/apub/src/api/resolve_object.rs @@ -27,7 +27,7 @@ pub async fn resolve_object( // if there's no personId then the JWT was missing or invalid. let is_authenticated = local_user_view.is_some(); - let res = if is_authenticated { + let res = if is_authenticated || cfg!(debug_assertions) { // user is fully authenticated; allow remote lookups as well. search_query_to_object_id(data.q.clone(), &context).await } else { diff --git a/crates/apub/src/api/user_settings_backup.rs b/crates/apub/src/api/user_settings_backup.rs index a0879b3c9..fdf8dc2ad 100644 --- a/crates/apub/src/api/user_settings_backup.rs +++ b/crates/apub/src/api/user_settings_backup.rs @@ -122,7 +122,6 @@ pub async fn import_settings( .settings .as_ref() .map(|s| s.send_notifications_to_email), - show_scores: data.settings.as_ref().map(|s| s.show_scores), show_bot_accounts: data.settings.as_ref().map(|s| s.show_bot_accounts), show_read_posts: data.settings.as_ref().map(|s| s.show_read_posts), open_links_in_new_tab: data.settings.as_ref().map(|s| s.open_links_in_new_tab), diff --git a/crates/apub/src/http/mod.rs b/crates/apub/src/http/mod.rs index 6303dd1b0..a01afe676 100644 --- a/crates/apub/src/http/mod.rs +++ b/crates/apub/src/http/mod.rs @@ -11,7 +11,6 @@ use activitypub_federation::{ FEDERATION_CONTENT_TYPE, }; use actix_web::{web, web::Bytes, HttpRequest, HttpResponse}; -use http::{header::LOCATION, StatusCode}; use lemmy_api_common::context::LemmyContext; use lemmy_db_schema::{ newtypes::DbUrl, @@ -76,14 +75,14 @@ fn create_apub_tombstone_response>(id: T) -> LemmyResult HttpResponse { let mut res = HttpResponse::PermanentRedirect(); - res.insert_header((LOCATION, url.as_str())); + res.insert_header((actix_web::http::header::LOCATION, url.as_str())); res.finish() } diff --git a/crates/apub/src/protocol/activities/block/block_user.rs b/crates/apub/src/protocol/activities/block/block_user.rs index c1a4c64c7..96135d645 100644 --- a/crates/apub/src/protocol/activities/block/block_user.rs +++ b/crates/apub/src/protocol/activities/block/block_user.rs @@ -38,8 +38,6 @@ pub struct BlockUser { pub(crate) remove_data: Option, /// block reason, written to mod log pub(crate) summary: Option, - /// TODO: deprecated - pub(crate) expires: Option>, pub(crate) end_time: Option>, } diff --git a/crates/db_schema/src/impls/community_block.rs b/crates/db_schema/src/impls/community_block.rs index 1393f49d3..944a53ae3 100644 --- a/crates/db_schema/src/impls/community_block.rs +++ b/crates/db_schema/src/impls/community_block.rs @@ -1,7 +1,10 @@ use crate::{ newtypes::{CommunityId, PersonId}, - schema::community_block::dsl::{community_block, community_id, person_id}, - source::community_block::{CommunityBlock, CommunityBlockForm}, + schema::{community, community_block}, + source::{ + community::Community, + community_block::{CommunityBlock, CommunityBlockForm}, + }, traits::Blockable, utils::{get_conn, DbPool}, }; @@ -9,6 +12,7 @@ use diesel::{ dsl::{exists, insert_into}, result::Error, select, + ExpressionMethods, QueryDsl, }; use diesel_async::RunQueryDsl; @@ -21,11 +25,27 @@ impl CommunityBlock { ) -> Result { let conn = &mut get_conn(pool).await?; select(exists( - community_block.find((for_person_id, for_community_id)), + community_block::table.find((for_person_id, for_community_id)), )) .get_result(conn) .await } + + pub async fn for_person( + pool: &mut DbPool<'_>, + person_id: PersonId, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + community_block::table + .inner_join(community::table) + .select(community::all_columns) + .filter(community_block::person_id.eq(person_id)) + .filter(community::deleted.eq(false)) + .filter(community::removed.eq(false)) + .order_by(community_block::published) + .load::(conn) + .await + } } #[async_trait] @@ -33,9 +53,9 @@ impl Blockable for CommunityBlock { type Form = CommunityBlockForm; async fn block(pool: &mut DbPool<'_>, community_block_form: &Self::Form) -> Result { let conn = &mut get_conn(pool).await?; - insert_into(community_block) + insert_into(community_block::table) .values(community_block_form) - .on_conflict((person_id, community_id)) + .on_conflict((community_block::person_id, community_block::community_id)) .do_update() .set(community_block_form) .get_result::(conn) @@ -46,7 +66,7 @@ impl Blockable for CommunityBlock { community_block_form: &Self::Form, ) -> Result { let conn = &mut get_conn(pool).await?; - diesel::delete(community_block.find(( + diesel::delete(community_block::table.find(( community_block_form.person_id, community_block_form.community_id, ))) diff --git a/crates/db_schema/src/impls/instance_block.rs b/crates/db_schema/src/impls/instance_block.rs index e32688411..15fcd1443 100644 --- a/crates/db_schema/src/impls/instance_block.rs +++ b/crates/db_schema/src/impls/instance_block.rs @@ -1,7 +1,10 @@ use crate::{ newtypes::{InstanceId, PersonId}, - schema::instance_block::dsl::{instance_block, instance_id, person_id}, - source::instance_block::{InstanceBlock, InstanceBlockForm}, + schema::{instance, instance_block}, + source::{ + instance::Instance, + instance_block::{InstanceBlock, InstanceBlockForm}, + }, traits::Blockable, utils::{get_conn, DbPool}, }; @@ -9,6 +12,7 @@ use diesel::{ dsl::{exists, insert_into}, result::Error, select, + ExpressionMethods, QueryDsl, }; use diesel_async::RunQueryDsl; @@ -21,11 +25,25 @@ impl InstanceBlock { ) -> Result { let conn = &mut get_conn(pool).await?; select(exists( - instance_block.find((for_person_id, for_instance_id)), + instance_block::table.find((for_person_id, for_instance_id)), )) .get_result(conn) .await } + + pub async fn for_person( + pool: &mut DbPool<'_>, + person_id: PersonId, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + instance_block::table + .inner_join(instance::table) + .select(instance::all_columns) + .filter(instance_block::person_id.eq(person_id)) + .order_by(instance_block::published) + .load::(conn) + .await + } } #[async_trait] @@ -33,9 +51,9 @@ impl Blockable for InstanceBlock { type Form = InstanceBlockForm; async fn block(pool: &mut DbPool<'_>, instance_block_form: &Self::Form) -> Result { let conn = &mut get_conn(pool).await?; - insert_into(instance_block) + insert_into(instance_block::table) .values(instance_block_form) - .on_conflict((person_id, instance_id)) + .on_conflict((instance_block::person_id, instance_block::instance_id)) .do_update() .set(instance_block_form) .get_result::(conn) @@ -46,7 +64,7 @@ impl Blockable for InstanceBlock { instance_block_form: &Self::Form, ) -> Result { let conn = &mut get_conn(pool).await?; - diesel::delete(instance_block.find(( + diesel::delete(instance_block::table.find(( instance_block_form.person_id, instance_block_form.instance_id, ))) diff --git a/crates/db_schema/src/impls/person_block.rs b/crates/db_schema/src/impls/person_block.rs index 0dbf003d8..cfd41f6d6 100644 --- a/crates/db_schema/src/impls/person_block.rs +++ b/crates/db_schema/src/impls/person_block.rs @@ -1,7 +1,10 @@ use crate::{ newtypes::PersonId, - schema::person_block::dsl::{person_block, person_id, target_id}, - source::person_block::{PersonBlock, PersonBlockForm}, + schema::{person, person_block}, + source::{ + person::Person, + person_block::{PersonBlock, PersonBlockForm}, + }, traits::Blockable, utils::{get_conn, DbPool}, }; @@ -9,6 +12,8 @@ use diesel::{ dsl::{exists, insert_into}, result::Error, select, + ExpressionMethods, + JoinOnDsl, QueryDsl, }; use diesel_async::RunQueryDsl; @@ -20,8 +25,30 @@ impl PersonBlock { for_recipient_id: PersonId, ) -> Result { let conn = &mut get_conn(pool).await?; - select(exists(person_block.find((for_person_id, for_recipient_id)))) - .get_result(conn) + select(exists( + person_block::table.find((for_person_id, for_recipient_id)), + )) + .get_result(conn) + .await + } + + pub async fn for_person( + pool: &mut DbPool<'_>, + person_id: PersonId, + ) -> Result, Error> { + let conn = &mut get_conn(pool).await?; + let target_person_alias = diesel::alias!(person as person1); + + person_block::table + .inner_join(person::table.on(person_block::person_id.eq(person::id))) + .inner_join( + target_person_alias.on(person_block::target_id.eq(target_person_alias.field(person::id))), + ) + .select(target_person_alias.fields(person::all_columns)) + .filter(person_block::person_id.eq(person_id)) + .filter(target_person_alias.field(person::deleted).eq(false)) + .order_by(person_block::published) + .load::(conn) .await } } @@ -34,9 +61,9 @@ impl Blockable for PersonBlock { person_block_form: &PersonBlockForm, ) -> Result { let conn = &mut get_conn(pool).await?; - insert_into(person_block) + insert_into(person_block::table) .values(person_block_form) - .on_conflict((person_id, target_id)) + .on_conflict((person_block::person_id, person_block::target_id)) .do_update() .set(person_block_form) .get_result::(conn) @@ -44,8 +71,10 @@ impl Blockable for PersonBlock { } async fn unblock(pool: &mut DbPool<'_>, person_block_form: &Self::Form) -> Result { let conn = &mut get_conn(pool).await?; - diesel::delete(person_block.find((person_block_form.person_id, person_block_form.target_id))) - .execute(conn) - .await + diesel::delete( + person_block::table.find((person_block_form.person_id, person_block_form.target_id)), + ) + .execute(conn) + .await } } diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index fc418ec28..c78acfe37 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -446,7 +446,6 @@ diesel::table! { interface_language -> Varchar, show_avatars -> Bool, send_notifications_to_email -> Bool, - show_scores -> Bool, show_bot_accounts -> Bool, show_read_posts -> Bool, email_verified -> Bool, diff --git a/crates/db_schema/src/schema_setup.rs b/crates/db_schema/src/schema_setup.rs index 3def94060..fb4affa91 100644 --- a/crates/db_schema/src/schema_setup.rs +++ b/crates/db_schema/src/schema_setup.rs @@ -2,7 +2,6 @@ use anyhow::Context; use diesel::{connection::SimpleConnection, Connection, PgConnection}; use diesel_migrations::{EmbeddedMigrations, MigrationHarness}; use lemmy_utils::error::LemmyError; -use tracing::info; const MIGRATIONS: EmbeddedMigrations = embed_migrations!(); @@ -34,7 +33,7 @@ pub fn run(db_url: &str) -> Result<(), LemmyError> { // transaction as `REPLACEABLE_SCHEMA`. This code will be becone less hacky when the conditional // setup of things in `REPLACEABLE_SCHEMA` is done without using the number of pending // migrations. - info!("Running Database migrations (This may take a long time)..."); + println!("Running Database migrations (This may take a long time)..."); let migrations = conn .pending_migrations(MIGRATIONS) .map_err(|e| anyhow::anyhow!("Couldn't determine pending migrations: {e}"))?; @@ -60,7 +59,7 @@ pub fn run(db_url: &str) -> Result<(), LemmyError> { Ok(()) })?; - info!("Database migrations complete."); + println!("Database migrations complete."); Ok(()) } diff --git a/crates/db_schema/src/source/local_user.rs b/crates/db_schema/src/source/local_user.rs index c7a5b5224..89bdb1b55 100644 --- a/crates/db_schema/src/source/local_user.rs +++ b/crates/db_schema/src/source/local_user.rs @@ -35,9 +35,6 @@ pub struct LocalUser { /// Whether to show avatars. pub show_avatars: bool, pub send_notifications_to_email: bool, - /// Whether to show comment / post scores. - // TODO now that there is a vote_display_mode, this can be gotten rid of in future releases. - pub show_scores: bool, /// Whether to show bot accounts. pub show_bot_accounts: bool, /// Whether to show read posts. @@ -93,8 +90,6 @@ pub struct LocalUserInsertForm { #[new(default)] pub show_bot_accounts: Option, #[new(default)] - pub show_scores: Option, - #[new(default)] pub show_read_posts: Option, #[new(default)] pub email_verified: Option, @@ -138,7 +133,6 @@ pub struct LocalUserUpdateForm { pub show_avatars: Option, pub send_notifications_to_email: Option, pub show_bot_accounts: Option, - pub show_scores: Option, pub show_read_posts: Option, pub email_verified: Option, pub accepted_application: Option, diff --git a/crates/db_schema/src/source/local_user_vote_display_mode.rs b/crates/db_schema/src/source/local_user_vote_display_mode.rs index 314d99e4a..8c6ad95eb 100644 --- a/crates/db_schema/src/source/local_user_vote_display_mode.rs +++ b/crates/db_schema/src/source/local_user_vote_display_mode.rs @@ -20,6 +20,7 @@ use typed_builder::TypedBuilder; #[cfg_attr(feature = "full", ts(export))] /// The vote display settings for your user. pub struct LocalUserVoteDisplayMode { + #[serde(skip)] pub local_user_id: LocalUserId, pub score: bool, pub upvotes: bool, diff --git a/crates/db_views/src/registration_application_view.rs b/crates/db_views/src/registration_application_view.rs index 54c7f7598..6f806be13 100644 --- a/crates/db_views/src/registration_application_view.rs +++ b/crates/db_views/src/registration_application_view.rs @@ -252,7 +252,6 @@ mod tests { show_avatars: inserted_sara_local_user.show_avatars, send_notifications_to_email: inserted_sara_local_user.send_notifications_to_email, show_bot_accounts: inserted_sara_local_user.show_bot_accounts, - show_scores: inserted_sara_local_user.show_scores, show_read_posts: inserted_sara_local_user.show_read_posts, email_verified: inserted_sara_local_user.email_verified, accepted_application: inserted_sara_local_user.accepted_application, diff --git a/crates/db_views_actor/src/community_block_view.rs b/crates/db_views_actor/src/community_block_view.rs deleted file mode 100644 index c7d3d1836..000000000 --- a/crates/db_views_actor/src/community_block_view.rs +++ /dev/null @@ -1,24 +0,0 @@ -use crate::structs::CommunityBlockView; -use diesel::{result::Error, ExpressionMethods, QueryDsl}; -use diesel_async::RunQueryDsl; -use lemmy_db_schema::{ - newtypes::PersonId, - schema::{community, community_block, person}, - utils::{get_conn, DbPool}, -}; - -impl CommunityBlockView { - pub async fn for_person(pool: &mut DbPool<'_>, person_id: PersonId) -> Result, Error> { - let conn = &mut get_conn(pool).await?; - community_block::table - .inner_join(person::table) - .inner_join(community::table) - .select((person::all_columns, community::all_columns)) - .filter(community_block::person_id.eq(person_id)) - .filter(community::deleted.eq(false)) - .filter(community::removed.eq(false)) - .order_by(community_block::published) - .load::(conn) - .await - } -} diff --git a/crates/db_views_actor/src/instance_block_view.rs b/crates/db_views_actor/src/instance_block_view.rs deleted file mode 100644 index 05820862a..000000000 --- a/crates/db_views_actor/src/instance_block_view.rs +++ /dev/null @@ -1,27 +0,0 @@ -use crate::structs::InstanceBlockView; -use diesel::{result::Error, ExpressionMethods, JoinOnDsl, NullableExpressionMethods, QueryDsl}; -use diesel_async::RunQueryDsl; -use lemmy_db_schema::{ - newtypes::PersonId, - schema::{instance, instance_block, person, site}, - utils::{get_conn, DbPool}, -}; - -impl InstanceBlockView { - pub async fn for_person(pool: &mut DbPool<'_>, person_id: PersonId) -> Result, Error> { - let conn = &mut get_conn(pool).await?; - instance_block::table - .inner_join(person::table) - .inner_join(instance::table) - .left_join(site::table.on(site::instance_id.eq(instance::id))) - .select(( - person::all_columns, - instance::all_columns, - site::all_columns.nullable(), - )) - .filter(instance_block::person_id.eq(person_id)) - .order_by(instance_block::published) - .load::(conn) - .await - } -} diff --git a/crates/db_views_actor/src/lib.rs b/crates/db_views_actor/src/lib.rs index e9f8e4189..2ec9652e3 100644 --- a/crates/db_views_actor/src/lib.rs +++ b/crates/db_views_actor/src/lib.rs @@ -1,8 +1,6 @@ #[cfg(feature = "full")] pub mod comment_reply_view; #[cfg(feature = "full")] -pub mod community_block_view; -#[cfg(feature = "full")] pub mod community_follower_view; #[cfg(feature = "full")] pub mod community_moderator_view; @@ -11,10 +9,6 @@ pub mod community_person_ban_view; #[cfg(feature = "full")] pub mod community_view; #[cfg(feature = "full")] -pub mod instance_block_view; -#[cfg(feature = "full")] -pub mod person_block_view; -#[cfg(feature = "full")] pub mod person_mention_view; #[cfg(feature = "full")] pub mod person_view; diff --git a/crates/db_views_actor/src/person_block_view.rs b/crates/db_views_actor/src/person_block_view.rs deleted file mode 100644 index 5f028acd8..000000000 --- a/crates/db_views_actor/src/person_block_view.rs +++ /dev/null @@ -1,30 +0,0 @@ -use crate::structs::PersonBlockView; -use diesel::{result::Error, ExpressionMethods, JoinOnDsl, QueryDsl}; -use diesel_async::RunQueryDsl; -use lemmy_db_schema::{ - newtypes::PersonId, - schema::{person, person_block}, - utils::{get_conn, DbPool}, -}; - -impl PersonBlockView { - pub async fn for_person(pool: &mut DbPool<'_>, person_id: PersonId) -> Result, Error> { - let conn = &mut get_conn(pool).await?; - let target_person_alias = diesel::alias!(person as person1); - - person_block::table - .inner_join(person::table.on(person_block::person_id.eq(person::id))) - .inner_join( - target_person_alias.on(person_block::target_id.eq(target_person_alias.field(person::id))), - ) - .select(( - person::all_columns, - target_person_alias.fields(person::all_columns), - )) - .filter(person_block::person_id.eq(person_id)) - .filter(target_person_alias.field(person::deleted).eq(false)) - .order_by(person_block::published) - .load::(conn) - .await - } -} diff --git a/crates/db_views_actor/src/structs.rs b/crates/db_views_actor/src/structs.rs index 2356d2be4..2992d575d 100644 --- a/crates/db_views_actor/src/structs.rs +++ b/crates/db_views_actor/src/structs.rs @@ -6,11 +6,9 @@ use lemmy_db_schema::{ comment::Comment, comment_reply::CommentReply, community::Community, - instance::Instance, person::Person, person_mention::PersonMention, post::Post, - site::Site, }, SubscribedType, }; @@ -19,28 +17,6 @@ use serde_with::skip_serializing_none; #[cfg(feature = "full")] use ts_rs::TS; -#[derive(Debug, Serialize, Deserialize, Clone)] -#[cfg_attr(feature = "full", derive(TS, Queryable))] -#[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] -#[cfg_attr(feature = "full", ts(export))] -/// A community block. -pub struct CommunityBlockView { - pub person: Person, - pub community: Community, -} - -#[skip_serializing_none] -#[derive(Debug, Serialize, Deserialize, Clone)] -#[cfg_attr(feature = "full", derive(TS, Queryable))] -#[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] -#[cfg_attr(feature = "full", ts(export))] -/// An instance block by a user. -pub struct InstanceBlockView { - pub person: Person, - pub instance: Instance, - pub site: Option, -} - #[derive(Debug, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS, Queryable))] #[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] @@ -83,16 +59,6 @@ pub struct CommunityView { pub banned_from_community: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] -#[cfg_attr(feature = "full", derive(TS, Queryable))] -#[cfg_attr(feature = "full", diesel(check_for_backend(diesel::pg::Pg)))] -#[cfg_attr(feature = "full", ts(export))] -/// A person block. -pub struct PersonBlockView { - pub person: Person, - pub target: Person, -} - #[skip_serializing_none] #[derive(Debug, PartialEq, Serialize, Deserialize, Clone)] #[cfg_attr(feature = "full", derive(TS, Queryable))] diff --git a/crates/federate/Cargo.toml b/crates/federate/Cargo.toml index 6b76dbf97..5d7454276 100644 --- a/crates/federate/Cargo.toml +++ b/crates/federate/Cargo.toml @@ -32,7 +32,7 @@ serde_json.workspace = true tokio = { workspace = true, features = ["full"] } tracing.workspace = true moka.workspace = true -tokio-util = "0.7.11" +tokio-util = "0.7.12" async-trait.workspace = true [dev-dependencies] diff --git a/crates/federate/src/worker.rs b/crates/federate/src/worker.rs index f6e70d846..6c83aaa21 100644 --- a/crates/federate/src/worker.rs +++ b/crates/federate/src/worker.rs @@ -459,7 +459,6 @@ mod test { traits::Crud, }; use lemmy_utils::error::LemmyResult; - use reqwest::StatusCode; use serde_json::{json, Value}; use serial_test::serial; use test_context::{test_context, AsyncTestContext}; @@ -688,7 +687,7 @@ mod test { |inbox_sender: actix_web::web::Data>, body: String| async move { tracing::debug!("received activity: {:?}", body); inbox_sender.send(body.clone()).unwrap(); - HttpResponse::new(StatusCode::OK) + HttpResponse::new(actix_web::http::StatusCode::OK) }, ), ) diff --git a/crates/routes/Cargo.toml b/crates/routes/Cargo.toml index a614ba42d..4a8c53dea 100644 --- a/crates/routes/Cargo.toml +++ b/crates/routes/Cargo.toml @@ -32,5 +32,5 @@ serde = { workspace = true } url = { workspace = true } tracing = { workspace = true } tokio = { workspace = true } -urlencoding = { workspace = true } -rss = "2.0.8" +http.workspace = true +rss = "2.0.9" diff --git a/crates/routes/src/images.rs b/crates/routes/src/images.rs index 10ffb57de..768a607c2 100644 --- a/crates/routes/src/images.rs +++ b/crates/routes/src/images.rs @@ -2,6 +2,7 @@ use actix_web::{ body::BodyStream, http::{ header::{HeaderName, ACCEPT_ENCODING, HOST}, + Method, StatusCode, }, web, @@ -10,6 +11,7 @@ use actix_web::{ HttpResponse, }; use futures::stream::{Stream, StreamExt}; +use http::HeaderValue; use lemmy_api_common::{context::LemmyContext, request::PictrsResponse}; use lemmy_db_schema::source::{ images::{LocalImage, LocalImageForm, RemoteImage}, @@ -22,7 +24,6 @@ use reqwest_middleware::{ClientWithMiddleware, RequestBuilder}; use serde::Deserialize; use std::time::Duration; use url::Url; -use urlencoding::decode; pub fn config( cfg: &mut web::ServiceConfig, @@ -110,7 +111,7 @@ fn adapt_request( const INVALID_HEADERS: &[HeaderName] = &[ACCEPT_ENCODING, HOST]; let client_request = client - .request(request.method().clone(), url) + .request(convert_method(request.method()), url) .timeout(REQWEST_TIMEOUT); request @@ -120,7 +121,8 @@ fn adapt_request( if INVALID_HEADERS.contains(key) { client_req } else { - client_req.header(key, value) + // TODO: remove as_str and as_bytes conversions after actix-web upgrades to http 1.0 + client_req.header(key.as_str(), value.as_bytes()) } }) } @@ -167,7 +169,7 @@ async fn upload( } } - Ok(HttpResponse::build(status).json(images)) + Ok(HttpResponse::build(convert_status(status)).json(images)) } async fn full_res( @@ -210,14 +212,14 @@ async fn image( let res = client_req.send().await?; - if res.status() == StatusCode::NOT_FOUND { + if res.status() == http::StatusCode::NOT_FOUND { return Ok(HttpResponse::NotFound().finish()); } - let mut client_res = HttpResponse::build(res.status()); + let mut client_res = HttpResponse::build(StatusCode::from_u16(res.status().as_u16())?); for (name, value) in res.headers().iter().filter(|(h, _)| *h != "connection") { - client_res.insert_header((name.clone(), value.clone())); + client_res.insert_header(convert_header(name, value)); } Ok(client_res.body(BodyStream::new(res.bytes_stream()))) @@ -246,7 +248,7 @@ async fn delete( LocalImage::delete_by_alias(&mut context.pool(), &file).await?; - Ok(HttpResponse::build(res.status()).body(BodyStream::new(res.bytes_stream()))) + Ok(HttpResponse::build(convert_status(res.status())).body(BodyStream::new(res.bytes_stream()))) } pub async fn image_proxy( @@ -255,7 +257,7 @@ pub async fn image_proxy( client: web::Data, context: web::Data, ) -> LemmyResult { - let url = Url::parse(&decode(¶ms.url)?)?; + let url = Url::parse(¶ms.url)?; // Check that url corresponds to a federated image so that this can't be abused as a proxy // for arbitrary purposes. @@ -309,3 +311,14 @@ where std::pin::Pin::new(&mut self.rx).poll_recv(cx) } } + +// TODO: remove these conversions after actix-web upgrades to http 1.0 +fn convert_status(status: http::StatusCode) -> StatusCode { + StatusCode::from_u16(status.as_u16()).expect("status can be converted") +} +fn convert_method(method: &Method) -> http::Method { + http::Method::from_bytes(method.as_str().as_bytes()).expect("method can be converted") +} +fn convert_header<'a>(name: &'a http::HeaderName, value: &'a HeaderValue) -> (&'a str, &'a [u8]) { + (name.as_str(), value.as_bytes()) +} diff --git a/crates/routes/src/webfinger.rs b/crates/routes/src/webfinger.rs index f2a67c0fc..c5b7024cd 100644 --- a/crates/routes/src/webfinger.rs +++ b/crates/routes/src/webfinger.rs @@ -84,7 +84,7 @@ async fn get_webfinger_response( Ok( HttpResponse::Ok() - .content_type(&WEBFINGER_CONTENT_TYPE) + .content_type(WEBFINGER_CONTENT_TYPE.as_bytes()) .json(json), ) } diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml index e94fce9d6..a556ef49c 100644 --- a/crates/utils/Cargo.toml +++ b/crates/utils/Cargo.toml @@ -32,7 +32,6 @@ full = [ "dep:actix-web", "dep:serde_json", "dep:anyhow", - "dep:tracing-error", "dep:http", "dep:deser-hjson", "dep:regex", @@ -53,7 +52,6 @@ full = [ [dependencies] regex = { workspace = true, optional = true } tracing = { workspace = true, optional = true } -tracing-error = { workspace = true, optional = true } itertools = { workspace = true, optional = true } serde = { workspace = true } serde_json = { workspace = true, optional = true } @@ -73,7 +71,7 @@ urlencoding = { workspace = true, optional = true } html2text = { version = "0.12.5", optional = true } deser-hjson = { version = "2.2.4", optional = true } smart-default = { version = "0.7.1", optional = true } -lettre = { version = "0.11.7", default-features = false, features = [ +lettre = { version = "0.11.8", default-features = false, features = [ "builder", "tokio1", "tokio1-rustls-tls", diff --git a/crates/utils/src/error.rs b/crates/utils/src/error.rs index 860dad6fd..4e634bde3 100644 --- a/crates/utils/src/error.rs +++ b/crates/utils/src/error.rs @@ -1,6 +1,6 @@ use cfg_if::cfg_if; use serde::{Deserialize, Serialize}; -use std::fmt::Debug; +use std::{backtrace::Backtrace, fmt::Debug}; use strum::{Display, EnumIter}; #[derive(Display, Debug, Serialize, Deserialize, Clone, PartialEq, Eq, EnumIter, Hash)] @@ -186,14 +186,13 @@ pub enum LemmyErrorType { cfg_if! { if #[cfg(feature = "full")] { - use tracing_error::SpanTrace; use std::fmt; pub type LemmyResult = Result; pub struct LemmyError { pub error_type: LemmyErrorType, pub inner: anyhow::Error, - pub context: SpanTrace, + pub context: Backtrace, } /// Maximum number of items in an array passed as API parameter. See [[LemmyErrorType::TooManyItems]] @@ -208,7 +207,7 @@ cfg_if! { LemmyError { error_type: LemmyErrorType::Unknown(format!("{}", &cause)), inner: cause, - context: SpanTrace::capture(), + context: Backtrace::capture(), } } } @@ -232,13 +231,13 @@ cfg_if! { } impl actix_web::error::ResponseError for LemmyError { - fn status_code(&self) -> http::StatusCode { + fn status_code(&self) -> actix_web::http::StatusCode { if self.error_type == LemmyErrorType::IncorrectLogin { - return http::StatusCode::UNAUTHORIZED; + return actix_web::http::StatusCode::UNAUTHORIZED; } match self.inner.downcast_ref::() { - Some(diesel::result::Error::NotFound) => http::StatusCode::NOT_FOUND, - _ => http::StatusCode::BAD_REQUEST, + Some(diesel::result::Error::NotFound) => actix_web::http::StatusCode::NOT_FOUND, + _ => actix_web::http::StatusCode::BAD_REQUEST, } } @@ -253,7 +252,7 @@ cfg_if! { LemmyError { error_type, inner, - context: SpanTrace::capture(), + context: Backtrace::capture(), } } } @@ -267,7 +266,7 @@ cfg_if! { self.map_err(|error| LemmyError { error_type, inner: error.into(), - context: SpanTrace::capture(), + context: Backtrace::capture(), }) } } diff --git a/crates/utils/src/response.rs b/crates/utils/src/response.rs index 82b1e70ed..f37c15dd7 100644 --- a/crates/utils/src/response.rs +++ b/crates/utils/src/response.rs @@ -37,6 +37,7 @@ mod tests { use crate::error::{LemmyError, LemmyErrorType}; use actix_web::{ error::ErrorInternalServerError, + http::StatusCode, middleware::ErrorHandlers, test, web, @@ -45,7 +46,6 @@ mod tests { Handler, Responder, }; - use http::StatusCode; use pretty_assertions::assert_eq; #[actix_web::test] diff --git a/crates/utils/src/utils/validation.rs b/crates/utils/src/utils/validation.rs index 0a59e2fea..c35eac7bf 100644 --- a/crates/utils/src/utils/validation.rs +++ b/crates/utils/src/utils/validation.rs @@ -20,7 +20,7 @@ const ALLOWED_POST_URL_SCHEMES: [&str; 3] = ["http", "https", "magnet"]; const BODY_MAX_LENGTH: usize = 10000; const POST_BODY_MAX_LENGTH: usize = 50000; -const BIO_MAX_LENGTH: usize = 300; +const BIO_MAX_LENGTH: usize = 1000; const URL_MAX_LENGTH: usize = 2000; const ALT_TEXT_MAX_LENGTH: usize = 1500; const SITE_NAME_MAX_LENGTH: usize = 20; diff --git a/migrations/2024-03-04-143245_remove_show_scores_column/down.sql b/migrations/2024-03-04-143245_remove_show_scores_column/down.sql new file mode 100644 index 000000000..5669e96bd --- /dev/null +++ b/migrations/2024-03-04-143245_remove_show_scores_column/down.sql @@ -0,0 +1,3 @@ +ALTER TABLE local_user + ADD COLUMN show_scores boolean NOT NULL DEFAULT TRUE; + diff --git a/migrations/2024-03-04-143245_remove_show_scores_column/up.sql b/migrations/2024-03-04-143245_remove_show_scores_column/up.sql new file mode 100644 index 000000000..20fc01c4e --- /dev/null +++ b/migrations/2024-03-04-143245_remove_show_scores_column/up.sql @@ -0,0 +1,3 @@ +ALTER TABLE local_user + DROP COLUMN show_scores; + diff --git a/src/lib.rs b/src/lib.rs index 3c3633b75..da14e5cd8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,17 +1,10 @@ pub mod api_routes_http; pub mod code_migrations; pub mod prometheus_metrics; -pub mod root_span_builder; pub mod scheduled_tasks; pub mod session_middleware; -#[cfg(feature = "console")] -pub mod telemetry; -use crate::{ - code_migrations::run_advanced_migrations, - root_span_builder::QuieterRootSpanBuilder, - session_middleware::SessionMiddleware, -}; +use crate::{code_migrations::run_advanced_migrations, session_middleware::SessionMiddleware}; use activitypub_federation::config::{FederationConfig, FederationMiddleware}; use actix_cors::Cors; use actix_web::{ @@ -55,14 +48,9 @@ use prometheus_metrics::serve_prometheus; use reqwest_middleware::ClientBuilder; use reqwest_tracing::TracingMiddleware; use serde_json::json; -use std::{env, ops::Deref, time::Duration}; +use std::{ops::Deref, time::Duration}; use tokio::signal::unix::SignalKind; -use tracing::subscriber::set_global_default; -use tracing_actix_web::TracingLogger; -use tracing_error::ErrorLayer; -use tracing_log::LogTracer; -use tracing_subscriber::{filter::Targets, layer::SubscriberExt, Layer, Registry}; -use url::Url; +use tracing_actix_web::{DefaultRootSpanBuilder, TracingLogger}; /// Timeout for HTTP requests while sending activities. A longer timeout provides better /// compatibility with other ActivityPub software that might allocate more time for synchronous @@ -119,7 +107,7 @@ pub struct CmdArgs { /// Placing the main function in lib.rs allows other crates to import it and embed Lemmy pub async fn start_lemmy_server(args: CmdArgs) -> LemmyResult<()> { // Print version number to log - println!("Lemmy v{VERSION}"); + println!("Starting Lemmy v{VERSION}"); // return error 503 while running db migrations and startup tasks let mut startup_server_handle = None; @@ -318,7 +306,7 @@ fn create_http_server( )) .wrap(middleware::Compress::default()) .wrap(cors_config) - .wrap(TracingLogger::::new()) + .wrap(TracingLogger::::new()) .wrap(ErrorHandlers::new().default_handler(jsonify_plain_text_errors)) .app_data(Data::new(context.clone())) .app_data(Data::new(rate_limit_cell.clone())) @@ -373,38 +361,3 @@ fn cors_config(settings: &Settings) -> Cors { .max_age(3600), } } - -pub fn init_logging(opentelemetry_url: &Option) -> LemmyResult<()> { - LogTracer::init()?; - - let log_description = env::var("RUST_LOG").unwrap_or_else(|_| "info".into()); - - let targets = log_description - .trim() - .trim_matches('"') - .parse::()?; - - let format_layer = { - #[cfg(feature = "json-log")] - let layer = tracing_subscriber::fmt::layer().with_ansi(false).json(); - #[cfg(not(feature = "json-log"))] - let layer = tracing_subscriber::fmt::layer().with_ansi(false); - - layer.with_filter(targets.clone()) - }; - - let subscriber = Registry::default() - .with(format_layer) - .with(ErrorLayer::default()); - - if let Some(_url) = opentelemetry_url { - #[cfg(feature = "console")] - telemetry::init_tracing(_url.as_ref(), subscriber, targets)?; - #[cfg(not(feature = "console"))] - tracing::error!("Feature `console` must be enabled for opentelemetry tracing"); - } else { - set_global_default(subscriber)?; - } - - Ok(()) -} diff --git a/src/main.rs b/src/main.rs index d7244d2d6..79504f509 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,18 @@ use clap::Parser; -use lemmy_server::{init_logging, start_lemmy_server, CmdArgs}; -use lemmy_utils::{error::LemmyResult, settings::SETTINGS}; +use lemmy_server::{start_lemmy_server, CmdArgs}; +use lemmy_utils::error::LemmyResult; +use tracing::level_filters::LevelFilter; +use tracing_subscriber::EnvFilter; pub extern crate rustls; #[tokio::main] pub async fn main() -> LemmyResult<()> { - init_logging(&SETTINGS.opentelemetry_url)?; + let filter = EnvFilter::builder() + .with_default_directive(LevelFilter::INFO.into()) + .from_env_lossy(); + tracing_subscriber::fmt().with_env_filter(filter).init(); + let args = CmdArgs::parse(); rustls::crypto::ring::default_provider() diff --git a/src/root_span_builder.rs b/src/root_span_builder.rs deleted file mode 100644 index 09ce2544e..000000000 --- a/src/root_span_builder.rs +++ /dev/null @@ -1,83 +0,0 @@ -use actix_web::{http::StatusCode, ResponseError}; -use tracing::Span; -use tracing_actix_web::RootSpanBuilder; - -// Code in this module adapted from DefaultRootSpanBuilder -// https://github.com/LukeMathWalker/tracing-actix-web/blob/main/src/root_span_builder.rs -// and root_span! -// https://github.com/LukeMathWalker/tracing-actix-web/blob/main/src/root_span_macro.rs - -pub struct QuieterRootSpanBuilder; - -impl RootSpanBuilder for QuieterRootSpanBuilder { - fn on_request_start(request: &actix_web::dev::ServiceRequest) -> Span { - let request_id = tracing_actix_web::root_span_macro::private::get_request_id(request); - - tracing::info_span!( - "HTTP request", - http.method = %request.method(), - http.scheme = request.connection_info().scheme(), - http.host = %request.connection_info().host(), - http.target = %request.uri().path(), - http.status_code = tracing::field::Empty, - otel.kind = "server", - otel.status_code = tracing::field::Empty, - trace_id = tracing::field::Empty, - request_id = %request_id, - exception.message = tracing::field::Empty, - // Not proper OpenTelemetry, but their terminology is fairly exception-centric - exception.details = tracing::field::Empty, - ) - } - - fn on_request_end( - span: tracing::Span, - outcome: &Result, actix_web::Error>, - ) { - match &outcome { - Ok(response) => { - if let Some(error) = response.response().error() { - // use the status code already constructed for the outgoing HTTP response - handle_error(span, response.status(), error.as_response_error()); - } else { - let code: i32 = response.response().status().as_u16().into(); - span.record("http.status_code", code); - span.record("otel.status_code", "OK"); - } - } - Err(error) => { - let response_error = error.as_response_error(); - handle_error(span, response_error.status_code(), response_error); - } - }; - } -} - -fn handle_error(span: Span, status_code: StatusCode, response_error: &dyn ResponseError) { - let code: i32 = status_code.as_u16().into(); - - span.record("http.status_code", code); - - if status_code.is_client_error() { - span.record("otel.status_code", "OK"); - } else { - span.record("otel.status_code", "ERROR"); - } - - // pre-formatting errors is a workaround for https://github.com/tokio-rs/tracing/issues/1565 - let display_error = format!("{response_error}"); - - tracing::info_span!( - parent: None, - "Error encountered while processing the incoming HTTP request" - ) - .in_scope(|| { - if status_code.is_client_error() { - tracing::warn!("{}", display_error); - } else { - tracing::error!("{}", display_error); - } - }); - - span.record("exception.message", tracing::field::display(display_error)); -} diff --git a/src/session_middleware.rs b/src/session_middleware.rs index a72d84920..b23f8644e 100644 --- a/src/session_middleware.rs +++ b/src/session_middleware.rs @@ -1,7 +1,7 @@ use actix_web::{ body::MessageBody, dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform}, - http::header::CACHE_CONTROL, + http::header::{HeaderValue, CACHE_CONTROL}, Error, HttpMessage, }; @@ -9,7 +9,6 @@ use core::future::Ready; use futures_util::future::LocalBoxFuture; use lemmy_api::{local_user_view_from_jwt, read_auth_token}; use lemmy_api_common::context::LemmyContext; -use reqwest::header::HeaderValue; use std::{future::ready, rc::Rc}; #[derive(Clone)] diff --git a/src/telemetry.rs b/src/telemetry.rs deleted file mode 100644 index a7a1ac809..000000000 --- a/src/telemetry.rs +++ /dev/null @@ -1,47 +0,0 @@ -use console_subscriber::ConsoleLayer; -use lemmy_utils::error::LemmyResult; -use opentelemetry::{ - sdk::{propagation::TraceContextPropagator, Resource}, - KeyValue, -}; -use opentelemetry_otlp::WithExportConfig; -use tracing::{subscriber::set_global_default, Subscriber}; -use tracing_subscriber::{filter::Targets, layer::SubscriberExt, registry::LookupSpan, Layer}; - -pub fn init_tracing(opentelemetry_url: &str, subscriber: S, targets: Targets) -> LemmyResult<()> -where - S: Subscriber + for<'a> LookupSpan<'a> + Send + Sync + 'static, -{ - opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new()); - - let console_layer = ConsoleLayer::builder() - .with_default_env() - .server_addr(([0, 0, 0, 0], 6669)) - .event_buffer_capacity(1024 * 1024) - .spawn(); - - let subscriber = subscriber.with(console_layer); - - let tracer = opentelemetry_otlp::new_pipeline() - .tracing() - .with_trace_config( - opentelemetry::sdk::trace::config() - .with_resource(Resource::new(vec![KeyValue::new("service.name", "lemmy")])), - ) - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(opentelemetry_url), - ) - .install_batch(opentelemetry::runtime::Tokio)?; - - let otel_layer = tracing_opentelemetry::layer() - .with_tracer(tracer) - .with_filter(targets); - - let subscriber = subscriber.with(otel_layer); - - set_global_default(subscriber)?; - - Ok(()) -}