Initial curated chimera source from a8ae5b1db07fb49926c94585e2718e5130330974
This commit is contained in:
commit
c737a37f71
531 files changed
+119270
No files matched your search
@@ -0,0 +1,117 @@
|
||||
'use strict';
|
||||
|
||||
const assert = require('node:assert/strict');
|
||||
const { EventEmitter } = require('events');
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const path = require('path');
|
||||
const test = require('node:test');
|
||||
const { createPs5KlogService, cleanLine, severityFor, PS5_KLOG_RUNTIME } = require('../../src/services/ps5-klog-service');
|
||||
|
||||
class FakeSocket extends EventEmitter {
|
||||
constructor() { super(); this.writeCalls = 0; this.destroyed = false; }
|
||||
write() { this.writeCalls += 1; }
|
||||
destroy() { this.destroyed = true; }
|
||||
unref() {}
|
||||
}
|
||||
|
||||
function fixture() {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'chimera-klog-'));
|
||||
const settings = { get(key, fallback) { return key === 'ftp.host' ? '192.0.2.5' : key === 'klog.port' ? 3232 : fallback; } };
|
||||
const socket = new FakeSocket();
|
||||
const audited = [];
|
||||
const service = createPs5KlogService({
|
||||
settings,
|
||||
paths: { logs: root },
|
||||
logger: { audit: (event, details) => audited.push({ event, details }) },
|
||||
socketFactory: options => { socket.options = options; return socket; },
|
||||
});
|
||||
return { root, socket, service, audited };
|
||||
}
|
||||
|
||||
test('passive klog capture never writes to the PS5 and redacts stored lines', () => {
|
||||
const f = fixture();
|
||||
try {
|
||||
const started = f.service.start({ durationSeconds: 30, byteLimit: 128 * 1024 });
|
||||
assert.equal(started.zeroWriteContract, true);
|
||||
assert.deepEqual(f.socket.options, { host: '192.0.2.5', port: 9081 });
|
||||
assert.equal(started.configurationDrift, true);
|
||||
assert.equal(started.runtime, PS5_KLOG_RUNTIME);
|
||||
f.socket.emit('connect');
|
||||
f.socket.emit('data', Buffer.from('kernel ready\nERROR password=hunter2 token:abc123\n'));
|
||||
const stopped = f.service.stop('manual');
|
||||
assert.equal(stopped.running, false);
|
||||
assert.equal(stopped.lines, 2);
|
||||
assert.equal(f.socket.writeCalls, 0);
|
||||
const result = f.service.query({ severity: 'error', search: 'password' });
|
||||
assert.equal(result.entries.length, 1);
|
||||
assert.match(result.entries[0].line, /password=\[REDACTED\]/i);
|
||||
assert.doesNotMatch(fs.readFileSync(f.service.file, 'utf8'), /hunter2|abc123/);
|
||||
assert.equal(JSON.parse(f.service.exportLogs().toString('utf8')).status.payloadLaunchAttempted, false);
|
||||
} finally { f.service.stop(); fs.rmSync(f.root, { recursive: true, force: true }); }
|
||||
});
|
||||
|
||||
test('klog validation bounds captures and classifies console output conservatively', () => {
|
||||
assert.equal(severityFor('kernel panic happened'), 'error');
|
||||
assert.equal(severityFor('warning: retry'), 'warn');
|
||||
assert.equal(cleanLine('Authorization: very-secret'), 'Authorization=[REDACTED]');
|
||||
const f = fixture();
|
||||
try {
|
||||
const status = f.service.start({ durationSeconds: -1, byteLimit: 1 });
|
||||
assert.equal(status.durationSeconds, 5);
|
||||
assert.equal(status.byteLimit, 64 * 1024);
|
||||
assert.equal(status.lineLimit, 20_000);
|
||||
assert.throws(() => f.service.start(), /al een/);
|
||||
} finally { f.service.stop(); fs.rmSync(f.root, { recursive: true, force: true }); }
|
||||
});
|
||||
|
||||
test('bounded identity capture proves current firmware only from the TCP 9081 session', async () => {
|
||||
const f = fixture();
|
||||
try {
|
||||
const pending = f.service.captureIdentity({ durationSeconds: 5 });
|
||||
f.socket.emit('connect');
|
||||
f.socket.emit('data', Buffer.from('system software 9.600.004\nbuild J03308751\n'));
|
||||
const evidence = await pending;
|
||||
assert.equal(evidence.endpoint.port, 9081);
|
||||
assert.equal(evidence.readOnly, true);
|
||||
assert.equal(evidence.connected, true);
|
||||
assert.equal(evidence.systemSoftwareVersion, '9.600.004');
|
||||
assert.equal(evidence.systemSoftwareEvidence, 'direct-version-line');
|
||||
assert.equal(evidence.normalizedFirmware, '9.60');
|
||||
assert.equal(evidence.buildIdentity, 'J03308751');
|
||||
assert.equal(evidence.exact, true);
|
||||
assert.equal(f.socket.writeCalls, 0);
|
||||
} finally { f.service.stop(); fs.rmSync(f.root, { recursive: true, force: true }); }
|
||||
});
|
||||
|
||||
test('bounded identity capture derives the exact version from the pinned fresh build identity', async () => {
|
||||
const f = fixture();
|
||||
try {
|
||||
const pending = f.service.captureIdentity({ durationSeconds: 5 });
|
||||
f.socket.emit('connect');
|
||||
f.socket.emit('data', Buffer.from('W:\\\\Build\\\\J03308751\\\\vsh\\\\shell\\\\shell_core\\\\worker.cpp\n'));
|
||||
const evidence = await pending;
|
||||
assert.equal(evidence.connected, true);
|
||||
assert.equal(evidence.currentEvidence, true);
|
||||
assert.equal(evidence.systemSoftwareVersion, '9.600.004');
|
||||
assert.equal(evidence.systemSoftwareEvidence, 'pinned-build-map');
|
||||
assert.equal(evidence.normalizedFirmware, '9.60');
|
||||
assert.equal(evidence.buildIdentity, 'J03308751');
|
||||
assert.equal(evidence.exact, true);
|
||||
assert.equal(f.socket.writeCalls, 0);
|
||||
} finally { f.service.stop(); fs.rmSync(f.root, { recursive: true, force: true }); }
|
||||
});
|
||||
|
||||
test('bounded identity capture rejects a version line without the exact fresh build identity', async () => {
|
||||
const f = fixture();
|
||||
try {
|
||||
const pending = f.service.captureIdentity({ durationSeconds: 5 });
|
||||
f.socket.emit('connect');
|
||||
f.socket.emit('data', Buffer.from('system software 9.600.004\n'));
|
||||
const evidence = await pending;
|
||||
assert.equal(evidence.connected, true);
|
||||
assert.equal(evidence.systemSoftwareEvidence, 'direct-version-line');
|
||||
assert.equal(evidence.buildIdentity, null);
|
||||
assert.equal(evidence.exact, false);
|
||||
} finally { f.service.stop(); fs.rmSync(f.root, { recursive: true, force: true }); }
|
||||
});
|
||||
Reference in new issue
Block a user