From d48fd37bef3a975e78948e7555fad489eedbf9c6 Mon Sep 17 00:00:00 2001
From: Uma <uma.s@vtiger.com>
Date: Tue, 24 Nov 2020 12:52:38 +0530
Subject: [PATCH] Password regex for validation has been centralized

---
 config_override.php                              |  5 ++++-
 include/Webservices/Custom/ChangePassword.php    |  4 +++-
 includes/runtime/Configs.php                     | 15 +++++++++++++++
 layouts/v7/modules/Install/Step4.tpl             |  1 +
 layouts/v7/modules/Users/DetailViewBlockView.tpl |  1 +
 layouts/v7/modules/Users/EditView.tpl            |  1 +
 layouts/v7/modules/Users/ListViewHeader.tpl      |  1 +
 layouts/v7/modules/Vtiger/resources/Utils.js     | 10 +++++++---
 modules/Install/views/Index.php                  |  4 ++++
 modules/Users/views/List.php                     |  4 ++++
 modules/Users/views/PreferenceDetail.php         |  3 +++
 modules/Users/views/PreferenceEdit.php           |  6 +++++-
 12 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/config_override.php b/config_override.php
index 458b5a665..d85886167 100644
--- a/config_override.php
+++ b/config_override.php
@@ -17,4 +17,7 @@ $max_mailboxes = 3;
  *     This can be customized using runtime connector hook and avoid core file modifications.
  *     array('session' => 'Vtiger_CustomSession_Handler')
  */
-$runtime_connectors = array();
\ No newline at end of file
+$runtime_connectors = array();
+
+//Password Regex for validation
+$password_regex = '^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})';
\ No newline at end of file
diff --git a/include/Webservices/Custom/ChangePassword.php b/include/Webservices/Custom/ChangePassword.php
index eba0cb9c8..2d37e9b01 100644
--- a/include/Webservices/Custom/ChangePassword.php
+++ b/include/Webservices/Custom/ChangePassword.php
@@ -75,7 +75,9 @@ function vtws_changePassword($id, $oldPassword, $newPassword, $confirmPassword,
 }
 
 function isPasswordStrong($new_password){
-    if (preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})/i', $new_password) == 1) {
+    $runtime_configs = Vtiger_Runtime_Configs::getInstance();
+    $password_regex = $runtime_configs->get('password_regex');
+    if (preg_match('/'.$password_regex.'/i', $new_password) == 1) {
             return true;
     }
     return false;
diff --git a/includes/runtime/Configs.php b/includes/runtime/Configs.php
index 6c7e44613..4ab97f209 100644
--- a/includes/runtime/Configs.php
+++ b/includes/runtime/Configs.php
@@ -41,4 +41,19 @@
 
         return $connector;
     }
+    
+    /**
+     * Function to fetch the value for given key
+     */
+    public function get($key, $default = '') {
+        $value = '';
+        if(isset($GLOBALS[$key])) {
+            $value = $GLOBALS[$key];
+        }
+
+        if(empty($value) && !empty($default)) {
+            $value = $default;
+        }
+        return $value;
+    }
  }
\ No newline at end of file
diff --git a/layouts/v7/modules/Install/Step4.tpl b/layouts/v7/modules/Install/Step4.tpl
index f358877d7..63a659f15 100644
--- a/layouts/v7/modules/Install/Step4.tpl
+++ b/layouts/v7/modules/Install/Step4.tpl
@@ -28,6 +28,7 @@
 			<div class="row hide" id="errorMessage"></div>
 			<div class="row">
 				<div class="col-sm-6">
+                                    <input type='hidden' name='pwd_regex' value= {ZEND_json::encode($PWD_REGEX)} />
 					<table class="config-table input-table">
 						<thead>
 							<tr><th colspan="2">{vtranslate('LBL_DATABASE_INFORMATION', 'Install')}</th></tr>
diff --git a/layouts/v7/modules/Users/DetailViewBlockView.tpl b/layouts/v7/modules/Users/DetailViewBlockView.tpl
index 33ba6ff00..18f2528e9 100644
--- a/layouts/v7/modules/Users/DetailViewBlockView.tpl
+++ b/layouts/v7/modules/Users/DetailViewBlockView.tpl
@@ -9,6 +9,7 @@
 
 {strip}
 	<input type=hidden name="timeFormatOptions" data-value='{$DAY_STARTS}' />
+        <input type='hidden' name='pwd_regex' value= {ZEND_json::encode($PWD_REGEX)} />
 	{foreach key=BLOCK_LABEL_KEY item=FIELD_MODEL_LIST from=$RECORD_STRUCTURE}
 		{if $BLOCK_LABEL_KEY neq 'LBL_CALENDAR_SETTINGS'}
 			{assign var=BLOCK value=$BLOCK_LIST[$BLOCK_LABEL_KEY]}
diff --git a/layouts/v7/modules/Users/EditView.tpl b/layouts/v7/modules/Users/EditView.tpl
index 244ea2a65..a8126d8ea 100644
--- a/layouts/v7/modules/Users/EditView.tpl
+++ b/layouts/v7/modules/Users/EditView.tpl
@@ -40,6 +40,7 @@
                     <input type="hidden" name="defaultCallDuration" value="{$USER_MODEL->get('callduration')}" />
                     <input type="hidden" name="defaultOtherEventDuration" value="{$USER_MODEL->get('othereventduration')}" />
                     <input type="hidden" name="isPreference" value="{$IS_PREFERENCE}" />
+                    <input type='hidden' name='pwd_regex' value= {ZEND_json::encode($PWD_REGEX)} />
                     {if $IS_RELATION_OPERATION }
                         <input type="hidden" name="sourceModule" value="{$SOURCE_MODULE}" />
                         <input type="hidden" name="sourceRecord" value="{$SOURCE_RECORD}" />
