126 lines
3.4 KiB
Rust
126 lines
3.4 KiB
Rust
//! Module pour la gestion des variables d'environnement requises
|
|
//!
|
|
//! Ce module fournit des fonctions helper pour récupérer des variables d'environnement
|
|
//! avec validation stricte. L'application refuse de démarrer si les secrets requis
|
|
//! ne sont pas définis.
|
|
|
|
use std::env;
|
|
|
|
/// Récupère une variable d'environnement requise.
|
|
///
|
|
/// Panic si la variable n'est pas définie ou est vide.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `key` - Le nom de la variable d'environnement
|
|
///
|
|
/// # Panics
|
|
///
|
|
/// Panic avec un message d'erreur clair si la variable n'est pas définie.
|
|
///
|
|
/// # Example
|
|
///
|
|
/// ```rust,should_panic
|
|
/// # use chat_server::env::require_env;
|
|
/// // Panic si JWT_SECRET n'est pas défini
|
|
/// let secret = require_env("JWT_SECRET");
|
|
/// ```
|
|
pub fn require_env(key: &str) -> String {
|
|
env::var(key).unwrap_or_else(|_| {
|
|
panic!(
|
|
"FATAL: Required environment variable {} is not set. \
|
|
Application cannot start without this configuration.",
|
|
key
|
|
)
|
|
})
|
|
}
|
|
|
|
/// Récupère une variable d'environnement requise avec validation de longueur minimale.
|
|
///
|
|
/// Utile pour les secrets qui doivent avoir une certaine complexité.
|
|
///
|
|
/// # Arguments
|
|
///
|
|
/// * `key` - Le nom de la variable d'environnement
|
|
/// * `min_length` - Longueur minimale requise
|
|
///
|
|
/// # Panics
|
|
///
|
|
/// Panic si la variable n'est pas définie ou si sa longueur est inférieure à `min_length`.
|
|
///
|
|
/// # Example
|
|
///
|
|
/// ```rust,should_panic
|
|
/// # use chat_server::env::require_env_min_length;
|
|
/// // Panic si JWT_SECRET n'est pas défini ou fait moins de 32 caractères
|
|
/// let secret = require_env_min_length("JWT_SECRET", 32);
|
|
/// ```
|
|
pub fn require_env_min_length(key: &str, min_length: usize) -> String {
|
|
let value = require_env(key);
|
|
if value.len() < min_length {
|
|
panic!(
|
|
"FATAL: Environment variable {} must be at least {} characters long (got {})",
|
|
key,
|
|
min_length,
|
|
value.len()
|
|
)
|
|
}
|
|
value
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use std::panic;
|
|
|
|
#[test]
|
|
fn test_require_env_panics_on_missing() {
|
|
let key = "TEST_NONEXISTENT_VAR_12345";
|
|
env::remove_var(key);
|
|
|
|
let result = panic::catch_unwind(|| require_env(key));
|
|
|
|
assert!(
|
|
result.is_err(),
|
|
"require_env should panic on missing variable"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_require_env_returns_value_when_set() {
|
|
let key = "TEST_EXISTING_VAR";
|
|
let value = "test_value_123";
|
|
env::set_var(key, value);
|
|
|
|
let result = require_env(key);
|
|
assert_eq!(result, value);
|
|
|
|
env::remove_var(key);
|
|
}
|
|
|
|
#[test]
|
|
fn test_require_env_min_length_panics_on_short() {
|
|
let key = "TEST_SHORT_SECRET";
|
|
env::set_var(key, "short");
|
|
|
|
let result = panic::catch_unwind(|| require_env_min_length(key, 32));
|
|
|
|
env::remove_var(key);
|
|
assert!(
|
|
result.is_err(),
|
|
"require_env_min_length should panic on short value"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_require_env_min_length_returns_value_when_valid() {
|
|
let key = "TEST_LONG_SECRET";
|
|
let value = "this_is_a_long_secret_key_that_meets_the_minimum_length_requirement";
|
|
env::set_var(key, value);
|
|
|
|
let result = require_env_min_length(key, 32);
|
|
assert_eq!(result, value);
|
|
|
|
env::remove_var(key);
|
|
}
|
|
}
|