"use strict"; const api = window.chjPlugin; const i18n = window.chjPluginI18n.createI18n("cs"); const t = i18n.t; const 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}`)])); const bits = { rsa: [2048, 3072, 4096], ecdsa: [256, 384, 521], dsa: [1024], rsa1: [1024] }; let generationId = null; function setStatus(message, error = false) { elements.status.textContent = message; elements.status.classList.toggle("error", error); } function updateType() { const type = elements.keyType.value; const choices = bits[type] || []; elements.keyBits.replaceChildren(...choices.map((value) => new Option(String(value), String(value), value === (type === "rsa" ? 4096 : choices[0]), value === (type === "rsa" ? 4096 : choices[0])))); elements.bitsLabel.hidden = choices.length === 0; elements.legacyField.hidden = type !== "dsa" && type !== "rsa1"; if (elements.legacyField.hidden) elements.legacyConfirmed.checked = false; if (type === "rsa1") elements.keyFormat.value = "ppk"; elements.keyFormat.disabled = type === "rsa1"; } elements.keyType.addEventListener("change", updateType); elements.closeButton.addEventListener("click", () => api.close()); elements.generatorForm.addEventListener("submit", async (event) => { event.preventDefault(); setStatus(t("Generuji klíčový pár…")); generationId = null; elements.saveButton.disabled = true; try { const generated = await api.keys.generate({ type: elements.keyType.value, bits: Number(elements.keyBits.value || 0), comment: elements.keyComment.value, passphrase: elements.keyPassphrase.value, privateKeyFormat: elements.keyFormat.value, legacyConfirmed: elements.legacyConfirmed.checked }); generationId = generated.generationId; elements.privateKey.value = generated.privateKey; elements.privateFormat.textContent = { openssh: "OpenSSH", pem: "PEM / PKCS#8", ppk: "PuTTY PPK v2" }[generated.privateKeyFormat] || generated.privateKeyFormat; elements.publicKey.value = generated.publicKey; elements.publicFormat.textContent = generated.publicKeyOpenSsh ? "OpenSSH" : "SPKI PEM"; elements.notice.hidden = !generated.notice; elements.notice.textContent = generated.notice; elements.result.hidden = false; elements.saveButton.disabled = false; setStatus(t("{type} bylo vygenerováno.", { type: `${generated.type}${generated.bits ? ` / ${generated.bits}` : ""}` })); } catch (error) { setStatus(error?.message || String(error), true); } }); elements.saveButton.addEventListener("click", async () => { if (!generationId) return; try { const result = await api.keys.save(generationId); if (!result.canceled) setStatus(t("Uloženo: {privatePath} a {publicPath}", { privatePath: result.privatePath, publicPath: result.publicPath })); } catch (error) { setStatus(error?.message || String(error), true); } }); // ---------- password generator ---------- let passwordId = null; const passwordElements = Object.fromEntries(["passwordForm", "passwordLength", "passwordLengthRange", "pwUpper", "pwLower", "pwDigits", "pwSpecial", "pwGrouped", "passwordOutput", "copyPasswordButton", "passwordInfo"].map((id) => [id, document.querySelector(`#${id}`)])); passwordElements.passwordLength.addEventListener("input", () => { passwordElements.passwordLengthRange.value = passwordElements.passwordLength.value; }); passwordElements.passwordLengthRange.addEventListener("input", () => { passwordElements.passwordLength.value = passwordElements.passwordLengthRange.value; }); passwordElements.passwordForm.addEventListener("submit", async (event) => { event.preventDefault(); passwordElements.copyPasswordButton.disabled = true; try { const result = await api.keys.password({ length: Number(passwordElements.passwordLength.value), upper: passwordElements.pwUpper.checked, lower: passwordElements.pwLower.checked, digits: passwordElements.pwDigits.checked, special: passwordElements.pwSpecial.checked, grouped: passwordElements.pwGrouped.checked }); passwordElements.passwordOutput.value = result.password; passwordId = result.passwordId; passwordElements.copyPasswordButton.disabled = false; 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 })); } catch (error) { passwordElements.passwordOutput.value = ""; setStatus(error?.message || String(error), true); } }); // Core copies the password (plugin windows have no clipboard permission). passwordElements.copyPasswordButton.addEventListener("click", async () => { try { await api.keys.copyPassword(passwordId); setStatus(t("Heslo zkopírováno do schránky.")); } catch (error) { setStatus(error?.message || String(error), true); } }); (async () => { try { i18n.setLanguage(await api.ui.getLanguage()); } catch {} i18n.apply(document); api.ui.onLanguageChanged((language) => { i18n.setLanguage(language); i18n.apply(document); }); const info = await api.getInfo(); elements.pluginVersion.textContent = `${info.name} v${info.version} · ${info.publisher}`; updateType(); })().catch((error) => setStatus(error?.message || String(error), true));