From 6e8d6c31fb1391963e1166306410fe8589f7d810 Mon Sep 17 00:00:00 2001 From: reverse Date: Tue, 25 Aug 2026 00:06:22 +0000 Subject: [PATCH] snoop: connect notice includes port, sni and account (present fields only) --- src/link.rs | 2 ++ src/modules/reputation.rs | 1 + src/modules/snoop.rs | 27 +++++++++++++++++++++------ src/s2s_sim.rs | 1 + src/server.rs | 2 ++ src/users.rs | 1 + 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/link.rs b/src/link.rs index cfbc358..21703f7 100644 --- a/src/link.rs +++ b/src/link.rs @@ -2828,6 +2828,7 @@ mod tests { secure: false, certfp: None, tls_info: None, + sni: None, brand_server: None, brand_network: None, account: None, @@ -2920,6 +2921,7 @@ mod tests { secure: false, certfp: None, tls_info: None, + sni: None, brand_server: None, brand_network: None, account: None, diff --git a/src/modules/reputation.rs b/src/modules/reputation.rs index 19d44c1..6fd51ab 100644 --- a/src/modules/reputation.rs +++ b/src/modules/reputation.rs @@ -375,6 +375,7 @@ mod tests { secure: false, certfp: None, tls_info: None, + sni: None, brand_server: None, brand_network: None, account: Some("reverse".into()), diff --git a/src/modules/snoop.rs b/src/modules/snoop.rs index 846b537..7b5b967 100644 --- a/src/modules/snoop.rs +++ b/src/modules/snoop.rs @@ -12,15 +12,30 @@ impl Module for Snoop { "snoop" } fn on_user_connect(&mut self, srv: &mut Server, uid: Uid) { - let info = srv - .users - .get(&uid) - .map(|u| (u.nick.clone(), u.ident.clone(), u.host.clone())); - if let Some((nick, ident, host)) = info { + let info = srv.users.get(&uid).map(|u| { + ( + u.nick.clone(), + u.ident.clone(), + u.host.clone(), + u.port, + u.sni.clone(), + u.account.clone(), + ) + }); + if let Some((nick, ident, host, port, sni, account)) = info { if srv.conf_bool("snoop_stderr", false) { eprintln!("[snoop] connect {nick} ({ident}@{host})"); } - srv.snotice_c('c', &format!("Client connecting: {nick} ({ident}@{host})")); + // port is always shown; sni/account only when present, so plaintext or + // anonymous connects don't carry empty fields. + let mut extra = format!(", port: {port}"); + if let Some(sni) = &sni { + extra.push_str(&format!(", sni: {sni}")); + } + if let Some(acct) = &account { + extra.push_str(&format!(", account: {acct}")); + } + srv.snotice_c('c', &format!("Client connecting: {nick} ({ident}@{host}){extra}")); } } fn on_join(&mut self, srv: &mut Server, uid: Uid, chan: &str) { diff --git a/src/s2s_sim.rs b/src/s2s_sim.rs index bbfab85..8270a32 100644 --- a/src/s2s_sim.rs +++ b/src/s2s_sim.rs @@ -75,6 +75,7 @@ impl Node { secure: false, certfp: None, tls_info: None, + sni: None, brand_server: None, brand_network: None, account: None, diff --git a/src/server.rs b/src/server.rs index efc71c5..02d85ea 100644 --- a/src/server.rs +++ b/src/server.rs @@ -412,6 +412,7 @@ impl Server { secure, certfp, tls_info, + sni, brand_server, brand_network, account: None, @@ -1585,6 +1586,7 @@ mod tests { secure: false, certfp: None, tls_info: None, + sni: None, brand_server: None, brand_network: None, account: None, diff --git a/src/users.rs b/src/users.rs index 96d3939..9483c7f 100644 --- a/src/users.rs +++ b/src/users.rs @@ -231,6 +231,7 @@ pub struct User { pub secure: bool, // connected over TLS (drives WHOIS 671 / sslinfo) pub certfp: Option, // TLS client-cert fingerprint (SASL EXTERNAL / CertFP) pub tls_info: Option, // negotiated TLS version/group/cipher (WHOIS 671) + pub sni: Option, // TLS SNI hostname the client requested (connect notice) pub brand_server: Option, // per-SNI display server name (None = global) pub brand_network: Option, // per-SNI display network name (None = global) pub account: Option, // logged-in account name (set by services)