use std::net::SocketAddr;
use crate::config::types::{Reach, ServerConfig};
pub(super) fn validate_open_mode(config: &ServerConfig, errors: &mut Vec<String>) {
if config.auth.is_some() {
if config.open.is_some() {
errors.push(
"[open] names an exchange with no [auth]; this configuration has [auth], remove one"
.to_owned(),
);
}
return;
}
if config.open_reach() == Reach::Network {
return;
}
refuse_off_loopback("listen_address", config.listen_address, errors);
for (index, address) in config.extra_listen_addresses.iter().enumerate() {
refuse_off_loopback(
&format!("extra_listen_addresses[{index}]"),
*address,
errors,
);
}
if let Some(websocket) = config.websocket.as_ref() {
refuse_off_loopback("websocket.listen_address", websocket.listen_address, errors);
}
}
fn refuse_off_loopback(field: &str, address: SocketAddr, errors: &mut Vec<String>) {
if address.ip().is_loopback() {
return;
}
errors.push(format!(
"open mode (no [auth]): {field} {address} is not loopback; an exchange with no [auth] \
listens on loopback only, give [auth] to listen elsewhere"
));
}