@underpostnet/underpost
Version:
Underpost Platform — end-to-end CI/CD and application-delivery toolchain CLI. Covers bare metal, Kubernetes, K3s, kubeadm, LXD, container/image orchestration, secrets, databases, cron jobs, monitoring, SSH, runners, PWA + Workbox delivery, and release orc
96 lines (95 loc) • 3.89 kB
JavaScript
import { CryptoService } from '../../services/crypto/crypto.service.js';
import { UserService } from '../../services/user/user.service.js';
import { Auth } from './Auth.js';
import { BtnIcon } from './BtnIcon.js';
import { getId } from './CommonJs.js';
import { dynamicCol } from './Css.js';
import { EventsUI } from './EventsUI.js';
import { NotificationManager } from './NotificationManager.js';
import { Translate } from './Translate.js';
import { copyData, htmls, s } from './VanillaJs.js';
class Wallet {
static Data = {};
static async instance(options) {
const id = getId(Wallet.Data, 'wallet-');
setTimeout(async () => {
EventsUI.onClick(`.btn-generate-keys-${id}`, async (e) => {
e.preventDefault();
const algorithm = {
name: 'ECDSA',
namedCurve: 'P-384',
hash: 'SHA-256',
};
const format = 'jwk';
(async () => {
return;
const { data: payload } = await UserService.get({ id: 'public-key-sign-token' });
const signature = await window.crypto.subtle.sign(
algorithm,
keyPair.privateKey,
new TextEncoder().encode(payload),
);
const base64Signature = btoa(String.fromCharCode(...new Uint8Array(signature)));
})();
const keyPair = await window.crypto.subtle.generateKey(algorithm, true, ['sign', 'verify']);
const privateKey = await window.crypto.subtle.exportKey(format, keyPair.privateKey);
const publicKey = await window.crypto.subtle.exportKey(format, keyPair.publicKey);
const displayKeys = JSON.stringify({ privateKey, publicKey }, null, 4);
htmls('.keys-display', displayKeys);
if (Auth.getToken()) {
const result = await CryptoService.post({
body: {
data: JSON.stringify(publicKey),
format,
algorithm,
},
});
}
NotificationManager.Push({
// html: Translate.instance(`${result.status}-generate-keys`),
html: Translate.instance(`success-generate-keys`),
// status: result.status,
status: 'success',
});
EventsUI.onClick(`.btn-copy-keys-${id}`, async (e) => {
e.preventDefault();
await copyData(displayKeys);
NotificationManager.Push({
html: Translate.instance('success-copy-data'),
status: 'success',
});
});
});
});
return html`
${dynamicCol({ containerSelector: options.idModal, id: `wallet-${id}` })}
<div class="fl">
<div class="in fll wallet-${id}-col-a">
<div class="in section-mp">
<div class="in sub-title-modal"><i class="fas fa-key"></i> JWK Management</div>
<div class="in section-mp m">
Client side <b>JSON Web Keys</b> (<a href="https://datatracker.ietf.org/doc/html/rfc7517">RFC7517</a>)
based on elliptic curve digital signature,
<a href="https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto">more info</a>.
</div>
${await BtnIcon.instance({
class: `inl section-mp btn-custom btn-generate-keys-${id}`,
label: html`<i class="fa-solid fa-arrows-rotate"></i> ${Translate.instance('generate')}
${Translate.instance('keys')}`,
})}
${await BtnIcon.instance({
class: `inl section-mp btn-custom btn-copy-keys-${id}`,
label: html`<i class="fas fa-copy"></i> ${Translate.instance('copy')} ${Translate.instance('keys')}`,
})}
</div>
</div>
<div class="in fll wallet-${id}-col-b">
<div class="in section-mp">
<pre class="in keys-display"></pre>
</div>
</div>
</div>
`;
}
}
export { Wallet };