feat(tvix/castore/path): use proto::validate_node_name
Use the shared code for validating node names, since that is what path components represent. Change-Id: I12109c1306b224718faa66cf1f2874c78c1436a7 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11566 Tested-by: BuildkiteCI Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
parent
4b3223a621
commit
2d7f4135ec
2 changed files with 13 additions and 6 deletions
|
@ -10,6 +10,8 @@ use std::{
|
||||||
|
|
||||||
use bstr::ByteSlice;
|
use bstr::ByteSlice;
|
||||||
|
|
||||||
|
use crate::proto::validate_node_name;
|
||||||
|
|
||||||
/// Represents a Path in the castore model.
|
/// Represents a Path in the castore model.
|
||||||
/// These are always relative, and platform-independent, which distinguishes
|
/// These are always relative, and platform-independent, which distinguishes
|
||||||
/// them from the ones provided in the standard library.
|
/// them from the ones provided in the standard library.
|
||||||
|
@ -34,12 +36,9 @@ impl Path {
|
||||||
|
|
||||||
fn from_bytes(bytes: &[u8]) -> Option<&Path> {
|
fn from_bytes(bytes: &[u8]) -> Option<&Path> {
|
||||||
if !bytes.is_empty() {
|
if !bytes.is_empty() {
|
||||||
// Ensure there's no empty components (aka, double forward slashes),
|
// Ensure all components are valid castore node names.
|
||||||
// and all components individually validate.
|
|
||||||
for component in bytes.split_str(b"/") {
|
for component in bytes.split_str(b"/") {
|
||||||
if component.is_empty() {
|
validate_node_name(component).ok()?;
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +200,14 @@ mod test {
|
||||||
#[case::two_forward_slashes_start("//a/b")]
|
#[case::two_forward_slashes_start("//a/b")]
|
||||||
#[case::two_forward_slashes_middle("a/b//c/d")]
|
#[case::two_forward_slashes_middle("a/b//c/d")]
|
||||||
#[case::trailing_slash("a/b/")]
|
#[case::trailing_slash("a/b/")]
|
||||||
|
#[case::dot(".")]
|
||||||
|
#[case::dotdot("..")]
|
||||||
|
#[case::dot_start("./a")]
|
||||||
|
#[case::dotdot_start("../a")]
|
||||||
|
#[case::dot_middle("a/./b")]
|
||||||
|
#[case::dotdot_middle("a/../b")]
|
||||||
|
#[case::dot_end("a/b/.")]
|
||||||
|
#[case::dotdot_end("a/b/..")]
|
||||||
pub fn from_str_fail(#[case] s: &str) {
|
pub fn from_str_fail(#[case] s: &str) {
|
||||||
s.parse::<PathBuf>().expect_err("must fail");
|
s.parse::<PathBuf>().expect_err("must fail");
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ pub enum ValidateStatBlobResponseError {
|
||||||
|
|
||||||
/// Checks a Node name for validity as an intermediate node.
|
/// Checks a Node name for validity as an intermediate node.
|
||||||
/// We disallow slashes, null bytes, '.', '..' and the empty string.
|
/// We disallow slashes, null bytes, '.', '..' and the empty string.
|
||||||
fn validate_node_name(name: &[u8]) -> Result<(), ValidateNodeError> {
|
pub(crate) fn validate_node_name(name: &[u8]) -> Result<(), ValidateNodeError> {
|
||||||
if name.is_empty()
|
if name.is_empty()
|
||||||
|| name == b".."
|
|| name == b".."
|
||||||
|| name == b"."
|
|| name == b"."
|
||||||
|
|
Loading…
Reference in a new issue