From b3de7670f379f60f4e956c43029c0054ac8110ce Mon Sep 17 00:00:00 2001 From: michael-bailey Date: Thu, 27 Aug 2020 18:47:59 +0100 Subject: [PATCH] got running flag to display --- Cargo.toml | 3 + src/main.rs | 152 ++++++++++++++++------------------- src/server/server_profile.rs | 25 ++++-- 3 files changed, 94 insertions(+), 86 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d430020..6b6e30e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,9 @@ clap = "3.0.0-beta.1" log = "0.4" cursive = { version = "0.15.0", default-features = false, features = ["crossterm-backend"]} openssl = { version = "0.10", features = ["vendored"] } +rustls = "0.18.1" +webpki = "0.21.3" +webpki-roots = "0.20.0" [profile.dev] diff --git a/src/main.rs b/src/main.rs index 7f651d7..0c66d4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ use cursive::{ Cursive, menu::*, event::Key, - views::{ Dialog, TextView, LinearLayout, ListView, ResizedView, Panel }, + views::{ Dialog, TextView, LinearLayout, ListView, ResizedView, Panel, Menubar }, CursiveExt, align::Align, view::SizeConstraint, @@ -15,6 +15,8 @@ use cursive::{ //use std::sync::Arc; use std::time::Duration; use std::sync::Arc; +use std::sync::Weak; +use std::sync::Mutex; use crossterm::ErrorKind; use log::info; use clap::{App, Arg}; @@ -33,8 +35,8 @@ fn main() -> Result<(), ErrorKind> { .get_matches(); if args.is_present("graphical") { - let server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); - let server_arc = Arc::new(server); + let mut server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); + let server_arc = Arc::new(Mutex::new(server)); let s1 = server_arc.clone(); let s2 = s1.clone(); @@ -49,8 +51,50 @@ fn main() -> Result<(), ErrorKind> { display.add_global_callback(Key::Esc, |s| s.select_menubar()); info!("Main: setting up menu bar"); - let _ = display.menubar() - .add_subtree("Server", + // setup menu bar + menu_bar(display.menubar(), &server_arc); + + println!("Main: entering loop"); + display.add_layer(control_panel(server_arc)); + display.add_layer(launch_screen()); + display.set_autohide_menu(false); + display.run(); + Ok(()) + } else { + let mut server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); + + server.start()?; + loop { std::thread::sleep(Duration::from_secs(1)); } + } +} + +fn about() -> Dialog { + Dialog::new() + .content(TextView::new("Rust-Chat-Server\nmade by\n Mitchell Hardie\nMichael Bailey\nMit Licence") + .align(Align::center())) + .button("Close", |s| {let _ = s.pop_layer();} ) +} + +#[allow(dead_code)] +fn launch_screen() -> Dialog { + Dialog::new() + .content(TextView::new("\ + Welcome. + + --- Controls --- + * press for menu bar + * press for debug (FIXME) + * press to exit. + ").align(Align::top_left())) + .button("ok", |s| {s.pop_layer();}) +} + +fn menu_bar(bar: &mut Menubar, server_arc: &Arc>) { + + let s1 = Arc::downgrade(server_arc); + let s2 = Arc::downgrade(server_arc); + + bar.add_subtree("Server", MenuTree::new() .leaf("about", |s| s.add_layer(about())) @@ -58,52 +102,35 @@ fn main() -> Result<(), ErrorKind> { .leaf("quit", |s| s.quit())) .add_subtree("File", MenuTree::new() - .leaf("Start", move |_s| {let _ = s1.start();}) - .leaf("Stop", move |_s| {let _ = s2.stop();}) + .leaf("Start", move |s| { + let arc = s2.upgrade().unwrap(); + let _ = arc.lock().unwrap().start(); + let _ = s.pop_layer(); + s.add_layer(control_panel(arc)); + }) + .leaf("Stop", move |s| { + let arc = s1.upgrade().unwrap(); + let _ = arc.lock().unwrap().stop(); + let _ = s.pop_layer(); + s.add_layer(control_panel(arc)); + }) .delimiter() + // TODO: - create custom debug console .leaf("Debug", |s| {s.toggle_debug_console();})); - info!("Main: entering loop"); - display.add_layer(control_panel()); - display.run(); - Ok(()) - } else { - let server = Server::new("Server-01", "0.0.0.0:6000", "noreply@email.com"); - - server.start()?; - loop {std::thread::sleep(Duration::from_secs(1));} - } } -fn about() -> Dialog { - Dialog::new() - .content(TextView::new("Rust-Chat-Server\nmade by\n Mitchell Hardie\nMichael Bailey\nMit Licence") - ).button("Close", |s| {let _ = s.pop_layer(); s.add_layer(control_panel())} ) -} - -#[allow(dead_code)] -fn launch_screen() -> Dialog { - Dialog::new() - .content(TextView::new("\ - Server. - * press for menu bar - * press for debug (FIXME) - * press to exit. - ").align(Align::center())) - .button("ok", |s| {s.pop_layer();}) -} - -fn control_panel() -> ResizedView> { - +fn control_panel(server_arc: Arc>) -> ResizedView> { let mut root = LinearLayout::horizontal(); let mut left = LinearLayout::vertical(); let mut right = ListView::new(); - right.add_child("test", TextView::new("")); + right.add_child("test", TextView::new("")); right.add_delimiter(); right.add_child("test", TextView::new("")); right.add_child("test", TextView::new("")); left.add_child(TextView::new("Hello world")); + left.add_child(TextView::new(format!("running: {}", server_arc.lock().unwrap().running))); root.add_child(ResizedView::new(SizeConstraint::Full, SizeConstraint::Full, Panel::new(left))); root.add_child(ResizedView::new(SizeConstraint::Full, SizeConstraint::Full, Panel::new(right))); @@ -127,7 +154,7 @@ mod tests { let address = "0.0.0.0:6000"; let owner = "noreply@email.com"; - let server = Server::new(name, address, owner); + let mut server = Server::new(name, address, owner); let result = server.start(); assert_eq!(result.is_ok(), true); @@ -155,7 +182,7 @@ mod tests { let address = "0.0.0.0:6001"; let owner = "noreply@email.com"; - let server = Server::new(name, address, owner); + let mut server = Server::new(name, address, owner); let _ = server.start().unwrap(); let api_result = ClientApi::new(address); @@ -175,6 +202,10 @@ mod crypto_tests { use std::thread; use std::str; + use rustls; + use webpki; + use webpki_roots; + #[test] // MARK: - working encryption example for rsa fn gen_rsa() { @@ -206,47 +237,6 @@ mod crypto_tests { #[test] fn tls_handshake() { - // spawn the server - thread::spawn(|| { - println!("creating acceptor"); - let mut acceptor = SslAcceptor::mozilla_modern(SslMethod::tls()).unwrap(); - acceptor.set_private_key_file("cert.pem", SslFiletype::PEM).unwrap(); - acceptor.set_certificate_chain_file("root.pem").unwrap(); - acceptor.check_private_key().unwrap(); - let acceptor = Arc::new(acceptor.build()); - let listener = TcpListener::bind("0.0.0.0:6000").unwrap(); - - println!("entering loop"); - loop { - for stream in listener.incoming() { - println!("client accepted"); - match stream { - Ok(stream) => { - let acceptor = acceptor.clone(); - thread::spawn(move || { - let mut stream = acceptor.accept(stream).unwrap(); - - let mut buffer: [u8; 1024] = [0; 1024]; - - stream.ssl_read(&mut buffer).unwrap(); - let result = str::from_utf8(&buffer).unwrap(); - if buffer == "echo".as_bytes() { - let _ = stream.ssl_write("echo".as_bytes()).unwrap(); - } - }); - } - Err(e) => { /* connection failed */ } - } - } - } - }); - - let connector = SslConnector::builder(SslMethod::tls()).unwrap().build(); - - let stream = TcpStream::connect("localhost:6000").unwrap(); - let mut stream = connector.connect("127.0.0.1", stream).unwrap(); - - let _ = stream.ssl_write("echo".as_bytes()).unwrap(); } } \ No newline at end of file diff --git a/src/server/server_profile.rs b/src/server/server_profile.rs index 1f2a07e..dd60c68 100644 --- a/src/server/server_profile.rs +++ b/src/server/server_profile.rs @@ -38,7 +38,6 @@ pub enum ServerMessages { } // MARK: - server struct -#[derive(Debug)] pub struct Server { name: Arc, address: Arc, @@ -50,6 +49,10 @@ pub struct Server { sender: Sender, receiver: Receiver, + + pub running: bool, + + client_list_changed_handle: Box, } // MARK: - server implemetation @@ -66,6 +69,10 @@ impl Server { sender, receiver, + + running: false, + + client_list_changed_handle: Box::new(|s| println!("client list: {:#?}", s.get_client_list())) } } @@ -84,9 +91,16 @@ impl Server { self.author.to_string() } - pub fn start(&self) -> Result<(), io::Error>{ + pub fn get_client_list(&self) -> Vec { + let map = self.connected_clients.lock().unwrap(); + map.iter().map(|(_k, v)| format!("{:?}", v)).collect() + } + + pub fn start(&mut self) -> Result<(), io::Error> { println!("server: starting server..."); + self.running = true; + // MARK: - creating clones of the server property references let name = self.name.clone(); #[allow(dead_code)] @@ -205,15 +219,16 @@ impl Server { client.handle_connection(); } } - println!("server: stopped"); + info!("server: stopped"); }); - println!("server: started"); + info!("server: started"); Ok(()) } - pub fn stop(&self) { + pub fn stop(&mut self) { info!("server: sending stop message"); let _ = self.sender.send(ServerMessages::Shutdown); + self.running = false; } fn transmit_data(stream: &mut TcpStream, data: &str) -> Result<(), Error>{