🎨 Update solidpkg reader
This commit is contained in:
parent
400be4f296
commit
ca2862fb3d
1 changed files with 15 additions and 7 deletions
|
@ -1,8 +1,8 @@
|
|||
import { TextDecoder } from 'util';
|
||||
import modifyPassword from './modifyPassword';
|
||||
|
||||
const MAGIC_END_OF_CENTRAL_DIR = 0x06054b50;
|
||||
const MAGIC_CENTRAL_DIR = 0x02014b50;
|
||||
const SIGNATURE_END_OF_CENTRAL_DIR = 0x06054b50;
|
||||
const SIGNATURE_CENTRAL_DIR = 0x02014b50;
|
||||
const COMPRESSION_DEFLATE = 8;
|
||||
|
||||
const Decoder = new TextDecoder('utf-8');
|
||||
|
@ -17,7 +17,7 @@ export default function readSolidpkg(buffer: Buffer) {
|
|||
let pos = buffer.length - 22; //end of central dir is at least 22 bytes long
|
||||
|
||||
//Find end of central dir
|
||||
while (pos >= 0 && dv.getUint32(pos, true) !== MAGIC_END_OF_CENTRAL_DIR) {
|
||||
while (pos >= 0 && dv.getUint32(pos, true) !== SIGNATURE_END_OF_CENTRAL_DIR) {
|
||||
pos -= 1;
|
||||
}
|
||||
if (pos < 0) {
|
||||
|
@ -25,7 +25,11 @@ export default function readSolidpkg(buffer: Buffer) {
|
|||
}
|
||||
pos += 4;
|
||||
|
||||
//skip 6 bytes
|
||||
/** skip 6 bytes:
|
||||
* number of this disk,
|
||||
* number of the disk with the start of the central directory
|
||||
* total number of entries in the central directory on this disk
|
||||
*/
|
||||
pos += 6;
|
||||
|
||||
/** Total number of entries in the central directory */
|
||||
|
@ -34,6 +38,7 @@ export default function readSolidpkg(buffer: Buffer) {
|
|||
const centralDirSize = dv.getUint32(pos, true); pos += 4;
|
||||
/** Offset of start of central directory with respect to the starting disk number */
|
||||
const centralDirOffset = dv.getUint32(pos, true); pos += 4;
|
||||
//ignore .ZIP file comment length
|
||||
|
||||
if (numEntries !== 1) {
|
||||
throw new Error(`Expected numEntries == 1 in end of central dir but it was "${numEntries}"`);
|
||||
|
@ -51,9 +56,9 @@ export default function readSolidpkg(buffer: Buffer) {
|
|||
pos -= 20 + centralDirSize;
|
||||
|
||||
{
|
||||
const magicNum = dv.getUint32(pos, true); pos += 4;
|
||||
if (magicNum !== MAGIC_CENTRAL_DIR) {
|
||||
throw new Error(`Expected central dir signature but found "0x${magicNum.toString(16)}"`);
|
||||
const signature = dv.getUint32(pos, true); pos += 4;
|
||||
if (signature !== SIGNATURE_CENTRAL_DIR) {
|
||||
throw new Error(`Expected central dir signature but found "0x${signature.toString(16)}"`);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,6 +87,9 @@ export default function readSolidpkg(buffer: Buffer) {
|
|||
pos += 8; //skip disk num start and file attributes
|
||||
const relOffset = dv.getUint32(pos, true); pos += 4;
|
||||
const fileName = Decoder.decode(new DataView(arrayBuffer, pos, fileNameLength)); pos += fileNameLength; //skip file name
|
||||
if (fileName !== 'metafile.solid') {
|
||||
throw new Error(`Expected file name to be "metafile.solid" but it was "${fileName}".`);
|
||||
}
|
||||
|
||||
//read password from extra field
|
||||
let encodedPassword: Uint8Array | undefined;
|
||||
|
|
Loading…
Reference in a new issue