From 8cdda57580bb1b4fdb19091c45b437f6327d78c0 Mon Sep 17 00:00:00 2001 From: zseri Date: Fri, 24 Dec 2021 20:29:08 +0100 Subject: feat(zseri): Add store-ref-scanner crate This crate implements the scanner for finding references to store paths in uncompressed binary blobs and text files. It is currently a minimally working prototype and it is probably a good idea to polish the interface further. Change-Id: I8406f9d52d254fc3d660ea2b9bc9b7841cc815ec Reviewed-on: https://cl.tvl.fyi/c/depot/+/4596 Tested-by: BuildkiteCI Reviewed-by: zseri --- users/zseri/store-ref-scanner/src/spec.rs | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 users/zseri/store-ref-scanner/src/spec.rs (limited to 'users/zseri/store-ref-scanner/src/spec.rs') diff --git a/users/zseri/store-ref-scanner/src/spec.rs b/users/zseri/store-ref-scanner/src/spec.rs new file mode 100644 index 000000000000..034779e8e8dc --- /dev/null +++ b/users/zseri/store-ref-scanner/src/spec.rs @@ -0,0 +1,46 @@ +use crate::hbm::HalfBytesMask; +use camino::Utf8PathBuf; +use once_cell::sync::Lazy; + +pub struct StoreSpec { + /// path to store without trailing slash + pub path_to_store: Utf8PathBuf, + + /// compressed map of allowed ASCII characters in hash part + pub valid_hashbytes: HalfBytesMask, + + /// compressed map of allowed ASCII characters in part after hash + pub valid_restbytes: HalfBytesMask, + + /// exact length of hash part of store paths + pub hashbytes_len: u8, +} + +impl StoreSpec { + pub(crate) fn check_rest(&self, rest: &[u8]) -> bool { + let hbl = self.hashbytes_len.into(); + rest.iter() + .take(hbl) + .take_while(|&&i| self.valid_hashbytes.contains(i)) + .count() + == hbl + } +} + +pub static SPEC_DFL_NIX2: Lazy = Lazy::new(|| StoreSpec { + path_to_store: "/nix/store".into(), + valid_hashbytes: HalfBytesMask::B32_REVSHA256, + valid_restbytes: HalfBytesMask::from_bytes( + b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-._?=", + ), + hashbytes_len: 32, +}); + +pub static SPEC_DFL_YZIX1: Lazy = Lazy::new(|| StoreSpec { + path_to_store: "/yzixs".into(), + valid_hashbytes: HalfBytesMask::B64_BLAKE2B256, + valid_restbytes: HalfBytesMask::from_bytes( + b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-._?=", + ), + hashbytes_len: 43, +}); -- cgit 1.4.1