2022-06-11 19:36:29 +00:00
|
|
|
use crypto_utils::jsonwebtoken::{Claims, Token};
|
2022-05-01 17:49:50 +00:00
|
|
|
use homedisk_database::{Database, User};
|
2022-04-23 19:21:04 +00:00
|
|
|
use homedisk_types::errors::{AuthError, ServerError};
|
|
|
|
|
2022-06-08 17:08:06 +00:00
|
|
|
/// Create user token
|
2022-04-30 20:32:08 +00:00
|
|
|
pub fn create_token(user: &User, secret: &[u8], expires: i64) -> Result<String, ServerError> {
|
2022-06-11 19:36:29 +00:00
|
|
|
let token = Token::new(secret, Claims::new(&user.id, expires))
|
|
|
|
.map_err(|_| ServerError::AuthError(AuthError::TokenGenerate))?;
|
2022-04-23 19:21:04 +00:00
|
|
|
|
2022-06-11 19:36:29 +00:00
|
|
|
Ok(token.encoded)
|
2022-04-23 19:21:04 +00:00
|
|
|
}
|
2022-05-01 17:49:50 +00:00
|
|
|
|
2022-06-08 17:08:06 +00:00
|
|
|
/// Search for a user
|
2022-06-14 20:37:42 +00:00
|
|
|
pub async fn find_user(db: &Database, user_id: &str) -> Result<User, ServerError> {
|
2022-05-01 17:49:50 +00:00
|
|
|
match db.find_user_by_id(user_id).await {
|
2022-06-11 08:19:47 +00:00
|
|
|
// if success return user
|
2022-05-01 17:49:50 +00:00
|
|
|
Ok(user) => Ok(user),
|
2022-06-11 08:19:47 +00:00
|
|
|
// errors
|
2022-05-01 17:49:50 +00:00
|
|
|
Err(err) => match err {
|
2022-06-11 08:19:47 +00:00
|
|
|
// user not found
|
2022-05-01 17:49:50 +00:00
|
|
|
homedisk_database::Error::UserNotFound => {
|
|
|
|
Err(ServerError::AuthError(AuthError::UserNotFound))
|
2022-07-12 19:59:11 +00:00
|
|
|
},
|
2022-06-11 08:19:47 +00:00
|
|
|
// other error
|
|
|
|
_ => Err(ServerError::AuthError(AuthError::Other(err.to_string()))),
|
2022-05-01 17:49:50 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
2022-06-08 22:02:20 +00:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use homedisk_database::User;
|
|
|
|
|
|
|
|
use super::create_token;
|
|
|
|
|
2022-07-04 20:19:12 +00:00
|
|
|
const SECRET: &[u8] = b"secret";
|
|
|
|
|
|
|
|
const USERNAME: &str = "username";
|
|
|
|
const PASSWORD: &str = "password";
|
|
|
|
|
2022-06-11 08:19:47 +00:00
|
|
|
/// Test a token creation
|
2022-06-08 22:02:20 +00:00
|
|
|
#[test]
|
|
|
|
fn test_create_token() {
|
2022-07-04 20:19:12 +00:00
|
|
|
let secret = SECRET;
|
|
|
|
let user = User::new(USERNAME, PASSWORD);
|
2022-06-08 22:02:20 +00:00
|
|
|
|
|
|
|
create_token(&user, secret, 1).unwrap();
|
|
|
|
}
|
|
|
|
}
|