From 7bd61469840e10ff452770659ca536eb0ffbe1c0 Mon Sep 17 00:00:00 2001 From: Jose Alberto Hernandez Date: Thu, 27 Mar 2025 22:16:59 -0500 Subject: [PATCH] User password regular expression to validate consecutive repeating characters --- README.md | 1 + .../account-transfers.service.ts | 34 ------------------- .../make-account-transfers.component.ts | 26 +------------- .../create-self-service-user.component.html | 2 +- src/app/core/utils/passwords-utility.ts | 5 +-- .../savings-account-view.component.ts | 2 +- .../change-password-dialog.component.html | 5 ++- src/assets/env.js | 6 ++-- src/assets/env.template.js | 6 ++-- src/environments/environment.prod.ts | 6 ++-- src/environments/environment.ts | 6 ++-- 11 files changed, 17 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index 960759611..37e64ad51 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,7 @@ Available languages: | MIFOS_DEFAULT_CHAR_DELIMITER | Character delimiter for CSV exports | , | | MIFOS_WAIT_TIME_FOR_NOTIFICATIONS | Wait time in seconds for reading notifications | 60 | | MIFOS_WAIT_TIME_FOR_CATCHUP | Wait time in seconds for reading COB Catch-Up status | 30 | +| MIFOS_MIN_PASSWORD_LENGTH | WMinimum length for user passwords | 12 | #### UI Display Settings diff --git a/src/app/account-transfers/account-transfers.service.ts b/src/app/account-transfers/account-transfers.service.ts index 26b1381a0..571d2f55c 100644 --- a/src/app/account-transfers/account-transfers.service.ts +++ b/src/app/account-transfers/account-transfers.service.ts @@ -114,38 +114,4 @@ export class AccountTransfersService { getViewAccountTransferDetails(transferId: any): Observable { return this.http.get(`/accounttransfers/${transferId}`); } - - getAccountByNumber(accountNumber: string, currency: string): Observable { - const payload = { - partyId: accountNumber, - partyIdType: 'MSISDN', - currencyCode: currency - }; - const headers = new HttpHeaders({ 'Content-Type': 'application/json' }); - return this.http - .post( - `${environment.vNextApiUrl}${environment.vNextApiVersion}${environment.vNextApiProvider}/participant`, - JSON.stringify(payload), - { headers } - ) - .pipe( - switchMap((participant: any) => { - const body = JSON.stringify({ ...payload, ownerFspId: participant.fspId }); - return this.http.post( - `${environment.vNextApiUrl}${environment.vNextApiVersion}${environment.vNextApiProvider}/partyinfo`, - body, - { headers } - ); - }) - ); - } - - sendInterbankTransfer(body: any): Observable { - const headers = new HttpHeaders({ 'Content-Type': 'application/json' }); - return this.http.post( - `${environment.vNextApiUrl}${environment.vNextApiVersion}${environment.vNextApiProvider}/executetransfer`, - body, - { headers } - ); - } } diff --git a/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts b/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts index dcff0edab..fabebbf67 100644 --- a/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts +++ b/src/app/account-transfers/make-account-transfers/make-account-transfers.component.ts @@ -318,31 +318,7 @@ export class MakeAccountTransfersComponent implements OnInit, AfterViewInit { }, note: this.makeAccountTransferForm.controls.transferDescription.value }; - this.accountTransfersService.sendInterbankTransfer(JSON.stringify(payload)).subscribe( - (trnsfr) => { - if (trnsfr.systemMessage) { - this.isLoading = false; - this.router.navigate(['../../transactions'], { relativeTo: this.route }); - } - }, - (error) => { - this.isLoading = false; - } - ); } - searchAccountByNumber() { - this.isLoading = true; - this.accountTransfersService - .getAccountByNumber(this.phoneAccount, this.accountTransferTemplateData.currency.code) - .subscribe( - (acc) => { - this.interbankTransferForm = true; - this.createMakeAccountInterbankTransferForm(acc); - }, - (error) => { - this.isLoading = false; - } - ); - } + searchAccountByNumber() {} } diff --git a/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html index a14ad9ea7..9f5fe54d3 100644 --- a/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html +++ b/src/app/clients/clients-view/client-actions/create-self-service-user/create-self-service-user.component.html @@ -84,7 +84,7 @@ {{ 'labels.commons.Password should include a' | translate }} {{ 'labels.commons.numeral' | translate }} {{ 'labels.commons.and at' | translate }} {{ 'labels.commons.least one uppercase' | translate }} - ,{{ 'labels.commons.lowercase and special character' | translate }} + , {{ 'labels.commons.lowercase and special character' | translate }} diff --git a/src/app/core/utils/passwords-utility.ts b/src/app/core/utils/passwords-utility.ts index 89105be43..32ae86296 100644 --- a/src/app/core/utils/passwords-utility.ts +++ b/src/app/core/utils/passwords-utility.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { AbstractControl, ValidationErrors, ValidatorFn, Validators } from '@angular/forms'; +import { environment } from 'environments/environment'; import { Subscription } from 'rxjs'; @Injectable({ @@ -7,14 +8,14 @@ import { Subscription } from 'rxjs'; }) export class PasswordsUtility { // password regex pattern - public static PASSWORD_REGEX = '^(?!.*(.)\\1)(?!.*\\s)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^\\w\\s]).{12,50}$'; + public static PASSWORD_REGEX = '^(?!.*(.)\\1{1,})(?!.*\\s)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^\\w\\s]).{12,50}$'; public getPasswordValidators(): ValidatorFn[] { return [ Validators.required, Validators.pattern(PasswordsUtility.PASSWORD_REGEX), Validators.maxLength(50), - Validators.minLength(8)]; + Validators.minLength(environment.minPasswordLength)]; } /** diff --git a/src/app/savings/savings-account-view/savings-account-view.component.ts b/src/app/savings/savings-account-view/savings-account-view.component.ts index 674201d68..2578902af 100644 --- a/src/app/savings/savings-account-view/savings-account-view.component.ts +++ b/src/app/savings/savings-account-view/savings-account-view.component.ts @@ -85,7 +85,7 @@ export class SavingsAccountViewComponent implements OnInit { taskPermissionName: 'CREATE_ACCOUNTTRANSFER' }); } - if (this.savingsAccountData.externalId && environment.interbankTransfers === 'true') { + if (this.savingsAccountData.externalId) { this.buttonConfig.addOption({ name: 'Interbank Transfer', taskPermissionName: 'CREATE_ACCOUNTTRANSFER' diff --git a/src/app/shared/change-password-dialog/change-password-dialog.component.html b/src/app/shared/change-password-dialog/change-password-dialog.component.html index 6f8bd585f..9d7806294 100644 --- a/src/app/shared/change-password-dialog/change-password-dialog.component.html +++ b/src/app/shared/change-password-dialog/change-password-dialog.component.html @@ -39,9 +39,8 @@ > {{ 'labels.commons.Password should include a' | translate }} {{ 'labels.commons.numeral' | translate }} {{ 'labels.commons.and at' | translate }} - {{ 'labels.commons.least one uppercase' | translate }} ,{{ - 'labels.commons.lowercase and special character' | translate - }} + {{ 'labels.commons.least one uppercase' | translate }}, {{ 'labels.commons.lowercase and special character' | translate }} diff --git a/src/assets/env.js b/src/assets/env.js index f24b91517..15f624da2 100644 --- a/src/assets/env.js +++ b/src/assets/env.js @@ -44,9 +44,7 @@ // OAuth Client Id window['env']['oauthAppId'] = ''; - window["env"]["vNextApiUrl"] = ''; - window["env"]["vNextApiProvider"] = ''; - window["env"]["vNextApiVersion"] = ''; - window["env"]["interbankTransfers"] = "false"; + // Min Password length + window['env']['minPasswordLength'] = '12'; })(this); diff --git a/src/assets/env.template.js b/src/assets/env.template.js index 935a4311e..9b04c235b 100644 --- a/src/assets/env.template.js +++ b/src/assets/env.template.js @@ -44,8 +44,6 @@ // OAuth Client Id window['env']['oauthAppId'] = '$MIFOS_OAUTH_CLIENT_ID'; - window['env']['vNextApiUrl'] = '$VNEXT_API_URL'; - window['env']['vNextApiProvider'] = '$VNEXT_API_PROVIDER'; - window['env']['vNextApiVersion'] = '$VNEXT_API_VERSION'; - window['env']['interbankTransfers'] = '$VNEXT_INTERBANK_TRANSFERS'; + // Min Password length + window['env']['minPasswordLength'] = '$MIFOS_MIN_PASSWORD_LENGTH'; })(this); diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 87ecee798..ec87f7fc8 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -51,10 +51,8 @@ export const environment = { idleTimeout: loadedEnv['sessionIdleTimeout'] || 300000 // 5 minutes } }, - vNextApiUrl: window['env']['vNextApiUrl'] || 'https://apis.flexcore.mx', - vNextApiProvider: window['env']['vNextApiProvider'] || '/vnext1', - vNextApiVersion: window['env']['vNextApiVersion'] || '/v1.0', - interbankTransfers: window['env']['interbankTransfers'] || false + + minPasswordLength: loadedEnv['minPasswordLength'] || 12 }; // Server URL diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 3aa0a1a55..085341b24 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -55,10 +55,8 @@ export const environment = { idleTimeout: loadedEnv['sessionIdleTimeout'] || 300000 // 5 minutes } }, - vNextApiUrl: window['env']['vNextApiUrl'] || 'https://apis.flexcore.mx', - vNextApiProvider: window['env']['vNextApiProvider'] || '/vnext1', - vNextApiVersion: window['env']['vNextApiVersion'] || '/v1.0', - interbankTransfers: window['env']['interbankTransfers'] || false + + minPasswordLength: loadedEnv['minPasswordLength'] || 12 }; // Server URL