A self hosted chat application with end-to-end encrypted messaging.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

71 lines
2.1 KiB

import { EncryptionService } from "../../../common/service/EncryptionService";
import {
ReencryptionDTO,
DecryptedDTO,
} from "../../../common/dto/ReencryptionDTO";
import { Credentials } from "../../../common/global/Credentials";
import { MessageCipher } from "../../../common/entity/MessageCipher";
import log from "loglevel";
import { NotificationService } from "../../../common/service/NotificationService";
import { isPassphraseValid } from "../../../common/ajax/passphrase";
import {
getAllMessages,
sendReencryptedMessages,
} from "../../../common/ajax/messages";
export async function changePassphrase(
es: EncryptionService,
ns: NotificationService
): Promise<void> {
// $("#changePassphraseForm").val();
const user =
(document.getElementById("changePassphraseDropDown") as HTMLOptionElement)
.value || "error";
const passphraseOld: string = $("#passphraseOld").val() as string;
const passphraseNew: string = $("#passphraseNew").val() as string;
const valid = await isPassphraseValid(passphraseOld, user, es);
if (!valid) {
log.error("Please check your passphrase");
ns.error("Please check your passphrase");
return;
}
const messages = await getAllMessages(user, Credentials.authToken);
const decrypted = Promise.all(
messages.map(
async (m): Promise<DecryptedDTO> => {
const msg = await es.decryptAsPromise(passphraseOld, m.messageCipher);
const m2 = { ...m, messageId: m.messageCipher.id, message: msg };
return m2;
}
)
);
const reencrypted = (await decrypted).map((m) => {
const mdto = es.encrypt(passphraseNew, m.message);
const mc = <MessageCipher>{ id: m.messageId, ...mdto };
const rdto = <ReencryptionDTO>{ ...m, messageCipher: mc };
return rdto;
});
log.debug(reencrypted);
/* Uncomment to see the reencryption result
const decryptedAgain = Promise.all(
reencrypted.map(async (m) => {
return es.decryptAsPromise(passphraseNew, m.messageCipher);
})
);
const deb = await decryptedAgain;
log.debug(deb); */
sendReencryptedMessages(reencrypted, Credentials.authToken);
ns.success("Successfully changed passphrase");
}