diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml
index 41b2a188fab..56ad1fac9fc 100644
--- a/.github/workflows/build-cli.yml
+++ b/.github/workflows/build-cli.yml
@@ -72,7 +72,7 @@ jobs:
- setup
env:
_PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }}
- _WIN_PKG_FETCH_VERSION: 16.15.0
+ _WIN_PKG_FETCH_VERSION: 16.16.0
_WIN_PKG_VERSION: 3.4
steps:
- name: Checkout repo
diff --git a/README.md b/README.md
index a80918cf251..c04fbf66062 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
-
+
@@ -25,7 +25,7 @@
This repository houses all Bitwarden client applications except the [Mobile application](https://github.com/bitwarden/mobile).
-Please refer to the [Clients section](https://contributing.bitwarden.com/docs/clients/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
+Please refer to the [Clients section](https://contributing.bitwarden.com/getting-started/clients/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
## Related projects:
diff --git a/apps/browser/README.md b/apps/browser/README.md
index 863839fd800..2cd1615a112 100644
--- a/apps/browser/README.md
+++ b/apps/browser/README.md
@@ -19,4 +19,4 @@ The Bitwarden browser extension is written using the Web Extension API and Angul
## Documentation
-Please refer to the [Browser section](https://contributing.bitwarden.com/docs/clients/browser/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
+Please refer to the [Browser section](https://contributing.bitwarden.com/getting-started/clients/browser/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
diff --git a/apps/browser/src/background/contextMenus.background.ts b/apps/browser/src/background/contextMenus.background.ts
index 76fbfd78a97..98223280a23 100644
--- a/apps/browser/src/background/contextMenus.background.ts
+++ b/apps/browser/src/background/contextMenus.background.ts
@@ -1,6 +1,6 @@
import { AuthService } from "@bitwarden/common/abstractions/auth.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { PasswordGenerationService } from "@bitwarden/common/abstractions/passwordGeneration.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { TotpService } from "@bitwarden/common/abstractions/totp.service";
@@ -24,7 +24,7 @@ export default class ContextMenusBackground {
private passwordGenerationService: PasswordGenerationService,
private platformUtilsService: PlatformUtilsService,
private authService: AuthService,
- private eventService: EventService,
+ private eventCollectionService: EventCollectionService,
private totpService: TotpService
) {
this.contextMenus = chrome.contextMenus;
@@ -124,7 +124,7 @@ export default class ContextMenusBackground {
this.platformUtilsService.copyToClipboard(cipher.login.username, { window: window });
} else if (info.parentMenuItemId === "copy-password") {
this.platformUtilsService.copyToClipboard(cipher.login.password, { window: window });
- this.eventService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id);
} else if (info.parentMenuItemId === "copy-totp") {
const totpValue = await this.totpService.getCode(cipher.login.totp);
this.platformUtilsService.copyToClipboard(totpValue, { window: window });
diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts
index 2d370c91bb7..bd70ef57c98 100644
--- a/apps/browser/src/background/main.background.ts
+++ b/apps/browser/src/background/main.background.ts
@@ -7,7 +7,8 @@ import { CollectionService as CollectionServiceAbstraction } from "@bitwarden/co
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service";
import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/abstractions/cryptoFunction.service";
import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
-import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service";
+import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service";
import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service";
import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/abstractions/fileUpload.service";
import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction";
@@ -54,7 +55,8 @@ import { ConsoleLogService } from "@bitwarden/common/services/consoleLog.service
import { ContainerService } from "@bitwarden/common/services/container.service";
import { EncryptServiceImplementation } from "@bitwarden/common/services/cryptography/encrypt.service.implementation";
import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/services/cryptography/multithread-encrypt.service.implementation";
-import { EventService } from "@bitwarden/common/services/event.service";
+import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service";
+import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
import { ExportService } from "@bitwarden/common/services/export.service";
import { FileUploadService } from "@bitwarden/common/services/fileUpload.service";
import { FolderApiService } from "@bitwarden/common/services/folder/folder-api.service";
@@ -148,7 +150,8 @@ export default class MainBackground {
stateService: StateServiceAbstraction;
stateMigrationService: StateMigrationService;
systemService: SystemServiceAbstraction;
- eventService: EventServiceAbstraction;
+ eventCollectionService: EventCollectionServiceAbstraction;
+ eventUploadService: EventUploadServiceAbstraction;
policyService: InternalPolicyServiceAbstraction;
popupUtilsService: PopupUtilsService;
sendService: SendServiceAbstraction;
@@ -412,12 +415,16 @@ export default class MainBackground {
this.organizationService,
logoutCallback
);
- this.eventService = new EventService(
+ this.eventUploadService = new EventUploadService(
this.apiService,
+ this.stateService,
+ this.logService
+ );
+ this.eventCollectionService = new EventCollectionService(
this.cipherService,
this.stateService,
- this.logService,
- this.organizationService
+ this.organizationService,
+ this.eventUploadService
);
this.passwordGenerationService = new PasswordGenerationService(
this.cryptoService,
@@ -429,7 +436,7 @@ export default class MainBackground {
this.cipherService,
this.stateService,
this.totpService,
- this.eventService,
+ this.eventCollectionService,
this.logService
);
this.containerService = new ContainerService(this.cryptoService, this.encryptService);
@@ -532,7 +539,7 @@ export default class MainBackground {
this.passwordGenerationService,
this.platformUtilsService,
this.authService,
- this.eventService,
+ this.eventCollectionService,
this.totpService
);
this.idleBackground = new IdleBackground(
@@ -560,7 +567,7 @@ export default class MainBackground {
await (this.vaultTimeoutService as VaultTimeoutService).init(true);
await (this.i18nService as I18nService).init();
- await (this.eventService as EventService).init(true);
+ await (this.eventUploadService as EventUploadService).init(true);
await this.runtimeBackground.init();
await this.notificationBackground.init();
await this.commandsBackground.init();
@@ -626,10 +633,9 @@ export default class MainBackground {
}
async logout(expired: boolean, userId?: string) {
- await this.eventService.uploadEvents(userId);
+ await this.eventUploadService.uploadEvents(userId);
await Promise.all([
- this.eventService.clearEvents(userId),
this.syncService.setLastSync(new Date(0), userId),
this.cryptoService.clearKeys(userId),
this.settingsService.clear(userId),
diff --git a/apps/browser/src/background/service_factories/autofill-service.factory.ts b/apps/browser/src/background/service_factories/autofill-service.factory.ts
index a14cd1dd8c3..1df2ec9bbdf 100644
--- a/apps/browser/src/background/service_factories/autofill-service.factory.ts
+++ b/apps/browser/src/background/service_factories/autofill-service.factory.ts
@@ -2,7 +2,10 @@ import { AutofillService as AbstractAutoFillService } from "../../services/abstr
import AutofillService from "../../services/autofill.service";
import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory";
-import { EventServiceInitOptions, eventServiceFactory } from "./event-service.factory";
+import {
+ EventCollectionServiceInitOptions,
+ eventCollectionServiceFactory,
+} from "./event-collection-service.factory";
import { CachedServices, factory, FactoryOptions } from "./factory-options";
import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory";
import { stateServiceFactory, StateServiceInitOptions } from "./state-service.factory";
@@ -14,7 +17,7 @@ export type AutoFillServiceInitOptions = AutoFillServiceOptions &
CipherServiceInitOptions &
StateServiceInitOptions &
TotpServiceInitOptions &
- EventServiceInitOptions &
+ EventCollectionServiceInitOptions &
LogServiceInitOptions;
export function autofillServiceFactory(
@@ -30,7 +33,7 @@ export function autofillServiceFactory(
await cipherServiceFactory(cache, opts),
await stateServiceFactory(cache, opts),
await totpServiceFactory(cache, opts),
- await eventServiceFactory(cache, opts),
+ await eventCollectionServiceFactory(cache, opts),
await logServiceFactory(cache, opts)
)
);
diff --git a/apps/browser/src/background/service_factories/event-collection-service.factory.ts b/apps/browser/src/background/service_factories/event-collection-service.factory.ts
new file mode 100644
index 00000000000..477797d1b42
--- /dev/null
+++ b/apps/browser/src/background/service_factories/event-collection-service.factory.ts
@@ -0,0 +1,40 @@
+import { EventCollectionService as AbstractEventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
+import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service";
+
+import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory";
+import {
+ eventUploadServiceFactory,
+ EventUploadServiceInitOptions,
+} from "./event-upload-service.factory";
+import { FactoryOptions, CachedServices, factory } from "./factory-options";
+import {
+ organizationServiceFactory,
+ OrganizationServiceInitOptions,
+} from "./organization-service.factory";
+import { stateServiceFactory, StateServiceInitOptions } from "./state-service.factory";
+
+type EventCollectionServiceOptions = FactoryOptions;
+
+export type EventCollectionServiceInitOptions = EventCollectionServiceOptions &
+ CipherServiceInitOptions &
+ StateServiceInitOptions &
+ OrganizationServiceInitOptions &
+ EventUploadServiceInitOptions;
+
+export function eventCollectionServiceFactory(
+ cache: { eventCollectionService?: AbstractEventCollectionService } & CachedServices,
+ opts: EventCollectionServiceInitOptions
+): Promise {
+ return factory(
+ cache,
+ "eventCollectionService",
+ opts,
+ async () =>
+ new EventCollectionService(
+ await cipherServiceFactory(cache, opts),
+ await stateServiceFactory(cache, opts),
+ await organizationServiceFactory(cache, opts),
+ await eventUploadServiceFactory(cache, opts)
+ )
+ );
+}
diff --git a/apps/browser/src/background/service_factories/event-service.factory.ts b/apps/browser/src/background/service_factories/event-service.factory.ts
deleted file mode 100644
index 61a82ebeb19..00000000000
--- a/apps/browser/src/background/service_factories/event-service.factory.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { EventService as AbstractEventService } from "@bitwarden/common/abstractions/event.service";
-import { EventService } from "@bitwarden/common/services/event.service";
-
-import { apiServiceFactory, ApiServiceInitOptions } from "./api-service.factory";
-import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory";
-import { FactoryOptions, CachedServices, factory } from "./factory-options";
-import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory";
-import {
- organizationServiceFactory,
- OrganizationServiceInitOptions,
-} from "./organization-service.factory";
-import { stateServiceFactory, StateServiceInitOptions } from "./state-service.factory";
-
-type EventServiceOptions = FactoryOptions;
-
-export type EventServiceInitOptions = EventServiceOptions &
- ApiServiceInitOptions &
- CipherServiceInitOptions &
- StateServiceInitOptions &
- LogServiceInitOptions &
- OrganizationServiceInitOptions;
-
-export function eventServiceFactory(
- cache: { eventService?: AbstractEventService } & CachedServices,
- opts: EventServiceInitOptions
-): Promise {
- return factory(
- cache,
- "eventService",
- opts,
- async () =>
- new EventService(
- await apiServiceFactory(cache, opts),
- await cipherServiceFactory(cache, opts),
- await stateServiceFactory(cache, opts),
- await logServiceFactory(cache, opts),
- await organizationServiceFactory(cache, opts)
- )
- );
-}
diff --git a/apps/browser/src/background/service_factories/event-upload-service.factory.ts b/apps/browser/src/background/service_factories/event-upload-service.factory.ts
new file mode 100644
index 00000000000..c0ed0e5426d
--- /dev/null
+++ b/apps/browser/src/background/service_factories/event-upload-service.factory.ts
@@ -0,0 +1,31 @@
+import { EventUploadService as AbstractEventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
+import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
+
+import { apiServiceFactory, ApiServiceInitOptions } from "./api-service.factory";
+import { FactoryOptions, CachedServices, factory } from "./factory-options";
+import { logServiceFactory, LogServiceInitOptions } from "./log-service.factory";
+import { stateServiceFactory, StateServiceInitOptions } from "./state-service.factory";
+
+type EventUploadServiceOptions = FactoryOptions;
+
+export type EventUploadServiceInitOptions = EventUploadServiceOptions &
+ ApiServiceInitOptions &
+ StateServiceInitOptions &
+ LogServiceInitOptions;
+
+export function eventUploadServiceFactory(
+ cache: { eventUploadService?: AbstractEventUploadService } & CachedServices,
+ opts: EventUploadServiceInitOptions
+): Promise {
+ return factory(
+ cache,
+ "eventUploadService",
+ opts,
+ async () =>
+ new EventUploadService(
+ await apiServiceFactory(cache, opts),
+ await stateServiceFactory(cache, opts),
+ await logServiceFactory(cache, opts)
+ )
+ );
+}
diff --git a/apps/browser/src/popup/components/action-buttons.component.ts b/apps/browser/src/popup/components/action-buttons.component.ts
index 3df8e0d4cd5..60bc0051fbb 100644
--- a/apps/browser/src/popup/components/action-buttons.component.ts
+++ b/apps/browser/src/popup/components/action-buttons.component.ts
@@ -1,6 +1,6 @@
import { Component, EventEmitter, Input, Output } from "@angular/core";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
@@ -27,7 +27,7 @@ export class ActionButtonsComponent {
constructor(
private i18nService: I18nService,
private platformUtilsService: PlatformUtilsService,
- private eventService: EventService,
+ private eventCollectionService: EventCollectionService,
private totpService: TotpService,
private stateService: StateService,
private passwordRepromptService: PasswordRepromptService
@@ -68,9 +68,12 @@ export class ActionButtonsComponent {
);
if (typeI18nKey === "password" || typeI18nKey === "verificationCodeTotp") {
- this.eventService.collect(EventType.Cipher_ClientToggledHiddenFieldVisible, cipher.id);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledHiddenFieldVisible,
+ cipher.id
+ );
} else if (typeI18nKey === "securityCode") {
- this.eventService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
}
}
diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts
index 0acd8c785d1..b2039ba5996 100644
--- a/apps/browser/src/popup/services/services.module.ts
+++ b/apps/browser/src/popup/services/services.module.ts
@@ -15,7 +15,8 @@ import { CollectionService } from "@bitwarden/common/abstractions/collection.ser
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { CryptoFunctionService } from "@bitwarden/common/abstractions/cryptoFunction.service";
import { EnvironmentService } from "@bitwarden/common/abstractions/environment.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
+import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { FileUploadService } from "@bitwarden/common/abstractions/fileUpload.service";
@@ -195,7 +196,16 @@ function getBgService(service: keyof MainBackground) {
{ provide: TokenService, useFactory: getBgService("tokenService"), deps: [] },
{ provide: I18nService, useFactory: getBgService("i18nService"), deps: [] },
{ provide: CryptoService, useFactory: getBgService("cryptoService"), deps: [] },
- { provide: EventService, useFactory: getBgService("eventService"), deps: [] },
+ {
+ provide: EventUploadService,
+ useFactory: getBgService("eventUploadService"),
+ deps: [],
+ },
+ {
+ provide: EventCollectionService,
+ useFactory: getBgService("eventCollectionService"),
+ deps: [],
+ },
{
provide: PolicyService,
useFactory: (
diff --git a/apps/browser/src/popup/settings/export.component.ts b/apps/browser/src/popup/settings/export.component.ts
index 47301b5fdee..c13a495bc5a 100644
--- a/apps/browser/src/popup/settings/export.component.ts
+++ b/apps/browser/src/popup/settings/export.component.ts
@@ -4,7 +4,7 @@ import { Router } from "@angular/router";
import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/components/export.component";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -23,7 +23,7 @@ export class ExportComponent extends BaseExportComponent {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
exportService: ExportService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
private router: Router,
logService: LogService,
@@ -36,7 +36,7 @@ export class ExportComponent extends BaseExportComponent {
i18nService,
platformUtilsService,
exportService,
- eventService,
+ eventCollectionService,
policyService,
window,
logService,
diff --git a/apps/browser/src/popup/vault/add-edit-custom-fields.component.ts b/apps/browser/src/popup/vault/add-edit-custom-fields.component.ts
index 7e6e91686f8..44f9e9539ad 100644
--- a/apps/browser/src/popup/vault/add-edit-custom-fields.component.ts
+++ b/apps/browser/src/popup/vault/add-edit-custom-fields.component.ts
@@ -1,7 +1,7 @@
import { Component } from "@angular/core";
import { AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent } from "@bitwarden/angular/components/add-edit-custom-fields.component";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@Component({
@@ -9,7 +9,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
templateUrl: "add-edit-custom-fields.component.html",
})
export class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsComponent {
- constructor(i18nService: I18nService, eventService: EventService) {
- super(i18nService, eventService);
+ constructor(i18nService: I18nService, eventCollectionService: EventCollectionService) {
+ super(i18nService, eventCollectionService);
}
}
diff --git a/apps/browser/src/popup/vault/add-edit.component.ts b/apps/browser/src/popup/vault/add-edit.component.ts
index b890766f6b9..54d8fb1ade3 100644
--- a/apps/browser/src/popup/vault/add-edit.component.ts
+++ b/apps/browser/src/popup/vault/add-edit.component.ts
@@ -7,7 +7,7 @@ import { AddEditComponent as BaseAddEditComponent } from "@bitwarden/angular/com
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -46,7 +46,7 @@ export class AddEditComponent extends BaseAddEditComponent {
private route: ActivatedRoute,
private router: Router,
private location: Location,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
private popupUtilsService: PopupUtilsService,
organizationService: OrganizationService,
@@ -62,7 +62,7 @@ export class AddEditComponent extends BaseAddEditComponent {
stateService,
collectionService,
messagingService,
- eventService,
+ eventCollectionService,
policyService,
logService,
passwordRepromptService,
diff --git a/apps/browser/src/popup/vault/view-custom-fields.component.ts b/apps/browser/src/popup/vault/view-custom-fields.component.ts
index 7d9b338f0fa..3ea41db713c 100644
--- a/apps/browser/src/popup/vault/view-custom-fields.component.ts
+++ b/apps/browser/src/popup/vault/view-custom-fields.component.ts
@@ -1,14 +1,14 @@
import { Component } from "@angular/core";
import { ViewCustomFieldsComponent as BaseViewCustomFieldsComponent } from "@bitwarden/angular/components/view-custom-fields.component";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
@Component({
selector: "app-vault-view-custom-fields",
templateUrl: "view-custom-fields.component.html",
})
export class ViewCustomFieldsComponent extends BaseViewCustomFieldsComponent {
- constructor(eventService: EventService) {
- super(eventService);
+ constructor(eventCollectionService: EventCollectionService) {
+ super(eventCollectionService);
}
}
diff --git a/apps/browser/src/popup/vault/view.component.ts b/apps/browser/src/popup/vault/view.component.ts
index 75ab73b6dde..9a6aa03f189 100644
--- a/apps/browser/src/popup/vault/view.component.ts
+++ b/apps/browser/src/popup/vault/view.component.ts
@@ -9,7 +9,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -58,7 +58,7 @@ export class ViewComponent extends BaseViewComponent {
ngZone: NgZone,
changeDetectorRef: ChangeDetectorRef,
stateService: StateService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
private autofillService: AutofillService,
private messagingService: MessagingService,
private popupUtilsService: PopupUtilsService,
@@ -80,7 +80,7 @@ export class ViewComponent extends BaseViewComponent {
broadcasterService,
ngZone,
changeDetectorRef,
- eventService,
+ eventCollectionService,
apiService,
passwordRepromptService,
logService,
diff --git a/apps/browser/src/services/autofill.service.ts b/apps/browser/src/services/autofill.service.ts
index f458279de4a..60bcf3100f8 100644
--- a/apps/browser/src/services/autofill.service.ts
+++ b/apps/browser/src/services/autofill.service.ts
@@ -1,5 +1,5 @@
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { TotpService } from "@bitwarden/common/abstractions/totp.service";
import { CipherRepromptType } from "@bitwarden/common/enums/cipherRepromptType";
@@ -41,7 +41,7 @@ export default class AutofillService implements AutofillServiceInterface {
private cipherService: CipherService,
private stateService: BrowserStateService,
private totpService: TotpService,
- private eventService: EventService,
+ private eventCollectionService: EventCollectionService,
private logService: LogService
) {}
@@ -148,7 +148,7 @@ export default class AutofillService implements AutofillServiceInterface {
});
if (didAutofill) {
- this.eventService.collect(EventType.Cipher_ClientAutofilled, options.cipher.id);
+ this.eventCollectionService.collect(EventType.Cipher_ClientAutofilled, options.cipher.id);
if (totpPromise != null) {
return await totpPromise;
} else {
diff --git a/apps/cli/README.md b/apps/cli/README.md
index 49af8791e67..b2d87ebaf91 100644
--- a/apps/cli/README.md
+++ b/apps/cli/README.md
@@ -11,7 +11,7 @@ The Bitwarden CLI is a powerful, full-featured command-line interface (CLI) tool
## Developer Documentation
-Please refer to the [CLI section](https://contributing.bitwarden.com/docs/clients/cli/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
+Please refer to the [CLI section](https://contributing.bitwarden.com/getting-started/clients/cli/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
## User Documentation
diff --git a/apps/desktop/README.md b/apps/desktop/README.md
index ebde78b7698..6578699369b 100644
--- a/apps/desktop/README.md
+++ b/apps/desktop/README.md
@@ -12,4 +12,4 @@ The Bitwarden desktop app is written using Electron and Angular. The application
## Documentation
-Please refer to the [Desktop section](https://contributing.bitwarden.com/docs/clients/desktop/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
+Please refer to the [Desktop section](https://contributing.bitwarden.com/getting-started/clients/desktop/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index 0790f98f0d1..e66967ece2e 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -1,7 +1,7 @@
{
"name": "@bitwarden/desktop",
"description": "A secure and free password manager for all of your devices.",
- "version": "2022.11.0",
+ "version": "2022.11.1",
"keywords": [
"bitwarden",
"password",
diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts
index 82753a1776a..3d6d864f671 100644
--- a/apps/desktop/src/app/app.component.ts
+++ b/apps/desktop/src/app/app.component.ts
@@ -20,7 +20,7 @@ import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.s
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
import { InternalFolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { KeyConnectorService } from "@bitwarden/common/abstractions/keyConnector.service";
@@ -125,7 +125,7 @@ export class AppComponent implements OnInit, OnDestroy {
private platformUtilsService: PlatformUtilsService,
private systemService: SystemService,
private stateService: StateService,
- private eventService: EventService,
+ private eventUploadService: EventUploadService,
private policyService: InternalPolicyService,
private modalService: ModalService,
private keyConnectorService: KeyConnectorService
@@ -465,7 +465,7 @@ export class AppComponent implements OnInit, OnDestroy {
private async logOut(expired: boolean, userId?: string) {
const userBeingLoggedOut = await this.stateService.getUserId({ userId: userId });
await Promise.all([
- this.eventService.uploadEvents(userBeingLoggedOut),
+ this.eventUploadService.uploadEvents(userBeingLoggedOut),
this.syncService.setLastSync(new Date(0), userBeingLoggedOut),
this.cryptoService.clearKeys(userBeingLoggedOut),
this.settingsService.clear(userBeingLoggedOut),
diff --git a/apps/desktop/src/app/services/init.service.ts b/apps/desktop/src/app/services/init.service.ts
index c706136a758..fd29631ab4b 100644
--- a/apps/desktop/src/app/services/init.service.ts
+++ b/apps/desktop/src/app/services/init.service.ts
@@ -5,7 +5,7 @@ import { AbstractThemingService } from "@bitwarden/angular/services/theming/them
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service";
import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/common/abstractions/environment.service";
-import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service";
+import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service";
import { NotificationsService as NotificationsServiceAbstraction } from "@bitwarden/common/abstractions/notifications.service";
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/abstractions/platformUtils.service";
@@ -14,7 +14,7 @@ import { SyncService as SyncServiceAbstraction } from "@bitwarden/common/abstrac
import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/abstractions/twoFactor.service";
import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service";
import { ContainerService } from "@bitwarden/common/services/container.service";
-import { EventService } from "@bitwarden/common/services/event.service";
+import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
import { VaultTimeoutService } from "@bitwarden/common/services/vaultTimeout/vaultTimeout.service";
import { I18nService } from "../../services/i18n.service";
@@ -28,7 +28,7 @@ export class InitService {
private syncService: SyncServiceAbstraction,
private vaultTimeoutService: VaultTimeoutServiceAbstraction,
private i18nService: I18nServiceAbstraction,
- private eventService: EventServiceAbstraction,
+ private eventUploadService: EventUploadServiceAbstraction,
private twoFactorService: TwoFactorServiceAbstraction,
private notificationsService: NotificationsServiceAbstraction,
private platformUtilsService: PlatformUtilsServiceAbstraction,
@@ -48,7 +48,7 @@ export class InitService {
(this.vaultTimeoutService as VaultTimeoutService).init(true);
const locale = await this.stateService.getLocale();
await (this.i18nService as I18nService).init(locale);
- (this.eventService as EventService).init(true);
+ (this.eventUploadService as EventUploadService).init(true);
this.twoFactorService.init();
setTimeout(() => this.notificationsService.init(), 3000);
const htmlEl = this.win.document.documentElement;
diff --git a/apps/desktop/src/app/vault/add-edit-custom-fields.component.ts b/apps/desktop/src/app/vault/add-edit-custom-fields.component.ts
index 7e6e91686f8..44f9e9539ad 100644
--- a/apps/desktop/src/app/vault/add-edit-custom-fields.component.ts
+++ b/apps/desktop/src/app/vault/add-edit-custom-fields.component.ts
@@ -1,7 +1,7 @@
import { Component } from "@angular/core";
import { AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent } from "@bitwarden/angular/components/add-edit-custom-fields.component";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@Component({
@@ -9,7 +9,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
templateUrl: "add-edit-custom-fields.component.html",
})
export class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsComponent {
- constructor(i18nService: I18nService, eventService: EventService) {
- super(i18nService, eventService);
+ constructor(i18nService: I18nService, eventCollectionService: EventCollectionService) {
+ super(i18nService, eventCollectionService);
}
}
diff --git a/apps/desktop/src/app/vault/add-edit.component.ts b/apps/desktop/src/app/vault/add-edit.component.ts
index 38f49f9bc65..3cf9475b6b9 100644
--- a/apps/desktop/src/app/vault/add-edit.component.ts
+++ b/apps/desktop/src/app/vault/add-edit.component.ts
@@ -6,7 +6,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -35,7 +35,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges,
stateService: StateService,
collectionService: CollectionService,
messagingService: MessagingService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
passwordRepromptService: PasswordRepromptService,
private broadcasterService: BroadcasterService,
@@ -52,7 +52,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges,
stateService,
collectionService,
messagingService,
- eventService,
+ eventCollectionService,
policyService,
logService,
passwordRepromptService,
diff --git a/apps/desktop/src/app/vault/export.component.ts b/apps/desktop/src/app/vault/export.component.ts
index 4793a70b755..01859f4c4e3 100644
--- a/apps/desktop/src/app/vault/export.component.ts
+++ b/apps/desktop/src/app/vault/export.component.ts
@@ -6,7 +6,7 @@ import { UntypedFormBuilder } from "@angular/forms";
import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/components/export.component";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -27,7 +27,7 @@ export class ExportComponent extends BaseExportComponent implements OnInit {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
exportService: ExportService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
userVerificationService: UserVerificationService,
formBuilder: UntypedFormBuilder,
@@ -40,7 +40,7 @@ export class ExportComponent extends BaseExportComponent implements OnInit {
i18nService,
platformUtilsService,
exportService,
- eventService,
+ eventCollectionService,
policyService,
window,
logService,
diff --git a/apps/desktop/src/app/vault/vault.component.ts b/apps/desktop/src/app/vault/vault.component.ts
index 5681535e246..930e557a890 100644
--- a/apps/desktop/src/app/vault/vault.component.ts
+++ b/apps/desktop/src/app/vault/vault.component.ts
@@ -14,7 +14,7 @@ import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref";
import { ModalService } from "@bitwarden/angular/services/modal.service";
import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault-filter.model";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/abstractions/messaging.service";
import { PasswordRepromptService } from "@bitwarden/common/abstractions/passwordReprompt.service";
@@ -94,7 +94,7 @@ export class VaultComponent implements OnInit, OnDestroy {
private syncService: SyncService,
private messagingService: MessagingService,
private platformUtilsService: PlatformUtilsService,
- private eventService: EventService,
+ private eventCollectionService: EventCollectionService,
private totpService: TotpService,
private passwordRepromptService: PasswordRepromptService,
private stateService: StateService,
@@ -309,7 +309,7 @@ export class VaultComponent implements OnInit, OnDestroy {
label: this.i18nService.t("copyPassword"),
click: () => {
this.copyValue(cipher, cipher.login.password, "password", "Password");
- this.eventService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedPassword, cipher.id);
},
});
}
@@ -338,7 +338,7 @@ export class VaultComponent implements OnInit, OnDestroy {
label: this.i18nService.t("copySecurityCode"),
click: () => {
this.copyValue(cipher, cipher.card.code, "securityCode", "Security Code");
- this.eventService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
},
});
}
diff --git a/apps/desktop/src/app/vault/view-custom-fields.component.ts b/apps/desktop/src/app/vault/view-custom-fields.component.ts
index 7d9b338f0fa..3ea41db713c 100644
--- a/apps/desktop/src/app/vault/view-custom-fields.component.ts
+++ b/apps/desktop/src/app/vault/view-custom-fields.component.ts
@@ -1,14 +1,14 @@
import { Component } from "@angular/core";
import { ViewCustomFieldsComponent as BaseViewCustomFieldsComponent } from "@bitwarden/angular/components/view-custom-fields.component";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
@Component({
selector: "app-vault-view-custom-fields",
templateUrl: "view-custom-fields.component.html",
})
export class ViewCustomFieldsComponent extends BaseViewCustomFieldsComponent {
- constructor(eventService: EventService) {
- super(eventService);
+ constructor(eventCollectionService: EventCollectionService) {
+ super(eventCollectionService);
}
}
diff --git a/apps/desktop/src/app/vault/view.component.ts b/apps/desktop/src/app/vault/view.component.ts
index 52db3e22bc7..70f55d400a4 100644
--- a/apps/desktop/src/app/vault/view.component.ts
+++ b/apps/desktop/src/app/vault/view.component.ts
@@ -13,7 +13,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -47,7 +47,7 @@ export class ViewComponent extends BaseViewComponent implements OnChanges {
broadcasterService: BroadcasterService,
ngZone: NgZone,
changeDetectorRef: ChangeDetectorRef,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
apiService: ApiService,
private messagingService: MessagingService,
passwordRepromptService: PasswordRepromptService,
@@ -68,7 +68,7 @@ export class ViewComponent extends BaseViewComponent implements OnChanges {
broadcasterService,
ngZone,
changeDetectorRef,
- eventService,
+ eventCollectionService,
apiService,
passwordRepromptService,
logService,
diff --git a/apps/desktop/src/package-lock.json b/apps/desktop/src/package-lock.json
index 7006f7ac31b..1f571fc4d23 100644
--- a/apps/desktop/src/package-lock.json
+++ b/apps/desktop/src/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@bitwarden/desktop",
- "version": "2022.11.0",
+ "version": "2022.11.1",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@bitwarden/desktop",
- "version": "2022.11.0",
+ "version": "2022.11.1",
"license": "GPL-3.0",
"dependencies": {
"@bitwarden/desktop-native": "file:../desktop_native"
diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json
index 2be746c7970..a9be27dc243 100644
--- a/apps/desktop/src/package.json
+++ b/apps/desktop/src/package.json
@@ -2,7 +2,7 @@
"name": "@bitwarden/desktop",
"productName": "Bitwarden",
"description": "A secure and free password manager for all of your devices.",
- "version": "2022.11.0",
+ "version": "2022.11.1",
"author": "Bitwarden Inc. (https://bitwarden.com)",
"homepage": "https://bitwarden.com",
"license": "GPL-3.0",
diff --git a/apps/web/README.md b/apps/web/README.md
index f75c7142389..f43a9dc1614 100644
--- a/apps/web/README.md
+++ b/apps/web/README.md
@@ -21,4 +21,4 @@
## Documentation
-Please refer to the [Web vault section](https://contributing.bitwarden.com/docs/clients/web-vault/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
+Please refer to the [Web vault section](https://contributing.bitwarden.com/getting-started/clients/web-vault/) of the [Contributing Documentation](https://contributing.bitwarden.com/) for build instructions, recommended tooling, code style tips, and lots of other great information to get you started.
diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts
index 9bd0fda6fcb..008ed5106f4 100644
--- a/apps/web/src/app/app.component.ts
+++ b/apps/web/src/app/app.component.ts
@@ -12,7 +12,7 @@ import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.s
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventUploadService } from "@bitwarden/common/abstractions/event/event-upload.service";
import { InternalFolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { KeyConnectorService } from "@bitwarden/common/abstractions/keyConnector.service";
@@ -74,7 +74,7 @@ export class AppComponent implements OnDestroy, OnInit {
private notificationsService: NotificationsService,
private routerService: RouterService,
private stateService: StateService,
- private eventService: EventService,
+ private eventUploadService: EventUploadService,
private policyService: InternalPolicyService,
protected policyListService: PolicyListService,
private keyConnectorService: KeyConnectorService
@@ -221,10 +221,9 @@ export class AppComponent implements OnDestroy, OnInit {
}
private async logOut(expired: boolean) {
- await this.eventService.uploadEvents();
+ await this.eventUploadService.uploadEvents();
const userId = await this.stateService.getUserId();
await Promise.all([
- this.eventService.clearEvents(),
this.syncService.setLastSync(new Date(0)),
this.cryptoService.clearKeys(),
this.settingsService.clear(userId),
diff --git a/apps/web/src/app/core/init.service.ts b/apps/web/src/app/core/init.service.ts
index 75089529f22..8baa7c0ddc6 100644
--- a/apps/web/src/app/core/init.service.ts
+++ b/apps/web/src/app/core/init.service.ts
@@ -8,14 +8,14 @@ import {
EnvironmentService as EnvironmentServiceAbstraction,
Urls,
} from "@bitwarden/common/abstractions/environment.service";
-import { EventService as EventLoggingServiceAbstraction } from "@bitwarden/common/abstractions/event.service";
+import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service";
import { NotificationsService as NotificationsServiceAbstraction } from "@bitwarden/common/abstractions/notifications.service";
import { StateService as StateServiceAbstraction } from "@bitwarden/common/abstractions/state.service";
import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/abstractions/twoFactor.service";
import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service";
import { ContainerService } from "@bitwarden/common/services/container.service";
-import { EventService as EventLoggingService } from "@bitwarden/common/services/event.service";
+import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
import { VaultTimeoutService as VaultTimeoutService } from "@bitwarden/common/services/vaultTimeout/vaultTimeout.service";
import { I18nService } from "./i18n.service";
@@ -28,7 +28,7 @@ export class InitService {
private notificationsService: NotificationsServiceAbstraction,
private vaultTimeoutService: VaultTimeoutServiceAbstraction,
private i18nService: I18nServiceAbstraction,
- private eventLoggingService: EventLoggingServiceAbstraction,
+ private eventUploadService: EventUploadServiceAbstraction,
private twoFactorService: TwoFactorServiceAbstraction,
private stateService: StateServiceAbstraction,
private cryptoService: CryptoServiceAbstraction,
@@ -48,7 +48,7 @@ export class InitService {
(this.vaultTimeoutService as VaultTimeoutService).init(true);
const locale = await this.stateService.getLocale();
await (this.i18nService as I18nService).init(locale);
- (this.eventLoggingService as EventLoggingService).init(true);
+ (this.eventUploadService as EventUploadService).init(true);
this.twoFactorService.init();
const htmlEl = this.win.document.documentElement;
htmlEl.classList.add("locale_" + this.i18nService.translationLocale);
diff --git a/apps/web/src/app/organizations/manage/user-add-edit.component.html b/apps/web/src/app/organizations/manage/user-add-edit.component.html
index 458d1d0bab3..6d44a6e8d1b 100644
--- a/apps/web/src/app/organizations/manage/user-add-edit.component.html
+++ b/apps/web/src/app/organizations/manage/user-add-edit.component.html
@@ -122,10 +122,22 @@
id="userTypeCustom"
[value]="organizationUserType.Custom"
[(ngModel)]="type"
+ [attr.disabled]="!canUseCustomPermissions || null"
/>
diff --git a/apps/web/src/app/organizations/manage/user-add-edit.component.ts b/apps/web/src/app/organizations/manage/user-add-edit.component.ts
index 4a9d01efb5d..cb593112236 100644
--- a/apps/web/src/app/organizations/manage/user-add-edit.component.ts
+++ b/apps/web/src/app/organizations/manage/user-add-edit.component.ts
@@ -4,6 +4,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
+import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { OrganizationUserStatusType } from "@bitwarden/common/enums/organizationUserStatusType";
import { OrganizationUserType } from "@bitwarden/common/enums/organizationUserType";
@@ -43,6 +44,7 @@ export class UserAddEditComponent implements OnInit {
formPromise: Promise;
deletePromise: Promise;
organizationUserType = OrganizationUserType;
+ canUseCustomPermissions: boolean;
manageAllCollectionsCheckboxes = [
{
@@ -84,11 +86,14 @@ export class UserAddEditComponent implements OnInit {
private i18nService: I18nService,
private collectionService: CollectionService,
private platformUtilsService: PlatformUtilsService,
+ private organizationService: OrganizationService,
private logService: LogService
) {}
async ngOnInit() {
this.editMode = this.loading = this.organizationUserId != null;
+ const organization = this.organizationService.get(this.organizationId);
+ this.canUseCustomPermissions = organization.useCustomPermissions;
await this.loadCollections();
if (this.editMode) {
@@ -163,6 +168,15 @@ export class UserAddEditComponent implements OnInit {
}
async submit() {
+ if (!this.canUseCustomPermissions && this.type === OrganizationUserType.Custom) {
+ this.platformUtilsService.showToast(
+ "error",
+ null,
+ this.i18nService.t("customNonEnterpriseError")
+ );
+ return;
+ }
+
let collections: SelectionReadOnlyRequest[] = null;
if (this.access !== "all") {
collections = this.collections
@@ -172,30 +186,9 @@ export class UserAddEditComponent implements OnInit {
try {
if (this.editMode) {
- const request = new OrganizationUserUpdateRequest();
- request.accessAll = this.access === "all";
- request.type = this.type;
- request.collections = collections;
- request.permissions = this.setRequestPermissions(
- request.permissions ?? new PermissionsApi(),
- request.type !== OrganizationUserType.Custom
- );
- this.formPromise = this.apiService.putOrganizationUser(
- this.organizationId,
- this.organizationUserId,
- request
- );
+ this.updateUser(collections);
} else {
- const request = new OrganizationUserInviteRequest();
- request.emails = [...new Set(this.emails.trim().split(/\s*,\s*/))];
- request.accessAll = this.access === "all";
- request.type = this.type;
- request.permissions = this.setRequestPermissions(
- request.permissions ?? new PermissionsApi(),
- request.type !== OrganizationUserType.Custom
- );
- request.collections = collections;
- this.formPromise = this.apiService.postOrganizationUserInvite(this.organizationId, request);
+ this.inviteUser(collections);
}
await this.formPromise;
this.platformUtilsService.showToast(
@@ -301,4 +294,33 @@ export class UserAddEditComponent implements OnInit {
this.logService.error(e);
}
}
+
+ updateUser(collections: SelectionReadOnlyRequest[]) {
+ const request = new OrganizationUserUpdateRequest();
+ request.accessAll = this.access === "all";
+ request.type = this.type;
+ request.collections = collections;
+ request.permissions = this.setRequestPermissions(
+ request.permissions ?? new PermissionsApi(),
+ request.type !== OrganizationUserType.Custom
+ );
+ this.formPromise = this.apiService.putOrganizationUser(
+ this.organizationId,
+ this.organizationUserId,
+ request
+ );
+ }
+
+ inviteUser(collections: SelectionReadOnlyRequest[]) {
+ const request = new OrganizationUserInviteRequest();
+ request.emails = [...new Set(this.emails.trim().split(/\s*,\s*/))];
+ request.accessAll = this.access === "all";
+ request.type = this.type;
+ request.permissions = this.setRequestPermissions(
+ request.permissions ?? new PermissionsApi(),
+ request.type !== OrganizationUserType.Custom
+ );
+ request.collections = collections;
+ this.formPromise = this.apiService.postOrganizationUserInvite(this.organizationId, request);
+ }
}
diff --git a/apps/web/src/app/organizations/tools/import-export/org-export.component.ts b/apps/web/src/app/organizations/tools/import-export/org-export.component.ts
index 626b3ef2bc6..a7ab72edfae 100644
--- a/apps/web/src/app/organizations/tools/import-export/org-export.component.ts
+++ b/apps/web/src/app/organizations/tools/import-export/org-export.component.ts
@@ -4,7 +4,7 @@ import { ActivatedRoute } from "@angular/router";
import { ModalService } from "@bitwarden/angular/services/modal.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -27,7 +27,7 @@ export class OrganizationExportComponent extends ExportComponent {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
exportService: ExportService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
private route: ActivatedRoute,
policyService: PolicyService,
logService: LogService,
@@ -41,7 +41,7 @@ export class OrganizationExportComponent extends ExportComponent {
i18nService,
platformUtilsService,
exportService,
- eventService,
+ eventCollectionService,
policyService,
logService,
userVerificationService,
@@ -76,7 +76,7 @@ export class OrganizationExportComponent extends ExportComponent {
}
async collectEvent(): Promise {
- await this.eventService.collect(
+ await this.eventCollectionService.collect(
EventType.Organization_ClientExportedVault,
null,
null,
diff --git a/apps/web/src/app/organizations/vault/add-edit.component.ts b/apps/web/src/app/organizations/vault/add-edit.component.ts
index 27a2b9a11dd..dbbbf42dd02 100644
--- a/apps/web/src/app/organizations/vault/add-edit.component.ts
+++ b/apps/web/src/app/organizations/vault/add-edit.component.ts
@@ -4,7 +4,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -42,7 +42,7 @@ export class AddEditComponent extends BaseAddEditComponent {
passwordGenerationService: PasswordGenerationService,
private apiService: ApiService,
messagingService: MessagingService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
logService: LogService,
passwordRepromptService: PasswordRepromptService,
@@ -59,7 +59,7 @@ export class AddEditComponent extends BaseAddEditComponent {
totpService,
passwordGenerationService,
messagingService,
- eventService,
+ eventCollectionService,
policyService,
organizationService,
logService,
diff --git a/apps/web/src/app/organizations/vault/vault-items.component.ts b/apps/web/src/app/organizations/vault/vault-items.component.ts
index 044b3d6d752..e7ee2cb28e6 100644
--- a/apps/web/src/app/organizations/vault/vault-items.component.ts
+++ b/apps/web/src/app/organizations/vault/vault-items.component.ts
@@ -2,7 +2,7 @@ import { Component, EventEmitter, Output } from "@angular/core";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction";
@@ -30,7 +30,7 @@ export class VaultItemsComponent extends BaseVaultItemsComponent {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
cipherService: CipherService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
totpService: TotpService,
passwordRepromptService: PasswordRepromptService,
logService: LogService,
@@ -44,7 +44,7 @@ export class VaultItemsComponent extends BaseVaultItemsComponent {
i18nService,
platformUtilsService,
cipherService,
- eventService,
+ eventCollectionService,
totpService,
stateService,
passwordRepromptService,
diff --git a/apps/web/src/app/settings/emergency-add-edit.component.ts b/apps/web/src/app/settings/emergency-add-edit.component.ts
index ca7997eaa49..c709f4a9291 100644
--- a/apps/web/src/app/settings/emergency-add-edit.component.ts
+++ b/apps/web/src/app/settings/emergency-add-edit.component.ts
@@ -3,7 +3,7 @@ import { Component } from "@angular/core";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -38,7 +38,7 @@ export class EmergencyAddEditComponent extends BaseAddEditComponent {
totpService: TotpService,
passwordGenerationService: PasswordGenerationService,
messagingService: MessagingService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
passwordRepromptService: PasswordRepromptService,
organizationService: OrganizationService,
@@ -55,7 +55,7 @@ export class EmergencyAddEditComponent extends BaseAddEditComponent {
totpService,
passwordGenerationService,
messagingService,
- eventService,
+ eventCollectionService,
policyService,
organizationService,
logService,
diff --git a/apps/web/src/app/tools/import-export/export.component.ts b/apps/web/src/app/tools/import-export/export.component.ts
index 5d704bb5f69..6087d7a2027 100644
--- a/apps/web/src/app/tools/import-export/export.component.ts
+++ b/apps/web/src/app/tools/import-export/export.component.ts
@@ -4,7 +4,7 @@ import { UntypedFormBuilder } from "@angular/forms";
import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/components/export.component";
import { ModalService } from "@bitwarden/angular/services/modal.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -29,7 +29,7 @@ export class ExportComponent extends BaseExportComponent {
i18nService: I18nService,
platformUtilsService: PlatformUtilsService,
exportService: ExportService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
policyService: PolicyService,
logService: LogService,
userVerificationService: UserVerificationService,
@@ -42,7 +42,7 @@ export class ExportComponent extends BaseExportComponent {
i18nService,
platformUtilsService,
exportService,
- eventService,
+ eventCollectionService,
policyService,
window,
logService,
diff --git a/apps/web/src/app/vault/add-edit-custom-fields.component.ts b/apps/web/src/app/vault/add-edit-custom-fields.component.ts
index 796e42592d4..aa51edaf9b7 100644
--- a/apps/web/src/app/vault/add-edit-custom-fields.component.ts
+++ b/apps/web/src/app/vault/add-edit-custom-fields.component.ts
@@ -1,7 +1,7 @@
import { Component, Input } from "@angular/core";
import { AddEditCustomFieldsComponent as BaseAddEditCustomFieldsComponent } from "@bitwarden/angular/components/add-edit-custom-fields.component";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@Component({
@@ -12,7 +12,7 @@ export class AddEditCustomFieldsComponent extends BaseAddEditCustomFieldsCompone
@Input() viewOnly: boolean;
@Input() copy: (value: string, typeI18nKey: string, aType: string) => void;
- constructor(i18nService: I18nService, eventService: EventService) {
- super(i18nService, eventService);
+ constructor(i18nService: I18nService, eventCollectionService: EventCollectionService) {
+ super(i18nService, eventCollectionService);
}
}
diff --git a/apps/web/src/app/vault/add-edit.component.ts b/apps/web/src/app/vault/add-edit.component.ts
index af75e4e99af..1847be254eb 100644
--- a/apps/web/src/app/vault/add-edit.component.ts
+++ b/apps/web/src/app/vault/add-edit.component.ts
@@ -4,7 +4,7 @@ import { AddEditComponent as BaseAddEditComponent } from "@bitwarden/angular/com
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -49,7 +49,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On
protected totpService: TotpService,
protected passwordGenerationService: PasswordGenerationService,
protected messagingService: MessagingService,
- eventService: EventService,
+ eventCollectionService: EventCollectionService,
protected policyService: PolicyService,
organizationService: OrganizationService,
logService: LogService,
@@ -64,7 +64,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On
stateService,
collectionService,
messagingService,
- eventService,
+ eventCollectionService,
policyService,
logService,
passwordRepromptService,
@@ -125,11 +125,17 @@ export class AddEditComponent extends BaseAddEditComponent implements OnInit, On
if (this.editMode) {
if (typeI18nKey === "password") {
- this.eventService.collect(EventType.Cipher_ClientToggledHiddenFieldVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledHiddenFieldVisible,
+ this.cipherId
+ );
} else if (typeI18nKey === "securityCode") {
- this.eventService.collect(EventType.Cipher_ClientCopiedCardCode, this.cipherId);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, this.cipherId);
} else if (aType === "H_Field") {
- this.eventService.collect(EventType.Cipher_ClientCopiedHiddenField, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientCopiedHiddenField,
+ this.cipherId
+ );
}
}
}
diff --git a/apps/web/src/app/vault/vault-items.component.ts b/apps/web/src/app/vault/vault-items.component.ts
index 9027c53d8c3..e82007523cc 100644
--- a/apps/web/src/app/vault/vault-items.component.ts
+++ b/apps/web/src/app/vault/vault-items.component.ts
@@ -2,7 +2,7 @@ import { Component, EventEmitter, Input, OnDestroy, Output } from "@angular/core
import { VaultItemsComponent as BaseVaultItemsComponent } from "@bitwarden/angular/components/vault-items.component";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { OrganizationService } from "@bitwarden/common/abstractions/organization/organization.service.abstraction";
@@ -51,7 +51,7 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnDe
protected i18nService: I18nService,
protected platformUtilsService: PlatformUtilsService,
protected cipherService: CipherService,
- protected eventService: EventService,
+ protected eventCollectionService: EventCollectionService,
protected totpService: TotpService,
protected stateService: StateService,
protected passwordRepromptService: PasswordRepromptService,
@@ -241,9 +241,12 @@ export class VaultItemsComponent extends BaseVaultItemsComponent implements OnDe
);
if (typeI18nKey === "password" || typeI18nKey === "verificationCodeTotp") {
- this.eventService.collect(EventType.Cipher_ClientToggledHiddenFieldVisible, cipher.id);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledHiddenFieldVisible,
+ cipher.id
+ );
} else if (typeI18nKey === "securityCode") {
- this.eventService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, cipher.id);
}
}
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 70ac05fca65..846da4d8105 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -2444,7 +2444,7 @@
"message": "Owner"
},
"ownerDesc": {
- "message": "The highest access user that can manage all aspects of your organization."
+ "message": "Manage all aspects of your organization, including billing and subscriptions"
},
"clientOwnerDesc": {
"message": "This user should be independent of the Provider. If the Provider is disassociated with the organization, this user will maintain ownership of the organization."
@@ -2453,19 +2453,19 @@
"message": "Admin"
},
"adminDesc": {
- "message": "Admins can access and manage all items, collections and users in your organization."
+ "message": "Manage organization access, all collections, members, reporting, and security settings"
},
"user": {
"message": "User"
},
"userDesc": {
- "message": "A regular user with access to assigned collections in your organization."
+ "message": "Access and add items to assigned collections"
},
"manager": {
"message": "Manager"
},
"managerDesc": {
- "message": "Managers can access and manage assigned collections in your organization."
+ "message": "Create, delete, and manage access in assigned collections"
},
"all": {
"message": "All"
@@ -4117,7 +4117,22 @@
"message": "Custom"
},
"customDesc": {
- "message": "Allows more granular control of user permissions for advanced configurations."
+ "message": "Grant customized permissions to members"
+ },
+ "customDescNonEnterpriseStart": {
+ "message": "Custom roles is an ",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'"
+ },
+ "customDescNonEnterpriseLink": {
+ "message": "enterprise feature",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'"
+ },
+ "customDescNonEnterpriseEnd": {
+ "message": ". Contact our support team to upgrade your subscription",
+ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'Custom roles is an enterprise feature. Contact our support team to upgrade your subscription'"
+ },
+ "customNonEnterpriseError": {
+ "message": "To enable custom permissions the organization must be on an Enterprise 2020 plan."
},
"permissions": {
"message": "Permissions"
diff --git a/libs/angular/src/components/add-edit-custom-fields.component.ts b/libs/angular/src/components/add-edit-custom-fields.component.ts
index fdea9b0596d..2be5e7d5a56 100644
--- a/libs/angular/src/components/add-edit-custom-fields.component.ts
+++ b/libs/angular/src/components/add-edit-custom-fields.component.ts
@@ -1,7 +1,7 @@
import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop";
import { Directive, Input, OnChanges, SimpleChanges } from "@angular/core";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { CipherType } from "@bitwarden/common/enums/cipherType";
import { EventType } from "@bitwarden/common/enums/eventType";
@@ -25,7 +25,10 @@ export class AddEditCustomFieldsComponent implements OnChanges {
fieldType = FieldType;
eventType = EventType;
- constructor(private i18nService: I18nService, private eventService: EventService) {
+ constructor(
+ private i18nService: I18nService,
+ private eventCollectionService: EventCollectionService
+ ) {
this.addFieldTypeOptions = [
{ name: i18nService.t("cfTypeText"), value: FieldType.Text },
{ name: i18nService.t("cfTypeHidden"), value: FieldType.Hidden },
@@ -74,7 +77,10 @@ export class AddEditCustomFieldsComponent implements OnChanges {
const f = field as any;
f.showValue = !f.showValue;
if (this.editMode && f.showValue) {
- this.eventService.collect(EventType.Cipher_ClientToggledHiddenFieldVisible, this.cipher.id);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledHiddenFieldVisible,
+ this.cipher.id
+ );
}
}
diff --git a/libs/angular/src/components/add-edit.component.ts b/libs/angular/src/components/add-edit.component.ts
index 7194b882955..2d59ac475f1 100644
--- a/libs/angular/src/components/add-edit.component.ts
+++ b/libs/angular/src/components/add-edit.component.ts
@@ -4,7 +4,7 @@ import { Observable, Subject, takeUntil, concatMap } from "rxjs";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/abstractions/collection.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
@@ -91,7 +91,7 @@ export class AddEditComponent implements OnInit, OnDestroy {
protected stateService: StateService,
protected collectionService: CollectionService,
protected messagingService: MessagingService,
- protected eventService: EventService,
+ protected eventCollectionService: EventCollectionService,
protected policyService: PolicyService,
private logService: LogService,
protected passwordRepromptService: PasswordRepromptService,
@@ -266,7 +266,7 @@ export class AddEditComponent implements OnInit, OnDestroy {
this.folders$ = this.folderService.folderViews$;
if (this.editMode && this.previousCipherId !== this.cipherId) {
- this.eventService.collect(EventType.Cipher_ClientViewed, this.cipherId);
+ this.eventCollectionService.collect(EventType.Cipher_ClientViewed, this.cipherId);
}
this.previousCipherId = this.cipherId;
this.reprompt = this.cipher.reprompt !== CipherRepromptType.None;
@@ -489,14 +489,20 @@ export class AddEditComponent implements OnInit, OnDestroy {
this.showPassword = !this.showPassword;
document.getElementById("loginPassword").focus();
if (this.editMode && this.showPassword) {
- this.eventService.collect(EventType.Cipher_ClientToggledPasswordVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledPasswordVisible,
+ this.cipherId
+ );
}
}
async toggleCardNumber() {
this.showCardNumber = !this.showCardNumber;
if (this.showCardNumber) {
- this.eventService.collect(EventType.Cipher_ClientToggledCardNumberVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledCardNumberVisible,
+ this.cipherId
+ );
}
}
@@ -504,7 +510,10 @@ export class AddEditComponent implements OnInit, OnDestroy {
this.showCardCode = !this.showCardCode;
document.getElementById("cardCode").focus();
if (this.editMode && this.showCardCode) {
- this.eventService.collect(EventType.Cipher_ClientToggledCardCodeVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledCardCodeVisible,
+ this.cipherId
+ );
}
}
diff --git a/libs/angular/src/components/export.component.ts b/libs/angular/src/components/export.component.ts
index f25d8fdaf30..b38b1762714 100644
--- a/libs/angular/src/components/export.component.ts
+++ b/libs/angular/src/components/export.component.ts
@@ -3,7 +3,7 @@ import { UntypedFormBuilder, Validators } from "@angular/forms";
import { merge, takeUntil, Subject, startWith } from "rxjs";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -45,7 +45,7 @@ export class ExportComponent implements OnInit, OnDestroy {
protected i18nService: I18nService,
protected platformUtilsService: PlatformUtilsService,
protected exportService: ExportService,
- protected eventService: EventService,
+ protected eventCollectionService: EventCollectionService,
private policyService: PolicyService,
protected win: Window,
private logService: LogService,
@@ -180,7 +180,7 @@ export class ExportComponent implements OnInit, OnDestroy {
}
protected async collectEvent(): Promise {
- await this.eventService.collect(EventType.User_ClientExportedVault);
+ await this.eventCollectionService.collect(EventType.User_ClientExportedVault);
}
get format() {
diff --git a/libs/angular/src/components/view-custom-fields.component.ts b/libs/angular/src/components/view-custom-fields.component.ts
index b661e76a192..46289fbc5eb 100644
--- a/libs/angular/src/components/view-custom-fields.component.ts
+++ b/libs/angular/src/components/view-custom-fields.component.ts
@@ -1,6 +1,6 @@
import { Directive, Input } from "@angular/core";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { EventType } from "@bitwarden/common/enums/eventType";
import { FieldType } from "@bitwarden/common/enums/fieldType";
import { CipherView } from "@bitwarden/common/models/view/cipher.view";
@@ -14,7 +14,7 @@ export class ViewCustomFieldsComponent {
fieldType = FieldType;
- constructor(private eventService: EventService) {}
+ constructor(private eventCollectionService: EventCollectionService) {}
async toggleFieldValue(field: FieldView) {
if (!(await this.promptPassword())) {
@@ -25,7 +25,10 @@ export class ViewCustomFieldsComponent {
f.showValue = !f.showValue;
f.showCount = false;
if (f.showValue) {
- this.eventService.collect(EventType.Cipher_ClientToggledHiddenFieldVisible, this.cipher.id);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledHiddenFieldVisible,
+ this.cipher.id
+ );
}
}
diff --git a/libs/angular/src/components/view.component.ts b/libs/angular/src/components/view.component.ts
index 8e724b9186a..243ca85ff97 100644
--- a/libs/angular/src/components/view.component.ts
+++ b/libs/angular/src/components/view.component.ts
@@ -15,7 +15,7 @@ import { AuditService } from "@bitwarden/common/abstractions/audit.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CipherService } from "@bitwarden/common/abstractions/cipher.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
-import { EventService } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { FileDownloadService } from "@bitwarden/common/abstractions/fileDownload/fileDownload.service";
import { FolderService } from "@bitwarden/common/abstractions/folder/folder.service.abstraction";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
@@ -80,7 +80,7 @@ export class ViewComponent implements OnDestroy, OnInit {
protected broadcasterService: BroadcasterService,
protected ngZone: NgZone,
protected changeDetectorRef: ChangeDetectorRef,
- protected eventService: EventService,
+ protected eventCollectionService: EventCollectionService,
protected apiService: ApiService,
protected passwordRepromptService: PasswordRepromptService,
private logService: LogService,
@@ -138,7 +138,7 @@ export class ViewComponent implements OnDestroy, OnInit {
}
if (this.previousCipherId !== this.cipherId) {
- this.eventService.collect(EventType.Cipher_ClientViewed, this.cipherId);
+ this.eventCollectionService.collect(EventType.Cipher_ClientViewed, this.cipherId);
}
this.previousCipherId = this.cipherId;
}
@@ -238,7 +238,10 @@ export class ViewComponent implements OnDestroy, OnInit {
this.showPassword = !this.showPassword;
this.showPasswordCount = false;
if (this.showPassword) {
- this.eventService.collect(EventType.Cipher_ClientToggledPasswordVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledPasswordVisible,
+ this.cipherId
+ );
}
}
@@ -257,7 +260,10 @@ export class ViewComponent implements OnDestroy, OnInit {
this.showCardNumber = !this.showCardNumber;
if (this.showCardNumber) {
- this.eventService.collect(EventType.Cipher_ClientToggledCardNumberVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledCardNumberVisible,
+ this.cipherId
+ );
}
}
@@ -268,7 +274,10 @@ export class ViewComponent implements OnDestroy, OnInit {
this.showCardCode = !this.showCardCode;
if (this.showCardCode) {
- this.eventService.collect(EventType.Cipher_ClientToggledCardCodeVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledCardCodeVisible,
+ this.cipherId
+ );
}
}
@@ -328,11 +337,14 @@ export class ViewComponent implements OnDestroy, OnInit {
);
if (typeI18nKey === "password") {
- this.eventService.collect(EventType.Cipher_ClientToggledHiddenFieldVisible, this.cipherId);
+ this.eventCollectionService.collect(
+ EventType.Cipher_ClientToggledHiddenFieldVisible,
+ this.cipherId
+ );
} else if (typeI18nKey === "securityCode") {
- this.eventService.collect(EventType.Cipher_ClientCopiedCardCode, this.cipherId);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedCardCode, this.cipherId);
} else if (aType === "H_Field") {
- this.eventService.collect(EventType.Cipher_ClientCopiedHiddenField, this.cipherId);
+ this.eventCollectionService.collect(EventType.Cipher_ClientCopiedHiddenField, this.cipherId);
}
}
diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts
index 0df234180f5..48c4a8fcd21 100644
--- a/libs/angular/src/services/jslib-services.module.ts
+++ b/libs/angular/src/services/jslib-services.module.ts
@@ -19,7 +19,8 @@ import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abs
import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/abstractions/cryptoFunction.service";
import { EncryptService } from "@bitwarden/common/abstractions/encrypt.service";
import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/common/abstractions/environment.service";
-import { EventService as EventServiceAbstraction } from "@bitwarden/common/abstractions/event.service";
+import { EventCollectionService as EventCollectionServiceAbstraction } from "@bitwarden/common/abstractions/event/event-collection.service";
+import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/common/abstractions/event/event-upload.service";
import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service";
import { FileUploadService as FileUploadServiceAbstraction } from "@bitwarden/common/abstractions/fileUpload.service";
import { FolderApiServiceAbstraction } from "@bitwarden/common/abstractions/folder/folder-api.service.abstraction";
@@ -90,7 +91,8 @@ import { CryptoService } from "@bitwarden/common/services/crypto.service";
import { EncryptServiceImplementation } from "@bitwarden/common/services/cryptography/encrypt.service.implementation";
import { MultithreadEncryptServiceImplementation } from "@bitwarden/common/services/cryptography/multithread-encrypt.service.implementation";
import { EnvironmentService } from "@bitwarden/common/services/environment.service";
-import { EventService } from "@bitwarden/common/services/event.service";
+import { EventCollectionService } from "@bitwarden/common/services/event/event-collection.service";
+import { EventUploadService } from "@bitwarden/common/services/event/event-upload.service";
import { ExportService } from "@bitwarden/common/services/export.service";
import { FileUploadService } from "@bitwarden/common/services/fileUpload.service";
import { FolderApiService } from "@bitwarden/common/services/folder/folder-api.service";
@@ -464,14 +466,18 @@ import { AbstractThemingService } from "./theming/theming.service.abstraction";
deps: [CryptoFunctionServiceAbstraction, LogService, LOG_MAC_FAILURES],
},
{
- provide: EventServiceAbstraction,
- useClass: EventService,
+ provide: EventUploadServiceAbstraction,
+ useClass: EventUploadService,
+ deps: [ApiServiceAbstraction, StateServiceAbstraction, LogService],
+ },
+ {
+ provide: EventCollectionServiceAbstraction,
+ useClass: EventCollectionService,
deps: [
- ApiServiceAbstraction,
CipherServiceAbstraction,
StateServiceAbstraction,
- LogService,
OrganizationServiceAbstraction,
+ EventUploadServiceAbstraction,
],
},
{
diff --git a/libs/common/src/abstractions/event.service.ts b/libs/common/src/abstractions/event.service.ts
deleted file mode 100644
index d774eb5e2e6..00000000000
--- a/libs/common/src/abstractions/event.service.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { EventType } from "../enums/eventType";
-
-export abstract class EventService {
- collect: (
- eventType: EventType,
- cipherId?: string,
- uploadImmediately?: boolean,
- organizationId?: string
- ) => Promise;
- uploadEvents: (userId?: string) => Promise;
- clearEvents: (userId?: string) => Promise;
-}
diff --git a/libs/common/src/abstractions/event/event-collection.service.ts b/libs/common/src/abstractions/event/event-collection.service.ts
new file mode 100644
index 00000000000..ca6c545026f
--- /dev/null
+++ b/libs/common/src/abstractions/event/event-collection.service.ts
@@ -0,0 +1,10 @@
+import { EventType } from "../../enums/eventType";
+
+export abstract class EventCollectionService {
+ collect: (
+ eventType: EventType,
+ cipherId?: string,
+ uploadImmediately?: boolean,
+ organizationId?: string
+ ) => Promise;
+}
diff --git a/libs/common/src/abstractions/event/event-upload.service.ts b/libs/common/src/abstractions/event/event-upload.service.ts
new file mode 100644
index 00000000000..b68f6f718d4
--- /dev/null
+++ b/libs/common/src/abstractions/event/event-upload.service.ts
@@ -0,0 +1,3 @@
+export abstract class EventUploadService {
+ uploadEvents: (userId?: string) => Promise;
+}
diff --git a/libs/common/src/models/data/organization.data.ts b/libs/common/src/models/data/organization.data.ts
index 98ed39ef341..85658d97644 100644
--- a/libs/common/src/models/data/organization.data.ts
+++ b/libs/common/src/models/data/organization.data.ts
@@ -20,6 +20,7 @@ export class OrganizationData {
useSso: boolean;
useKeyConnector: boolean;
useScim: boolean;
+ useCustomPermissions: boolean;
useResetPassword: boolean;
selfHost: boolean;
usersGetPremium: boolean;
@@ -60,6 +61,7 @@ export class OrganizationData {
this.useSso = response.useSso;
this.useKeyConnector = response.useKeyConnector;
this.useScim = response.useScim;
+ this.useCustomPermissions = response.useCustomPermissions;
this.useResetPassword = response.useResetPassword;
this.selfHost = response.selfHost;
this.usersGetPremium = response.usersGetPremium;
diff --git a/libs/common/src/models/domain/organization.ts b/libs/common/src/models/domain/organization.ts
index 4e84a84ef8b..c20f121c43c 100644
--- a/libs/common/src/models/domain/organization.ts
+++ b/libs/common/src/models/domain/organization.ts
@@ -22,6 +22,7 @@ export class Organization {
useSso: boolean;
useKeyConnector: boolean;
useScim: boolean;
+ useCustomPermissions: boolean;
useResetPassword: boolean;
selfHost: boolean;
usersGetPremium: boolean;
@@ -66,6 +67,7 @@ export class Organization {
this.useSso = obj.useSso;
this.useKeyConnector = obj.useKeyConnector;
this.useScim = obj.useScim;
+ this.useCustomPermissions = obj.useCustomPermissions;
this.useResetPassword = obj.useResetPassword;
this.selfHost = obj.selfHost;
this.usersGetPremium = obj.usersGetPremium;
diff --git a/libs/common/src/models/response/profile-organization.response.ts b/libs/common/src/models/response/profile-organization.response.ts
index 34d72b10d4e..19137848291 100644
--- a/libs/common/src/models/response/profile-organization.response.ts
+++ b/libs/common/src/models/response/profile-organization.response.ts
@@ -18,6 +18,7 @@ export class ProfileOrganizationResponse extends BaseResponse {
useSso: boolean;
useKeyConnector: boolean;
useScim: boolean;
+ useCustomPermissions: boolean;
useResetPassword: boolean;
selfHost: boolean;
usersGetPremium: boolean;
@@ -59,6 +60,7 @@ export class ProfileOrganizationResponse extends BaseResponse {
this.useSso = this.getResponseProperty("UseSso");
this.useKeyConnector = this.getResponseProperty("UseKeyConnector") ?? false;
this.useScim = this.getResponseProperty("UseScim") ?? false;
+ this.useCustomPermissions = this.getResponseProperty("UseCustomPermissions") ?? false;
this.useResetPassword = this.getResponseProperty("UseResetPassword");
this.selfHost = this.getResponseProperty("SelfHost");
this.usersGetPremium = this.getResponseProperty("UsersGetPremium");
diff --git a/libs/common/src/services/event.service.ts b/libs/common/src/services/event.service.ts
deleted file mode 100644
index 3221741a223..00000000000
--- a/libs/common/src/services/event.service.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import { ApiService } from "../abstractions/api.service";
-import { CipherService } from "../abstractions/cipher.service";
-import { EventService as EventServiceAbstraction } from "../abstractions/event.service";
-import { LogService } from "../abstractions/log.service";
-import { OrganizationService } from "../abstractions/organization/organization.service.abstraction";
-import { StateService } from "../abstractions/state.service";
-import { EventType } from "../enums/eventType";
-import { EventData } from "../models/data/event.data";
-import { EventRequest } from "../models/request/event.request";
-
-export class EventService implements EventServiceAbstraction {
- private inited = false;
-
- constructor(
- private apiService: ApiService,
- private cipherService: CipherService,
- private stateService: StateService,
- private logService: LogService,
- private organizationService: OrganizationService
- ) {}
-
- init(checkOnInterval: boolean) {
- if (this.inited) {
- return;
- }
-
- this.inited = true;
- if (checkOnInterval) {
- this.uploadEvents();
- setInterval(() => this.uploadEvents(), 60 * 1000); // check every 60 seconds
- }
- }
-
- async collect(
- eventType: EventType,
- cipherId: string = null,
- uploadImmediately = false,
- organizationId: string = null
- ): Promise {
- const authed = await this.stateService.getIsAuthenticated();
- if (!authed) {
- return;
- }
- const organizations = await this.organizationService.getAll();
- if (organizations == null) {
- return;
- }
- const orgIds = new Set(organizations.filter((o) => o.useEvents).map((o) => o.id));
- if (orgIds.size === 0) {
- return;
- }
- if (cipherId != null) {
- const cipher = await this.cipherService.get(cipherId);
- if (cipher == null || cipher.organizationId == null || !orgIds.has(cipher.organizationId)) {
- return;
- }
- }
- if (organizationId != null) {
- if (!orgIds.has(organizationId)) {
- return;
- }
- }
- let eventCollection = await this.stateService.getEventCollection();
- if (eventCollection == null) {
- eventCollection = [];
- }
- const event = new EventData();
- event.type = eventType;
- event.cipherId = cipherId;
- event.date = new Date().toISOString();
- event.organizationId = organizationId;
- eventCollection.push(event);
- await this.stateService.setEventCollection(eventCollection);
- if (uploadImmediately) {
- await this.uploadEvents();
- }
- }
-
- async uploadEvents(userId?: string): Promise {
- const authed = await this.stateService.getIsAuthenticated({ userId: userId });
- if (!authed) {
- return;
- }
- const eventCollection = await this.stateService.getEventCollection({ userId: userId });
- if (eventCollection == null || eventCollection.length === 0) {
- return;
- }
- const request = eventCollection.map((e) => {
- const req = new EventRequest();
- req.type = e.type;
- req.cipherId = e.cipherId;
- req.date = e.date;
- req.organizationId = e.organizationId;
- return req;
- });
- try {
- await this.apiService.postEventsCollect(request);
- this.clearEvents(userId);
- } catch (e) {
- this.logService.error(e);
- }
- }
-
- async clearEvents(userId?: string): Promise {
- await this.stateService.setEventCollection(null, { userId: userId });
- }
-}
diff --git a/libs/common/src/services/event/event-collection.service.ts b/libs/common/src/services/event/event-collection.service.ts
new file mode 100644
index 00000000000..52285f8577f
--- /dev/null
+++ b/libs/common/src/services/event/event-collection.service.ts
@@ -0,0 +1,61 @@
+import { CipherService } from "../../abstractions/cipher.service";
+import { EventCollectionService as EventCollectionServiceAbstraction } from "../../abstractions/event/event-collection.service";
+import { EventUploadService } from "../../abstractions/event/event-upload.service";
+import { OrganizationService } from "../../abstractions/organization/organization.service.abstraction";
+import { StateService } from "../../abstractions/state.service";
+import { EventType } from "../../enums/eventType";
+import { EventData } from "../../models/data/event.data";
+
+export class EventCollectionService implements EventCollectionServiceAbstraction {
+ constructor(
+ private cipherService: CipherService,
+ private stateService: StateService,
+ private organizationService: OrganizationService,
+ private eventUploadService: EventUploadService
+ ) {}
+
+ async collect(
+ eventType: EventType,
+ cipherId: string = null,
+ uploadImmediately = false,
+ organizationId: string = null
+ ): Promise {
+ const authed = await this.stateService.getIsAuthenticated();
+ if (!authed) {
+ return;
+ }
+ const organizations = await this.organizationService.getAll();
+ if (organizations == null) {
+ return;
+ }
+ const orgIds = new Set(organizations.filter((o) => o.useEvents).map((o) => o.id));
+ if (orgIds.size === 0) {
+ return;
+ }
+ if (cipherId != null) {
+ const cipher = await this.cipherService.get(cipherId);
+ if (cipher == null || cipher.organizationId == null || !orgIds.has(cipher.organizationId)) {
+ return;
+ }
+ }
+ if (organizationId != null) {
+ if (!orgIds.has(organizationId)) {
+ return;
+ }
+ }
+ let eventCollection = await this.stateService.getEventCollection();
+ if (eventCollection == null) {
+ eventCollection = [];
+ }
+ const event = new EventData();
+ event.type = eventType;
+ event.cipherId = cipherId;
+ event.date = new Date().toISOString();
+ event.organizationId = organizationId;
+ eventCollection.push(event);
+ await this.stateService.setEventCollection(eventCollection);
+ if (uploadImmediately) {
+ await this.eventUploadService.uploadEvents();
+ }
+ }
+}
diff --git a/libs/common/src/services/event/event-upload.service.ts b/libs/common/src/services/event/event-upload.service.ts
new file mode 100644
index 00000000000..ca118ea7e8f
--- /dev/null
+++ b/libs/common/src/services/event/event-upload.service.ts
@@ -0,0 +1,55 @@
+import { ApiService } from "../../abstractions/api.service";
+import { EventUploadService as EventUploadServiceAbstraction } from "../../abstractions/event/event-upload.service";
+import { LogService } from "../../abstractions/log.service";
+import { StateService } from "../../abstractions/state.service";
+import { EventRequest } from "../../models/request/event.request";
+
+export class EventUploadService implements EventUploadServiceAbstraction {
+ private inited = false;
+ constructor(
+ private apiService: ApiService,
+ private stateService: StateService,
+ private logService: LogService
+ ) {}
+
+ init(checkOnInterval: boolean) {
+ if (this.inited) {
+ return;
+ }
+
+ this.inited = true;
+ if (checkOnInterval) {
+ this.uploadEvents();
+ setInterval(() => this.uploadEvents(), 60 * 1000); // check every 60 seconds
+ }
+ }
+
+ async uploadEvents(userId?: string): Promise {
+ const authed = await this.stateService.getIsAuthenticated({ userId: userId });
+ if (!authed) {
+ return;
+ }
+ const eventCollection = await this.stateService.getEventCollection({ userId: userId });
+ if (eventCollection == null || eventCollection.length === 0) {
+ return;
+ }
+ const request = eventCollection.map((e) => {
+ const req = new EventRequest();
+ req.type = e.type;
+ req.cipherId = e.cipherId;
+ req.date = e.date;
+ req.organizationId = e.organizationId;
+ return req;
+ });
+ try {
+ await this.apiService.postEventsCollect(request);
+ this.clearEvents(userId);
+ } catch (e) {
+ this.logService.error(e);
+ }
+ }
+
+ private async clearEvents(userId?: string): Promise {
+ await this.stateService.setEventCollection(null, { userId: userId });
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 72c67ede2be..becef74c530 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -143,7 +143,7 @@
"lint-staged": "^13.0.3",
"mini-css-extract-plugin": "^2.4.5",
"node-ipc": "9.2.1",
- "pkg": "5.7.0",
+ "pkg": "5.8.0",
"postcss": "^8.4.14",
"postcss-loader": "^7.0.1",
"prettier": "^2.7.1",
@@ -216,7 +216,7 @@
},
"apps/desktop": {
"name": "@bitwarden/desktop",
- "version": "2022.11.0",
+ "version": "2022.11.1",
"hasInstallScript": true,
"license": "GPL-3.0"
},
@@ -34002,22 +34002,22 @@
}
},
"node_modules/pkg": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.7.0.tgz",
- "integrity": "sha512-PTiAjNq/CGAtK5qUBR6pjheqnipTFjeecgSgIKEcAOJA4GpmZeOZC8pMOoT0rfes5vHsmcFo7wbSRTAmXQurrg==",
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.0.tgz",
+ "integrity": "sha512-8h9PUDYFi+LOMLbIyGRdP21g08mAtHidSpofSrf8LWhxUWGHymaRzcopEGiynB5EhQmZUKM6PQ9kCImV2TpdjQ==",
"dev": true,
"dependencies": {
- "@babel/parser": "7.17.10",
- "@babel/types": "7.17.10",
+ "@babel/generator": "7.18.2",
+ "@babel/parser": "7.18.4",
+ "@babel/types": "7.18.4",
"chalk": "^4.1.2",
- "escodegen": "^2.0.0",
"fs-extra": "^9.1.0",
"globby": "^11.1.0",
"into-stream": "^6.0.0",
"is-core-module": "2.9.0",
"minimist": "^1.2.6",
"multistream": "^4.1.0",
- "pkg-fetch": "3.4.1",
+ "pkg-fetch": "3.4.2",
"prebuild-install": "6.1.4",
"resolve": "^1.22.0",
"stream-meter": "^1.0.4"
@@ -34047,9 +34047,9 @@
}
},
"node_modules/pkg-fetch": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.1.tgz",
- "integrity": "sha512-fS4cdayCa1r4jHkOKGPJKnS9PEs6OWZst+s+m0+CmhmPZObMnxoRnf9T9yUWl+lzM2b5aJF7cnQIySCT7Hq8Dg==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz",
+ "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==",
"dev": true,
"dependencies": {
"chalk": "^4.1.2",
@@ -34180,10 +34180,24 @@
"node": ">=4"
}
},
+ "node_modules/pkg/node_modules/@babel/generator": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
+ "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.2",
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/pkg/node_modules/@babel/parser": {
- "version": "7.17.10",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz",
- "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==",
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz",
+ "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -34193,9 +34207,9 @@
}
},
"node_modules/pkg/node_modules/@babel/types": {
- "version": "7.17.10",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz",
- "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==",
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
+ "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.16.7",
@@ -34205,6 +34219,20 @@
"node": ">=6.9.0"
}
},
+ "node_modules/pkg/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/pkg/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -69273,43 +69301,65 @@
}
},
"pkg": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.7.0.tgz",
- "integrity": "sha512-PTiAjNq/CGAtK5qUBR6pjheqnipTFjeecgSgIKEcAOJA4GpmZeOZC8pMOoT0rfes5vHsmcFo7wbSRTAmXQurrg==",
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.0.tgz",
+ "integrity": "sha512-8h9PUDYFi+LOMLbIyGRdP21g08mAtHidSpofSrf8LWhxUWGHymaRzcopEGiynB5EhQmZUKM6PQ9kCImV2TpdjQ==",
"dev": true,
"requires": {
- "@babel/parser": "7.17.10",
- "@babel/types": "7.17.10",
+ "@babel/generator": "7.18.2",
+ "@babel/parser": "7.18.4",
+ "@babel/types": "7.18.4",
"chalk": "^4.1.2",
- "escodegen": "^2.0.0",
"fs-extra": "^9.1.0",
"globby": "^11.1.0",
"into-stream": "^6.0.0",
"is-core-module": "2.9.0",
"minimist": "^1.2.6",
"multistream": "^4.1.0",
- "pkg-fetch": "3.4.1",
+ "pkg-fetch": "3.4.2",
"prebuild-install": "6.1.4",
"resolve": "^1.22.0",
"stream-meter": "^1.0.4"
},
"dependencies": {
+ "@babel/generator": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
+ "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.2",
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "jsesc": "^2.5.1"
+ }
+ },
"@babel/parser": {
- "version": "7.17.10",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz",
- "integrity": "sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==",
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz",
+ "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==",
"dev": true
},
"@babel/types": {
- "version": "7.17.10",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.10.tgz",
- "integrity": "sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==",
+ "version": "7.18.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
+ "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.16.7",
"to-fast-properties": "^2.0.0"
}
},
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -69334,9 +69384,9 @@
}
},
"pkg-fetch": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.1.tgz",
- "integrity": "sha512-fS4cdayCa1r4jHkOKGPJKnS9PEs6OWZst+s+m0+CmhmPZObMnxoRnf9T9yUWl+lzM2b5aJF7cnQIySCT7Hq8Dg==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz",
+ "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==",
"dev": true,
"requires": {
"chalk": "^4.1.2",
diff --git a/package.json b/package.json
index 50c1b6e6136..dfaa1925479 100644
--- a/package.json
+++ b/package.json
@@ -108,7 +108,7 @@
"lint-staged": "^13.0.3",
"mini-css-extract-plugin": "^2.4.5",
"node-ipc": "9.2.1",
- "pkg": "5.7.0",
+ "pkg": "5.8.0",
"postcss": "^8.4.14",
"postcss-loader": "^7.0.1",
"prettier": "^2.7.1",