use std::io::Write;
use std::path::{Path, PathBuf};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RetrievedArtifact {
pub blake3: String,
pub path: PathBuf,
pub size: u64,
}
#[derive(Debug, Clone)]
pub struct ContentAddressedStore {
root: PathBuf,
}
impl ContentAddressedStore {
pub fn new(root: impl Into<PathBuf>) -> Self {
Self { root: root.into() }
}
pub fn root(&self) -> &Path {
&self.root
}
pub fn land(&self, bytes: &[u8]) -> std::io::Result<RetrievedArtifact> {
let blake3 = blake3::hash(bytes).to_hex().to_string();
std::fs::create_dir_all(&self.root)?;
let path = self.root.join(&blake3);
if !path.exists() {
let tmp = self.root.join(format!(".tmp-{}-{}", std::process::id(), &blake3));
let mut f = std::fs::File::create(&tmp)?;
f.write_all(bytes)?;
f.sync_all()?;
std::fs::rename(&tmp, &path)?;
}
Ok(RetrievedArtifact {
blake3,
path,
size: bytes.len() as u64,
})
}
pub fn link_named(
&self,
landed: &RetrievedArtifact,
filename: &str,
) -> std::io::Result<PathBuf> {
let dir = self.root.join("named").join(&landed.blake3);
std::fs::create_dir_all(&dir)?;
let named = dir.join(filename);
if named.exists() {
return Ok(named);
}
match std::fs::hard_link(&landed.path, &named) {
Ok(()) => Ok(named),
Err(_) => {
std::fs::copy(&landed.path, &named)?;
Ok(named)
}
}
}
}
pub fn land_at_camp_path(
camp_root: &Path,
land: &str,
src: &Path,
) -> std::io::Result<PathBuf> {
let invalid = |m: String| std::io::Error::new(std::io::ErrorKind::InvalidInput, m);
crate::types::check_land_path(land)
.map_err(|r| invalid(format!("produces land path {land:?} {r}")))?;
let dest = camp_root.join(land);
let dir = dest.parent().expect("check_land_path guarantees a filename");
std::fs::create_dir_all(dir)?;
let canon_root = camp_root.canonicalize()?;
let canon_dir = dir.canonicalize()?;
if !canon_dir.starts_with(&canon_root) {
return Err(invalid(format!(
"produces land path {land:?} resolves outside the camp root via a symlink"
)));
}
let file_name = dest.file_name().expect("checked above");
if let (Ok(a), Ok(b)) = (src.canonicalize(), canon_dir.join(file_name).canonicalize()) {
if a == b {
return Ok(dest);
}
}
let tmp = canon_dir.join(format!(
".{}.land-{}",
file_name.to_string_lossy(),
std::process::id()
));
let _ = std::fs::remove_file(&tmp);
if std::fs::hard_link(src, &tmp).is_err() {
std::fs::copy(src, &tmp)?;
}
if let Err(e) = std::fs::rename(&tmp, &dest) {
let _ = std::fs::remove_file(&tmp);
return Err(e);
}
Ok(dest)
}
#[async_trait::async_trait]
pub trait ArtifactMirror: Send + Sync {
async fn put(&self, key: &str, path: &Path) -> Result<String, String>;
}
pub fn mirror_key(blake3: &str, filename: &str) -> String {
format!("{blake3}/{filename}")
}
pub fn parse_mirror_ref(reference: &str) -> Result<(String, String), String> {
let trimmed = reference.trim().trim_end_matches('/');
let mut parts = trimmed.rsplit('/');
let filename = parts.next().unwrap_or_default();
let blake3 = parts.next().unwrap_or_default();
let is_hex64 = blake3.len() == 64 && blake3.bytes().all(|b| b.is_ascii_hexdigit());
if !is_hex64 {
return Err(format!(
"{reference:?} does not end in <blake3>/<filename> — the 64-hex BLAKE3 segment is \
what the fetched bytes are verified against"
));
}
if filename.is_empty() || filename == "." || filename == ".." {
return Err(format!("{reference:?} has no usable filename segment"));
}
Ok((blake3.to_ascii_lowercase(), filename.to_string()))
}
#[cfg(test)]
mod mirror_ref_tests {
use super::*;
const H: &str = "86958c7b7cfe0aa5b6b8bd2d35c0b3a0f8a9e0e1c1d2e3f405162738495a6b7c";
#[test]
fn a_url_and_a_bare_key_parse_to_the_same_address() {
let want = (H.to_string(), "yah.tar.gz".to_string());
let url = format!("http://100.64.0.9:8380/artifacts/{H}/yah.tar.gz");
assert_eq!(parse_mirror_ref(&url).unwrap(), want);
assert_eq!(parse_mirror_ref(&mirror_key(H, "yah.tar.gz")).unwrap(), want);
}
#[test]
fn a_reference_without_a_content_address_is_refused() {
assert!(parse_mirror_ref("http://store/artifacts/yah.tar.gz").is_err());
assert!(parse_mirror_ref(&format!("{}/x", &H[..63])).is_err());
assert!(parse_mirror_ref(&format!("{H}/..")).is_err());
}
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::TempDir;
#[test]
fn land_is_content_addressed_and_preserves_blake3() {
let dir = TempDir::new().unwrap();
let store = ContentAddressedStore::new(dir.path().join("artifacts"));
let bytes = b"librusty_v8_release_x86_64-unknown-linux-musl.a bytes \x00\xff";
let landed = store.land(bytes).unwrap();
assert_eq!(landed.blake3, blake3::hash(bytes).to_hex().to_string());
assert_eq!(landed.path, store.root().join(&landed.blake3));
assert_eq!(landed.size, bytes.len() as u64);
let on_disk = std::fs::read(&landed.path).unwrap();
assert_eq!(on_disk, bytes);
assert_eq!(blake3::hash(&on_disk).to_hex().to_string(), landed.blake3);
}
#[test]
fn land_is_idempotent_for_identical_bytes() {
let dir = TempDir::new().unwrap();
let store = ContentAddressedStore::new(dir.path().join("artifacts"));
let bytes = b"same bytes twice";
let a = store.land(bytes).unwrap();
let b = store.land(bytes).unwrap();
assert_eq!(a, b, "re-landing identical bytes returns the same address");
let entries: Vec<_> = std::fs::read_dir(store.root())
.unwrap()
.map(|e| e.unwrap().file_name().to_string_lossy().into_owned())
.collect();
assert_eq!(entries, vec![a.blake3], "one content-addressed blob, no temp debris");
}
#[test]
fn named_view_keeps_the_filename_and_the_bytes() {
let dir = TempDir::new().unwrap();
let store = ContentAddressedStore::new(dir.path().join("artifacts"));
let bytes = b"mesofact tarball bytes \x00\xff";
let landed = store.land(bytes).unwrap();
let named = store
.link_named(&landed, "mesofact-x86_64-unknown-linux-musl.tar.gz")
.unwrap();
assert_eq!(
named.file_name().unwrap(),
"mesofact-x86_64-unknown-linux-musl.tar.gz",
"the publish leg keys off this basename",
);
assert_eq!(std::fs::read(&named).unwrap(), bytes);
assert!(
landed.path.exists(),
"the CAS entry is R546-T3's input and must survive the linking",
);
assert_eq!(std::fs::read(&landed.path).unwrap(), bytes);
assert_eq!(
store
.link_named(&landed, "mesofact-x86_64-unknown-linux-musl.tar.gz")
.unwrap(),
named,
);
}
#[test]
fn named_views_of_distinct_bytes_do_not_collide() {
let dir = TempDir::new().unwrap();
let store = ContentAddressedStore::new(dir.path().join("artifacts"));
let a = store.land(b"build one").unwrap();
let b = store.land(b"build two").unwrap();
let pa = store.link_named(&a, "mesofact.tar.gz").unwrap();
let pb = store.link_named(&b, "mesofact.tar.gz").unwrap();
assert_ne!(pa, pb);
assert_eq!(std::fs::read(&pa).unwrap(), b"build one");
assert_eq!(std::fs::read(&pb).unwrap(), b"build two");
}
#[test]
fn distinct_bytes_land_at_distinct_addresses() {
let dir = TempDir::new().unwrap();
let store = ContentAddressedStore::new(dir.path().join("artifacts"));
let a = store.land(b"alpha").unwrap();
let b = store.land(b"beta").unwrap();
assert_ne!(a.blake3, b.blake3);
assert_ne!(a.path, b.path);
}
#[test]
fn land_at_camp_path_creates_parents_and_overwrites_atomically() {
let dir = TempDir::new().unwrap();
let root = dir.path().join("camp");
std::fs::create_dir_all(&root).unwrap();
let src = dir.path().join("src.bin");
std::fs::write(&src, b"one").unwrap();
let d = land_at_camp_path(&root, "target/desktop/x.tar.gz", &src).unwrap();
assert_eq!(d, root.join("target/desktop/x.tar.gz"));
assert_eq!(std::fs::read(&d).unwrap(), b"one");
std::fs::write(&src, b"two!").unwrap();
land_at_camp_path(&root, "target/desktop/x.tar.gz", &src).unwrap();
assert_eq!(std::fs::read(&d).unwrap(), b"two!");
land_at_camp_path(&root, "target/desktop/x.tar.gz", &d).unwrap();
assert_eq!(std::fs::read(&d).unwrap(), b"two!");
}
#[test]
fn land_at_camp_path_rejects_traversal_and_symlink_escape() {
let dir = TempDir::new().unwrap();
let root = dir.path().join("camp");
std::fs::create_dir_all(&root).unwrap();
let src = dir.path().join("src.bin");
std::fs::write(&src, b"x").unwrap();
assert!(land_at_camp_path(&root, "../x", &src).is_err());
assert!(land_at_camp_path(&root, "a/../../x", &src).is_err());
assert!(land_at_camp_path(&root, "/etc/x", &src).is_err());
#[cfg(unix)]
{
let outside = dir.path().join("outside");
std::fs::create_dir_all(&outside).unwrap();
std::os::unix::fs::symlink(&outside, root.join("esc")).unwrap();
assert!(land_at_camp_path(&root, "esc/x", &src).is_err());
assert!(!outside.join("x").exists());
}
}
}