import crypto from 'crypto'; 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 addServiceToken from '@app/pages/api/serviceToken/addServiceToken'; import getLatestFileKey from '@app/pages/api/workspace/getLatestFileKey'; import { decryptAssymmetric, 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, }; type Props = { isOpen: boolean; closeModal: () => void; workspaceId: string; workspaceName: string; serviceTokens: any[]; environments: Array<{ name: string; slug: string }>; setServiceTokens: (arg: any[]) => void; }; const AddServiceTokenDialog = ({ isOpen, closeModal, workspaceId, workspaceName, serviceTokens, environments, setServiceTokens, }: Props) => { 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') as string, }); const randomBytes = crypto.randomBytes(16).toString('hex'); const { ciphertext, iv, tag } = encryptSymmetric({ plaintext: key, key: randomBytes, }); console.log(1234, selectedServiceTokenEnv, environments, selectedServiceTokenEnv?.slug ? selectedServiceTokenEnv.slug : environments[0]?.slug) const newServiceToken = await addServiceToken({ name: serviceTokenName, workspaceId, environment: selectedServiceTokenEnv?.slug ? selectedServiceTokenEnv.slug : environments[0]?.slug, expiresIn: expiryMapping[serviceTokenExpiresIn as keyof typeof expiryMapping], encryptedKey: ciphertext, iv, tag, }); setServiceTokens(serviceTokens.concat([newServiceToken.serviceTokenData])); setServiceToken(`${newServiceToken.serviceToken }.${ randomBytes}`); }; function copyToClipboard() { // Get the text field const copyText = document.getElementById( 'serviceToken' ) as HTMLInputElement; // 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 (