mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-14 08:29:55 +00:00
121 lines
3.4 KiB
JavaScript
121 lines
3.4 KiB
JavaScript
import changePassword2 from "~/pages/api/auth/ChangePassword2";
|
|
import SRP1 from "~/pages/api/auth/SRP1";
|
|
|
|
import Aes256Gcm from "./aes-256-gcm";
|
|
|
|
const nacl = require("tweetnacl");
|
|
nacl.util = require("tweetnacl-util");
|
|
const jsrp = require("jsrp");
|
|
const clientOldPassword = new jsrp.client();
|
|
const clientNewPassword = new jsrp.client();
|
|
|
|
/**
|
|
* This function loggs in the user (whether it's right after signup, or a normal login)
|
|
* @param {*} email
|
|
* @param {*} password
|
|
* @param {*} setErrorLogin
|
|
* @param {*} router
|
|
* @param {*} isSignUp
|
|
* @returns
|
|
*/
|
|
const changePassword = async (
|
|
email,
|
|
currentPassword,
|
|
newPassword,
|
|
setCurrentPasswordError,
|
|
setPasswordChanged,
|
|
setCurrentPassword,
|
|
setNewPassword
|
|
) => {
|
|
try {
|
|
setPasswordChanged(false);
|
|
setCurrentPasswordError(false);
|
|
|
|
clientOldPassword.init(
|
|
{
|
|
username: email,
|
|
password: currentPassword,
|
|
},
|
|
async () => {
|
|
const clientPublicKey = clientOldPassword.getPublicKey();
|
|
|
|
let serverPublicKey, salt;
|
|
try {
|
|
const res = await SRP1({
|
|
clientPublicKey: clientPublicKey,
|
|
});
|
|
serverPublicKey = res.serverPublicKey;
|
|
salt = res.salt;
|
|
} catch (err) {
|
|
setCurrentPasswordError(true);
|
|
console.log("Wrong current password", err, 1);
|
|
}
|
|
|
|
clientOldPassword.setSalt(salt);
|
|
clientOldPassword.setServerPublicKey(serverPublicKey);
|
|
const clientProof = clientOldPassword.getProof(); // called M1
|
|
|
|
clientNewPassword.init(
|
|
{
|
|
username: email,
|
|
password: newPassword,
|
|
},
|
|
async () => {
|
|
clientNewPassword.createVerifier(async (err, result) => {
|
|
// The Blob part here is needed to account for symbols that count as 2+ bytes (e.g., é, å, ø)
|
|
let { ciphertext, iv, tag } = Aes256Gcm.encrypt(
|
|
localStorage.getItem("PRIVATE_KEY"),
|
|
newPassword
|
|
.slice(0, 32)
|
|
.padStart(
|
|
32 +
|
|
(newPassword.slice(0, 32).length -
|
|
new Blob([newPassword]).size),
|
|
"0"
|
|
)
|
|
);
|
|
|
|
if (ciphertext) {
|
|
localStorage.setItem("encryptedPrivateKey", ciphertext);
|
|
localStorage.setItem("iv", iv);
|
|
localStorage.setItem("tag", tag);
|
|
|
|
let res;
|
|
try {
|
|
res = await changePassword2({
|
|
encryptedPrivateKey: ciphertext,
|
|
iv,
|
|
tag,
|
|
salt: result.salt,
|
|
verifier: result.verifier,
|
|
clientProof,
|
|
});
|
|
if (res.status == 400) {
|
|
setCurrentPasswordError(true);
|
|
} else if (res.status == 200) {
|
|
setPasswordChanged(true);
|
|
setCurrentPassword("");
|
|
setNewPassword("");
|
|
}
|
|
} catch (err) {
|
|
setCurrentPasswordError(true);
|
|
console.log(err);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
);
|
|
}
|
|
);
|
|
} catch (error) {
|
|
console.log(
|
|
"Something went wrong during changing the password",
|
|
slat,
|
|
serverPublicKey
|
|
);
|
|
}
|
|
return true;
|
|
};
|
|
|
|
export default changePassword;
|