Vydané zdroje
Stáhnout zdroje ZIP
CH-J Server Manager
Procházejte adresáře a soubory konkrétního vydání aplikace.
Zdroje jsou zveřejněny pod CH-J Proprietary Software License 1.14. Jejich dostupnost nemění licenční podmínky ani neposkytuje další oprávnění.
1
"use strict";2
const test = require("node:test");3
const assert = require("node:assert/strict");4
const fs = require("node:fs");5
const path = require("node:path");6
const vm = require("node:vm");7
const { EventEmitter } = require("node:events");8
const { registerCoreIpc } = require("../src/main/ipc/registerCoreIpc");9
const { DiagnosticsService } = require("../src/main/diagnostics/diagnosticsService");10
const { tcpProbe } = require("../src/main/diagnostics/socketDiagnostics");11
const { catalogs } = require("../src/renderer/diagnosticsI18n");12
test("diagnostics IPC checks sender, returns structured failures and confines copy/export to measured reports", async () => {13
const handlers = new Map(), copies = [], service = new DiagnosticsService();14
registerCoreIpc({ ipcMain: { handle: (channel, fn) => handlers.set(channel, fn), on() {} }, clipboard: { writeText: (text) => copies.push(text) }, diagnosticsService: service, getMainWindow: () => ({ isDestroyed: () => false, webContents: { id: 42 } }) });15
const trusted = { sender: { id: 42 } }, start = handlers.get("diagnostics:start");16
await assert.rejects(start({ sender: { id: 13 } }, { target: "127.0.0.1" }), { code: "UNTRUSTED_IPC_SENDER" });17
assert.deepEqual(await start(trusted, { target: "https://user:pass@localhost" }), { ok: false, error: { code: "URL_AUTH_OR_SCHEME_FORBIDDEN", message: "URL_AUTH_OR_SCHEME_FORBIDDEN" } });18
const result = await start(trusted, { target: "127.0.0.1", tools: ["dns"] }); assert.equal(result.ok, true); service.cancel(result.value.id);19
const copied = await handlers.get("diagnostics:copy")(trusted, { id: result.value.id }); assert.equal(copied.ok, true); assert.match(copies[0], /127.0.0.1/);20
const invalidExport = await handlers.get("diagnostics:export")(trusted, { id: result.value.id, format: "../../secret" }); assert.equal(invalidExport.ok, false); assert.equal(invalidExport.error.code, "INVALID_EXPORT_FORMAT");21
});22
test("preload exposes a frozen, narrow diagnostics API with disposable progress subscriptions", async () => {23
let exposed; const calls = [], listeners = new Map();24
const ipcRenderer = { invoke: async (...args) => { calls.push(args); }, on: (name, fn) => listeners.set(name, fn), removeListener: (name) => listeners.delete(name) };25
vm.runInNewContext(fs.readFileSync(path.join(__dirname, "../src/preload/corePreload.js"), "utf8"), { process: { platform: "linux" }, require: (name) => { assert.equal(name, "electron"); return { contextBridge: { exposeInMainWorld: (_name, value) => { exposed = value; } }, ipcRenderer }; } });26
assert.ok(Object.isFrozen(exposed.diagnostics)); assert.equal(exposed.diagnostics.exec, undefined);27
await exposed.diagnostics.start({ target: "localhost" }); assert.equal(calls[0][0], "diagnostics:start");28
let received; const dispose = exposed.diagnostics.onProgress((value) => { received = value; }); listeners.get("diagnostics:progress")({}, { kind: "complete" }); assert.equal(received.kind, "complete"); dispose(); assert.equal(listeners.size, 0);29
});30
test("TCP timeout and cancellation destroy their socket and preserve distinct statuses", async () => {31
let destroyed = 0;32
const connect = () => { const socket = new EventEmitter(); socket.destroy = () => { destroyed++; }; return socket; };33
const result = await tcpProbe("127.0.0.1", 443, { timeoutMs: 20 }, new AbortController().signal, connect); assert.equal(result.status, "timeout"); assert.equal(result.connectionMs, null);34
const controller = new AbortController(), request = tcpProbe("127.0.0.1", 443, { timeoutMs: 500 }, controller.signal, connect); controller.abort(); await assert.rejects(request, { code: "CANCELLED" }); assert.equal(destroyed, 2);35
});36
test("diagnostics navigation, translation catalogs and renderer isolation remain integrated", () => {37
const html = fs.readFileSync(path.join(__dirname, "../src/renderer/index.html"), "utf8");38
assert.ok(html.indexOf('data-view="plugins"') < html.indexOf('data-view="diagnostics"')); assert.ok(html.indexOf('data-view="diagnostics"') < html.indexOf('id="hashToolButton"'));39
assert.ok(html.indexOf('src="diagnostics.js"') < html.indexOf('src="app.js"'));40
for (const lang of ["cs", "de", "en"]) { assert.deepEqual(Object.keys(catalogs[lang]), Object.keys(catalogs.en)); assert.ok(catalogs[lang]["Run Diagnostics"]); assert.ok(catalogs[lang]["HTTP/3 testing unavailable"]); }41
const bootstrap = fs.readFileSync(path.join(__dirname, "../src/main/bootstrap/createMainWindow.js"), "utf8");42
assert.match(bootstrap, /contextIsolation: true/); assert.match(bootstrap, /nodeIntegration: false/); assert.match(bootstrap, /sandbox: true/);43
const renderer = fs.readFileSync(path.join(__dirname, "../src/renderer/diagnostics.js"), "utf8"); assert.ok(!/innerHTML|require\(|fetch\(/.test(renderer));44
});SHA-256: 19f4712ac41bc063dcd3ba8dbcc38f99c06b5ff3b30254ffb72f17cebff7d5bc
SHA-256 archivu: 5ac91caf4fa32a6fdb114f2430deed486fbe7489d5eea343d1f034169fafb5e0