lariv-rs 0.1.0

Compile-time plugin web application framework built on Axum, SeaORM, Maud, and HTMX
Documentation
#[cfg(test)]
mod tests {
    use crate::plugins::users::{jwt, password};
    use chrono::Duration;

    #[test]
    fn scrypt_roundtrip() {
        let salt = password::generate_salt();
        assert_eq!(salt.len(), password::SALT_LEN);
        let hash = password::hash_password(b"secret", &salt).unwrap();
        assert!(password::verify_password(b"secret", &salt, &hash).unwrap());
        assert!(!password::verify_password(b"wrong", &salt, &hash).unwrap());
    }

    #[test]
    fn jwt_subject_binds_salt() {
        use crate::plugins::users::entities::User;
        use chrono::Utc;

        let user = User {
            id: 7,
            created_at: Some(Utc::now()),
            updated_at: Some(Utc::now()),
            name: "A".into(),
            email: "a@b.c".into(),
            phone: "1".into(),
            is_superuser: false,
            role_id: 1,
            password_hash: Some(vec![1, 2, 3]),
            password_salt: Some(vec![9; 32]),
            timezone: "Asia/Kolkata".into(),
        };
        let key = vec![0u8; 64];
        let issuer = vec![1u8; 64];
        let token = jwt::issue_token(&user, &key, &issuer, Duration::hours(1)).unwrap();
        let claims = jwt::parse_token(&token, &key, &issuer).unwrap();
        assert_eq!(claims.sub, jwt::subject(&user));
        assert_eq!(jwt::user_id_from_subject(&claims.sub).unwrap(), 7);

        let mut changed = user.clone();
        changed.password_salt = Some(vec![8; 32]);
        assert_ne!(claims.sub, jwt::subject(&changed));
    }
}