CH-J Server Managerspráva serverů přes SSH
Menu
Vydané zdroje

CH-J Server Manager

Procházejte adresáře a soubory konkrétního vydání aplikace.

Stáhnout zdroje ZIP
CH-J Proprietary Software License 1.14

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í.

4,7 KB · 44 řádkůStáhnout soubor
1"use strict";
2const test = require("node:test");
3const assert = require("node:assert/strict");
4const fs = require("node:fs");
5const path = require("node:path");
6const vm = require("node:vm");
7const { EventEmitter } = require("node:events");
8const { registerCoreIpc } = require("../src/main/ipc/registerCoreIpc");
9const { DiagnosticsService } = require("../src/main/diagnostics/diagnosticsService");
10const { tcpProbe } = require("../src/main/diagnostics/socketDiagnostics");
11const { catalogs } = require("../src/renderer/diagnosticsI18n");
12test("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});
22test("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});
30test("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});
36test("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