import { test } from '@japa/runner' import { checkHeader, encodedHeaderEncrypted, listingStart, parseBsdtarListing, parseSevenZipStart, readNumber, sevenZipVolume, } from '#lib/sevenzip/index' // `7z a tiny.7z Tiny.Release` (Tiny.Release/a.txt): an LZMA-encoded header. const ENCODED = Buffer.from( 'N3q8ryccAATeIVLCfQAAAAAAAAAhAAAAAAAAAGkLW/MBAAtoZWxsbyB3b3JsZAoAAACBMweuD87ysgwHyEN/QbH6/duIttdfpOXRhZbi6t7tycGOUDyW1l2aTE7xmuZ/NAXKgg599VxKYAF1XImsfT9LzHQKaEH6PEZambLnwJM62mXXEJIpaYvhCrHFeQv+jLnYjgJMfwZEcAAAABcGEAEJbQAHCwEAASMDAQEFXQAQAAAMgJYKASTou9wAAA==', 'base64' ) // The same with -mhc=off: a plain header. const PLAIN = Buffer.from( 'N3q8ryccAASpRwRsEAAAAAAAAACWAAAAAAAAACTou9wBAAtoZWxsbyB3b3JsZAoAAQQGAAEJEAAHCwEAASEhAQAMDAAICgEtOwivAAAFAg4BgBkJAAAAAAAAAAAAEUEAVABpAG4AeQAuAFIAZQBsAGUAYQBzAGUAAABUAGkAbgB5AC4AUgBlAGwAZQBhAHMAZQAvAGEALgB0AHgAdAAAABkCAAAUEgEA/QYYLBBR3QH9BhgsEFHdARUKAQAQgP1BIIC0gQAA', 'base64' ) // `7z a -pSecret -mhe=on`: an encrypted header; with -mhe=off only the file data is encrypted. const HEADER_ENCRYPTED = Buffer.from( 'N3q8ryccAARtHJcDoAAAAAAAAAA+AAAAAAAAAGqzNxflXzLifhRjmRlgXvMEO9zhcADrwDAjtLT4COwZQUsqMkFT0jGipxcTP5MNbocZW7iGLP5PCAuqfouDxAoI2Zw2AqMRF2m/XOVYRokWM4bHuH73xp1LIva5JpyAQSViuI66Jf5xxemaGnSvoC5/mHDHe6VZUxQwMmH3QuTR15+loSuNhbEU2feP1E2EdwIvHSYXdJ9jDqHe6XjW3gfh/2+NFwYQAQmAkAAHCwEAAiQG8QcBElMPIu8lRTeoM0YvSGcM+B6l/SMDAQEFXQAQAAABAAyAgoCmCgGDcQMzAAA=', 'base64' ) const DATA_ENCRYPTED = Buffer.from( 'N3q8ryccAASBXGg3kQAAAAAAAAAiAAAAAAAAAO4xlWU16N8rTbvoF1dbq3eLPdZiAACBMweuD87ysgwHsMPa919FiphISvi++OI2giqcUPCAdmXzZtkqFSqP0Nr4rWaRH5dR+vNA2jJGIbDAZpbQM/ka9oh27tkqKb/+dHyx1SFHkxbLyWvd7W0qwaDHxSvW2fTpRdJSmi74crF957Qwy+P8dDF0MOYr5AGHAQHJSAAAFwYQAQmAgQAHCwEAASMDAQEFXQAQAAAMgKYKAaUZQIYAAA==', 'base64' ) const headerOf = (archive: Buffer) => { const start = parseSevenZipStart(archive)! return archive.subarray(start.headerStart, start.archiveSize) } test.group('sevenzip', () => { test('tells encrypted headers from the encoded header alone', ({ assert }) => { assert.isTrue(encodedHeaderEncrypted(headerOf(HEADER_ENCRYPTED))) assert.isFalse(encodedHeaderEncrypted(headerOf(DATA_ENCRYPTED))) assert.isFalse(encodedHeaderEncrypted(headerOf(ENCODED))) // A plain header isn't encoded: bsdtar lists it. assert.isNull(encodedHeaderEncrypted(headerOf(PLAIN))) assert.isNull(encodedHeaderEncrypted(headerOf(HEADER_ENCRYPTED).subarray(0, 12))) }) test('finds the header at the end from the signature header', ({ assert }) => { const start = parseSevenZipStart(ENCODED)! assert.deepEqual(start, { headerStart: 157, headerSize: 33, headerCrc: start.headerCrc, archiveSize: 190 }) const header = ENCODED.subarray(start.headerStart, start.archiveSize) assert.isTrue(checkHeader(start, header)) assert.isFalse(checkHeader(start, Buffer.alloc(33))) // Encoded: the packed header right after the file data (packPos 16) is needed too. assert.equal(listingStart(start, header), 48) const plain = parseSevenZipStart(PLAIN)! assert.equal(plain.archiveSize, PLAIN.length) assert.equal(listingStart(plain, PLAIN.subarray(plain.headerStart)), plain.headerStart) }) test('rejects other data and a damaged signature header', ({ assert }) => { assert.isNull(parseSevenZipStart(Buffer.from('Rar!\x1a\x07\x01\x00'.padEnd(40, '\0'), 'latin1'))) const damaged = Buffer.from(ENCODED) damaged[14] ^= 1 assert.isNull(parseSevenZipStart(damaged)) }) test('reads 7z numbers', ({ assert }) => { assert.deepEqual(readNumber(Buffer.from([0x10]), 0), [16, 1]) assert.deepEqual(readNumber(Buffer.from([0x81, 0x02]), 0), [0x102, 2]) assert.deepEqual(readNumber(Buffer.from([0xc0, 0x34, 0x12]), 0), [0x1234, 3]) assert.deepEqual(readNumber(Buffer.from([0xff, 1, 0, 0, 0, 0, 0, 0, 0]), 0), [1, 9]) }) test('parses bsdtar listings', ({ assert }) => { const out = [ 'drwxrwxr-x 0 0 0 0 Sep 30 19:13 Some.Release.2026/', '-rw-rw-r-- 0 0 0 3000000 Sep 30 19:13 Some.Release.2026/movie.mkv', '-rw-rw-r-- 0 0 0 3 Jan 1 2019 Some.Release.2026/some info.nfo', '', ].join('\n') assert.deepEqual(parseBsdtarListing(out), [ { name: 'Some.Release.2026', size: 0, directory: true }, { name: 'Some.Release.2026/movie.mkv', size: 3000000, directory: false }, { name: 'Some.Release.2026/some info.nfo', size: 3, directory: false }, ]) }) test('numbers volumes', ({ assert }) => { assert.equal(sevenZipVolume('x.7z.001'), 1) assert.equal(sevenZipVolume('X.7Z.012'), 12) assert.equal(sevenZipVolume('x.7z'), 0) assert.isNull(sevenZipVolume('x.part01.rar')) }) })