restore basic auth services

This commit is contained in:
griffi-gh 2023-03-08 21:10:48 +01:00
parent 1725c5a7c9
commit d89d4bf4ca
2 changed files with 75 additions and 39 deletions

View file

@ -1,48 +1,84 @@
use shipyard::{UniqueView, UniqueViewMut}; use shipyard::{UniqueView, UniqueViewMut, NonSendSync};
use kubi_shared::networking::messages::{ClientToServerMessage, ServerToClientMessage, InitData}; use uflow::{server::Event as ServerEvent, SendMode};
use crate::{server::{ServerEvents, UdpServer}, config::ConfigTable, util::log_error}; use kubi_shared::networking::messages::{
ClientToServerMessage,
ServerToClientMessage,
InitData,
C_CLIENT_HELLO
};
use crate::{
server::{ServerEvents, UdpServer, IsMessageOfType},
config::ConfigTable, util::log_error
};
pub fn authenticate_players( pub fn authenticate_players(
mut server: UniqueViewMut<UdpServer>, mut server: NonSendSync<UniqueViewMut<UdpServer>>,
events: UniqueView<ServerEvents>, events: UniqueView<ServerEvents>,
config: UniqueView<ConfigTable> config: UniqueView<ConfigTable>
) { ) {
for event in &events.0 { for event in &events.0 {
if let ServerEvent::MessageReceived { // if let ServerEvent::MessageReceived {
from, // from,
message: ClientToServerMessage::ClientHello { // message: ClientToServerMessage::ClientHello {
username, // username,
password // password
} // }
} = event { // } = event {
log::info!("ClientHello from {} with username {} and password {:?}", from, username, password);
let ServerEvent::Receive(client_addr, data) = event else{
continue
};
let Some(client) = server.0.client(client_addr) else {
log::error!("Client doesn't exist");
continue
};
if !event.is_message_of_type::<C_CLIENT_HELLO>() {
continue
}
let Ok(parsed_message) = postcard::from_bytes(data) else {
log::error!("Malformed message 00");
continue
};
let ClientToServerMessage::ClientHello { username, password } = parsed_message else {
unreachable!()
};
// Handle password auth log::info!("ClientHello; username={} password={:?}", username, password);
if let Some(server_password) = &config.server.password {
if let Some(user_password) = &password { // Handle password auth
if server_password != user_password { if let Some(server_password) = &config.server.password {
server.0.send_message(*from, ServerToClientMessage::ServerFuckOff { if let Some(user_password) = &password {
reason: "Passwords don't match".into() if server_password != user_password {
}).map_err(log_error).ok(); let res = postcard::to_allocvec(&ServerToClientMessage::ServerFuckOff {
continue reason: "Passwords don't match".into()
} }).unwrap().into_boxed_slice();
} else { client.borrow_mut().send(
server.0.send_message(*from, ServerToClientMessage::ServerFuckOff { res, 0, SendMode::Reliable
reason: "This server is password-protected".into() );
}).map_err(log_error).ok();
continue continue
} }
} else {
let res = postcard::to_allocvec(&ServerToClientMessage::ServerFuckOff {
reason: "This server is password protected".into()
}).unwrap().into_boxed_slice();
client.borrow_mut().send(
res, 0, SendMode::Reliable
);
continue
} }
//Spawn the user
//TODO Spawn the user on server side
//Approve the user
server.0.send_message(*from, ServerToClientMessage::ServerHello {
init: InitData {
users: vec![] //TODO create init data
}
}).map_err(log_error).ok();
} }
//Spawn the user
//TODO Spawn the user on server side
//Approve the user
let res = postcard::to_allocvec(&ServerToClientMessage::ServerHello {
init: InitData {
users: vec![] //TODO create init data
}
}).unwrap().into_boxed_slice();
client.borrow_mut().send(
res, 0, SendMode::Reliable
);
} }
} }

View file

@ -5,19 +5,19 @@ pub(crate) mod util;
pub(crate) mod config; pub(crate) mod config;
pub(crate) mod server; pub(crate) mod server;
pub(crate) mod client; pub(crate) mod client;
pub(crate) mod world; //pub(crate) mod world;
pub(crate) mod auth; pub(crate) mod auth;
use config::read_config; use config::read_config;
use server::{bind_server, update_server, log_server_errors}; use server::{bind_server, update_server, log_server_errors};
use auth::authenticate_players; use auth::authenticate_players;
use world::{update_world, init_world}; //use world::{update_world, init_world};
fn initialize() -> Workload { fn initialize() -> Workload {
( (
read_config, read_config,
bind_server, bind_server,
init_world, //init_world,
).into_workload() ).into_workload()
} }
@ -27,7 +27,7 @@ fn update() -> Workload {
( (
log_server_errors, log_server_errors,
authenticate_players, authenticate_players,
update_world, //update_world,
).into_workload() ).into_workload()
).into_sequential_workload() ).into_sequential_workload()
} }