From 2ce40c4847f781ff2e92824a22b043345684d4e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Tue, 21 Apr 2015 19:38:41 +0200 Subject: [PATCH] Added new callback to viewmodels, allowing to react to login events Removed old loginstate.subscribe method and migrated existing code to new mechanism. This should allow plugins to only request their sensitive data if a user is a) logged in and has b) the necessary rights for a request. The server should still do additional auth checks, but this way no unnecessary request have to be made. --- src/octoprint/static/js/app/main.js | 6 +++++ .../static/js/app/viewmodels/files.js | 16 ++++++------ src/octoprint/static/js/app/viewmodels/log.js | 10 +++---- .../static/js/app/viewmodels/loginstate.js | 26 ++++++++++++------- .../static/js/app/viewmodels/users.js | 12 ++++----- 5 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/octoprint/static/js/app/main.js b/src/octoprint/static/js/app/main.js index 73fe2c04..aa90c594 100644 --- a/src/octoprint/static/js/app/main.js +++ b/src/octoprint/static/js/app/main.js @@ -476,6 +476,12 @@ $(function() { } }); log.info("... binding done"); + + _.each(allViewModels, function(viewModel) { + if (viewModel.hasOwnProperty("onStartupComplete")) { + viewModel.onStartupComplete(); + } + }); }; if (!_.has(viewModelMap, "settingsViewModel")) { diff --git a/src/octoprint/static/js/app/viewmodels/files.js b/src/octoprint/static/js/app/viewmodels/files.js index cde25948..49c2666b 100644 --- a/src/octoprint/static/js/app/viewmodels/files.js +++ b/src/octoprint/static/js/app/viewmodels/files.js @@ -323,6 +323,14 @@ $(function() { self.requestData(); }; + self.onUserLoggedIn = function(user) { + self.uploadButton.fileupload("enable"); + }; + + self.onUserLoggedOut = function() { + self.uploadButton.fileupload("disable"); + }; + self.onStartup = function() { $(".accordion-toggle[data-target='#files']").click(function() { var files = $("#files"); @@ -347,14 +355,6 @@ $(function() { //~~ Gcode upload self.uploadButton = $("#gcode_upload"); - self.loginState.subscribe(function(change, data) { - if ("login" == change) { - self.uploadButton.fileupload("enable"); - } else { - self.uploadButton.fileupload("disable"); - } - }); - function gcode_upload_done(e, data) { var filename = undefined; var location = undefined; diff --git a/src/octoprint/static/js/app/viewmodels/log.js b/src/octoprint/static/js/app/viewmodels/log.js index e0239bda..fa42aeed 100644 --- a/src/octoprint/static/js/app/viewmodels/log.js +++ b/src/octoprint/static/js/app/viewmodels/log.js @@ -61,12 +61,10 @@ $(function() { }); }; - self.onDataUpdaterReconnect = function() { - self.requestData(); - }; - - self.onStartup = function() { - self.requestData(); + self.onUserLoggedIn = function(user) { + if (user.admin) { + self.requestData(); + } }; } diff --git a/src/octoprint/static/js/app/viewmodels/loginstate.js b/src/octoprint/static/js/app/viewmodels/loginstate.js index 74c91b54..25e126c6 100644 --- a/src/octoprint/static/js/app/viewmodels/loginstate.js +++ b/src/octoprint/static/js/app/viewmodels/loginstate.js @@ -11,6 +11,8 @@ $(function() { self.isAdmin = ko.observable(false); self.isUser = ko.observable(false); + self.allViewModels = undefined; + self.currentUser = ko.observable(undefined); self.userMenuText = ko.computed(function() { @@ -21,12 +23,6 @@ $(function() { } }); - self.subscribers = []; - self.subscribe = function(callback) { - if (callback === undefined) return; - self.subscribers.push(callback); - }; - self.reloadUser = function() { if (self.currentUser() == undefined) { return; @@ -57,7 +53,11 @@ $(function() { self.currentUser(response); - _.each(self.subscribers, function(callback) { callback("login", response); }); + _.each(self.allViewModels, function(viewModel) { + if (viewModel.hasOwnProperty("onUserLoggedIn")) { + viewModel.onUserLoggedIn(response); + } + }); } else { self.loggedIn(false); self.username(undefined); @@ -66,7 +66,11 @@ $(function() { self.currentUser(undefined); - _.each(self.subscribers, function(callback) { callback("logout", {}); }); + _.each(self.allViewModels, function(viewModel) { + if (viewModel.hasOwnProperty("onUserLoggedOut")) { + viewModel.onUserLoggedOut(); + } + }); } }; @@ -116,11 +120,15 @@ $(function() { } }; + self.onAllBound = function(allViewModels) { + self.allViewModels = allViewModels; + }; + self.onDataUpdaterReconnect = function() { self.requestData(); }; - self.onStartup = function() { + self.onStartupComplete = function() { self.requestData(); }; } diff --git a/src/octoprint/static/js/app/viewmodels/users.js b/src/octoprint/static/js/app/viewmodels/users.js index b1d14dc1..c341a067 100644 --- a/src/octoprint/static/js/app/viewmodels/users.js +++ b/src/octoprint/static/js/app/viewmodels/users.js @@ -57,12 +57,6 @@ $(function() { return self.editorPassword() != self.editorRepeatedPassword(); }); - self.loginState.subscribe(function(change, data) { - if (change == "login" && data.admin) { - self.requestData(); - } - }); - self.requestData = function() { if (!CONFIG_ACCESS_CONTROL) return; @@ -267,6 +261,12 @@ $(function() { } } }); + }; + + self.onUserLoggedIn = function(user) { + if (user.admin) { + self.requestData(); + } } }