This commit is contained in:
2026-02-15 21:21:56 -05:00
parent 8be13e14bc
commit d6c98bcf10
10 changed files with 139 additions and 84 deletions

View File

@@ -1,16 +1,17 @@
mod db;
mod net;
use crate::db::{Db, Msg, User};
use crate::db::{Db, Msg, ServerPerms, User};
use clap::Parser;
use net::{ClientSender, ConAccepter, listen};
use openworm::{
net::{
AccountCreated, ClientMsg, ClientRequestMsg, CreateAccount, DisconnectReason, LoadMsg,
ClientMsg, ClientRequestMsg, CreateAccount, CreateAccountResp, DisconnectReason, LoadMsg,
RecvHandler, ServerError, ServerMsg, install_crypto_provider,
},
rsc::DataDir,
};
use rand::distr::{Alphanumeric, SampleString};
use scrypt::{
Scrypt,
password_hash::{PasswordHasher, SaltString, rand_core::OsRng},
@@ -48,6 +49,10 @@ pub async fn run_server(port: u16) {
count: 0.into(),
db: db.clone(),
};
if db.users.is_empty() {
let token = account_token(&db, ServerPerms::ACCOUNT_TOKENS);
println!("no users found, token for admin: {token}");
}
let (endpoint, handle) = listen(port, path, handler);
let _ = ctrl_c().await;
println!("stopping server");
@@ -57,6 +62,12 @@ pub async fn run_server(port: u16) {
endpoint.wait_idle().await;
}
pub fn account_token(db: &Db, perms: ServerPerms) -> String {
let token = Alphanumeric.sample_string(&mut rand::rng(), 16);
db.account_tokens.insert(&token, &perms);
token
}
type ClientId = u64;
struct ServerListener {
@@ -94,9 +105,7 @@ struct ClientHandler {
}
impl RecvHandler<ClientRequestMsg> for ClientHandler {
async fn connect(&self) -> () {
println!("connected: {:?}", self.send.remote().ip());
}
async fn connect(&self) -> () {}
async fn msg(&self, req: ClientRequestMsg) {
let msg = ClientMsg::from(req.msg);
let replier = self.send.replier(req.id);
@@ -173,8 +182,13 @@ impl RecvHandler<ClientRequestMsg> for ClientHandler {
let mut id;
loop {
let mut tx = self.db.write_tx();
let Some(perms) = tx.remove(&self.db.account_tokens, token.to_string()) else {
let _ = replier.send(CreateAccountResp::InvalidToken).await;
println!("invalid token: {:?}", self.send.remote());
return;
};
if tx.has_key(&self.db.usernames, username.clone()) {
let _ = replier.send(ServerError::UsernameTaken).await;
let _ = replier.send(CreateAccountResp::UsernameExists).await;
return;
}
id = rand::random();
@@ -189,6 +203,7 @@ impl RecvHandler<ClientRequestMsg> for ClientHandler {
password_hash: hash.clone(),
bio: String::new(),
pfp: None,
server_perms: perms,
},
);
tx.insert(&self.db.usernames, username, &id);
@@ -198,7 +213,7 @@ impl RecvHandler<ClientRequestMsg> for ClientHandler {
}
println!("account created: \"{username}\"");
*self.state.write().await = ClientState::Authed(id);
let _ = replier.send(AccountCreated {}).await;
let _ = replier.send(CreateAccountResp::Ok { id }).await;
} // ClientMsgType::Login { username, password } => {
// let Some(id) = self.db.usernames.get(&username) else {
// let _ = self.send.send(ServerError::UnknownUsername).await;
@@ -221,7 +236,6 @@ impl RecvHandler<ClientRequestMsg> for ClientHandler {
}
async fn disconnect(&self, reason: DisconnectReason) -> () {
println!("disconnected: {:?}", self.send.remote().ip());
match reason {
DisconnectReason::Closed | DisconnectReason::Timeout => (),
DisconnectReason::Other(e) => println!("connection issue: {e}"),