pub mod base64 {
pub use rustlavel_core::base64::*;
}
pub mod csrf;
pub mod encryption;
pub mod guard;
pub mod hashing;
pub mod impersonation;
pub mod key;
pub mod middleware;
pub mod qr;
pub mod random;
#[cfg(feature = "redis")]
pub mod redis_session;
pub mod session;
pub mod signed_url;
pub mod store;
pub mod tokens;
pub mod totp;
pub use csrf::Csrf;
pub use encryption::Encrypter;
pub use guard::{AuthExt, Authenticatable, Authenticate, Guard, Guest, Identity};
pub use hashing::{Cost, hash_password, hash_password_with, needs_rehash, verify_password};
pub use impersonation::{Impersonation, ImpersonationExt, Impersonator};
pub use key::AppKey;
pub use middleware::{SessionExt, SessionHandle, SessionManager};
pub use session::Session;
pub use signed_url::{SignatureError, UrlSigner};
pub use store::{FileStore, MemoryStore, SessionStore, SharedStore};
pub use tokens::{
MemoryTokenStore, NewToken, PlainTextToken, RequireApiToken, RequireScope, Scopes,
SharedTokenStore, Token, TokenError, TokenExt, TokenStore,
};
pub use rustlavel_core::{Error, Result};
pub mod prelude {
pub use crate::{
AuthExt, Authenticatable, Authenticate, Cost, Csrf, Encrypter, Guard, Guest, Identity,
Session, SessionExt, SessionHandle, SessionManager, SignatureError, UrlSigner,
hash_password, verify_password,
};
pub use crate::{FileStore, MemoryStore, SessionStore};
pub use crate::{
MemoryTokenStore, NewToken, PlainTextToken, RequireApiToken, RequireScope, Scopes, Token,
TokenError, TokenExt, TokenStore,
};
}
pub fn constant_time_eq(a: &[u8], b: &[u8]) -> bool {
use subtle::ConstantTimeEq;
a.len() == b.len() && bool::from(a.ct_eq(b))
}
pub fn unix_now() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|elapsed| elapsed.as_secs())
.unwrap_or(0)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn constant_time_comparison_agrees_with_ordinary_equality() {
assert!(constant_time_eq(b"", b""));
assert!(constant_time_eq(b"token", b"token"));
assert!(!constant_time_eq(b"token", b"tokeN"));
assert!(!constant_time_eq(b"token", b"Token"));
assert!(!constant_time_eq(b"token", b"token "));
assert!(!constant_time_eq(b"token", b""));
}
#[test]
fn the_clock_is_past_the_epoch_and_moves_forward() {
let now = unix_now();
assert!(now > 1_577_836_800, "the system clock reported {now}");
assert!(unix_now() >= now);
}
}