From 7e619175214dc41d4843dc30ea676c7558151edd Mon Sep 17 00:00:00 2001 From: bruno DA SILVA Date: Fri, 7 Feb 2020 17:24:13 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B0524=20-=20password=20validity=20message?= =?UTF-8?q?=20can=20be=20superseded=20with=20conf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../authent-local/datamodel.authent-local.xml | 2 +- .../2.x/authent-local/model.authent-local.php | 19 ++++- test/coreExtensions/UserLocalTest.php | 77 ++++++++++++++++++- 3 files changed, 95 insertions(+), 3 deletions(-) diff --git a/datamodels/2.x/authent-local/datamodel.authent-local.xml b/datamodels/2.x/authent-local/datamodel.authent-local.xml index b55239c91..5188b36be 100644 --- a/datamodels/2.x/authent-local/datamodel.authent-local.xml +++ b/datamodels/2.x/authent-local/datamodel.authent-local.xml @@ -4,7 +4,7 @@ ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,}$ - + diff --git a/datamodels/2.x/authent-local/model.authent-local.php b/datamodels/2.x/authent-local/model.authent-local.php index 9f342dc42..bc4d83ff2 100755 --- a/datamodels/2.x/authent-local/model.authent-local.php +++ b/datamodels/2.x/authent-local/model.authent-local.php @@ -325,7 +325,24 @@ class UserPasswordPolicyRegex implements UserLocalPasswordValidator return new UserLocalPasswordValidity(true); } - $sMessage = Dict::S('Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed'); + $sUserLanguage = Dict::GetUserLanguage(); + $customMessages = $config->GetModuleSetting('authent-local', 'password_validation.message', null); + if (is_string($customMessages) ) + { + $sMessage = $customMessages; + } + elseif (isset($customMessages) && array_key_exists($sUserLanguage, $customMessages)) + { + $sMessage = $customMessages[$sUserLanguage]; + } + elseif (isset($customMessages) && array_key_exists('EN US', $customMessages)) + { + $sMessage = $customMessages['EN US']; + } + else + { + $sMessage = Dict::S('Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed'); + } return new UserLocalPasswordValidity( false, diff --git a/test/coreExtensions/UserLocalTest.php b/test/coreExtensions/UserLocalTest.php index 333cb05f8..3d166d4ef 100644 --- a/test/coreExtensions/UserLocalTest.php +++ b/test/coreExtensions/UserLocalTest.php @@ -43,7 +43,7 @@ class UserLocalTest extends ItopTestCase * @preserveGlobalState disabled * @backupGlobals disabled */ - public function testValidatePassword($sPassword, $aValidatorNames, $aConfigValueMap, $bExpectedCheckStatus, $expectedCheckIssues = null) + public function testValidatePassword($sPassword, $aValidatorNames, $aConfigValueMap, $bExpectedCheckStatus, $expectedCheckIssues = null, $sUserLanguage = null) { $configMock = $this->createMock(\Config::class); @@ -51,6 +51,11 @@ class UserLocalTest extends ItopTestCase ->method('GetModuleSetting') ->willReturnMap($aConfigValueMap); + if (isset($sUserLanguage)) + { + \Dict::SetUserLanguage($sUserLanguage); + } + /** @var UserLocal $oUserLocal */ $oUserLocal = \MetaModel::NewObject('UserLocal', array('login' => 'john')); /** @var \ormLinkSet $oProfileSet */ @@ -171,6 +176,76 @@ class UserLocalTest extends ItopTestCase 'expectedCheckIssues' => 'UserLocalPasswordPolicyMockNotValid', ), + 'notValidPattern custom message FR' => array( + 'password' => 'foo', + 'aValidatorCollection' => array( + 'UserPasswordPolicyRegex', + ), + 'valueMap' => array( + array('authent-local', 'password_validation.pattern', null, '.{6,10}'), + array('authent-local', 'password_validation.message', null, array('FR FR' => 'fr message', 'EN US' => 'en message')), + + ), + 'expectedCheckStatus' => false, + 'expectedCheckIssues' => 'fr message', + 'userLanguage' => 'FR FR', + ), + 'notValidPattern custom message EN' => array( + 'password' => 'foo', + 'aValidatorCollection' => array( + 'UserPasswordPolicyRegex', + ), + 'valueMap' => array( + array('authent-local', 'password_validation.pattern', null, '.{6,10}'), + array('authent-local', 'password_validation.message', null, array('FR FR' => 'fr message', 'EN US' => 'en message')), + + ), + 'expectedCheckStatus' => false, + 'expectedCheckIssues' => 'en message', + 'userLanguage' => 'EN US', + ), + 'notValidPattern custom message Fallback' => array( + 'password' => 'foo', + 'aValidatorCollection' => array( + 'UserPasswordPolicyRegex', + ), + 'valueMap' => array( + array('authent-local', 'password_validation.pattern', null, '.{6,10}'), + array('authent-local', 'password_validation.message', null, array('EN US' => 'en message')), + + ), + 'expectedCheckStatus' => false, + 'expectedCheckIssues' => 'en message', + 'userLanguage' => 'FR FR', + ), + 'notValidPattern custom message empty array' => array( + 'password' => 'foo', + 'aValidatorCollection' => array( + 'UserPasswordPolicyRegex', + ), + 'valueMap' => array( + array('authent-local', 'password_validation.pattern', null, '.{6,10}'), + array('authent-local', 'password_validation.message', null, array()), + + ), + 'expectedCheckStatus' => false, + 'expectedCheckIssues' => 'Password must be at least 8 characters and include uppercase, lowercase, numeric and special characters.', + 'userLanguage' => 'EN US', + ), + 'notValidPattern custom message string not array' => array( + 'password' => 'foo', + 'aValidatorCollection' => array( + 'UserPasswordPolicyRegex', + ), + 'valueMap' => array( + array('authent-local', 'password_validation.pattern', null, '.{6,10}'), + array('authent-local', 'password_validation.message', null, 'not an array'), + + ), + 'expectedCheckStatus' => false, + 'expectedCheckIssues' => 'not an array', + 'userLanguage' => 'EN US', + ), ); }