From af32b725f90db375c04d351256f43f99464b7e8d Mon Sep 17 00:00:00 2001 From: Israel Bernabe Date: Fri, 12 Apr 2019 16:34:08 -0400 Subject: [PATCH 01/10] PMC-440 --- gulliver/js/ext/min/ext-all.js | 4 ++-- gulliver/js/ext/pmos-common.js | 6 +++--- gulliver/system/class.headPublisher.php | 4 ++-- workflow/engine/methods/cases/casesListExtJs.php | 3 ++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/gulliver/js/ext/min/ext-all.js b/gulliver/js/ext/min/ext-all.js index 5ef5532a2..157fc1e90 100644 --- a/gulliver/js/ext/min/ext-all.js +++ b/gulliver/js/ext/min/ext-all.js @@ -69,8 +69,8 @@ function getBrowserTimeZoneOffset() {return-1*((new Date()).getTimezoneOffset()*60);} function setExtStateManagerSetProvider(cache,additionalPrefix){var workspace='ws-undefined';var pathname=location.pathname.split('/');var cookieProvider=new Ext.state.CookieProvider();var i;if(additionalPrefix===undefined){additionalPrefix='';} if(pathname.length>1){workspace=pathname[1].replace('sys','');} -workspace=workspace+additionalPrefix;cookieProvider.on('statechange',function(provider,key,value){if(value!==null&&JSON.stringify(Ext.state.Manager.get(workspace+cache))!==JSON.stringify(value)){Ext.state.Manager.set(workspace+cache,value);}});Ext.state.Manager.setProvider(cookieProvider);Ext.state.Manager.clear(cache);try{if(window.extJsViewState!==undefined){for(i in extJsViewState){Ext.state.Manager.clear(i);} -Ext.state.Manager.set(cache,Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace+cache]));}}catch(e){}} +workspace=workspace+additionalPrefix;cookieProvider.on('statechange',function(provider,key,value){if(value!==null&&JSON.stringify(Ext.state.Manager.get(workspace+window.userUid+cache))!==JSON.stringify(value)){Ext.state.Manager.set(workspace+window.userUid+cache,value);}});Ext.state.Manager.setProvider(cookieProvider);Ext.state.Manager.clear(cache);try{if(window.extJsViewState!==undefined){for(i in extJsViewState){Ext.state.Manager.clear(i);} +Ext.state.Manager.set(cache,Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace+window.userUid+cache]));}}catch(e){}} function downloadFile(method,url,headers,formData,callBack){var xhr,win=window,value='blob',loadingFile=new Ext.LoadMask(Ext.getBody(),{msg:_('ID_LOADING')});method=method||'POST';loadingFile.show();if(win.XMLHttpRequest){xhr=new XMLHttpRequest();}else if(win.ActiveXObject){xhr=new ActiveXObject('Microsoft.XMLHTTP');} win.URL=win.URL||win.webkitURL;xhr.open(method,url,true);xhr.responseType=value;Object.keys(headers).forEach(function(key){xhr.setRequestHeader(key,headers[key]);});xhr.onload=function(e){loadingFile.hide();if(xhr.status===200){if(xhr.getResponseHeader("Content-Disposition")!==null){var fileName=xhr.getResponseHeader("Content-Disposition").match(/\sfilename="([^"]+)"(\s|$)/)[1];var blob=xhr.response;if((navigator.userAgent.indexOf("MSIE")!==-1)||(navigator.userAgent.indexOf("Trident")!==-1)||(navigator.userAgent.indexOf("Edge")!==-1)){win.navigator.msSaveBlob(blob,fileName);}else{var doc=win.document,a=doc.createElementNS('http://www.w3.org/1999/xhtml','a'),event=doc.createEvent('MouseEvents');event.initMouseEvent('click',true,false,win,0,0,0,0,0,false,false,false,false,0,null);a.href=win.URL.createObjectURL(blob);a.download=fileName;a.dispatchEvent(event);} if(typeof(callBack)!=='undefined'){callBack(xhr);}}else{PMExt.error(_('ID_ERROR'),_('ID_UNEXPECTED_ERROR_OCCURRED_PLEASE'));}}else{PMExt.error(_('ID_ERROR'),xhr.statusText);}};xhr.send(formData);} diff --git a/gulliver/js/ext/pmos-common.js b/gulliver/js/ext/pmos-common.js index 8a774e61d..d75b8b77c 100644 --- a/gulliver/js/ext/pmos-common.js +++ b/gulliver/js/ext/pmos-common.js @@ -609,8 +609,8 @@ function setExtStateManagerSetProvider(cache, additionalPrefix) { } workspace = workspace + additionalPrefix; cookieProvider.on('statechange', function (provider, key, value) { - if (value !== null && JSON.stringify(Ext.state.Manager.get(workspace + cache)) !== JSON.stringify(value)) { - Ext.state.Manager.set(workspace + cache, value); + if (value !== null && JSON.stringify(Ext.state.Manager.get(workspace + window.userUid + cache)) !== JSON.stringify(value)) { + Ext.state.Manager.set(workspace + window.userUid + cache, value); } }); Ext.state.Manager.setProvider(cookieProvider); @@ -620,7 +620,7 @@ function setExtStateManagerSetProvider(cache, additionalPrefix) { for (i in extJsViewState) { Ext.state.Manager.clear(i); } - Ext.state.Manager.set(cache, Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace + cache])); + Ext.state.Manager.set(cache, Ext.state.Manager.getProvider().decodeValue(extJsViewState[workspace + window.userUid + cache])); } } catch (e) { } diff --git a/gulliver/system/class.headPublisher.php b/gulliver/system/class.headPublisher.php index 8204a05e0..b153f05a7 100644 --- a/gulliver/system/class.headPublisher.php +++ b/gulliver/system/class.headPublisher.php @@ -746,11 +746,11 @@ class headPublisher * * @return array $views */ - public function getExtJsViewState() + public function getExtJsViewState($userUid = '') { $json = new stdClass(); $views = array(); - $keyState = "extJsViewState"; + $keyState = "extJsViewState" . $userUid; $prefixExtJs = "ys-"; $oServerConf = ServerConf::getSingleton(); $deleteCache = true; diff --git a/workflow/engine/methods/cases/casesListExtJs.php b/workflow/engine/methods/cases/casesListExtJs.php index 559698ee7..30adfce14 100644 --- a/workflow/engine/methods/cases/casesListExtJs.php +++ b/workflow/engine/methods/cases/casesListExtJs.php @@ -196,7 +196,8 @@ $oHeadPublisher->addExtJsScript('app/main', true); $oHeadPublisher->addExtJsScript('cases/casesList', false); //adding a javascript file .js $oHeadPublisher->addContent('cases/casesListExtJs'); //adding a html file .html. $oHeadPublisher->assign('FORMATS', $c->getFormats()); -$oHeadPublisher->assign('extJsViewState', $oHeadPublisher->getExtJsViewState()); +$oHeadPublisher->assign('userUid', $userUid); +$oHeadPublisher->assign('extJsViewState', $oHeadPublisher->getExtJsViewState($userUid)); $oHeadPublisher->assign('isIE', Bootstrap::isIE()); $oHeadPublisher->assign('__OPEN_APPLICATION_UID__', $openApplicationUid); 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 02/10] 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__}