From ef0addc29d52e27743b1df2c0aef5c50d4bb05ab Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 18 Apr 2017 10:18:55 -0300 Subject: [PATCH 1/6] fix config.lock options by default --- src/js/controllers/lock.js | 14 +++++++------- src/js/controllers/pin.js | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/js/controllers/lock.js b/src/js/controllers/lock.js index 13c9fccb7..6a53bff7b 100644 --- a/src/js/controllers/lock.js +++ b/src/js/controllers/lock.js @@ -4,18 +4,18 @@ angular.module('copayApp.controllers').controller('lockController', function($st function init() { var config = configService.getSync(); - $scope.locking = config.lock.method != 'pin'; + $scope.locking = config.lock && config.lock.method == 'pin' ? false : true; $scope.options = [ { - method: 'none', + method: '', label: gettextCatalog.getString('Disabled'), - value: config.lock.method == '', + selected: config.lock && config.lock.method == '' ? true : false, }, { method: 'pin', label: gettextCatalog.getString('Enable PIN'), - value: config.lock.method == 'pin', + selected: config.lock && config.lock.method == 'pin' ? true : false, needsBackup: null, }, ]; @@ -24,12 +24,12 @@ angular.module('copayApp.controllers').controller('lockController', function($st $scope.options.push({ method: 'fingerprint', label: gettextCatalog.getString('Enable Fingerprint'), - value: config.lock.method == 'fingerprint', + selected: config.lock && config.lock.method == 'fingerprint' ? true : false, needsBackup: null, }); } - $scope.currentOption = lodash.find($scope.options, 'value'); + $scope.currentOption = lodash.find($scope.options, 'selected') || $scope.options[0]; processWallets(); }; @@ -71,7 +71,7 @@ angular.module('copayApp.controllers').controller('lockController', function($st }; $scope.select = function(method) { - if (method == 'none') + if (method == '') saveConfig(); else if (method == 'fingerprint') { var config = configService.getSync(); diff --git a/src/js/controllers/pin.js b/src/js/controllers/pin.js index 94dd15d40..ef48c0198 100644 --- a/src/js/controllers/pin.js +++ b/src/js/controllers/pin.js @@ -15,6 +15,7 @@ angular.module('copayApp.controllers').controller('pinController', function($sta $scope.$on("$ionicView.enter", function(event) { configService.whenAvailable(function(config) { + if (!config.lock) return; $scope.bannedUntil = config.lock.bannedUntil || null; if ($scope.bannedUntil) { var now = Math.floor(Date.now() / 1000); @@ -156,12 +157,13 @@ angular.module('copayApp.controllers').controller('pinController', function($sta function saveSettings(method, value) { var config = configService.getSync(); + var attempts = config.lock && config.lock.attempts ? config.lock.attempts : 0; var opts = { lock: { method: method || '', value: value || '', bannedUntil: null, - attempts: config.lock.attempts + 1, + attempts: attempts + 1, } }; From bb7186db695c2e2e876662e90c4b1481f56ee8aa Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 18 Apr 2017 11:14:05 -0300 Subject: [PATCH 2/6] refactor routes --- src/js/controllers/{lock.js => lockSetup.js} | 0 src/js/routes.js | 83 ++++++++++---------- 2 files changed, 42 insertions(+), 41 deletions(-) rename src/js/controllers/{lock.js => lockSetup.js} (100%) diff --git a/src/js/controllers/lock.js b/src/js/controllers/lockSetup.js similarity index 100% rename from src/js/controllers/lock.js rename to src/js/controllers/lockSetup.js diff --git a/src/js/routes.js b/src/js/routes.js index 7a4d400c2..99c16fbb7 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -463,16 +463,16 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.lock', { - url: '/lock', + .state('tabs.lockSetup', { + url: '/lockSetup', views: { 'tab-settings@tabs': { - controller: 'lockController', - templateUrl: 'views/lock.html', + controller: 'lockSetupController', + templateUrl: 'views/lockSetup.html', } } }) - .state('tabs.lock.pin', { + .state('tabs.pin', { url: '/pin/:fromSettings/:locking', views: { 'tab-settings@tabs': { @@ -1205,25 +1205,42 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr // Nothing to do }); - $ionicPlatform.on('resume', function() { - configService.whenAvailable(function(config) { - var nextView; - var lock = config.lock; - if (lock && lock.method == 'fingerprint' && fingerprintService.isAvailable()) { - fingerprintService.check('unlockingApp', function(err) { - if (err) goTo('lockedView'); - else if ($ionicHistory.currentStateName() == 'lockedView') goTo('tabs.home'); - }); - } else if (lock && lock.method == 'pin') { - goTo('pin'); - } - function goTo(nextView) { - $state.transitionTo(nextView).then(function() { - if (nextView == 'lockedView') $ionicHistory.clearHistory(); + function checkAndApplyLock(defaultView) { + + if (!platformInfo.isCordova && !platformInfo.isDevel) { + goTo('tabs.home'); + } + + function goTo(nextView) { + $state.transitionTo(nextView).then(function() { + if (nextView == 'lockedView') + $ionicHistory.clearHistory(); + }); + }; + + configService.whenAvailable(function(config) { + var lockMethod = config.lock && config.lock.method; + $log.debug('App Lock:' + (lockMethod||'no') ); + + if (lockMethod == 'fingerprint' && fingerprintService.isAvailable()) { + fingerprintService.check('unlockingApp', function(err) { + if (err) + goTo('lockedView'); + + if ($ionicHistory.currentStateName() == 'lockedView') + goTo('tabs.home'); }); - }; + } else if (lockMethod == 'pin') { + goTo('pin'); + } else if (defaultView) { + goTo(defaultView); + } }); + } + + $ionicPlatform.on('resume', function() { + checkAndApplyLock(); }); $ionicPlatform.on('menubutton', function() { @@ -1266,27 +1283,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr disableAnimate: true, historyRoot: true }); - if (platformInfo.isCordova || platformInfo.isDevel) { - startupService.ready(); - configService.whenAvailable(function(config) { - var lock = config.lock; - if (fingerprintService.isAvailable() && lock && lock.method == 'fingerprint') { - fingerprintService.check('unlockingApp', function(err) { - if (err) goTo('lockedView'); - else goTo('tabs.home'); - }); - } else if (lock && lock.method == 'pin') { - goTo('pin'); - } else - goTo('tabs.home'); - }); - } else goTo('tabs.home'); - function goTo(nextView) { - $state.transitionTo(nextView).then(function() { - $ionicHistory.clearHistory(); - }); - } + if (platformInfo.isCordova) + startupService.ready(); + + checkAndApplyLock('tabs.home'); }); }; // After everything have been loaded, initialize handler URL From 8be28e85dace3ca2bd1864e88ce21a30e938580e Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 18 Apr 2017 13:19:16 -0300 Subject: [PATCH 3/6] refactor --- src/js/controllers/lockSetup.js | 46 +++++++++++++------------ src/js/controllers/pin.js | 4 +-- src/js/controllers/tab-settings.js | 4 +-- src/js/routes.js | 26 +++++++------- src/js/services/configService.js | 4 +-- www/views/{lock.html => lockSetup.html} | 2 +- www/views/tab-settings.html | 2 +- 7 files changed, 45 insertions(+), 43 deletions(-) rename www/views/{lock.html => lockSetup.html} (88%) diff --git a/src/js/controllers/lockSetup.js b/src/js/controllers/lockSetup.js index 6a53bff7b..b9ad3a431 100644 --- a/src/js/controllers/lockSetup.js +++ b/src/js/controllers/lockSetup.js @@ -1,21 +1,16 @@ 'use strict'; -angular.module('copayApp.controllers').controller('lockController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService, fingerprintService, profileService, lodash) { +angular.module('copayApp.controllers').controller('lockSetupController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService, fingerprintService, profileService, lodash) { function init() { - var config = configService.getSync(); - $scope.locking = config.lock && config.lock.method == 'pin' ? false : true; - $scope.options = [ { - method: '', + method: null, label: gettextCatalog.getString('Disabled'), - selected: config.lock && config.lock.method == '' ? true : false, }, { method: 'pin', - label: gettextCatalog.getString('Enable PIN'), - selected: config.lock && config.lock.method == 'pin' ? true : false, + label: gettextCatalog.getString('Lock by PIN'), needsBackup: null, }, ]; @@ -23,13 +18,17 @@ angular.module('copayApp.controllers').controller('lockController', function($st if (fingerprintService.isAvailable()) { $scope.options.push({ method: 'fingerprint', - label: gettextCatalog.getString('Enable Fingerprint'), - selected: config.lock && config.lock.method == 'fingerprint' ? true : false, + label: gettextCatalog.getString('Lock by Fingerprint'), needsBackup: null, }); } - $scope.currentOption = lodash.find($scope.options, 'selected') || $scope.options[0]; + var config = configService.getSync(); + var method = config.lock && config.lock.method; + if (!method) $scope.currentOption = $scope.options[0]; + else $scope.currentOption = lodash.find($scope.options, { + 'method': method + }); processWallets(); }; @@ -70,21 +69,24 @@ angular.module('copayApp.controllers').controller('lockController', function($st }); }; - $scope.select = function(method) { - if (method == '') + $scope.select = function(selectedMethod) { + var config = configService.getSync(); + var savedMethod = config.lock && config.lock.method; + + if (!selectedMethod) saveConfig(); - else if (method == 'fingerprint') { - var config = configService.getSync(); - if (config.lock.method == 'pin') { + else if (selectedMethod == 'fingerprint') { + if (savedMethod == 'pin') { askForDisablePin(function(disablePin) { if (disablePin) saveConfig('fingerprint'); else init(); }); } else saveConfig('fingerprint'); - } else if (method == 'pin') { - $state.transitionTo('tabs.lock.pin', { + } else if (selectedMethod == 'pin') { + if (savedMethod == 'pin') return; + $state.transitionTo('tabs.pin', { fromSettings: true, - locking: $scope.locking + locking: savedMethod == 'pin' ? false : true }); } $timeout(function() { @@ -93,7 +95,7 @@ angular.module('copayApp.controllers').controller('lockController', function($st }; function askForDisablePin(cb) { - var message = gettextCatalog.getString('{{appName}} is protected by Pin. Are you sure you want to disable it?', { + var message = gettextCatalog.getString('{{appName}} startup is locked by PIN. Are you sure you want to disable it?', { appName: appConfigService.nameCase }); var okText = gettextCatalog.getString('Continue'); @@ -107,8 +109,8 @@ angular.module('copayApp.controllers').controller('lockController', function($st function saveConfig(method) { var opts = { lock: { - method: method || '', - value: '', + method: method || null, + value: null, } }; diff --git a/src/js/controllers/pin.js b/src/js/controllers/pin.js index ef48c0198..9abadb441 100644 --- a/src/js/controllers/pin.js +++ b/src/js/controllers/pin.js @@ -160,8 +160,8 @@ angular.module('copayApp.controllers').controller('pinController', function($sta var attempts = config.lock && config.lock.attempts ? config.lock.attempts : 0; var opts = { lock: { - method: method || '', - value: value || '', + method: method || null, + value: value || null, bannedUntil: null, attempts: attempts + 1, } diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 80152ca61..843059c84 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -54,8 +54,8 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct $scope.isDevel = platformInfo.isDevel; $scope.appName = appConfigService.nameCase; configService.whenAvailable(function(config) { - $scope.locked = config.lock && config.lock.method != '' ? true : false; - $scope.method = config.lock && config.lock.method != '' ? config.lock.method.charAt(0).toUpperCase() + config.lock.method.slice(1) : gettextCatalog.getString('Disabled'); + $scope.locked = config.lock && config.lock.method; + $scope.method = $scope.locked ? config.lock.method.charAt(0).toUpperCase() + config.lock.method.slice(1) : gettextCatalog.getString('Disabled'); }); }); diff --git a/src/js/routes.js b/src/js/routes.js index 99c16fbb7..da09f3a7b 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1206,41 +1206,44 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }); - function checkAndApplyLock(defaultView) { + function checkAndApplyLock(onResume) { + var defaultView = 'tabs.home'; if (!platformInfo.isCordova && !platformInfo.isDevel) { - goTo('tabs.home'); + goTo(defaultView); } function goTo(nextView) { + nextView = nextView || defaultView; $state.transitionTo(nextView).then(function() { - if (nextView == 'lockedView') + if (nextView == 'lockedView') $ionicHistory.clearHistory(); }); }; + startupService.ready(); + configService.whenAvailable(function(config) { var lockMethod = config.lock && config.lock.method; - $log.debug('App Lock:' + (lockMethod||'no') ); + $log.debug('App Lock:' + (lockMethod || 'no')); if (lockMethod == 'fingerprint' && fingerprintService.isAvailable()) { fingerprintService.check('unlockingApp', function(err) { - if (err) + if (err) goTo('lockedView'); - - if ($ionicHistory.currentStateName() == 'lockedView') + if ($ionicHistory.currentStateName() == 'lockedView' || !onResume) goTo('tabs.home'); }); } else if (lockMethod == 'pin') { goTo('pin'); - } else if (defaultView) { + } else { goTo(defaultView); } }); } $ionicPlatform.on('resume', function() { - checkAndApplyLock(); + checkAndApplyLock(true); }); $ionicPlatform.on('menubutton', function() { @@ -1284,10 +1287,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr historyRoot: true }); - if (platformInfo.isCordova) - startupService.ready(); - - checkAndApplyLock('tabs.home'); + checkAndApplyLock(); }); }; // After everything have been loaded, initialize handler URL diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 3d979af7f..2b92e58ff 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -54,8 +54,8 @@ angular.module('copayApp.services').factory('configService', function(storageSer }, lock: { - method: '', - value: '', + method: null, + value: null, bannedUntil: null, attempts: null, }, diff --git a/www/views/lock.html b/www/views/lockSetup.html similarity index 88% rename from www/views/lock.html rename to www/views/lockSetup.html index 821cb7310..1bab91b8b 100644 --- a/www/views/lock.html +++ b/www/views/lockSetup.html @@ -1,6 +1,6 @@ - {{'Lock App' | translate}} + {{'Startup Lock' | translate}} diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index e0bbe0e0e..cfc054614 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -89,7 +89,7 @@ - + {{'Lock App' | translate}} From 9f41a8b79a62a0d41481a39a617478f60adcdeef Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 18 Apr 2017 16:42:17 -0300 Subject: [PATCH 4/6] logs --- src/js/routes.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/js/routes.js b/src/js/routes.js index da09f3a7b..5b03f365f 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1209,10 +1209,12 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr function checkAndApplyLock(onResume) { var defaultView = 'tabs.home'; +console.log('[routes.js.1211]'); //TODO if (!platformInfo.isCordova && !platformInfo.isDevel) { goTo(defaultView); } +console.log('[routes.js.1216]'); //TODO function goTo(nextView) { nextView = nextView || defaultView; $state.transitionTo(nextView).then(function() { @@ -1287,6 +1289,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr historyRoot: true }); +console.log('[routes.js.1289]'); //TODO checkAndApplyLock(); }); }; From 43f04d429625257745c352b4d79b69ba09088b0b Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Tue, 18 Apr 2017 17:19:11 -0300 Subject: [PATCH 5/6] fix starting --- src/js/controllers/pin.js | 7 ++++++- src/js/routes.js | 3 --- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/js/controllers/pin.js b/src/js/controllers/pin.js index 9abadb441..3156320fd 100644 --- a/src/js/controllers/pin.js +++ b/src/js/controllers/pin.js @@ -175,7 +175,12 @@ angular.module('copayApp.controllers').controller('pinController', function($sta $scope.close = function(delay) { $timeout(function() { - $ionicHistory.viewHistory().backView ? $ionicHistory.goBack() : $state.go('tabs.home'); + var shouldReturn = $ionicHistory.viewHistory().backView && $ionicHistory.viewHistory().backView.stateName != 'starting'; + + if (shouldReturn) + $ionicHistory.goBack() + else + $state.go('tabs.home'); }, delay || 1); }; }); diff --git a/src/js/routes.js b/src/js/routes.js index 5b03f365f..da09f3a7b 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1209,12 +1209,10 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr function checkAndApplyLock(onResume) { var defaultView = 'tabs.home'; -console.log('[routes.js.1211]'); //TODO if (!platformInfo.isCordova && !platformInfo.isDevel) { goTo(defaultView); } -console.log('[routes.js.1216]'); //TODO function goTo(nextView) { nextView = nextView || defaultView; $state.transitionTo(nextView).then(function() { @@ -1289,7 +1287,6 @@ console.log('[routes.js.1216]'); //TODO historyRoot: true }); -console.log('[routes.js.1289]'); //TODO checkAndApplyLock(); }); }; From fdae97ce63a776ac60a8095275f1d5c73e4f0645 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 18 Apr 2017 17:25:01 -0300 Subject: [PATCH 6/6] check for unlock time --- src/js/routes.js | 10 +++++++++- src/js/services/openURL.js | 8 +++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/js/routes.js b/src/js/routes.js index da09f3a7b..ce7f5485d 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1213,6 +1213,14 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr goTo(defaultView); } + if (onResume) { + var now = Math.floor(Date.now() / 1000); + if (now < openURLService.unlockUntil) { + $log.debug('Skip startup locking'); + return; + } + } + function goTo(nextView) { nextView = nextView || defaultView; $state.transitionTo(nextView).then(function() { @@ -1293,7 +1301,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr // After everything have been loaded, initialize handler URL $timeout(function() { openURLService.init(); - }, 1000); + }); }); }); diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js index 7c1af7417..8e6a768cf 100644 --- a/src/js/services/openURL.js +++ b/src/js/services/openURL.js @@ -1,9 +1,15 @@ 'use strict'; angular.module('copayApp.services').factory('openURLService', function($rootScope, $ionicHistory, $document, $log, $state, platformInfo, lodash, profileService, incomingData, appConfigService) { + var DELAY_UNLOCK_TIME = 2 * 60; var root = {}; + root.unlockUntil = null; + var handleOpenURL = function(args) { + root.unlockUntil = Math.floor(Date.now() / 1000) + DELAY_UNLOCK_TIME; + $log.debug('Set unlock time until: ' + root.unlockUntil); + $log.info('Handling Open URL: ' + JSON.stringify(args)); // Stop it from caching the first view as one to return when the app opens $ionicHistory.nextViewOptions({ @@ -103,5 +109,5 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop }); }; -return root; + return root; });