2021-09-17 15:44:27 +02:00
|
|
|
import { ApiService as ApiServiceAbstraction } from "jslib-common/abstractions/api.service";
|
|
|
|
import { AppIdService as AppIdServiceAbstraction } from "jslib-common/abstractions/appId.service";
|
|
|
|
import { AuditService as AuditServiceAbstraction } from "jslib-common/abstractions/audit.service";
|
|
|
|
import { AuthService as AuthServiceAbstraction } from "jslib-common/abstractions/auth.service";
|
|
|
|
import { CipherService as CipherServiceAbstraction } from "jslib-common/abstractions/cipher.service";
|
|
|
|
import { CollectionService as CollectionServiceAbstraction } from "jslib-common/abstractions/collection.service";
|
|
|
|
import { CryptoService as CryptoServiceAbstraction } from "jslib-common/abstractions/crypto.service";
|
2021-06-07 19:25:37 +02:00
|
|
|
import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "jslib-common/abstractions/cryptoFunction.service";
|
2021-09-17 15:44:27 +02:00
|
|
|
import { EnvironmentService as EnvironmentServiceAbstraction } from "jslib-common/abstractions/environment.service";
|
2021-06-07 19:25:37 +02:00
|
|
|
import { EventService as EventServiceAbstraction } from "jslib-common/abstractions/event.service";
|
|
|
|
import { ExportService as ExportServiceAbstraction } from "jslib-common/abstractions/export.service";
|
|
|
|
import { FileUploadService as FileUploadServiceAbstraction } from "jslib-common/abstractions/fileUpload.service";
|
2021-09-17 15:44:27 +02:00
|
|
|
import { FolderService as FolderServiceAbstraction } from "jslib-common/abstractions/folder.service";
|
|
|
|
import { I18nService as I18nServiceAbstraction } from "jslib-common/abstractions/i18n.service";
|
2021-11-09 18:59:51 +01:00
|
|
|
import { KeyConnectorService as KeyConnectorServiceAbstraction } from "jslib-common/abstractions/keyConnector.service";
|
2021-09-17 15:44:27 +02:00
|
|
|
import { LogService as LogServiceAbstraction } from "jslib-common/abstractions/log.service";
|
|
|
|
import { MessagingService as MessagingServiceAbstraction } from "jslib-common/abstractions/messaging.service";
|
2021-06-07 19:25:37 +02:00
|
|
|
import { NotificationsService as NotificationsServiceAbstraction } from "jslib-common/abstractions/notifications.service";
|
2022-01-27 22:22:51 +01:00
|
|
|
import { OrganizationService as OrganizationServiceAbstraction } from "jslib-common/abstractions/organization.service";
|
2021-09-17 15:44:27 +02:00
|
|
|
import { PasswordGenerationService as PasswordGenerationServiceAbstraction } from "jslib-common/abstractions/passwordGeneration.service";
|
|
|
|
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "jslib-common/abstractions/platformUtils.service";
|
2021-06-07 19:25:37 +02:00
|
|
|
import { PolicyService as PolicyServiceAbstraction } from "jslib-common/abstractions/policy.service";
|
2022-01-27 22:22:51 +01:00
|
|
|
import { ProviderService as ProviderServiceAbstraction } from "jslib-common/abstractions/provider.service";
|
2021-06-07 19:25:37 +02:00
|
|
|
import { SearchService as SearchServiceAbstraction } from "jslib-common/abstractions/search.service";
|
|
|
|
import { SendService as SendServiceAbstraction } from "jslib-common/abstractions/send.service";
|
2021-09-17 15:44:27 +02:00
|
|
|
import { SettingsService as SettingsServiceAbstraction } from "jslib-common/abstractions/settings.service";
|
|
|
|
import { StorageService as StorageServiceAbstraction } from "jslib-common/abstractions/storage.service";
|
|
|
|
import { SyncService as SyncServiceAbstraction } from "jslib-common/abstractions/sync.service";
|
2021-06-07 19:25:37 +02:00
|
|
|
import { SystemService as SystemServiceAbstraction } from "jslib-common/abstractions/system.service";
|
2021-09-17 15:44:27 +02:00
|
|
|
import { TokenService as TokenServiceAbstraction } from "jslib-common/abstractions/token.service";
|
|
|
|
import { TotpService as TotpServiceAbstraction } from "jslib-common/abstractions/totp.service";
|
2022-02-08 00:06:37 +01:00
|
|
|
import { TwoFactorService as TwoFactorServiceAbstraction } from "jslib-common/abstractions/twoFactor.service";
|
2021-11-16 11:50:58 +01:00
|
|
|
import { UserVerificationService as UserVerificationServiceAbstraction } from "jslib-common/abstractions/userVerification.service";
|
2021-09-17 15:44:27 +02:00
|
|
|
import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "jslib-common/abstractions/vaultTimeout.service";
|
2022-02-24 18:14:04 +01:00
|
|
|
import { CipherRepromptType } from "jslib-common/enums/cipherRepromptType";
|
|
|
|
import { CipherType } from "jslib-common/enums/cipherType";
|
|
|
|
import { StateFactory } from "jslib-common/factories/stateFactory";
|
|
|
|
import { GlobalState } from "jslib-common/models/domain/globalState";
|
|
|
|
import { CipherView } from "jslib-common/models/view/cipherView";
|
|
|
|
import { ApiService } from "jslib-common/services/api.service";
|
|
|
|
import { AppIdService } from "jslib-common/services/appId.service";
|
|
|
|
import { AuditService } from "jslib-common/services/audit.service";
|
|
|
|
import { AuthService } from "jslib-common/services/auth.service";
|
|
|
|
import { CipherService } from "jslib-common/services/cipher.service";
|
|
|
|
import { CollectionService } from "jslib-common/services/collection.service";
|
|
|
|
import { ConsoleLogService } from "jslib-common/services/consoleLog.service";
|
|
|
|
import { ContainerService } from "jslib-common/services/container.service";
|
|
|
|
import { EnvironmentService } from "jslib-common/services/environment.service";
|
|
|
|
import { EventService } from "jslib-common/services/event.service";
|
|
|
|
import { ExportService } from "jslib-common/services/export.service";
|
|
|
|
import { FileUploadService } from "jslib-common/services/fileUpload.service";
|
|
|
|
import { FolderService } from "jslib-common/services/folder.service";
|
|
|
|
import { KeyConnectorService } from "jslib-common/services/keyConnector.service";
|
|
|
|
import { NotificationsService } from "jslib-common/services/notifications.service";
|
|
|
|
import { OrganizationService } from "jslib-common/services/organization.service";
|
|
|
|
import { PasswordGenerationService } from "jslib-common/services/passwordGeneration.service";
|
|
|
|
import { PolicyService } from "jslib-common/services/policy.service";
|
|
|
|
import { ProviderService } from "jslib-common/services/provider.service";
|
|
|
|
import { SearchService } from "jslib-common/services/search.service";
|
|
|
|
import { SendService } from "jslib-common/services/send.service";
|
|
|
|
import { SettingsService } from "jslib-common/services/settings.service";
|
|
|
|
import { StateMigrationService } from "jslib-common/services/stateMigration.service";
|
|
|
|
import { SyncService } from "jslib-common/services/sync.service";
|
|
|
|
import { SystemService } from "jslib-common/services/system.service";
|
|
|
|
import { TokenService } from "jslib-common/services/token.service";
|
|
|
|
import { TotpService } from "jslib-common/services/totp.service";
|
|
|
|
import { TwoFactorService } from "jslib-common/services/twoFactor.service";
|
|
|
|
import { UserVerificationService } from "jslib-common/services/userVerification.service";
|
|
|
|
import { WebCryptoFunctionService } from "jslib-common/services/webCryptoFunction.service";
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2018-01-12 17:09:30 +01:00
|
|
|
import { BrowserApi } from "../browser/browserApi";
|
2019-08-12 18:31:32 +02:00
|
|
|
import { SafariApp } from "../browser/safariApp";
|
2022-02-24 18:14:04 +01:00
|
|
|
import { Account } from "../models/account";
|
2021-02-10 16:40:15 +01:00
|
|
|
import { PopupUtilsService } from "../popup/services/popup-utils.service";
|
2022-02-24 18:14:04 +01:00
|
|
|
import { AutofillService as AutofillServiceAbstraction } from "../services/abstractions/autofill.service";
|
|
|
|
import { StateService as StateServiceAbstraction } from "../services/abstractions/state.service";
|
2017-12-05 23:04:30 +01:00
|
|
|
import AutofillService from "../services/autofill.service";
|
2021-06-22 22:11:29 +02:00
|
|
|
import { BrowserCryptoService } from "../services/browserCrypto.service";
|
2018-01-04 22:06:00 +01:00
|
|
|
import BrowserMessagingService from "../services/browserMessaging.service";
|
2022-02-15 23:06:35 +01:00
|
|
|
import BrowserMessagingPrivateModeBackgroundService from "../services/browserMessagingPrivateModeBackground.service";
|
2018-01-05 22:38:50 +01:00
|
|
|
import BrowserPlatformUtilsService from "../services/browserPlatformUtils.service";
|
2018-01-04 22:15:06 +01:00
|
|
|
import BrowserStorageService from "../services/browserStorage.service";
|
2018-04-11 20:52:49 +02:00
|
|
|
import I18nService from "../services/i18n.service";
|
2022-01-27 22:22:51 +01:00
|
|
|
import { StateService } from "../services/state.service";
|
2021-02-20 11:10:33 +01:00
|
|
|
import VaultTimeoutService from "../services/vaultTimeout.service";
|
2018-01-04 16:51:08 +01:00
|
|
|
|
2022-02-24 18:14:04 +01:00
|
|
|
import CommandsBackground from "./commands.background";
|
|
|
|
import ContextMenusBackground from "./contextMenus.background";
|
|
|
|
import IdleBackground from "./idle.background";
|
|
|
|
import { NativeMessagingBackground } from "./nativeMessaging.background";
|
|
|
|
import NotificationBackground from "./notification.background";
|
|
|
|
import RuntimeBackground from "./runtime.background";
|
|
|
|
import TabsBackground from "./tabs.background";
|
|
|
|
import WebRequestBackground from "./webRequest.background";
|
|
|
|
import WindowsBackground from "./windows.background";
|
2022-01-31 20:21:06 +01:00
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
export default class MainBackground {
|
2018-01-09 20:26:20 +01:00
|
|
|
messagingService: MessagingServiceAbstraction;
|
|
|
|
storageService: StorageServiceAbstraction;
|
2018-01-12 06:06:53 +01:00
|
|
|
secureStorageService: StorageServiceAbstraction;
|
2018-04-11 20:52:49 +02:00
|
|
|
i18nService: I18nServiceAbstraction;
|
2018-01-09 20:26:20 +01:00
|
|
|
platformUtilsService: PlatformUtilsServiceAbstraction;
|
2021-07-23 20:22:53 +02:00
|
|
|
logService: LogServiceAbstraction;
|
2018-01-09 20:26:20 +01:00
|
|
|
cryptoService: CryptoServiceAbstraction;
|
2020-09-18 22:03:08 +02:00
|
|
|
cryptoFunctionService: CryptoFunctionServiceAbstraction;
|
2018-01-09 22:20:15 +01:00
|
|
|
tokenService: TokenServiceAbstraction;
|
|
|
|
appIdService: AppIdServiceAbstraction;
|
|
|
|
apiService: ApiServiceAbstraction;
|
2018-01-10 02:20:45 +01:00
|
|
|
environmentService: EnvironmentServiceAbstraction;
|
2018-01-10 04:47:53 +01:00
|
|
|
settingsService: SettingsServiceAbstraction;
|
2018-01-10 05:05:46 +01:00
|
|
|
cipherService: CipherServiceAbstraction;
|
2018-01-10 04:39:38 +01:00
|
|
|
folderService: FolderServiceAbstraction;
|
2018-01-10 05:12:14 +01:00
|
|
|
collectionService: CollectionServiceAbstraction;
|
2020-04-06 17:40:16 +02:00
|
|
|
vaultTimeoutService: VaultTimeoutServiceAbstraction;
|
2018-01-10 05:27:15 +01:00
|
|
|
syncService: SyncServiceAbstraction;
|
2018-01-09 23:55:28 +01:00
|
|
|
passwordGenerationService: PasswordGenerationServiceAbstraction;
|
2018-01-09 23:45:17 +01:00
|
|
|
totpService: TotpServiceAbstraction;
|
2018-01-11 20:45:27 +01:00
|
|
|
autofillService: AutofillServiceAbstraction;
|
2018-01-07 06:15:12 +01:00
|
|
|
containerService: ContainerService;
|
2018-03-21 14:38:03 +01:00
|
|
|
auditService: AuditServiceAbstraction;
|
2020-08-11 22:25:07 +02:00
|
|
|
authService: AuthServiceAbstraction;
|
2018-05-17 16:57:52 +02:00
|
|
|
exportService: ExportServiceAbstraction;
|
2018-08-13 17:53:16 +02:00
|
|
|
searchService: SearchServiceAbstraction;
|
2018-08-20 23:40:39 +02:00
|
|
|
notificationsService: NotificationsServiceAbstraction;
|
2020-08-11 22:25:07 +02:00
|
|
|
stateService: StateServiceAbstraction;
|
2022-01-27 22:22:51 +01:00
|
|
|
stateMigrationService: StateMigrationService;
|
2019-02-27 15:28:16 +01:00
|
|
|
systemService: SystemServiceAbstraction;
|
2019-07-09 19:56:13 +02:00
|
|
|
eventService: EventServiceAbstraction;
|
2020-11-18 22:54:29 +01:00
|
|
|
policyService: PolicyServiceAbstraction;
|
2021-04-07 20:43:07 +02:00
|
|
|
popupUtilsService: PopupUtilsService;
|
|
|
|
sendService: SendServiceAbstraction;
|
2021-11-16 11:50:58 +01:00
|
|
|
fileUploadService: FileUploadServiceAbstraction;
|
2022-01-27 22:22:51 +01:00
|
|
|
organizationService: OrganizationServiceAbstraction;
|
|
|
|
providerService: ProviderServiceAbstraction;
|
2017-12-07 21:06:37 +01:00
|
|
|
keyConnectorService: KeyConnectorServiceAbstraction;
|
2021-10-18 16:41:42 +02:00
|
|
|
userVerificationService: UserVerificationServiceAbstraction;
|
2022-02-08 00:06:37 +01:00
|
|
|
twoFactorService: TwoFactorServiceAbstraction;
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2017-12-07 21:06:37 +01:00
|
|
|
onUpdatedRan: boolean;
|
|
|
|
onReplacedRan: boolean;
|
|
|
|
loginToAutoFill: CipherView = null;
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2017-12-07 21:06:37 +01:00
|
|
|
private commandsBackground: CommandsBackground;
|
2017-12-07 03:54:38 +01:00
|
|
|
private contextMenusBackground: ContextMenusBackground;
|
2017-12-07 21:06:37 +01:00
|
|
|
private idleBackground: IdleBackground;
|
2020-10-11 20:45:25 +02:00
|
|
|
private notificationBackground: NotificationBackground;
|
2020-10-12 18:01:34 +02:00
|
|
|
private runtimeBackground: RuntimeBackground;
|
2020-10-21 17:18:04 +02:00
|
|
|
private tabsBackground: TabsBackground;
|
|
|
|
private webRequestBackground: WebRequestBackground;
|
2017-12-07 21:06:37 +01:00
|
|
|
private windowsBackground: WindowsBackground;
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2020-10-21 17:18:04 +02:00
|
|
|
private sidebarAction: any;
|
|
|
|
private buildingContextMenu: boolean;
|
2020-12-09 21:11:25 +01:00
|
|
|
private menuOptionsLoaded: any[] = [];
|
2018-04-06 17:48:45 +02:00
|
|
|
private syncTimeout: any;
|
2020-12-09 21:11:25 +01:00
|
|
|
private isSafari: boolean;
|
|
|
|
private nativeMessagingBackground: NativeMessagingBackground;
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2022-02-15 23:06:35 +01:00
|
|
|
constructor(public isPrivateMode: boolean = false) {
|
2021-02-10 16:40:15 +01:00
|
|
|
// Services
|
2022-02-15 23:06:35 +01:00
|
|
|
this.messagingService = isPrivateMode
|
|
|
|
? new BrowserMessagingPrivateModeBackgroundService()
|
|
|
|
: new BrowserMessagingService();
|
2021-02-03 20:36:05 +01:00
|
|
|
this.storageService = new BrowserStorageService();
|
2022-01-27 22:22:51 +01:00
|
|
|
this.secureStorageService = new BrowserStorageService();
|
|
|
|
this.logService = new ConsoleLogService(false);
|
|
|
|
this.stateMigrationService = new StateMigrationService(
|
|
|
|
this.storageService,
|
2022-01-31 20:21:06 +01:00
|
|
|
this.secureStorageService,
|
2022-02-03 19:55:06 +01:00
|
|
|
new StateFactory(GlobalState, Account)
|
2022-01-27 22:22:51 +01:00
|
|
|
);
|
|
|
|
this.stateService = new StateService(
|
|
|
|
this.storageService,
|
|
|
|
this.secureStorageService,
|
|
|
|
this.logService,
|
|
|
|
this.stateMigrationService,
|
2022-01-31 20:21:06 +01:00
|
|
|
new StateFactory(GlobalState, Account)
|
2022-01-27 22:22:51 +01:00
|
|
|
);
|
2020-09-18 22:03:08 +02:00
|
|
|
this.platformUtilsService = new BrowserPlatformUtilsService(
|
2021-06-22 22:11:29 +02:00
|
|
|
this.messagingService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService,
|
2021-07-23 20:22:53 +02:00
|
|
|
(clipboardValue, clearMs) => {
|
2018-01-04 16:51:08 +01:00
|
|
|
if (this.systemService != null) {
|
|
|
|
this.systemService.clearClipboard(clipboardValue, clearMs);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2018-01-04 16:51:08 +01:00
|
|
|
},
|
2020-11-30 13:41:08 +01:00
|
|
|
async () => {
|
2018-01-04 16:51:08 +01:00
|
|
|
if (this.nativeMessagingBackground != null) {
|
|
|
|
const promise = this.nativeMessagingBackground.getResponse();
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2018-06-25 20:56:29 +02:00
|
|
|
try {
|
2021-03-29 17:16:31 +02:00
|
|
|
await this.nativeMessagingBackground.send({ command: "biometricUnlock" });
|
2021-10-21 11:10:46 +02:00
|
|
|
} catch (e) {
|
2021-03-29 17:16:31 +02:00
|
|
|
return Promise.reject(e);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
|
2021-10-21 11:10:46 +02:00
|
|
|
return promise.then((result) => result.response === "unlocked");
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
);
|
2020-04-06 17:40:16 +02:00
|
|
|
this.i18nService = new I18nService(BrowserApi.getUILanguage(window));
|
|
|
|
this.cryptoFunctionService = new WebCryptoFunctionService(window, this.platformUtilsService);
|
2021-09-14 13:36:34 +02:00
|
|
|
this.cryptoService = new BrowserCryptoService(
|
2021-11-09 18:59:51 +01:00
|
|
|
this.cryptoFunctionService,
|
2018-08-23 15:26:07 +02:00
|
|
|
this.platformUtilsService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.logService,
|
|
|
|
this.stateService
|
2020-04-06 17:40:16 +02:00
|
|
|
);
|
2022-01-27 22:22:51 +01:00
|
|
|
this.tokenService = new TokenService(this.stateService);
|
2017-12-05 23:04:30 +01:00
|
|
|
this.appIdService = new AppIdService(this.storageService);
|
2022-01-27 22:22:51 +01:00
|
|
|
this.environmentService = new EnvironmentService(this.stateService);
|
2021-11-09 18:59:51 +01:00
|
|
|
this.apiService = new ApiService(
|
|
|
|
this.tokenService,
|
|
|
|
this.platformUtilsService,
|
|
|
|
this.environmentService,
|
|
|
|
(expired: boolean) => this.logout(expired)
|
|
|
|
);
|
2022-01-27 22:22:51 +01:00
|
|
|
this.settingsService = new SettingsService(this.stateService);
|
2018-08-23 03:47:30 +02:00
|
|
|
this.fileUploadService = new FileUploadService(this.logService, this.apiService);
|
2020-04-06 17:40:16 +02:00
|
|
|
this.cipherService = new CipherService(
|
2021-11-16 11:50:58 +01:00
|
|
|
this.cryptoService,
|
|
|
|
this.settingsService,
|
|
|
|
this.apiService,
|
|
|
|
this.fileUploadService,
|
|
|
|
this.i18nService,
|
2021-10-21 11:10:46 +02:00
|
|
|
() => this.searchService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.logService,
|
|
|
|
this.stateService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2021-11-16 11:50:58 +01:00
|
|
|
this.folderService = new FolderService(
|
2020-10-19 16:50:25 +02:00
|
|
|
this.cryptoService,
|
|
|
|
this.apiService,
|
2021-04-07 17:39:59 +02:00
|
|
|
this.i18nService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.cipherService,
|
|
|
|
this.stateService
|
2021-04-14 23:43:09 +02:00
|
|
|
);
|
2021-10-15 15:03:25 +02:00
|
|
|
this.collectionService = new CollectionService(
|
|
|
|
this.cryptoService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.i18nService,
|
|
|
|
this.stateService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2021-11-16 05:14:48 +01:00
|
|
|
this.searchService = new SearchService(this.cipherService, this.logService, this.i18nService);
|
2021-04-14 23:43:09 +02:00
|
|
|
this.sendService = new SendService(
|
|
|
|
this.cryptoService,
|
|
|
|
this.apiService,
|
|
|
|
this.fileUploadService,
|
2021-02-03 20:36:05 +01:00
|
|
|
this.i18nService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.cryptoFunctionService,
|
|
|
|
this.stateService
|
|
|
|
);
|
|
|
|
this.organizationService = new OrganizationService(this.stateService);
|
|
|
|
this.policyService = new PolicyService(
|
|
|
|
this.stateService,
|
|
|
|
this.organizationService,
|
|
|
|
this.apiService
|
2021-02-03 20:36:05 +01:00
|
|
|
);
|
2021-11-09 18:59:51 +01:00
|
|
|
this.keyConnectorService = new KeyConnectorService(
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService,
|
2018-01-07 06:15:12 +01:00
|
|
|
this.cryptoService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.apiService,
|
|
|
|
this.tokenService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.logService,
|
2022-02-08 00:06:37 +01:00
|
|
|
this.organizationService,
|
|
|
|
this.cryptoFunctionService
|
2020-04-06 17:40:16 +02:00
|
|
|
);
|
2022-01-27 22:22:51 +01:00
|
|
|
|
|
|
|
const vaultTimeoutServiceCallbacks = {
|
2022-02-09 23:56:14 +01:00
|
|
|
locked: async (userId?: string) => {
|
2022-01-27 22:22:51 +01:00
|
|
|
if (this.notificationsService != null) {
|
|
|
|
this.notificationsService.updateConnection(false);
|
|
|
|
}
|
|
|
|
await this.setIcon();
|
|
|
|
await this.refreshBadgeAndMenu(true);
|
|
|
|
if (this.systemService != null) {
|
|
|
|
await this.systemService.clearPendingClipboard();
|
|
|
|
await this.reloadProcess();
|
|
|
|
}
|
|
|
|
},
|
2022-02-09 23:56:14 +01:00
|
|
|
logout: async (userId?: string) => await this.logout(false, userId),
|
2022-01-27 22:22:51 +01:00
|
|
|
};
|
|
|
|
|
2020-04-06 17:40:16 +02:00
|
|
|
this.vaultTimeoutService = new VaultTimeoutService(
|
2018-04-11 21:59:39 +02:00
|
|
|
this.cipherService,
|
2021-05-13 02:51:07 +02:00
|
|
|
this.folderService,
|
2018-04-11 21:59:39 +02:00
|
|
|
this.collectionService,
|
2019-07-09 19:56:13 +02:00
|
|
|
this.cryptoService,
|
2021-10-15 15:03:25 +02:00
|
|
|
this.platformUtilsService,
|
2018-01-19 17:52:05 +01:00
|
|
|
this.messagingService,
|
|
|
|
this.searchService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.tokenService,
|
2021-10-21 11:10:46 +02:00
|
|
|
this.policyService,
|
2018-01-19 17:52:05 +01:00
|
|
|
this.keyConnectorService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService,
|
|
|
|
vaultTimeoutServiceCallbacks.locked,
|
|
|
|
vaultTimeoutServiceCallbacks.logout
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2022-01-27 22:22:51 +01:00
|
|
|
this.providerService = new ProviderService(this.stateService);
|
2020-08-11 22:25:07 +02:00
|
|
|
this.syncService = new SyncService(
|
2021-03-17 22:14:26 +01:00
|
|
|
this.apiService,
|
2017-12-06 05:28:31 +01:00
|
|
|
this.settingsService,
|
2021-05-13 02:51:07 +02:00
|
|
|
this.folderService,
|
2017-12-07 22:02:15 +01:00
|
|
|
this.cipherService,
|
2020-02-28 18:43:27 +01:00
|
|
|
this.cryptoService,
|
2017-12-07 04:28:33 +01:00
|
|
|
this.collectionService,
|
2017-12-07 22:02:15 +01:00
|
|
|
this.messagingService,
|
2021-10-21 11:10:46 +02:00
|
|
|
this.policyService,
|
2021-03-29 17:16:31 +02:00
|
|
|
this.sendService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.logService,
|
|
|
|
this.keyConnectorService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService,
|
|
|
|
this.organizationService,
|
|
|
|
this.providerService,
|
2017-12-07 22:02:15 +01:00
|
|
|
async (expired: boolean) => await this.logout(expired)
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2021-07-23 22:32:42 +02:00
|
|
|
this.eventService = new EventService(
|
2021-03-17 22:14:26 +01:00
|
|
|
this.apiService,
|
2017-12-07 22:02:15 +01:00
|
|
|
this.cipherService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService,
|
|
|
|
this.logService,
|
|
|
|
this.organizationService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2017-12-07 22:02:15 +01:00
|
|
|
this.passwordGenerationService = new PasswordGenerationService(
|
2020-02-28 18:43:27 +01:00
|
|
|
this.cryptoService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.policyService,
|
|
|
|
this.stateService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2019-07-12 20:54:17 +02:00
|
|
|
this.totpService = new TotpService(
|
2021-11-09 18:59:51 +01:00
|
|
|
this.cryptoFunctionService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.logService,
|
|
|
|
this.stateService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2019-07-12 20:54:17 +02:00
|
|
|
this.autofillService = new AutofillService(
|
2021-02-03 20:36:05 +01:00
|
|
|
this.cipherService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService,
|
2019-07-12 20:54:17 +02:00
|
|
|
this.totpService,
|
2021-10-21 11:10:46 +02:00
|
|
|
this.eventService,
|
2021-07-23 20:22:53 +02:00
|
|
|
this.logService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2017-12-07 22:02:15 +01:00
|
|
|
this.containerService = new ContainerService(this.cryptoService);
|
|
|
|
this.auditService = new AuditService(this.cryptoFunctionService, this.apiService);
|
2021-05-13 02:51:07 +02:00
|
|
|
this.exportService = new ExportService(
|
|
|
|
this.folderService,
|
2021-02-03 20:36:05 +01:00
|
|
|
this.cipherService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.apiService,
|
2022-02-08 00:06:37 +01:00
|
|
|
this.cryptoService,
|
|
|
|
this.cryptoFunctionService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2017-12-07 22:02:15 +01:00
|
|
|
this.notificationsService = new NotificationsService(
|
|
|
|
this.syncService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.appIdService,
|
|
|
|
this.apiService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.vaultTimeoutService,
|
|
|
|
this.environmentService,
|
2020-04-06 17:40:16 +02:00
|
|
|
() => this.logout(true),
|
2022-01-27 22:22:51 +01:00
|
|
|
this.logService,
|
|
|
|
this.stateService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2022-02-15 23:06:35 +01:00
|
|
|
this.popupUtilsService = new PopupUtilsService(isPrivateMode);
|
2022-01-27 22:22:51 +01:00
|
|
|
|
2020-02-28 18:43:27 +01:00
|
|
|
this.userVerificationService = new UserVerificationService(
|
|
|
|
this.cryptoService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.i18nService,
|
2021-05-13 02:51:07 +02:00
|
|
|
this.apiService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
const systemUtilsServiceReloadCallback = () => {
|
|
|
|
const forceWindowReload =
|
|
|
|
this.platformUtilsService.isSafari() ||
|
|
|
|
this.platformUtilsService.isFirefox() ||
|
|
|
|
this.platformUtilsService.isOpera();
|
|
|
|
BrowserApi.reloadExtension(forceWindowReload ? window : null);
|
|
|
|
return Promise.resolve();
|
|
|
|
};
|
|
|
|
|
|
|
|
this.systemService = new SystemService(
|
|
|
|
this.messagingService,
|
|
|
|
this.platformUtilsService,
|
|
|
|
systemUtilsServiceReloadCallback,
|
|
|
|
this.stateService
|
|
|
|
);
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
// Other fields
|
2018-01-12 04:36:22 +01:00
|
|
|
this.isSafari = this.platformUtilsService.isSafari();
|
|
|
|
this.sidebarAction = this.isSafari
|
2021-12-21 15:43:35 +01:00
|
|
|
? null
|
2020-04-06 17:40:16 +02:00
|
|
|
: typeof opr !== "undefined" && opr.sidebarAction
|
2018-01-12 04:36:22 +01:00
|
|
|
? opr.sidebarAction
|
2017-12-05 23:18:20 +01:00
|
|
|
: (window as any).chrome.sidebarAction;
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2021-03-17 22:14:26 +01:00
|
|
|
// Background
|
2021-10-15 15:03:25 +02:00
|
|
|
this.runtimeBackground = new RuntimeBackground(
|
2021-12-21 15:43:35 +01:00
|
|
|
this,
|
2021-10-15 15:03:25 +02:00
|
|
|
this.autofillService,
|
2018-04-10 20:20:03 +02:00
|
|
|
this.platformUtilsService as BrowserPlatformUtilsService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.i18nService,
|
2021-10-21 11:10:46 +02:00
|
|
|
this.notificationsService,
|
|
|
|
this.systemService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.environmentService,
|
2021-04-07 17:39:59 +02:00
|
|
|
this.messagingService,
|
2021-07-23 20:22:53 +02:00
|
|
|
this.logService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2020-10-19 16:50:25 +02:00
|
|
|
this.nativeMessagingBackground = new NativeMessagingBackground(
|
2020-02-28 18:43:27 +01:00
|
|
|
this.cryptoService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.cryptoFunctionService,
|
2021-04-07 17:39:59 +02:00
|
|
|
this.runtimeBackground,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.i18nService,
|
2021-04-07 17:39:59 +02:00
|
|
|
this.messagingService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.appIdService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.platformUtilsService,
|
|
|
|
this.stateService,
|
2022-02-11 10:44:35 +01:00
|
|
|
this.logService,
|
|
|
|
this.vaultTimeoutService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2018-01-17 15:12:16 +01:00
|
|
|
this.commandsBackground = new CommandsBackground(
|
2021-12-21 15:43:35 +01:00
|
|
|
this,
|
2020-02-28 18:43:27 +01:00
|
|
|
this.passwordGenerationService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.platformUtilsService,
|
2020-04-06 17:40:16 +02:00
|
|
|
this.vaultTimeoutService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2021-10-15 15:09:13 +02:00
|
|
|
this.notificationBackground = new NotificationBackground(
|
2021-12-21 15:43:35 +01:00
|
|
|
this,
|
2021-10-15 15:03:25 +02:00
|
|
|
this.autofillService,
|
2021-02-03 20:36:05 +01:00
|
|
|
this.cipherService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.vaultTimeoutService,
|
2021-10-21 11:10:46 +02:00
|
|
|
this.policyService,
|
2021-05-13 02:51:07 +02:00
|
|
|
this.folderService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
|
|
|
|
2021-10-15 15:09:13 +02:00
|
|
|
this.tabsBackground = new TabsBackground(this, this.notificationBackground);
|
2020-04-06 17:40:16 +02:00
|
|
|
this.contextMenusBackground = new ContextMenusBackground(
|
2021-12-21 15:43:35 +01:00
|
|
|
this,
|
2021-02-03 20:36:05 +01:00
|
|
|
this.cipherService,
|
2020-02-28 18:43:27 +01:00
|
|
|
this.passwordGenerationService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.platformUtilsService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.vaultTimeoutService,
|
2021-10-21 11:10:46 +02:00
|
|
|
this.eventService,
|
2019-07-12 20:54:17 +02:00
|
|
|
this.totpService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2021-02-03 20:36:05 +01:00
|
|
|
this.idleBackground = new IdleBackground(
|
2021-11-09 18:59:51 +01:00
|
|
|
this.vaultTimeoutService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.stateService,
|
2018-08-23 15:26:07 +02:00
|
|
|
this.notificationsService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2021-02-03 20:36:05 +01:00
|
|
|
this.webRequestBackground = new WebRequestBackground(
|
2021-03-17 22:14:26 +01:00
|
|
|
this.platformUtilsService,
|
2021-02-03 20:36:05 +01:00
|
|
|
this.cipherService,
|
2020-04-06 17:40:16 +02:00
|
|
|
this.vaultTimeoutService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
2021-02-03 20:36:05 +01:00
|
|
|
this.windowsBackground = new WindowsBackground(this);
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2022-02-08 00:06:37 +01:00
|
|
|
this.twoFactorService = new TwoFactorService(this.i18nService, this.platformUtilsService);
|
|
|
|
|
2022-02-24 18:14:04 +01:00
|
|
|
// eslint-disable-next-line
|
2020-04-08 02:19:47 +02:00
|
|
|
const that = this;
|
2022-01-27 22:22:51 +01:00
|
|
|
const backgroundMessagingService = new (class extends MessagingServiceAbstraction {
|
|
|
|
// AuthService should send the messages to the background not popup.
|
|
|
|
send = (subscriber: string, arg: any = {}) => {
|
|
|
|
const message = Object.assign({}, { command: subscriber }, arg);
|
|
|
|
that.runtimeBackground.processMessage(message, that, null);
|
|
|
|
};
|
|
|
|
})();
|
2019-07-12 20:54:17 +02:00
|
|
|
this.authService = new AuthService(
|
2020-02-28 18:43:27 +01:00
|
|
|
this.cryptoService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.apiService,
|
2020-04-06 17:40:16 +02:00
|
|
|
this.tokenService,
|
2021-03-17 22:14:26 +01:00
|
|
|
this.appIdService,
|
|
|
|
this.platformUtilsService,
|
2022-01-27 22:22:51 +01:00
|
|
|
backgroundMessagingService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.logService,
|
2022-01-27 22:22:51 +01:00
|
|
|
this.keyConnectorService,
|
2021-11-09 18:59:51 +01:00
|
|
|
this.environmentService,
|
2022-02-08 00:06:37 +01:00
|
|
|
this.stateService,
|
2022-02-24 15:33:58 +01:00
|
|
|
this.twoFactorService,
|
|
|
|
this.i18nService
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2017-12-06 05:37:32 +01:00
|
|
|
async bootstrap() {
|
2018-01-07 06:15:12 +01:00
|
|
|
this.containerService.attachToWindow(window);
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
await this.stateService.init();
|
|
|
|
|
2020-04-06 17:40:16 +02:00
|
|
|
await (this.vaultTimeoutService as VaultTimeoutService).init(true);
|
2017-12-07 22:02:15 +01:00
|
|
|
await (this.i18nService as I18nService).init();
|
|
|
|
await (this.eventService as EventService).init(true);
|
2018-01-12 18:22:55 +01:00
|
|
|
await this.runtimeBackground.init();
|
2017-12-07 22:02:15 +01:00
|
|
|
await this.notificationBackground.init();
|
2018-01-17 15:12:16 +01:00
|
|
|
await this.commandsBackground.init();
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2022-02-08 00:06:37 +01:00
|
|
|
this.twoFactorService.init();
|
|
|
|
|
2021-02-03 20:36:05 +01:00
|
|
|
await this.tabsBackground.init();
|
2017-12-07 22:02:15 +01:00
|
|
|
await this.contextMenusBackground.init();
|
2021-02-03 20:36:05 +01:00
|
|
|
await this.idleBackground.init();
|
|
|
|
await this.webRequestBackground.init();
|
|
|
|
await this.windowsBackground.init();
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2022-02-15 23:06:35 +01:00
|
|
|
if (this.platformUtilsService.isFirefox && !this.isPrivateMode) {
|
|
|
|
// Set new Private Mode windows to the default icon - they do not share state with the background page
|
|
|
|
BrowserApi.onWindowCreated(async (win) => {
|
|
|
|
if (win.incognito) {
|
|
|
|
await this.actionSetIcon(chrome.browserAction, "", win.id);
|
|
|
|
await this.actionSetIcon(this.sidebarAction, "", win.id);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-12-07 22:02:15 +01:00
|
|
|
return new Promise<void>((resolve) => {
|
2019-02-14 06:46:28 +01:00
|
|
|
setTimeout(async () => {
|
2017-12-07 22:02:15 +01:00
|
|
|
await this.environmentService.setUrlsFromStorage();
|
|
|
|
await this.setIcon();
|
2017-12-06 05:28:31 +01:00
|
|
|
this.fullSync(true);
|
2017-12-07 22:02:15 +01:00
|
|
|
setTimeout(() => this.notificationsService.init(), 2500);
|
2019-02-13 17:34:42 +01:00
|
|
|
resolve();
|
2021-12-21 15:43:35 +01:00
|
|
|
}, 500);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2017-12-07 22:02:15 +01:00
|
|
|
async setIcon() {
|
2022-02-15 23:06:35 +01:00
|
|
|
if ((!chrome.browserAction && !this.sidebarAction) || this.isPrivateMode) {
|
2017-12-07 22:02:15 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
const isAuthenticated = await this.stateService.getIsAuthenticated();
|
2020-04-08 02:19:47 +02:00
|
|
|
const locked = await this.vaultTimeoutService.isLocked();
|
2018-03-04 04:48:38 +01:00
|
|
|
|
|
|
|
let suffix = "";
|
|
|
|
if (!isAuthenticated) {
|
|
|
|
suffix = "_gray";
|
|
|
|
} else if (locked) {
|
|
|
|
suffix = "_locked";
|
2017-12-07 22:02:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
await this.actionSetIcon(chrome.browserAction, suffix);
|
2018-05-16 05:27:06 +02:00
|
|
|
await this.actionSetIcon(this.sidebarAction, suffix);
|
2018-01-04 22:06:00 +01:00
|
|
|
}
|
2017-12-07 22:02:15 +01:00
|
|
|
|
2022-02-24 18:14:04 +01:00
|
|
|
async refreshBadgeAndMenu(forLocked = false) {
|
2019-02-27 17:57:29 +01:00
|
|
|
if (!chrome.windows || !chrome.contextMenus) {
|
|
|
|
return;
|
2017-12-07 22:02:15 +01:00
|
|
|
}
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
const menuDisabled = await this.stateService.getDisableContextMenuItem();
|
2017-12-07 22:02:15 +01:00
|
|
|
if (!menuDisabled) {
|
|
|
|
await this.buildContextMenu();
|
|
|
|
} else {
|
|
|
|
await this.contextMenusRemoveAll();
|
|
|
|
}
|
|
|
|
|
2019-08-19 21:57:34 +02:00
|
|
|
if (forLocked) {
|
2019-09-21 15:50:57 +02:00
|
|
|
await this.loadMenuAndUpdateBadgeForNoAccessState(!menuDisabled);
|
|
|
|
this.onUpdatedRan = this.onReplacedRan = false;
|
|
|
|
return;
|
2018-01-18 22:17:58 +01:00
|
|
|
}
|
|
|
|
|
2020-04-06 17:40:16 +02:00
|
|
|
const tab = await BrowserApi.getTabFromCurrentWindow();
|
2018-03-04 04:48:38 +01:00
|
|
|
if (tab) {
|
2020-04-06 17:40:16 +02:00
|
|
|
await this.contextMenuReady(tab, !menuDisabled);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
async logout(expired: boolean, userId?: string) {
|
|
|
|
await this.eventService.uploadEvents(userId);
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2017-12-07 22:02:15 +01:00
|
|
|
await Promise.all([
|
2022-01-27 22:22:51 +01:00
|
|
|
this.eventService.clearEvents(userId),
|
|
|
|
this.syncService.setLastSync(new Date(0), userId),
|
|
|
|
this.cryptoService.clearKeys(userId),
|
2020-04-06 17:40:16 +02:00
|
|
|
this.settingsService.clear(userId),
|
2017-12-07 22:02:15 +01:00
|
|
|
this.cipherService.clear(userId),
|
|
|
|
this.folderService.clear(userId),
|
2020-01-29 04:35:40 +01:00
|
|
|
this.collectionService.clear(userId),
|
|
|
|
this.policyService.clear(userId),
|
2022-01-27 22:22:51 +01:00
|
|
|
this.passwordGenerationService.clear(userId),
|
|
|
|
this.vaultTimeoutService.clear(userId),
|
2021-11-09 18:59:51 +01:00
|
|
|
this.keyConnectorService.clear(),
|
2021-12-21 15:43:35 +01:00
|
|
|
]);
|
|
|
|
|
2022-02-08 15:42:42 +01:00
|
|
|
await this.stateService.clean({ userId: userId });
|
2022-02-07 21:09:43 +01:00
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
if (userId == null || userId === (await this.stateService.getUserId())) {
|
|
|
|
this.searchService.clearIndex();
|
|
|
|
this.messagingService.send("doneLoggingOut", { expired: expired, userId: userId });
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2017-12-07 22:02:15 +01:00
|
|
|
await this.setIcon();
|
2020-04-06 17:40:16 +02:00
|
|
|
await this.refreshBadgeAndMenu();
|
2019-02-13 17:34:42 +01:00
|
|
|
await this.reseedStorage();
|
2018-08-23 15:26:07 +02:00
|
|
|
this.notificationsService.updateConnection(false);
|
2019-02-27 17:57:29 +01:00
|
|
|
await this.systemService.clearPendingClipboard();
|
2022-01-27 22:22:51 +01:00
|
|
|
await this.reloadProcess();
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
|
2020-04-06 17:40:16 +02:00
|
|
|
async collectPageDetailsForContentScript(tab: any, sender: string, frameId: number = null) {
|
|
|
|
if (tab == null || !tab.id) {
|
2019-02-13 17:34:42 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const options: any = {};
|
|
|
|
if (frameId != null) {
|
|
|
|
options.frameId = frameId;
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2019-02-13 17:34:42 +01:00
|
|
|
|
|
|
|
BrowserApi.tabSendMessage(
|
2021-12-21 15:43:35 +01:00
|
|
|
tab,
|
|
|
|
{
|
2017-12-07 22:02:15 +01:00
|
|
|
command: "collectPageDetails",
|
|
|
|
tab: tab,
|
|
|
|
sender: sender,
|
2021-12-21 15:43:35 +01:00
|
|
|
},
|
|
|
|
options
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-02-13 17:34:42 +01:00
|
|
|
async openPopup() {
|
|
|
|
// Chrome APIs cannot open popup
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2019-02-13 17:34:42 +01:00
|
|
|
// TODO: Do we need to open this popup?
|
|
|
|
if (!this.isSafari) {
|
2021-12-21 15:43:35 +01:00
|
|
|
return;
|
|
|
|
}
|
2019-02-13 17:34:42 +01:00
|
|
|
await SafariApp.sendMessageToApp("showPopover", null, true);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
|
2019-02-13 17:34:42 +01:00
|
|
|
async reseedStorage() {
|
2021-12-21 15:43:35 +01:00
|
|
|
if (
|
2019-02-13 17:34:42 +01:00
|
|
|
!this.platformUtilsService.isChrome() &&
|
|
|
|
!this.platformUtilsService.isVivaldi() &&
|
|
|
|
!this.platformUtilsService.isOpera()
|
2021-12-21 15:43:35 +01:00
|
|
|
) {
|
|
|
|
return;
|
2019-02-13 17:34:42 +01:00
|
|
|
}
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
const currentVaultTimeout = await this.stateService.getVaultTimeout();
|
2021-02-03 20:36:05 +01:00
|
|
|
if (currentVaultTimeout == null) {
|
2017-12-05 23:04:30 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const getStorage = (): Promise<any> =>
|
2020-09-15 16:50:45 +02:00
|
|
|
new Promise((resolve) => {
|
|
|
|
chrome.storage.local.get(null, (o: any) => resolve(o));
|
2017-12-05 23:04:30 +01:00
|
|
|
});
|
|
|
|
|
2020-09-15 16:50:45 +02:00
|
|
|
const clearStorage = (): Promise<void> =>
|
|
|
|
new Promise((resolve) => {
|
|
|
|
chrome.storage.local.clear(() => resolve());
|
|
|
|
});
|
|
|
|
|
|
|
|
const storage = await getStorage();
|
|
|
|
await clearStorage();
|
|
|
|
|
2021-09-01 23:51:43 +02:00
|
|
|
for (const key in storage) {
|
2022-02-24 18:14:04 +01:00
|
|
|
// eslint-disable-next-line
|
2021-09-01 23:51:43 +02:00
|
|
|
if (!storage.hasOwnProperty(key)) {
|
|
|
|
continue;
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2021-09-01 23:51:43 +02:00
|
|
|
await this.storageService.save(key, storage[key]);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2021-09-01 23:51:43 +02:00
|
|
|
}
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
private async buildContextMenu() {
|
|
|
|
if (!chrome.contextMenus || this.buildingContextMenu) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.buildingContextMenu = true;
|
|
|
|
await this.contextMenusRemoveAll();
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
await this.contextMenusCreate({
|
|
|
|
type: "normal",
|
2021-12-21 15:43:35 +01:00
|
|
|
id: "root",
|
2017-12-05 23:04:30 +01:00
|
|
|
contexts: ["all"],
|
2018-02-27 19:37:57 +01:00
|
|
|
title: "Bitwarden",
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
await this.contextMenusCreate({
|
|
|
|
type: "normal",
|
|
|
|
id: "autofill",
|
|
|
|
parentId: "root",
|
|
|
|
contexts: ["all"],
|
|
|
|
title: this.i18nService.t("autoFill"),
|
|
|
|
});
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
await this.contextMenusCreate({
|
2020-03-03 16:40:06 +01:00
|
|
|
type: "normal",
|
2017-12-05 23:04:30 +01:00
|
|
|
id: "copy-username",
|
2021-09-01 23:51:43 +02:00
|
|
|
parentId: "root",
|
2020-03-03 16:40:06 +01:00
|
|
|
contexts: ["all"],
|
2020-09-15 16:50:45 +02:00
|
|
|
title: this.i18nService.t("copyUsername"),
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
|
2020-03-03 16:40:06 +01:00
|
|
|
await this.contextMenusCreate({
|
|
|
|
type: "normal",
|
2017-12-05 23:04:30 +01:00
|
|
|
id: "copy-password",
|
2021-09-01 23:51:43 +02:00
|
|
|
parentId: "root",
|
2017-12-05 23:04:30 +01:00
|
|
|
contexts: ["all"],
|
2020-09-15 16:50:45 +02:00
|
|
|
title: this.i18nService.t("copyPassword"),
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
if (await this.stateService.getCanAccessPremium()) {
|
2020-03-03 16:40:06 +01:00
|
|
|
await this.contextMenusCreate({
|
|
|
|
type: "normal",
|
|
|
|
id: "copy-totp",
|
2021-09-01 23:51:43 +02:00
|
|
|
parentId: "root",
|
2020-03-03 16:40:06 +01:00
|
|
|
contexts: ["all"],
|
2020-09-15 16:50:45 +02:00
|
|
|
title: this.i18nService.t("copyVerificationCode"),
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
|
|
|
|
2020-03-03 16:40:06 +01:00
|
|
|
await this.contextMenusCreate({
|
2021-12-21 15:43:35 +01:00
|
|
|
type: "separator",
|
2021-09-01 23:51:43 +02:00
|
|
|
parentId: "root",
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
|
2020-03-03 16:40:06 +01:00
|
|
|
await this.contextMenusCreate({
|
|
|
|
type: "normal",
|
2020-09-15 16:50:45 +02:00
|
|
|
id: "generate-password",
|
2021-09-01 23:51:43 +02:00
|
|
|
parentId: "root",
|
2020-03-03 16:40:06 +01:00
|
|
|
contexts: ["all"],
|
2020-09-15 16:50:45 +02:00
|
|
|
title: this.i18nService.t("generatePasswordCopied"),
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
|
2020-03-03 16:40:06 +01:00
|
|
|
await this.contextMenusCreate({
|
|
|
|
type: "normal",
|
2021-09-01 23:51:43 +02:00
|
|
|
id: "copy-identifier",
|
|
|
|
parentId: "root",
|
2020-03-03 16:40:06 +01:00
|
|
|
contexts: ["all"],
|
2020-09-15 16:50:45 +02:00
|
|
|
title: this.i18nService.t("copyElementIdentifier"),
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
this.buildingContextMenu = false;
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
private async contextMenuReady(tab: any, contextMenuEnabled: boolean) {
|
2020-04-08 02:19:47 +02:00
|
|
|
await this.loadMenuAndUpdateBadge(tab.url, tab.id, contextMenuEnabled);
|
2018-03-04 04:48:38 +01:00
|
|
|
this.onUpdatedRan = this.onReplacedRan = false;
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
private async loadMenuAndUpdateBadge(url: string, tabId: number, contextMenuEnabled: boolean) {
|
|
|
|
if (!url || (!chrome.browserAction && !this.sidebarAction)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.actionSetBadgeBackgroundColor(chrome.browserAction);
|
2019-03-06 22:50:04 +01:00
|
|
|
this.actionSetBadgeBackgroundColor(this.sidebarAction);
|
|
|
|
|
2020-04-08 02:19:47 +02:00
|
|
|
this.menuOptionsLoaded = [];
|
|
|
|
const locked = await this.vaultTimeoutService.isLocked();
|
|
|
|
if (!locked) {
|
2021-12-21 15:43:35 +01:00
|
|
|
try {
|
2020-04-08 02:19:47 +02:00
|
|
|
const ciphers = await this.cipherService.getAllDecryptedForUrl(url);
|
|
|
|
ciphers.sort((a, b) => this.cipherService.sortCiphersByLastUsedThenName(a, b));
|
2018-03-04 04:48:38 +01:00
|
|
|
|
|
|
|
if (contextMenuEnabled) {
|
2020-04-08 02:19:47 +02:00
|
|
|
ciphers.forEach((cipher) => {
|
|
|
|
this.loadLoginContextMenuOptions(cipher);
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
2018-03-04 04:48:38 +01:00
|
|
|
}
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
const disableBadgeCounter = await this.stateService.getDisableBadgeCounter();
|
2018-03-04 04:48:38 +01:00
|
|
|
let theText = "";
|
2017-12-05 23:04:30 +01:00
|
|
|
|
|
|
|
if (!disableBadgeCounter) {
|
2021-05-03 20:56:38 +02:00
|
|
|
if (ciphers.length > 0 && ciphers.length <= 9) {
|
|
|
|
theText = ciphers.length.toString();
|
|
|
|
} else if (ciphers.length > 0) {
|
2017-12-05 23:04:30 +01:00
|
|
|
theText = "9+";
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
|
|
|
|
2017-12-07 03:54:38 +01:00
|
|
|
if (contextMenuEnabled && ciphers.length === 0) {
|
|
|
|
await this.loadNoLoginsContextMenuOptions(this.i18nService.t("noMatchingLogins"));
|
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
|
|
|
|
this.sidebarActionSetBadgeText(theText, tabId);
|
|
|
|
this.browserActionSetBadgeText(theText, tabId);
|
2021-12-21 15:43:35 +01:00
|
|
|
|
|
|
|
return;
|
2021-10-21 11:10:46 +02:00
|
|
|
} catch (e) {
|
2017-12-05 23:04:30 +01:00
|
|
|
this.logService.error(e);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
await this.loadMenuAndUpdateBadgeForNoAccessState(contextMenuEnabled);
|
|
|
|
}
|
|
|
|
|
2020-04-08 02:19:47 +02:00
|
|
|
private async loadMenuAndUpdateBadgeForNoAccessState(contextMenuEnabled: boolean) {
|
2018-03-04 04:48:38 +01:00
|
|
|
if (contextMenuEnabled) {
|
2022-01-27 22:22:51 +01:00
|
|
|
const authed = await this.stateService.getIsAuthenticated();
|
2017-12-05 23:04:30 +01:00
|
|
|
await this.loadNoLoginsContextMenuOptions(
|
2022-01-25 08:17:01 +01:00
|
|
|
this.i18nService.t(authed ? "unlockVaultMenu" : "loginToVaultMenu")
|
2021-12-21 15:43:35 +01:00
|
|
|
);
|
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
|
2017-12-07 04:10:02 +01:00
|
|
|
const tabs = await BrowserApi.getActiveTabs();
|
|
|
|
if (tabs != null) {
|
|
|
|
tabs.forEach((tab) => {
|
|
|
|
if (tab.id != null) {
|
2017-12-05 23:04:30 +01:00
|
|
|
this.browserActionSetBadgeText("", tab.id);
|
2020-04-06 17:25:07 +02:00
|
|
|
this.sidebarActionSetBadgeText("", tab.id);
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
private async loadLoginContextMenuOptions(cipher: any) {
|
2021-12-21 15:43:35 +01:00
|
|
|
if (
|
2020-05-26 20:53:17 +02:00
|
|
|
cipher == null ||
|
2018-01-09 20:26:20 +01:00
|
|
|
cipher.type !== CipherType.Login ||
|
2021-05-03 20:56:38 +02:00
|
|
|
cipher.reprompt !== CipherRepromptType.None
|
2021-12-21 15:43:35 +01:00
|
|
|
) {
|
|
|
|
return;
|
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
|
2017-12-07 04:10:02 +01:00
|
|
|
let title = cipher.name;
|
|
|
|
if (cipher.login.username && cipher.login.username !== "") {
|
|
|
|
title += " (" + cipher.login.username + ")";
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-07 04:10:02 +01:00
|
|
|
await this.loadContextMenuOptions(title, cipher.id, cipher);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
private async loadNoLoginsContextMenuOptions(noLoginsMessage: string) {
|
|
|
|
await this.loadContextMenuOptions(noLoginsMessage, "noop", null);
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
|
2020-04-06 17:25:07 +02:00
|
|
|
private async loadContextMenuOptions(title: string, idSuffix: string, cipher: any) {
|
2021-12-21 15:43:35 +01:00
|
|
|
if (
|
2021-02-03 20:36:05 +01:00
|
|
|
!chrome.contextMenus ||
|
2020-04-06 17:25:07 +02:00
|
|
|
this.menuOptionsLoaded.indexOf(idSuffix) > -1 ||
|
2018-01-09 20:26:20 +01:00
|
|
|
(cipher != null && cipher.type !== CipherType.Login)
|
2021-12-21 15:43:35 +01:00
|
|
|
) {
|
2017-12-05 23:04:30 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-04-06 17:25:07 +02:00
|
|
|
this.menuOptionsLoaded.push(idSuffix);
|
2020-03-03 16:40:06 +01:00
|
|
|
|
2020-05-26 20:53:17 +02:00
|
|
|
if (cipher == null || (cipher.login.password && cipher.login.password !== "")) {
|
2020-03-03 16:40:06 +01:00
|
|
|
await this.contextMenusCreate({
|
|
|
|
type: "normal",
|
|
|
|
id: "autofill_" + idSuffix,
|
|
|
|
parentId: "autofill",
|
|
|
|
contexts: ["all"],
|
2020-04-06 17:25:07 +02:00
|
|
|
title: this.sanitizeContextMenuTitle(title),
|
2020-03-03 16:40:06 +01:00
|
|
|
});
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
|
|
|
|
2020-04-06 17:25:07 +02:00
|
|
|
if (cipher == null || (cipher.login.username && cipher.login.username !== "")) {
|
|
|
|
await this.contextMenusCreate({
|
2017-12-05 23:04:30 +01:00
|
|
|
type: "normal",
|
|
|
|
id: "copy-username_" + idSuffix,
|
2020-04-06 17:25:07 +02:00
|
|
|
parentId: "copy-username",
|
2017-12-05 23:04:30 +01:00
|
|
|
contexts: ["all"],
|
2020-04-06 17:25:07 +02:00
|
|
|
title: this.sanitizeContextMenuTitle(title),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-12-21 15:43:35 +01:00
|
|
|
if (
|
2017-12-06 05:28:31 +01:00
|
|
|
cipher == null ||
|
|
|
|
(cipher.login.password && cipher.login.password !== "" && cipher.viewPassword)
|
2021-12-21 15:43:35 +01:00
|
|
|
) {
|
2017-12-06 05:28:31 +01:00
|
|
|
await this.contextMenusCreate({
|
2017-12-05 23:04:30 +01:00
|
|
|
type: "normal",
|
2017-12-06 05:28:31 +01:00
|
|
|
id: "copy-password_" + idSuffix,
|
2017-12-05 23:04:30 +01:00
|
|
|
parentId: "copy-password",
|
2017-12-06 05:28:31 +01:00
|
|
|
contexts: ["all"],
|
|
|
|
title: this.sanitizeContextMenuTitle(title),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-01-27 22:22:51 +01:00
|
|
|
const canAccessPremium = await this.stateService.getCanAccessPremium();
|
2017-12-06 05:28:31 +01:00
|
|
|
if (canAccessPremium && (cipher == null || (cipher.login.totp && cipher.login.totp !== ""))) {
|
|
|
|
await this.contextMenusCreate({
|
2017-12-05 23:04:30 +01:00
|
|
|
type: "normal",
|
|
|
|
id: "copy-totp_" + idSuffix,
|
|
|
|
parentId: "copy-totp",
|
2017-12-06 05:28:31 +01:00
|
|
|
contexts: ["all"],
|
|
|
|
title: this.sanitizeContextMenuTitle(title),
|
|
|
|
});
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-06 05:28:31 +01:00
|
|
|
|
|
|
|
private sanitizeContextMenuTitle(title: string): string {
|
|
|
|
return title.replace(/&/g, "&&");
|
|
|
|
}
|
|
|
|
|
2022-02-24 18:14:04 +01:00
|
|
|
private async fullSync(override = false) {
|
2017-12-06 05:28:31 +01:00
|
|
|
const syncInternal = 6 * 60 * 60 * 1000; // 6 hours
|
|
|
|
const lastSync = await this.syncService.getLastSync();
|
|
|
|
|
|
|
|
let lastSyncAgo = syncInternal + 1;
|
|
|
|
if (lastSync != null) {
|
|
|
|
lastSyncAgo = new Date().getTime() - lastSync.getTime();
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
|
|
|
|
if (override || lastSyncAgo >= syncInternal) {
|
|
|
|
await this.syncService.fullSync(override);
|
|
|
|
this.scheduleNextSync();
|
|
|
|
} else {
|
|
|
|
this.scheduleNextSync();
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
|
|
|
|
private scheduleNextSync() {
|
|
|
|
if (this.syncTimeout) {
|
|
|
|
clearTimeout(this.syncTimeout);
|
|
|
|
}
|
|
|
|
|
2017-12-07 03:54:38 +01:00
|
|
|
this.syncTimeout = setTimeout(async () => await this.fullSync(), 5 * 60 * 1000); // check every 5 minutes
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
|
|
|
|
2017-12-07 03:54:38 +01:00
|
|
|
// Browser API Helpers
|
|
|
|
|
2021-03-01 17:32:18 +01:00
|
|
|
private contextMenusRemoveAll() {
|
2021-03-29 17:16:31 +02:00
|
|
|
return new Promise<void>((resolve) => {
|
2017-12-07 03:54:38 +01:00
|
|
|
chrome.contextMenus.removeAll(() => {
|
|
|
|
resolve();
|
|
|
|
if (chrome.runtime.lastError) {
|
2017-12-05 23:04:30 +01:00
|
|
|
return;
|
2017-12-07 03:54:38 +01:00
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
});
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private contextMenusCreate(options: any) {
|
|
|
|
return new Promise<void>((resolve) => {
|
|
|
|
chrome.contextMenus.create(options, () => {
|
|
|
|
resolve();
|
|
|
|
if (chrome.runtime.lastError) {
|
|
|
|
return;
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-02-15 23:06:35 +01:00
|
|
|
private async actionSetIcon(theAction: any, suffix: string, windowId?: number): Promise<any> {
|
2017-12-05 23:04:30 +01:00
|
|
|
if (!theAction || !theAction.setIcon) {
|
2021-12-21 15:43:35 +01:00
|
|
|
return;
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
const options = {
|
|
|
|
path: {
|
|
|
|
19: "images/icon19" + suffix + ".png",
|
2017-12-07 03:54:38 +01:00
|
|
|
38: "images/icon38" + suffix + ".png",
|
2021-12-21 15:43:35 +01:00
|
|
|
},
|
2022-02-15 23:06:35 +01:00
|
|
|
windowId: windowId,
|
2021-12-21 15:43:35 +01:00
|
|
|
};
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
if (this.platformUtilsService.isFirefox()) {
|
|
|
|
await theAction.setIcon(options);
|
|
|
|
} else if (this.platformUtilsService.isSafari()) {
|
|
|
|
// Workaround since Safari 14.0.3 returns a pending promise
|
|
|
|
// which doesn't resolve within a reasonable time.
|
|
|
|
theAction.setIcon(options);
|
2021-12-21 15:43:35 +01:00
|
|
|
} else {
|
2017-12-05 23:04:30 +01:00
|
|
|
return new Promise<void>((resolve) => {
|
|
|
|
theAction.setIcon(options, () => resolve());
|
|
|
|
});
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
|
|
|
|
private actionSetBadgeBackgroundColor(action: any) {
|
|
|
|
if (action && action.setBadgeBackgroundColor) {
|
|
|
|
action.setBadgeBackgroundColor({ color: "#294e5f" });
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
private browserActionSetBadgeText(text: string, tabId: number) {
|
|
|
|
if (chrome.browserAction && chrome.browserAction.setBadgeText) {
|
|
|
|
chrome.browserAction.setBadgeText({
|
|
|
|
text: text,
|
2017-12-06 05:28:31 +01:00
|
|
|
tabId: tabId,
|
2017-12-05 23:04:30 +01:00
|
|
|
});
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
|
|
|
|
private sidebarActionSetBadgeText(text: string, tabId: number) {
|
2021-02-03 20:36:05 +01:00
|
|
|
if (!this.sidebarAction) {
|
2021-12-21 15:43:35 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
if (this.sidebarAction.setBadgeText) {
|
|
|
|
this.sidebarAction.setBadgeText({
|
|
|
|
text: text,
|
2017-12-06 05:28:31 +01:00
|
|
|
tabId: tabId,
|
2017-12-05 23:04:30 +01:00
|
|
|
});
|
|
|
|
} else if (this.sidebarAction.setTitle) {
|
2018-02-27 19:37:57 +01:00
|
|
|
let title = "Bitwarden";
|
2017-12-05 23:04:30 +01:00
|
|
|
if (text && text !== "") {
|
|
|
|
title += " [" + text + "]";
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
|
2017-12-05 23:04:30 +01:00
|
|
|
this.sidebarAction.setTitle({
|
|
|
|
title: title,
|
2017-12-06 05:28:31 +01:00
|
|
|
tabId: tabId,
|
2017-12-05 23:04:30 +01:00
|
|
|
});
|
|
|
|
}
|
2021-12-21 15:43:35 +01:00
|
|
|
}
|
2022-01-27 22:22:51 +01:00
|
|
|
|
|
|
|
private async reloadProcess(): Promise<void> {
|
2022-02-08 15:42:42 +01:00
|
|
|
const accounts = this.stateService.accounts.getValue();
|
|
|
|
if (accounts != null) {
|
|
|
|
for (const userId of Object.keys(accounts)) {
|
|
|
|
if (!(await this.vaultTimeoutService.isLocked(userId))) {
|
|
|
|
return;
|
|
|
|
}
|
2022-01-27 22:22:51 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
await this.systemService.startProcessReload();
|
|
|
|
}
|
2017-12-05 23:04:30 +01:00
|
|
|
}
|