82 lines
3.1 KiB
JavaScript
82 lines
3.1 KiB
JavaScript
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/)
|
|
})
|