Added allowed ip ranges

master
Wynd 2026-02-22 13:49:24 +02:00
parent 0498891aa9
commit 28ede25da8
4 changed files with 35 additions and 2 deletions

7
Cargo.lock generated
View File

@ -136,6 +136,12 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "ipnet"
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]] [[package]]
name = "is_terminal_polyfill" name = "is_terminal_polyfill"
version = "1.70.2" version = "1.70.2"
@ -223,6 +229,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"clap", "clap",
"env_logger", "env_logger",
"ipnet",
"log", "log",
] ]

View File

@ -21,4 +21,5 @@ uninlined_format_args = { level = "warn" }
[dependencies] [dependencies]
clap = { version = "4.5.60", features = ["derive"] } clap = { version = "4.5.60", features = ["derive"] }
env_logger = "0.11.9" env_logger = "0.11.9"
ipnet = "2.11.0"
log = "0.4.29" log = "0.4.29"

View File

@ -11,4 +11,7 @@ pub struct CliArgs {
#[arg(short, long, num_args(0..), value_hint = ValueHint::DirPath)] #[arg(short, long, num_args(0..), value_hint = ValueHint::DirPath)]
pub export: String, pub export: String,
#[arg(short, long, num_args(0..))]
pub allowed_devices: Option<Vec<String>>,
} }

View File

@ -24,13 +24,14 @@ fn main() -> Result<()> {
let ip = args.ip.unwrap_or_default(); let ip = args.ip.unwrap_or_default();
let port = args.port.unwrap_or_default(); let port = args.port.unwrap_or_default();
let export = args.export; let export = args.export;
let allowed = args.allowed_devices;
let socket = SocketAddr::from_str(&format!("{ip}:{port}")).unwrap(); let socket = SocketAddr::from_str(&format!("{ip}:{port}")).unwrap();
let listener = TcpListener::bind(socket).unwrap(); let listener = TcpListener::bind(socket).unwrap();
for stream in listener.incoming() { for stream in listener.incoming() {
match stream { match stream {
Ok(conn) => handle_connection(conn, export.clone())?, Ok(conn) => handle_connection(conn, export.clone(), allowed.clone())?,
Err(e) => eprintln!("Something went wrong while listening {e}"), Err(e) => eprintln!("Something went wrong while listening {e}"),
} }
} }
@ -38,10 +39,31 @@ fn main() -> Result<()> {
Ok(()) Ok(())
} }
fn handle_connection(mut conn: TcpStream, export: String) -> Result<()> { fn handle_connection(
mut conn: TcpStream,
export: String,
allowed_devices: Option<Vec<String>>,
) -> Result<()> {
let mut paths = vec![]; let mut paths = vec![];
let mut buffer = ByteBuffer::default(); let mut buffer = ByteBuffer::default();
if let Some(allowed_devices) = allowed_devices {
let remote_ip = conn
.peer_addr()
.expect("Could not get remote IP address")
.ip();
for allowed in allowed_devices {
let allowed_net = ipnet::IpNet::from_str(&allowed).unwrap();
let is_allowed = allowed_net.contains(&remote_ip);
if !is_allowed {
log::error!("{remote_ip} tried to connect but is not allowed");
return Ok(());
}
}
}
walk_dir(&export, &mut paths); walk_dir(&export, &mut paths);
log::info!("Sending {} files", paths.len()); log::info!("Sending {} files", paths.len());