trilium/src/services/protected_session.js

91 lines
1.9 KiB
JavaScript

"use strict";
const log = require('./log');
const dataEncryptionService = require('./data_encryption');
const options = require("./options");
let dataKey = null;
function setDataKey(decryptedDataKey) {
dataKey = Array.from(decryptedDataKey);
}
function getDataKey() {
return dataKey;
}
function resetDataKey() {
dataKey = null;
}
function isProtectedSessionAvailable() {
return !!dataKey;
}
function decryptNotes(notes) {
try {
for (const note of notes) {
if (note.isProtected) {
note.title = decryptString(note.title);
}
}
}
catch (e) {
log.error(`Could not decrypt protected notes: ${e.message} ${e.stack}`);
}
}
function encrypt(plainText) {
if (plainText === null) {
return null;
}
return dataEncryptionService.encrypt(getDataKey(), plainText);
}
function decrypt(cipherText) {
if (cipherText === null) {
return null;
}
return dataEncryptionService.decrypt(getDataKey(), cipherText);
}
function decryptString(cipherText) {
return dataEncryptionService.decryptString(getDataKey(), cipherText);
}
let lastProtectedSessionOperationDate = null;
function touchProtectedSession() {
if (isProtectedSessionAvailable()) {
lastProtectedSessionOperationDate = Date.now();
}
}
function checkProtectedSessionExpiration() {
const protectedSessionTimeout = options.getOptionInt('protectedSessionTimeout');
if (isProtectedSessionAvailable()
&& lastProtectedSessionOperationDate
&& Date.now() - lastProtectedSessionOperationDate > protectedSessionTimeout * 1000) {
resetDataKey();
log.info("Expiring protected session");
require('./ws').reloadFrontend();
}
}
module.exports = {
setDataKey,
resetDataKey,
isProtectedSessionAvailable,
encrypt,
decrypt,
decryptString,
decryptNotes,
touchProtectedSession,
checkProtectedSessionExpiration
};