mirror of
https://github.com/zadam/trilium.git
synced 2024-12-27 09:43:18 +08:00
176 lines
No EOL
4.8 KiB
JavaScript
176 lines
No EOL
4.8 KiB
JavaScript
"use strict";
|
|
|
|
const protected_session = (function() {
|
|
const dialogEl = $("#protected-session-password-dialog");
|
|
const passwordFormEl = $("#protected-session-password-form");
|
|
const passwordEl = $("#protected-session-password");
|
|
|
|
let protectedSessionDeferred = null;
|
|
let lastProtectedSessionOperationDate = null;
|
|
let protectedSessionTimeout = null;
|
|
let protectedSessionId = null;
|
|
|
|
$(document).ready(() => {
|
|
server.get('settings/all').then(settings => protectedSessionTimeout = settings.protected_session_timeout);
|
|
});
|
|
|
|
function setProtectedSessionTimeout(encSessTimeout) {
|
|
protectedSessionTimeout = encSessTimeout;
|
|
}
|
|
|
|
function ensureProtectedSession(requireProtectedSession, modal) {
|
|
const dfd = $.Deferred();
|
|
|
|
if (requireProtectedSession && !isProtectedSessionAvailable()) {
|
|
// if this is entry point then we need to show the app even before the note is loaded
|
|
showAppIfHidden();
|
|
|
|
protectedSessionDeferred = dfd;
|
|
|
|
dialogEl.dialog({
|
|
modal: modal,
|
|
width: 400,
|
|
open: () => {
|
|
if (!modal) {
|
|
// dialog steals focus for itself, which is not what we want for non-modal (viewing)
|
|
noteTree.getCurrentNode().setFocus();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
dfd.resolve();
|
|
}
|
|
|
|
return dfd.promise();
|
|
}
|
|
|
|
async function setupProtectedSession() {
|
|
const password = passwordEl.val();
|
|
passwordEl.val("");
|
|
|
|
const response = await enterProtectedSession(password);
|
|
|
|
if (!response.success) {
|
|
showError("Wrong password.");
|
|
return;
|
|
}
|
|
|
|
protectedSessionId = response.protectedSessionId;
|
|
|
|
dialogEl.dialog("close");
|
|
|
|
noteEditor.reload();
|
|
noteTree.reload();
|
|
|
|
if (protectedSessionDeferred !== null) {
|
|
ensureDialogIsClosed(dialogEl, passwordEl);
|
|
|
|
protectedSessionDeferred.resolve();
|
|
|
|
protectedSessionDeferred = null;
|
|
}
|
|
}
|
|
|
|
function ensureDialogIsClosed() {
|
|
// this may fal if the dialog has not been previously opened
|
|
try {
|
|
dialogEl.dialog('close');
|
|
}
|
|
catch (e) {}
|
|
|
|
passwordEl.val('');
|
|
}
|
|
|
|
async function enterProtectedSession(password) {
|
|
return await server.post('login/protected', {
|
|
password: password
|
|
});
|
|
}
|
|
|
|
function getProtectedSessionId() {
|
|
return protectedSessionId;
|
|
}
|
|
|
|
function resetProtectedSession() {
|
|
protectedSessionId = null;
|
|
|
|
// most secure solution - guarantees nothing remained in memory
|
|
// since this expires because user doesn't use the app, it shouldn't be disruptive
|
|
reloadApp();
|
|
}
|
|
|
|
function isProtectedSessionAvailable() {
|
|
return protectedSessionId !== null;
|
|
}
|
|
|
|
async function protectNoteAndSendToServer() {
|
|
await ensureProtectedSession(true, true);
|
|
|
|
const note = noteEditor.getCurrentNote();
|
|
|
|
noteEditor.updateNoteFromInputs(note);
|
|
|
|
note.detail.is_protected = true;
|
|
|
|
await noteEditor.saveNoteToServer(note);
|
|
|
|
noteEditor.setNoteBackgroundIfProtected(note);
|
|
}
|
|
|
|
async function unprotectNoteAndSendToServer() {
|
|
await ensureProtectedSession(true, true);
|
|
|
|
const note = noteEditor.getCurrentNote();
|
|
|
|
noteEditor.updateNoteFromInputs(note);
|
|
|
|
note.detail.is_protected = false;
|
|
|
|
await noteEditor.saveNoteToServer(note);
|
|
|
|
noteEditor.setNoteBackgroundIfProtected(note);
|
|
}
|
|
|
|
function touchProtectedSession() {
|
|
if (isProtectedSessionAvailable()) {
|
|
lastProtectedSessionOperationDate = new Date();
|
|
}
|
|
}
|
|
|
|
async function protectSubTree(noteId, protect) {
|
|
await ensureProtectedSession(true, true);
|
|
|
|
await server.put('tree/' + noteId + "/protect-sub-tree/" + (protect ? 1 : 0));
|
|
|
|
showMessage("Request to un/protect sub tree has finished successfully");
|
|
|
|
noteTree.reload();
|
|
noteEditor.reload();
|
|
}
|
|
|
|
passwordFormEl.submit(() => {
|
|
setupProtectedSession();
|
|
|
|
return false;
|
|
});
|
|
|
|
setInterval(() => {
|
|
if (lastProtectedSessionOperationDate !== null && new Date().getTime() - lastProtectedSessionOperationDate.getTime() > protectedSessionTimeout * 1000) {
|
|
resetProtectedSession();
|
|
}
|
|
}, 5000);
|
|
|
|
return {
|
|
setProtectedSessionTimeout,
|
|
ensureProtectedSession,
|
|
resetProtectedSession,
|
|
isProtectedSessionAvailable,
|
|
protectNoteAndSendToServer,
|
|
unprotectNoteAndSendToServer,
|
|
getProtectedSessionId,
|
|
touchProtectedSession,
|
|
protectSubTree,
|
|
ensureDialogIsClosed
|
|
};
|
|
})(); |