// StarKingdoms.IO, a browser game about drifting through space // Copyright (C) 2023 ghostly_zsh, TerraMaster85, core // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . use crate::models::User; use crate::response::JsonAPIResponse; use crate::AppState; use actix_web::post; use actix_web::web::{Data, Json}; use argon2::Argon2; use diesel_async::RunQueryDsl; use password_hash::{PasswordHash, SaltString}; use rand::rngs::OsRng; use serde::{Deserialize, Serialize}; #[derive(Deserialize)] pub struct SignupRequest { pub username: String, pub password: String, } #[derive(Serialize, Debug)] pub struct SignupResponse { pub id: i64, } #[post("/signup")] pub async fn signup_req( req: Json, state: Data, ) -> JsonAPIResponse { let mut conn = handle_error!(state.pool.get().await); let user_id = { handle_error!(state.idgen.lock()).real_time_generate() }; let salt = SaltString::generate(&mut OsRng); let hash = handle_error!(PasswordHash::generate( Argon2::default(), req.password.as_bytes(), &salt )); let new_user = User { id: user_id, username: req.username.to_string(), password_hash: hash.to_string(), permission_level: 0, latest_savefile: None, }; handle_error!( diesel::insert_into(crate::schema::users::table) .values(&new_user) .execute(&mut conn) .await ); ok!(SignupResponse { id: user_id }) }