From 37f7c5a978ee26c2594c3e3b973dc015405d2bde Mon Sep 17 00:00:00 2001 From: Uma <uma.s@vtiger.com> Date: Tue, 18 Aug 2020 15:08:48 +0530 Subject: [PATCH] Fixes #1447 Users admin status update on field ajax edit --- modules/Users/actions/SaveAjax.php | 117 ++++++++++++++++++----------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/modules/Users/actions/SaveAjax.php b/modules/Users/actions/SaveAjax.php index c1f555c18..78d9d5912 100644 --- a/modules/Users/actions/SaveAjax.php +++ b/modules/Users/actions/SaveAjax.php @@ -87,53 +87,82 @@ class Users_SaveAjax_Action extends Vtiger_SaveAjax_Action { * @return Vtiger_Record_Model or Module specific Record Model instance */ public function getRecordModelFromRequest(Vtiger_Request $request) { - $recordModel = parent::getRecordModelFromRequest($request); + $moduleName = $request->getModule(); + $recordId = $request->get('record'); $currentUserModel = Users_Record_Model::getCurrentUserModel(); - - $fieldModelList = $recordModel->getModule()->getFields(); - $validationFields = array('is_admin', 'is_owner', 'roleid', 'signature'); - foreach ($fieldModelList as $fieldName => $fieldModel) { - if(in_array($fieldName, $validationFields)){ - if ($request->has($fieldName)) { - $fieldValue = $request->get($fieldName, null); - } else { - $fieldValue = $fieldModel->getDefaultFieldValue(); - } - if($fieldValue){ - $fieldValue = Vtiger_Util_Helper::validateFieldValue($fieldValue,$fieldModel); - } - if ($fieldName === 'is_admin' && (!$currentUserModel->isAdminUser() || !$fieldValue)) { - $fieldValue = 'off'; - } - //to not update is_owner from ui - if ($fieldName == 'is_owner' || $fieldName == 'roleid') { - $fieldValue = $this->getOwnerRoleValue($request, $fieldName); - } - if ($fieldName == 'signature' && $fieldValue !== null) { - $purifiedContent = vtlib_purify(decode_html($fieldValue)); - // Purify malicious html event attributes - $fieldValue = purifyHtmlEventAttributes(decode_html($purifiedContent), true); - } - if ($fieldValue !== null) { - if (!is_array($fieldValue)) { - $fieldValue = trim($fieldValue); - } - $recordModel->set($fieldName, $fieldValue); - } - } - } - $fieldName = $request->get('field'); - if ($fieldName === 'is_admin' && (!$currentUserModel->isAdminUser() || !$request->get('value'))) { - $recordModel->set($fieldName, 'off'); - } else if($fieldName === 'is_admin' && $currentUserModel->isAdminUser()) { - $requestValue = $request->get('value'); - $value = $requestValue==1?"on":"off"; - $recordModel->set($fieldName,$value); + + if(!empty($recordId)) { + $recordModel = Vtiger_Record_Model::getInstanceById($recordId, $moduleName); + $modelData = $recordModel->getData(); + $recordModel->set('id', $recordId); + $sharedType = $request->get('sharedtype'); + if(!empty($sharedType)) + $recordModel->set('calendarsharedtype', $request->get('sharedtype')); + $recordModel->set('mode', 'edit'); + + } else { + $recordModel = Vtiger_Record_Model::getCleanInstance($moduleName); + $modelData = $recordModel->getData(); + $recordModel->set('mode', ''); } + + foreach ($modelData as $fieldName => $value) { + $requestFieldExists = false; + if($request->has($fieldName)){ + $fieldValue = $request->get($fieldName,null); + $requestFieldExists = true; + }else if($fieldName === $request->get('field')){ + $fieldValue = $request->get('value'); + $requestFieldExists = true; + } - if($fieldName == "is_owner" || $fieldName == "roleid") { - $fieldValue = $this->getOwnerRoleValue($request, $fieldName); - $recordModel->set($fieldName,$fieldValue); + if(!$requestFieldExists){ + continue; + } + + if ($fieldName === 'is_admin' && (!$currentUserModel->isAdminUser() || !$fieldValue)) { + $fieldValue = 'off'; + }else if($fieldName === 'is_admin' && $currentUserModel->isAdminUser()) { + $fieldValue = $fieldValue==1?"on":"off"; + } + + //to not update is_owner from ui + if ($fieldName == 'is_owner' || (in_array($fieldName, array('user_type', 'roleid')) && !$currentUserModel->isAdminUser())) { + $fieldValue = null; + } + if($fieldName == 'signature'){ + $requestData = $request->getAll(); + $instyle = new InStyle(); + $signature = $instyle->convertStylesToInlineCss($requestData['signature']); + //#4823970 - Added to remove any action tags like <form>, <input>, <button>.. + $fieldValue = vtlib_purify($signature); + // Purify malicious html event attributes + $fieldValue = purifyHtmlEventAttributes($fieldValue, true); + } + if($fieldValue !== null) { + if(!is_array($fieldValue)) { + $fieldValue = trim($fieldValue); + } + $recordModel->set($fieldName, $fieldValue); + } + } + $homePageComponents = $recordModel->getHomePageComponents(); + $selectedHomePageComponents = $request->get('homepage_components', array()); + foreach ($homePageComponents as $key => $value) { + if(in_array($key, $selectedHomePageComponents)) { + $request->setGlobal($key, $key); + } else { + $request->setGlobal($key, ''); + } + } + if($request->has('tagcloudview')) { + // Tag cloud save + $tagCloud = $request->get('tagcloudview'); + if($tagCloud == "on") { + $recordModel->set('tagcloud', 0); + } else { + $recordModel->set('tagcloud', 1); + } } return $recordModel; } -- GitLab