Skip to content

Commit fe6e965

Browse files
Mariusz Reichertm-reichert
authored andcommitted
RPC logging parameters refactoring
1 parent a741f23 commit fe6e965

File tree

3 files changed

+45
-64
lines changed

3 files changed

+45
-64
lines changed

src/config.rs

Lines changed: 32 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub struct Config {
4040
pub utxos_limit: usize,
4141
pub electrum_txs_limit: usize,
4242
pub electrum_banner: String,
43-
pub rpc_logging_modes: Option<RpcLoggingModes>,
43+
pub rpc_logging: RpcLogging,
4444
pub zmq_addr: Option<SocketAddr>,
4545

4646
/// Enable compaction during initial sync
@@ -74,10 +74,6 @@ fn str_to_socketaddr(address: &str, what: &str) -> SocketAddr {
7474
impl Config {
7575
pub fn from_args() -> Config {
7676
let network_help = format!("Select network type ({})", Network::names().join(", "));
77-
let rpc_logging_help = format!(
78-
"Select possible RPC logging options: {}",
79-
RpcLoggingModes::get_modes().join(", ")
80-
);
8177

8278
let args = App::new("Electrum Rust Server")
8379
.version(crate_version!())
@@ -201,12 +197,20 @@ impl Config {
201197
.help("Welcome banner for the Electrum server, shown in the console to clients.")
202198
.takes_value(true)
203199
).arg(
204-
Arg::with_name("rpc_logging_modes")
205-
.long("electrum-rpc-logging")
206-
.help(&rpc_logging_help)
207-
.takes_value(true)
208-
.multiple(true)
209-
.possible_values(&RpcLoggingModes::get_modes()),
200+
Arg::with_name("enable_json_rpc_logging")
201+
.long("enable-json-rpc-logging")
202+
.help("turns on rpc logging")
203+
.takes_value(false)
204+
).arg(
205+
Arg::with_name("hide_json_rpc_logging_parameters")
206+
.long("hide-json-rpc-logging-parameters")
207+
.help("disables parameter printing in rpc logs")
208+
.takes_value(false)
209+
).arg(
210+
Arg::with_name("anonymize_json_rpc_logging_source_ip")
211+
.long("anonymize-json-rpc-logging-source-ip")
212+
.help("enables ip anonymization in rpc logs")
213+
.takes_value(false)
210214
).arg(
211215
Arg::with_name("initial_sync_compaction")
212216
.long("initial-sync-compaction")
@@ -429,10 +433,15 @@ impl Config {
429433
electrum_rpc_addr,
430434
electrum_txs_limit: value_t_or_exit!(m, "electrum_txs_limit", usize),
431435
electrum_banner,
432-
rpc_logging_modes: m.values_of("rpc_logging_modes").map(|vals| {
433-
let collected = vals.collect::<Vec<_>>();
434-
RpcLoggingModes::from_values(&collected)
435-
}),
436+
rpc_logging: {
437+
let params = RpcLogging {
438+
enabled: m.is_present("enable_json_rpc_logging"),
439+
hide_params: m.is_present("hide_json_rpc_logging_parameters"),
440+
anonymize_ip: m.is_present("anonymize_json_rpc_logging_source_ip"),
441+
};
442+
params.validate();
443+
params
444+
},
436445
http_addr,
437446
http_socket_file,
438447
monitoring_addr,
@@ -475,38 +484,17 @@ impl Config {
475484
}
476485

477486
#[derive(Debug, Default, Clone)]
478-
pub struct RpcLoggingModes {
479-
pub with_params: bool,
480-
pub anonymised: bool,
487+
pub struct RpcLogging {
488+
pub enabled: bool,
489+
pub hide_params: bool,
490+
pub anonymize_ip: bool,
481491
}
482492

483-
impl RpcLoggingModes {
484-
pub fn from_values(values: &[&str]) -> Self {
485-
let mut modes = Self::default();
486-
let mut no_params = false;
487-
488-
for v in values {
489-
match *v {
490-
"with-params" => modes.with_params = true,
491-
"no-params" => no_params = true,
492-
"anonymised" => modes.anonymised = true,
493-
_ => panic!("Unsupported RPC logging option: {}", v),
494-
}
495-
}
496-
497-
if modes.with_params && no_params {
498-
panic!("Contradiction: 'with-params' and 'no-params' cannot both be set.");
499-
}
500-
501-
if no_params {
502-
modes.with_params = false;
493+
impl RpcLogging {
494+
pub fn validate(&self) {
495+
if !self.enabled && (self.hide_params || self.anonymize_ip) {
496+
panic!("Flags '--hide-json-rpc-logging-parameters' or '--anonymize-json-rpc-logging-source-ip' require '--enable-json-rpc-logging'");
503497
}
504-
505-
modes
506-
}
507-
508-
pub fn get_modes() -> Vec<&'static str> {
509-
vec!["with-params", "no-params", "anonymised"]
510498
}
511499
}
512500

src/electrum/server.rs

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use bitcoin::consensus::encode::serialize_hex;
2020
#[cfg(feature = "liquid")]
2121
use elements::encode::serialize_hex;
2222
use crate::chain::Txid;
23-
use crate::config::{Config, RpcLoggingModes};
23+
use crate::config::{Config, RpcLogging};
2424
use crate::electrum::{get_electrum_height, ProtocolVersion};
2525
use crate::errors::*;
2626
use crate::metrics::{Gauge, HistogramOpts, HistogramVec, MetricOpts, Metrics};
@@ -94,7 +94,7 @@ fn get_status_hash(txs: Vec<(Txid, Option<BlockId>)>, query: &Query) -> Option<F
9494

9595
macro_rules! conditionally_log_rpc_event {
9696
($self:ident, $event:expr) => {
97-
if $self.rpc_logging_modes.is_some() {
97+
if $self.rpc_logging.enabled {
9898
$self.log_rpc_event($event);
9999
}
100100
};
@@ -111,7 +111,7 @@ struct Connection {
111111
txs_limit: usize,
112112
#[cfg(feature = "electrum-discovery")]
113113
discovery: Option<Arc<DiscoveryManager>>,
114-
rpc_logging_modes: Option<RpcLoggingModes>,
114+
rpc_logging: RpcLogging,
115115
salt: String,
116116
}
117117

@@ -124,7 +124,7 @@ impl Connection {
124124
stats: Arc<Stats>,
125125
txs_limit: usize,
126126
#[cfg(feature = "electrum-discovery")] discovery: Option<Arc<DiscoveryManager>>,
127-
rpc_logging_modes: Option<RpcLoggingModes>,
127+
rpc_logging: RpcLogging,
128128
salt: String,
129129
) -> Connection {
130130
Connection {
@@ -138,7 +138,7 @@ impl Connection {
138138
txs_limit,
139139
#[cfg(feature = "electrum-discovery")]
140140
discovery,
141-
rpc_logging_modes,
141+
rpc_logging,
142142
salt,
143143
}
144144
}
@@ -535,9 +535,8 @@ impl Connection {
535535
}
536536

537537
fn log_rpc_event(&self, mut log: Value) {
538-
let anonymize_ip = matches!(&self.rpc_logging_modes, Some(modes) if modes.anonymised);
539538
let real_ip = self.addr.ip().to_string();
540-
let ip_to_log = if anonymize_ip {
539+
let ip_to_log = if self.rpc_logging.anonymize_ip {
541540
self.hash_ip_with_salt(&real_ip)
542541
} else {
543542
real_ip
@@ -617,18 +616,11 @@ impl Connection {
617616
"event": "rpc request",
618617
"id": id,
619618
"method": method,
620-
"params": match &self.rpc_logging_modes {
621-
Some(modes) => {
622-
if modes.with_params {
623-
json!(params)
624-
} else {
625-
Value::Null
626-
}
627-
}
628-
None => {
619+
"params": if self.rpc_logging.hide_params {
629620
Value::Null
621+
} else {
622+
json!(params)
630623
}
631-
}
632624
})
633625
);
634626

@@ -876,7 +868,7 @@ impl RPC {
876868
let query = Arc::clone(&query);
877869
let stats = Arc::clone(&stats);
878870
let garbage_sender = garbage_sender.clone();
879-
let rpc_logging_modes = config.rpc_logging_modes.clone();
871+
let rpc_logging = config.rpc_logging.clone();
880872
#[cfg(feature = "electrum-discovery")]
881873
let discovery = discovery.clone();
882874

@@ -896,7 +888,7 @@ impl RPC {
896888
txs_limit,
897889
#[cfg(feature = "electrum-discovery")]
898890
discovery,
899-
rpc_logging_modes,
891+
rpc_logging,
900892
salt,
901893
);
902894
conn.run(receiver);

tests/common.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use electrs::{
2727
rest,
2828
signal::Waiter,
2929
};
30+
use electrs::config::RpcLogging;
3031

3132
pub struct TestRunner {
3233
config: Arc<Config>,
@@ -109,7 +110,7 @@ impl TestRunner {
109110
utxos_limit: 100,
110111
electrum_txs_limit: 100,
111112
electrum_banner: "".into(),
112-
rpc_logging_modes: None,
113+
rpc_logging: RpcLogging::default(),
113114
zmq_addr: None,
114115

115116
#[cfg(feature = "liquid")]

0 commit comments

Comments
 (0)