2018-02-08 18:24:17 +01:00
|
|
|
import {
|
|
|
|
Component,
|
2018-02-08 21:58:47 +01:00
|
|
|
NgZone,
|
2022-08-09 21:11:51 +02:00
|
|
|
OnDestroy,
|
2018-02-08 18:24:17 +01:00
|
|
|
OnInit,
|
2018-10-03 15:42:11 +02:00
|
|
|
SecurityContext,
|
2018-02-18 04:37:43 +01:00
|
|
|
Type,
|
2018-02-10 05:41:29 +01:00
|
|
|
ViewChild,
|
2021-02-22 19:25:57 +01:00
|
|
|
ViewContainerRef,
|
2018-02-08 18:24:17 +01:00
|
|
|
} from "@angular/core";
|
2018-10-03 15:42:11 +02:00
|
|
|
import { DomSanitizer } from "@angular/platform-browser";
|
2018-02-08 18:24:17 +01:00
|
|
|
import { Router } from "@angular/router";
|
2021-12-07 20:42:31 +01:00
|
|
|
import { IndividualConfig, ToastrService } from "ngx-toastr";
|
2022-11-01 11:25:46 +01:00
|
|
|
import { firstValueFrom, Subject, takeUntil } from "rxjs";
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2022-06-14 17:10:53 +02:00
|
|
|
import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref";
|
2023-05-02 18:46:03 +02:00
|
|
|
import { DialogServiceAbstraction, SimpleDialogType } from "@bitwarden/angular/services/dialog";
|
2022-06-14 17:10:53 +02:00
|
|
|
import { ModalService } from "@bitwarden/angular/services/modal.service";
|
|
|
|
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
|
2023-04-26 16:30:39 +02:00
|
|
|
import { ConfigServiceAbstraction } from "@bitwarden/common/abstractions/config/config.service.abstraction";
|
2022-06-14 17:10:53 +02:00
|
|
|
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
|
2022-12-06 14:47:42 +01:00
|
|
|
import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
|
2022-06-14 17:10:53 +02:00
|
|
|
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
|
|
|
|
import { LogService } from "@bitwarden/common/abstractions/log.service";
|
|
|
|
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
|
|
|
|
import { NotificationsService } from "@bitwarden/common/abstractions/notifications.service";
|
|
|
|
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
|
|
|
|
import { SearchService } from "@bitwarden/common/abstractions/search.service";
|
|
|
|
import { SettingsService } from "@bitwarden/common/abstractions/settings.service";
|
|
|
|
import { StateService } from "@bitwarden/common/abstractions/state.service";
|
|
|
|
import { SystemService } from "@bitwarden/common/abstractions/system.service";
|
2022-08-30 16:11:19 +02:00
|
|
|
import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service";
|
2022-08-30 22:30:43 +02:00
|
|
|
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service";
|
[AC-1011] Admin Console / Billing code ownership (#4973)
* refactor: move SCIM component to admin-console, refs EC-1011
* refactor: move scimProviderType to admin-console, refs EC-1011
* refactor: move scim-config.api to admin-console, refs EC-1011
* refactor: create models folder and nest existing api contents, refs EC-1011
* refactor: move scim-config to admin-console models, refs EC-1011
* refactor: move billing.component to billing, refs EC-1011
* refactor: remove nested app folder from new billing structure, refs EC-1011
* refactor: move organizations/billing to billing, refs EC-1011
* refactor: move add-credit and adjust-payment to billing/settings, refs EC-1011
* refactor: billing history/sync to billing, refs EC-1011
* refactor: move org plans, payment/method to billing/settings, refs EC-1011
* fix: update legacy file paths for payment-method and tax-info, refs EC-1011
* fix: update imports for scim component, refs EC-1011
* refactor: move subscription and tax-info into billing, refs EC-1011
* refactor: move user-subscription to billing, refs EC-1011
* refactor: move images/cards to billing and update base path, refs EC-1011
* refactor: move payment-method, plan subscription, and plan to billing, refs EC-1011
* refactor: move transaction-type to billing, refs EC-1011
* refactor: move billing-sync-config to billing, refs EC-1011
* refactor: move billing-sync and bit-pay-invoice request to billing, refs EC-1011
* refactor: move org subscription and tax info update requests to billing, refs EC-1011
* fix: broken paths to billing, refs EC-1011
* refactor: move payment request to billing, refs EC-1011
* fix: update remaining imports for payment-request, refs EC-1011
* refactor: move tax-info-update to billing, refs EC-1011
* refactor: move billing-payment, billing-history, and billing responses to billing, refs EC-1011
* refactor: move organization-subscription-responset to billing, refs EC-1011
* refactor: move payment and plan responses to billing, refs EC-1011
* refactor: move subscription response to billing ,refs EC-1011
* refactor: move tax info and rate responses to billing, refs EC-1011
* fix: update remaining path to base response for tax-rate response, refs EC-1011
* refactor: (browser) move organization-service to admin-console, refs EC-1011
* refactor: (browser) move organizaiton-service to admin-console, refs EC-1011
* refactor: (cli) move share command to admin-console, refs EC-1011
* refactor: move organization-collect request model to admin-console, refs EC-1011
* refactor: (web) move organization, collection/user responses to admin-console, refs EC-1011
* refactor: (cli) move selection-read-only to admin-console, refs EC-1011
* refactor: (desktop) move organization-filter to admin-console, refs EC-1011
* refactor: (web) move organization-switcher to admin-console, refs EC-1011
* refactor: (web) move access-selector to admin-console, refs EC-1011
* refactor: (web) move create folder to admin-console, refs EC-1011
* refactor: (web) move org guards folder to admin-console, refs EC-1011
* refactor: (web) move org layout to admin-console, refs EC-1011
* refactor: move manage collections to admin console, refs EC-1011
* refactor: (web) move collection-dialog to admin-console, refs EC-1011
* refactor: (web) move entity users/events and events component to admin-console, refs EC-1011
* refactor: (web) move groups/group-add-edit to admin-console, refs EC-1011
* refactor: (web) move manage, org-manage module, and user-confirm to admin-console, refs EC-1011
* refactor: (web) move people to admin-console, refs EC-1011
* refactor: (web) move reset-password to admin-console, refs EC-1011
* refactor: (web) move organization-routing and module to admin-console, refs EC-1011
* refactor: move admin-console and billing within app scope, refs EC-1011
* fix: update leftover merge conflicts, refs EC-1011
* refactor: (web) member-dialog to admin-console, refs EC-1011
* refactor: (web) move policies to admin-console, refs EC-1011
* refactor: (web) move reporting to admin-console, refs EC-1011
* refactor: (web) move settings to admin-console, refs EC-1011
* refactor: (web) move sponsorships to admin-console, refs EC-1011
* refactor: (web) move tools to admin-console, refs EC-1011
* refactor: (web) move users to admin-console, refs EC-1011
* refactor: (web) move collections to admin-console, refs EC-1011
* refactor: (web) move create-organization to admin-console, refs EC-1011
* refactor: (web) move licensed components to admin-console, refs EC-1011
* refactor: (web) move bit organization modules to admin-console, refs EC-1011
* fix: update leftover import statements for organizations.module, refs EC-1011
* refactor: (web) move personal vault and max timeout to admin-console, refs EC-1011
* refactor: (web) move providers to admin-console, refs EC-1011
* refactor: (libs) move organization service to admin-console, refs EC-1011
* refactor: (libs) move profile org/provider responses and other misc org responses to admin-console, refs EC-1011
* refactor: (libs) move provider request and selectionion-read-only request to admin-console, refs EC-1011
* fix: update missed import path for provider-user-update request, refs EC-1011
* refactor: (libs) move abstractions to admin-console, refs EC-1011
* refactor: (libs) move org/provider enums to admin-console, refs EC-1011
* fix: update downstream import statements from libs changes, refs EC-1011
* refactor: (libs) move data files to admin-console, refs EC-1011
* refactor: (libs) move domain to admin-console, refs EC-1011
* refactor: (libs) move request objects to admin-console, refs EC-1011
* fix: update downstream import changes from libs, refs EC-1011
* refactor: move leftover provider files to admin-console, refs EC-1011
* refactor: (browser) move group policy environment to admin-console, refs EC-1011
* fix: (browser) update downstream import statements, refs EC-1011
* fix: (desktop) update downstream libs moves, refs EC-1011
* fix: (cli) update downstream import changes from libs, refs EC-1011
* refactor: move org-auth related files to admin-console, refs EC-1011
* refactor: (libs) move request objects to admin-console, refs EC-1011
* refactor: move persmissions to admin-console, refs EC-1011
* refactor: move sponsored families to admin-console and fix libs changes, refs EC-1011
* refactor: move collections to admin-console, refs EC-1011
* refactor: move spec file back to spec scope, refs EC-1011
* fix: update downstream imports due to libs changes, refs EC-1011
* fix: udpate downstream import changes due to libs, refs EC-1011
* fix: update downstream imports due to libs changes, refs EC-1011
* fix: update downstream imports from libs changes, refs EC-1011
* fix: update path malformation in jslib-services.module, refs EC-1011
* fix: lint errors from improper casing, refs AC-1011
* fix: update downstream filename changes, refs AC-1011
* fix: (cli) update downstream filename changes, refs AC-1011
* fix: (desktop) update downstream filename changes, refs AC-1011
* fix: (browser) update downstream filename changes, refs AC-1011
* fix: lint errors, refs AC-1011
* fix: prettier, refs AC-1011
* fix: lint fixes for import order, refs AC-1011
* fix: update import path for provider user type, refs AC-1011
* fix: update new codes import paths for admin console structure, refs AC-1011
* fix: lint/prettier, refs AC-1011
* fix: update layout stories path, refs AC-1011
* fix: update comoponents card icons base variable in styles, refs AC-1011
* fix: update provider service path in permissions guard spec, refs AC-1011
* fix: update provider permission guard path, refs AC-1011
* fix: remove unecessary TODO for shared index export statement, refs AC-1011
* refactor: move browser-organization service and cli organization-user response out of admin-console, refs AC-1011
* refactor: move web/browser/desktop collections component to vault domain, refs AC-1011
* refactor: move organization.module out of admin-console scope, refs AC-1011
* fix: prettier, refs AC-1011
* refactor: move organizations-api-key.request out of admin-console scope, refs AC-1011
2023-03-22 16:03:50 +01:00
|
|
|
import { CollectionService } from "@bitwarden/common/admin-console/abstractions/collection.service";
|
|
|
|
import { InternalPolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
|
2023-02-06 22:53:37 +01:00
|
|
|
import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
|
|
|
|
import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service";
|
|
|
|
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
|
2023-04-17 16:35:37 +02:00
|
|
|
import { ForceResetPasswordReason } from "@bitwarden/common/auth/models/domain/force-reset-password-reason";
|
2023-03-10 21:39:46 +01:00
|
|
|
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
|
2023-01-31 22:08:37 +01:00
|
|
|
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
|
|
|
import { InternalFolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction";
|
|
|
|
import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction";
|
|
|
|
import { CipherType } from "@bitwarden/common/vault/enums/cipher-type";
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2023-02-06 22:53:37 +01:00
|
|
|
import { DeleteAccountComponent } from "../auth/delete-account.component";
|
|
|
|
import { LoginApprovalComponent } from "../auth/login/login-approval.component";
|
2022-04-05 16:54:44 +02:00
|
|
|
import { MenuUpdateRequest } from "../main/menu/menu.updater";
|
2023-01-31 22:08:37 +01:00
|
|
|
import { PremiumComponent } from "../vault/app/accounts/premium.component";
|
|
|
|
import { FolderAddEditComponent } from "../vault/app/vault/folder-add-edit.component";
|
2022-02-24 20:50:19 +01:00
|
|
|
|
|
|
|
import { SettingsComponent } from "./accounts/settings.component";
|
2023-04-19 11:30:46 +02:00
|
|
|
import { ExportComponent } from "./tools/export/export.component";
|
2023-03-10 21:39:46 +01:00
|
|
|
import { GeneratorComponent } from "./tools/generator.component";
|
|
|
|
import { PasswordGeneratorHistoryComponent } from "./tools/password-generator-history.component";
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2018-02-10 21:22:07 +01:00
|
|
|
const BroadcasterSubscriptionId = "AppComponent";
|
2018-08-24 21:30:26 +02:00
|
|
|
const IdleTimeout = 60000 * 10; // 10 minutes
|
2021-02-22 19:17:02 +01:00
|
|
|
const SyncInterval = 6 * 60 * 60 * 1000; // 6 hours
|
2018-02-10 21:22:07 +01:00
|
|
|
|
2022-02-01 17:31:30 +01:00
|
|
|
const systemTimeoutOptions = {
|
|
|
|
onLock: -2,
|
|
|
|
onSuspend: -3,
|
|
|
|
onIdle: -4,
|
|
|
|
};
|
|
|
|
|
2018-01-16 20:48:34 +01:00
|
|
|
@Component({
|
2018-01-16 21:58:17 +01:00
|
|
|
selector: "app-root",
|
|
|
|
styles: [],
|
2022-01-12 15:23:00 +01:00
|
|
|
template: `
|
|
|
|
<ng-template #settings></ng-template>
|
2018-02-16 21:03:29 +01:00
|
|
|
<ng-template #premium></ng-template>
|
2018-02-18 04:37:43 +01:00
|
|
|
<ng-template #passwordHistory></ng-template>
|
2021-02-22 19:17:02 +01:00
|
|
|
<ng-template #appFolderAddEdit></ng-template>
|
|
|
|
<ng-template #exportVault></ng-template>
|
2022-04-01 00:49:53 +02:00
|
|
|
<ng-template #appGenerator></ng-template>
|
2023-02-05 16:57:21 +01:00
|
|
|
<ng-template #loginApproval></ng-template>
|
2021-12-15 23:32:00 +01:00
|
|
|
<app-header></app-header>
|
2022-01-12 15:23:00 +01:00
|
|
|
<div id="container">
|
|
|
|
<div class="loading" *ngIf="loading">
|
2022-01-27 18:21:53 +01:00
|
|
|
<i class="bwi bwi-spinner bwi-spin bwi-3x" aria-hidden="true"></i>
|
2022-01-12 15:23:00 +01:00
|
|
|
</div>
|
|
|
|
<router-outlet *ngIf="!loading"></router-outlet>
|
|
|
|
</div>
|
|
|
|
`,
|
2018-01-16 20:48:34 +01:00
|
|
|
})
|
2022-08-09 21:11:51 +02:00
|
|
|
export class AppComponent implements OnInit, OnDestroy {
|
2020-08-18 22:13:15 +02:00
|
|
|
@ViewChild("settings", { read: ViewContainerRef, static: true }) settingsRef: ViewContainerRef;
|
|
|
|
@ViewChild("premium", { read: ViewContainerRef, static: true }) premiumRef: ViewContainerRef;
|
|
|
|
@ViewChild("passwordHistory", { read: ViewContainerRef, static: true })
|
|
|
|
passwordHistoryRef: ViewContainerRef;
|
2021-02-22 19:17:02 +01:00
|
|
|
@ViewChild("exportVault", { read: ViewContainerRef, static: true })
|
|
|
|
exportVaultModalRef: ViewContainerRef;
|
2021-02-22 19:25:57 +01:00
|
|
|
@ViewChild("appFolderAddEdit", { read: ViewContainerRef, static: true })
|
|
|
|
folderAddEditModalRef: ViewContainerRef;
|
2022-04-01 00:49:53 +02:00
|
|
|
@ViewChild("appGenerator", { read: ViewContainerRef, static: true })
|
|
|
|
generatorModalRef: ViewContainerRef;
|
2023-02-05 16:57:21 +01:00
|
|
|
@ViewChild("loginApproval", { read: ViewContainerRef, static: true })
|
|
|
|
loginApprovalModalRef: ViewContainerRef;
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2022-01-12 15:23:00 +01:00
|
|
|
loading = false;
|
|
|
|
|
2018-02-10 05:25:18 +01:00
|
|
|
private lastActivity: number = null;
|
2021-08-27 15:30:44 +02:00
|
|
|
private modal: ModalRef = null;
|
2018-08-24 21:30:26 +02:00
|
|
|
private idleTimer: number = null;
|
|
|
|
private isIdle = false;
|
2022-02-02 16:28:36 +01:00
|
|
|
private activeUserId: string = null;
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2022-08-26 18:09:28 +02:00
|
|
|
private destroy$ = new Subject<void>();
|
2022-06-23 15:38:12 +02:00
|
|
|
|
2021-12-15 23:32:00 +01:00
|
|
|
constructor(
|
|
|
|
private broadcasterService: BroadcasterService,
|
2022-07-08 15:40:31 +02:00
|
|
|
private folderService: InternalFolderService,
|
2018-02-08 18:24:17 +01:00
|
|
|
private settingsService: SettingsService,
|
2018-08-13 20:09:22 +02:00
|
|
|
private syncService: SyncService,
|
2023-03-10 21:39:46 +01:00
|
|
|
private passwordGenerationService: PasswordGenerationServiceAbstraction,
|
2019-07-02 14:18:42 +02:00
|
|
|
private cipherService: CipherService,
|
|
|
|
private authService: AuthService,
|
2020-04-01 17:18:36 +02:00
|
|
|
private router: Router,
|
2021-11-09 19:00:01 +01:00
|
|
|
private toastrService: ToastrService,
|
2021-12-07 20:42:31 +01:00
|
|
|
private i18nService: I18nService,
|
2018-02-08 18:24:17 +01:00
|
|
|
private sanitizer: DomSanitizer,
|
2018-04-12 20:38:41 +02:00
|
|
|
private ngZone: NgZone,
|
|
|
|
private vaultTimeoutService: VaultTimeoutService,
|
2022-08-30 22:30:43 +02:00
|
|
|
private vaultTimeoutSettingsService: VaultTimeoutSettingsService,
|
2018-02-14 06:26:32 +01:00
|
|
|
private cryptoService: CryptoService,
|
2021-10-21 11:10:36 +02:00
|
|
|
private logService: LogService,
|
2018-02-14 06:26:32 +01:00
|
|
|
private messagingService: MessagingService,
|
2018-08-24 21:30:26 +02:00
|
|
|
private collectionService: CollectionService,
|
2019-02-27 17:29:31 +01:00
|
|
|
private searchService: SearchService,
|
2019-02-25 21:07:44 +01:00
|
|
|
private notificationsService: NotificationsService,
|
2018-02-08 18:24:17 +01:00
|
|
|
private platformUtilsService: PlatformUtilsService,
|
2020-04-01 17:18:36 +02:00
|
|
|
private systemService: SystemService,
|
|
|
|
private stateService: StateService,
|
2022-12-06 14:47:42 +01:00
|
|
|
private eventUploadService: EventUploadService,
|
2022-08-08 11:04:36 +02:00
|
|
|
private policyService: InternalPolicyService,
|
2019-02-25 21:07:44 +01:00
|
|
|
private modalService: ModalService,
|
2023-04-26 16:30:39 +02:00
|
|
|
private keyConnectorService: KeyConnectorService,
|
2023-05-02 18:46:03 +02:00
|
|
|
private configService: ConfigServiceAbstraction,
|
|
|
|
private dialogService: DialogServiceAbstraction
|
2021-12-20 15:47:17 +01:00
|
|
|
) {}
|
|
|
|
|
2018-02-08 18:24:17 +01:00
|
|
|
ngOnInit() {
|
2022-08-09 21:11:51 +02:00
|
|
|
this.stateService.activeAccount$.pipe(takeUntil(this.destroy$)).subscribe((userId) => {
|
2022-02-02 16:28:36 +01:00
|
|
|
this.activeUserId = userId;
|
2022-01-19 17:00:28 +01:00
|
|
|
});
|
2022-06-23 15:38:12 +02:00
|
|
|
|
2019-02-25 21:07:44 +01:00
|
|
|
this.ngZone.runOutsideAngular(() => {
|
2021-12-15 23:32:00 +01:00
|
|
|
setTimeout(async () => {
|
|
|
|
await this.updateAppMenu();
|
2019-02-27 17:29:31 +01:00
|
|
|
}, 1000);
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2022-02-02 16:28:36 +01:00
|
|
|
window.ontouchstart = () => this.recordActivity();
|
|
|
|
window.onmousedown = () => this.recordActivity();
|
|
|
|
window.onscroll = () => this.recordActivity();
|
|
|
|
window.onkeypress = () => this.recordActivity();
|
2021-12-15 23:32:00 +01:00
|
|
|
});
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2023-05-17 12:27:27 +02:00
|
|
|
/// ############ DEPRECATED ############
|
|
|
|
/// Please do not use the AppComponent to send events between services.
|
|
|
|
///
|
|
|
|
/// Services that depends on other services, should do so through Dependency Injection
|
|
|
|
/// and subscribe to events through that service observable.
|
|
|
|
///
|
2021-12-15 23:32:00 +01:00
|
|
|
this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => {
|
|
|
|
this.ngZone.run(async () => {
|
|
|
|
switch (message.command) {
|
|
|
|
case "loggedIn":
|
|
|
|
case "unlocked":
|
2023-03-10 21:32:26 +01:00
|
|
|
this.recordActivity();
|
2021-12-15 23:32:00 +01:00
|
|
|
this.notificationsService.updateConnection();
|
|
|
|
this.updateAppMenu();
|
|
|
|
this.systemService.cancelProcessReload();
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-12-15 23:32:00 +01:00
|
|
|
case "loggedOut":
|
2022-07-29 21:49:58 +02:00
|
|
|
this.modalService.closeAll();
|
2018-08-24 21:30:26 +02:00
|
|
|
this.notificationsService.updateConnection();
|
2019-02-27 17:56:30 +01:00
|
|
|
this.updateAppMenu();
|
2021-08-27 15:30:44 +02:00
|
|
|
await this.systemService.clearPendingClipboard();
|
2022-08-05 20:04:27 +02:00
|
|
|
await this.systemService.startProcessReload(this.authService);
|
2018-02-10 05:41:29 +01:00
|
|
|
break;
|
2019-04-18 16:06:33 +02:00
|
|
|
case "authBlocked":
|
|
|
|
this.router.navigate(["login"]);
|
2018-02-16 21:03:29 +01:00
|
|
|
break;
|
|
|
|
case "logout":
|
2022-02-09 18:42:16 +01:00
|
|
|
this.loading = message.userId == null || message.userId === this.activeUserId;
|
2021-08-27 15:30:44 +02:00
|
|
|
await this.logOut(!!message.expired, message.userId);
|
2022-01-19 17:00:28 +01:00
|
|
|
this.loading = false;
|
2018-02-18 04:37:43 +01:00
|
|
|
break;
|
2018-11-16 16:34:31 +01:00
|
|
|
case "lockVault":
|
2022-08-26 05:04:54 +02:00
|
|
|
await this.vaultTimeoutService.lock(message.userId);
|
2021-12-15 23:32:00 +01:00
|
|
|
break;
|
2023-04-20 19:46:03 +02:00
|
|
|
case "lockAllVaults": {
|
|
|
|
const currentUser = await this.stateService.getUserId();
|
|
|
|
const accounts = await firstValueFrom(this.stateService.accounts$);
|
|
|
|
await this.vaultTimeoutService.lock(currentUser);
|
|
|
|
Promise.all(
|
|
|
|
Object.keys(accounts)
|
|
|
|
.filter((u) => u !== currentUser)
|
|
|
|
.map((u) => this.vaultTimeoutService.lock(u))
|
|
|
|
);
|
2018-11-16 16:34:31 +01:00
|
|
|
break;
|
2023-04-20 19:46:03 +02:00
|
|
|
}
|
2018-02-18 04:37:43 +01:00
|
|
|
case "locked":
|
2022-07-29 21:49:58 +02:00
|
|
|
this.modalService.closeAll();
|
2019-05-30 15:37:06 +02:00
|
|
|
if (
|
|
|
|
message.userId == null ||
|
|
|
|
message.userId === (await this.stateService.getUserId())
|
2020-08-21 15:50:36 +02:00
|
|
|
) {
|
2022-01-12 15:23:00 +01:00
|
|
|
await this.router.navigate(["lock"]);
|
2021-02-18 19:03:20 +01:00
|
|
|
}
|
2021-04-07 04:47:50 +02:00
|
|
|
this.notificationsService.updateConnection();
|
2022-01-12 15:23:00 +01:00
|
|
|
await this.updateAppMenu();
|
|
|
|
await this.systemService.clearPendingClipboard();
|
2022-08-05 20:04:27 +02:00
|
|
|
await this.systemService.startProcessReload(this.authService);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2023-03-10 21:32:26 +01:00
|
|
|
case "startProcessReload":
|
|
|
|
this.systemService.startProcessReload(this.authService);
|
|
|
|
break;
|
|
|
|
case "cancelProcessReload":
|
|
|
|
this.systemService.cancelProcessReload();
|
|
|
|
break;
|
2019-02-25 21:07:44 +01:00
|
|
|
case "reloadProcess":
|
2022-07-26 14:48:11 +02:00
|
|
|
(window.location as any).reload(true);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-04-07 04:47:50 +02:00
|
|
|
case "syncStarted":
|
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "syncCompleted":
|
|
|
|
await this.updateAppMenu();
|
2023-04-26 16:30:39 +02:00
|
|
|
await this.configService.fetchServerConfig();
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-12-07 20:42:31 +01:00
|
|
|
case "openSettings":
|
|
|
|
await this.openModal<SettingsComponent>(SettingsComponent, this.settingsRef);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-12-07 20:42:31 +01:00
|
|
|
case "openPremium":
|
|
|
|
await this.openModal<PremiumComponent>(PremiumComponent, this.premiumRef);
|
2021-02-22 19:17:02 +01:00
|
|
|
break;
|
2022-02-24 20:50:19 +01:00
|
|
|
case "showFingerprintPhrase": {
|
2021-02-22 19:17:02 +01:00
|
|
|
const fingerprint = await this.cryptoService.getFingerprint(
|
|
|
|
await this.stateService.getUserId()
|
|
|
|
);
|
2023-05-02 18:46:03 +02:00
|
|
|
const result = await this.dialogService.openSimpleDialog({
|
|
|
|
title: { key: "fingerprintPhrase" },
|
|
|
|
content:
|
|
|
|
this.i18nService.t("yourAccountsFingerprint") + ":\n" + fingerprint.join("-"),
|
|
|
|
acceptButtonText: { key: "learnMore" },
|
|
|
|
cancelButtonText: { key: "close" },
|
|
|
|
type: SimpleDialogType.INFO,
|
|
|
|
});
|
|
|
|
|
2021-02-22 19:17:02 +01:00
|
|
|
if (result) {
|
2022-02-09 01:02:17 +01:00
|
|
|
this.platformUtilsService.launchUri("https://bitwarden.com/help/fingerprint-phrase/");
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2021-02-22 19:17:02 +01:00
|
|
|
break;
|
2022-02-24 20:50:19 +01:00
|
|
|
}
|
2022-07-29 21:49:58 +02:00
|
|
|
case "deleteAccount":
|
|
|
|
this.modalService.open(DeleteAccountComponent, { replaceTopModal: true });
|
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "openPasswordHistory":
|
|
|
|
await this.openModal<PasswordGeneratorHistoryComponent>(
|
|
|
|
PasswordGeneratorHistoryComponent,
|
|
|
|
this.passwordHistoryRef
|
2021-12-20 15:47:17 +01:00
|
|
|
);
|
|
|
|
break;
|
2018-10-03 15:42:11 +02:00
|
|
|
case "showToast":
|
2021-02-22 19:17:02 +01:00
|
|
|
this.showToast(message);
|
|
|
|
break;
|
2021-11-09 19:00:01 +01:00
|
|
|
case "copiedToClipboard":
|
2019-05-30 15:37:06 +02:00
|
|
|
if (!message.clearing) {
|
2021-11-19 13:55:31 +01:00
|
|
|
this.systemService.clearClipboard(message.clipboardValue, message.clearMs);
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2021-11-19 13:55:31 +01:00
|
|
|
break;
|
|
|
|
case "ssoCallback":
|
2021-11-09 19:00:01 +01:00
|
|
|
this.router.navigate(["sso"], {
|
2018-02-08 21:58:47 +01:00
|
|
|
queryParams: { code: message.code, state: message.state },
|
|
|
|
});
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2022-02-24 20:50:19 +01:00
|
|
|
case "premiumRequired": {
|
2023-05-02 18:46:03 +02:00
|
|
|
const premiumConfirmed = await this.dialogService.openSimpleDialog({
|
|
|
|
title: { key: "premiumRequired" },
|
|
|
|
content: { key: "premiumRequiredDesc" },
|
|
|
|
acceptButtonText: { key: "learnMore" },
|
|
|
|
type: SimpleDialogType.SUCCESS,
|
|
|
|
});
|
2018-02-10 21:22:07 +01:00
|
|
|
if (premiumConfirmed) {
|
|
|
|
await this.openModal<PremiumComponent>(PremiumComponent, this.premiumRef);
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-02-10 21:22:07 +01:00
|
|
|
break;
|
2022-02-24 20:50:19 +01:00
|
|
|
}
|
|
|
|
case "emailVerificationRequired": {
|
2023-05-02 18:46:03 +02:00
|
|
|
const emailVerificationConfirmed = await this.dialogService.openSimpleDialog({
|
|
|
|
title: { key: "emailVerificationRequired" },
|
|
|
|
content: { key: "emailVerificationRequiredDesc" },
|
|
|
|
acceptButtonText: { key: "learnMore" },
|
|
|
|
type: SimpleDialogType.INFO,
|
|
|
|
});
|
2018-02-10 21:22:07 +01:00
|
|
|
if (emailVerificationConfirmed) {
|
2021-02-22 19:17:02 +01:00
|
|
|
this.platformUtilsService.launchUri(
|
2022-02-09 01:02:17 +01:00
|
|
|
"https://bitwarden.com/help/create-bitwarden-account/"
|
2021-12-20 15:47:17 +01:00
|
|
|
);
|
|
|
|
}
|
2018-02-10 21:22:07 +01:00
|
|
|
break;
|
2022-02-24 20:50:19 +01:00
|
|
|
}
|
2021-02-22 19:17:02 +01:00
|
|
|
case "syncVault":
|
2021-12-20 15:47:17 +01:00
|
|
|
try {
|
2021-02-22 19:17:02 +01:00
|
|
|
await this.syncService.fullSync(true, true);
|
2018-02-10 21:22:07 +01:00
|
|
|
this.platformUtilsService.showToast(
|
|
|
|
"success",
|
2021-12-20 15:47:17 +01:00
|
|
|
null,
|
2018-02-10 21:22:07 +01:00
|
|
|
this.i18nService.t("syncingComplete")
|
2021-12-20 15:47:17 +01:00
|
|
|
);
|
2021-10-21 11:10:36 +02:00
|
|
|
} catch {
|
2018-02-10 21:22:07 +01:00
|
|
|
this.platformUtilsService.showToast(
|
|
|
|
"error",
|
2021-12-20 15:47:17 +01:00
|
|
|
null,
|
2021-12-07 20:42:31 +01:00
|
|
|
this.i18nService.t("syncingFailed")
|
2021-12-20 15:47:17 +01:00
|
|
|
);
|
2018-02-10 21:22:07 +01:00
|
|
|
}
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "checkSyncVault":
|
2021-12-20 15:47:17 +01:00
|
|
|
try {
|
2021-12-15 23:32:00 +01:00
|
|
|
const lastSync = await this.syncService.getLastSync();
|
2021-02-22 19:17:02 +01:00
|
|
|
let lastSyncAgo = SyncInterval + 1;
|
|
|
|
if (lastSync != null) {
|
|
|
|
lastSyncAgo = new Date().getTime() - lastSync.getTime();
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
|
|
|
|
2021-02-22 19:17:02 +01:00
|
|
|
if (lastSyncAgo >= SyncInterval) {
|
|
|
|
await this.syncService.fullSync(false);
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2021-10-21 11:10:36 +02:00
|
|
|
} catch (e) {
|
2021-08-27 15:30:44 +02:00
|
|
|
this.logService.error(e);
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2021-12-15 23:32:00 +01:00
|
|
|
this.messagingService.send("scheduleNextSync");
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "exportVault":
|
|
|
|
await this.openExportVault();
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "newLogin":
|
|
|
|
this.routeToVault("add", CipherType.Login);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "newCard":
|
|
|
|
this.routeToVault("add", CipherType.Card);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "newIdentity":
|
|
|
|
this.routeToVault("add", CipherType.Identity);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "newSecureNote":
|
|
|
|
this.routeToVault("add", CipherType.SecureNote);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
case "newFolder":
|
2021-02-22 19:17:02 +01:00
|
|
|
await this.addFolder();
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2022-03-29 21:01:57 +02:00
|
|
|
case "openGenerator":
|
|
|
|
// openGenerator has extended functionality if called in the vault
|
2021-02-22 19:17:02 +01:00
|
|
|
if (!this.router.url.includes("vault")) {
|
2022-03-29 21:01:57 +02:00
|
|
|
await this.openGenerator();
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
case "convertAccountToKeyConnector":
|
|
|
|
this.router.navigate(["/remove-password"]);
|
2021-12-20 15:47:17 +01:00
|
|
|
break;
|
2022-02-24 20:50:19 +01:00
|
|
|
case "switchAccount": {
|
2022-01-12 15:23:00 +01:00
|
|
|
if (message.userId != null) {
|
|
|
|
await this.stateService.setActiveUser(message.userId);
|
|
|
|
}
|
2022-04-30 01:16:46 +02:00
|
|
|
const locked =
|
|
|
|
(await this.authService.getAuthStatus(message.userId)) ===
|
|
|
|
AuthenticationStatus.Locked;
|
2023-04-17 16:35:37 +02:00
|
|
|
const forcedPasswordReset =
|
|
|
|
(await this.stateService.getForcePasswordResetReason({ userId: message.userId })) !=
|
|
|
|
ForceResetPasswordReason.None;
|
2022-01-12 15:23:00 +01:00
|
|
|
if (locked) {
|
|
|
|
this.messagingService.send("locked", { userId: message.userId });
|
2023-04-17 16:35:37 +02:00
|
|
|
} else if (forcedPasswordReset) {
|
|
|
|
this.router.navigate(["update-temp-password"]);
|
2022-01-12 15:23:00 +01:00
|
|
|
} else {
|
|
|
|
this.messagingService.send("unlocked");
|
|
|
|
this.loading = true;
|
|
|
|
await this.syncService.fullSync(true);
|
|
|
|
this.loading = false;
|
|
|
|
this.router.navigate(["vault"]);
|
|
|
|
}
|
|
|
|
break;
|
2022-02-24 20:50:19 +01:00
|
|
|
}
|
2022-02-01 17:31:30 +01:00
|
|
|
case "systemSuspended":
|
|
|
|
await this.checkForSystemTimeout(systemTimeoutOptions.onSuspend);
|
2022-02-24 20:50:19 +01:00
|
|
|
break;
|
2022-02-01 17:31:30 +01:00
|
|
|
case "systemLocked":
|
|
|
|
await this.checkForSystemTimeout(systemTimeoutOptions.onLock);
|
2022-02-24 20:50:19 +01:00
|
|
|
break;
|
2022-02-01 17:31:30 +01:00
|
|
|
case "systemIdle":
|
|
|
|
await this.checkForSystemTimeout(systemTimeoutOptions.onIdle);
|
2022-02-24 20:50:19 +01:00
|
|
|
break;
|
2023-02-05 16:57:21 +01:00
|
|
|
case "openLoginApproval":
|
|
|
|
if (message.notificationId != null) {
|
|
|
|
await this.openLoginApproval(message.notificationId);
|
|
|
|
}
|
|
|
|
break;
|
2021-02-22 19:17:02 +01:00
|
|
|
}
|
2021-12-20 15:47:17 +01:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2021-02-22 19:17:02 +01:00
|
|
|
|
2021-08-27 15:30:44 +02:00
|
|
|
ngOnDestroy() {
|
2022-06-23 15:38:12 +02:00
|
|
|
this.destroy$.next();
|
|
|
|
this.destroy$.complete();
|
2021-08-27 15:30:44 +02:00
|
|
|
this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
|
2021-02-22 19:17:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
async openExportVault() {
|
2022-07-29 21:49:58 +02:00
|
|
|
this.modalService.closeAll();
|
2021-02-22 19:17:02 +01:00
|
|
|
|
|
|
|
const [modal, childComponent] = await this.modalService.openViewRef(
|
2021-08-27 15:30:44 +02:00
|
|
|
ExportComponent,
|
|
|
|
this.exportVaultModalRef
|
2021-02-22 19:17:02 +01:00
|
|
|
);
|
2021-08-27 15:30:44 +02:00
|
|
|
this.modal = modal;
|
2021-02-22 19:17:02 +01:00
|
|
|
|
2022-08-26 18:09:28 +02:00
|
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
2021-08-27 15:30:44 +02:00
|
|
|
childComponent.onSaved.subscribe(() => {
|
|
|
|
this.modal.close();
|
|
|
|
});
|
2021-02-22 19:17:02 +01:00
|
|
|
|
2022-08-26 18:09:28 +02:00
|
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
2021-02-22 19:17:02 +01:00
|
|
|
this.modal.onClosed.subscribe(() => {
|
|
|
|
this.modal = null;
|
|
|
|
});
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2021-02-22 19:17:02 +01:00
|
|
|
|
|
|
|
async addFolder() {
|
2022-07-29 21:49:58 +02:00
|
|
|
this.modalService.closeAll();
|
2021-02-22 19:17:02 +01:00
|
|
|
|
2021-08-27 15:30:44 +02:00
|
|
|
const [modal, childComponent] = await this.modalService.openViewRef(
|
|
|
|
FolderAddEditComponent,
|
|
|
|
this.folderAddEditModalRef,
|
|
|
|
(comp) => (comp.folderId = null)
|
2021-12-20 15:47:17 +01:00
|
|
|
);
|
2021-08-27 15:30:44 +02:00
|
|
|
this.modal = modal;
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2022-08-26 18:09:28 +02:00
|
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe
|
2021-08-27 15:30:44 +02:00
|
|
|
childComponent.onSavedFolder.subscribe(async () => {
|
2021-02-22 19:17:02 +01:00
|
|
|
this.modal.close();
|
2021-08-27 15:30:44 +02:00
|
|
|
this.syncService.fullSync(false);
|
2021-12-20 15:47:17 +01:00
|
|
|
});
|
|
|
|
|
2022-08-26 18:09:28 +02:00
|
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
2021-02-22 19:17:02 +01:00
|
|
|
this.modal.onClosed.subscribe(() => {
|
|
|
|
this.modal = null;
|
|
|
|
});
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
|
|
|
|
2022-03-29 21:01:57 +02:00
|
|
|
async openGenerator() {
|
2022-07-29 21:49:58 +02:00
|
|
|
this.modalService.closeAll();
|
2021-02-22 19:17:02 +01:00
|
|
|
|
2021-08-27 15:30:44 +02:00
|
|
|
[this.modal] = await this.modalService.openViewRef(
|
2022-04-01 00:49:53 +02:00
|
|
|
GeneratorComponent,
|
|
|
|
this.generatorModalRef,
|
|
|
|
(comp) => (comp.comingFromAddEdit = false)
|
2021-12-20 15:47:17 +01:00
|
|
|
);
|
|
|
|
|
2022-08-26 18:09:28 +02:00
|
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
2018-02-16 21:03:29 +01:00
|
|
|
this.modal.onClosed.subscribe(() => {
|
2021-02-22 19:17:02 +01:00
|
|
|
this.modal = null;
|
2021-12-20 15:47:17 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-02-05 16:57:21 +01:00
|
|
|
async openLoginApproval(notificationId: string) {
|
|
|
|
this.modalService.closeAll();
|
|
|
|
|
|
|
|
this.modal = await this.modalService.open(LoginApprovalComponent, {
|
|
|
|
data: { notificationId: notificationId },
|
|
|
|
});
|
|
|
|
|
|
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
|
|
|
this.modal.onClosed.subscribe(() => {
|
|
|
|
this.modal = null;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-12-15 23:32:00 +01:00
|
|
|
private async updateAppMenu() {
|
|
|
|
let updateRequest: MenuUpdateRequest;
|
2022-11-01 11:25:46 +01:00
|
|
|
const stateAccounts = await firstValueFrom(this.stateService.accounts$);
|
2021-12-15 23:32:00 +01:00
|
|
|
if (stateAccounts == null || Object.keys(stateAccounts).length < 1) {
|
|
|
|
updateRequest = {
|
|
|
|
accounts: null,
|
|
|
|
activeUserId: null,
|
|
|
|
hideChangeMasterPassword: true,
|
2021-11-09 19:00:01 +01:00
|
|
|
};
|
|
|
|
} else {
|
2021-12-15 23:32:00 +01:00
|
|
|
const accounts: { [userId: string]: any } = {};
|
|
|
|
for (const i in stateAccounts) {
|
|
|
|
if (i != null && stateAccounts[i]?.profile?.userId != null) {
|
|
|
|
const userId = stateAccounts[i].profile.userId;
|
|
|
|
accounts[userId] = {
|
|
|
|
isAuthenticated: await this.stateService.getIsAuthenticated({
|
|
|
|
userId: userId,
|
|
|
|
}),
|
2022-04-30 01:16:46 +02:00
|
|
|
isLocked:
|
|
|
|
(await this.authService.getAuthStatus(userId)) === AuthenticationStatus.Locked,
|
2021-12-15 23:32:00 +01:00
|
|
|
email: stateAccounts[i].profile.email,
|
|
|
|
userId: stateAccounts[i].profile.userId,
|
2021-11-09 19:00:01 +01:00
|
|
|
};
|
|
|
|
}
|
2021-12-15 23:32:00 +01:00
|
|
|
}
|
|
|
|
updateRequest = {
|
|
|
|
accounts: accounts,
|
|
|
|
activeUserId: await this.stateService.getUserId(),
|
|
|
|
hideChangeMasterPassword: await this.keyConnectorService.getUsesKeyConnector(),
|
|
|
|
};
|
2018-02-14 06:26:32 +01:00
|
|
|
}
|
|
|
|
|
2021-12-15 23:32:00 +01:00
|
|
|
this.messagingService.send("updateAppMenu", { updateRequest: updateRequest });
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
|
|
|
|
2021-12-15 23:32:00 +01:00
|
|
|
private async logOut(expired: boolean, userId?: string) {
|
2022-02-09 18:42:16 +01:00
|
|
|
const userBeingLoggedOut = await this.stateService.getUserId({ userId: userId });
|
2018-02-08 21:58:47 +01:00
|
|
|
await Promise.all([
|
2022-12-06 14:47:42 +01:00
|
|
|
this.eventUploadService.uploadEvents(userBeingLoggedOut),
|
2022-02-09 18:42:16 +01:00
|
|
|
this.syncService.setLastSync(new Date(0), userBeingLoggedOut),
|
|
|
|
this.cryptoService.clearKeys(userBeingLoggedOut),
|
|
|
|
this.settingsService.clear(userBeingLoggedOut),
|
|
|
|
this.cipherService.clear(userBeingLoggedOut),
|
|
|
|
this.folderService.clear(userBeingLoggedOut),
|
|
|
|
this.collectionService.clear(userBeingLoggedOut),
|
|
|
|
this.passwordGenerationService.clear(userBeingLoggedOut),
|
2022-08-30 22:30:43 +02:00
|
|
|
this.vaultTimeoutSettingsService.clear(userBeingLoggedOut),
|
2022-02-09 18:42:16 +01:00
|
|
|
this.policyService.clear(userBeingLoggedOut),
|
2021-11-09 19:00:01 +01:00
|
|
|
this.keyConnectorService.clear(),
|
2018-02-08 21:58:47 +01:00
|
|
|
]);
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2022-02-09 18:42:16 +01:00
|
|
|
if (userBeingLoggedOut === this.activeUserId) {
|
2021-12-15 23:32:00 +01:00
|
|
|
this.searchService.clearIndex();
|
|
|
|
this.authService.logOut(async () => {
|
|
|
|
if (expired) {
|
2018-02-14 14:54:27 +01:00
|
|
|
this.platformUtilsService.showToast(
|
2021-12-15 23:32:00 +01:00
|
|
|
"warning",
|
|
|
|
this.i18nService.t("loggedOut"),
|
|
|
|
this.i18nService.t("loginExpired")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
2018-01-26 16:50:06 +01:00
|
|
|
}
|
2018-02-10 05:25:18 +01:00
|
|
|
|
2022-02-09 18:42:16 +01:00
|
|
|
const preLogoutActiveUserId = this.activeUserId;
|
|
|
|
await this.stateService.clean({ userId: userBeingLoggedOut });
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2022-02-09 18:42:16 +01:00
|
|
|
if (this.activeUserId == null) {
|
2019-04-18 16:06:33 +02:00
|
|
|
this.router.navigate(["login"]);
|
2022-02-09 18:42:16 +01:00
|
|
|
} else if (preLogoutActiveUserId !== this.activeUserId) {
|
2022-01-12 15:23:00 +01:00
|
|
|
this.messagingService.send("switchAccount");
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-02-10 05:25:18 +01:00
|
|
|
|
2021-12-15 23:32:00 +01:00
|
|
|
await this.updateAppMenu();
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-08-24 21:30:26 +02:00
|
|
|
|
2022-02-02 16:28:36 +01:00
|
|
|
private async recordActivity() {
|
|
|
|
if (this.activeUserId == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-08-24 21:30:26 +02:00
|
|
|
const now = new Date().getTime();
|
|
|
|
if (this.lastActivity != null && now - this.lastActivity < 250) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.lastActivity = now;
|
2022-02-02 16:28:36 +01:00
|
|
|
await this.stateService.setLastActive(now, { userId: this.activeUserId });
|
2018-02-10 05:41:29 +01:00
|
|
|
|
2021-08-27 15:30:44 +02:00
|
|
|
// Idle states
|
|
|
|
if (this.isIdle) {
|
|
|
|
this.isIdle = false;
|
2018-08-24 21:30:26 +02:00
|
|
|
this.idleStateChanged();
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-02-16 21:03:29 +01:00
|
|
|
if (this.idleTimer != null) {
|
|
|
|
window.clearTimeout(this.idleTimer);
|
2018-08-24 21:30:26 +02:00
|
|
|
this.idleTimer = null;
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-08-24 21:30:26 +02:00
|
|
|
this.idleTimer = window.setTimeout(() => {
|
|
|
|
if (!this.isIdle) {
|
|
|
|
this.isIdle = true;
|
|
|
|
this.idleStateChanged();
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-08-24 21:30:26 +02:00
|
|
|
}, IdleTimeout);
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
|
|
|
|
2018-08-24 21:30:26 +02:00
|
|
|
private idleStateChanged() {
|
|
|
|
if (this.isIdle) {
|
2018-02-16 21:03:29 +01:00
|
|
|
this.notificationsService.disconnectFromInactivity();
|
|
|
|
} else {
|
2021-08-27 15:30:44 +02:00
|
|
|
this.notificationsService.reconnectFromActivity();
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
|
|
|
}
|
2018-02-16 21:03:29 +01:00
|
|
|
|
|
|
|
private async openModal<T>(type: Type<T>, ref: ViewContainerRef) {
|
2022-07-29 21:49:58 +02:00
|
|
|
this.modalService.closeAll();
|
2018-10-03 15:42:11 +02:00
|
|
|
|
2021-12-07 20:42:31 +01:00
|
|
|
[this.modal] = await this.modalService.openViewRef(type, ref);
|
|
|
|
|
2022-08-26 18:09:28 +02:00
|
|
|
// eslint-disable-next-line rxjs-angular/prefer-takeuntil
|
2021-12-07 20:42:31 +01:00
|
|
|
this.modal.onClosed.subscribe(() => {
|
|
|
|
this.modal = null;
|
2021-12-20 15:47:17 +01:00
|
|
|
});
|
|
|
|
}
|
2021-12-07 20:42:31 +01:00
|
|
|
|
2018-10-03 15:42:11 +02:00
|
|
|
private showToast(msg: any) {
|
2021-12-07 20:42:31 +01:00
|
|
|
let message = "";
|
2021-12-20 15:47:17 +01:00
|
|
|
|
2021-12-07 20:42:31 +01:00
|
|
|
const options: Partial<IndividualConfig> = {};
|
|
|
|
|
|
|
|
if (typeof msg.text === "string") {
|
|
|
|
message = msg.text;
|
|
|
|
} else if (msg.text.length === 1) {
|
|
|
|
message = msg.text[0];
|
2021-12-20 15:47:17 +01:00
|
|
|
} else {
|
2018-10-03 15:42:11 +02:00
|
|
|
msg.text.forEach(
|
2021-12-07 20:42:31 +01:00
|
|
|
(t: string) =>
|
|
|
|
(message += "<p>" + this.sanitizer.sanitize(SecurityContext.HTML, t) + "</p>")
|
|
|
|
);
|
|
|
|
options.enableHtml = true;
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-10-03 15:42:11 +02:00
|
|
|
if (msg.options != null) {
|
2021-12-07 20:42:31 +01:00
|
|
|
if (msg.options.trustedHtml === true) {
|
|
|
|
options.enableHtml = true;
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-10-03 15:42:11 +02:00
|
|
|
if (msg.options.timeout != null && msg.options.timeout > 0) {
|
|
|
|
options.timeOut = msg.options.timeout;
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2018-10-03 15:42:11 +02:00
|
|
|
}
|
2021-02-22 19:17:02 +01:00
|
|
|
|
2021-12-15 23:32:00 +01:00
|
|
|
this.toastrService.show(message, msg.title, options, "toast-" + msg.type);
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
|
|
|
|
2021-02-22 19:17:02 +01:00
|
|
|
private routeToVault(action: string, cipherType: CipherType) {
|
|
|
|
if (!this.router.url.includes("vault")) {
|
|
|
|
this.router.navigate(["/vault"], {
|
|
|
|
queryParams: {
|
|
|
|
action: action,
|
|
|
|
addType: cipherType,
|
|
|
|
},
|
|
|
|
replaceUrl: true,
|
|
|
|
});
|
|
|
|
}
|
2021-12-20 15:47:17 +01:00
|
|
|
}
|
2022-01-25 15:36:30 +01:00
|
|
|
|
2022-02-01 17:31:30 +01:00
|
|
|
private async checkForSystemTimeout(timeout: number): Promise<void> {
|
2022-11-01 11:25:46 +01:00
|
|
|
const accounts = await firstValueFrom(this.stateService.accounts$);
|
|
|
|
for (const userId in accounts) {
|
2022-02-01 17:31:30 +01:00
|
|
|
if (userId == null) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const options = await this.getVaultTimeoutOptions(userId);
|
|
|
|
if (options[0] === timeout) {
|
|
|
|
options[1] === "logOut"
|
|
|
|
? this.logOut(false, userId)
|
2022-08-26 05:04:54 +02:00
|
|
|
: await this.vaultTimeoutService.lock(userId);
|
2022-02-01 17:31:30 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private async getVaultTimeoutOptions(userId: string): Promise<[number, string]> {
|
|
|
|
const timeout = await this.stateService.getVaultTimeout({ userId: userId });
|
|
|
|
const action = await this.stateService.getVaultTimeoutAction({ userId: userId });
|
|
|
|
return [timeout, action];
|
|
|
|
}
|
2018-01-16 20:48:34 +01:00
|
|
|
}
|