merge authorization.rs with login_normal.rs
continuous-integration/drone/push Build is passing Details

- merge authorization.rs with login_normal.rs
- make get_user_id.rs return std::io::Result
This commit is contained in:
ayham 2021-07-31 19:36:59 +03:00
parent 7cf34e7b9a
commit 1468aa9354
Signed by: ayham
GPG Key ID: EAB7F5A9DF503678
6 changed files with 127 additions and 93 deletions

View File

@ -1,11 +1,14 @@
use data_encoding::HEXUPPER;
use ring::pbkdf2;
use log::warn;
use std::num::NonZeroU32;
use data_encoding::HEXUPPER;
use ring::pbkdf2;
use crate::common::message::inst::CommandInst;
use crate::common::message::message::Message;
use crate::common::message::message_builder::message_builder;
use crate::common::message::message_type::MessageType;
use crate::common::misc::return_flags::ReturnFlags;
use crate::common::misc::assert_msg::assert_msg;
use crate::server::db::cmd::get_user_hash::get_user_hash;
use crate::server::db::cmd::get_user_id::get_user_id;
@ -21,7 +24,26 @@ pub async fn acc_auth(
sql_conn: &tokio_postgres::Client,
tls_connection: &mut TlsStream<TcpStream>,
message: &Message,
) -> Result<(), ReturnFlags> {
) -> std::io::Result<()> {
/* assert recieved message */
if !assert_msg(
message,
MessageType::Command,
true,
3,
false,
0,
false,
0,
false,
0,
) && message.instruction == CommandInst::LoginMethod1 as i64
&& message.data.len() != 0
{
warn!("LOGIN_INVALID_MESSAGE");
return tls_connection.shutdown().await;
}
/*
* Parse account data.
* */
@ -89,7 +111,22 @@ pub async fn acc_auth(
);
match email_ret.is_ok() {
true => {}
false => return Err(ReturnFlags::ServerAccUnauthorized),
false => {
let server_response = message_builder(
MessageType::ServerReturn,
0,
0,
0,
0,
bincode::serialize(&"Email Incorrect").unwrap(),
);
match tls_connection
.write_all(&bincode::serialize(&server_response).unwrap())
.await
{
_ => return Ok(()),
};
}
};
let pass_ret = pbkdf2::verify(
pbkdf2::PBKDF2_HMAC_SHA512,
@ -100,7 +137,22 @@ pub async fn acc_auth(
);
match pass_ret.is_ok() {
true => {}
false => return Err(ReturnFlags::ServerAccUnauthorized),
false => {
let server_response = message_builder(
MessageType::ServerReturn,
0,
0,
0,
0,
bincode::serialize(&"Password Incorrect").unwrap(),
);
match tls_connection
.write_all(&bincode::serialize(&server_response).unwrap())
.await
{
_ => return Ok(()),
};
}
};
/*
@ -118,7 +170,30 @@ pub async fn acc_auth(
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs(),
)?;
);
/*
* server failed to generate JWT token.
* inform client about issue
* */
if jwt_token.is_err() {
let server_response = message_builder(
MessageType::ServerReturn,
0,
0,
0,
0,
bincode::serialize(&"Login failed, try again later.").unwrap(),
);
match tls_connection
.write_all(&bincode::serialize(&server_response).unwrap())
.await
{
// We already failed,
// we don't care if client doesn't recieve
_ => return Ok(()),
};
}
/*
* Send the JWT token
@ -129,12 +204,12 @@ pub async fn acc_auth(
1,
0,
0,
jwt_token.as_bytes().to_vec(),
jwt_token.unwrap().as_bytes().to_vec(),
);
tls_connection
match tls_connection
.write_all(bincode::serialize(&message).unwrap().as_slice())
.await
.expect("could not write to client");
Ok(())
{
_ => Ok(()), // Don't care if client doesn't receive
}
}

View File

@ -1,5 +1,5 @@
use log::warn;
use data_encoding::HEXUPPER;
use log::warn;
use crate::common::message::inst::CommandInst;
use crate::common::message::message_builder::message_builder;
@ -117,16 +117,21 @@ pub async fn acc_create(
* Inform cient that user already exists
* Note: figure out if this is a security? issue
*/
let server_response =
message_builder(MessageType::ServerReturn,
0, 0, 0, 0,
bincode::serialize(
&format!("{:#?}", ReturnFlags::ServerAccUserExists)).unwrap());
let server_response = message_builder(
MessageType::ServerReturn,
0,
0,
0,
0,
bincode::serialize(&format!("{:#?}", ReturnFlags::ServerAccUserExists)).unwrap(),
);
match tls_connection
.write_all(&bincode::serialize(
&server_response).unwrap()).await { // Don't care if user didn't recieve a reply
_ => return Ok(())
};
.write_all(&bincode::serialize(&server_response).unwrap())
.await
{
// Don't care if user didn't recieve a reply
_ => return Ok(()),
};
}
/*
@ -155,15 +160,23 @@ pub async fn acc_create(
/*
* Send to client SQL result
*/
let server_response =
message_builder(MessageType::ServerReturn,
if creation_result.is_ok() { 1 } else { 0 },
0, 0, 0,
if creation_result.is_ok() { Vec::new() } else {
bincode::serialize(&format!("{:#?}", creation_result)).unwrap()});
let server_response = message_builder(
MessageType::ServerReturn,
if creation_result.is_ok() { 1 } else { 0 },
0,
0,
0,
if creation_result.is_ok() {
Vec::new()
} else {
bincode::serialize(&format!("{:#?}", creation_result)).unwrap()
},
);
match tls_connection
.write_all(&bincode::serialize(
&server_response).unwrap()).await { // Don't care if user didn't recieve a reply
_ => Ok(())
}
.write_all(&bincode::serialize(&server_response).unwrap())
.await
{
// Don't care if user didn't recieve a reply
_ => Ok(()),
}
}

