From 22678768605b5554c0b2b22043c508261d9a8b47 Mon Sep 17 00:00:00 2001
From: rr-bw <102181210+rr-bw@users.noreply.github.com>
Date: Mon, 7 Apr 2025 11:58:50 -0700
Subject: [PATCH] refactor(set-change-password): [Auth/PM-18206] Update
InputPasswordComponent to handle multiple flows (#13745)
Updates the InputPasswordComponent so that it can eventually be used in multiple set/change password scenarios.
Most importantly, this PR adds an InputPasswordFlow enum and @Input so that parent components can dictate which UI elements to show.
---
apps/browser/src/_locales/en/messages.json | 3 +
apps/desktop/src/locales/en/messages.json | 3 +
.../web-registration-finish.service.spec.ts | 14 +-
.../complete-trial-initiation.component.html | 6 +-
.../complete-trial-initiation.component.ts | 10 +-
apps/web/src/locales/en/messages.json | 3 +
.../input-password.component.html | 76 +++++++--
.../input-password.component.ts | 156 ++++++++++++++----
.../angular/input-password/input-password.mdx | 90 +++++++---
.../input-password/input-password.stories.ts | 91 +++++++++-
.../input-password/password-input-result.ts | 12 +-
...efault-registration-finish.service.spec.ts | 6 +-
.../default-registration-finish.service.ts | 2 +-
.../registration-finish.component.html | 3 +-
.../registration-finish.component.ts | 9 +-
.../default-set-password-jit.service.spec.ts | 6 +-
.../default-set-password-jit.service.ts | 6 +-
.../set-password-jit.component.html | 3 +-
.../set-password-jit.component.ts | 6 +-
.../set-password-jit.service.abstraction.ts | 2 +-
20 files changed, 394 insertions(+), 113 deletions(-)
diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json
index 54024b83f9..586e7e1f2c 100644
--- a/apps/browser/src/_locales/en/messages.json
+++ b/apps/browser/src/_locales/en/messages.json
@@ -2297,6 +2297,9 @@
"privacyPolicy": {
"message": "Privacy Policy"
},
+ "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": {
+ "message": "Your new password cannot be the same as your current password."
+ },
"hintEqualsPassword": {
"message": "Your password hint cannot be the same as your password."
},
diff --git a/apps/desktop/src/locales/en/messages.json b/apps/desktop/src/locales/en/messages.json
index f1c6378079..8850cbe5a3 100644
--- a/apps/desktop/src/locales/en/messages.json
+++ b/apps/desktop/src/locales/en/messages.json
@@ -2072,6 +2072,9 @@
"personalOwnershipSubmitError": {
"message": "Due to an enterprise policy, you are restricted from saving items to your individual vault. Change the ownership option to an organization and choose from available collections."
},
+ "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": {
+ "message": "Your new password cannot be the same as your current password."
+ },
"hintEqualsPassword": {
"message": "Your password hint cannot be the same as your password."
},
diff --git a/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts b/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts
index 48b74dc5e2..aa02e28b3b 100644
--- a/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts
+++ b/apps/web/src/app/auth/core/services/registration/web-registration-finish.service.spec.ts
@@ -187,11 +187,11 @@ describe("WebRegistrationFinishService", () => {
masterKey = new SymmetricCryptoKey(new Uint8Array(64).buffer as CsprngArray) as MasterKey;
passwordInputResult = {
masterKey: masterKey,
- masterKeyHash: "masterKeyHash",
+ serverMasterKeyHash: "serverMasterKeyHash",
localMasterKeyHash: "localMasterKeyHash",
kdfConfig: DEFAULT_KDF_CONFIG,
hint: "hint",
- password: "password",
+ newPassword: "newPassword",
};
userKey = new SymmetricCryptoKey(new Uint8Array(64).buffer as CsprngArray) as UserKey;
@@ -239,7 +239,7 @@ describe("WebRegistrationFinishService", () => {
expect.objectContaining({
email,
emailVerificationToken: emailVerificationToken,
- masterPasswordHash: passwordInputResult.masterKeyHash,
+ masterPasswordHash: passwordInputResult.serverMasterKeyHash,
masterPasswordHint: passwordInputResult.hint,
userSymmetricKey: userKeyEncString.encryptedString,
userAsymmetricKeys: {
@@ -277,7 +277,7 @@ describe("WebRegistrationFinishService", () => {
expect.objectContaining({
email,
emailVerificationToken: undefined,
- masterPasswordHash: passwordInputResult.masterKeyHash,
+ masterPasswordHash: passwordInputResult.serverMasterKeyHash,
masterPasswordHint: passwordInputResult.hint,
userSymmetricKey: userKeyEncString.encryptedString,
userAsymmetricKeys: {
@@ -320,7 +320,7 @@ describe("WebRegistrationFinishService", () => {
expect.objectContaining({
email,
emailVerificationToken: undefined,
- masterPasswordHash: passwordInputResult.masterKeyHash,
+ masterPasswordHash: passwordInputResult.serverMasterKeyHash,
masterPasswordHint: passwordInputResult.hint,
userSymmetricKey: userKeyEncString.encryptedString,
userAsymmetricKeys: {
@@ -365,7 +365,7 @@ describe("WebRegistrationFinishService", () => {
expect.objectContaining({
email,
emailVerificationToken: undefined,
- masterPasswordHash: passwordInputResult.masterKeyHash,
+ masterPasswordHash: passwordInputResult.serverMasterKeyHash,
masterPasswordHint: passwordInputResult.hint,
userSymmetricKey: userKeyEncString.encryptedString,
userAsymmetricKeys: {
@@ -412,7 +412,7 @@ describe("WebRegistrationFinishService", () => {
expect.objectContaining({
email,
emailVerificationToken: undefined,
- masterPasswordHash: passwordInputResult.masterKeyHash,
+ masterPasswordHash: passwordInputResult.serverMasterKeyHash,
masterPasswordHint: passwordInputResult.hint,
userSymmetricKey: userKeyEncString.encryptedString,
userAsymmetricKeys: {
diff --git a/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.html b/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.html
index 416d400426..8118b1e512 100644
--- a/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.html
+++ b/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.html
@@ -1,19 +1,21 @@
diff --git a/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.ts b/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.ts
index 27ce4dc9f5..e2a4149a58 100644
--- a/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.ts
+++ b/apps/web/src/app/billing/trial-initiation/complete-trial-initiation/complete-trial-initiation.component.ts
@@ -6,7 +6,11 @@ import { FormBuilder, Validators } from "@angular/forms";
import { ActivatedRoute, Router } from "@angular/router";
import { firstValueFrom, Subject, switchMap, takeUntil } from "rxjs";
-import { PasswordInputResult, RegistrationFinishService } from "@bitwarden/auth/angular";
+import {
+ InputPasswordFlow,
+ PasswordInputResult,
+ RegistrationFinishService,
+} from "@bitwarden/auth/angular";
import { LoginStrategyServiceAbstraction, PasswordLoginCredentials } from "@bitwarden/auth/common";
import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
@@ -47,6 +51,8 @@ export type InitiationPath =
export class CompleteTrialInitiationComponent implements OnInit, OnDestroy {
@ViewChild("stepper", { static: false }) verticalStepper: VerticalStepperComponent;
+ InputPasswordFlow = InputPasswordFlow;
+
/** Password Manager or Secrets Manager */
product: ProductType;
/** The tier of product being subscribed to */
@@ -363,7 +369,7 @@ export class CompleteTrialInitiationComponent implements OnInit, OnDestroy {
return;
}
- await this.logIn(passwordInputResult.password, captchaToken);
+ await this.logIn(passwordInputResult.newPassword, captchaToken);
this.submitting = false;
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 6c730338fe..3300f73eb3 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -5707,6 +5707,9 @@
"webAuthnSuccess": {
"message": "WebAuthn verified successfully! You may close this tab."
},
+ "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": {
+ "message": "Your new password cannot be the same as your current password."
+ },
"hintEqualsPassword": {
"message": "Your password hint cannot be the same as your password."
},
diff --git a/libs/auth/src/angular/input-password/input-password.component.html b/libs/auth/src/angular/input-password/input-password.component.html
index 114d9b8fb8..39995f9f44 100644
--- a/libs/auth/src/angular/input-password/input-password.component.html
+++ b/libs/auth/src/angular/input-password/input-password.component.html
@@ -4,14 +4,36 @@
[policy]="masterPasswordPolicyOptions"
>
+
+ {{ "currentMasterPass" | i18n }}
+
+
+
+
- {{ "masterPassword" | i18n }}
+ {{ "newMasterPass" | i18n }}
@@ -38,10 +60,10 @@
{{ "confirmMasterPassword" | i18n }}