const assert = require('node:assert/strict') const { test } = require('node:test') const { mkdtempSync, writeFileSync, mkdirSync, rmSync } = require('node:fs') const { join } = require('node:path') const { tmpdir } = require('node:os') const asar = require('@electron/asar') const { binaryArchitecture, verifyAsar, verifyDirectory, fileHash } = require('./release.cjs') test('release verifier rejects test files and secrets in app.asar', async (t) => { const dir = mkdtempSync(join(tmpdir(), 'screen-release-test-')) t.after(() => rmSync(dir, { recursive: true, force: true })) const source = join(dir, 'source') mkdirSync(source) writeFileSync(join(source, '.env'), 'secret') const archive = join(dir, 'app.asar') await asar.createPackage(source, archive) assert.throws(() => verifyAsar(archive), /Forbidden/) }) test('release verifier checks native ELF and PE architecture', (t) => { const dir = mkdtempSync(join(tmpdir(), 'screen-release-test-')) t.after(() => rmSync(dir, { recursive: true, force: true })) const elf = Buffer.alloc(64) elf.write('7f454c46', 0, 'hex') elf.writeUInt16LE(183, 18) const path = join(dir, 'binary') writeFileSync(path, elf) assert.equal(binaryArchitecture(path, 'linux'), 'arm64') const pe = Buffer.alloc(128) pe.write('MZ') pe.writeUInt32LE(64, 0x3c) pe.write('PE\0\0', 64) pe.writeUInt16LE(0x8664, 68) writeFileSync(path, pe) assert.equal(binaryArchitecture(path, 'win32'), 'x64') }) test('release verifier detects changed media bytes after packaging', async (t) => { const dir = mkdtempSync(join(tmpdir(), 'screen-release-test-')) t.after(() => rmSync(dir, { recursive: true, force: true })) const source = join(dir, 'source') for (const file of [ 'dist/index.html', 'dist-electron/electron/main.js', 'dist-electron/electron/preload.js', 'dist-electron/electron/online.js', 'dist-electron/electron/diagnostics.js', ]) { const path = join(source, file) mkdirSync(require('node:path').dirname(path), { recursive: true }) writeFileSync(path, 'fixture') } const metadata = require('../package.json') writeFileSync( join(source, 'package.json'), JSON.stringify({ name: metadata.name, version: metadata.version }), ) const resources = join(dir, 'resources') mkdirSync(join(resources, 'fixtures'), { recursive: true }) await asar.createPackage(source, join(resources, 'app.asar')) writeFileSync(join(resources, 'fixtures/audio.wav'), 'audio') writeFileSync(join(resources, 'fixtures/video.mp4'), 'video') const elf = Buffer.alloc(64) elf.write('7f454c46', 0, 'hex') elf.writeUInt16LE(62, 18) writeFileSync(join(dir, metadata.name), elf) const files = {} for (const name of ['app.asar', 'fixtures/audio.wav', 'fixtures/video.mp4']) files[name] = await fileHash(join(resources, name)) writeFileSync( join(resources, 'build-info.json'), JSON.stringify({ formatVersion: 1, version: metadata.version, platform: 'linux', arch: 'x64', files, }), ) await verifyDirectory(dir) writeFileSync(join(resources, 'fixtures/video.mp4'), 'altered') await assert.rejects(verifyDirectory(dir), /Hash mismatch/) })