use std::path::{Component, Path};
pub const REGISTRY_CONFIG_SCHEMA: u32 = 1;
pub const REGISTRY_KIND: &str = "file-registry";
pub fn relative_subdir_is_safe(value: &str) -> bool {
if value.is_empty() {
return false;
}
let candidate = Path::new(value);
if candidate.is_absolute() {
return false;
}
candidate
.components()
.all(|component| matches!(component, Component::Normal(_) | Component::CurDir))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn accepts_simple_relative_subdirs() {
assert!(relative_subdir_is_safe("packages"));
assert!(relative_subdir_is_safe("artifacts"));
assert!(relative_subdir_is_safe("a/b"));
}
#[test]
fn rejects_empty_absolute_and_traversal() {
assert!(!relative_subdir_is_safe(""));
assert!(!relative_subdir_is_safe("/abs"));
assert!(!relative_subdir_is_safe("../escape"));
assert!(!relative_subdir_is_safe("a/../b"));
}
}