From 17082597464198fe84be80313b7d51e1e57de639 Mon Sep 17 00:00:00 2001 From: salmonik Date: Sat, 28 Feb 2026 19:32:20 +0100 Subject: folder restructuring --- src/bin/server/args.rs | 41 ----------------------------- src/bin/server/database.rs | 31 ---------------------- src/bin/server/handler.rs | 64 ---------------------------------------------- src/bin/server/main.rs | 24 ----------------- src/bin/server/mod.rs | 3 --- 5 files changed, 163 deletions(-) delete mode 100644 src/bin/server/args.rs delete mode 100644 src/bin/server/database.rs delete mode 100644 src/bin/server/handler.rs delete mode 100644 src/bin/server/main.rs delete mode 100644 src/bin/server/mod.rs (limited to 'src/bin/server') diff --git a/src/bin/server/args.rs b/src/bin/server/args.rs deleted file mode 100644 index 31c0acc..0000000 --- a/src/bin/server/args.rs +++ /dev/null @@ -1,41 +0,0 @@ -pub struct Args { - pub ip: String, - pub port: u16, -} - -pub fn parse_args() -> Args { - let args: Vec = std::env::args().collect(); - let mut ip = "127.0.0.1".to_string(); - let mut port = 11525; - let mut i = 1; - while i < args.len() { - if args[i] == "-p" { - if i + 1 < args.len() { - port = args[i + 1].parse::().unwrap_or_else(|_| { - eprintln!("Invalid port number: {}", args[i + 1]); - std::process::exit(1); - }); - i += 2; - } else { - eprintln!("-p requires a port number"); - std::process::exit(1); - } - } else if args[i] == "-i" { - if i + 1 < args.len() { - ip = args[i + 1].clone(); - if ip != "127.0.0.1" && ip != "0.0.0.0" { - eprintln!("Invalid IP address: {}. Must be 127.0.0.1 or 0.0.0.0", ip); - std::process::exit(1); - } - i += 2; - } else { - eprintln!("-i requires an IP address"); - std::process::exit(1); - } - } else { - eprintln!("Unknown argument: {}", args[i]); - std::process::exit(1); - } - } - Args { ip, port } -} diff --git a/src/bin/server/database.rs b/src/bin/server/database.rs deleted file mode 100644 index 9c51997..0000000 --- a/src/bin/server/database.rs +++ /dev/null @@ -1,31 +0,0 @@ -use rusqlite::Connection; - -pub fn init_db() -> Connection { - let conn = Connection::open("server.db").unwrap(); - conn.execute( - "CREATE TABLE IF NOT EXISTS users ( - username TEXT PRIMARY KEY, - hashed_password TEXT NOT NULL - )", - [], - ).unwrap(); - conn -} - -pub fn add_user(conn: &Connection, username: &str, hashed_password: &str) -> Result<(), Box> { - conn.execute( - "INSERT INTO users (username, hashed_password) VALUES (?1, ?2)", - [username, hashed_password], - )?; - Ok(()) -} - -pub fn get_hashed_password(conn: &Connection, username: &str) -> Option { - let mut stmt = conn.prepare("SELECT hashed_password FROM users WHERE username = ?1").unwrap(); - let mut rows = stmt.query([username]).unwrap(); - if let Ok(Some(row)) = rows.next() { - row.get(0).ok() - } else { - None - } -} diff --git a/src/bin/server/handler.rs b/src/bin/server/handler.rs deleted file mode 100644 index 2132d09..0000000 --- a/src/bin/server/handler.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::io::{BufRead, BufReader, Write}; -use std::net::TcpStream; -use std::sync::Mutex; -use once_cell::sync::Lazy; -use rusqlite::Connection; -use crate::database; - -static DB_CONN: Lazy> = Lazy::new(|| Mutex::new(database::init_db())); - -pub fn handle_client(stream: TcpStream) { - let client_addr = stream.peer_addr().unwrap().to_string(); - let mut user = "guest".to_string(); - println!("[{} @ {}] Client connected", user, client_addr); - let reader_stream = stream.try_clone().unwrap(); - let reader = BufReader::new(reader_stream); - let mut writer = stream; - for line in reader.lines() { - let line = line.unwrap(); - println!("[{} @ {}] Received: {}", user, client_addr, line); - let response = process_message(&line, &mut user); - writeln!(writer, "{}", response).unwrap(); - } - println!("[{} @ {}] Client disconnected", user, client_addr); -} - -fn process_message(msg: &str, user: &mut String) -> String { - let parts: Vec<&str> = msg.splitn(3, ' ').collect(); - match parts[0] { - "REGISTER" => { - if parts.len() != 3 { - "FAIL Invalid REGISTER format".to_string() - } else { - let username = parts[1]; - let hashed_pass = parts[2]; - let db = DB_CONN.lock().unwrap(); - match database::add_user(&db, username, hashed_pass) { - Ok(_) => format!("OK Registered {}", username), - Err(_) => "FAIL User already exists".to_string(), - } - } - } - "AUTH" => { - if parts.len() != 3 { - "FAIL Invalid AUTH format".to_string() - } else { - let username = parts[1]; - let provided_hash = parts[2]; - let db = DB_CONN.lock().unwrap(); - if let Some(stored_hash) = database::get_hashed_password(&db, username) { - if provided_hash == stored_hash { - *user = username.to_string(); - format!("OK {}", username) - } else { - "FAIL Invalid credentials".to_string() - } - } else { - "FAIL User not found".to_string() - } - } - } - "PING" => "PING".to_string(), - _ => msg.to_string(), // Echo back for compatibility - } -} diff --git a/src/bin/server/main.rs b/src/bin/server/main.rs deleted file mode 100644 index 7693069..0000000 --- a/src/bin/server/main.rs +++ /dev/null @@ -1,24 +0,0 @@ -mod args; -mod handler; -mod database; - -use std::net::TcpListener; -use std::thread; - -fn main() { - let args = args::parse_args(); - let listener = match TcpListener::bind(format!("{}:{}", args.ip, args.port)) { - Ok(l) => l, - Err(e) => { - eprintln!("Failed to bind to {}:{}: {}", args.ip, args.port, e); - std::process::exit(1); - } - }; - println!("Server listening on {}", listener.local_addr().unwrap()); - for stream in listener.incoming() { - let stream = stream.unwrap(); - thread::spawn(move || { - handler::handle_client(stream); - }); - } -} diff --git a/src/bin/server/mod.rs b/src/bin/server/mod.rs deleted file mode 100644 index b2d622e..0000000 --- a/src/bin/server/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod args; -pub mod handler; -pub mod database; -- cgit v1.2.3