import { Component } from "@angular/core" ; import { ActivatedRoute , Router } from "@angular/router" ; import { first } from "rxjs/operators" ; import { TwoFactorProviderType } from "jslib-common/enums/twoFactorProviderType" ; import { ApiService } from "jslib-common/abstractions/api.service" ; import { AuthService } from "jslib-common/abstractions/auth.service" ; import { BroadcasterService } from "jslib-common/abstractions/broadcaster.service" ; import { EnvironmentService } from "jslib-common/abstractions/environment.service" ; import { I18nService } from "jslib-common/abstractions/i18n.service" ; import { LogService } from "jslib-common/abstractions/log.service" ; import { MessagingService } from "jslib-common/abstractions/messaging.service" ; import { PlatformUtilsService } from "jslib-common/abstractions/platformUtils.service" ; import { StateService } from "jslib-common/abstractions/state.service" ; import { StorageService } from "jslib-common/abstractions/storage.service" ; import { SyncService } from "jslib-common/abstractions/sync.service" ; import { TwoFactorComponent as BaseTwoFactorComponent } from "jslib-angular/components/two-factor.component" ; import { PopupUtilsService } from "../services/popup-utils.service" ; import { BrowserApi } from "../../browser/browserApi" ; const BroadcasterSubscriptionId = "TwoFactorComponent" ; @ Component ( { selector : "app-two-factor" , templateUrl : "two-factor.component.html" , } ) export class TwoFactorComponent extends BaseTwoFactorComponent { showNewWindowMessage = false ; constructor ( authService , router , i18nService , apiService , platformUtilsService , private syncService , environmentService , private broadcasterService , private popupUtilsService , stateService , storageService , route , private messagingService , logService ) { super ( authService , router , i18nService , apiService , platformUtilsService , window , environmentService , stateService , storageService , route , logService ) ; super . onSuccessfulLogin = ( ) => { return syncService . fullSync ( true ) ; } ; super . successRoute = "/tabs/vault" ; this . webAuthnNewTab = this . platformUtilsService . isFirefox ( ) || this . platformUtilsService . isSafari ( ) ; } async ngOnInit ( ) { if ( this . route . snapshot . paramMap . has ( "webAuthnResponse" ) ) { this . selectedProviderType = TwoFactorProviderType . WebAuthn ; this . token = this . route . snapshot . paramMap . get ( "webAuthnResponse" ) ; super . onSuccessfulLogin = async ( ) => { this . syncService . fullSync ( true ) ; this . messagingService . send ( "reloadPopup" ) ; window . close ( ) ; } ; this . remember = this . route . snapshot . paramMap . get ( "remember" ) === "true" ; await this . doSubmit ( ) ; return ; } await super . ngOnInit ( ) ; if ( this . selectedProviderType == null ) { return ; } if ( this . selectedProviderType === TwoFactorProviderType . WebAuthn && ( await this . isLinux ( ) ) ) { document . body . classList . add ( "linux-webauthn" ) ; } if ( this . selectedProviderType === TwoFactorProviderType . Email && this . popupUtilsService . inPopup ( window ) ) { const confirmed = await this . platformUtilsService . showDialog ( this . i18nService . t ( "popup2faCloseMessage" ) , null , this . i18nService . t ( "yes" ) , this . i18nService . t ( "no" ) ) ; if ( confirmed ) { this . popupUtilsService . popOut ( window ) ; } } this . route . queryParams . pipe ( first ( ) ) . subscribe ( async ( qParams ) => { if ( qParams . sso === "true" ) { super . onSuccessfulLogin = ( ) => { BrowserApi . reloadOpenWindows ( ) ; const thisWindow = window . open ( "" , "_self" ) ; thisWindow . close ( ) ; return this . syncService . fullSync ( true ) ; } ; } } ) ; } async ngOnDestroy ( ) { this . broadcasterService . unsubscribe ( BroadcasterSubscriptionId ) ; if ( this . selectedProviderType === TwoFactorProviderType . WebAuthn && ( await this . isLinux ( ) ) ) { document . body . classList . remove ( "linux-webauthn" ) ; } super . ngOnDestroy ( ) ; } anotherMethod ( ) { this . router . navigate ( [ "2fa-options" ] ) ; } async isLinux ( ) { return ( await BrowserApi . getPlatformInfo ( ) ) . os === "linux" ; } }