From 3a137027ee5edadb7dbdc8df218db4aa2290bd7f Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Mon, 15 Apr 2019 14:02:16 -0400 Subject: [PATCH] PMC-359 --- .../engine/methods/login/authentication.php | 39 ++++++- .../engine/methods/login/changePassword.php | 93 +-------------- .../src/ProcessMaker/BusinessModel/User.php | 107 ++++++++++++++++++ .../xmlform/login/changePasswordpm3.html | 1 + .../xmlform/login/changePasswordpm3.xml | 1 + 5 files changed, 149 insertions(+), 92 deletions(-) diff --git a/workflow/engine/methods/login/authentication.php b/workflow/engine/methods/login/authentication.php index 5058e0950..1fb2c0864 100644 --- a/workflow/engine/methods/login/authentication.php +++ b/workflow/engine/methods/login/authentication.php @@ -1,5 +1,7 @@ loadOrCreateIfNotExists($_SESSION['USER_LOGGED'], array('USR_PASSWORD_HISTORY' => serialize(array(G::encryptOld($pwd))))); + + //change password + if ($changePassword === true) { + $user = new User(); + $currentUser = $user->changePassword($_SESSION['USER_LOGGED'], $_POST['form']['USR_PASSWORD']); + G::header('Location: ' . $currentUser["__REDIRECT_PATH__"]); + return; + } + //Get the errors in the password $errorInPassword = $userProperty->validatePassword( $_POST['form']['USR_PASSWORD'], @@ -345,13 +368,23 @@ try { $G_PUBLISH = new Publisher; $version = explode('.', trim(file_get_contents(PATH_GULLIVER . 'VERSION'))); $version = isset($version[0]) ? intval($version[0]) : 0; + if ($version >= 3) { - $G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/changePasswordpm3', '', $messPassword, - 'changePassword'); + $values = [ + "usrUsername" => $usr, + "usrPassword" => $pwd, + "userEnvironment" => config("system.workspace"), + "browserTimeZoneOffset" => $_POST['form']['BROWSER_TIME_ZONE_OFFSET'] + ]; + $messPassword['__USR_PASSWORD_CHANGE__'] = G::generateUniqueID(); + Cache::put($messPassword['__USR_PASSWORD_CHANGE__'], $values, 2); + $G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/changePasswordpm3', '', $messPassword, 'sysLoginVerify'); + G::RenderPage('publish'); + session_destroy(); } else { $G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/changePassword', '', $messPassword, 'changePassword'); + G::RenderPage('publish'); } - G::RenderPage('publish'); die; } diff --git a/workflow/engine/methods/login/changePassword.php b/workflow/engine/methods/login/changePassword.php index a17e2739d..43f55089b 100644 --- a/workflow/engine/methods/login/changePassword.php +++ b/workflow/engine/methods/login/changePassword.php @@ -1,92 +1,7 @@ load($_SESSION['USER_LOGGED']); -global $RBAC; -$aData['USR_UID'] = $aUser['USR_UID']; -$aData['USR_USERNAME'] = $aUser['USR_USERNAME']; -$aData['USR_PASSWORD'] = Bootstrap::hashPassword($_POST['form']['USR_PASSWORD']); -$aData['USR_FIRSTNAME'] = $aUser['USR_FIRSTNAME']; -$aData['USR_LASTNAME'] = $aUser['USR_LASTNAME']; -$aData['USR_EMAIL'] = $aUser['USR_EMAIL']; -$aData['USR_DUE_DATE'] = $aUser['USR_DUE_DATE']; -$aData['USR_UPDATE_DATE'] = date('Y-m-d H:i:s'); -$RBAC->updateUser($aData, $aUser['USR_ROLE']); -$aData['USR_COUNTRY'] = $aUser['USR_COUNTRY']; -$aData['USR_CITY'] = $aUser['USR_CITY']; -$aData['USR_LOCATION'] = $aUser['USR_LOCATION']; -$aData['USR_ADDRESS'] = $aUser['USR_ADDRESS']; -$aData['USR_PHONE'] = $aUser['USR_PHONE']; -$aData['USR_ZIP_CODE'] = $aUser['USR_ZIP_CODE']; -$aData['USR_POSITION'] = $aUser['USR_POSITION']; -$oUser->update($aData); -require_once 'classes/model/UsersProperties.php'; -$oUserProperty = new UsersProperties(); -$aUserProperty = $oUserProperty->load($_SESSION['USER_LOGGED']); -$aHistory = unserialize($aUserProperty['USR_PASSWORD_HISTORY']); - -if (!is_array($aHistory)) { - $aHistory = array(); -} - -if (!defined('PPP_PASSWORD_HISTORY')) { - define('PPP_PASSWORD_HISTORY', 0); -} - -if (PPP_PASSWORD_HISTORY > 0) { - if (count($aHistory) >= PPP_PASSWORD_HISTORY) { - array_shift($aHistory); - } - $aHistory[] = $_POST['form']['USR_PASSWORD']; -} - -$aUserProperty['USR_LAST_UPDATE_DATE'] = date('Y-m-d H:i:s'); -$aUserProperty['USR_LOGGED_NEXT_TIME'] = 0; -$aUserProperty['USR_PASSWORD_HISTORY'] = serialize($aHistory); -$oUserProperty->update($aUserProperty); - -if (class_exists('redirectDetail')) { - //falta validar... - if (isset($RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE'])) { - $userRole = $RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE']; - } - $oPluginRegistry = PluginRegistry::loadSingleton(); - //$oPluginRegistry->showArrays(); - $aRedirectLogin = $oPluginRegistry->getRedirectLogins(); - if (isset($aRedirectLogin)) { - if (is_array($aRedirectLogin)) { - /** @var \ProcessMaker\Plugins\Interfaces\RedirectDetail $detail */ - foreach ($aRedirectLogin as $detail) { - if (isset($detail->sPathMethod)) { - if ($detail->equalRoleCodeTo($userRole)) { - G::header( - 'location: /sys' . SYS_TEMP . '/' . SYS_LANG . - '/' . SYS_SKIN . '/' . $detail->getPathMethod() - ); - die; - } - } - } - } - } -} -//end plugin - -if (isset($frm['USER_LANG'])) { - if ($frm['USER_LANG'] != '') { - $lang = $frm['USER_LANG']; - } -} else { - if (defined('SYS_LANG')) { - $lang = SYS_LANG; - } else { - $lang = 'en'; - } -} -$sLocation = $oUserProperty->redirectTo($_SESSION['USER_LOGGED'], $lang); -G::header('Location: ' . $sLocation); -die; +use ProcessMaker\BusinessModel\User; +$user = new User(); +$currentUser = $user->changePassword($_SESSION['USER_LOGGED'], $_POST['form']['USR_PASSWORD'], isset($_POST['form']['USER_LANG']) ? $_POST['form']['USER_LANG'] : ""); +G::header('Location: ' . $currentUser["__REDIRECT_PATH__"]); diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/User.php b/workflow/engine/src/ProcessMaker/BusinessModel/User.php index ddcaf367b..e5d18ee37 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/User.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/User.php @@ -2005,4 +2005,111 @@ class User return $isSupervisor; } } + + /** + * It changes the password of the user specified by its identifier, optionally + * the value of $userLang can be sent, otherwise the system value is taken. + * In case of success, the updated user returns. + * + * @global object $RBAC + * @param string $usrUid + * @param string $usrPassword + * @param string $userLang + * + * @return string + * + * @see workflow/engine/methods/login/authentication.php + * @see workflow/engine/methods/login/changePassword.php + * @link https://wiki.processmaker.com/3.0/Managing_Users#Creating_New_Users + */ + public function changePassword($usrUid, $usrPassword, $userLang = "") + { + global $RBAC; + + $users = new Users(); + $user = $users->load($usrUid); + + $data = []; + $data['USR_UID'] = $user['USR_UID']; + $data['USR_USERNAME'] = $user['USR_USERNAME']; + $data['USR_PASSWORD'] = Bootstrap::hashPassword($usrPassword); + $data['USR_FIRSTNAME'] = $user['USR_FIRSTNAME']; + $data['USR_LASTNAME'] = $user['USR_LASTNAME']; + $data['USR_EMAIL'] = $user['USR_EMAIL']; + $data['USR_DUE_DATE'] = $user['USR_DUE_DATE']; + $data['USR_UPDATE_DATE'] = date('Y-m-d H:i:s'); + + $RBAC->updateUser($data, $user['USR_ROLE']); + + $data['USR_COUNTRY'] = $user['USR_COUNTRY']; + $data['USR_CITY'] = $user['USR_CITY']; + $data['USR_LOCATION'] = $user['USR_LOCATION']; + $data['USR_ADDRESS'] = $user['USR_ADDRESS']; + $data['USR_PHONE'] = $user['USR_PHONE']; + $data['USR_ZIP_CODE'] = $user['USR_ZIP_CODE']; + $data['USR_POSITION'] = $user['USR_POSITION']; + + $users->update($data); + + $usersProperties = new UsersProperties(); + $userProperty = $usersProperties->load($usrUid); + $history = unserialize($userProperty['USR_PASSWORD_HISTORY']); + + if (!is_array($history)) { + $history = []; + } + + if (!defined('PPP_PASSWORD_HISTORY')) { + define('PPP_PASSWORD_HISTORY', 0); + } + + if (PPP_PASSWORD_HISTORY > 0) { + if (count($history) >= PPP_PASSWORD_HISTORY) { + array_shift($history); + } + $history[] = $usrPassword; + } + + $userProperty['USR_LAST_UPDATE_DATE'] = date('Y-m-d H:i:s'); + $userProperty['USR_LOGGED_NEXT_TIME'] = 0; + $userProperty['USR_PASSWORD_HISTORY'] = serialize($history); + + $usersProperties->update($userProperty); + + if (class_exists('redirectDetail')) { + + if (isset($RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE'])) { + $userRole = $RBAC->aUserInfo['PROCESSMAKER']['ROLE']['ROL_CODE']; + } + $pluginRegistry = PluginRegistry::loadSingleton(); + + $redirectLogin = $pluginRegistry->getRedirectLogins(); + if (isset($redirectLogin)) { + if (is_array($redirectLogin)) { + foreach ($redirectLogin as $detail) { + if (isset($detail->sPathMethod)) { + if ($detail->equalRoleCodeTo($userRole)) { + $user['__REDIRECT_PATH__'] = '/sys' . config('system.workspace') . '/' . SYS_LANG . '/' . SYS_SKIN . '/' . $detail->getPathMethod(); + return $user; + } + } + } + } + } + } + + $lang = ""; + if ($userLang !== "") { + $lang = $userLang; + } else { + if (defined('SYS_LANG')) { + $lang = SYS_LANG; + } else { + $lang = 'en'; + } + } + $location = $usersProperties->redirectTo($usrUid, $lang); + $user['__REDIRECT_PATH__'] = $location; + return $user; + } } diff --git a/workflow/engine/xmlform/login/changePasswordpm3.html b/workflow/engine/xmlform/login/changePasswordpm3.html index ecbc54b0a..ae71c164c 100644 --- a/workflow/engine/xmlform/login/changePasswordpm3.html +++ b/workflow/engine/xmlform/login/changePasswordpm3.html @@ -14,6 +14,7 @@ {$form.USR_PASSWORD} {$form.USR_PASSWORD_CONFIRM} + {$form.__USR_PASSWORD_CHANGE__}