From f704826a5c3c90d6f70e0116923d1e773b282a2d Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 30 Jul 2014 20:12:22 -0300 Subject: [PATCH 1/7] feature: Logout wallet after 15 minutes of inactivity --- bower.json | 3 ++- index.html | 1 + js/app.js | 2 ++ js/controllers/sidebar.js | 16 +++++++++++++++- js/routes.js | 5 ++++- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/bower.json b/bower.json index cf1a4f301..ed357189c 100644 --- a/bower.json +++ b/bower.json @@ -21,6 +21,7 @@ "bitcore": "0.1.34", "angular-moment": "~0.7.1", "socket.io-client": ">=1.0.0", - "mousetrap": "1.4.6" + "mousetrap": "1.4.6", + "ng-idle": "*" } } diff --git a/index.html b/index.html index acc29b64d..6369c9331 100644 --- a/index.html +++ b/index.html @@ -62,6 +62,7 @@ + diff --git a/js/app.js b/js/app.js index cf5656438..058dfbba6 100644 --- a/js/app.js +++ b/js/app.js @@ -27,6 +27,7 @@ var copayApp = window.copayApp = angular.module('copayApp', [ 'angularMoment', 'mm.foundation', 'monospaced.qrcode', + 'ngIdle', 'copayApp.filters', 'copayApp.services', 'copayApp.controllers', @@ -40,6 +41,7 @@ copayApp.config(function($sceDelegateProvider) { ]); }); + angular.module('copayApp.filters', []); angular.module('copayApp.services', []); angular.module('copayApp.controllers', []); diff --git a/js/controllers/sidebar.js b/js/controllers/sidebar.js index 79b8ad859..92917054f 100644 --- a/js/controllers/sidebar.js +++ b/js/controllers/sidebar.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('SidebarController', - function($scope, $rootScope, $sce, $location, $http, notification, controllerUtils) { + function($scope, $rootScope, $sce, $location, $http, $idle, notification, controllerUtils) { $scope.version = copay.version; $scope.networkName = config.networkName; @@ -82,4 +82,18 @@ angular.module('copayApp.controllers').controller('SidebarController', // Init socket handlers (with no wallet yet) controllerUtils.setSocketHandlers(); + if ($rootScope.wallet) { + $idle.watch(); + + $scope.$on('$idleStart', function(a) { + notification.warning('Timing', 'You were enought time in inactivity. This session will be closed in 10 seconds if continues without activity'); + }); + + $scope.$on('$idleTimeout', function() { + $idle.unwatch(); + $scope.signout(); + notification.warning('Session closed', 'Session closed for a long time of inactivity'); + }); + } + }); diff --git a/js/routes.js b/js/routes.js index 9db46fdc1..192d44609 100644 --- a/js/routes.js +++ b/js/routes.js @@ -65,10 +65,13 @@ angular //Setting HTML5 Location Mode angular .module('copayApp') - .config(function($locationProvider) { + .config(function($locationProvider, $idleProvider) { $locationProvider .html5Mode(false) .hashPrefix('!'); + // IDLE timeout + $idleProvider.idleDuration(15 * 60); // in seconds + $idleProvider.warningDuration(10); // in seconds }) .run(function($rootScope, $location) { $rootScope.$on('$routeChangeStart', function(event, next, current) { From fdabdc64feb5c70c970a88f965fec36f74bbb99b Mon Sep 17 00:00:00 2001 From: Yemel Jardi Date: Thu, 31 Jul 2014 16:13:27 -0300 Subject: [PATCH 2/7] Add a pre-generated address to the shared branch --- js/models/core/HDParams.js | 2 +- js/services/controllerUtils.js | 3 ++- test/mocks/FakeWallet.js | 4 ++++ test/test.PublicKeyRing.js | 14 ++++++++++---- test/test.Wallet.js | 2 +- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/js/models/core/HDParams.js b/js/models/core/HDParams.js index 9c84108b9..6f045e679 100644 --- a/js/models/core/HDParams.js +++ b/js/models/core/HDParams.js @@ -18,7 +18,7 @@ function HDParams(opts) { HDParams.init = function(totalCopayers) { preconditions.shouldBeNumber(totalCopayers); - var ret = [new HDParams()]; + var ret = [new HDParams({receiveIndex: 1})]; for (var i = 0 ; i < totalCopayers ; i++) { ret.push(new HDParams({copayerIndex: i})); } diff --git a/js/services/controllerUtils.js b/js/services/controllerUtils.js index 7bae6bdce..f6f5fb272 100644 --- a/js/services/controllerUtils.js +++ b/js/services/controllerUtils.js @@ -185,13 +185,14 @@ angular.module('copayApp.services') root.updateAddressList = function() { var w = $rootScope.wallet; - if (w) + if (w && w.isReady()) $rootScope.addrInfos = w.getAddressesInfo(); }; root.updateBalance = function(cb) { var w = $rootScope.wallet; if (!w) return root.onErrorDigest(); + if (!w.isReady()) return; $rootScope.balanceByAddr = {}; $rootScope.updatingBalance = true; diff --git a/test/mocks/FakeWallet.js b/test/mocks/FakeWallet.js index 4c043395e..945e584e9 100644 --- a/test/mocks/FakeWallet.js +++ b/test/mocks/FakeWallet.js @@ -46,6 +46,10 @@ FakeWallet.prototype.getAddressesInfo = function() { return ret; }; +FakeWallet.prototype.isReady = function() { + return true; +} + FakeWallet.prototype.getBalance = function(cb) { return cb(null, this.balance, this.balanceByAddr, this.safeBalance); diff --git a/test/test.PublicKeyRing.js b/test/test.PublicKeyRing.js index 088c1f819..41d874676 100644 --- a/test/test.PublicKeyRing.js +++ b/test/test.PublicKeyRing.js @@ -145,9 +145,8 @@ describe('PublicKeyRing model', function() { var k = createW(); var w = k.w; - var a = w.getAddresses(); - a.length.should.equal(0); + a.length.should.equal(1); [true, false].forEach(function(isChange){ for (var i = 0; i < 2; i++) { @@ -156,15 +155,22 @@ describe('PublicKeyRing model', function() { }); var as = w.getAddressesInfo(); - as.length.should.equal(4); + as.length.should.equal(5); // include pre-generated shared one for (var j in as) { var a = as[j]; a.address.isValid().should.equal(true); a.addressStr.should.equal(a.address.toString()); - a.isChange.should.equal([false, false, true, true][j]); + a.isChange.should.equal([false, false, false, true, true][j]); } }); + + it('should start with one shared address', function() { + var k = createW(); + var a = k.w.getAddresses(); + a.length.should.equal(1); + }); + it('should count generation indexes', function() { var k = createW(); var w = k.w; diff --git a/test/test.Wallet.js b/test/test.Wallet.js index 46cc15cd8..04b1626de 100644 --- a/test/test.Wallet.js +++ b/test/test.Wallet.js @@ -594,7 +594,7 @@ describe('Wallet model', function() { it('should get balance', function(done) { - var w = createW(); + var w = createW2(); var spy = sinon.spy(w.blockchain, 'getUnspent'); w.blockchain.fixUnspent([]); w.getBalance(function(err, balance, balanceByAddr, safeBalance) { From 1232b28f0f62cc719ae4d55c65e689bf2efd2ed6 Mon Sep 17 00:00:00 2001 From: Yemel Jardi Date: Thu, 31 Jul 2014 20:39:08 -0300 Subject: [PATCH 3/7] Fix address QR code, now it use proper bitcoin: schema --- views/modals/qr-address.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/modals/qr-address.html b/views/modals/qr-address.html index ca80055e5..c7ff73e31 100644 --- a/views/modals/qr-address.html +++ b/views/modals/qr-address.html @@ -1,5 +1,5 @@
- +

{{address.address}}

From 96116c14fdc2fca5cdbaaaecccfd093e83beb1e2 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Jul 2014 21:58:35 -0300 Subject: [PATCH 4/7] Added invalid message if I paste a wrong wallet secret --- css/main.css | 5 +++++ views/join.html | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/css/main.css b/css/main.css index ff3c5f725..011ef327e 100644 --- a/css/main.css +++ b/css/main.css @@ -258,6 +258,11 @@ a:hover { margin-bottom: 20px; } +.box-setup label small.has-error { + font-size: 11px; + color: #FFA59B; +} + .last-transactions { margin-bottom: 2rem; background-color: #E8EAEF; diff --git a/views/join.html b/views/join.html index 179d89f48..dff6317c2 100644 --- a/views/join.html +++ b/views/join.html @@ -11,7 +11,15 @@

Join a Wallet in Creation

- + + +
  From dbf812f84807babedc23799a03faf49aede1a837 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Thu, 31 Jul 2014 22:49:11 -0300 Subject: [PATCH 5/7] Fix Karma test --- js/controllers/sidebar.js | 5 +---- js/routes.js | 4 +++- karma.conf.js | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/js/controllers/sidebar.js b/js/controllers/sidebar.js index 92917054f..7f4a8128c 100644 --- a/js/controllers/sidebar.js +++ b/js/controllers/sidebar.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('SidebarController', - function($scope, $rootScope, $sce, $location, $http, $idle, notification, controllerUtils) { + function($scope, $rootScope, $sce, $location, $http, notification, controllerUtils) { $scope.version = copay.version; $scope.networkName = config.networkName; @@ -83,14 +83,11 @@ angular.module('copayApp.controllers').controller('SidebarController', controllerUtils.setSocketHandlers(); if ($rootScope.wallet) { - $idle.watch(); - $scope.$on('$idleStart', function(a) { notification.warning('Timing', 'You were enought time in inactivity. This session will be closed in 10 seconds if continues without activity'); }); $scope.$on('$idleTimeout', function() { - $idle.unwatch(); $scope.signout(); notification.warning('Session closed', 'Session closed for a long time of inactivity'); }); diff --git a/js/routes.js b/js/routes.js index 192d44609..00ab8b185 100644 --- a/js/routes.js +++ b/js/routes.js @@ -73,12 +73,14 @@ angular $idleProvider.idleDuration(15 * 60); // in seconds $idleProvider.warningDuration(10); // in seconds }) - .run(function($rootScope, $location) { + .run(function($rootScope, $location, $idle) { + $idle.watch(); $rootScope.$on('$routeChangeStart', function(event, next, current) { if (!util.supports.data) { $location.path('unsupported'); } else { if ((!$rootScope.wallet || !$rootScope.wallet.id) && next.validate) { + $idle.unwatch(); $location.path('/'); } if ($rootScope.wallet && !$rootScope.wallet.isReady()) { diff --git a/karma.conf.js b/karma.conf.js index 8bd9d8e1b..fd2c586fe 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -21,6 +21,7 @@ module.exports = function(config) { 'lib/angular/angular.min.js', 'lib/angular-mocks/angular-mocks.js', 'lib/moment/moment.js', + 'lib/ng-idle/angular-idle.min.js', 'lib/angular-moment/angular-moment.js', 'lib/qrcode-generator/js/qrcode.js', 'lib/angular-qrcode/qrcode.js', From fc71e6a4410b7943011a6feea596899c434e8f55 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 1 Aug 2014 10:44:33 -0300 Subject: [PATCH 6/7] Fixes: typo --- js/controllers/sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/controllers/sidebar.js b/js/controllers/sidebar.js index 7f4a8128c..3062424e9 100644 --- a/js/controllers/sidebar.js +++ b/js/controllers/sidebar.js @@ -89,7 +89,7 @@ angular.module('copayApp.controllers').controller('SidebarController', $scope.$on('$idleTimeout', function() { $scope.signout(); - notification.warning('Session closed', 'Session closed for a long time of inactivity'); + notification.warning('Session closed', 'Session closed because a long time of inactivity'); }); } From d2ae49f9a5e57e64a07a447cba08f30f7ff32b17 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 1 Aug 2014 10:51:26 -0300 Subject: [PATCH 7/7] Fixes: typo --- js/controllers/sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/controllers/sidebar.js b/js/controllers/sidebar.js index 3062424e9..7606483b9 100644 --- a/js/controllers/sidebar.js +++ b/js/controllers/sidebar.js @@ -84,7 +84,7 @@ angular.module('copayApp.controllers').controller('SidebarController', if ($rootScope.wallet) { $scope.$on('$idleStart', function(a) { - notification.warning('Timing', 'You were enought time in inactivity. This session will be closed in 10 seconds if continues without activity'); + notification.warning('Session will be closed', 'Your session is about to expire due to inactivity'); }); $scope.$on('$idleTimeout', function() {