summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--www/js/DataModel.js148
-rw-r--r--www/js/LoginCtrl.js56
-rw-r--r--www/js/app.js298
-rw-r--r--www/templates/login.html11
4 files changed, 312 insertions, 201 deletions
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index 555433c0..bf58f112 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -31,6 +31,7 @@ angular.module('zmApp.controllers')
'serverName':'',
'username': '',
'password': '',
+ 'fallbackConfiguration': '',
'url': '', // This is the ZM portal path
'apiurl': '', // This is the API path
'eventServer':'', //experimental Event server address
@@ -209,6 +210,110 @@ angular.module('zmApp.controllers')
},
+ getReachableConfig: function ()
+ {
+ var d = $q.defer();
+ if (loginData.serverName=="")
+ {
+ zmLog("Reachable: No server name configured, likely first use?");
+ d.reject ("No servers");
+ return d.promise;
+ }
+
+ var chainURLs = [ {url:'http://1.ozone.network',server: 'o1'},
+ {url:'http://2.ozone.network',server: 'o2'},
+ {url:'http://3.ozone.network',server: 'o3'},
+
+ ];
+ var savedLoginData = angular.copy(loginData);
+
+ //zmLog ("Making sure " + loginData.serverName + " is reachable...");
+ var tLd = serverGroupList[loginData.serverName];
+
+ var keepBuilding = true;
+ while (keepBuilding==true)
+ {
+ if (arrayObjectIndexOf(chainURLs,tLd.url,"url") == -1 ) // no loop
+ {
+ zmLog ("Adding to chain stack: " + tLd.serverName + ">"+tLd.url);
+ chainURLs.push ({url:tLd.url, server:tLd.serverName});
+ zmLog ("Fallback of " + tLd.serverName + " is " + tLd.fallbackConfiguration);
+ if (tLd.fallbackConfiguration)
+ {
+ tLd = serverGroupList [tLd.fallbackConfiguration];
+ }
+ else
+ {
+ zmLog ("reached end of chain loop");
+ }
+ }
+ else
+ {
+ zmLog ("detected loop when " + tLd.serverName + " fallsback to " + tLd.fallbackConfiguration);
+ keepBuilding = false;
+ }
+ }
+
+
+
+ //contactedServers.push(loginData.serverName);
+ findFirstReachableUrl(chainURLs).then(function (firstReachableUrl) {
+ d.resolve (firstReachableUrl);
+ // also make sure loginData points to this now
+
+ loginData = serverGroupList[firstReachableUrl.server];
+
+ console.log ("set login Data to " + JSON.stringify(loginData));
+
+ return d.promise;
+ // OK: do something with firstReachableUrl
+ }, function () {
+ d.reject ("No servers reachable");
+ return d.promise;
+ // KO: no url could be reached
+ });
+
+
+ function arrayObjectIndexOf(myArray, searchTerm, property)
+ {
+ for(var i = 0, len = myArray.length; i < len; i++)
+ {
+ if (myArray[i][property] === searchTerm)
+ return i;
+ }
+ return -1;
+ }
+
+ function findFirstReachableUrl (urls)
+ {
+ if (urls.length > 0)
+ {
+ $ionicLoading.show({template: 'trying ' + urls[0].server});
+ zmLog ("Reachability test.." + urls[0].url);
+ return $http.get(urls[0].url).then(function () {
+ zmLog ("Success: reachability on "+ urls[0].url);
+ $ionicLoading.hide();
+ return urls[0];
+ }, function() {
+ zmLog ("Failed reachability on "+ urls[0].url);
+ return findFirstReachableUrl(urls.slice(1));
+ });
+ }
+ else
+ {
+ $ionicLoading.hide();
+ return $q.reject("No reachable URL");
+
+ }
+
+
+ }
+
+ return d.promise;
+
+
+ },
+
init: function () {
// console.log("****** DATAMODEL INIT SERVICE CALLED ********");
@@ -491,49 +596,6 @@ angular.module('zmApp.controllers')
setLogin(newLogin);
$rootScope.showBlog = newLogin.enableBlog;
-
- /*
- window.localStorage.setItem("username", loginData.username);
- window.localStorage.setItem("password", loginData.password);
- window.localStorage.setItem("url", loginData.url);
- window.localStorage.setItem("apiurl", loginData.apiurl);
- window.localStorage.setItem("streamingurl", loginData.streamingurl);
- window.localStorage.setItem("eventServer", loginData.eventServer);
- window.localStorage.setItem("eventServerMonitors", loginData.eventServerMonitors);
- window.localStorage.setItem("eventServerInterval", loginData.eventServerInterval);
- window.localStorage.setItem("maxFPS", loginData.maxFPS);
-
-
-
- window.localStorage.setItem("useSSL", loginData.useSSL?"1":"0");
- window.localStorage.setItem("usePin", loginData.usePin?"1":"0");
- window.localStorage.setItem("canSwipeMonitors", loginData.canSwipeMonitors?"1":"0");
- window.localStorage.setItem("persistMontageOrder", loginData.persistMontageOrder?"1":"0");
-
- window.localStorage.setItem("enableh264", loginData.enableh264?"1":"0");
- window.localStorage.setItem("gapless", loginData.gapless?"1":"0");
-
- window.localStorage.setItem("pinCode", loginData.pinCode);
-
-
- window.localStorage.setItem("enableDebug", loginData.enableDebug?"1":"0");
- window.localStorage.setItem("keepAwake", loginData.keepAwake?"1":"0");
- window.localStorage.setItem("maxMontage", loginData.maxMontage);
- window.localStorage.setItem("montageQuality", loginData.montageQuality);
- window.localStorage.setItem("singleImageQuality", loginData.singleImageQuality);
- window.localStorage.setItem("refreshSec", loginData.refreshSec);
-
-
- window.localStorage.setItem("isUseAuth", loginData.isUseAuth);
- window.localStorage.setItem("isUseEventServer", loginData.isUseEventServer);
- window.localStorage.setItem("disablePush", loginData.disablePush);
- window.localStorage.setItem("onTapScreen", loginData.onTapScreen);
-
-
- console.log ("***** SETTING ISUSEAUTH TO " + loginData.isUseAuth);
- */
-
-
},
//-------------------------------------------------------
diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js
index 0c09e4c3..e892d3f3 100644
--- a/www/js/LoginCtrl.js
+++ b/www/js/LoginCtrl.js
@@ -10,6 +10,15 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
var serverbuttons = [];
var availableServers;
+ $scope.loginData = ZMDataModel.getLogin();
+
+ $scope.check = {
+ isUseAuth: "",
+ isUseEventServer: ""
+ };
+
+ $scope.check.isUseAuth = ($scope.loginData.isUseAuth == '1') ? true : false;
+ $scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false;
//----------------------------------------------------------------
// Alarm notification handling
@@ -29,15 +38,7 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
}
};
- $scope.loginData = ZMDataModel.getLogin();
-
- $scope.check = {
- isUseAuth: "",
- isUseEventServer: ""
- };
-
- $scope.check.isUseAuth = ($scope.loginData.isUseAuth == '1') ? true : false;
- $scope.check.isUseEventServer = ($scope.loginData.isUseEventServer == true) ? true : false;
+
//console.log("*************************************************");
@@ -50,6 +51,43 @@ angular.module('zmApp.controllers').controller('zmApp.LoginCtrl', ['$scope', '$r
});
//console.log("ADDING : " + availableServers[servIter]);
}
+
+
+ $scope.selectFallback = function ()
+ {
+ var as = Object.keys(ZMDataModel.getServerGroups());
+ if (as.length < 2)
+ {
+ $rootScope.zmPopup= SecuredPopups.show('alert',{
+ title: 'Error',
+ template: 'You need to have at least 2 distinct configurations created for a fallback'
+ });
+ return;
+
+ }
+ var ab = [{text:'Clear'}];
+ var ld = ZMDataModel.getLogin();
+ as.forEach(function(item) { if (item != ld.serverName) ab.push({text:item});});
+ var sheet = $ionicActionSheet.show({
+ buttons: ab,
+ titleText: 'Select fallback',
+ cancelText: 'Cancel',
+ cancel: function() {},
+ buttonClicked: function (index)
+ {
+ console.log ("YOU WANT " + ab[index].text + index);
+ if (index==0)
+ $scope.loginData.fallbackConfiguration="";
+ else
+ $scope.loginData.fallbackConfiguration = ab[index].text;
+ ZMDataModel.setLogin($scope.loginData);
+ return true;
+ }
+ });
+
+
+
+ };
$scope.serverActionSheet = function () {
var hideSheet = $ionicActionSheet.show({
diff --git a/www/js/app.js b/www/js/app.js
index e5100e05..298644c4 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -737,181 +737,189 @@ angular.module('zmApp', [
function doLogin(str) {
- // recompute rand anyway so even if you don't have auth
- // your stream should not get frozen
- $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
- $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
+ var d = $q.defer();
- var statename = $ionicHistory.currentStateName();
+ var statename = $ionicHistory.currentStateName();
+
+ if (statename == "montage-history")
+ {
+ ZMDataModel.zmLog ("Skipping login process as we are in montage history. Re-logging will mess up the stream");
+ d.resolve("success");
+ return d.promise;
+
+ }
- if (statename == "montage-history")
- {
- ZMDataModel.zmLog ("Skipping login process as we are in montage history. Re-logging will mess up the stream");
- return;
- }
- // console.log ("***** STATENAME IS " + statename);
+ ZMDataModel.getReachableConfig()
+ .then (function (data)
+ {
+ ZMDataModel.zmLog ("REACHABILITY SUCCESS " + JSON.stringify(data));
+ proceedWithLogin()
+ .then (function(success)
+ { d.resolve(success); return d.promise;},
+ function(error)
+ { d.reject(error); return d.promise;});
+
+ },
+ function (error)
+ {
+ ZMDataModel.zmLog ("REACHABILITY ERROR " + JSON.stringify(error));
+ d.reject (error);
+ return d.promise;
+ });
+ return d.promise;
- var d = $q.defer();
- var ld = ZMDataModel.getLogin();
- if (ld.isUseAuth != "1") {
- $ionicLoading.hide();
- ZMDataModel.zmLog("Authentication is disabled. Skipping login");
- ZMDataModel.zmLog("However, still doing a reachability check...");
+
+ function proceedWithLogin()
+ {
+ // recompute rand anyway so even if you don't have auth
+ // your stream should not get frozen
+ $rootScope.rand = Math.floor((Math.random() * 100000) + 1);
+ $rootScope.modalRand = Math.floor((Math.random() * 100000) + 1);
- ZMDataModel.zmDebug ("LD.url is " + ld.url);
- $http.get(ld.url)
- .then(function (success) {
- ZMDataModel.zmLog(ld.url + " is reachable.");
- d.resolve("Login success - no auth");
- return d.promise;
+
- },
- function (error) {
- ZMDataModel.zmLog(ld.url + " is NOT reachable.");
- d.reject("Login Error - not reachable");
- $rootScope.$emit('auth-error', "not reachable");
- return d.promise;
- });
+ // console.log ("***** STATENAME IS " + statename);
- return d.promise;
- }
+ var d = $q.defer();
+ var ld = ZMDataModel.getLogin();
+ ZMDataModel.zmLog("zmAutologin called");
- ZMDataModel.zmLog("zmAutologin called");
+ if (str) {
+ $ionicLoading.show({
+ template: str,
+ noBackdrop: true,
+ duration: zm.httpTimeout
+ });
+ }
- if (str) {
- $ionicLoading.show({
- template: str,
- noBackdrop: true,
- duration: zm.httpTimeout
- });
- }
+ ZMDataModel.isReCaptcha()
+ .then(function (result) {
+ if (result == true) {
+ $ionicLoading.hide();
+ ZMDataModel.displayBanner('error', ['reCaptcha must be disabled',
+ ], "", 8000);
+ var alertPopup = $ionicPopup.alert({
+ title: 'reCaptcha enabled',
+ template: 'Looks like you have enabled reCaptcha. It needs to be turned off for zmNinja to work'
+ });
- ZMDataModel.isReCaptcha()
- .then(function (result) {
- if (result == true) {
- $ionicLoading.hide();
- ZMDataModel.displayBanner('error', ['reCaptcha must be disabled',
- ], "", 8000);
- var alertPopup = $ionicPopup.alert({
- title: 'reCaptcha enabled',
- template: 'Looks like you have enabled reCaptcha. It needs to be turned off for zmNinja to work'
- });
-
-
- // close it after 5 seconds
- $timeout(function () {
- alertPopup.close();
- }, 5000);
-
- d.reject ("Error-disable recaptcha");
- return (d.promise);
- }
-
-
+ // close it after 5 seconds
+ $timeout(function () {
- });
+ alertPopup.close();
+ }, 5000);
+ d.reject ("Error-disable recaptcha");
+ return (d.promise);
+ }
- var loginData = ZMDataModel.getLogin();
- //ZMDataModel.zmDebug ("*** AUTH LOGIN URL IS " + loginData.url);
- $http({
- method: 'POST',
- //withCredentials: true,
- url: loginData.url + '/index.php',
- headers: {
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'Accept': 'application/json',
- },
- transformRequest: function (obj) {
- var str = [];
- for (var p in obj)
- str.push(encodeURIComponent(p) + "=" +
- encodeURIComponent(obj[p]));
- var params = str.join("&");
- return params;
- },
-
- data: {
- username: loginData.username,
- password: loginData.password,
- action: "login",
- view: "console"
- }
- })
- .success(function (data, status, headers) {
- $ionicLoading.hide();
- // Coming here does not mean success
- // it could also be a bad login, but
- // ZM returns you to login.php and returns 200 OK
- // so we will check if the data has
- // <title>ZM - Login</title> -- it it does then its the login page
+ });
- if (data.indexOf(zm.loginScreenString) == -1) {
- //eventServer.start();
- $rootScope.loggedIntoZm = 1;
- ZMDataModel.zmLog("zmAutologin successfully logged into Zoneminder");
+ var loginData = ZMDataModel.getLogin();
+ //ZMDataModel.zmDebug ("*** AUTH LOGIN URL IS " + loginData.url);
+ $http({
+ method: 'POST',
+ //withCredentials: true,
+ url: loginData.url + '/index.php',
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Accept': 'application/json',
+ },
+ transformRequest: function (obj) {
+ var str = [];
+ for (var p in obj)
+ str.push(encodeURIComponent(p) + "=" +
+ encodeURIComponent(obj[p]));
+ var params = str.join("&");
+ return params;
+ },
- d.resolve("Login Success");
+ data: {
+ username: loginData.username,
+ password: loginData.password,
+ action: "login",
+ view: "console"
+ }
+ })
+ .success(function (data, status, headers) {
+ $ionicLoading.hide();
- $rootScope.$emit('auth-success', data);
-
- } else // this means login error
- {
- $rootScope.loggedIntoZm = -1;
- //console.log("**** ZM Login FAILED");
- ZMDataModel.zmLog("zmAutologin Error: Bad Credentials ", "error");
- $rootScope.$emit('auth-error', "incorrect credentials");
+ // Coming here does not mean success
+ // it could also be a bad login, but
+ // ZM returns you to login.php and returns 200 OK
+ // so we will check if the data has
+ // <title>ZM - Login</title> -- it it does then its the login page
- d.reject("Login Error");
- return (d.promise);
- }
- // Now go ahead and re-get auth key
- // if login was a success
- $rootScope.authSession = "undefined";
- var ld = ZMDataModel.getLogin();
- ZMDataModel.getAuthKey($rootScope.validMonitorId)
- .then(function (success) {
+ if (data.indexOf(zm.loginScreenString) == -1) {
+ //eventServer.start();
+ $rootScope.loggedIntoZm = 1;
- //console.log(success);
- $rootScope.authSession = success;
- ZMDataModel.zmLog("Stream authentication construction: " +
- $rootScope.authSession);
+ ZMDataModel.zmLog("zmAutologin successfully logged into Zoneminder");
- },
- function (error) {
- //console.log(error);
+ d.resolve("Login Success");
- ZMDataModel.zmLog("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
- ZMDataModel.zmDebug("Error was: " + JSON.stringify(error));
- });
+ $rootScope.$emit('auth-success', data);
- return (d.promise);
+ } else // this means login error
+ {
+ $rootScope.loggedIntoZm = -1;
+ //console.log("**** ZM Login FAILED");
+ ZMDataModel.zmLog("zmAutologin Error: Bad Credentials ", "error");
+ $rootScope.$emit('auth-error', "incorrect credentials");
- })
- .error(function (error, status) {
- $ionicLoading.hide();
-
- //console.log("**** ZM Login FAILED");
-
- // FIXME: Is this sometimes results in null
-
- ZMDataModel.zmLog("zmAutologin Error " + JSON.stringify(error) + " and status " + status);
- // bad urls etc come here
- $rootScope.loggedIntoZm = -1;
- $rootScope.$emit('auth-error', error);
+ d.reject("Login Error");
+ return (d.promise);
+ }
- d.reject("Login Error");
- return d.promise;
- });
- return d.promise;
+ // Now go ahead and re-get auth key
+ // if login was a success
+ $rootScope.authSession = "undefined";
+ var ld = ZMDataModel.getLogin();
+ ZMDataModel.getAuthKey($rootScope.validMonitorId)
+ .then(function (success) {
+
+ //console.log(success);
+ $rootScope.authSession = success;
+ ZMDataModel.zmLog("Stream authentication construction: " +
+ $rootScope.authSession);
+
+ },
+ function (error) {
+ //console.log(error);
+
+ ZMDataModel.zmLog("Modal: Error returned Stream authentication construction. Retaining old value of: " + $rootScope.authSession);
+ ZMDataModel.zmDebug("Error was: " + JSON.stringify(error));
+ });
+
+ return (d.promise);
+
+ })
+ .error(function (error, status) {
+ $ionicLoading.hide();
+
+ //console.log("**** ZM Login FAILED");
+
+ // FIXME: Is this sometimes results in null
+
+ ZMDataModel.zmLog("zmAutologin Error " + JSON.stringify(error) + " and status " + status);
+ // bad urls etc come here
+ $rootScope.loggedIntoZm = -1;
+ $rootScope.$emit('auth-error', error);
+
+ d.reject("Login Error");
+ return d.promise;
+ });
+ return d.promise;
+ }
+
}
diff --git a/www/templates/login.html b/www/templates/login.html
index 8ba67e2d..6e9280cb 100644
--- a/www/templates/login.html
+++ b/www/templates/login.html
@@ -73,16 +73,19 @@
ng-model="loginData.apiurl">
</label>
+ <a class="item item-icon-right" href="" ng-click="selectFallback()">
+ <i class="icon ion-ios-arrow-right">
+ </i>
+ Fallback configuration<p>{{loginData.fallbackConfiguration}}</p>
+ </a>
+
<a class="item item-icon-right" href="" ng-click="eventServerSettings()">
<i class="icon ion-ios-arrow-right">
</i>
- Event Server
+ Event Server
</a>
-
-
-
<div ng-if="$root.platformOS != 'desktop'">
<label>