From 1ff2c2120be3e12d1d1f5aba9029487147e0ce22 Mon Sep 17 00:00:00 2001 From: mux Date: Mon, 12 Aug 2024 11:58:37 +0200 Subject: [PATCH] added protocol header checking --- .vscode/launch.json | 72 +++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 +- src/tcp_server.rs | 78 ++++++++++++++++++++++++--------------------- 3 files changed, 115 insertions(+), 37 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..434fd91 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,72 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Launch", + "program": "${workspaceFolder}/", + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in library 'Uno'", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib", + "--package=Uno" + ], + "filter": { + "name": "Uno", + "kind": "lib" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug executable 'Uno'", + "cargo": { + "args": [ + "build", + "--bin=Uno", + "--package=Uno" + ], + "filter": { + "name": "Uno", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug unit tests in executable 'Uno'", + "cargo": { + "args": [ + "test", + "--no-run", + "--bin=Uno", + "--package=Uno" + ], + "filter": { + "name": "Uno", + "kind": "bin" + } + }, + "args": [], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index ca375f0..e61e3d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ pub mod tcp_server; fn main() { - println!("Hello, world!"); + tcp_server::main(); } diff --git a/src/tcp_server.rs b/src/tcp_server.rs index 9820be4..ea40213 100644 --- a/src/tcp_server.rs +++ b/src/tcp_server.rs @@ -1,51 +1,57 @@ use std::{ - net::{TcpListener, TcpStream}, - io::{prelude::*, BufReader, BufWriter}, + io::{ prelude::*, BufReader, BufWriter }, + net::{ TcpListener, TcpStream }, }; -fn main(){ - let listener = TcpListener::bind("0.0.0.0:8000").unwrap(); - - for stream in listener{ - let (reader, writer) = create_buffers(stream.unwrap()); +const PROTOCOL_ERROR_STRING: &str = "Client/Server protocol mismatch"; + +pub fn main() { + let listener = TcpListener::bind("0.0.0.0:8000").unwrap(); + + for stream in listener.incoming() { + let (reader, writer) = create_buffers(stream.unwrap().try_clone().unwrap()); let result = check_protocol(reader, writer).unwrap(); - if result.equals("Uno-Enthusiast99") { + if result == "Uno-Enthusiast99" { println!("It works!"); } - } - } -fn create_buffers(&mut stream : TcpStream) -> (BufReader, BufWriter) { - (BufReader::new(stream), BufWriter::new(stream)) - +fn create_buffers(stream: TcpStream) -> (BufReader, BufWriter) { + ( + BufReader::new(stream.try_clone().expect("Could not clone TcpStreams")), + BufWriter::new(stream), + ) } - fn check_protocol(&reader : BufReader, &writer : BufWriter) -> Result { - let init_message : Vec<_> = reader - .lines() - .map(|result| result.unwrap()) - .take_while(|line| !line.is_empty()) - .collect() - .iter(); - let mut is_valid = true; - is_valid = init_message.next().unwrap_or_else(|| "invalid") == "app:uno"; - is_valid = init_message.next().unwrap(|| "invalid") == "version:0.1"; - is_valid = init_message.next().unwrap(|| "invalid").contains("player_name:"); - if init_message.next() != None { - is_valid = false; - } - - if !is_valid { - writer.write("Error").unwrap(); - writer.flush().unwrap(); - return Err; - } - writer.write("Ok").unwrap(); +fn check_protocol( + reader: BufReader, + mut writer: BufWriter +) -> Result { + let protocol_error_string = PROTOCOL_ERROR_STRING.to_string(); + let init_message: Vec<_> = reader + .lines() + .map(|result| result.unwrap()) + .take_while(|line| !line.is_empty()) + .collect(); + let mut init_message = init_message.iter(); + let is_valid1 = init_message.next().unwrap_or_else(|| &protocol_error_string) == "app:uno"; + let is_valid2= init_message.next().unwrap_or_else(|| &protocol_error_string) == "version:0.1"; + let player_name: &str = init_message.next().unwrap_or_else(|| &protocol_error_string); + let is_valid3 = if player_name != "invalid" && player_name.contains("player_name:") { + true + } else { + false + }; + if init_message.next() != None || !(is_valid1 && is_valid2 && is_valid3){ + writer.write(protocol_error_string.as_bytes()).unwrap(); writer.flush().unwrap(); - Ok( item.split(':').unwrap() ) + return Err(protocol_error_string); } + writer.write("Ok".as_bytes()).unwrap(); + writer.flush().unwrap(); + return Ok(player_name.split(':').collect::>()[1].to_owned()); +} // fn register_player(player_name : &str, reader : BufReader, writer : BufWriter){ -// +// // }