diff --git a/src/angular/components/lock.component.ts b/src/angular/components/lock.component.ts new file mode 100644 index 0000000000..a109cf31b0 --- /dev/null +++ b/src/angular/components/lock.component.ts @@ -0,0 +1,58 @@ +import { Router } from '@angular/router'; + +import { ToasterService } from 'angular2-toaster'; +import { Angulartics2 } from 'angulartics2'; + +import { CryptoService } from '../../abstractions/crypto.service'; +import { I18nService } from '../../abstractions/i18n.service'; +import { MessagingService } from '../../abstractions/messaging.service'; +import { PlatformUtilsService } from '../../abstractions/platformUtils.service'; +import { UserService } from '../../abstractions/user.service'; + +export class LockComponent { + masterPassword: string = ''; + showPassword: boolean = false; + + protected successRoute: string = 'vault'; + + constructor(protected router: Router, protected analytics: Angulartics2, + protected toasterService: ToasterService, protected i18nService: I18nService, + protected platformUtilsService: PlatformUtilsService, protected messagingService: MessagingService, + protected userService: UserService, protected cryptoService: CryptoService) { } + + async submit() { + if (this.masterPassword == null || this.masterPassword === '') { + this.toasterService.popAsync('error', this.i18nService.t('errorOccurred'), + this.i18nService.t('masterPassRequired')); + return; + } + + const email = await this.userService.getEmail(); + const key = this.cryptoService.makeKey(this.masterPassword, email); + const keyHash = await this.cryptoService.hashPassword(this.masterPassword, key); + const storedKeyHash = await this.cryptoService.getKeyHash(); + + if (storedKeyHash != null && keyHash != null && storedKeyHash === keyHash) { + await this.cryptoService.setKey(key); + this.messagingService.send('unlocked'); + this.router.navigate([this.successRoute]); + } else { + this.toasterService.popAsync('error', this.i18nService.t('errorOccurred'), + this.i18nService.t('invalidMasterPassword')); + } + } + + async logOut() { + const confirmed = await this.platformUtilsService.showDialog(this.i18nService.t('logOutConfirmation'), + this.i18nService.t('logOut'), this.i18nService.t('logOut'), this.i18nService.t('cancel')); + if (confirmed) { + this.messagingService.send('logout'); + } + } + + togglePassword() { + this.analytics.eventTrack.next({ action: 'Toggled Master Password on Unlock' }); + this.showPassword = !this.showPassword; + document.getElementById('masterPassword').focus(); + } +} diff --git a/src/angular/components/two-factor.component.ts b/src/angular/components/two-factor.component.ts index 7ab1608e70..799bd5b4b7 100644 --- a/src/angular/components/two-factor.component.ts +++ b/src/angular/components/two-factor.component.ts @@ -38,6 +38,7 @@ export class TwoFactorComponent implements OnInit, OnDestroy { formPromise: Promise; emailPromise: Promise; + protected loginRoute = 'login'; protected successRoute = 'vault'; constructor(protected authService: AuthService, protected router: Router, @@ -51,7 +52,7 @@ export class TwoFactorComponent implements OnInit, OnDestroy { async ngOnInit() { if (this.authService.email == null || this.authService.masterPasswordHash == null || this.authService.twoFactorProviders == null) { - this.router.navigate(['login']); + this.router.navigate([this.loginRoute]); return; }