diff --git a/layouts/v7/modules/Users/ListViewHeader.tpl b/layouts/v7/modules/Users/ListViewHeader.tpl
index 0bf4e1c24..719ec63c4 100644
--- a/layouts/v7/modules/Users/ListViewHeader.tpl
+++ b/layouts/v7/modules/Users/ListViewHeader.tpl
@@ -10,6 +10,7 @@
 {strip}
 	<div class="listViewPageDiv" id="listViewContent">
 		<div class="col-sm-12 col-xs-12 full-height">
+                    <input type='hidden' name='pwd_regex' value= {ZEND_json::encode($PWD_REGEX)} />
 			<div id="listview-actions" class="listview-actions-container">
 				<div class = "row">
 					<div class="btn-group col-md-2"></div>
diff --git a/layouts/v7/modules/Vtiger/resources/Utils.js b/layouts/v7/modules/Vtiger/resources/Utils.js
index 4dc32a3cf..26cae5e2d 100644
--- a/layouts/v7/modules/Vtiger/resources/Utils.js
+++ b/layouts/v7/modules/Vtiger/resources/Utils.js
@@ -401,8 +401,12 @@ var vtUtils = {
             * (?=.*[!@#\$%\^&\*])	The string must contain at least one special character, but we are escaping reserved RegEx characters to avoid conflict
             * (?=.{8,})			The string must be eight characters or longer
             */
-            var strongPasswordRegex = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
-            var isStrong = strongPasswordRegex.test(password)? true : false; 
-            return isStrong;
+           var password_regex = jQuery('[name="pwd_regex"]').val();
+           if((typeof password_regex != 'undefined') && (password_regex != '')){
+                var strongPasswordRegex = new RegExp(password_regex);
+                var isStrong = strongPasswordRegex.test(password)? true : false; 
+                return isStrong;
+           }
+           return false;
     },
 }
diff --git a/modules/Install/views/Index.php b/modules/Install/views/Index.php
index 54a29e5f4..59276d24b 100644
--- a/modules/Install/views/Index.php
+++ b/modules/Install/views/Index.php
@@ -111,6 +111,10 @@ class Install_Index_view extends Vtiger_View_Controller {
 		$viewer->assign('ADMIN_LASTNAME', $defaultParameters['admin_lastname']);
 		$viewer->assign('ADMIN_PASSWORD', $defaultParameters['admin_password']);
 		$viewer->assign('ADMIN_EMAIL', $defaultParameters['admin_email']);
+                
+                $runtime_configs = Vtiger_Runtime_Configs::getInstance();
+                $password_regex = $runtime_configs->get('password_regex');
+                $viewer->assign('PWD_REGEX', $password_regex);
 
 		$viewer->view('Step4.tpl', $moduleName);
 	}
diff --git a/modules/Users/views/List.php b/modules/Users/views/List.php
index 40bff8e22..122a8ea86 100644
--- a/modules/Users/views/List.php
+++ b/modules/Users/views/List.php
@@ -167,6 +167,10 @@ class Users_List_View extends Settings_Vtiger_List_View {
 		$viewer->assign('USER_MODEL', Users_Record_Model::getCurrentUserModel());
 		$viewer->assign('SEARCH_VALUE', $searchValue);
 		$viewer->assign('SEARCH_DETAILS', $searchParams);
+                
+                $runtime_configs = Vtiger_Runtime_Configs::getInstance();
+                $password_regex = $runtime_configs->get('password_regex');
+                $viewer->assign('PWD_REGEX', $password_regex);
 	}
 
 	/**
diff --git a/modules/Users/views/PreferenceDetail.php b/modules/Users/views/PreferenceDetail.php
index 154544d3f..49e6be3cf 100644
--- a/modules/Users/views/PreferenceDetail.php
+++ b/modules/Users/views/PreferenceDetail.php
@@ -172,6 +172,9 @@ class Users_PreferenceDetail_View extends Vtiger_Detail_View {
 		$viewer->assign("DAY_STARTS", Zend_Json::encode($dayStartPicklistValues));
 		$viewer->assign('IMAGE_DETAILS', $recordModel->getImageDetails());
 
+                $runtime_configs = Vtiger_Runtime_Configs::getInstance();
+                $password_regex = $runtime_configs->get('password_regex');
+                $viewer->assign('PWD_REGEX', $password_regex);
 		return parent::process($request);
 	}
 
diff --git a/modules/Users/views/PreferenceEdit.php b/modules/Users/views/PreferenceEdit.php
index cc1e40326..1ad9ebbba 100644
--- a/modules/Users/views/PreferenceEdit.php
+++ b/modules/Users/views/PreferenceEdit.php
@@ -121,7 +121,7 @@ Class Users_PreferenceEdit_View extends Vtiger_Edit_View {
 				$fieldsInfo[$fieldName] = $fieldModel->getFieldInfo();
 			}
 			$viewer->assign('FIELDS_INFO', json_encode($fieldsInfo));
-
+                        
 			if($display) {
 				$this->preProcessDisplay($request);
 			}
@@ -150,6 +150,10 @@ Class Users_PreferenceEdit_View extends Vtiger_Edit_View {
 		$viewer->assign("DAY_STARTS", Zend_Json::encode($dayStartPicklistValues));
 		$viewer->assign('TAG_CLOUD', $recordModel->getTagCloudStatus());
 		$viewer->assign('USER_MODEL', Users_Record_Model::getCurrentUserModel());
+                
+                $runtime_configs = Vtiger_Runtime_Configs::getInstance();
+                $password_regex = $runtime_configs->get('password_regex');
+                $viewer->assign('PWD_REGEX', $password_regex);
 
 		parent::process($request);
 	}
-- 
GitLab