Skip to content
Snippets Groups Projects

908 account recovery ability to add contacts to trusted contacts list for account recovery

Compare and
5 files
+ 1184
6
Compare changes
  • Side-by-side
  • Inline
Files
5
@@ -40,6 +40,12 @@ import {
STATUS_USER_BLOCKED
} from "../constants/statuses";
import generateQrCode from "../utilities/generateQrCode";
import {
generateRecoveryKey,
divideSecretToShares,
combineSecret,
encryptShare
} from "../utilities/secrets";
const penpalMethods = require("../../temp/penpal-methods").default;
const WopiAPI = require("./wopiapi-iframe");
@@ -717,10 +723,7 @@ const connection = Penpal.connectToParent({
});
});
},
finalizeEmployeeRegistration: async (
identity,
identifier
) => {
finalizeEmployeeRegistration: async (identity, identifier) => {
viamApi.setIdentity(identity.authentication.publicKey);
return executeRestfulFunction(
"public",
@@ -970,6 +973,92 @@ const connection = Penpal.connectToParent({
});
});
},
contactsGetTrusteeContactsPublicKeys: async () => {
try {
const response = await executeRestfulFunction(
"private",
window.viamApi,
window.viamApi.contactsGetTrusteeContactsPublicKeys,
null
);
console.log({ response });
const responseData = response.data;
const contactsUuids = Object.keys(responseData);
console.log({ contactsUuids });
if (!contactsUuids.length) {
return encodeResponse("400", "", response.status);
}
const sharesNumber = contactsUuids.length;
const getThreshold = () =>
sharesNumber === 3 ? 2 : parseInt(sharesNumber / 2);
const threshold = getThreshold();
const recoveryKey = generateRecoveryKey(512);
const recoveryKeyShares = divideSecretToShares(
recoveryKey,
sharesNumber,
threshold
);
// Sanity check
let checkKey;
checkKey = combineSecret(recoveryKeyShares.slice(0, 2));
if (checkKey !== recoveryKey) {
return encodeResponse("400", "", "First sanity check failed");
}
checkKey = combineSecret(recoveryKeyShares.slice(0, 1));
if (checkKey === recoveryKey) {
return encodeResponse("400", "", "Second sanity check failed");
}
checkKey = combineSecret(recoveryKeyShares);
if (checkKey !== recoveryKey) {
return encodeResponse("400", "", "Third sanity check failed");
}
// End of sanity check
// Encrypt each share with every publicKey of each contact device
const contactsToDevices = Object.entries(responseData);
console.log({ contactsToDevices });
const shamirPartsList = await Promise.all(
contactsToDevices.map(async ([contactUuid, device], index) => {
const deviceIdsToPublicKeys = Object.entries(device);
const deviceIdsToEncryptedKeysList = await Promise.all(
deviceIdsToPublicKeys.map(async ([deviceId, publicKey]) => {
const encryptedShare = await encryptShare(
recoveryKeyShares[index],
publicKey
);
return [deviceId, encryptedShare];
})
);
const deviceIdsToEncryptedKeys = Object.fromEntries(
deviceIdsToEncryptedKeysList
);
return [contactUuid, deviceIdsToEncryptedKeys];
})
);
const shamirParts = Object.fromEntries(shamirPartsList);
console.log({ shamirParts });
// Save Shamir parts to database
const savePartsResponse = await executeRestfulFunction(
"private",
window.viamApi,
window.viamApi.contactsSaveShamirParts,
null,
shamirParts
);
console.log({ savePartsResponse });
return response;
} catch (error) {
console.trace(error);
return encodeResponse("400", "", error.message);
}
},
parseSMIME,
getCurrentlyLoggedInUUID() {
return new Penpal.Promise(result => {
Loading