From 0219068bb6ed3629c9001fc76f4f65a658d7d0f5 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Tue, 20 Sep 2016 17:47:21 -0400 Subject: [PATCH] password hint --- src/models/api/requestModels.js | 4 +-- src/models/api/responseModels.js | 10 +++--- .../app/accounts/accountsHintController.js | 28 ++++++++++++++++ .../app/accounts/accountsLoginController.js | 2 +- src/popup/app/accounts/accountsModule.js | 2 +- .../app/accounts/views/accountsHint.html | 28 ++++++++++++++++ .../app/accounts/views/accountsLogin.html | 4 +-- src/popup/app/config.js | 9 ++++- src/popup/app/services/servicesModule.js | 2 +- src/popup/app/services/validationService.js | 10 ++---- src/popup/app/settings/settingsController.js | 2 +- src/popup/app/tools/toolsModule.js | 2 +- src/popup/index.html | 1 + src/services/apiService.js | 33 +++++++++++++++++++ 14 files changed, 115 insertions(+), 22 deletions(-) create mode 100644 src/popup/app/accounts/accountsHintController.js create mode 100644 src/popup/app/accounts/views/accountsHint.html diff --git a/src/models/api/requestModels.js b/src/models/api/requestModels.js index f3212c2b73..f74fac6b28 100644 --- a/src/models/api/requestModels.js +++ b/src/models/api/requestModels.js @@ -28,8 +28,8 @@ var RegisterRequest = function () { this.masterPasswordHint = null; }; -var PasswordHintRequest = function () { - this.email = null; +var PasswordHintRequest = function (email) { + this.email = email; }; var TokenTwoFactorRequest = function () { diff --git a/src/models/api/responseModels.js b/src/models/api/responseModels.js index 9d2c01f8f9..a28fa0052c 100644 --- a/src/models/api/responseModels.js +++ b/src/models/api/responseModels.js @@ -1,4 +1,4 @@ -var CipherResponse = function (response) { +var CipherResponse = function (response) { this.id = response.Id; this.folderId = response.FolderId; this.type = response.Type; @@ -24,7 +24,7 @@ var SiteResponse = function (response) { this.favorite = response.Favorite; this.revisionDate = response.RevisionDate; - if(response.Folder) { + if (response.Folder) { this.folder = new FolderResponse(response.Folder); } }; @@ -51,8 +51,10 @@ var ListResponse = function (data) { }; var ErrorResponse = function (response) { - this.message = response.responseJSON.Message; - this.validationErrors = response.responseJSON.ValidationErrors; + if (response.responseJSON) { + this.message = response.responseJSON.Message; + this.validationErrors = response.responseJSON.ValidationErrors; + } this.statusCode = response.status; }; diff --git a/src/popup/app/accounts/accountsHintController.js b/src/popup/app/accounts/accountsHintController.js new file mode 100644 index 0000000000..e2f13ccddf --- /dev/null +++ b/src/popup/app/accounts/accountsHintController.js @@ -0,0 +1,28 @@ +angular + .module('bit.accounts') + + .controller('accountsHintController', function ($scope, $state, apiService, toastr, $q) { + popupUtils.initListSectionItemListeners(); + + $scope.submitPromise = null; + $scope.submit = function (model) { + var request = new PasswordHintRequest(model.email); + $scope.submitPromise = hintPromise(request); + $scope.submitPromise.then(function () { + toastr.success('We\'ve sent you an email with your master password hint.'); + $state.go('login'); + }); + }; + + function hintPromise(request) { + return $q(function (resolve, reject) { + apiService.postPasswordHint(request, + function () { + resolve(); + }, + function (error) { + reject(error); + }); + }); + } + }); diff --git a/src/popup/app/accounts/accountsLoginController.js b/src/popup/app/accounts/accountsLoginController.js index ab570664c0..fcbeaff0c1 100644 --- a/src/popup/app/accounts/accountsLoginController.js +++ b/src/popup/app/accounts/accountsLoginController.js @@ -5,7 +5,7 @@ popupUtils.initListSectionItemListeners(); $scope.loginPromise = null; - $scope.login = function (model, form) { + $scope.login = function (model) { $scope.loginPromise = loginService.logIn(model.email, model.masterPassword); $scope.loginPromise.then(function () { diff --git a/src/popup/app/accounts/accountsModule.js b/src/popup/app/accounts/accountsModule.js index 633e094a53..bfa5fbecb6 100644 --- a/src/popup/app/accounts/accountsModule.js +++ b/src/popup/app/accounts/accountsModule.js @@ -1,2 +1,2 @@ angular - .module('bit.accounts', []); + .module('bit.accounts', ['toastr']); diff --git a/src/popup/app/accounts/views/accountsHint.html b/src/popup/app/accounts/views/accountsHint.html new file mode 100644 index 0000000000..f57a3b250d --- /dev/null +++ b/src/popup/app/accounts/views/accountsHint.html @@ -0,0 +1,28 @@ +
+
+
+ Log In +
+
+ + +
+
Password Hint
+
+
+
+
+
+
+ + + +
+
+ +
+
+
+
diff --git a/src/popup/app/accounts/views/accountsLogin.html b/src/popup/app/accounts/views/accountsLogin.html index 9a7f2b6646..c9582645e3 100644 --- a/src/popup/app/accounts/views/accountsLogin.html +++ b/src/popup/app/accounts/views/accountsLogin.html @@ -1,4 +1,4 @@ -
+
Cancel @@ -27,7 +27,7 @@

- Get master password hint + Get master password hint

diff --git a/src/popup/app/config.js b/src/popup/app/config.js index 415c7e7e4d..0840006873 100644 --- a/src/popup/app/config.js +++ b/src/popup/app/config.js @@ -29,7 +29,7 @@ $urlRouterProvider.otherwise(function ($injector, $location) { var $state = $injector.get('$state'); - $state.go('splash'); + $state.go('home'); }); $stateProvider @@ -55,6 +55,13 @@ data: { authorize: false }, params: { animation: null } }) + .state('hint', { + url: '/hint', + controller: 'accountsHintController', + templateUrl: 'app/accounts/views/accountsHint.html', + data: { authorize: false }, + params: { animation: null } + }) .state('twoFactor', { url: '/two-factor', controller: 'accountsLoginController', diff --git a/src/popup/app/services/servicesModule.js b/src/popup/app/services/servicesModule.js index 961b3c2990..e928537ffd 100644 --- a/src/popup/app/services/servicesModule.js +++ b/src/popup/app/services/servicesModule.js @@ -1,2 +1,2 @@ angular - .module('bit.services', ['angular-jwt', 'oitozero.ngSweetAlert']); + .module('bit.services', ['angular-jwt', 'toastr']); diff --git a/src/popup/app/services/validationService.js b/src/popup/app/services/validationService.js index 662f4a124b..6eaf236543 100644 --- a/src/popup/app/services/validationService.js +++ b/src/popup/app/services/validationService.js @@ -1,7 +1,7 @@ angular .module('bit.services') - .factory('validationService', function (SweetAlert) { + .factory('validationService', function (toastr) { var _service = {}; _service.showError = function (data) { @@ -32,13 +32,7 @@ } if (errors.length) { - SweetAlert.swal({ - title: 'Error', - text: errors[0], - type: 'error', - showCancelButton: false, - confirmButtonText: 'Ok' - }); + toastr.error(errors[0], 'Errors have occurred'); } return errors; diff --git a/src/popup/app/settings/settingsController.js b/src/popup/app/settings/settingsController.js index a40458602d..9a1d7f70d6 100644 --- a/src/popup/app/settings/settingsController.js +++ b/src/popup/app/settings/settingsController.js @@ -19,7 +19,7 @@ }, function (confirmed) { if (confirmed) { loginService.logOut(function () { - $state.go('login'); + $state.go('home'); }); } }); diff --git a/src/popup/app/tools/toolsModule.js b/src/popup/app/tools/toolsModule.js index 1f24a1cae0..65c8e26227 100644 --- a/src/popup/app/tools/toolsModule.js +++ b/src/popup/app/tools/toolsModule.js @@ -1,2 +1,2 @@ angular - .module('bit.tools', ['ngAnimate', 'ngclipboard', 'toastr', 'rzModule']); + .module('bit.tools', ['ngAnimate', 'ngclipboard', 'toastr', 'rzModule', 'oitozero.ngSweetAlert']); diff --git a/src/popup/index.html b/src/popup/index.html index 8ce70e54ca..fe5ea37247 100644 --- a/src/popup/index.html +++ b/src/popup/index.html @@ -52,6 +52,7 @@ + diff --git a/src/services/apiService.js b/src/services/apiService.js index 4b7fe3bc5b..ab5bfced76 100644 --- a/src/services/apiService.js +++ b/src/services/apiService.js @@ -61,6 +61,39 @@ function initApiService() { }); }; + ApiService.prototype.postPasswordHint = function (request, success, error) { + var self = this; + $.ajax({ + type: 'POST', + url: self.baseUrl + '/accounts/password-hint', + data: JSON.stringify(request), + contentType: "application/json; charset=utf-8", + success: function (response) { + success(); + }, + error: function (jqXHR, textStatus, errorThrown) { + handleError(error, jqXHR, textStatus, errorThrown); + } + }); + }; + + ApiService.prototype.register = function (request, success, error) { + var self = this; + $.ajax({ + type: 'POST', + url: self.baseUrl + '/accounts/register', + data: JSON.stringify(request), + contentType: "application/json; charset=utf-8", + dataType: 'json', + success: function (response) { + success(); + }, + error: function (jqXHR, textStatus, errorThrown) { + handleError(error, jqXHR, textStatus, errorThrown); + } + }); + }; + // Site APIs ApiService.prototype.getSite = function (id, success, error) {