Merge PR #158: preserve Bitcoin Core Tor service naming
This commit is contained in:
@@ -377,6 +377,23 @@ async fn write_staged_torrc(content: &str, staging: &str) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod known_service_tests {
|
||||||
|
use super::{is_protocol_service, known_service_port};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bitcoin_core_is_a_protocol_service_on_the_p2p_port() {
|
||||||
|
// Regression: apps/bitcoin-core/manifest.yml uses id "bitcoin-core",
|
||||||
|
// distinct from the legacy "bitcoin"/"bitcoin-knots" ids. Missing
|
||||||
|
// here means auto-enrollment silently skips it (known_service_port
|
||||||
|
// returns 0) and, separately, regenerate_torrc falls back to the
|
||||||
|
// web-app HiddenServicePort-80 default instead of forwarding 8333
|
||||||
|
// straight through.
|
||||||
|
assert_eq!(known_service_port("bitcoin-core"), 8333);
|
||||||
|
assert!(is_protocol_service("bitcoin-core"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod torrc_tests {
|
mod torrc_tests {
|
||||||
use super::app_hidden_service_port_line;
|
use super::app_hidden_service_port_line;
|
||||||
@@ -594,7 +611,7 @@ fn is_valid_v3_onion(s: &str) -> bool {
|
|||||||
pub(in crate::api::rpc) fn known_service_port(name: &str) -> u16 {
|
pub(in crate::api::rpc) fn known_service_port(name: &str) -> u16 {
|
||||||
match name {
|
match name {
|
||||||
"archipelago" => 80,
|
"archipelago" => 80,
|
||||||
"bitcoin" | "bitcoin-knots" => 8333,
|
"bitcoin" | "bitcoin-core" | "bitcoin-knots" => 8333,
|
||||||
"electrs" | "electrumx" => 50001,
|
"electrs" | "electrumx" => 50001,
|
||||||
"lnd" => 8080,
|
"lnd" => 8080,
|
||||||
"btcpay" | "btcpay-server" | "btcpayserver" => 23000,
|
"btcpay" | "btcpay-server" | "btcpayserver" => 23000,
|
||||||
@@ -619,7 +636,7 @@ pub(in crate::api::rpc) fn known_service_port(name: &str) -> u16 {
|
|||||||
pub(in crate::api::rpc) fn is_protocol_service(name: &str) -> bool {
|
pub(in crate::api::rpc) fn is_protocol_service(name: &str) -> bool {
|
||||||
matches!(
|
matches!(
|
||||||
name,
|
name,
|
||||||
"bitcoin" | "bitcoin-knots" | "electrs" | "electrumx" | "lnd"
|
"bitcoin" | "bitcoin-core" | "bitcoin-knots" | "electrs" | "electrumx" | "lnd"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -657,9 +657,19 @@ fn apply_dynamic_metadata(app_id: &str, meta: &mut AppMetadata) {
|
|||||||
/// Map app_id to Tor hidden service directory name.
|
/// Map app_id to Tor hidden service directory name.
|
||||||
/// "archipelago" is the main web UI (nginx port 80).
|
/// "archipelago" is the main web UI (nginx port 80).
|
||||||
/// Supports container names from deploy (archy-*, btcpay-server, etc.).
|
/// Supports container names from deploy (archy-*, btcpay-server, etc.).
|
||||||
|
///
|
||||||
|
/// This must match what enrollment actually names the hidden service dir
|
||||||
|
/// with — both the install-time auto-enroll (`install.rs`) and the manual
|
||||||
|
/// `tor.create-service` RPC write `HiddenServiceDir` using the raw
|
||||||
|
/// `package_id`/`name` verbatim, with no canonicalization. So `bitcoin-core`
|
||||||
|
/// gets its own identity arm rather than folding into the "bitcoin" alias:
|
||||||
|
/// aliasing it here without also canonicalizing the write side would point
|
||||||
|
/// this lookup at `hidden_service_bitcoin`, which never gets created — the
|
||||||
|
/// on-disk dir is always `hidden_service_bitcoin-core` for this app id.
|
||||||
fn tor_service_name(app_id: &str) -> Option<&'static str> {
|
fn tor_service_name(app_id: &str) -> Option<&'static str> {
|
||||||
match app_id {
|
match app_id {
|
||||||
"archipelago" => Some("archipelago"),
|
"archipelago" => Some("archipelago"),
|
||||||
|
"bitcoin-core" => Some("bitcoin-core"),
|
||||||
"bitcoin" | "bitcoin-knots" | "bitcoind" => Some("bitcoin"),
|
"bitcoin" | "bitcoin-knots" | "bitcoind" => Some("bitcoin"),
|
||||||
"electrumx" | "electrs" | "electrum" => Some("electrumx"),
|
"electrumx" | "electrs" | "electrum" => Some("electrumx"),
|
||||||
"lnd" | "lnd-ui" => Some("lnd"),
|
"lnd" | "lnd-ui" => Some("lnd"),
|
||||||
@@ -906,6 +916,28 @@ mod launch_url_port_tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tor_service_name_tests {
|
||||||
|
use super::tor_service_name;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bitcoin_core_resolves_to_its_own_hidden_service_dir() {
|
||||||
|
// Regression: enrollment (install.rs, tor.create-service) writes
|
||||||
|
// HiddenServiceDir/tor-hostnames entries using the raw package_id
|
||||||
|
// verbatim, never canonicalized. Aliasing "bitcoin-core" to the
|
||||||
|
// shared "bitcoin" name here would point reads at a directory
|
||||||
|
// enrollment never creates.
|
||||||
|
assert_eq!(tor_service_name("bitcoin-core"), Some("bitcoin-core"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn legacy_bitcoin_ids_share_the_bitcoin_alias() {
|
||||||
|
assert_eq!(tor_service_name("bitcoin"), Some("bitcoin"));
|
||||||
|
assert_eq!(tor_service_name("bitcoin-knots"), Some("bitcoin"));
|
||||||
|
assert_eq!(tor_service_name("bitcoind"), Some("bitcoin"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod extract_lan_address_tests {
|
mod extract_lan_address_tests {
|
||||||
use super::extract_lan_address;
|
use super::extract_lan_address;
|
||||||
|
|||||||
Reference in New Issue
Block a user