diff --git a/apps/.vscode/launch.json b/apps/.vscode/launch.json
new file mode 100644
index 00000000000..2be50c4fa2d
--- /dev/null
+++ b/apps/.vscode/launch.json
@@ -0,0 +1,15 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "pwa-chrome",
+ "request": "launch",
+ "name": "Launch Chrome against localhost",
+ "url": "https://localhost:8080/#",
+ "webRoot": "${workspaceFolder}"
+ }
+ ]
+}
diff --git a/apps/desktop/src/app/vault/export.component.ts b/apps/desktop/src/app/vault/export.component.ts
index b1e48abcddd..8087504f67e 100644
--- a/apps/desktop/src/app/vault/export.component.ts
+++ b/apps/desktop/src/app/vault/export.component.ts
@@ -4,6 +4,8 @@ import { Component, OnInit } from "@angular/core";
import { FormBuilder } from "@angular/forms";
import { ExportComponent as BaseExportComponent } from "@bitwarden/angular/components/export.component";
+import { ModalConfig, ModalService } from "@bitwarden/angular/services/modal.service";
+import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { BroadcasterService } from "@bitwarden/common/abstractions/broadcaster.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { EventService } from "@bitwarden/common/abstractions/event.service";
@@ -12,7 +14,9 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { PolicyService } from "@bitwarden/common/abstractions/policy.service";
+import { StateService } from "@bitwarden/common/abstractions/state.service";
import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification.service";
+import { UserVerificationPromptService } from "@bitwarden/common/abstractions/userVerificationPrompt.service";
const BroadcasterSubscriptionId = "ExportComponent";
@@ -31,7 +35,12 @@ export class ExportComponent extends BaseExportComponent implements OnInit {
userVerificationService: UserVerificationService,
formBuilder: FormBuilder,
private broadcasterService: BroadcasterService,
- logService: LogService
+ logService: LogService,
+ protected modalService: ModalService,
+ protected apiService: ApiService,
+ protected stateService: StateService,
+ protected userVerificationPromptService: UserVerificationPromptService,
+ protected modalConfig: ModalConfig
) {
super(
cryptoService,
@@ -43,7 +52,12 @@ export class ExportComponent extends BaseExportComponent implements OnInit {
window,
logService,
userVerificationService,
- formBuilder
+ formBuilder,
+ modalService,
+ apiService,
+ stateService,
+ userVerificationPromptService,
+ modalConfig
);
}
diff --git a/apps/web/src/app/components/file-password-prompt.component.html b/apps/web/src/app/components/file-password-prompt.component.html
new file mode 100644
index 00000000000..993d957af66
--- /dev/null
+++ b/apps/web/src/app/components/file-password-prompt.component.html
@@ -0,0 +1,64 @@
+
diff --git a/apps/web/src/app/components/file-password-prompt.component.ts b/apps/web/src/app/components/file-password-prompt.component.ts
new file mode 100644
index 00000000000..b055107c80c
--- /dev/null
+++ b/apps/web/src/app/components/file-password-prompt.component.ts
@@ -0,0 +1,8 @@
+import { Component } from "@angular/core";
+
+import { FilePasswordPromptComponent as BaseFilePasswordPrompt } from "@bitwarden/angular/components/file-password-prompt.component";
+
+@Component({
+ templateUrl: "file-password-prompt.component.html",
+})
+export class FilePasswordPromptComponent extends BaseFilePasswordPrompt {}
diff --git a/apps/web/src/app/components/user-verification-prompt.component.html b/apps/web/src/app/components/user-verification-prompt.component.html
new file mode 100644
index 00000000000..9f116a84a98
--- /dev/null
+++ b/apps/web/src/app/components/user-verification-prompt.component.html
@@ -0,0 +1,36 @@
+
diff --git a/apps/web/src/app/components/user-verification-prompt.component.ts b/apps/web/src/app/components/user-verification-prompt.component.ts
new file mode 100644
index 00000000000..e057193affc
--- /dev/null
+++ b/apps/web/src/app/components/user-verification-prompt.component.ts
@@ -0,0 +1,8 @@
+import { Component } from "@angular/core";
+
+import { UserVerificationPromptComponent as BaseUserVerificationPrompt } from "@bitwarden/angular/components/user-verification-prompt.component";
+
+@Component({
+ templateUrl: "user-verification-prompt.component.html",
+})
+export class UserVerificationPromptComponent extends BaseUserVerificationPrompt {}
diff --git a/apps/web/src/app/modules/loose-components.module.ts b/apps/web/src/app/modules/loose-components.module.ts
index 45bb482036f..bd6364e99f6 100644
--- a/apps/web/src/app/modules/loose-components.module.ts
+++ b/apps/web/src/app/modules/loose-components.module.ts
@@ -19,11 +19,13 @@ import { UpdatePasswordComponent } from "../accounts/update-password.component";
import { UpdateTempPasswordComponent } from "../accounts/update-temp-password.component";
import { VerifyEmailTokenComponent } from "../accounts/verify-email-token.component";
import { VerifyRecoverDeleteComponent } from "../accounts/verify-recover-delete.component";
+import { FilePasswordPromptComponent } from "../components/file-password-prompt.component";
import { NestedCheckboxComponent } from "../components/nested-checkbox.component";
import { OrganizationSwitcherComponent } from "../components/organization-switcher.component";
import { PasswordRepromptComponent } from "../components/password-reprompt.component";
import { PasswordStrengthComponent } from "../components/password-strength.component";
import { PremiumBadgeComponent } from "../components/premium-badge.component";
+import { UserVerificationPromptComponent } from "../components/user-verification-prompt.component";
import { FooterComponent } from "../layouts/footer.component";
import { FrontendLayoutComponent } from "../layouts/frontend-layout.component";
import { NavbarComponent } from "../layouts/navbar.component";
@@ -271,6 +273,8 @@ import { OrganizationBadgeModule } from "./vault/modules/organization-badge/orga
PasswordGeneratorHistoryComponent,
PasswordGeneratorPolicyComponent,
PasswordRepromptComponent,
+ FilePasswordPromptComponent,
+ UserVerificationPromptComponent,
PasswordStrengthComponent,
PaymentComponent,
PaymentMethodComponent,
@@ -430,6 +434,7 @@ import { OrganizationBadgeModule } from "./vault/modules/organization-badge/orga
PasswordGeneratorHistoryComponent,
PasswordGeneratorPolicyComponent,
PasswordRepromptComponent,
+ FilePasswordPromptComponent,
PasswordStrengthComponent,
PaymentComponent,
PaymentMethodComponent,
diff --git a/apps/web/src/app/organizations/tools/export.component.ts b/apps/web/src/app/organizations/tools/export.component.ts
index 8c482f58b7a..d943b4615a3 100644
--- a/apps/web/src/app/organizations/tools/export.component.ts
+++ b/apps/web/src/app/organizations/tools/export.component.ts
@@ -2,6 +2,9 @@ import { Component } from "@angular/core";
import { FormBuilder } from "@angular/forms";
import { ActivatedRoute } from "@angular/router";
+import { ModalConfig, ModalService } from "@bitwarden/angular/services/modal.service";
+import { UserVerificationPromptService } from "@bitwarden/angular/services/userVerificationPrompt.service";
+import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { CryptoService } from "@bitwarden/common/abstractions/crypto.service";
import { EventService } from "@bitwarden/common/abstractions/event.service";
import { ExportService } from "@bitwarden/common/abstractions/export.service";
@@ -9,6 +12,7 @@ import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
import { PolicyService } from "@bitwarden/common/abstractions/policy.service";
+import { StateService } from "@bitwarden/common/abstractions/state.service";
import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification.service";
import { ExportComponent as BaseExportComponent } from "../../tools/export.component";
@@ -28,7 +32,12 @@ export class ExportComponent extends BaseExportComponent {
policyService: PolicyService,
logService: LogService,
userVerificationService: UserVerificationService,
- formBuilder: FormBuilder
+ formBuilder: FormBuilder,
+ modalService: ModalService,
+ apiService: ApiService,
+ stateService: StateService,
+ userVerificationPromptService: UserVerificationPromptService,
+ modalConfig: ModalConfig
) {
super(
cryptoService,
@@ -39,7 +48,12 @@ export class ExportComponent extends BaseExportComponent {
policyService,
logService,
userVerificationService,
- formBuilder
+ formBuilder,
+ modalService,
+ apiService,
+ stateService,
+ userVerificationPromptService,
+ modalConfig
);
}
diff --git a/apps/web/src/app/organizations/tools/import.component.ts b/apps/web/src/app/organizations/tools/import.component.ts
index 08aea5b1aca..d6383edacf1 100644
--- a/apps/web/src/app/organizations/tools/import.component.ts
+++ b/apps/web/src/app/organizations/tools/import.component.ts
@@ -1,8 +1,10 @@
import { Component } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router";
+import { ModalService } from "@bitwarden/angular/services/modal.service";
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
import { ImportService } from "@bitwarden/common/abstractions/import.service";
+import { KeyConnectorService } from "@bitwarden/common/abstractions/keyConnector.service";
import { LogService } from "@bitwarden/common/abstractions/log.service";
import { OrganizationService } from "@bitwarden/common/abstractions/organization.service";
import { PlatformUtilsService } from "@bitwarden/common/abstractions/platformUtils.service";
@@ -25,9 +27,20 @@ export class ImportComponent extends BaseImportComponent {
platformUtilsService: PlatformUtilsService,
policyService: PolicyService,
private organizationService: OrganizationService,
- logService: LogService
+ logService: LogService,
+ modalService: ModalService,
+ keyConnectorService: KeyConnectorService
) {
- super(i18nService, importService, router, platformUtilsService, policyService, logService);
+ super(
+ i18nService,
+ importService,
+ router,
+ platformUtilsService,
+ policyService,
+ logService,
+ modalService,
+ keyConnectorService
+ );
}
async ngOnInit() {
diff --git a/apps/web/src/app/services/services.module.ts b/apps/web/src/app/services/services.module.ts
index cf4b290e62b..cdc2783254f 100644
--- a/apps/web/src/app/services/services.module.ts
+++ b/apps/web/src/app/services/services.module.ts
@@ -9,11 +9,17 @@ import {
LOCALES_DIRECTORY,
SYSTEM_LANGUAGE,
} from "@bitwarden/angular/services/jslib-services.module";
-import { ModalService as ModalServiceAbstraction } from "@bitwarden/angular/services/modal.service";
+import {
+ ModalService as ModalServiceAbstraction,
+ ModalConfig as ModalConfigAbstraction,
+ ModalConfig,
+} from "@bitwarden/angular/services/modal.service";
import { ApiService as ApiServiceAbstraction } from "@bitwarden/common/abstractions/api.service";
import { CipherService as CipherServiceAbstraction } from "@bitwarden/common/abstractions/cipher.service";
import { CollectionService as CollectionServiceAbstraction } from "@bitwarden/common/abstractions/collection.service";
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/abstractions/crypto.service";
+import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/abstractions/cryptoFunction.service";
+import { ExportService as ExportServiceAbstraction } from "@bitwarden/common/abstractions/export.service";
import { FolderService as FolderServiceAbstraction } from "@bitwarden/common/abstractions/folder.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/abstractions/i18n.service";
import { ImportService as ImportServiceAbstraction } from "@bitwarden/common/abstractions/import.service";
@@ -24,7 +30,9 @@ import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwar
import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/abstractions/state.service";
import { StateMigrationService as StateMigrationServiceAbstraction } from "@bitwarden/common/abstractions/stateMigration.service";
import { StorageService as StorageServiceAbstraction } from "@bitwarden/common/abstractions/storage.service";
+import { UserVerificationPromptService as UserVerificationPromptServiceAbstraction } from "@bitwarden/common/abstractions/userVerificationPrompt.service";
import { StateFactory } from "@bitwarden/common/factories/stateFactory";
+import { ExportService } from "@bitwarden/common/services/export.service";
import { ImportService } from "@bitwarden/common/services/import.service";
import { StateService as StateServiceAbstraction } from "../../abstractions/state.service";
@@ -37,6 +45,7 @@ import { MemoryStorageService } from "../../services/memoryStorage.service";
import { PasswordRepromptService } from "../../services/passwordReprompt.service";
import { StateService } from "../../services/state.service";
import { StateMigrationService } from "../../services/stateMigration.service";
+import { UserVerificationPromptService } from "../../services/userVerificationPrompt.service";
import { WebPlatformUtilsService } from "../../services/webPlatformUtils.service";
import { HomeGuard } from "../guards/home.guard";
import { PermissionsGuard as OrgPermissionsGuard } from "../organizations/guards/permissions.guard";
@@ -90,6 +99,7 @@ import { RouterService } from "./router.service";
},
{ provide: MessagingServiceAbstraction, useClass: BroadcasterMessagingService },
{ provide: ModalServiceAbstraction, useClass: ModalService },
+ { provide: ModalConfigAbstraction, useClass: ModalConfig },
{
provide: ImportServiceAbstraction,
useClass: ImportService,
@@ -103,6 +113,17 @@ import { RouterService } from "./router.service";
CryptoServiceAbstraction,
],
},
+ {
+ provide: ExportServiceAbstraction,
+ useClass: ExportService,
+ deps: [
+ FolderServiceAbstraction,
+ CipherServiceAbstraction,
+ ApiServiceAbstraction,
+ CryptoServiceAbstraction,
+ CryptoFunctionServiceAbstraction,
+ ],
+ },
{
provide: StateMigrationServiceAbstraction,
useClass: StateMigrationService,
@@ -128,6 +149,10 @@ import { RouterService } from "./router.service";
provide: PasswordRepromptServiceAbstraction,
useClass: PasswordRepromptService,
},
+ {
+ provide: UserVerificationPromptServiceAbstraction,
+ useClass: UserVerificationPromptService,
+ },
HomeGuard,
],
})
diff --git a/apps/web/src/app/tools/export.component.html b/apps/web/src/app/tools/export.component.html
index da667f3e44a..e030428e7ea 100644
--- a/apps/web/src/app/tools/export.component.html
+++ b/apps/web/src/app/tools/export.component.html
@@ -4,6 +4,7 @@
ngNativeValidate
[appApiAction]="formPromise"
[formGroup]="exportForm"
+ *ngIf="exportForm"
>