diff --git a/libs/auth/src/angular/input-password/input-password.component.ts b/libs/auth/src/angular/input-password/input-password.component.ts
index 49d02361d49..a8220595481 100644
--- a/libs/auth/src/angular/input-password/input-password.component.ts
+++ b/libs/auth/src/angular/input-password/input-password.component.ts
@@ -3,17 +3,12 @@ import { ReactiveFormsModule, FormBuilder, Validators } from "@angular/forms";
import { JslibModule } from "@bitwarden/angular/jslib.module";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
-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";
import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options";
-import {
- DEFAULT_KDF_CONFIG,
- PBKDF2KdfConfig,
-} from "@bitwarden/common/auth/models/domain/kdf-config";
+import { DEFAULT_KDF_CONFIG } from "@bitwarden/common/auth/models/domain/kdf-config";
import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { Utils } from "@bitwarden/common/platform/misc/utils";
-import { MasterKey } from "@bitwarden/common/types/key";
import {
AsyncActionsModule,
ButtonModule,
@@ -29,12 +24,7 @@ import { InputsFieldMatch } from "../../../../angular/src/auth/validators/inputs
import { SharedModule } from "../../../../components/src/shared";
import { PasswordCalloutComponent } from "../password-callout/password-callout.component";
-export interface PasswordInputResult {
- masterKey: MasterKey;
- masterKeyHash: string;
- kdfConfig: PBKDF2KdfConfig;
- hint: string;
-}
+import { PasswordInputResult } from "./password-input-result";
@Component({
standalone: true,
@@ -58,14 +48,13 @@ export class InputPasswordComponent implements OnInit {
@Input({ required: true }) email: string;
@Input() protected buttonText: string;
- @Input() private orgId: string;
+ @Input() masterPasswordPolicyOptions: MasterPasswordPolicyOptions | null = null;
private minHintLength = 0;
protected maxHintLength = 50;
protected minPasswordLength = Utils.minimumPasswordLength;
protected minPasswordMsg = "";
- protected masterPasswordPolicy: MasterPasswordPolicyOptions;
protected passwordStrengthResult: any;
protected showErrorSummary = false;
protected showPassword = false;
@@ -106,18 +95,16 @@ export class InputPasswordComponent implements OnInit {
private i18nService: I18nService,
private policyService: PolicyService,
private toastService: ToastService,
- private policyApiService: PolicyApiServiceAbstraction,
) {}
async ngOnInit() {
- this.masterPasswordPolicy = await this.policyApiService.getMasterPasswordPolicyOptsForOrgUser(
- this.orgId,
- );
-
- if (this.masterPasswordPolicy != null && this.masterPasswordPolicy.minLength > 0) {
+ if (
+ this.masterPasswordPolicyOptions != null &&
+ this.masterPasswordPolicyOptions.minLength > 0
+ ) {
this.minPasswordMsg = this.i18nService.t(
"characterMinimum",
- this.masterPasswordPolicy.minLength,
+ this.masterPasswordPolicyOptions.minLength,
);
} else {
this.minPasswordMsg = this.i18nService.t("characterMinimum", this.minPasswordLength);
@@ -157,11 +144,11 @@ export class InputPasswordComponent implements OnInit {
// Check if password meets org policy requirements
if (
- this.masterPasswordPolicy != null &&
+ this.masterPasswordPolicyOptions != null &&
!this.policyService.evaluateMasterPassword(
this.passwordStrengthResult.score,
password,
- this.masterPasswordPolicy,
+ this.masterPasswordPolicyOptions,
)
) {
this.toastService.showToast({
diff --git a/libs/auth/src/angular/input-password/input-password.mdx b/libs/auth/src/angular/input-password/input-password.mdx
index d442ea02fc9..5110e2b3130 100644
--- a/libs/auth/src/angular/input-password/input-password.mdx
+++ b/libs/auth/src/angular/input-password/input-password.mdx
@@ -22,8 +22,8 @@ the parent component to act on those values as needed.
`InputPasswordComponent` can create a master key.
- `buttonText` (optional) - an `i18n` translated string that can be used as button text (default
text is "Set master password").
-- `orgId` (optional) - used to retreive and enforce the master password policy requirements for an
- org.
+- `masterPasswordPolicyOptions` (optional) - used to display and enforce master password policy
+ requirements.
diff --git a/libs/auth/src/angular/input-password/input-password.stories.ts b/libs/auth/src/angular/input-password/input-password.stories.ts
index a0dee87b27f..feccd8ccba5 100644
--- a/libs/auth/src/angular/input-password/input-password.stories.ts
+++ b/libs/auth/src/angular/input-password/input-password.stories.ts
@@ -2,11 +2,9 @@ import { importProvidersFrom } from "@angular/core";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { action } from "@storybook/addon-actions";
import { Meta, StoryObj, applicationConfig } from "@storybook/angular";
-import { of } from "rxjs";
import { ZXCVBNResult } from "zxcvbn";
import { AuditService } from "@bitwarden/common/abstractions/audit.service";
-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";
import { MasterPasswordPolicyOptions } from "@bitwarden/common/admin-console/models/domain/master-password-policy-options";
import { CryptoService } from "@bitwarden/common/platform/abstractions/crypto.service";
@@ -17,22 +15,10 @@ import { PreloadedEnglishI18nModule } from "../../../../../apps/web/src/app/core
import { InputPasswordComponent } from "./input-password.component";
-const mockMasterPasswordPolicyOptions = {
- minComplexity: 4,
- minLength: 14,
- requireUpper: true,
- requireLower: true,
- requireNumbers: true,
- requireSpecial: true,
-} as MasterPasswordPolicyOptions;
-
export default {
title: "Auth/Input Password",
component: InputPasswordComponent,
-} as Meta;
-
-const decorators = (options: { hasPolicy?: boolean }) => {
- return [
+ decorators: [
applicationConfig({
providers: [
importProvidersFrom(PreloadedEnglishI18nModule),
@@ -56,18 +42,9 @@ const decorators = (options: { hasPolicy?: boolean }) => {
openSimpleDialog: () => Promise.resolve(true),
} as Partial
,
},
- {
- provide: PolicyApiServiceAbstraction,
- useValue: {
- getMasterPasswordPolicyOptsForOrgUser: () =>
- options.hasPolicy ? mockMasterPasswordPolicyOptions : null,
- } as Partial,
- },
{
provide: PolicyService,
useValue: {
- masterPasswordPolicyOptions$: () =>
- options.hasPolicy ? of(mockMasterPasswordPolicyOptions) : null,
evaluateMasterPassword: (score) => {
if (score < 4) {
return false;
@@ -81,7 +58,6 @@ const decorators = (options: { hasPolicy?: boolean }) => {
useValue: {
getPasswordStrength: (password) => {
let score = 0;
-
if (password.length === 0) {
score = null;
} else if (password.length <= 4) {
@@ -93,7 +69,6 @@ const decorators = (options: { hasPolicy?: boolean }) => {
} else {
score = 4;
}
-
return { score } as ZXCVBNResult;
},
} as Partial,
@@ -106,8 +81,18 @@ const decorators = (options: { hasPolicy?: boolean }) => {
},
],
}),
- ];
-};
+ ],
+ args: {
+ masterPasswordPolicyOptions: {
+ minComplexity: 4,
+ minLength: 14,
+ requireUpper: true,
+ requireLower: true,
+ requireNumbers: true,
+ requireSpecial: true,
+ } as MasterPasswordPolicyOptions,
+ },
+} as Meta;
type Story = StoryObj;
@@ -118,19 +103,13 @@ export const Default: Story = {
`,
}),
- decorators: decorators({
- hasPolicy: false,
- }),
};
export const WithPolicy: Story = {
render: (args) => ({
props: args,
template: `
-
+
`,
}),
- decorators: decorators({
- hasPolicy: true,
- }),
};
diff --git a/libs/auth/src/angular/input-password/password-input-result.ts b/libs/auth/src/angular/input-password/password-input-result.ts
new file mode 100644
index 00000000000..0a74b88a2e8
--- /dev/null
+++ b/libs/auth/src/angular/input-password/password-input-result.ts
@@ -0,0 +1,9 @@
+import { PBKDF2KdfConfig } from "@bitwarden/common/auth/models/domain/kdf-config";
+import { MasterKey } from "@bitwarden/common/types/key";
+
+export interface PasswordInputResult {
+ masterKey: MasterKey;
+ masterKeyHash: string;
+ kdfConfig: PBKDF2KdfConfig;
+ hint: string;
+}