From fed6b61eaf1a6baea1af9dd64126d1039ba11541 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Wed, 6 Mar 2024 17:21:46 +0100 Subject: [PATCH] Upgrade apub lib, correct webfinger content-type (#4498) * Upgrade apub lib, correct webfinger content-type * fmt * fix test by avoiding network fetch --- Cargo.lock | 98 +++++++++---------- Cargo.toml | 2 +- crates/api_common/Cargo.toml | 3 - crates/api_common/src/context.rs | 42 +------- crates/api_common/src/request.rs | 2 +- crates/apub/assets/mastodon/objects/page.json | 16 +-- crates/apub/src/objects/post.rs | 24 ++--- crates/routes/src/webfinger.rs | 8 +- 8 files changed, 78 insertions(+), 117 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5194f393..e4c55f082 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,9 +16,9 @@ checksum = "8f27d075294830fcab6f66e320dab524bc6d048f4a151698e153205559113772" [[package]] name = "activitypub_federation" -version = "0.5.1-beta.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866db431760d14a7360f12e75ad48f3265b5b89cd2303e548a02bcc8983e4fcd" +checksum = "eee115a53849bbcac6c953495b5f9322b56680c0a1bdef6813183f0453f9ee3c" dependencies = [ "activitystreams-kinds", "actix-web", @@ -35,7 +35,7 @@ dependencies = [ "http-signature-normalization", "http-signature-normalization-reqwest", "httpdate", - "itertools 0.12.0", + "itertools 0.12.1", "moka", "once_cell", "openssl", @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "129d4c88e98860e1758c5de288d1632b07970a16d59bdf7b8d66053d582bb71f" +checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743" dependencies = [ "actix-codec", "actix-rt", @@ -236,9 +236,9 @@ dependencies = [ [[package]] name = "actix-tls" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "929e47cc23865cdb856e59673cfba2d28f00b3bbd060dfc80e33a00a3cea8317" +checksum = "d4cce60a2f2b477bc72e5cde0af1812a6e82d8fd85b5570a5dcf2a5bf2c5be5f" dependencies = [ "actix-rt", "actix-service", @@ -265,9 +265,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.4.1" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43428f3bf11dee6d166b00ec2df4e3aa8cc1606aaa0b7433c146852e2f4e03b" +checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984" dependencies = [ "actix-codec", "actix-http", @@ -851,9 +851,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.32" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1564,9 +1564,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "either" @@ -2026,7 +2026,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -2401,9 +2401,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2465,9 +2465,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -2578,7 +2578,6 @@ dependencies = [ "activitypub_federation", "actix-web", "anyhow", - "async-trait", "chrono", "encoding", "enum-map", @@ -2649,7 +2648,7 @@ dependencies = [ "html2md", "html2text", "http", - "itertools 0.12.0", + "itertools 0.12.1", "lemmy_api_common", "lemmy_db_schema", "lemmy_db_views", @@ -2884,7 +2883,7 @@ dependencies = [ "futures", "html2text", "http", - "itertools 0.12.0", + "itertools 0.12.1", "lettre", "markdown-it", "once_cell", @@ -3236,9 +3235,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9dc9808102655926a6086abd0b9965ebefd4a39ef0d184f074c34ba5049ec6" +checksum = "b1911e88d5831f748a4097a43862d129e3c6fca831eecac9b8db6d01d93c9de2" dependencies = [ "async-lock", "async-trait", @@ -3380,9 +3379,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.63" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ "bitflags 2.4.2", "cfg-if", @@ -3412,9 +3411,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.99" +version = "0.9.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" +checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" dependencies = [ "cc", "libc", @@ -3457,7 +3456,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", - "indexmap 2.1.0", + "indexmap 2.2.5", "js-sys", "once_cell", "pin-project-lite", @@ -3854,7 +3853,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" dependencies = [ "base64 0.21.7", - "indexmap 2.1.0", + "indexmap 2.2.5", "line-wrap", "quick-xml 0.31.0", "serde", @@ -4308,9 +4307,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.23" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ "async-compression", "base64 0.21.7", @@ -4338,6 +4337,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -4690,9 +4690,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -4708,9 +4708,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", @@ -4719,11 +4719,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.5", "itoa", "ryu", "serde", @@ -4769,7 +4769,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.2.5", "serde", "serde_json", "serde_with_macros", @@ -5204,18 +5204,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", @@ -5284,9 +5284,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -5467,7 +5467,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.5", "serde", "serde_spanned", "toml_datetime", @@ -5480,7 +5480,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.5", "serde", "serde_spanned", "toml_datetime", @@ -6068,9 +6068,9 @@ checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", diff --git a/Cargo.toml b/Cargo.toml index 98bf79b8c..037d03919 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -96,7 +96,7 @@ lemmy_routes = { version = "=0.19.3", path = "./crates/routes" } lemmy_db_views = { version = "=0.19.3", path = "./crates/db_views" } lemmy_db_views_actor = { version = "=0.19.3", path = "./crates/db_views_actor" } lemmy_db_views_moderator = { version = "=0.19.3", path = "./crates/db_views_moderator" } -activitypub_federation = { version = "0.5.1-beta.1", default-features = false, features = [ +activitypub_federation = { version = "0.5.1", default-features = false, features = [ "actix-web", ] } diesel = "2.1.4" diff --git a/crates/api_common/Cargo.toml b/crates/api_common/Cargo.toml index 0192099f3..3acd7d4ca 100644 --- a/crates/api_common/Cargo.toml +++ b/crates/api_common/Cargo.toml @@ -54,7 +54,6 @@ tracing = { workspace = true, optional = true } reqwest-middleware = { workspace = true, optional = true } regex = { workspace = true } rosetta-i18n = { workspace = true, optional = true } -anyhow = { workspace = true } futures = { workspace = true, optional = true } uuid = { workspace = true, optional = true } tokio = { workspace = true, optional = true } @@ -64,7 +63,6 @@ once_cell = { workspace = true, optional = true } actix-web = { workspace = true, optional = true } enum-map = { workspace = true } urlencoding = { workspace = true } -async-trait = { workspace = true } mime = { version = "0.3.17", optional = true } webpage = { version = "1.6", default-features = false, features = [ "serde", @@ -73,7 +71,6 @@ encoding = { version = "0.2.33", optional = true } jsonwebtoken = { version = "8.3.0", optional = true } # necessary for wasmt compilation getrandom = { version = "0.2.12", features = ["js"] } -task-local-extensions = "0.1.4" [package.metadata.cargo-machete] ignored = ["getrandom"] diff --git a/crates/api_common/src/context.rs b/crates/api_common/src/context.rs index 8d8dc5013..ba9eb4074 100644 --- a/crates/api_common/src/context.rs +++ b/crates/api_common/src/context.rs @@ -1,6 +1,5 @@ use crate::request::client_builder; use activitypub_federation::config::{Data, FederationConfig}; -use anyhow::anyhow; use lemmy_db_schema::{ source::secret::Secret, utils::{build_db_pool_for_tests, ActualDbPool, DbPool}, @@ -9,10 +8,8 @@ use lemmy_utils::{ rate_limit::RateLimitCell, settings::{structs::Settings, SETTINGS}, }; -use reqwest::{Request, Response}; -use reqwest_middleware::{ClientBuilder, ClientWithMiddleware, Middleware, Next}; +use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use std::sync::Arc; -use task_local_extensions::Extensions; #[derive(Clone)] pub struct LemmyContext { @@ -55,32 +52,16 @@ impl LemmyContext { &self.rate_limit_cell } - /// Initialize a context for use in tests, optionally blocks network requests. + /// Initialize a context for use in tests which blocks federation network calls. /// /// Do not use this in production code. pub async fn init_test_context() -> Data { - Self::build_test_context(true).await - } - - /// Initialize a context for use in tests, with network requests allowed. - /// TODO: get rid of this if possible. - /// - /// Do not use this in production code. - pub async fn init_test_context_with_networking() -> Data { - Self::build_test_context(false).await - } - - async fn build_test_context(block_networking: bool) -> Data { // call this to run migrations let pool = build_db_pool_for_tests().await; let client = client_builder(&SETTINGS).build().expect("build client"); - let mut client = ClientBuilder::new(client); - if block_networking { - client = client.with(BlockedMiddleware); - } - let client = client.build(); + let client = ClientBuilder::new(client).build(); let secret = Secret { id: 0, jwt_secret: String::new(), @@ -92,24 +73,11 @@ impl LemmyContext { let config = FederationConfig::builder() .domain(context.settings().hostname.clone()) .app_data(context) + // Dont allow any network fetches + .http_fetch_limit(0) .build() .await .expect("build federation config"); config.to_request_data() } } - -struct BlockedMiddleware; - -/// A reqwest middleware which blocks all requests -#[async_trait::async_trait] -impl Middleware for BlockedMiddleware { - async fn handle( - &self, - _req: Request, - _extensions: &mut Extensions, - _next: Next<'_>, - ) -> reqwest_middleware::Result { - Err(anyhow!("Network requests not allowed").into()) - } -} diff --git a/crates/api_common/src/request.rs b/crates/api_common/src/request.rs index 1eab50bc5..d3e307da5 100644 --- a/crates/api_common/src/request.rs +++ b/crates/api_common/src/request.rs @@ -327,7 +327,7 @@ mod tests { #[tokio::test] #[serial] async fn test_link_metadata() { - let context = LemmyContext::init_test_context_with_networking().await; + let context = LemmyContext::init_test_context().await; let sample_url = Url::parse("https://gitlab.com/IzzyOnDroid/repo/-/wikis/FAQ").unwrap(); let sample_res = fetch_link_metadata(&sample_url, false, &context) .await diff --git a/crates/apub/assets/mastodon/objects/page.json b/crates/apub/assets/mastodon/objects/page.json index ec4c13080..2965b4b8d 100644 --- a/crates/apub/assets/mastodon/objects/page.json +++ b/crates/apub/assets/mastodon/objects/page.json @@ -11,21 +11,21 @@ "votersCount": "toot:votersCount" } ], - "id": "https://dice.camp/users/thekernelinyellow/statuses/110830743680706519", + "id": "https://masto.qa.urbanwildlife.biz/users/mastodon/statuses/110830743680706519", "type": "Note", "summary": null, "inReplyTo": null, "published": "2023-08-04T09:55:39Z", - "url": "https://dice.camp/@thekernelinyellow/110830743680706519", - "attributedTo": "https://dice.camp/users/thekernelinyellow", + "url": "https://masto.qa.urbanwildlife.biz/110830743680706519", + "attributedTo": "https://masto.qa.urbanwildlife.biz/users/mastodon", "to": ["https://www.w3.org/ns/activitystreams#Public"], "cc": [ - "https://dice.camp/users/thekernelinyellow/followers", + "https://masto.qa.urbanwildlife.biz/users/mastodon/followers", "https://enterprise.lemmy.ml/c/tenforward", "https://enterprise.lemmy.ml/c/tenforward/followers" ], "sensitive": false, - "atomUri": "https://dice.camp/users/thekernelinyellow/statuses/110830743680706519", + "atomUri": "https://masto.qa.urbanwildlife.biz/statuses/110830743680706519", "inReplyToAtomUri": null, "conversation": "tag:dice.camp,2023-08-04:objectId=29969291:objectType=Conversation", "content": "

@tenforward Variable never resetting at refresh

Hi! I'm using a variable to count elements in my generator but every time I generate a new character, the counter's value carries on from the previous one. Is there a function to reset it (I set it to 0 at the beginning of the file)

", @@ -41,12 +41,12 @@ } ], "replies": { - "id": "https://dice.camp/users/thekernelinyellow/statuses/110830743680706519/replies", + "id": "https://masto.qa.urbanwildlife.biz/users/mastodon/statuses/110830743680706519/replies", "type": "Collection", "first": { "type": "CollectionPage", - "next": "https://dice.camp/users/thekernelinyellow/statuses/110830743680706519/replies?only_other_accounts=true&page=true", - "partOf": "https://dice.camp/users/thekernelinyellow/statuses/110830743680706519/replies", + "next": "https://masto.qa.urbanwildlife.biz/users/mastodon/statuses/110830743680706519/replies?only_other_accounts=true&page=true", + "partOf": "https://masto.qa.urbanwildlife.biz/users/mastodon/statuses/110830743680706519/replies", "items": [] } } diff --git a/crates/apub/src/objects/post.rs b/crates/apub/src/objects/post.rs index 47d7f53c6..8b8ae093b 100644 --- a/crates/apub/src/objects/post.rs +++ b/crates/apub/src/objects/post.rs @@ -302,8 +302,7 @@ mod tests { use super::*; use crate::{ objects::{ - community::{tests::parse_lemmy_community, ApubCommunity}, - instance::ApubSite, + community::tests::parse_lemmy_community, person::{tests::parse_lemmy_person, ApubPerson}, }, protocol::tests::file_to_json_object, @@ -333,7 +332,10 @@ mod tests { assert!(!post.featured_community); assert_eq!(context.request_count(), 0); - cleanup(&context, person, site, community, post).await?; + Post::delete(&mut context.pool(), post.id).await?; + Person::delete(&mut context.pool(), person.id).await?; + Community::delete(&mut context.pool(), community.id).await?; + Site::delete(&mut context.pool(), site.id).await?; Ok(()) } @@ -341,29 +343,19 @@ mod tests { #[serial] async fn test_convert_mastodon_post_title() -> LemmyResult<()> { let context = LemmyContext::init_test_context().await; - let (person, site) = parse_lemmy_person(&context).await?; let community = parse_lemmy_community(&context).await?; + let json = file_to_json_object("assets/mastodon/objects/person.json")?; + let person = ApubPerson::from_json(json, &context).await?; + let json = file_to_json_object("assets/mastodon/objects/page.json")?; let post = ApubPost::from_json(json, &context).await?; assert_eq!(post.name, "Variable never resetting at refresh"); - cleanup(&context, person, site, community, post).await?; - Ok(()) - } - - async fn cleanup( - context: &Data, - person: ApubPerson, - site: ApubSite, - community: ApubCommunity, - post: ApubPost, - ) -> LemmyResult<()> { Post::delete(&mut context.pool(), post.id).await?; Person::delete(&mut context.pool(), person.id).await?; Community::delete(&mut context.pool(), community.id).await?; - Site::delete(&mut context.pool(), site.id).await?; Ok(()) } } diff --git a/crates/routes/src/webfinger.rs b/crates/routes/src/webfinger.rs index ffceb4028..b9da07c56 100644 --- a/crates/routes/src/webfinger.rs +++ b/crates/routes/src/webfinger.rs @@ -1,6 +1,6 @@ use activitypub_federation::{ config::Data, - fetch::webfinger::{extract_webfinger_name, Webfinger, WebfingerLink}, + fetch::webfinger::{extract_webfinger_name, Webfinger, WebfingerLink, WEBFINGER_CONTENT_TYPE}, }; use actix_web::{web, web::Query, HttpResponse}; use lemmy_api_common::context::LemmyContext; @@ -70,7 +70,11 @@ async fn get_webfinger_response( ..Default::default() }; - Ok(HttpResponse::Ok().json(json)) + Ok( + HttpResponse::Ok() + .content_type(&WEBFINGER_CONTENT_TYPE) + .json(json), + ) } fn webfinger_link_for_actor(