2021-05-29 06:27:52 +00:00
|
|
|
import React, {useState, useEffect} from 'react';
|
2021-04-05 05:38:42 +00:00
|
|
|
import constants from 'utils/strings/constants';
|
2021-05-29 06:27:52 +00:00
|
|
|
import {getData, LS_KEYS, setData} from 'utils/storage/localStorage';
|
|
|
|
import {useRouter} from 'next/router';
|
|
|
|
import {B64EncryptionResult} from 'services/uploadService';
|
2021-04-05 05:44:56 +00:00
|
|
|
import CryptoWorker, {
|
|
|
|
setSessionKeys,
|
2021-04-05 05:50:40 +00:00
|
|
|
generateAndSaveIntermediateKeyAttributes,
|
2021-04-05 05:44:56 +00:00
|
|
|
} from 'utils/crypto';
|
2021-05-29 06:27:52 +00:00
|
|
|
import {getActualKey} from 'utils/common/key';
|
|
|
|
import {setKeys, UpdatedKey} from 'services/userService';
|
2021-05-11 04:42:06 +00:00
|
|
|
import SetPasswordForm from 'components/SetPasswordForm';
|
2021-04-05 05:38:42 +00:00
|
|
|
|
|
|
|
export interface KEK {
|
|
|
|
key: string;
|
|
|
|
opsLimit: number;
|
|
|
|
memLimit: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default function Generate() {
|
|
|
|
const [token, setToken] = useState<string>();
|
|
|
|
const router = useRouter();
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const user = getData(LS_KEYS.USER);
|
|
|
|
if (!user?.token) {
|
|
|
|
router.push('/');
|
|
|
|
} else {
|
|
|
|
setToken(user.token);
|
|
|
|
}
|
|
|
|
}, []);
|
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
const onSubmit = async (passphrase, setFieldError) => {
|
|
|
|
const cryptoWorker = await new CryptoWorker();
|
|
|
|
const key: string = await getActualKey();
|
|
|
|
const keyAttributes = getData(LS_KEYS.KEY_ATTRIBUTES);
|
|
|
|
const kekSalt: string = await cryptoWorker.generateSaltToDeriveKey();
|
|
|
|
let kek: KEK;
|
2021-04-05 05:38:42 +00:00
|
|
|
try {
|
2021-04-05 06:17:31 +00:00
|
|
|
kek = await cryptoWorker.deriveSensitiveKey(passphrase, kekSalt);
|
|
|
|
} catch (e) {
|
|
|
|
setFieldError('confirm', constants.PASSWORD_GENERATION_FAILED);
|
|
|
|
return;
|
|
|
|
}
|
2021-05-29 06:27:52 +00:00
|
|
|
const encryptedKeyAttributes: B64EncryptionResult = await cryptoWorker.encryptToB64(key, kek.key);
|
2021-04-05 06:17:31 +00:00
|
|
|
const updatedKey: UpdatedKey = {
|
|
|
|
kekSalt,
|
|
|
|
encryptedKey: encryptedKeyAttributes.encryptedData,
|
|
|
|
keyDecryptionNonce: encryptedKeyAttributes.nonce,
|
|
|
|
opsLimit: kek.opsLimit,
|
|
|
|
memLimit: kek.memLimit,
|
|
|
|
};
|
2021-04-05 05:38:42 +00:00
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
await setKeys(token, updatedKey);
|
2021-04-05 05:38:42 +00:00
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
const updatedKeyAttributes = Object.assign(keyAttributes, updatedKey);
|
|
|
|
await generateAndSaveIntermediateKeyAttributes(
|
|
|
|
passphrase,
|
|
|
|
updatedKeyAttributes,
|
2021-05-29 06:27:52 +00:00
|
|
|
key,
|
2021-04-05 06:17:31 +00:00
|
|
|
);
|
2021-04-05 05:38:42 +00:00
|
|
|
|
2021-04-05 06:17:31 +00:00
|
|
|
setSessionKeys(key);
|
2021-05-07 06:56:32 +00:00
|
|
|
redirectToGallery();
|
|
|
|
};
|
|
|
|
const redirectToGallery = () => {
|
2021-05-29 06:27:52 +00:00
|
|
|
setData(LS_KEYS.SHOW_BACK_BUTTON, {value: false});
|
2021-04-05 06:17:31 +00:00
|
|
|
router.push('/gallery');
|
2021-04-05 05:38:42 +00:00
|
|
|
};
|
|
|
|
return (
|
2021-05-11 04:42:06 +00:00
|
|
|
<SetPasswordForm
|
2021-04-05 06:17:31 +00:00
|
|
|
callback={onSubmit}
|
|
|
|
buttonText={constants.CHANGE_PASSWORD}
|
2021-05-07 06:56:32 +00:00
|
|
|
back={
|
2021-05-29 06:27:52 +00:00
|
|
|
getData(LS_KEYS.SHOW_BACK_BUTTON)?.value ?
|
|
|
|
redirectToGallery :
|
|
|
|
null
|
2021-05-07 06:56:32 +00:00
|
|
|
}
|
2021-04-05 06:17:31 +00:00
|
|
|
/>
|
2021-04-05 05:38:42 +00:00
|
|
|
);
|
|
|
|
}
|