mirror of
				https://github.com/zadam/trilium.git
				synced 2025-11-03 11:56:01 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			176 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			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
 | 
						|
    };
 | 
						|
})(); |