const EXACT: &[&str] = &[
"DISPLAY",
"WAYLAND_DISPLAY",
"WAYLAND_SOCKET",
"WINIT_UNIX_BACKEND",
"XDG_RUNTIME_DIR",
"XDG_DATA_DIRS",
"XDG_DATA_HOME",
"PATH",
"LD_LIBRARY_PATH",
"DYLD_LIBRARY_PATH",
"DYLD_FALLBACK_LIBRARY_PATH",
"LANG",
"LANGUAGE",
"DBUS_SESSION_BUS_ADDRESS",
"GTK_MODULES",
"NO_AT_BRIDGE",
"WGPU_BACKEND",
"RUST_LOG",
"RUST_BACKTRACE",
"HOME",
"USER",
"SystemRoot",
"WINDIR",
"PATHEXT",
"TEMP",
"TMP",
];
const PREFIXES: &[&str] = &[
"LC_",
"MESA_",
"LIBGL_",
"__GLX_",
"VK_",
"GALLIUM_",
"AT_SPI_",
"FONTCONFIG_",
"PLUSHIE_",
];
pub(crate) fn renderer_env() -> Vec<(String, String)> {
std::env::vars().filter(|(k, _)| is_allowed(k)).collect()
}
pub(crate) fn is_allowed(name: &str) -> bool {
EXACT.contains(&name) || PREFIXES.iter().any(|p| name.starts_with(p))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_servers_allowed() {
assert!(is_allowed("DISPLAY"));
assert!(is_allowed("WAYLAND_DISPLAY"));
assert!(is_allowed("XDG_RUNTIME_DIR"));
}
#[test]
fn secrets_rejected() {
assert!(!is_allowed("AWS_ACCESS_KEY_ID"));
assert!(!is_allowed("AWS_SECRET_ACCESS_KEY"));
assert!(!is_allowed("GITHUB_TOKEN"));
assert!(!is_allowed("DATABASE_URL"));
assert!(!is_allowed("SSH_AUTH_SOCK"));
assert!(!is_allowed("HTTP_COOKIE"));
assert!(!is_allowed("API_KEY"));
}
#[test]
fn locale_prefix_allowed() {
assert!(is_allowed("LC_ALL"));
assert!(is_allowed("LC_CTYPE"));
assert!(is_allowed("LC_MESSAGES"));
}
#[test]
fn graphics_prefixes_allowed() {
assert!(is_allowed("MESA_DEBUG"));
assert!(is_allowed("LIBGL_ALWAYS_SOFTWARE"));
assert!(is_allowed("__GLX_VENDOR_LIBRARY_NAME"));
assert!(is_allowed("VK_LAYER_PATH"));
assert!(is_allowed("GALLIUM_DRIVER"));
}
#[test]
fn plushie_prefix_allowed() {
assert!(is_allowed("PLUSHIE_UPDATE_SNAPSHOTS"));
assert!(is_allowed("PLUSHIE_TOKEN"));
assert!(is_allowed("PLUSHIE_SOCKET"));
assert!(is_allowed("PLUSHIE_FUTURE_DEBUG_KNOB"));
}
#[test]
fn windows_critical_vars_allowed() {
assert!(is_allowed("SystemRoot"));
assert!(is_allowed("WINDIR"));
assert!(is_allowed("PATHEXT"));
assert!(is_allowed("TEMP"));
assert!(is_allowed("TMP"));
}
#[test]
fn home_and_user_allowed_but_nothing_sneakily_alike() {
assert!(is_allowed("HOME"));
assert!(is_allowed("USER"));
assert!(!is_allowed("HOMEBREW_PREFIX"));
assert!(!is_allowed("USERDATA"));
}
#[test]
fn typical_secret_names_are_rejected() {
let leaky = [
"AWS_ACCESS_KEY_ID",
"AWS_SECRET_ACCESS_KEY",
"GITHUB_TOKEN",
"GITLAB_TOKEN",
"DATABASE_URL",
"SSH_AUTH_SOCK",
"HTTP_COOKIE",
"BEARER_TOKEN",
"OAUTH_CLIENT_SECRET",
"MY_CUSTOM_SECRET",
];
for name in leaky {
assert!(
!is_allowed(name),
"secret-like env var {name} must not pass the renderer whitelist"
);
}
}
}