diff options
Diffstat (limited to 'www/js')
| -rw-r--r-- | www/js/DevOptionsCtrl.js | 28 | ||||
| -rw-r--r-- | www/js/LoginCtrl.js | 3 | ||||
| -rw-r--r-- | www/js/MonitorCtrl.js | 1 | ||||
| -rw-r--r-- | www/js/NVR.js | 72 | ||||
| -rwxr-xr-x | www/js/app.js | 3 |
5 files changed, 93 insertions, 14 deletions
diff --git a/www/js/DevOptionsCtrl.js b/www/js/DevOptionsCtrl.js index 5fa349cc..1f5a920a 100644 --- a/www/js/DevOptionsCtrl.js +++ b/www/js/DevOptionsCtrl.js @@ -2,7 +2,7 @@ /* jslint browser: true*/ /* global cordova,StatusBar,angular,console */ -angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope', '$rootScope', '$ionicModal', 'zm', 'NVR', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', '$ionicHistory', '$state', 'SecuredPopups', '$translate', function ($scope, $rootScope, $ionicModal, zm, NVR, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, $ionicHistory, $state, SecuredPopups, $translate) { +angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope', '$rootScope', '$ionicModal', 'zm', 'NVR', '$ionicSideMenuDelegate', '$ionicPopup', '$http', '$q', '$ionicLoading', '$ionicHistory', '$state', 'SecuredPopups', '$translate','$ionicActionSheet', function ($scope, $rootScope, $ionicModal, zm, NVR, $ionicSideMenuDelegate, $ionicPopup, $http, $q, $ionicLoading, $ionicHistory, $state, SecuredPopups, $translate, $ionicActionSheet) { $scope.openMenu = function () { $ionicSideMenuDelegate.toggleLeft(); @@ -155,6 +155,32 @@ angular.module('zmApp.controllers').controller('zmApp.DevOptionsCtrl', ['$scope' }; + $scope.selectObfuscationScheme = function() { + + var buttons = [ + { text: $translate.instant('kObfuscationLZS'), value:'lzs' }, + { text: $translate.instant('kObfuscationAES'), value:'aes' }, + + ] + + $ionicActionSheet.show({ + titleText: $translate.instant('kSelect'), + buttons: buttons, + + cancelText: $translate.instant('kButtonCancel'), + cancel: function() { + NVR.debug ('obfuscation actionsheet cancelled'); + }, + buttonClicked: function(index) { + + $scope.loginData.obfuscationScheme = buttons[index].value; + NVR.debug ('changed obfuscation scheme to:'+$scope.loginData.obfuscationScheme ); + return true; + }, + + }); + }; + $scope.saveDevOptions = function () { saveDevOptions(); diff --git a/www/js/LoginCtrl.js b/www/js/LoginCtrl.js index 11474f2d..ffde6ffa 100644 --- a/www/js/LoginCtrl.js +++ b/www/js/LoginCtrl.js @@ -766,8 +766,7 @@ function mobilePinConfig () { var serverGroupList = NVR.getServerGroups(); serverGroupList[$scope.loginData.serverName] = angular.copy($scope.loginData); - var ct = CryptoJS.AES.encrypt(JSON.stringify(serverGroupList), zm.cipherKey).toString(); - + var ct = NVR.encrypt(serverGroupList); window.cordova.plugin.cloudsettings.save({ 'serverGroupList': ct, 'defaultServerName': $scope.loginData.serverName diff --git a/www/js/MonitorCtrl.js b/www/js/MonitorCtrl.js index b396f5ee..1cd695b7 100644 --- a/www/js/MonitorCtrl.js +++ b/www/js/MonitorCtrl.js @@ -423,6 +423,7 @@ angular.module('zmApp.controllers') else { NVR.debug ("reporting status of monitors from multi-server API"); processMonitorStatus(); + } }, diff --git a/www/js/NVR.js b/www/js/NVR.js index 8d9681c8..5b6eb0fd 100644 --- a/www/js/NVR.js +++ b/www/js/NVR.js @@ -1,7 +1,7 @@ /* jshint -W041 */ /* jslint browser: true*/ -/* global cordova,StatusBar,angular,console, URI, moment, localforage, CryptoJS, Connection */ +/* global cordova,StatusBar,angular,console, URI, moment, localforage, CryptoJS, Connection, LZString */ // This is my central data respository and common functions // that many other controllers use @@ -211,6 +211,7 @@ angular.module('zmApp.controllers') 'pauseStreams': false, 'liveStreamBuffer': 10, 'zmNinjaCustomId':undefined, // filled in init. custom header + 'obfuscationScheme': 'lzs' // or 'aes' }; @@ -404,8 +405,7 @@ angular.module('zmApp.controllers') //data = JSON.parse(data); if (doCrypt) { debug ('CACHE: decryption requested'); - var bytes = CryptoJS.AES.decrypt(data.toString(), zm.cipherKey); - data = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); + data = decrypt(data); } else data = JSON.parse(data); @@ -424,7 +424,7 @@ angular.module('zmApp.controllers') debug ('CACHE: storing key data in cache now, with expiry of '+expiry); if (doCrypt) { debug ('CACHE: encrypting request'); - var ct = CryptoJS.AES.encrypt(JSON.stringify(data), zm.cipherKey).toString(); + var ct = encrypt(data); cache_entry.data = ct; } else { @@ -1031,6 +1031,7 @@ angular.module('zmApp.controllers') } + } function setLogin(newLogin) { @@ -1045,8 +1046,8 @@ angular.module('zmApp.controllers') serverGroupList[loginData.serverName] = angular.copy(loginData); - var ct = CryptoJS.AES.encrypt(JSON.stringify(serverGroupList), zm.cipherKey).toString(); - + var ct = encrypt(serverGroupList); + //debug ("Crypto is: " + ct); return localforage.setItem("serverGroupList", ct) @@ -1611,6 +1612,10 @@ angular.module('zmApp.controllers') loginData.zmNinjaCustomId = 'zmNinja_'+zmAppVersion; } + if (typeof loginData.obfuscationScheme == 'undefined') { + loginData.obfuscationScheme = 'lzs'; + } + loginData.canSwipeMonitors = true; loginData.forceImageModePath = false; loginData.enableBlog = true; @@ -1676,9 +1681,57 @@ angular.module('zmApp.controllers') debug("Setting server version to:" + val); } + function encrypt(data) { + + var jsdata = JSON.stringify(data); + var compress; + + if (loginData.obfuscationScheme == 'lzs') { + compress = '--Z--'+LZString.compressToUTF16(jsdata); + + } + else if (loginData.obfuscationScheme == 'aes') { + compress = CryptoJS.AES.encrypt(jsdata, zm.cipherKey).toString(); + } else { + log ('ERROR: obfuscation scheme:'+loginData.obfuscationScheme+' not recognized'); + return undefined; + } + + debug ('obfuscate: original:'+jsdata.length+' obfuscated:'+compress.length+' scheme:'+loginData.obfuscationScheme); + return compress; + } + + function decrypt(data) { + //debug ('-->deobfuscating '+data.length+' bytes using scheme:'+loginData.obfuscationScheme); + var decodedVal; + var scheme; + if (data.substr(0,5) == '--Z--') { + //debug ('unpacking'); + scheme = 'lzs'; + decodedVal = LZString.decompressFromUTF16(data.substr(5)); + } else { + var bytes = CryptoJS.AES.decrypt(data.toString(), zm.cipherKey); + decodedVal = bytes.toString(CryptoJS.enc.Utf8); + scheme = 'aes'; + } + + //console.log ('-->decrypted ' + decodedVal); + debug ('deobfuscate: before:'+data.length+' after:'+decodedVal.length+' scheme:'+scheme); + var decodedJSON = JSON.parse(decodedVal); + + return (decodedJSON); + } + return { + encrypt: function(data) { + return encrypt(data); + }, + + decrypt: function(data) { + return decrypt(data); + }, insertSpecialTokens: function () { @@ -2009,8 +2062,8 @@ angular.module('zmApp.controllers') if (typeof sgl == 'string') { log("user profile encrypted, decoding..."); - var bytes = CryptoJS.AES.decrypt(sgl.toString(), zm.cipherKey); - decodedSgl = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); + decodedSgl = decrypt(sgl); + } else { decodedSgl = sgl; @@ -2128,8 +2181,7 @@ angular.module('zmApp.controllers') if (typeof val == 'string') { log("user profile encrypted, decoding..."); - var bytes = CryptoJS.AES.decrypt(val.toString(), zm.cipherKey); - decodedVal = JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); + decodedVal = decrypt(val); } else { log("user profile not encrypted"); diff --git a/www/js/app.js b/www/js/app.js index 3eb7210f..9221d456 100755 --- a/www/js/app.js +++ b/www/js/app.js @@ -1698,7 +1698,8 @@ angular.module('zmApp', [ NVR.log(">>>>migrated latestBlogPostChecked..."); // lets encrypt serverGroupList NVR.log("server group list is " + JSON.stringify(sgl)); - var ct = CryptoJS.AES.encrypt(JSON.stringify(sgl), zm.cipherKey); + var ct = NVR.encrypt(sgl); + NVR.log("encrypted server group list is " + ct); ct = sgl; return localforage.setItem('serverGroupList', ct); |
