From 7eb4aa6f46efc1e1a9feeb73955f2696c53f0e0c Mon Sep 17 00:00:00 2001 From: Igor Novgorodov Date: Wed, 15 Jul 2026 12:14:37 +0000 Subject: [PATCH 1/4] Improve ACME --- src/cli.rs | 12 +++++++----- src/tls/mod.rs | 7 ++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index 8d2f616..8d56256 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -397,13 +397,15 @@ pub struct Acme { #[clap(env, long, default_value = "cloudflare")] pub acme_dns_backend: DnsBackend, - /// Cloudflare API URL + /// Cloudflare API URL. + /// Makes sense only when the DNS backend is set to `cloudflare`. #[clap(env, long, default_value = DEFAULT_CLOUDFLARE_URL)] pub acme_dns_cloudflare_url: Url, - /// File from which to read API token if DNS backend is Cloudflare + /// Cloudflare token to use. + /// Makes sense only when the DNS backend is set to `cloudflare`. #[clap(env, long)] - pub acme_dns_cloudflare_token: Option, + pub acme_dns_cloudflare_token: Option, /// Asks ACME client to request a wildcard certificate for each of the domains configured. /// So in addition to `foo.app` the certificate will be also valid for `*.foo.app`. @@ -422,8 +424,8 @@ pub struct Acme { #[clap(env, long, default_value = "le_stag")] pub acme_url: AcmeUrl, - /// E-Mail to use when creating ACME accounts, must start with mailto: - #[clap(env, long, default_value = "mailto:boundary-nodes@dfinity.org")] + /// E-Mail to use when creating an ACME account + #[clap(env, long, default_value = "boundary-nodes@dfinity.org")] pub acme_contact: String, } diff --git a/src/tls/mod.rs b/src/tls/mod.rs index 01c139c..917038e 100644 --- a/src/tls/mod.rs +++ b/src/tls/mod.rs @@ -24,7 +24,7 @@ use { dns::{AcmeDns, TokenManagerDns}, }, rustls::server::ResolvesServerCert as ResolvesServerCertRustls, - std::{fs, time::Duration}, + std::time::Duration, }; use crate::cli::Cli; @@ -62,15 +62,12 @@ async fn setup_acme( DnsBackend::Cloudflare => { use ic_bn_lib::tls::acme::DnsManager; - let path = cli + let token = cli .acme .acme_dns_cloudflare_token .clone() .ok_or_else(|| anyhow!("Cloudflare token not defined"))?; - let token = - fs::read_to_string(path).context("unable to read Cloudflare token")?; - Arc::new(acme::dns::cloudflare::Cloudflare::new( cli.acme.acme_dns_cloudflare_url.clone(), token, From 5da87514e8cb84a27b772f7aadf9a80b00b893d5 Mon Sep 17 00:00:00 2001 From: Igor Novgorodov Date: Tue, 21 Jul 2026 11:00:03 +0000 Subject: [PATCH 2/4] Update crates, formatting changes --- Cargo.lock | 216 +++++++++++++++----------------- Cargo.toml | 6 +- src/cli.rs | 13 +- src/core.rs | 2 +- src/log/mod.rs | 6 +- src/metrics/mod.rs | 14 +-- src/metrics/runner.rs | 2 +- src/policy/mod.rs | 1 + src/routing/ic/handler.rs | 3 +- src/routing/middleware/geoip.rs | 12 +- src/tls/mod.rs | 89 +++++++++---- tools/create_acme_account.rs | 2 +- 12 files changed, 196 insertions(+), 170 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af79f71..4b82612 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -221,7 +221,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] @@ -233,7 +233,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] @@ -245,7 +245,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -350,7 +350,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -499,7 +499,7 @@ checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -607,14 +607,14 @@ checksum = "f48d6ace212fdf1b45fd6b566bb40808415344642b76c3224c07c8df9da81e97" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "block-buffer" @@ -703,9 +703,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.12.3" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cee35f73844aa3014bb606320a6c1f010249dbdf43342fe54b5a4f6a8ed4b79" +checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530" dependencies = [ "memchr", "regex-automata", @@ -806,7 +806,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -847,7 +847,7 @@ dependencies = [ "lazy_static", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -969,9 +969,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011" dependencies = [ "clap_builder", "clap_derive", @@ -979,9 +979,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b" dependencies = [ "anstream", "anstyle", @@ -998,7 +998,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1289,7 +1289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0b1fab2ae45819af2d0731d60f2afe17227ebb1a1538a236da84c93e9a60162" dependencies = [ "dispatch2", - "nix 0.31.3", + "nix", "windows-sys 0.61.2", ] @@ -1319,7 +1319,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1390,7 +1390,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1403,7 +1403,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1425,7 +1425,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1436,7 +1436,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core 0.23.0", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1508,7 +1508,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1528,7 +1528,7 @@ checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1539,7 +1539,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -1615,7 +1615,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2022,7 +2022,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2256,7 +2256,7 @@ dependencies = [ "indexmap 2.14.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -2669,9 +2669,9 @@ dependencies = [ [[package]] name = "ic-bn-lib" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5172fe60f8ac24121193a97a05ab475f3eb8c6d0713f9dc8ccd2ef26345f88" +checksum = "91da5c27b490f0212b68c7871fa73faabc9e4585527c320ef4e06642395575dd" dependencies = [ "ahash", "anyhow", @@ -2707,11 +2707,11 @@ dependencies = [ "ic-custom-domains-canister-api", "indoc", "instant-acme", - "itertools 0.14.0", + "itertools 0.15.0", "mail-auth", "mail-parser", "moka", - "nix 0.30.1", + "nix", "parse-size", "pem", "ppp", @@ -2748,7 +2748,7 @@ dependencies = [ "tokio-rustls", "tokio-util", "tower", - "tower-http 0.6.11", + "tower-http 0.7.0", "tower-service", "tower_governor", "tracing", @@ -2974,7 +2974,7 @@ dependencies = [ "maxminddb", "mockall", "moka", - "nix 0.31.3", + "nix", "pocket-ic", "prometheus", "rand 0.8.7", @@ -3557,7 +3557,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3576,7 +3576,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3788,9 +3788,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lz4_flex" -version = "0.11.6" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" +checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" dependencies = [ "twox-hash", ] @@ -3803,12 +3803,14 @@ checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" [[package]] name = "mail-auth" -version = "0.9.2" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3c5a279d798bf41bfcf94ee593a34b545fb2010ebf5cfce3416d6b4019f697" +checksum = "5dc03ec0f6be1788623ee3d275940ca0053ced3154eb881ffe70edf2f43d3d41" dependencies = [ "aws-lc-rs", "flate2", + "getrandom 0.2.17", + "getrandom 0.4.3", "hashify", "hickory-resolver", "mail-builder", @@ -3817,6 +3819,7 @@ dependencies = [ "rustls-pki-types", "serde", "serde_json", + "similar", "zip 8.6.0", ] @@ -3856,9 +3859,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "maxminddb" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf6467428ad055b71e588bcedcbaf2ff605b3251deb0c52be4a04b674c546dd" +checksum = "65e84ef32bcbf18a95548989e880db4af6fafd563463753afb4b9a149fb2782c" dependencies = [ "ipnetwork", "log", @@ -3936,9 +3939,9 @@ checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" [[package]] name = "mockall" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58d964098a5f9c6b63d0798e5372fd04708193510a7af313c22e9f29b7b620b" +checksum = "1a6ceddfe3ce334925e96bf420fdb2dcee5bed6c632a168ece622676dadeaf8a" dependencies = [ "cfg-if", "downcast", @@ -3950,14 +3953,14 @@ dependencies = [ [[package]] name = "mockall_derive" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca41ce716dda6a9be188b385aa78ee5260fc25cd3802cb2a8afdc6afbe6b6dbf" +checksum = "9cfe16fbe8a314aeec0b861ac24e60b1e123e97634bab045475b9d6a18416fd8" dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -3992,18 +3995,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", -] - [[package]] name = "nix" version = "0.31.3" @@ -4399,7 +4390,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4678,7 +4669,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -4743,9 +4734,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.40.1" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2474bd2e5029e7ccb6abb2ba48cf2383a333851dedf495901544281590c7da7f" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" dependencies = [ "memchr", ] @@ -5022,7 +5013,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -5042,9 +5033,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0e75113e14dc5acb068cd0786884f214f1312650a3d36d269f5c4f3cdee8a2" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -5054,9 +5045,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f388202e4b80542a0921078cc23b6333bcf1409c1e3f86404cae4766a6131db" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -5242,7 +5233,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.118", + "syn 2.0.119", "walkdir", ] @@ -5482,7 +5473,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -5585,7 +5576,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -5596,7 +5587,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -5631,7 +5622,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -5686,20 +5677,7 @@ dependencies = [ "darling 0.23.0", "proc-macro2", "quote", - "syn 2.0.118", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap 2.14.0", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", + "syn 2.0.119", ] [[package]] @@ -5840,9 +5818,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "simd_cesu8" @@ -5860,6 +5838,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +[[package]] +name = "similar" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6505efef05804732ed8a3f2d4f279429eb485bd69d5b0cc6b19cc02005cda16" +dependencies = [ + "bstr", +] + [[package]] name = "siphasher" version = "1.0.3" @@ -5914,7 +5901,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6041,7 +6028,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6053,7 +6040,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6087,9 +6074,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.118" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -6113,7 +6100,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6224,7 +6211,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6235,7 +6222,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6361,7 +6348,7 @@ checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6400,7 +6387,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6520,7 +6507,6 @@ dependencies = [ "tower", "tower-layer", "tower-service", - "tracing", "url", ] @@ -6542,6 +6528,7 @@ dependencies = [ "tokio-util", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -6606,7 +6593,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6818,7 +6805,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -6873,14 +6860,16 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vrl" -version = "0.33.1" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772206835b5bca8719825d2ab9e6fb160cbfce8ac1dc0e5dffe22cbe77254468" +checksum = "90d4f0baccba853b3e8420356e8b27662c7971657c17f0260beef35e169f2dc1" dependencies = [ "bytes", "cfg-if", "chrono", + "getrandom 0.2.17", "getrandom 0.3.4", + "getrandom 0.4.3", "jsonschema", "lalrpop", "lz4_flex", @@ -6889,7 +6878,6 @@ dependencies = [ "regex", "serde", "serde_json", - "serde_yaml", "serde_yaml_ng", "simdutf8", "snafu", @@ -6980,7 +6968,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "wasm-bindgen-shared", ] @@ -7167,7 +7155,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -7178,7 +7166,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -7421,7 +7409,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] @@ -7442,7 +7430,7 @@ checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -7462,7 +7450,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", "synstructure", ] @@ -7483,7 +7471,7 @@ checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] @@ -7516,7 +7504,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.118", + "syn 2.0.119", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d8232d9..745cdff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ http = "1.3.1" http-body = "1.0.1" http-body-util = "0.1.2" humantime = "2.2.0" -ic-bn-lib = { version = "0.4", features = [ +ic-bn-lib = { version = "0.4.1", features = [ "cert-providers", "lb", "clients-hyper", @@ -48,7 +48,7 @@ ic-http-gateway-protocol = { package = "ic-http-gateway-protocol", git = "https: isbot = "0.1" itertools = "0.15.0" lazy_static = "1.5.0" -maxminddb = "0.28.1" +maxminddb = "0.29" moka = { version = "0.12.8", features = ["sync", "future"] } prometheus = "0.14.0" rand = { version = "0.8.5", features = ["small_rng"] } @@ -97,7 +97,7 @@ hex = "0.4.3" httptest = "0.16.1" ic-certified-assets = { git = "https://github.com/dfinity/sdk.git", rev = "d65717bd6d0c172247c37dd23395c9fb13b2ba20" } ic-http-certification = "3.1.0" -mockall = "0.14.0" +mockall = "0.15.0" nix = { version = "0.31.0", features = ["signal"] } pocket-ic = "=13.0.0" rand_regex = "0.17.0" diff --git a/src/cli.rs b/src/cli.rs index 8d56256..5e85648 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -384,6 +384,7 @@ pub struct Acme { /// Currently supported: /// - alpn: all served domains must resolve to the host where this service is running. /// - dns: allows to request wildcard certificates, requires DNS backend to be configured. + /// - dns_persist: allows to request wildcard certificates and requires no DNS-interaction. #[clap(env, long, requires = "acme_cache_path")] pub acme_challenge: Option, @@ -393,7 +394,13 @@ pub struct Acme { #[clap(env, long)] pub acme_cache_path: Option, - /// DNS backend to use when using DNS challenge. Currently only "cloudflare" is supported. + /// ACME account credentials in JSON format. + /// If not provided - new account will be created. + #[clap(env, long)] + pub acme_account_creds: Option, + + /// DNS backend to use when using DNS challenge. + /// Currently only "cloudflare" is supported. #[clap(env, long, default_value = "cloudflare")] pub acme_dns_backend: DnsBackend, @@ -409,12 +416,12 @@ pub struct Acme { /// Asks ACME client to request a wildcard certificate for each of the domains configured. /// So in addition to `foo.app` the certificate will be also valid for `*.foo.app`. - /// For obvious reasons this works only with DNS challenge, has no effect with ALPN. + /// For obvious reasons this works only with DNS/DNS-PERSIST challenge, has no effect with ALPN. #[clap(env, long)] pub acme_wildcard: bool, /// Attempt to renew the certificates when less than this duration is left until expiration. - /// This works only with DNS challenge, ALPN currently starts to renew after half of certificate + /// This works only with DNS/DNS-PERSIST challenge, ALPN currently starts to renew after half of certificate /// lifetime has passed (45d for LetsEncrypt) #[clap(env, long, value_parser = parse_duration, default_value = "30d")] pub acme_renew_before: Duration, diff --git a/src/core.rs b/src/core.rs index 59e11ef..bfdd85c 100644 --- a/src/core.rs +++ b/src/core.rs @@ -363,7 +363,7 @@ pub async fn main( #[cfg(feature = "acme")] domains.clone(), #[cfg(feature = "acme")] - Arc::new(dns_resolver), + dns_resolver, certificate_providers, ®istry, ) diff --git a/src/log/mod.rs b/src/log/mod.rs index 2e5e797..f202321 100644 --- a/src/log/mod.rs +++ b/src/log/mod.rs @@ -1,9 +1,11 @@ -use std::time::{SystemTime, UNIX_EPOCH}; +use std::{ + os::unix::net::UnixDatagram, + time::{SystemTime, UNIX_EPOCH}, +}; use anyhow::{Context, Error}; use serde::ser::{SerializeMap, Serializer as _}; use serde_json::Serializer; -use std::os::unix::net::UnixDatagram; use tracing::{Event, Level, Subscriber}; use tracing_serde::AsSerde; use tracing_subscriber::{ diff --git a/src/metrics/mod.rs b/src/metrics/mod.rs index 34fe5f6..8106b41 100644 --- a/src/metrics/mod.rs +++ b/src/metrics/mod.rs @@ -33,14 +33,12 @@ use tracing::info; use crate::{ core::{ENV, HOSTNAME}, - routing::RemoteAddr, -}; - -use crate::routing::{ - CanisterId, RequestCtx, - error_cause::ErrorCause, - ic::{BNRequestMetadata, BNResponseMetadata, IcResponseStatus}, - middleware::{geoip::CountryCode, request_id::RequestId}, + routing::{ + CanisterId, RemoteAddr, RequestCtx, + error_cause::ErrorCause, + ic::{BNRequestMetadata, BNResponseMetadata, IcResponseStatus}, + middleware::{geoip::CountryCode, request_id::RequestId}, + }, }; const KB: f64 = 1024.0; diff --git a/src/metrics/runner.rs b/src/metrics/runner.rs index dc21c40..be6c256 100644 --- a/src/metrics/runner.rs +++ b/src/metrics/runner.rs @@ -17,7 +17,7 @@ use tikv_jemalloc_ctl::{epoch, stats}; use tokio_util::sync::CancellationToken; use tracing::{debug, warn}; -// https://prometheus.io/docs/instrumenting/exposition_formats/#basic-info +/// https://prometheus.io/docs/instrumenting/exposition_formats/#basic-info const PROMETHEUS_CONTENT_TYPE: &str = "text/plain; version=0.0.4"; pub struct MetricsCache { diff --git a/src/policy/mod.rs b/src/policy/mod.rs index 89a275a..84b3e81 100644 --- a/src/policy/mod.rs +++ b/src/policy/mod.rs @@ -16,5 +16,6 @@ pub fn load_principal_list(path: &PathBuf) -> Result, Error> .filter(|x| !x.trim().is_empty()) .map(Principal::from_text) .collect::, _>>()?; + Ok(set) } diff --git a/src/routing/ic/handler.rs b/src/routing/ic/handler.rs index 6426118..a4e07dd 100644 --- a/src/routing/ic/handler.rs +++ b/src/routing/ic/handler.rs @@ -12,6 +12,7 @@ use ic_bn_lib::http::{ }; use ic_http_gateway_protocol::{CanisterRequest, HttpGatewayClient, HttpGatewayRequestArgs}; +use super::{BNRequestMetadata, BNResponseMetadata}; use crate::routing::{ CanisterId, RequestCtx, error_cause::{CanisterError, ErrorCause}, @@ -22,8 +23,6 @@ use crate::routing::{ middleware::request_id::RequestId, }; -use super::{BNRequestMetadata, BNResponseMetadata}; - #[derive(derive_new::new)] pub struct HandlerState { client: HttpGatewayClient, diff --git a/src/routing/middleware/geoip.rs b/src/routing/middleware/geoip.rs index 06bbde5..fb352de 100644 --- a/src/routing/middleware/geoip.rs +++ b/src/routing/middleware/geoip.rs @@ -25,7 +25,7 @@ impl GeoIp { warn!( "GeoIP loaded with {} entries in {}s", - db.metadata.node_count, + db.metadata().node_count, start.elapsed().as_secs_f64() ); @@ -33,14 +33,10 @@ impl GeoIp { } pub fn lookup(&self, ip: IpAddr) -> Option { - let country: Option = self.db.lookup(ip) - .and_then(|r| r.decode()) - .ok() - .flatten(); + let country: Option = + self.db.lookup(ip).and_then(|r| r.decode()).ok().flatten(); - country.and_then(|x| { - x.country.iso_code.map(|code| CountryCode(code.into())) - }) + country.and_then(|x| x.country.iso_code.map(|code| CountryCode(code.into()))) } } diff --git a/src/tls/mod.rs b/src/tls/mod.rs index 917038e..ba20395 100644 --- a/src/tls/mod.rs +++ b/src/tls/mod.rs @@ -1,8 +1,6 @@ use std::sync::Arc; use anyhow::{Error, bail}; -#[cfg(feature = "acme")] -use ic_bn_lib::{dns::resolvers::Resolves, tls::acme::Challenge}; use ic_bn_lib::{ health::HealthManager, tasks::TaskManager, @@ -14,7 +12,6 @@ use ic_bn_lib::{ }; use prometheus::Registry; use rustls::server::ServerConfig; - #[cfg(feature = "acme")] use { anyhow::{Context, anyhow}, @@ -23,6 +20,11 @@ use { self, dns::{AcmeDns, TokenManagerDns}, }, + ic_bn_lib::{ + dns::resolvers::Resolver, + http::client::clients_reqwest, + tls::acme::{Challenge, TokenManager, TokenManagerNoop}, + }, rustls::server::ResolvesServerCert as ResolvesServerCertRustls, std::time::Duration, }; @@ -35,7 +37,7 @@ async fn setup_acme( tasks: &mut TaskManager, domains: Vec, challenge: &Challenge, - dns_resolver: Arc, + dns_resolver: Resolver, ) -> Result, Error> { let cache_path = cli.acme.acme_cache_path.clone().unwrap(); @@ -46,6 +48,10 @@ async fn setup_acme( domains.iter().map(|x| x.to_string()).collect::>(), cli.acme.acme_contact.clone(), cache_path, + cli.acme + .acme_account_creds + .as_ref() + .map(|x| x.as_bytes().to_vec()), None, ); @@ -55,29 +61,54 @@ async fn setup_acme( acme_alpn } - Challenge::Dns => { + Challenge::Dns | Challenge::DnsPersist => { use ic_bn_lib::tls::acme::DnsBackend; - let dns_backend = match cli.acme.acme_dns_backend { - DnsBackend::Cloudflare => { - use ic_bn_lib::tls::acme::DnsManager; - - let token = cli - .acme - .acme_dns_cloudflare_token - .clone() - .ok_or_else(|| anyhow!("Cloudflare token not defined"))?; - - Arc::new(acme::dns::cloudflare::Cloudflare::new( - cli.acme.acme_dns_cloudflare_url.clone(), - token, - )?) as Arc - } - - _ => bail!("unsupported DNS backend: {}", cli.acme.acme_dns_backend), + // Create a token manager for DNS challenge, or use a no-op one for DNS-PERSIST + let token_manager = if *challenge == Challenge::Dns { + let dns_backend = match cli.acme.acme_dns_backend { + DnsBackend::Cloudflare => { + use ic_bn_lib::tls::acme::dns::DnsManager; + + let token = cli + .acme + .acme_dns_cloudflare_token + .clone() + .ok_or_else(|| anyhow!("Cloudflare token not defined"))?; + + let http_client = clients_reqwest::new( + (&cli.http_client).into(), + Some(dns_resolver.clone()), + ) + .context("unable to create HTTP client for Cloudflare")?; + + Arc::new(acme::dns::cloudflare::Cloudflare::new_with_http_client( + cli.acme.acme_dns_cloudflare_url.clone(), + token, + http_client, + )) as Arc + } + + _ => bail!("unsupported DNS backend: {}", cli.acme.acme_dns_backend), + }; + + Arc::new(TokenManagerDns::new( + Arc::new(dns_resolver.clone()), + dns_backend, + None, + )) as Arc + } else { + Arc::new(TokenManagerNoop) }; - let token_manager = Arc::new(TokenManagerDns::new(dns_resolver, dns_backend, None)); + let account_credentials = if let Some(v) = &cli.acme.acme_account_creds { + Some( + serde_json::from_str(v) + .context("unable to parse ACME account credentials as JSON")?, + ) + } else { + None + }; let opts = acme::dns::Opts { acme_url: cli.acme.acme_url.clone(), @@ -85,12 +116,16 @@ async fn setup_acme( path: cache_path, wildcard: cli.acme.acme_wildcard, renew_before: cli.acme.acme_renew_before, - account_credentials: None, + account_credentials, token_manager, - insecure_tls: false, + contact: cli.acme.acme_contact.clone(), }; - let acme_dns = Arc::new(AcmeDns::new(opts).await.context("unable to init AcmeDns")?); + let acme_dns = Arc::new( + AcmeDns::new_with_http_opts(opts, (&cli.http_client).into(), dns_resolver) + .await + .context("unable to init AcmeDns")?, + ); tasks.add_interval("acme_dns_runner", acme_dns.clone(), Duration::from_mins(10)); acme_dns @@ -106,7 +141,7 @@ pub async fn setup( tasks: &mut TaskManager, health_manager: Arc, #[cfg(feature = "acme")] domains: Vec, - #[cfg(feature = "acme")] dns_resolver: Arc, + #[cfg(feature = "acme")] dns_resolver: Resolver, certificate_providers: Vec>, registry: &Registry, ) -> Result { diff --git a/tools/create_acme_account.rs b/tools/create_acme_account.rs index e8d4a25..d51256a 100644 --- a/tools/create_acme_account.rs +++ b/tools/create_acme_account.rs @@ -2,7 +2,7 @@ use ic_bn_lib::tls::acme::{AcmeUrl, client::ClientBuilder}; #[tokio::main] async fn main() { - let (_, creds) = ClientBuilder::new(false) + let (_, creds) = ClientBuilder::default() .with_acme_url(AcmeUrl::LetsEncryptStaging) .create_account("mailto:boundary-nodes@dfinity.org") .await From 66f56d1c72ad1ca3d39dbe5c6bc81e90eac502f1 Mon Sep 17 00:00:00 2001 From: Igor Novgorodov Date: Tue, 21 Jul 2026 11:00:56 +0000 Subject: [PATCH 3/4] Update crates --- Cargo.lock | 273 ++++++++++++++++++++++++++++------------------------- 1 file changed, 142 insertions(+), 131 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4b82612..5823284 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -129,9 +129,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "ar_archive_writer" @@ -209,7 +209,7 @@ dependencies = [ "nom 7.1.3", "num-traits", "rusticata-macros", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", ] @@ -344,13 +344,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.2", ] [[package]] @@ -395,9 +395,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.17.1" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4342d8937fc7e5dd9b1c60292261c0670c882a2cd1719cfc11b1af41731e32ad" +checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" dependencies = [ "aws-lc-sys", "untrusted 0.7.1", @@ -406,9 +406,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9ceb1da931507a12f4fccea479dccd00da1943e1b4ae72d8e502d707361444" +checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" dependencies = [ "cc", "cmake", @@ -781,7 +781,7 @@ dependencies = [ "ahash", "hashbrown 0.15.5", "once_cell", - "thiserror 2.0.18", + "thiserror 2.0.19", "web-time", ] @@ -858,9 +858,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.67" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38" +checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" dependencies = [ "find-msvc-tools", "jobserver", @@ -876,9 +876,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" @@ -969,9 +969,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.2" +version = "4.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011" +checksum = "0fb99565819980999fb7b4a1796046a5c949e6d4ff132cf5fadf5a641e20d776" dependencies = [ "clap_builder", "clap_derive", @@ -991,9 +991,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.1" +version = "4.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +checksum = "32f2392eae7f16557a3d727ef3a12e57b2b2ca6f98566a5f4fb41ffe305df077" dependencies = [ "heck", "proc-macro2", @@ -1811,9 +1811,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "ff" @@ -1955,9 +1955,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ "futures-channel", "futures-core", @@ -1970,9 +1970,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", "futures-sink", @@ -1980,15 +1980,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ "futures-core", "futures-task", @@ -1997,9 +1997,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" [[package]] name = "futures-lite" @@ -2016,9 +2016,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", @@ -2038,15 +2038,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-timer" @@ -2056,9 +2056,9 @@ checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-channel", "futures-core", @@ -2261,14 +2261,14 @@ dependencies = [ [[package]] name = "hdrhistogram" -version = "7.5.4" +version = "7.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +checksum = "f49d1053f4708f0af3cf9fc5bffc7e68a914a3c45becb231c80068c9c3f78bea" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "byteorder", "flate2", - "nom 7.1.3", + "nom 8.0.0", "num-traits", ] @@ -2326,14 +2326,14 @@ dependencies = [ "rustls", "rustls-pki-types", "rustls-platform-verifier", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tinyvec", "tokio", "tokio-rustls", "tracing", "url", - "webpki-roots 1.0.8", + "webpki-roots 1.0.9", ] [[package]] @@ -2353,7 +2353,7 @@ dependencies = [ "rand 0.10.2", "ring", "rustls-pki-types", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tinyvec", "tracing", @@ -2382,11 +2382,11 @@ dependencies = [ "rustls", "smallvec", "system-configuration", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tokio-rustls", "tracing", - "webpki-roots 1.0.8", + "webpki-roots 1.0.9", ] [[package]] @@ -2515,9 +2515,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", @@ -2551,7 +2551,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.8", + "webpki-roots 1.0.9", ] [[package]] @@ -2660,7 +2660,7 @@ dependencies = [ "serde_repr", "sha2 0.10.9", "stop-token", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tokio", "tower-service", @@ -2742,7 +2742,7 @@ dependencies = [ "systemstat", "tar", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tokio-io-timeout", "tokio-rustls", @@ -2917,7 +2917,7 @@ dependencies = [ "derive-new", "serde", "strum 0.28.0", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -2933,7 +2933,7 @@ dependencies = [ "ic_principal", "pem", "rand 0.8.7", - "thiserror 2.0.18", + "thiserror 2.0.19", "zeroize", ] @@ -2988,7 +2988,7 @@ dependencies = [ "sha2 0.11.0", "strum 0.28.0", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.19", "tikv-jemalloc-ctl", "tikv-jemallocator", "time", @@ -3161,7 +3161,7 @@ dependencies = [ "serde_cbor", "serde_repr", "sha2 0.10.9", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -3179,7 +3179,7 @@ dependencies = [ "serde_cbor", "serde_repr", "sha2 0.10.9", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -3200,7 +3200,7 @@ dependencies = [ "sha2 0.10.9", "strum 0.28.0", "strum_macros 0.28.0", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", ] @@ -3433,7 +3433,7 @@ dependencies = [ "rustls-pki-types", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", ] @@ -3542,7 +3542,7 @@ dependencies = [ "jni-sys", "log", "simd_cesu8", - "thiserror 2.0.18", + "thiserror 2.0.19", "walkdir", "windows-link", ] @@ -3719,9 +3719,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "22053b6a34f84abc97f9129e61334f40174659a1b9bd18c970b83db6a9a6348b" [[package]] name = "libm" @@ -3867,7 +3867,7 @@ dependencies = [ "log", "memchr", "serde", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -4490,7 +4490,7 @@ dependencies = [ "strum 0.26.3", "strum_macros 0.26.4", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tracing", "tracing-appender", @@ -4525,9 +4525,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" [[package]] name = "potential_utf" @@ -4627,9 +4627,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -4646,7 +4646,7 @@ dependencies = [ "memchr", "parking_lot", "protobuf", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -4755,7 +4755,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tracing", "web-time", @@ -4778,7 +4778,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.19", "tinyvec", "tracing", "web-time", @@ -4800,9 +4800,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -4993,27 +4993,27 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.2", ] [[package]] @@ -5114,7 +5114,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams 0.4.2", "web-sys", - "webpki-roots 1.0.8", + "webpki-roots 1.0.9", ] [[package]] @@ -5323,8 +5323,8 @@ dependencies = [ "rcgen 0.13.2", "serde", "serde_json", - "thiserror 2.0.18", - "webpki-roots 1.0.8", + "thiserror 2.0.19", + "webpki-roots 1.0.9", "x509-parser 0.16.0", ] @@ -5531,9 +5531,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -5561,22 +5561,22 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.2", ] [[package]] @@ -5592,9 +5592,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "itoa", "memchr", @@ -5616,13 +5616,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.2", ] [[package]] @@ -6083,6 +6083,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a207d6d6a2b7fc470b80443726053f18a2481b7e1eee970597051596567987a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -6196,11 +6207,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.19", ] [[package]] @@ -6216,13 +6227,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.2", ] [[package]] @@ -6267,9 +6278,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.53" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" dependencies = [ "deranged", "num-conv", @@ -6287,9 +6298,9 @@ checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.31" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -6353,9 +6364,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -6381,9 +6392,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ "proc-macro2", "quote", @@ -6554,7 +6565,7 @@ dependencies = [ "governor", "http 1.4.2", "pin-project", - "thiserror 2.0.18", + "thiserror 2.0.19", "tonic", "tower", "tracing", @@ -6580,7 +6591,7 @@ checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", "symlink", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tracing-subscriber", ] @@ -6657,9 +6668,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "twox-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +checksum = "8464ec13c3691491391d9fce00f6416c9a48e46972f72d7865688be2080192c9" [[package]] name = "typed-arena" @@ -6983,9 +6994,9 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.253.0" +version = "0.254.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59972d6cd272259de647b7c1f1912e45e289c75ffd4be04e10695507cd7e1b59" +checksum = "09480d646178e5fdd12bb06e812d0af9a3a191dbc9cd697fdc86687beade7393" dependencies = [ "leb128fmt", "wasmparser", @@ -7019,9 +7030,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.253.0" +version = "0.254.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19db11f87d2486580e1e8b6f494c54df7e0566b87d0b599db843c24019667339" +checksum = "d5769a29f799fbab136aaf65b4fe5384cd7d93fe6fc9ba0dcb6c8382a1f16e27" dependencies = [ "bitflags", "indexmap 2.14.0", @@ -7030,9 +7041,9 @@ dependencies = [ [[package]] name = "wast" -version = "253.0.0" +version = "254.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3264542f8965c5d84fb1085d924bfba9a6314bb228eff13a2de14d7627664d0" +checksum = "e7ed4dfc8f6b9fc38b231065e2cdfbf7359af5ab945990abf09658dcc63c3e32" dependencies = [ "bumpalo", "leb128fmt", @@ -7043,9 +7054,9 @@ dependencies = [ [[package]] name = "wat" -version = "1.253.0" +version = "1.254.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bfc5ce906144200c972ec617470aa35bd847472e170b26dde3e80541c674055" +checksum = "7127f7f9b8f127c879991cecd35f494e4628bae1b0874c681414d8d8831e952c" dependencies = [ "wast", ] @@ -7072,9 +7083,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" dependencies = [ "rustls-pki-types", ] @@ -7085,14 +7096,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.8", + "webpki-roots 1.0.9", ] [[package]] name = "webpki-roots" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -7357,7 +7368,7 @@ dependencies = [ "nom 7.1.3", "oid-registry 0.8.1", "rusticata-macros", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", ] @@ -7415,18 +7426,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.54" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.54" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" dependencies = [ "proc-macro2", "quote", From 5bd78e47d87e18cdb1a21dce82c1cd73331a971f Mon Sep 17 00:00:00 2001 From: Igor Novgorodov Date: Tue, 21 Jul 2026 13:19:53 +0000 Subject: [PATCH 4/4] Improve geoip --- src/routing/middleware/geoip.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/routing/middleware/geoip.rs b/src/routing/middleware/geoip.rs index fb352de..35c66e7 100644 --- a/src/routing/middleware/geoip.rs +++ b/src/routing/middleware/geoip.rs @@ -33,10 +33,8 @@ impl GeoIp { } pub fn lookup(&self, ip: IpAddr) -> Option { - let country: Option = - self.db.lookup(ip).and_then(|r| r.decode()).ok().flatten(); - - country.and_then(|x| x.country.iso_code.map(|code| CountryCode(code.into()))) + let country: Option = self.db.lookup(ip).ok()?.decode().ok()?; + Some(CountryCode(country?.country.iso_code?.into())) } }