CH-J Server Managergerenciamento de servidor sobre SSH
E-mail
Fonte publicada

CH-J Server Manager

Navegue por diretórios e arquivos para uma versão específica do aplicativo.

Transferir fonte ZIP
CH-J / Server Manager 339 arquivos
core-20261014T184258Z-3fbed0b93fdf Adicionado: Data não registada · Construído:
Ficheiros
profileService.test.js Adicionado: Data não registada 2,8 KB · 55 linhas
Transferir ficheiro
1"use strict";
3const test = require("node:test");
4const assert = require("node:assert/strict");
5const fs = require("node:fs");
6const os = require("node:os");
7const path = require("node:path");
8const { ProfileService } = require("../src/main/profiles/profileService");
9const { VaultStore } = require("../src/main/security/vaultStore");
11test("profile service persists validated profiles and trusted host keys", async (t) => {
12 const root = fs.mkdtempSync(path.join(os.tmpdir(), "chj-profiles-"));
13 t.after(() => fs.rmSync(root, { recursive: true, force: true }));
14 const vault = new VaultStore(root);
15 await vault.create("correct horse battery staple");
16 const profiles = new ProfileService(vault);
18 const saved = profiles.save({ label: "NAS", host: "QNAP.local", port: 22, username: "admin", authMethod: "password" });
19 assert.equal(saved.host, "QNAP.local");
20 assert.equal(profiles.list()[0].id, saved.id);
21 const fingerprint = "ab".repeat(32);
22 profiles.trustHostKey(saved.host, saved.port, fingerprint);
23 assert.equal(profiles.getHostKey("QNAP.LOCAL", 22), fingerprint);
24 assert.equal(profiles.delete(saved.id).removed, true);
25 assert.equal(profiles.list().length, 0);
26});
28test("profile service rejects invalid connection data", async (t) => {
29 const root = fs.mkdtempSync(path.join(os.tmpdir(), "chj-profiles-"));
30 t.after(() => fs.rmSync(root, { recursive: true, force: true }));
31 const vault = new VaultStore(root);
32 await vault.create("correct horse battery staple");
33 const profiles = new ProfileService(vault);
34 assert.throws(() => profiles.save({ host: "bad host", username: "root" }), /host/);
35 assert.throws(() => profiles.save({ host: "server.local", port: 70000, username: "root" }), /port/);
36 assert.throws(() => profiles.save({ host: "server.local", username: "root", authMethod: "privateKey" }), /private key/);
37});
39test("profile service stores SSH passwords only in encrypted vault secrets", async (t) => {
40 const root = fs.mkdtempSync(path.join(os.tmpdir(), "chj-profile-password-"));
41 t.after(() => fs.rmSync(root, { recursive: true, force: true }));
42 const vault = new VaultStore(root);
43 await vault.create("correct horse battery staple");
44 const profiles = new ProfileService(vault);
45 const saved = profiles.save({ host: "server.local", username: "test", authMethod: "password", storePassword: true, password: "ssh-secret" });
46 assert.equal(saved.hasStoredPassword, true);
47 assert.equal(Object.prototype.hasOwnProperty.call(saved, "password"), false);
48 assert.equal(profiles.getStoredPassword(saved.id), "ssh-secret");
49 assert.doesNotMatch(fs.readFileSync(vault.dataPath, "utf8"), /ssh-secret/);
51 profiles.save({ ...saved, storePassword: true, password: "" });
52 assert.equal(profiles.getStoredPassword(saved.id), "ssh-secret");
53 profiles.save({ ...saved, storePassword: false });
54 assert.equal(profiles.getStoredPassword(saved.id), null);
55});
SHA-256279a3e96334d5d3054693f53727744151f2eb2e0d92f3e186c172aca30def0f5

CH-J Proprietary Software License 1.14 · A fonte é fornecida sob o CH-J Proprietary Software License 1.14. A sua disponibilidade não altera os termos licença nem concede direitos adicionais.

Ficheiro SHA-2563df08cf5e899262a6ce92d7ec2caf5c42b683f1f2b57055662b845ff7dde67a8