From ff58456332be0fcfa857813e0dac315de3cd4594 Mon Sep 17 00:00:00 2001 From: azivner Date: Fri, 29 Sep 2017 00:17:28 -0400 Subject: [PATCH] basic conflict detection based on the audit log --- src/app.py | 2 ++ src/audit_api.py | 18 ++++++++++++++++++ src/tree_api.py | 3 +++ static/js/tree.js | 10 ++++++++++ 4 files changed, 33 insertions(+) create mode 100644 src/audit_api.py diff --git a/src/app.py b/src/app.py index cdedb54d0..c1c003003 100644 --- a/src/app.py +++ b/src/app.py @@ -13,6 +13,7 @@ from notes_move_api import notes_move_api from password_api import password_api from settings_api import settings_api from notes_history_api import notes_history_api +from audit_api import audit_api import config_provider import my_scrypt @@ -35,6 +36,7 @@ app.register_blueprint(notes_move_api) app.register_blueprint(password_api) app.register_blueprint(settings_api) app.register_blueprint(notes_history_api) +app.register_blueprint(audit_api) class User(UserMixin): pass diff --git a/src/audit_api.py b/src/audit_api.py new file mode 100644 index 000000000..25191e1e9 --- /dev/null +++ b/src/audit_api.py @@ -0,0 +1,18 @@ +from flask import Blueprint, jsonify +from flask import request +from flask_login import login_required + +from sql import getSingleResult + +audit_api = Blueprint('audit_api', __name__) + +@audit_api.route('/audit/', methods = ['GET']) +@login_required +def getNote(full_load_time): + browser_id = request.headers['x-browser-id'] + + count = getSingleResult("SELECT COUNT(*) AS 'count' FROM audit_log WHERE browser_id != ? AND date_modified >= ?", [browser_id, full_load_time])['count'] + + return jsonify({ + 'changed': count > 0 + }) \ No newline at end of file diff --git a/src/tree_api.py b/src/tree_api.py index d14aae38a..65ab3d696 100644 --- a/src/tree_api.py +++ b/src/tree_api.py @@ -1,5 +1,7 @@ import base64 import os +import math +import time from flask import Blueprint, jsonify from flask_login import login_required @@ -48,5 +50,6 @@ def getTree(): retObject['encrypted_data_key'] = getOption('encrypted_data_key') retObject['encryption_session_timeout'] = getOption('encryption_session_timeout') retObject['browser_id'] = base64.b64encode(os.urandom(8)) + retObject['full_load_time'] = math.floor(time.time()) return jsonify(retObject) \ No newline at end of file diff --git a/static/js/tree.js b/static/js/tree.js index b3716ae36..059920a46 100644 --- a/static/js/tree.js +++ b/static/js/tree.js @@ -86,6 +86,15 @@ function setExpandedToServer(note_id, is_expanded) { let globalEncryptionSalt; let globalEncryptionSessionTimeout; let globalEncryptedDataKey; +let globalFullLoadTime; + +setInterval(() => { + $.get(baseUrl + 'audit/' + globalFullLoadTime).then(resp => { + if (resp.changed) { + window.location.reload(true); + } + }); +}, 60 * 1000); $(function(){ $.get(baseUrl + 'tree').then(resp => { @@ -94,6 +103,7 @@ $(function(){ globalEncryptionSalt = resp.password_derived_key_salt; globalEncryptionSessionTimeout = resp.encryption_session_timeout; globalEncryptedDataKey = resp.encrypted_data_key; + globalFullLoadTime = resp.full_load_time; // add browser ID header to all AJAX requests $.ajaxSetup({