Files
2026-10-17 21:21:03 +07:00

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/)
})