import { Fragment, useState } from "react"; import { useTranslation } from "next-i18next"; import { faCheck, faCopy } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Dialog, Transition } from "@headlessui/react"; import nacl from "tweetnacl"; import addServiceToken from "~/pages/api/serviceToken/addServiceToken"; import getLatestFileKey from "~/pages/api/workspace/getLatestFileKey"; import { decryptAssymmetric, encryptAssymmetric, encryptSymmetric, } from "../../utilities/cryptography/crypto"; import Button from "../buttons/Button"; import InputField from "../InputField"; import ListBox from "../Listbox"; const expiryMapping = { "1 day": 86400, "7 days": 604800, "1 month": 2592000, "6 months": 15552000, "12 months": 31104000, }; const crypto = require('crypto'); const AddServiceTokenDialog = ({ isOpen, closeModal, workspaceId, workspaceName, serviceTokens, environments, setServiceTokens }) => { const [serviceToken, setServiceToken] = useState(""); const [serviceTokenName, setServiceTokenName] = useState(""); const [selectedServiceTokenEnv, setSelectedServiceTokenEnv] = useState(environments?.[0]); const [serviceTokenExpiresIn, setServiceTokenExpiresIn] = useState("1 day"); const [serviceTokenCopied, setServiceTokenCopied] = useState(false); const { t } = useTranslation(); const generateServiceToken = async () => { const latestFileKey = await getLatestFileKey({ workspaceId }); const key = decryptAssymmetric({ ciphertext: latestFileKey.latestKey.encryptedKey, nonce: latestFileKey.latestKey.nonce, publicKey: latestFileKey.latestKey.sender.publicKey, privateKey: localStorage.getItem("PRIVATE_KEY"), }); const randomBytes = crypto.randomBytes(16).toString('hex'); const { ciphertext, iv, tag, } = encryptSymmetric({ plaintext: key, key: randomBytes, }); let newServiceToken = await addServiceToken({ name: serviceTokenName, workspaceId, environment: selectedServiceTokenEnv?.slug ? selectedServiceTokenEnv.slug : environments[0]?.name, expiresIn: expiryMapping[serviceTokenExpiresIn], encryptedKey: ciphertext, iv, tag }); setServiceTokens(serviceTokens.concat([newServiceToken.serviceTokenData])); setServiceToken(newServiceToken.serviceToken + "." + randomBytes); }; function copyToClipboard() { // Get the text field var copyText = document.getElementById("serviceToken"); // Select the text field copyText.select(); copyText.setSelectionRange(0, 99999); // For mobile devices // Copy the text inside the text field navigator.clipboard.writeText(copyText.value); setServiceTokenCopied(true); setTimeout(() => setServiceTokenCopied(false), 2000); // Alert the copied text // alert("Copied the text: " + copyText.value); } const closeAddServiceTokenModal = () => { closeModal(); setServiceTokenName(""); setServiceToken(""); }; return (
{serviceToken == '' ? ( {t('section-token:add-dialog.title', { target: workspaceName, })}

{t('section-token:add-dialog.description')}

name)} onChange={(envName) => setSelectedServiceTokenEnv( environments.find( ({ name }) => envName === name ) || { name: 'unknown', slug: 'unknown', } ) } isFull={true} text={`${t('common:environment')}: `} />
) : ( {t('section-token:add-dialog.copy-service-token')}

{t( 'section-token:add-dialog.copy-service-token-description' )}

{serviceToken}
{t('common:click-to-copy')}
)}
); }; export default AddServiceTokenDialog;