diff --git a/.version b/.version index 44926a130020..bd6304046560 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -v26.04.1 +v26.04.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 997852b8d432..fbe6f8d0919c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [26.04.2] - 2026-06-24: "Negative Routing Fees III" + +This point release if recommended for all minimal OS setups, including docker images, that have no root certificates for TLS installed. + +### Fixed + + - cln-currencyrate: include root certificates to fix the `builder error` on OS's without root certificates. ([9251]) + +[#9251]: https://github.com/ElementsProject/lightning/pull/9251 +[26.04.2]: https://github.com/ElementsProject/lightning/releases/tag/v26.04.2 + ## [26.04.1] - 2026-04-25: "Negative Routing Fees II" This point release is recommended: it fixes a build failure in some environments and a gossip protocol issue. diff --git a/Cargo.lock b/Cargo.lock index 8b5e1e96d914..783d6f04166c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -456,6 +456,7 @@ dependencies = [ "serde", "serde_json", "tokio", + "webpki-roots 1.0.8", ] [[package]] @@ -2208,7 +2209,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] @@ -2221,6 +2222,7 @@ dependencies = [ "base64 0.22.1", "bytes", "futures-core", + "h2 0.4.13", "http 1.4.0", "http-body 1.0.1", "http-body-util", @@ -3582,6 +3584,15 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi-util" version = "0.1.11" diff --git a/contrib/pyln-client/pyln/client/__init__.py b/contrib/pyln-client/pyln/client/__init__.py index ad8c178334b6..79e4d6d270f6 100644 --- a/contrib/pyln-client/pyln/client/__init__.py +++ b/contrib/pyln-client/pyln/client/__init__.py @@ -4,7 +4,7 @@ from .gossmapstats import GossmapStats from .version import NodeVersion -__version__ = "v26.04.1" +__version__ = "v26.04.2" __all__ = [ "LightningRpc", diff --git a/contrib/pyln-client/pyproject.toml b/contrib/pyln-client/pyproject.toml index 1ebd0d5b9f01..798f0952b95c 100644 --- a/contrib/pyln-client/pyproject.toml +++ b/contrib/pyln-client/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pyln-client" -version = "v26.04.1" +version = "v26.04.2" description = "Client library and plugin library for Core Lightning" authors = [{ name = "Christian Decker", email = "decker.christian@gmail.com" }] license = { text = "BSD-MIT" } diff --git a/contrib/pyln-proto/pyln/proto/__init__.py b/contrib/pyln-proto/pyln/proto/__init__.py index 7faaea882a2d..172cf9e86001 100644 --- a/contrib/pyln-proto/pyln/proto/__init__.py +++ b/contrib/pyln-proto/pyln/proto/__init__.py @@ -4,7 +4,7 @@ from .onion import OnionPayload, TlvPayload, LegacyOnionPayload from .wire import LightningConnection, LightningServerSocket -__version__ = "v26.04.1" +__version__ = "v26.04.2" __all__ = [ "Invoice", diff --git a/contrib/pyln-proto/pyproject.toml b/contrib/pyln-proto/pyproject.toml index 3edf9fcdedf6..349666e4e8cd 100644 --- a/contrib/pyln-proto/pyproject.toml +++ b/contrib/pyln-proto/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pyln-proto" -version = "v26.04.1" +version = "v26.04.2" description = "This package implements some of the Lightning Network protocol in pure python. It is intended for protocol testing and some minor tooling only. It is not deemed secure enough to handle any amount of real funds (you have been warned!)." authors = [ {name = "Christian Decker", email = "decker.christian@gmail.com"} diff --git a/contrib/pyln-testing/pyln/testing/__init__.py b/contrib/pyln-testing/pyln/testing/__init__.py index 460b2a05ba29..06f3a9a0d5ee 100644 --- a/contrib/pyln-testing/pyln/testing/__init__.py +++ b/contrib/pyln-testing/pyln/testing/__init__.py @@ -1,4 +1,4 @@ -__version__ = "v26.04.1" +__version__ = "v26.04.2" __all__ = [ "__version__", diff --git a/contrib/pyln-testing/pyproject.toml b/contrib/pyln-testing/pyproject.toml index b2cabca5e386..62cc1534d3c9 100644 --- a/contrib/pyln-testing/pyproject.toml +++ b/contrib/pyln-testing/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pyln-testing" -version = "v26.04.1" +version = "v26.04.2" description = "Test your Core Lightning integration, plugins or whatever you want" authors = [{ name = "Christian Decker", email = "decker.christian@gmail.com" }] license = { text = "BSD-MIT" } diff --git a/plugins/currencyrate-plugin/Cargo.toml b/plugins/currencyrate-plugin/Cargo.toml index 974fac7ffd82..29521635c2ee 100644 --- a/plugins/currencyrate-plugin/Cargo.toml +++ b/plugins/currencyrate-plugin/Cargo.toml @@ -22,6 +22,7 @@ reqwest = { version = "0.13", default-features = false, features = [ "rustls-no-provider", "socks", "json", + "http2", ] } rustls = { version = "0.23", default-features = false, features = [ "logging", @@ -29,6 +30,7 @@ rustls = { version = "0.23", default-features = false, features = [ "std", "ring", ] } +webpki-roots = "1" futures = "0.3" diff --git a/plugins/currencyrate-plugin/src/main.rs b/plugins/currencyrate-plugin/src/main.rs index e03d0bbdf138..7362c96b7304 100644 --- a/plugins/currencyrate-plugin/src/main.rs +++ b/plugins/currencyrate-plugin/src/main.rs @@ -90,17 +90,27 @@ median from currencyrates results", let proxy = match check_proxy_config(&plugin).await { Ok(o) => o, - Err(e) => return plugin.disable(&e.to_string()).await, + Err(e) => { + return plugin.disable(&format!("Error in proxy config: {e}")).await; + } }; let sources = match gather_sources(&plugin, proxy.is_some()) { Ok(o) => o, - Err(e) => return plugin.disable(&e.to_string()).await, + Err(e) => { + return plugin + .disable(&format!("Error in sources config: {e}")) + .await; + } }; let price_oracle = match BtcPriceOracle::new(proxy, sources) { Ok(o) => o, - Err(e) => return plugin.disable(&e.to_string()).await, + Err(e) => { + return plugin + .disable(&format!("Error creating price oracle: {e}")) + .await; + } }; let plugin_state = PluginState { diff --git a/plugins/currencyrate-plugin/src/oracle.rs b/plugins/currencyrate-plugin/src/oracle.rs index 7145c4ff86db..7d268a84fa3c 100644 --- a/plugins/currencyrate-plugin/src/oracle.rs +++ b/plugins/currencyrate-plugin/src/oracle.rs @@ -2,6 +2,7 @@ use anyhow::anyhow; use futures::future::join_all; use reqwest::header::{HeaderMap, HeaderValue, USER_AGENT}; use reqwest::{Client, Proxy}; +use rustls::ClientConfig; use serde_json::Value; use std::cmp::Reverse; use std::collections::HashMap; @@ -244,9 +245,17 @@ impl BtcPriceOracle { let mut headers = HeaderMap::new(); headers.insert(USER_AGENT, HeaderValue::from_static("cln-currencyrate")); + let root_store = rustls::RootCertStore { + roots: webpki_roots::TLS_SERVER_ROOTS.to_vec(), + }; + + let tls = ClientConfig::builder() + .with_root_certificates(root_store) + .with_no_client_auth(); + let mut client = Client::builder() .default_headers(headers) - .tls_backend_rustls() + .tls_backend_preconfigured(tls) .timeout(SOURCE_TIMEOUT_SECS) .pool_max_idle_per_host(5); @@ -257,7 +266,9 @@ impl BtcPriceOracle { client = client.proxy(proxy); } - let client = client.build()?; + let client = client + .build() + .map_err(|e| anyhow!("HTTP client failed to build: {:?}", e.source()))?; let mut map = HashMap::new(); for s in sources { diff --git a/tools/reckless b/tools/reckless index 8154ef668e9e..e0eb5197f2fd 100755 --- a/tools/reckless +++ b/tools/reckless @@ -21,7 +21,7 @@ from urllib.error import HTTPError import venv -__VERSION__ = 'v26.04.1' +__VERSION__ = 'v26.04.2' logging.basicConfig( level=logging.INFO, diff --git a/uv.lock b/uv.lock index 8d015975243a..380384862132 100644 --- a/uv.lock +++ b/uv.lock @@ -1392,7 +1392,7 @@ dev = [{ name = "pyln-proto", editable = "contrib/pyln-proto" }] [[package]] name = "pyln-client" -version = "26.4.1" +version = "26.4.2" source = { editable = "contrib/pyln-client" } dependencies = [ { name = "pyln-bolt7" }, @@ -1450,7 +1450,7 @@ dev = [ [[package]] name = "pyln-proto" -version = "26.4.1" +version = "26.4.2" source = { editable = "contrib/pyln-proto" } dependencies = [ { name = "base58" }, @@ -1479,7 +1479,7 @@ dev = [{ name = "pytest", specifier = ">=8.0.0" }] [[package]] name = "pyln-testing" -version = "26.4.1" +version = "26.4.2" source = { editable = "contrib/pyln-testing" } dependencies = [ { name = "cheroot" },