View File

@ -5,7 +5,7 @@ use crate::common::misc::return_flags::ReturnFlags;
pub async fn get_user_id(
sql_conn: &tokio_postgres::Client,
username: &str,
) -> Result<i64, ReturnFlags> {
) -> std::io::Result<i64> {
/* check that user exists */
if user_exists(sql_conn, username).await {
for row in sql_conn
@ -19,5 +19,8 @@ pub async fn get_user_id(
return Ok(row.get(0));
}
}
Err(ReturnFlags::ServerGetUserIdNotFound)
Err(std::io::Error::new(
std::io::ErrorKind::NotFound,
format!("{}", ReturnFlags::ServerGetUserIdNotFound),
))
}

View File

@ -1,56 +0,0 @@
use log::warn;
use crate::common::message::inst::CommandInst;
use crate::common::message::message::Message;
use crate::common::message::message_builder::message_builder;
use crate::common::message::message_type::MessageType;
use crate::common::misc::assert_msg::assert_msg;
use crate::server::account::authorization::acc_auth;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;
use tokio_rustls::server::TlsStream;
pub async fn login_normal(
sql_conn: &tokio_postgres::Client,
tls_connection: &mut TlsStream<TcpStream>,
message: &Message,
) -> std::io::Result<()> {
/* assert recieved message */
if !assert_msg(
message,
MessageType::Command,
true,
3,
false,
0,
false,
0,
false,
0,
) && message.instruction == CommandInst::LoginMethod1 as i64
&& message.data.len() != 0
{
warn!("LOGIN_INVALID_MESSAGE");
return tls_connection.shutdown().await;
}
/* call acc_auth() server version */
match acc_auth(sql_conn, tls_connection, message).await {
Ok(_) => Ok(()),
Err(err) => {
let server_response = message_builder(
MessageType::ServerReturn,
0,
0,
0,
0,
bincode::serialize(&err).unwrap(),
);
tls_connection
.write_all(&bincode::serialize(&server_response).unwrap())
.await
}
}
}

View File

@ -1,6 +1,5 @@
pub mod get_asset_data;
pub mod get_asset_info;
pub mod login_normal;
pub mod purchase_asset;
pub mod retrieve_portfolio;
pub mod retrieve_transactions;

View File

@ -5,9 +5,9 @@ use crate::common::message::message::Message;
use crate::common::message::message_builder::message_builder;
use crate::common::message::message_type::MessageType;
use crate::server::account::authorization::acc_auth;
use crate::server::account::creation::acc_create;
use crate::server::network::cmd::login_normal::login_normal;
use crate::server::network::cmd::retrieve_portfolio::retrieve_portfolio;
use crate::server::network::cmd::retrieve_transactions::retrieve_transactions;
@ -120,7 +120,7 @@ pub async fn handle_data(
acc_create(sql_conn, socket, &client_msg).await
}
_ if client_msg.instruction == CommandInst::LoginMethod1 as i64 => {
login_normal(sql_conn, socket, &client_msg).await
acc_auth(sql_conn, socket, &client_msg).await
}
_ if client_msg.instruction == DataTransferInst::GetUserPortfolio as i64 => {
retrieve_portfolio(socket, &client_msg).await