diff --git a/Cargo.lock b/Cargo.lock index b1f2e33..e10e723 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,12 +17,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - [[package]] name = "aead" version = "0.5.2" @@ -213,6 +207,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" @@ -229,7 +229,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", ] @@ -240,7 +240,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" dependencies = [ - "bitcoin-internals 0.3.0", + "bitcoin-internals", "bitcoin_hashes 0.14.0", ] @@ -328,22 +328,16 @@ checksum = "0032b0e8ead7074cda7fc4f034409607e3f03a6f71d66ade8a307f79b4d99e73" dependencies = [ "base58ck", "bech32", - "bitcoin-internals 0.3.0", + "bitcoin-internals", "bitcoin-io", "bitcoin-units", "bitcoin_hashes 0.14.0", - "hex-conservative 0.2.1", + "hex-conservative", "hex_lit", "secp256k1", "serde", ] -[[package]] -name = "bitcoin-internals" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" - [[package]] name = "bitcoin-internals" version = "0.3.0" @@ -365,7 +359,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" dependencies = [ - "bitcoin-internals 0.3.0", + "bitcoin-internals", "serde", ] @@ -375,16 +369,6 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" -[[package]] -name = "bitcoin_hashes" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" -dependencies = [ - "bitcoin-internals 0.2.0", - "hex-conservative 0.1.2", -] - [[package]] name = "bitcoin_hashes" version = "0.14.0" @@ -392,7 +376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" dependencies = [ "bitcoin-io", - "hex-conservative 0.2.1", + "hex-conservative", "serde", ] @@ -740,6 +724,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1103,16 +1097,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "flate2" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" -dependencies = [ - "crc32fast", - "miniz_oxide 0.8.0", -] - [[package]] name = "flume" version = "0.11.0" @@ -1130,6 +1114,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1411,6 +1410,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.4.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.4.1" @@ -1489,12 +1507,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hex-conservative" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" - [[package]] name = "hex-conservative" version = "0.2.1" @@ -1621,7 +1633,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -1644,6 +1656,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", + "h2 0.4.6", "http 1.1.0", "http-body 1.0.1", "httparse", @@ -1672,6 +1685,22 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.7" @@ -1986,15 +2015,6 @@ dependencies = [ "adler", ] -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - [[package]] name = "mio" version = "1.0.2" @@ -2026,6 +2046,23 @@ dependencies = [ "version_check", ] +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "negentropy" version = "0.3.1" @@ -2204,6 +2241,50 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "ordered-multimap" version = "0.6.0" @@ -2719,24 +2800,28 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", + "encoding_rs", "futures-core", "futures-util", + "h2 0.4.6", "http 1.1.0", "http-body 1.0.1", "http-body-util", "hyper 1.4.1", "hyper-rustls", + "hyper-tls", "hyper-util", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -2748,7 +2833,9 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper", + "system-configuration", "tokio", + "tokio-native-tls", "tokio-rustls", "tokio-socks", "tower-service", @@ -2889,6 +2976,7 @@ dependencies = [ "log", "nostr", "pretty_env_logger", + "reqwest", "rocket", "serde", "serde_with", @@ -2896,7 +2984,6 @@ dependencies = [ "sqlx", "sqlx-postgres", "tokio", - "ureq", "url", "uuid", ] @@ -2968,7 +3055,6 @@ version = "0.23.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" dependencies = [ - "log", "once_cell", "ring", "rustls-pki-types", @@ -3044,6 +3130,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -3074,7 +3169,7 @@ version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ - "bitcoin_hashes 0.13.0", + "bitcoin_hashes 0.14.0", "rand", "secp256k1-sys", "serde", @@ -3089,6 +3184,29 @@ dependencies = [ "cc", ] +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "seq-macro" version = "0.3.5" @@ -3595,6 +3713,27 @@ dependencies = [ "walkdir", ] +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.12.0" @@ -3730,6 +3869,16 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.26.0" @@ -3998,24 +4147,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "ureq" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" -dependencies = [ - "base64 0.22.1", - "flate2", - "log", - "once_cell", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "url", - "webpki-roots", -] - [[package]] name = "url" version = "2.5.2" diff --git a/Cargo.toml b/Cargo.toml index 12ec1ab..88c5370 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ config = { version = "0.14.0", features = ["toml"] } chrono = { version = "0.4.38", features = ["serde"] } url = "2.5.0" serde_with = { version = "3.8.1", features = ["hex"] } -ureq = { version = "2.9.7", features = ["json"] } +reqwest = "0.12.8" libc = { version = "0.2.153", optional = true } blurhash = { version = "0.2.1", optional = true } @@ -51,5 +51,4 @@ candle-nn = { git = "https://github.com/huggingface/candle.git", version = "^0.6 candle-transformers = { git = "https://github.com/huggingface/candle.git", version = "^0.6.1", optional = true } clap = { version = "4.5.18", features = ["derive"], optional = true } sqlx-postgres = { version = "0.8.2", optional = true, features = ["chrono", "uuid"] } -clap_derive = { version = "4.5.18", optional = true } - +clap_derive = { version = "4.5.18", optional = true } \ No newline at end of file diff --git a/src/analytics/plausible.rs b/src/analytics/plausible.rs index c6e0c65..e6270ee 100644 --- a/src/analytics/plausible.rs +++ b/src/analytics/plausible.rs @@ -2,8 +2,10 @@ use crate::analytics::Analytics; use crate::settings::Settings; use anyhow::Error; use log::{info, warn}; +use reqwest::ClientBuilder; use rocket::Request; use serde::{Deserialize, Serialize}; +use std::time::Duration; use tokio::sync::mpsc::{unbounded_channel, UnboundedSender}; #[derive(Debug, Serialize, Deserialize)] @@ -30,25 +32,30 @@ impl PlausibleAnalytics { _ => "".to_string(), }; let pub_url = settings.public_url.clone(); + let c = ClientBuilder::new().build().unwrap(); tokio::spawn(async move { while let Some(mut msg) = rx.recv().await { msg.url = format!("{}{}", pub_url, msg.url); - match ureq::post(&format!("{}/api/event", url)) - .set( + match c + .post(format!("{}/api/event", url)) + .header( "user-agent", match &msg.user_agent { Some(s) => s, None => "", }, ) - .set( + .header( "x-forwarded-for", match &msg.xff { Some(s) => s, None => "", }, ) - .send_json(&msg) + .json(&msg) + .timeout(Duration::from_secs(30)) + .send() + .await { Ok(_v) => info!("Sent {:?}", msg), Err(e) => warn!("Failed to track: {}", e), @@ -71,7 +78,10 @@ impl Analytics for PlausibleAnalytics { url: req.uri().to_string(), referrer: req.headers().get_one("Referer").map(|s| s.to_string()), user_agent: req.headers().get_one("User-Agent").map(|s| s.to_string()), - xff: req.headers().get_one("X-Forwarded-For").map(|s| s.to_string()), + xff: req + .headers() + .get_one("X-Forwarded-For") + .map(|s| s.to_string()), })?) } } diff --git a/src/routes/blossom.rs b/src/routes/blossom.rs index d03ad0d..55b9c12 100644 --- a/src/routes/blossom.rs +++ b/src/routes/blossom.rs @@ -285,7 +285,7 @@ async fn process_upload( let pubkey_vec = auth.event.pubkey.to_bytes().to_vec(); if let Some(wh) = webhook.as_ref() { - match wh.store_file(&pubkey_vec, blob.clone()) { + match wh.store_file(&pubkey_vec, blob.clone()).await { Ok(store) => { if !store { let _ = fs::remove_file(blob.path); diff --git a/src/routes/nip96.rs b/src/routes/nip96.rs index 827b588..633d839 100644 --- a/src/routes/nip96.rs +++ b/src/routes/nip96.rs @@ -211,7 +211,7 @@ async fn upload( blob.upload.alt = form.alt.as_ref().map(|s| s.to_string()); let pubkey_vec = auth.event.pubkey.to_bytes().to_vec(); if let Some(wh) = webhook.as_ref() { - match wh.store_file(&pubkey_vec, blob.clone()) { + match wh.store_file(&pubkey_vec, blob.clone()).await { Ok(store) => { if !store { let _ = fs::remove_file(blob.path); diff --git a/src/webhook.rs b/src/webhook.rs index cd46142..0a96e2c 100644 --- a/src/webhook.rs +++ b/src/webhook.rs @@ -1,10 +1,12 @@ use anyhow::Error; +use reqwest::{Client, ClientBuilder}; use serde::{Deserialize, Serialize}; use crate::filesystem::FileSystemResult; pub struct Webhook { url: String, + client: Client, } #[derive(Serialize, Deserialize)] @@ -16,19 +18,26 @@ struct WebhookRequest { impl Webhook { pub fn new(url: String) -> Self { - Self { url } + Self { + url, + client: ClientBuilder::new().build().unwrap(), + } } /// Ask webhook api if this file can be accepted - pub fn store_file(&self, pubkey: &Vec, fs: FileSystemResult) -> Result { + pub async fn store_file(&self, pubkey: &Vec, fs: FileSystemResult) -> Result { let body: WebhookRequest = WebhookRequest { action: "store_file".to_string(), subject: Some(hex::encode(pubkey)), payload: fs, }; - let req = ureq::post(&self.url) - .set("accept", "application/json") - .send_json(body)?; + let req = self + .client + .post(&self.url) + .header("accept", "application/json") + .json(&body) + .send() + .await?; if req.status() == 200 { Ok(true)