vtse/vtse-server/src/user.rs

37 lines
1.1 KiB
Rust

use serde::Deserialize;
use sodiumoxide::crypto::pwhash::argon2id13::{pwhash, MEMLIMIT_INTERACTIVE, OPSLIMIT_INTERACTIVE};
use uuid::Uuid;
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Deserialize, sqlx::Type)]
#[sqlx(transparent)]
pub(crate) struct ApiKey(pub(crate) Uuid);
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Deserialize, sqlx::Type)]
#[sqlx(transparent)]
pub(crate) struct Username(String);
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Deserialize)]
pub(crate) struct Password(String);
#[derive(sqlx::Type)]
#[sqlx(transparent)]
pub(crate) struct SaltedPasswordData(pub(crate) Vec<u8>);
impl Password {
pub(crate) fn salt(self) -> Result<SaltedPasswordData, ()> {
Ok(SaltedPasswordData(
pwhash(
self.0.as_bytes(),
OPSLIMIT_INTERACTIVE,
MEMLIMIT_INTERACTIVE,
)?
.as_ref()
.to_vec(),
))
}
pub(crate) fn as_bytes(&self) -> &[u8] {
self.0.as_bytes()
}
}