summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--www/js/NVR.js8
-rw-r--r--www/js/WizardCtrl.js265
-rwxr-xr-xwww/js/app.js14
3 files changed, 279 insertions, 8 deletions
diff --git a/www/js/NVR.js b/www/js/NVR.js
index d37851cf..89002a5c 100644
--- a/www/js/NVR.js
+++ b/www/js/NVR.js
@@ -20,7 +20,7 @@ angular.module('zmApp.controllers')
DO NOT TOUCH zmAppVersion
It is changed by sync_version.sh
*/
- var zmAppVersion = "1.3.050";
+ var zmAppVersion = "1.3.051";
var isBackground = false;
var justResumed = false;
var timeSinceResumed = -1;
@@ -765,6 +765,8 @@ angular.module('zmApp.controllers')
return latestBlogPostChecked;
},
+
+
// This function is called when the app is ready to run
// sets up various variables
// including persistent login data for the ZM apis and portal
@@ -1773,6 +1775,8 @@ angular.module('zmApp.controllers')
},
+
+
//--------------------------------------------------------------------------
// writes all params to local storage. FIXME: Move all of this into a JSON
// object
@@ -1785,6 +1789,8 @@ angular.module('zmApp.controllers')
},
+
+
//-------------------------------------------------------
// returns API version or none
//-------------------------------------------------------
diff --git a/www/js/WizardCtrl.js b/www/js/WizardCtrl.js
index 688fa18c..5ca0aa25 100644
--- a/www/js/WizardCtrl.js
+++ b/www/js/WizardCtrl.js
@@ -42,7 +42,8 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
data = data.data;
//console.log("LOOKING FOR " + zm.loginScreenString);
//console.log("DATA RECEIVED " + JSON.stringify(data));
- if (data.indexOf(zm.loginScreenString) == -1) {
+ if (data.indexOf(zm.loginScreenString1) == -1 &&
+ data.indexOf(zm.loginScreenString2) == -1 ) {
$scope.wizard.loginURL = $scope.wizard.fqportal;
$scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL;
@@ -53,12 +54,17 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
//console.log("************ERROR");
$scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
$scope.wizard.portalColor = "#e74c3c";
+ // NVR.debug("Login response form was invalid,I am going to try JSON login");
+
+
+
d.reject(false);
return d.promise;
}
},
function (error) {
// console.log("************ERROR:"+ JSON.stringify(error));
+ NVR.debug ("Login error returned: "+JSON.stringify(error));
$scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
$scope.wizard.portalColor = "#e74c3c";
d.reject(false);
@@ -416,10 +422,261 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
// tries to log into the portal and then discover api and cgi-bin
//--------------------------------------------------------------------------
- function validateDataNewAPI() {
+
+ function loginWebScrape(u,zmu,zmp) {
+ var d = $q.defer();
+ NVR.debug("Logging in using old web-scrape method");
+
+
+
+ $ionicLoading.show({
+ template: $translate.instant('kAuthenticatingWebScrape'),
+ noBackdrop: true,
+ duration: zm.httpTimeout
+ });
+
+ u=u+'/index.php?view=console';
+ NVR.debug ("webscrape login to:"+u);
+
+ //NVR.debug ("*** AUTH LOGIN URL IS " + loginData.url);
+ $http({
+
+ method: 'post',
+ timeout: zm.httpTimeout,
+ //withCredentials: true,
+ url: u ,
+ 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: zmu,
+ password: zmp,
+ action: "login",
+ view: "console"
+ }
+ })
+ .then(function (data, status, headers) {
+ // console.log(">>>>>>>>>>>>>> PARALLEL POST SUCCESS");
+ data = data.data;
+ $ionicLoading.hide();
+
+ console.log ("GOT "+data);
+
+ if (data.indexOf(zm.loginScreenString1) >=0 ||
+ data.indexOf(zm.loginScreenString2) >=0 ) {
+ //eventServer.start();
+ //$rootScope.loggedIntoZm = 1;
+
+ NVR.log("zmAutologin successfully logged into Zoneminder");
+ $scope.wizard.loginURL = $scope.wizard.fqportal;
+ $scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL;
+ $scope.wizard.portalColor = "#16a085";
+ d.resolve(true);
+ return d.promise;
+
+ // now go to authKey part, so don't return yet...
+
+ } else // this means login error
+ {
+ // $rootScope.loggedIntoZm = -1;
+ //console.log("**** ZM Login FAILED");
+ NVR.log("zmAutologin Error: Bad Credentials ", "error");
+ $scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
+ $scope.wizard.portalColor = "#e74c3c";
+ d.reject("Login Error");
+ return (d.promise);
+ // no need to go to next code, so return above
+ }
+
+ // Now go ahead and re-get auth key
+ // if login was a success
+
+
+ },
+ function (error, status) {
+
+ // console.log(">>>>>>>>>>>>>> PARALLEL POST ERROR");
+ $ionicLoading.hide();
+
+ //console.log("**** ZM Login FAILED");
+
+ // FIXME: Is this sometimes results in null
+
+ NVR.log("zmAutologin Error " + JSON.stringify(error) + " and status " + status);
+ // bad urls etc come here
+ //$rootScope.loggedIntoZm = -1;
+ $scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
+ $scope.wizard.portalColor = "#e74c3c";
+
+ d.reject("Login Error");
+ return d.promise;
+ });
+ return d.promise;
}
+ function wizardLogin(u,zmu,zmp) {
+
+ var d = $q.defer();
+ var loginAPI = u + '/api/host/login.json';
+ NVR.debug ("Inside wizardLogin: will try "+loginAPI);
+
+ $http({
+ method: 'post',
+ url: loginAPI,
+ timeout: zm.httpTimeout,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
+ responseType: 'text',
+ transformResponse: undefined,
+ transformRequest: function (obj) {
+ var str = [];
+ for (var p in obj)
+ str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
+ return str.join("&");
+ },
+ data: {
+ user: zmu,
+ pass: zmp
+ }
+ })
+ //$http.get(loginAPI)
+ .then(function (textsucc) {
+
+ $ionicLoading.hide();
+
+ var succ;
+ try {
+
+ succ = JSON.parse(textsucc.data);
+
+ if (!succ.version) {
+ NVR.debug("API login returned fake success, going back to webscrape");
+
+
+ loginWebScrape(u,zmu,zmp)
+ .then(function (succ) {
+ d.resolve("Login Success");
+ return d.promise;
+ },
+ function (err) {
+ $ionicLoading.hide();
+ d.reject("Login Error");
+ return (d.promise);
+ });
+ return d.promise;
+ }
+ NVR.debug("API based login returned... ");
+ console.log (JSON.stringify(succ));
+ $ionicLoading.hide();
+ //$rootScope.loggedIntoZm = 1;
+ $rootScope.authSession = '';
+
+ if (succ.credentials) {
+ $rootScope.authSession = "&" + succ.credentials;
+ if (succ.append_password == '1') {
+ $rootScope.authSession = $rootScope.authSession +
+ loginData.password;
+ }
+ }
+
+
+ NVR.log("Stream authentication construction: " +
+ $rootScope.authSession);
+
+ NVR.log("zmAutologin successfully logged into Zoneminder via API");
+
+
+ $scope.wizard.loginURL = $scope.wizard.fqportal;
+ $scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL;
+ $scope.wizard.portalColor = "#16a085";
+
+ d.resolve("Login Success");
+
+
+ return d.promise;
+
+ } catch (e) {
+ NVR.debug("Login API approach did not work...");
+
+ loginWebScrape(u,zmu,zmp)
+ .then(function (succ) {
+
+ $scope.wizard.loginURL = $scope.wizard.fqportal;
+ $scope.wizard.portalValidText = $translate.instant('kPortal') + ": " + $scope.wizard.loginURL;
+ $scope.wizard.portalColor = "#16a085";
+
+ d.resolve("Login Success");
+ return d.promise;
+ },
+ function (err) {
+ $ionicLoading.hide();
+ $scope.wizard.portalValidText = $translate.instant('kPortalDetectionFailed');
+ $scope.wizard.portalColor = "#e74c3c";
+ d.reject("Login Error");
+ return (d.promise);
+ });
+ return d.promise;
+
+ }
+
+
+
+ },
+ function (err) {
+ console.log("******************* API login error " + JSON.stringify(err));
+ $ionicLoading.hide();
+
+
+ if (1) {
+ //if (err && err.data && 'success' in err.data) {
+ console.log("API based login not supported, need to use web scraping...");
+
+ loginWebScrape(u,zmu,zmp)
+ .then(function (succ) {
+ d.resolve("Login Success");
+ return d.promise;
+ },
+ function (err) {
+ d.reject("Login Error");
+ return (d.promise);
+ });
+
+
+ } else {
+ // $rootScope.loggedIntoZm = -1;
+ //console.log("**** ZM Login FAILED");
+ NVR.log("zmAutologin Error via API: some meta foo", "error");
+ $rootScope.$broadcast('auth-error', "I'm confused why");
+
+ d.reject("Login Error");
+ return (d.promise);
+
+ }
+
+
+ }
+ ); // post
+
+
+
+ return d.promise;
+ }
+
+
+
+
function validateData() {
$rootScope.authSession = 'undefined';
$rootScope.zmCookie = '';
@@ -459,7 +716,7 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
$scope.wizard.fqportal = u;
- u = u + '/index.php?view=console';
+ //u = u + '/index.php?view=console';
NVR.log("Wizard: login url is " + u);
// now lets login
@@ -493,7 +750,7 @@ angular.module('zmApp.controllers').controller('zmApp.WizardCtrl', ['$scope', '$
duration: zm.httpTimeout
});
NVR.setCurrentServerVersion("");
- login(u, zmu, zmp)
+ wizardLogin(u, zmu, zmp)
.then(function (success) {
$ionicLoading.hide();
NVR.log("zmWizard: login succeeded");
diff --git a/www/js/app.js b/www/js/app.js
index 580cfdaa..0b87bd82 100755
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -75,7 +75,8 @@ angular.module('zmApp', [
montageScaleFrequency: 300,
eventsListDetailsHeight: 230.0,
eventsListScrubHeight: 330,
- loginScreenString: "var currentView = 'login'", // Isn't there a better way?
+ loginScreenString1: "var currentView = 'console'", // Isn't there a better way?
+ loginScreenString2: "var currentView = 'console'",
desktopUrl: "/zm",
desktopApiUrl: "/api/zm",
latestRelease: "https://api.github.com/repos/pliablepixels/zmNinja/releases/latest",
@@ -1307,7 +1308,8 @@ angular.module('zmApp', [
// 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) {
+ if (data.indexOf(zm.loginScreenString1) >=0 ||
+ data.indexOf(zm.loginScreenString2) >=0 ) {
//eventServer.start();
//$rootScope.loggedIntoZm = 1;
@@ -2322,9 +2324,15 @@ angular.module('zmApp', [
var d = $q.defer();
+
+ var dataPayload = {};
+ if (arguments[0].data !== undefined) {
+ dataPayload = arguments[0].data;
+ }
+
var options = {
method: method,
- data: arguments[0].data || {},
+ data: dataPayload,
headers: arguments[0].headers,
// timeout: arguments[0].timeout,
responseType: arguments[0].responseType