use base64::{Engine, engine::general_purpose::URL_SAFE};
use rand::{TryRngCore, rngs::OsRng};
use tracing::error;
use crate::error::Error;
#[derive(Debug, Clone, PartialEq)]
pub struct CSRFToken(pub(crate) String);
impl CSRFToken {
pub fn new() -> Result<Self, Error> {
let mut key = [0u8; 32];
OsRng.try_fill_bytes(&mut key).map_err(|e| {
error!("Failed to generate CSRF token: {:?}", e);
Error::GenToken
})?;
Ok(Self(URL_SAFE.encode(key)))
}
pub fn value(&self) -> &str {
&self.0
}
}
#[derive(Debug, Clone)]
pub struct RawCSRFToken(pub(crate) String);
#[cfg(test)]
mod tests {
use super::CSRFToken;
#[test]
fn test_csrf_new() {
let csrf_token = CSRFToken::new();
assert!(!csrf_token.clone().unwrap().0.is_empty());
}
}