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

CH-J Tools

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

Stáhnout zdroje ZIP
CH-J / Server Manager 406 souborů
core-20261024T135205Z-7c487d719de2 Přidáno: · Sestaveno:
index.js Přidáno: Datum není evidováno 5,5 KB · 95 řádků
Kód Stáhnout soubor
1"use strict";
3const api = window.chjPlugin;
4const i18n = window.chjPluginI18n.createI18n("cs");
5const t = i18n.t;
6const elements = Object.fromEntries(["pluginVersion", "closeButton", "generatorForm", "keyType", "bitsLabel", "keyBits", "keyFormat", "keyComment", "keyPassphrase", "legacyField", "legacyConfirmed", "saveButton", "status", "result", "privateKey", "privateFormat", "publicKey", "publicFormat", "notice"].map((id) => [id, document.querySelector(`#${id}`)]));
7const bits = { rsa: [2048, 3072, 4096], ecdsa: [256, 384, 521], dsa: [1024], rsa1: [1024] };
8let generationId = null;
10function setStatus(message, error = false) {
11 elements.status.textContent = message;
12 elements.status.classList.toggle("error", error);
15function updateType() {
16 const type = elements.keyType.value;
17 const choices = bits[type] || [];
18 elements.keyBits.replaceChildren(...choices.map((value) => new Option(String(value), String(value), value === (type === "rsa" ? 4096 : choices[0]), value === (type === "rsa" ? 4096 : choices[0]))));
19 elements.bitsLabel.hidden = choices.length === 0;
20 elements.legacyField.hidden = type !== "dsa" && type !== "rsa1";
21 if (elements.legacyField.hidden) elements.legacyConfirmed.checked = false;
22 if (type === "rsa1") elements.keyFormat.value = "ppk";
23 elements.keyFormat.disabled = type === "rsa1";
26elements.keyType.addEventListener("change", updateType);
27elements.closeButton.addEventListener("click", () => api.close());
28elements.generatorForm.addEventListener("submit", async (event) => {
29 event.preventDefault();
30 setStatus(t("Generuji klíčový pár…"));
31 generationId = null; elements.saveButton.disabled = true;
32 try {
33 const generated = await api.keys.generate({
34 type: elements.keyType.value,
35 bits: Number(elements.keyBits.value || 0),
36 comment: elements.keyComment.value,
37 passphrase: elements.keyPassphrase.value,
38 privateKeyFormat: elements.keyFormat.value,
39 legacyConfirmed: elements.legacyConfirmed.checked
40 });
41 generationId = generated.generationId;
42 elements.privateKey.value = generated.privateKey;
43 elements.privateFormat.textContent = { openssh: "OpenSSH", pem: "PEM / PKCS#8", ppk: "PuTTY PPK v2" }[generated.privateKeyFormat] || generated.privateKeyFormat;
44 elements.publicKey.value = generated.publicKey;
45 elements.publicFormat.textContent = generated.publicKeyOpenSsh ? "OpenSSH" : "SPKI PEM";
46 elements.notice.hidden = !generated.notice;
47 elements.notice.textContent = generated.notice;
48 elements.result.hidden = false;
49 elements.saveButton.disabled = false;
50 setStatus(t("{type} bylo vygenerováno.", { type: `${generated.type}${generated.bits ? ` / ${generated.bits}` : ""}` }));
51 } catch (error) { setStatus(error?.message || String(error), true); }
52});
53elements.saveButton.addEventListener("click", async () => {
54 if (!generationId) return;
55 try {
56 const result = await api.keys.save(generationId);
57 if (!result.canceled) setStatus(t("Uloženo: {privatePath} a {publicPath}", { privatePath: result.privatePath, publicPath: result.publicPath }));
58 } catch (error) { setStatus(error?.message || String(error), true); }
59});
61// ---------- password generator ----------
62let passwordId = null;
63const passwordElements = Object.fromEntries(["passwordForm", "passwordLength", "passwordLengthRange", "pwUpper", "pwLower", "pwDigits", "pwSpecial", "pwGrouped", "passwordOutput", "copyPasswordButton", "passwordInfo"].map((id) => [id, document.querySelector(`#${id}`)]));
64passwordElements.passwordLength.addEventListener("input", () => { passwordElements.passwordLengthRange.value = passwordElements.passwordLength.value; });
65passwordElements.passwordLengthRange.addEventListener("input", () => { passwordElements.passwordLength.value = passwordElements.passwordLengthRange.value; });
66passwordElements.passwordForm.addEventListener("submit", async (event) => {
67 event.preventDefault();
68 passwordElements.copyPasswordButton.disabled = true;
69 try {
70 const result = await api.keys.password({
71 length: Number(passwordElements.passwordLength.value),
72 upper: passwordElements.pwUpper.checked, lower: passwordElements.pwLower.checked,
73 digits: passwordElements.pwDigits.checked, special: passwordElements.pwSpecial.checked,
74 grouped: passwordElements.pwGrouped.checked
75 });
76 passwordElements.passwordOutput.value = result.password;
77 passwordId = result.passwordId;
78 passwordElements.copyPasswordButton.disabled = false;
79 setStatus(t("Heslo: {length} znaků, {random} náhodných z {pool} možných (přibližně {bits} bitů entropie).", { length: result.length, random: result.randomCharacters, pool: result.poolSize, bits: result.entropyBits }));
80 } catch (error) { passwordElements.passwordOutput.value = ""; setStatus(error?.message || String(error), true); }
81});
82// Core copies the password (plugin windows have no clipboard permission).
83passwordElements.copyPasswordButton.addEventListener("click", async () => {
84 try { await api.keys.copyPassword(passwordId); setStatus(t("Heslo zkopírováno do schránky.")); }
85 catch (error) { setStatus(error?.message || String(error), true); }
86});
88(async () => {
89 try { i18n.setLanguage(await api.ui.getLanguage()); } catch {}
90 i18n.apply(document);
91 api.ui.onLanguageChanged((language) => { i18n.setLanguage(language); i18n.apply(document); });
92 const info = await api.getInfo();
93 elements.pluginVersion.textContent = `${info.name} v${info.version} · ${info.publisher}`;
94 updateType();
95})().catch((error) => setStatus(error?.message || String(error), true));
SHA-256fba0aa7a5cb771ccc3e0a652c63bd28139adc9c3f746f95b85e646cec6aa920a

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

SHA-256 archivu476ed8aef0f1e96a5acdf223127b6692acdf4492eeaf5d0816b6e2a634fbbda6
Soubory