diff --git a/ui-ngx/src/app/modules/login/pages/login/create-password.component.html b/ui-ngx/src/app/modules/login/pages/login/create-password.component.html
index 79b601d099..e3e43b6d29 100644
--- a/ui-ngx/src/app/modules/login/pages/login/create-password.component.html
+++ b/ui-ngx/src/app/modules/login/pages/login/create-password.component.html
@@ -42,7 +42,7 @@
formControlName="newPassword"/>
lock
- 0">
+
{{ 'security.password-requirement.password-not-meet-requirements' | translate }}
diff --git a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts
index e7aa68cba0..ec8a0efa0c 100644
--- a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts
+++ b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts
@@ -16,15 +16,11 @@
import { Component } from '@angular/core';
import { AuthService } from '@core/auth/auth.service';
-import { Store } from '@ngrx/store';
-import { AppState } from '@core/core.state';
import { PageComponent } from '@shared/components/page.component';
-import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
-import { TranslateService } from '@ngx-translate/core';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { UserPasswordPolicy } from '@shared/models/settings.models';
-import { combineLatest } from 'rxjs';
import {
passwordsMatchValidator,
passwordStrengthValidator
@@ -37,26 +33,21 @@ import {
})
export class CreatePasswordComponent extends PageComponent {
- activateToken = '';
- createPassword: UntypedFormGroup;
passwordPolicy: UserPasswordPolicy;
+ createPassword: FormGroup;
- constructor(protected store: Store,
- private route: ActivatedRoute,
+ private activateToken: string;
+
+ constructor(private route: ActivatedRoute,
private authService: AuthService,
- private translate: TranslateService,
- private fb: UntypedFormBuilder) {
- super(store);
+ private fb: FormBuilder) {
+ super();
+
+ this.activateToken = this.route.snapshot.queryParams['activateToken'] || '';
- combineLatest([
- this.route.queryParams,
- this.route.data
- ])
+ this.route.data
.pipe(takeUntilDestroyed())
- .subscribe(([params, data]) => {
- this.activateToken = params['activateToken'] || '';
- this.passwordPolicy = data['passwordPolicy'];
- });
+ .subscribe((data) => this.passwordPolicy = data['passwordPolicy']);
this.buildCreatePasswordForm();
}
@@ -72,17 +63,13 @@ export class CreatePasswordComponent extends PageComponent {
});
}
- get passwordErrorsLength(): number {
- return Object.keys(this.createPassword.get('newPassword')?.errors ?? {}).length;
- }
-
onCreatePassword() {
if (this.createPassword.invalid) {
this.createPassword.markAllAsTouched();
} else {
this.authService.activate(
this.activateToken,
- this.createPassword.get('password').value, true).subscribe();
+ this.createPassword.get('newPassword').value, true).subscribe();
}
}
}
diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html
index b4be2ecc9d..95584f9a75 100644
--- a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html
+++ b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html
@@ -45,7 +45,7 @@
formControlName="newPassword"/>
lock
- 0">
+
{{ 'security.password-requirement.password-not-meet-requirements' | translate }}
diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts
index 4a2c0bc75d..bfc8986625 100644
--- a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts
+++ b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts
@@ -16,13 +16,9 @@
import { Component } from '@angular/core';
import { AuthService } from '@core/auth/auth.service';
-import { Store } from '@ngrx/store';
-import { AppState } from '@core/core.state';
import { PageComponent } from '@shared/components/page.component';
-import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
-import { TranslateService } from '@ngx-translate/core';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
-import { combineLatest } from 'rxjs';
import { UserPasswordPolicy } from '@shared/models/settings.models';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import {
@@ -39,25 +35,22 @@ export class ResetPasswordComponent extends PageComponent {
isExpiredPassword: boolean;
- resetToken = '';
-
- resetPassword: UntypedFormGroup;
+ resetPassword: FormGroup;
passwordPolicy: UserPasswordPolicy;
- constructor(protected store: Store,
- private route: ActivatedRoute,
+ private resetToken: string;
+
+ constructor(private route: ActivatedRoute,
private router: Router,
private authService: AuthService,
- private translate: TranslateService,
- private fb: UntypedFormBuilder) {
- super(store);
- combineLatest([
- this.route.queryParams,
- this.route.data
- ])
+ private fb: FormBuilder) {
+ super();
+
+ this.resetToken = this.route.snapshot.queryParams['resetToken'] || '';
+
+ this.route.data
.pipe(takeUntilDestroyed())
- .subscribe(([params, data]) => {
- this.resetToken = params['resetToken'] || '';
+ .subscribe((data) => {
this.passwordPolicy = data['passwordPolicy'];
this.isExpiredPassword = data['expiredPassword'] ?? false;
});
@@ -76,10 +69,6 @@ export class ResetPasswordComponent extends PageComponent {
});
}
- get passwordErrorsLength(): number {
- return Object.keys(this.resetPassword.get('newPassword')?.errors ?? {}).length;
- }
-
onResetPassword() {
if (this.resetPassword.invalid) {
this.resetPassword.markAllAsTouched();
diff --git a/ui-ngx/src/app/shared/models/password.models.ts b/ui-ngx/src/app/shared/models/password.models.ts
index 4bba3d6737..dbffb35e92 100644
--- a/ui-ngx/src/app/shared/models/password.models.ts
+++ b/ui-ngx/src/app/shared/models/password.models.ts
@@ -18,24 +18,14 @@ import { UserPasswordPolicy } from '@shared/models/settings.models';
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
import { isEqual } from '@core/utils';
-export enum PasswordErrorMessageKey {
- minLength = 'security.password-requirement.password-min-length',
- maxLength = 'security.password-requirement.password-max-length',
- notUpperCase = 'security.password-requirement.password-uppercase',
- notLowerCase = 'security.password-requirement.password-lowercase',
- notNumeric = 'security.password-requirement.password-digit',
- notSpecial = 'security.password-requirement.password-special-characters',
- hasWhitespaces = 'security.password-requirement.password-should-not-contain-spaces',
- default = 'security.password-requirement.password-not-meet-requirements'
-}
-
export enum TooltipPasswordErrorMessageKey {
minLength = 'security.password-requirement.password-tooltip-min-length',
maxLength = 'security.password-requirement.password-tooltip-max-length',
notUpperCase = 'security.password-requirement.password-tooltip-uppercase',
notLowerCase = 'security.password-requirement.password-tooltip-lowercase',
notNumeric = 'security.password-requirement.password-tooltip-digit',
- notSpecial = 'security.password-requirement.password-tooltip-special-characters'
+ notSpecial = 'security.password-requirement.password-tooltip-special-characters',
+ hasWhitespaces = 'security.password-requirement.password-should-not-contain-spaces'
}
export const passwordErrorRules = [
@@ -45,6 +35,7 @@ export const passwordErrorRules = [
{ key: 'notNumeric', policyProp: 'minimumDigits', translation: TooltipPasswordErrorMessageKey.notNumeric },
{ key: 'notSpecial', policyProp: 'minimumSpecialCharacters', translation: TooltipPasswordErrorMessageKey.notSpecial },
{ key: 'maxLength', policyProp: 'maximumLength', translation: TooltipPasswordErrorMessageKey.maxLength },
+ { key: 'hasWhitespaces', policyProp: 'hasWhitespaces', translation: TooltipPasswordErrorMessageKey.hasWhitespaces },
];
export const passwordsMatchValidator = (firstControlName: string, secondControlName: string): ValidatorFn =>{
@@ -59,14 +50,7 @@ export const passwordsMatchValidator = (firstControlName: string, secondControlN
const newPass = newPassControl.value ?? '';
const confirm = confirmControl.value ?? '';
- const userInteracted =
- confirmControl.touched || confirmControl.dirty || group.touched;
-
- if (!userInteracted) {
- return null;
- }
-
- if (newPass && confirm !== newPass) {
+ if ((newPass || confirm) && confirm !== newPass) {
confirmControl.setErrors({ passwordsNotMatch: true });
return { passwordsNotMatch: true };
} else {
diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json
index 8f3ef7e3d8..ad8d0aa54f 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -4418,12 +4418,6 @@
"password-tooltip-lowercase": "{{minimumLowercaseLetters}} lowercase character",
"password-tooltip-digit": "{{minimumDigits}} number",
"password-tooltip-special-characters": "{{minimumSpecialCharacters}} special character",
- "password-min-length": "Password must be {{minimumLength}} or more characters in length",
- "password-max-length": "Password should be less than {{maximumLength}}",
- "password-uppercase": "Password must contain {{minimumUppercaseLetters}} or more uppercase characters",
- "password-lowercase": "Password must contain {{minimumLowercaseLetters}} or more lowercase characters",
- "password-digit": "Password must contain {{minimumDigits}} or more digit characters",
- "password-special-characters": "Password must contain {{minimumSpecialCharacters}} or more special characters",
"incorrect-password-try-again": "Incorrect password. Try again",
"lowercase-letter": "{ count, plural, =1 {1 lowercase letter} other {# lowercase letters} }",
"new-passwords-not-match": "New password didn't match",