From e3eed326068c0b1e4e53c46c7518c7bffabcbcb7 Mon Sep 17 00:00:00 2001 From: Nadav Ivgi Date: Tue, 23 Oct 2018 08:10:50 +0300 Subject: [PATCH] Verify addresses are on the correct network (cherry picked from commit a03724e6aaa4881577ccba8473b1431859148d2f) --- src/daemon.rs | 2 +- src/rest.rs | 12 ++++++++---- src/util.rs | 8 ++++++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/daemon.rs b/src/daemon.rs index 98ad76c..a58ade1 100644 --- a/src/daemon.rs +++ b/src/daemon.rs @@ -18,7 +18,7 @@ use util::HeaderList; use errors::*; -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Copy, Clone, PartialEq)] pub enum Network { Bitcoin, Testnet, diff --git a/src/rest.rs b/src/rest.rs index 2277306..15a51c7 100644 --- a/src/rest.rs +++ b/src/rest.rs @@ -20,7 +20,7 @@ use std::str::FromStr; use std::thread; use std::sync::Arc; use daemon::Network; -use util::{FullHash, BlockHeaderMeta, TransactionStatus, script_to_address}; +use util::{FullHash, BlockHeaderMeta, TransactionStatus, script_to_address, from_bitcoin_network}; use index::compute_script_hash; const TX_LIMIT: usize = 50; @@ -336,7 +336,7 @@ fn handle_request(req: Request, query: &Arc, network: &Network) -> json_response(txs) }, (&Method::GET, Some(&"address"), Some(address), None, None) => { - let script_hash = address_to_scripthash(address)?; + let script_hash = address_to_scripthash(address, &network)?; let status = query.status(&script_hash[..])?; // @TODO create new AddressStatsValue struct? json_response(json!({ "address": address, "tx_count": status.history().len(), })) @@ -346,7 +346,7 @@ fn handle_request(req: Request, query: &Arc, network: &Network) -> .map_or(0u32, |el| el.parse().unwrap_or(0)) .max(0u32) as usize; - let script_hash = address_to_scripthash(address)?; + let script_hash = address_to_scripthash(address, &network)?; let status = query.status(&script_hash[..])?; let txs = status.history_txs(); @@ -427,8 +427,12 @@ fn blocks(query: &Arc, start_height: Option) json_response(values) } -fn address_to_scripthash(addr: &str) -> Result { +fn address_to_scripthash(addr: &str, network: &Network) -> Result { let addr = Address::from_str(addr)?; + let addr_network = from_bitcoin_network(&addr.network); + if addr_network != *network && !(addr_network == Network::Testnet && *network == Network::LiquidRegtest) { + return Err(StringError("Address on invalid network".to_string())) + } Ok(compute_script_hash(&addr.script_pubkey().into_bytes())) } diff --git a/src/util.rs b/src/util.rs index 0aaa0c9..8e19809 100644 --- a/src/util.rs +++ b/src/util.rs @@ -366,3 +366,11 @@ fn to_bech_network (network: &Network) -> B32Network { } } +// @FIXME +pub fn from_bitcoin_network (network: &BNetwork) -> Network { + match network { + BNetwork::Bitcoin => Network::Liquid, + BNetwork::Regtest => Network::LiquidRegtest, + BNetwork::Testnet => Network::Testnet, + } +}