From 84b179f53a5b4fa38d70a50c4f597f8d942c89e8 Mon Sep 17 00:00:00 2001 From: Alec Rippberger <127791530+alec-livefront@users.noreply.github.com> Date: Tue, 1 Apr 2025 18:46:40 -0500 Subject: [PATCH 1/6] refactor(auth): [PM-9698] remove deprecated SSO components Removes v1 SSO components in favor of new implementation as well as related orphaned styles/translations. Refs: PM-9698 --- .../src/auth/popup/sso-v1.component.html | 0 .../src/auth/popup/sso-v1.component.ts | 105 ---------- apps/browser/src/popup/app.module.ts | 2 - apps/desktop/src/app/app.module.ts | 2 - apps/desktop/src/auth/sso-v1.component.html | 9 - apps/desktop/src/auth/sso-v1.component.ts | 83 -------- apps/desktop/src/scss/pages.scss | 13 -- apps/web/src/app/auth/sso-v1.component.html | 22 --- apps/web/src/app/auth/sso-v1.component.ts | 186 ------------------ .../src/app/shared/loose-components.module.ts | 3 - 10 files changed, 425 deletions(-) delete mode 100644 apps/browser/src/auth/popup/sso-v1.component.html delete mode 100644 apps/browser/src/auth/popup/sso-v1.component.ts delete mode 100644 apps/desktop/src/auth/sso-v1.component.html delete mode 100644 apps/desktop/src/auth/sso-v1.component.ts delete mode 100644 apps/web/src/app/auth/sso-v1.component.html delete mode 100644 apps/web/src/app/auth/sso-v1.component.ts diff --git a/apps/browser/src/auth/popup/sso-v1.component.html b/apps/browser/src/auth/popup/sso-v1.component.html deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/apps/browser/src/auth/popup/sso-v1.component.ts b/apps/browser/src/auth/popup/sso-v1.component.ts deleted file mode 100644 index f56fe697e70..00000000000 --- a/apps/browser/src/auth/popup/sso-v1.component.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Component, Inject } from "@angular/core"; -import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; -import { ActivatedRoute, Router } from "@angular/router"; - -import { SsoComponent as BaseSsoComponent } from "@bitwarden/angular/auth/components/sso.component"; -import { WINDOW } from "@bitwarden/angular/services/injection-tokens"; -import { - LoginStrategyServiceAbstraction, - UserDecryptionOptionsServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -import { BrowserApi } from "../../platform/browser/browser-api"; - -@Component({ - selector: "app-sso", - templateUrl: "sso-v1.component.html", -}) -export class SsoComponentV1 extends BaseSsoComponent { - constructor( - ssoLoginService: SsoLoginServiceAbstraction, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - route: ActivatedRoute, - stateService: StateService, - platformUtilsService: PlatformUtilsService, - apiService: ApiService, - cryptoFunctionService: CryptoFunctionService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - syncService: SyncService, - environmentService: EnvironmentService, - logService: LogService, - userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, - configService: ConfigService, - masterPasswordService: InternalMasterPasswordServiceAbstraction, - accountService: AccountService, - private authService: AuthService, - @Inject(WINDOW) private win: Window, - toastService: ToastService, - ) { - super( - ssoLoginService, - loginStrategyService, - router, - i18nService, - route, - stateService, - platformUtilsService, - apiService, - cryptoFunctionService, - environmentService, - passwordGenerationService, - logService, - userDecryptionOptionsService, - configService, - masterPasswordService, - accountService, - toastService, - ); - - environmentService.environment$.pipe(takeUntilDestroyed()).subscribe((env) => { - this.redirectUri = env.getWebVaultUrl() + "/sso-connector.html"; - }); - this.clientId = "browser"; - - this.onSuccessfulLogin = async () => { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - syncService.fullSync(true); - - // If the vault is unlocked then this will clear keys from memory, which we don't want to do - if ((await this.authService.getAuthStatus()) !== AuthenticationStatus.Unlocked) { - BrowserApi.reloadOpenWindows(); - } - - this.win.close(); - }; - - this.onSuccessfulLoginTde = async () => { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - syncService.fullSync(true); - }; - - this.onSuccessfulLoginTdeNavigate = async () => { - this.win.close(); - }; - } -} diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index b2542679e06..71e310ad335 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -24,7 +24,6 @@ import { RemovePasswordComponent } from "../auth/popup/remove-password.component import { SetPasswordComponent } from "../auth/popup/set-password.component"; import { AccountSecurityComponent } from "../auth/popup/settings/account-security.component"; import { VaultTimeoutInputComponent } from "../auth/popup/settings/vault-timeout-input.component"; -import { SsoComponentV1 } from "../auth/popup/sso-v1.component"; import { UpdateTempPasswordComponent } from "../auth/popup/update-temp-password.component"; import { AutofillComponent } from "../autofill/popup/settings/autofill.component"; import { NotificationsSettingsComponent } from "../autofill/popup/settings/notifications.component"; @@ -89,7 +88,6 @@ import "../platform/popup/locales"; ColorPasswordPipe, ColorPasswordCountPipe, SetPasswordComponent, - SsoComponentV1, TabsV2Component, UpdateTempPasswordComponent, UserVerificationComponent, diff --git a/apps/desktop/src/app/app.module.ts b/apps/desktop/src/app/app.module.ts index b717afe4a41..fdc25ed642e 100644 --- a/apps/desktop/src/app/app.module.ts +++ b/apps/desktop/src/app/app.module.ts @@ -15,7 +15,6 @@ import { DeleteAccountComponent } from "../auth/delete-account.component"; import { LoginModule } from "../auth/login/login.module"; import { RemovePasswordComponent } from "../auth/remove-password.component"; import { SetPasswordComponent } from "../auth/set-password.component"; -import { SsoComponentV1 } from "../auth/sso-v1.component"; import { UpdateTempPasswordComponent } from "../auth/update-temp-password.component"; import { SshAgentService } from "../autofill/services/ssh-agent.service"; import { PremiumComponent } from "../billing/app/accounts/premium.component"; @@ -76,7 +75,6 @@ import { SharedModule } from "./shared/shared.module"; SetPasswordComponent, SettingsComponent, ShareComponent, - SsoComponentV1, UpdateTempPasswordComponent, VaultComponent, VaultTimeoutInputComponent, diff --git a/apps/desktop/src/auth/sso-v1.component.html b/apps/desktop/src/auth/sso-v1.component.html deleted file mode 100644 index cb5bba9dc66..00000000000 --- a/apps/desktop/src/auth/sso-v1.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
- Bitwarden -
- - {{ "loading" | i18n }} -
-
-
diff --git a/apps/desktop/src/auth/sso-v1.component.ts b/apps/desktop/src/auth/sso-v1.component.ts deleted file mode 100644 index 1bb6d8362a1..00000000000 --- a/apps/desktop/src/auth/sso-v1.component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Component } from "@angular/core"; -import { ActivatedRoute, Router } from "@angular/router"; - -import { SsoComponent as BaseSsoComponent } from "@bitwarden/angular/auth/components/sso.component"; -import { - LoginStrategyServiceAbstraction, - UserDecryptionOptionsServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -@Component({ - selector: "app-sso", - templateUrl: "sso-v1.component.html", -}) -export class SsoComponentV1 extends BaseSsoComponent { - constructor( - ssoLoginService: SsoLoginServiceAbstraction, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - syncService: SyncService, - route: ActivatedRoute, - stateService: StateService, - platformUtilsService: PlatformUtilsService, - apiService: ApiService, - cryptoFunctionService: CryptoFunctionService, - environmentService: EnvironmentService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - logService: LogService, - userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, - configService: ConfigService, - masterPasswordService: InternalMasterPasswordServiceAbstraction, - accountService: AccountService, - toastService: ToastService, - ) { - super( - ssoLoginService, - loginStrategyService, - router, - i18nService, - route, - stateService, - platformUtilsService, - apiService, - cryptoFunctionService, - environmentService, - passwordGenerationService, - logService, - userDecryptionOptionsService, - configService, - masterPasswordService, - accountService, - toastService, - ); - this.onSuccessfulLogin = async () => { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - syncService.fullSync(true); - }; - - this.onSuccessfulLoginTde = async () => { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - syncService.fullSync(true); - }; - - this.redirectUri = "bitwarden://sso-callback"; - this.clientId = "desktop"; - } -} diff --git a/apps/desktop/src/scss/pages.scss b/apps/desktop/src/scss/pages.scss index ecb36aae662..155ffaf0ad1 100644 --- a/apps/desktop/src/scss/pages.scss +++ b/apps/desktop/src/scss/pages.scss @@ -1,7 +1,6 @@ @import "variables.scss"; #lock-page, -#sso-page, #set-password-page, #remove-password-page { display: flex; @@ -106,18 +105,6 @@ } } -#sso-page { - .content { - width: 325px; - - .box { - margin-top: 30px; - margin-bottom: 30px; - text-align: center; - } - } -} - #set-password-page, #remove-password-page { .content { diff --git a/apps/web/src/app/auth/sso-v1.component.html b/apps/web/src/app/auth/sso-v1.component.html deleted file mode 100644 index 59abc92e872..00000000000 --- a/apps/web/src/app/auth/sso-v1.component.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
- - {{ "loading" | i18n }} -
-
-

{{ "ssoLogInWithOrgIdentifier" | i18n }}

- - {{ "ssoIdentifier" | i18n }} - - -
-
- - - {{ "cancel" | i18n }} - -
-
-
diff --git a/apps/web/src/app/auth/sso-v1.component.ts b/apps/web/src/app/auth/sso-v1.component.ts deleted file mode 100644 index d664f5b890b..00000000000 --- a/apps/web/src/app/auth/sso-v1.component.ts +++ /dev/null @@ -1,186 +0,0 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { Component, OnInit } from "@angular/core"; -import { FormControl, FormGroup, Validators } from "@angular/forms"; -import { ActivatedRoute, Router } from "@angular/router"; -import { firstValueFrom } from "rxjs"; -import { first } from "rxjs/operators"; - -import { SsoComponent as BaseSsoComponent } from "@bitwarden/angular/auth/components/sso.component"; -import { - LoginStrategyServiceAbstraction, - UserDecryptionOptionsServiceAbstraction, -} from "@bitwarden/auth/common"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { OrgDomainApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization-domain/org-domain-api.service.abstraction"; -import { OrganizationDomainSsoDetailsResponse } from "@bitwarden/common/admin-console/abstractions/organization-domain/responses/organization-domain-sso-details.response"; -import { VerifiedOrganizationDomainSsoDetailsResponse } from "@bitwarden/common/admin-console/abstractions/organization-domain/responses/verified-organization-domain-sso-details.response"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction"; -import { HttpStatusCode } from "@bitwarden/common/enums"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/key-management/master-password/abstractions/master-password.service.abstraction"; -import { ErrorResponse } from "@bitwarden/common/models/response/error.response"; -import { ListResponse } from "@bitwarden/common/models/response/list.response"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { CryptoFunctionService } from "@bitwarden/common/platform/abstractions/crypto-function.service"; -import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; -import { ToastService } from "@bitwarden/components"; -import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; - -@Component({ - selector: "app-sso", - templateUrl: "sso-v1.component.html", -}) -export class SsoComponentV1 extends BaseSsoComponent implements OnInit { - protected formGroup = new FormGroup({ - identifier: new FormControl(null, [Validators.required]), - }); - - get identifierFormControl() { - return this.formGroup.controls.identifier; - } - - constructor( - ssoLoginService: SsoLoginServiceAbstraction, - loginStrategyService: LoginStrategyServiceAbstraction, - router: Router, - i18nService: I18nService, - route: ActivatedRoute, - stateService: StateService, - platformUtilsService: PlatformUtilsService, - apiService: ApiService, - cryptoFunctionService: CryptoFunctionService, - environmentService: EnvironmentService, - passwordGenerationService: PasswordGenerationServiceAbstraction, - logService: LogService, - private orgDomainApiService: OrgDomainApiServiceAbstraction, - private validationService: ValidationService, - userDecryptionOptionsService: UserDecryptionOptionsServiceAbstraction, - configService: ConfigService, - masterPasswordService: InternalMasterPasswordServiceAbstraction, - accountService: AccountService, - toastService: ToastService, - ) { - super( - ssoLoginService, - loginStrategyService, - router, - i18nService, - route, - stateService, - platformUtilsService, - apiService, - cryptoFunctionService, - environmentService, - passwordGenerationService, - logService, - userDecryptionOptionsService, - configService, - masterPasswordService, - accountService, - toastService, - ); - this.redirectUri = window.location.origin + "/sso-connector.html"; - this.clientId = "web"; - } - - async ngOnInit() { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - super.ngOnInit(); - - // eslint-disable-next-line rxjs-angular/prefer-takeuntil, rxjs/no-async-subscribe - this.route.queryParams.pipe(first()).subscribe(async (qParams) => { - if (qParams.identifier != null) { - // SSO Org Identifier in query params takes precedence over claimed domains - this.identifierFormControl.setValue(qParams.identifier); - this.loggingIn = true; - await this.submit(); - } else { - // Note: this flow is written for web but both browser and desktop - // redirect here on SSO button click. - - // Check if email matches any claimed domains - if (qParams.email) { - // show loading spinner - this.loggingIn = true; - try { - if (await this.configService.getFeatureFlag(FeatureFlag.VerifiedSsoDomainEndpoint)) { - const response: ListResponse = - await this.orgDomainApiService.getVerifiedOrgDomainsByEmail(qParams.email); - - if (response.data.length > 0) { - this.identifierFormControl.setValue(response.data[0].organizationIdentifier); - await this.submit(); - return; - } - } else { - const response: OrganizationDomainSsoDetailsResponse = - await this.orgDomainApiService.getClaimedOrgDomainByEmail(qParams.email); - - if (response?.ssoAvailable && response?.verifiedDate) { - this.identifierFormControl.setValue(response.organizationIdentifier); - await this.submit(); - return; - } - } - } catch (error) { - this.handleGetClaimedDomainByEmailError(error); - } - - this.loggingIn = false; - } - - // Fallback to state svc if domain is unclaimed - const storedIdentifier = await this.ssoLoginService.getOrganizationSsoIdentifier(); - if (storedIdentifier != null) { - this.identifierFormControl.setValue(storedIdentifier); - } - } - }); - } - - private handleGetClaimedDomainByEmailError(error: any): void { - if (error instanceof ErrorResponse) { - const errorResponse: ErrorResponse = error as ErrorResponse; - switch (errorResponse.statusCode) { - case HttpStatusCode.NotFound: - //this is a valid case for a domain not found - return; - - default: - this.validationService.showError(errorResponse); - break; - } - } - } - - submit = async () => { - if (this.formGroup.invalid) { - return; - } - - const autoSubmit = (await firstValueFrom(this.route.queryParams)).identifier != null; - - this.identifier = this.identifierFormControl.value; - await this.ssoLoginService.setOrganizationSsoIdentifier(this.identifier); - if (this.clientId === "browser") { - document.cookie = `ssoHandOffMessage=${this.i18nService.t("ssoHandOff")};SameSite=strict`; - } - try { - await Object.getPrototypeOf(this).submit.call(this); - } catch (error) { - if (autoSubmit) { - await this.router.navigate(["/login"]); - } else { - this.validationService.showError(error); - } - } - }; -} diff --git a/apps/web/src/app/shared/loose-components.module.ts b/apps/web/src/app/shared/loose-components.module.ts index 70dbf63f1f8..41347c3f082 100644 --- a/apps/web/src/app/shared/loose-components.module.ts +++ b/apps/web/src/app/shared/loose-components.module.ts @@ -42,7 +42,6 @@ import { TwoFactorSetupYubiKeyComponent } from "../auth/settings/two-factor/two- import { TwoFactorSetupComponent } from "../auth/settings/two-factor/two-factor-setup.component"; import { TwoFactorVerifyComponent } from "../auth/settings/two-factor/two-factor-verify.component"; import { UserVerificationModule } from "../auth/shared/components/user-verification"; -import { SsoComponentV1 } from "../auth/sso-v1.component"; import { UpdatePasswordComponent } from "../auth/update-password.component"; import { UpdateTempPasswordComponent } from "../auth/update-temp-password.component"; import { VerifyEmailTokenComponent } from "../auth/verify-email-token.component"; @@ -146,7 +145,6 @@ import { SharedModule } from "./shared.module"; SetPasswordComponent, SponsoredFamiliesComponent, SponsoringOrgRowComponent, - SsoComponentV1, TwoFactorSetupAuthenticatorComponent, TwoFactorSetupDuoComponent, TwoFactorSetupEmailComponent, @@ -206,7 +204,6 @@ import { SharedModule } from "./shared.module"; SetPasswordComponent, SponsoredFamiliesComponent, SponsoringOrgRowComponent, - SsoComponentV1, TwoFactorSetupAuthenticatorComponent, TwoFactorSetupDuoComponent, TwoFactorSetupEmailComponent, From afcb656d128d8f301eea090cee9de83fe95b55d9 Mon Sep 17 00:00:00 2001 From: Jordan Aasen <166539328+jaasen-livefront@users.noreply.github.com> Date: Tue, 1 Apr 2025 16:48:41 -0700 Subject: [PATCH 2/6] [PM-17747] - remove emergency access attachments dialog. fix 404 (#13854) * remove emergency access attachments dialog. fix 404 * fix types * fix type issue --- .../emergency-access-attachments.component.ts | 66 ------------------- .../view/emergency-access-view.component.html | 22 ------- .../view/emergency-access-view.component.ts | 50 ++++---------- .../view/emergency-view-dialog.component.html | 2 +- .../view/emergency-view-dialog.component.ts | 6 ++ .../src/app/shared/loose-components.module.ts | 3 - libs/common/src/types/guid.ts | 1 + .../attachments-v2-view.component.html | 1 + .../attachments-v2-view.component.ts | 5 +- .../cipher-view/cipher-view.component.html | 3 +- .../src/cipher-view/cipher-view.component.ts | 5 +- .../download-attachment.component.ts | 6 +- 12 files changed, 37 insertions(+), 133 deletions(-) delete mode 100644 apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts diff --git a/apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts b/apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts deleted file mode 100644 index 73191e1539e..00000000000 --- a/apps/web/src/app/auth/settings/emergency-access/attachments/emergency-access-attachments.component.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Component } from "@angular/core"; - -import { AttachmentsComponent as BaseAttachmentsComponent } from "@bitwarden/angular/vault/components/attachments.component"; -import { ApiService } from "@bitwarden/common/abstractions/api.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; -import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; -import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service"; -import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service"; -import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; -import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; -import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; -import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; -import { AttachmentView } from "@bitwarden/common/vault/models/view/attachment.view"; -import { DialogService, ToastService } from "@bitwarden/components"; -import { KeyService } from "@bitwarden/key-management"; - -@Component({ - selector: "emergency-access-attachments", - templateUrl: "../../../../vault/individual-vault/attachments.component.html", -}) -export class EmergencyAccessAttachmentsComponent extends BaseAttachmentsComponent { - viewOnly = true; - canAccessAttachments = true; - - constructor( - cipherService: CipherService, - i18nService: I18nService, - keyService: KeyService, - encryptService: EncryptService, - stateService: StateService, - platformUtilsService: PlatformUtilsService, - apiService: ApiService, - logService: LogService, - fileDownloadService: FileDownloadService, - dialogService: DialogService, - billingAccountProfileStateService: BillingAccountProfileStateService, - accountService: AccountService, - toastService: ToastService, - ) { - super( - cipherService, - i18nService, - keyService, - encryptService, - platformUtilsService, - apiService, - window, - logService, - stateService, - fileDownloadService, - dialogService, - billingAccountProfileStateService, - accountService, - toastService, - ); - } - - protected async init() { - // Do nothing since cipher is already decoded - } - - protected showFixOldAttachments(attachment: AttachmentView) { - return false; - } -} diff --git a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html index a936e3a427d..87e2643c178 100644 --- a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html +++ b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.html @@ -38,28 +38,6 @@
{{ currentCipher.subTitle }} - -
- - - - -
- diff --git a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts index 1e3d0cf705f..bf7ca29da9b 100644 --- a/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts +++ b/apps/web/src/app/auth/settings/emergency-access/view/emergency-access-view.component.ts @@ -1,15 +1,13 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { Component, OnInit, ViewChild, ViewContainerRef } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; +import { firstValueFrom } from "rxjs"; -import { ModalService } from "@bitwarden/angular/services/modal.service"; +import { EmergencyAccessId } from "@bitwarden/common/types/guid"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { DialogService } from "@bitwarden/components"; import { CipherFormConfigService, DefaultCipherFormConfigService } from "@bitwarden/vault"; import { EmergencyAccessService } from "../../../emergency-access"; -import { EmergencyAccessAttachmentsComponent } from "../attachments/emergency-access-attachments.component"; import { EmergencyViewDialogComponent } from "./emergency-view-dialog.component"; @@ -20,56 +18,34 @@ import { EmergencyViewDialogComponent } from "./emergency-view-dialog.component" }) export class EmergencyAccessViewComponent implements OnInit { @ViewChild("attachments", { read: ViewContainerRef, static: true }) - attachmentsModalRef: ViewContainerRef; - - id: string; + id: EmergencyAccessId | null = null; ciphers: CipherView[] = []; loaded = false; constructor( - private modalService: ModalService, private router: Router, private route: ActivatedRoute, private emergencyAccessService: EmergencyAccessService, private dialogService: DialogService, ) {} - ngOnInit() { - // eslint-disable-next-line rxjs-angular/prefer-takeuntil - this.route.params.subscribe((qParams) => { - if (qParams.id == null) { - return this.router.navigate(["settings/emergency-access"]); - } + async ngOnInit() { + const qParams = await firstValueFrom(this.route.params); + if (qParams.id == null) { + await this.router.navigate(["settings/emergency-access"]); + return; + } - this.id = qParams.id; - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.load(); - }); + this.id = qParams.id; + this.ciphers = await this.emergencyAccessService.getViewOnlyCiphers(qParams.id); + this.loaded = true; } async selectCipher(cipher: CipherView) { EmergencyViewDialogComponent.open(this.dialogService, { cipher, + emergencyAccessId: this.id!, }); return; } - - async load() { - this.ciphers = await this.emergencyAccessService.getViewOnlyCiphers(this.id); - this.loaded = true; - } - - // FIXME PM-17747: This will also need to be replaced with the new AttachmentViewDialog - async viewAttachments(cipher: CipherView) { - await this.modalService.openViewRef( - EmergencyAccessAttachmentsComponent, - this.attachmentsModalRef, - (comp) => { - comp.cipher = cipher; - comp.emergencyAccessId = this.id; - }, - ); - } } diff --git a/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.html b/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.html index be38e1d9505..b3d8e48260a 100644 --- a/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.html +++ b/apps/web/src/app/auth/settings/emergency-access/view/emergency-view-dialog.component.html @@ -3,7 +3,7 @@ {{ title }}
- +