feat: Decode com.apple.ResourceFork extended attributes

This commit is contained in:
Robert Minsk 2023-12-24 10:52:35 -08:00
parent 582603b3cc
commit 6c921e7b3c
3 changed files with 81 additions and 0 deletions

49
Cargo.lock generated
View file

@ -247,6 +247,21 @@ version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
[[package]]
name = "crc"
version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
dependencies = [
"crc-catalog",
]
[[package]]
name = "crc-catalog"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
[[package]]
name = "criterion"
version = "0.5.1"
@ -397,6 +412,7 @@ dependencies = [
"libc",
"locale",
"log",
"macbinary",
"natord",
"num_cpus",
"number_prefix",
@ -654,6 +670,19 @@ version = "0.4.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
[[package]]
name = "macbinary"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f3b20f06e85c883de160086c2e2b45524ff19888271eccd593c8956d1fc1687"
dependencies = [
"crc",
"serde",
"serde-wasm-bindgen",
"serde_bytes",
"wasm-bindgen",
]
[[package]]
name = "matches"
version = "0.1.8"
@ -1061,6 +1090,26 @@ dependencies = [
"serde_derive",
]
[[package]]
name = "serde-wasm-bindgen"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e"
dependencies = [
"js-sys",
"serde",
"wasm-bindgen",
]
[[package]]
name = "serde_bytes"
version = "0.11.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff"
dependencies = [
"serde",
]
[[package]]
name = "serde_derive"
version = "1.0.188"

View file

@ -109,6 +109,9 @@ windows-sys = { version = "0.52.0", features = [
"Win32_Foundation",
] }
[target.'cfg(target_os = "macos")'.dependencies]
macbinary = { version = "0.2.1" }
[build-dependencies]
chrono = { version = "0.4.31", default-features = false, features = ["clock"] }

View file

@ -580,6 +580,10 @@ const ATTRIBUTE_DISPLAYS: &[AttributeDisplay] = &[
attribute: "com.apple.macl",
display: display_macl,
},
AttributeDisplay {
attribute: "com.apple.ResourceFork",
display: display_resource_fork,
},
];
#[cfg(not(target_os = "macos"))]
@ -659,6 +663,31 @@ fn display_macl(attribute: &Attribute) -> Option<String> {
})
}
#[cfg(target_os = "macos")]
fn display_resource_fork(attribute: &Attribute) -> Option<String> {
attribute.value.as_ref().and_then(|v| {
let rsrc = macbinary::ResourceFork::new(v).ok()?;
let mut resources = Vec::new();
for item in rsrc.resource_types() {
resources.extend(rsrc.resources(item).map(|resource| match resource.name() {
None => format!(
r#"{{"type": {:?}, "id": {}, "length": {}}}"#,
item.resource_type(),
resource.id(),
resource.data().len()
),
Some(name) => format!(
r#"{{"type": {:?}, "name": {name:?}, "id": {}, "length": {}}}"#,
item.resource_type(),
resource.id(),
resource.data().len()
),
}));
}
(!resources.is_empty()).then(|| format!("[{}]", resources.join(", ")))
})
}
// plist::XmlWriter takes the writer instead of borrowing it. This is a
// wrapper around a borrowed vector that just forwards the Write trait
// calls to the borrowed vector.