83 lines
3.0 KiB
Rust
83 lines
3.0 KiB
Rust
use data_encoding::HEXUPPER;
|
|
|
|
use crate::common::message::message::Message;
|
|
use crate::common::account::portfolio::Portfolio;
|
|
|
|
use crate::server::account::hash_email::hash_email;
|
|
use crate::server::account::hash_pwd::hash_pwd;
|
|
use crate::server::ds::account::Account;
|
|
use crate::server::db::initializer::db_connect;
|
|
use crate::server::db::config::{DB_ACC_USER, DB_ACC_PASS};
|
|
|
|
pub fn acc_create(message: &Message) -> Result<(), String> {
|
|
/*
|
|
* Parse account data
|
|
* */
|
|
/* get json data */
|
|
let stringified_data = std::str::from_utf8(&message.data).unwrap().to_string();
|
|
let data = json::parse(&stringified_data).unwrap();
|
|
/* get email, password salts and client hashes */
|
|
let email_hash = data["email_hash"].as_str().unwrap();
|
|
let email_client_salt = data["email_client_salt"].as_str().unwrap();
|
|
let password_hash = data["password_hash"].as_str().unwrap();
|
|
let password_client_salt = data["password_client_salt"].as_str().unwrap();
|
|
|
|
/* get username */
|
|
let username: String = data["username"].as_str().unwrap().to_string();
|
|
|
|
/* generate account struct */
|
|
let mut account: Account = Account {
|
|
username: username,
|
|
|
|
email_hash: "".to_string(),
|
|
server_email_salt: "".to_string(),
|
|
client_email_salt: email_client_salt.to_string(),
|
|
|
|
pass_hash: "".to_string(),
|
|
server_pass_salt: "".to_string(),
|
|
client_pass_salt: password_client_salt.to_string(),
|
|
|
|
is_pass: true,
|
|
portfolio: Portfolio::default(),
|
|
transactions: Vec::new(),
|
|
};
|
|
|
|
/*
|
|
* check if username is available in the database
|
|
* */
|
|
/* connect to database */
|
|
let mut client = db_connect(DB_ACC_USER, DB_ACC_PASS)?;
|
|
|
|
/* search for an account with same name */
|
|
for _ in &client.query(
|
|
"SELECT username FROM accounts_schema.accounts WHERE username LIKE $1", &[&account.username]).unwrap() {
|
|
return Err("ACC_CREATE_FAILED_USERNAME_EXISTS".to_string());
|
|
}
|
|
|
|
/*
|
|
* Hash the email and password.
|
|
* */
|
|
/* hash the email */
|
|
let email_server_hash = hash_email(email_hash).unwrap();
|
|
account.email_hash = HEXUPPER.encode(&email_server_hash.0);
|
|
account.server_email_salt = HEXUPPER.encode(&email_server_hash.1);
|
|
/* hash the password */
|
|
let password_server_hash = hash_pwd(password_hash).unwrap();
|
|
account.pass_hash = HEXUPPER.encode(&password_server_hash.0);
|
|
account.server_pass_salt = HEXUPPER.encode(&password_server_hash.1);
|
|
|
|
/*
|
|
* Write the account to the database.
|
|
* */
|
|
match client.execute("INSERT INTO accounts_schema.accounts \
|
|
(username, email_hash, server_email_salt, client_email_salt, pass_hash, server_pass_salt, client_pass_salt)
|
|
VALUES \
|
|
($1, $2, $3, $4, $5, $6, $7)",
|
|
&[&account.username,
|
|
&account.email_hash, &account.server_email_salt, &account.client_email_salt,
|
|
&account.pass_hash, &account.server_pass_salt, &account.client_pass_salt]) {
|
|
Ok(_) => return Ok(()),
|
|
Err(err) => return Err(format!("ACC_CREATE_FAILED_SAVING: {}", err)),
|
|
}
|
|
}
|