import React, { useEffect, useState } from 'react'; import Container from 'components/Container'; import styled from 'styled-components'; import Card from 'react-bootstrap/Card'; import Form from 'react-bootstrap/Form'; import Button from 'react-bootstrap/Button'; import constants from 'utils/strings/constants'; import { Formik, FormikHelpers } from 'formik'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; import { useRouter } from 'next/router'; import * as Yup from 'yup'; import { keyAttributes } from 'types'; import { setKey, SESSION_KEYS, getKey } from 'utils/storage/sessionStorage'; import CryptoWorker from 'utils/crypto/cryptoWorker'; import { logoutUser } from 'services/userService'; const Image = styled.img` width: 200px; margin-bottom: 20px; max-width: 100%; `; interface formValues { passphrase: string; } export default function Credentials() { const router = useRouter(); const [keyAttributes, setKeyAttributes] = useState(); const [loading, setLoading] = useState(false); useEffect(() => { router.prefetch('/gallery'); const user = getData(LS_KEYS.USER); const keyAttributes = getData(LS_KEYS.KEY_ATTRIBUTES); const key = getKey(SESSION_KEYS.ENCRYPTION_KEY); if (!user?.token) { router.push('/'); } else if (!keyAttributes) { router.push('/generate'); } else if (key) { router.push('/gallery'); } else { setKeyAttributes(keyAttributes); } }, []); const verifyPassphrase = async ( values: formValues, { setFieldError }: FormikHelpers ) => { setLoading(true); try { const cryptoWorker = await new CryptoWorker(); const { passphrase } = values; const kek: string = await cryptoWorker.deriveKey( passphrase, keyAttributes.kekSalt, keyAttributes.opsLimit, keyAttributes.memLimit, ); try { const key: string = await cryptoWorker.decryptB64( keyAttributes.encryptedKey, keyAttributes.keyDecryptionNonce, kek ); const sessionKeyAttributes = await cryptoWorker.encryptToB64( key ); const sessionKey = sessionKeyAttributes.key; const sessionNonce = sessionKeyAttributes.nonce; const encryptionKey = sessionKeyAttributes.encryptedData; setKey(SESSION_KEYS.ENCRYPTION_KEY, { encryptionKey }); setData(LS_KEYS.SESSION, { sessionKey, sessionNonce }); router.push('/gallery'); } catch (e) { console.error(e); setFieldError('passphrase', constants.INCORRECT_PASSPHRASE); } } catch (e) { setFieldError( 'passphrase', `${constants.UNKNOWN_ERROR} ${e.message}` ); } setLoading(false); }; return ( {/* vault */} {constants.ENTER_PASSPHRASE} initialValues={{ passphrase: '' }} onSubmit={verifyPassphrase} validationSchema={Yup.object().shape({ passphrase: Yup.string().required( constants.REQUIRED ), })} > {({ values, touched, errors, handleChange, handleBlur, handleSubmit, }) => (
{errors.passphrase}
)}
); }