From 91a1321f0ae1a02df9c3d1a8f890d84a94953a61 Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Sun, 19 May 2019 17:09:56 +0200 Subject: Validate tokens and then push client --- game_server/src/backend_connection.rs | 57 +++++++++++++++++++++++++++++------ game_server/src/gameserver.rs | 17 ++++++++--- 2 files changed, 59 insertions(+), 15 deletions(-) (limited to 'game_server/src') diff --git a/game_server/src/backend_connection.rs b/game_server/src/backend_connection.rs index 9307c4a..6d3537a 100644 --- a/game_server/src/backend_connection.rs +++ b/game_server/src/backend_connection.rs @@ -1,31 +1,68 @@ use reqwest::{Response, Client, Url, UrlError, Error as ReqError}; +use std::sync::mpsc::{Sender, Receiver}; +use std::sync::mpsc; +use super::gameserver::Token; pub struct BackendConnection { host: String, - client: Client, - last_response: Option> + req_sender: Sender, + res_rec: Receiver, } +#[derive(Debug)] +pub enum BackendError { + UrlError(UrlError), + RequestError(ReqError), + InvalidTokenFormat, + InvalidToken, +} + +pub type TokenValidity = Result<(), BackendError>; +pub type RequestData = Url; +pub type ResponseResult = Result; + impl BackendConnection { + fn run_background(req_rec: Receiver, res_sender: Sender) { + let client = Client::new(); + loop { + let request_data = req_rec.recv().unwrap(); + let location = request_data; + let request = client.get(location); + let response = request.send(); + res_sender.send(response); + } + } + pub fn new(host: &str) -> Self { + let (req_sender, req_rec): (Sender, Receiver) + = mpsc::channel(); + let (res_sender, res_rec): (Sender, Receiver) + = mpsc::channel(); + std::thread::spawn(move || Self::run_background(req_rec, res_sender)); BackendConnection { host: host.to_string(), - client: Client::new(), - last_response: None + req_sender, + res_rec, } } - pub fn request(&mut self, location: &str) -> Result<(), UrlError> { - Ok(self.last_response = - Some(self.client.get(Url::parse(&format!("{}{}", self.host, location))?) - .send())) + pub fn request(&self, location: &str) -> Result<(), UrlError> { + Ok(self.req_sender.send(Url::parse(&format!("{}{}", self.host, location))?).unwrap()) } - pub fn get_response(&self) -> &Option> { - &self.last_response + pub fn get_response(&self) -> ResponseResult { + self.res_rec.recv().unwrap() } pub fn host_name<'a>(&'a self) -> &'a str { &self.host } + + pub fn validate_token(&self, token: &Token) -> TokenValidity { + let location = format!("/api/lobby/tokens/{}", token); + self.request(&location).map_err(|err| BackendError::UrlError(err))?; + let response = self.get_response(); + println!("backend response: {:?}", response); + Ok(()) + } } diff --git a/game_server/src/gameserver.rs b/game_server/src/gameserver.rs index 6f6dead..a4b1ed5 100644 --- a/game_server/src/gameserver.rs +++ b/game_server/src/gameserver.rs @@ -13,7 +13,7 @@ use super::backend_connection::BackendConnection; const PROTOCOL: &str = "tuesday"; -type Token = u32; +pub type Token = u32; #[derive(Debug)] pub enum GameServerError { @@ -26,7 +26,7 @@ pub enum GameServerError { pub struct GameServer { addr: SocketAddr, lobby: Lobby, - backend: BackendConnection, + backend: Arc>, clients: Arc>>, } @@ -70,7 +70,7 @@ impl GameServer { GameServer { addr, lobby, - backend, + backend: Arc::new(Mutex::new(backend)), clients: Arc::new(Mutex::new(HashMap::new())), } } @@ -86,13 +86,20 @@ impl GameServer { fn add_client(&self, mut client: GameClient) { let clients = Arc::clone(&self.clients); + let backend = Arc::clone(&self.backend); std::thread::spawn(move || { let token = client.require_token(); if let Some(token) = token { println!("Token: {}", token); - clients.lock().unwrap().insert(token, client); + let locked_backend = backend.lock().unwrap(); + let result = locked_backend.validate_token(&token); + if let Err(err) = result { + warn!("token {} is invalid: '{:?}'", token, err); + } else { + clients.lock().unwrap().insert(token, client); + } } else { - warn!("Client sent invalid token"); + warn!("client sent invalid token"); } }); } -- cgit v1.2.3-54-g00ecf