From ec12fb38300a75f24cceada7af63d807ad60719f Mon Sep 17 00:00:00 2001 From: Nutomic Date: Tue, 24 Oct 2023 10:53:59 +0200 Subject: [PATCH 1/3] Support fetches with redirect (#76) * Support fetches with redirect * pub --- src/fetch/collection_id.rs | 7 ++++--- src/fetch/mod.rs | 18 +++++++++++++++--- src/fetch/object_id.rs | 7 ++++--- src/fetch/webfinger.rs | 3 ++- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/fetch/collection_id.rs b/src/fetch/collection_id.rs index a45419c..8f42008 100644 --- a/src/fetch/collection_id.rs +++ b/src/fetch/collection_id.rs @@ -40,9 +40,10 @@ where where ::Error: From, { - let json = fetch_object_http(&self.0, data).await?; - Kind::verify(&json, &self.0, data).await?; - Kind::from_json(json, owner, data).await + let res = fetch_object_http(&self.0, data).await?; + let redirect_url = &res.url; + Kind::verify(&res.object, redirect_url, data).await?; + Kind::from_json(res.object, owner, data).await } } diff --git a/src/fetch/mod.rs b/src/fetch/mod.rs index 28b709e..bf1bfd5 100644 --- a/src/fetch/mod.rs +++ b/src/fetch/mod.rs @@ -23,6 +23,14 @@ pub mod object_id; /// Resolves identifiers of the form `name@example.com` pub mod webfinger; +/// Response from fetching a remote object +pub struct FetchObjectResponse { + /// The resolved object + pub object: Kind, + /// Contains the final URL (different from request URL in case of redirect) + pub url: Url, +} + /// Fetch a remote object over HTTP and convert to `Kind`. /// /// [crate::fetch::object_id::ObjectId::dereference] wraps this function to add caching and @@ -38,7 +46,7 @@ pub mod webfinger; pub async fn fetch_object_http( url: &Url, data: &Data, -) -> Result { +) -> Result, Error> { fetch_object_http_with_accept(url, data, FEDERATION_CONTENT_TYPE).await } @@ -48,7 +56,7 @@ async fn fetch_object_http_with_accept( url: &Url, data: &Data, content_type: &str, -) -> Result { +) -> Result, Error> { let config = &data.config; // dont fetch local objects this way debug_assert!(url.domain() != Some(&config.domain)); @@ -84,5 +92,9 @@ async fn fetch_object_http_with_accept( return Err(Error::ObjectDeleted); } - res.json_limited().await + let url = res.url().clone(); + Ok(FetchObjectResponse { + object: res.json_limited().await?, + url, + }) } diff --git a/src/fetch/object_id.rs b/src/fetch/object_id.rs index 29d5507..8c0e5aa 100644 --- a/src/fetch/object_id.rs +++ b/src/fetch/object_id.rs @@ -156,10 +156,11 @@ where return Err(anyhow!("Fetched remote object {} which was deleted", self).into()); } - let res2 = res?; + let res = res?; + let redirect_url = &res.url; - Kind::verify(&res2, self.inner(), data).await?; - Kind::from_json(res2, data).await + Kind::verify(&res.object, redirect_url, data).await?; + Kind::from_json(res.object, data).await } } diff --git a/src/fetch/webfinger.rs b/src/fetch/webfinger.rs index 078816f..0b8c4a1 100644 --- a/src/fetch/webfinger.rs +++ b/src/fetch/webfinger.rs @@ -38,7 +38,8 @@ where let res: Webfinger = fetch_object_http_with_accept(&Url::parse(&fetch_url)?, data, "application/jrd+json") - .await?; + .await? + .object; debug_assert_eq!(res.subject, format!("acct:{identifier}")); let links: Vec = res From e86330852de26ba6ba3957f2ee123a912f4f0988 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Tue, 24 Oct 2023 11:08:55 +0200 Subject: [PATCH 2/3] Support different alphabets in webfinger username (#78) * Support different alphabets in webfinger username * clippy --- src/fetch/webfinger.rs | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/fetch/webfinger.rs b/src/fetch/webfinger.rs index 0b8c4a1..a8ddb15 100644 --- a/src/fetch/webfinger.rs +++ b/src/fetch/webfinger.rs @@ -92,14 +92,10 @@ pub fn extract_webfinger_name(query: &str, data: &Data) -> Result("graf@poa.st", &data).await?; Ok(()) } + + #[tokio::test] + async fn test_webfinger_extract_name() -> Result<(), Error> { + use crate::traits::tests::DbConnection; + let data = Data { + config: FederationConfig::builder() + .domain("example.com") + .app_data(DbConnection) + .build() + .await + .unwrap(), + request_counter: Default::default(), + }; + assert_eq!( + Ok("test123".to_string()), + extract_webfinger_name("acct:test123@example.com", &data) + ); + assert_eq!( + Ok("Владимир".to_string()), + extract_webfinger_name("acct:Владимир@example.com", &data) + ); + assert_eq!( + Ok("تجريب".to_string()), + extract_webfinger_name("acct:تجريب@example.com", &data) + ); + Ok(()) + } } From 171d32720e5c5e3d275905faadd8de582d6eaeda Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Tue, 24 Oct 2023 11:34:42 +0200 Subject: [PATCH 3/3] 0.5.0-beta.4 --- Cargo.toml | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6b10a96..ad11179 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "activitypub_federation" -version = "0.5.0-beta.3" +version = "0.5.0-beta.4" edition = "2021" description = "High-level Activitypub framework" keywords = ["activitypub", "activitystreams", "federation", "fediverse"] @@ -9,37 +9,37 @@ repository = "https://github.com/LemmyNet/activitypub-federation-rust" documentation = "https://docs.rs/activitypub_federation/" [dependencies] -chrono = { version = "0.4.26", features = ["clock"], default-features = false } -serde = { version = "1.0.164", features = ["derive"] } -async-trait = "0.1.68" -url = { version = "2.4.0", features = ["serde"] } -serde_json = { version = "1.0.96", features = ["preserve_order"] } -anyhow = "1.0.71" -reqwest = { version = "0.11.18", features = ["json", "stream"] } -reqwest-middleware = "0.2.2" -tracing = "0.1.37" -base64 = "0.21.2" -openssl = "0.10.54" +chrono = { version = "0.4.31", features = ["clock"], default-features = false } +serde = { version = "1.0.189", features = ["derive"] } +async-trait = "0.1.74" +url = { version = "2.4.1", features = ["serde"] } +serde_json = { version = "1.0.107", features = ["preserve_order"] } +anyhow = "1.0.75" +reqwest = { version = "0.11.22", features = ["json", "stream"] } +reqwest-middleware = "0.2.3" +tracing = "0.1.40" +base64 = "0.21.5" +openssl = "0.10.57" once_cell = "1.18.0" http = "0.2.9" -sha2 = "0.10.6" -thiserror = "1.0.40" +sha2 = "0.10.8" +thiserror = "1.0.50" derive_builder = "0.12.0" itertools = "0.10.5" -dyn-clone = "1.0.11" +dyn-clone = "1.0.14" enum_delegate = "0.2.0" -httpdate = "1.0.2" +httpdate = "1.0.3" http-signature-normalization-reqwest = { version = "0.8.0", default-features = false, features = [ "sha-2", "middleware", ] } http-signature-normalization = "0.7.0" -bytes = "1.4.0" +bytes = "1.5.0" futures-core = { version = "0.3.28", default-features = false } -pin-project-lite = "0.2.9" +pin-project-lite = "0.2.13" activitystreams-kinds = "0.3.0" -regex = { version = "1.8.4", default-features = false, features = ["std", "unicode-case"] } -tokio = { version = "1.21.2", features = [ +regex = { version = "1.10.2", default-features = false, features = ["std", "unicode-case"] } +tokio = { version = "1.33.0", features = [ "sync", "rt", "rt-multi-thread", @@ -47,17 +47,17 @@ tokio = { version = "1.21.2", features = [ ] } # Actix-web -actix-web = { version = "4.3.1", default-features = false, optional = true } +actix-web = { version = "4.4.0", default-features = false, optional = true } # Axum -axum = { version = "0.6.18", features = [ +axum = { version = "0.6.20", features = [ "json", "headers", ], default-features = false, optional = true } tower = { version = "0.4.13", optional = true } hyper = { version = "0.14", optional = true } futures = "0.3.28" -moka = { version = "0.11.2", features = ["future"] } +moka = { version = "0.11.3", features = ["future"] } [features] default = ["actix-web", "axum"] @@ -67,14 +67,14 @@ axum = ["dep:axum", "dep:tower", "dep:hyper"] [dev-dependencies] rand = "0.8.5" env_logger = "0.10.0" -tower-http = { version = "0.4.0", features = ["map-request-body", "util"] } -axum = { version = "0.6.18", features = [ +tower-http = { version = "0.4.4", features = ["map-request-body", "util"] } +axum = { version = "0.6.20", features = [ "http1", "tokio", "query", ], default-features = false } -axum-macros = "0.3.7" -tokio = { version = "1.21.2", features = ["full"] } +axum-macros = "0.3.8" +tokio = { version = "1.33.0", features = ["full"] } [profile.dev] strip = "symbols"