mirror of
https://github.com/Yuyi-Oak/BlueArchiveToolkit.git
synced 2026-07-22 04:35:16 +08:00
feat: validate official zip structure
This commit is contained in:
@@ -257,7 +257,7 @@ impl TestHarness {
|
||||
fs::write(&resources_assets_path, &resources_assets).unwrap();
|
||||
|
||||
let zip_fixture = temp.path().join("downloaded.zip");
|
||||
fs::write(&zip_fixture, b"dummy zip content").unwrap();
|
||||
fs::write(&zip_fixture, one_file_zip(b"fixture.txt", b"ok")).unwrap();
|
||||
|
||||
let curl_log = temp.path().join("curl.log");
|
||||
let curl_script = temp.path().join("fake-curl");
|
||||
@@ -331,6 +331,54 @@ fn write_executable(path: &Path, content: &str) {
|
||||
fs::set_permissions(path, permissions).unwrap();
|
||||
}
|
||||
|
||||
fn one_file_zip(name: &[u8], data: &[u8]) -> Vec<u8> {
|
||||
let mut bytes = Vec::new();
|
||||
bytes.extend_from_slice(&0x0403_4b50u32.to_le_bytes());
|
||||
bytes.extend_from_slice(&20u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u32.to_le_bytes());
|
||||
bytes.extend_from_slice(&(data.len() as u32).to_le_bytes());
|
||||
bytes.extend_from_slice(&(data.len() as u32).to_le_bytes());
|
||||
bytes.extend_from_slice(&(name.len() as u16).to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(name);
|
||||
bytes.extend_from_slice(data);
|
||||
|
||||
let central_offset = bytes.len() as u32;
|
||||
bytes.extend_from_slice(&0x0201_4b50u32.to_le_bytes());
|
||||
bytes.extend_from_slice(&20u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&20u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u32.to_le_bytes());
|
||||
bytes.extend_from_slice(&(data.len() as u32).to_le_bytes());
|
||||
bytes.extend_from_slice(&(data.len() as u32).to_le_bytes());
|
||||
bytes.extend_from_slice(&(name.len() as u16).to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u32.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u32.to_le_bytes());
|
||||
bytes.extend_from_slice(name);
|
||||
let central_size = bytes.len() as u32 - central_offset;
|
||||
|
||||
bytes.extend_from_slice(&0x0605_4b50u32.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&1u16.to_le_bytes());
|
||||
bytes.extend_from_slice(&1u16.to_le_bytes());
|
||||
bytes.extend_from_slice(¢ral_size.to_le_bytes());
|
||||
bytes.extend_from_slice(¢ral_offset.to_le_bytes());
|
||||
bytes.extend_from_slice(&0u16.to_le_bytes());
|
||||
bytes
|
||||
}
|
||||
|
||||
fn official_curl_script(
|
||||
curl_log: &Path,
|
||||
zip_fixture: &Path,
|
||||
|
||||
Reference in New Issue
Block a user