mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 02:16:05 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			194 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			5.3 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;
 | |
| 
 | |
|     $.ajax({
 | |
|         url: baseApiUrl + 'settings/all',
 | |
|         type: 'GET',
 | |
|         error: () => showError("Error getting protected session settings.")
 | |
|     }).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;
 | |
|         initAjax();
 | |
| 
 | |
|         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 $.ajax({
 | |
|             url: baseApiUrl + 'login/protected',
 | |
|             type: 'POST',
 | |
|             contentType: 'application/json',
 | |
|             data: JSON.stringify({
 | |
|                 password: password
 | |
|             }),
 | |
|             error: () => showError("Error entering protected session.")
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     function getProtectedSessionId() {
 | |
|         return protectedSessionId;
 | |
|     }
 | |
| 
 | |
|     function resetProtectedSession() {
 | |
|         protectedSessionId = null;
 | |
| 
 | |
|         initAjax();
 | |
| 
 | |
|         // most secure solution - guarantees nothing remained in memory
 | |
|         // since this expires because user doesn't use the app, it shouldn't be disruptive
 | |
|         window.location.reload(true);
 | |
|     }
 | |
| 
 | |
|     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 $.ajax({
 | |
|             url: baseApiUrl + 'tree/' + noteId + "/protectSubTree/" + (protect ? 1 : 0),
 | |
|             type: 'PUT',
 | |
|             contentType: 'application/json',
 | |
|             error: () => showError("Request to un/protect sub tree has failed.")
 | |
|         });
 | |
| 
 | |
|         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
 | |
|     };
 | |
| })(); |