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 (