. */ namespace SP\Mgmt\CustomFields; defined('APP_ROOT') || die(); use Defuse\Crypto\Exception\CryptoException; use SP\Core\Crypt\Crypt; use SP\Core\Exceptions\QueryException; use SP\Core\Exceptions\SPException; use SP\Core\OldCrypt; use SP\DataModel\CustomFieldData; use SP\DataModel\CustomFieldDefinitionData; use SP\Log\Log; use SP\Storage\DbWrapper; use SP\Storage\QueryData; use SP\Util\Util; /** * Class CustomFieldsUtil utilidades para los campos personalizados * * @package SP\Mgmt */ class CustomFieldsUtil { /** * Actualizar los datos encriptados con una nueva clave * * @param string $currentMasterPass La clave maestra actual * @param string $newMasterPassword La nueva clave maestra * @return bool */ public static function updateCustomFieldsCrypt($currentMasterPass, $newMasterPassword) { $Log = new Log(); $LogMessage = $Log->getLogMessage(); $LogMessage->setAction(__('Campos Personalizados', false)); $query = /** @lang SQL */ 'SELECT customfielddata_id, customfielddata_data, customfielddata_key FROM CustomFieldData'; $Data = new QueryData(); $Data->setMapClassName(CustomFieldData::class); $Data->setQuery($query); /** @var CustomFieldData[] $queryRes */ $queryRes = DbWrapper::getResultsArray($Data); if (count($queryRes) === 0) { $LogMessage->addDescription(__('No hay datos de campos personalizados', false)); $Log->writeLog(); return true; } $LogMessage->addDescription(__('Actualizando datos encriptados', false)); $errors = []; $success = []; foreach ($queryRes as $CustomField) { try { $currentSecuredKey = Crypt::unlockSecuredKey($CustomField->getCustomfielddataKey(), $currentMasterPass); $securedKey = Crypt::makeSecuredKey($newMasterPassword); if (strlen($securedKey) > 1000) { throw new QueryException(SPException::ERROR, __('Error interno', false)); } $query = /** @lang SQL */ 'UPDATE CustomFieldData SET customfielddata_data = ?, customfielddata_key = ? WHERE customfielddata_id = ?'; $Data = new QueryData(); $Data->setQuery($query); $Data->addParam(Crypt::encrypt(Crypt::decrypt($CustomField->getCustomfielddataData(), $currentSecuredKey, $currentMasterPass), $securedKey, $newMasterPassword)); $Data->addParam($securedKey); $Data->addParam($CustomField->getCustomfielddataId()); DbWrapper::getQuery($Data); $success[] = $CustomField->getCustomfielddataId(); } catch (\Exception $e) { debugLog(__($e->getMessage())); return false; } } $LogMessage->addDetails(__('Registros no actualizados', false), implode(',', $errors)); $LogMessage->addDetails(__('Registros actualizados', false), implode(',', $success)); $Log->writeLog(); return true; } /** * Actualizar los datos encriptados con una nueva clave * * @param string $currentMasterPass La clave maestra actual * @return bool */ public static function updateCustomFieldsOldCrypt(&$currentMasterPass) { $Log = new Log(); $LogMessage = $Log->getLogMessage(); $LogMessage->setAction(__('Campos Personalizados', false)); $query = /** @lang SQL */ 'SELECT customfielddata_id, customfielddata_data, customfielddata_key FROM CustomFieldData'; $Data = new QueryData(); $Data->setMapClassName(CustomFieldData::class); $Data->setQuery($query); /** @var CustomFieldData[] $queryRes */ $queryRes = DbWrapper::getResultsArray($Data); if (count($queryRes) === 0) { $LogMessage->addDescription(__('No hay datos de campos personalizados', false)); $Log->writeLog(); return true; } $LogMessage->addDescription(__('Actualizando datos encriptados', false)); $errors = []; $success = []; foreach ($queryRes as $CustomField) { try { $securedKey = Crypt::makeSecuredKey($currentMasterPass); $fieldData = OldCrypt::getDecrypt($CustomField->getCustomfielddataData(), $CustomField->getCustomfielddataKey(), $currentMasterPass); if (strlen($securedKey) > 1000) { throw new QueryException(SPException::ERROR, __('Error interno', false)); } $query = /** @lang SQL */ 'UPDATE CustomFieldData SET customfielddata_data = ?, customfielddata_key = ? WHERE customfielddata_id = ?'; $Data = new QueryData(); $Data->setQuery($query); $Data->addParam(Crypt::encrypt($fieldData, $securedKey, $currentMasterPass)); $Data->addParam($securedKey); $Data->addParam($CustomField->getCustomfielddataId()); DbWrapper::getQuery($Data); $success[] = $CustomField->getCustomfielddataId(); } catch (\Exception $e) { debugLog(__($e->getMessage())); return false; } } $LogMessage->addDetails(__('Registros no actualizados', false), implode(',', $errors)); $LogMessage->addDetails(__('Registros actualizados', false), implode(',', $success)); $Log->writeLog(); return true; } /** * Crear los campos personalizados de un elemento * * @param array $customFields * @param CustomFieldData $CustomFieldData * @throws \SP\Core\Exceptions\SPException */ public static function addItemCustomFields(array &$customFields, CustomFieldData $CustomFieldData) { try { foreach ($customFields as $id => $value) { $CustomFieldData->setDefinitionId($id); $CustomFieldData->setValue($value); CustomField::getItem($CustomFieldData)->add(); } } catch (CryptoException $e) { throw new SPException(__('Error interno'), SPException::ERROR); } } /** * Actualizar los campos personalizados de un elemento * * @param array $customFields * @param CustomFieldData $CustomFieldData * @throws \SP\Core\Exceptions\SPException */ public static function updateItemCustomFields(array $customFields, CustomFieldData $CustomFieldData) { try { foreach ($customFields as $id => $value) { $CustomFieldData->setDefinitionId($id); $CustomFieldData->setValue($value); CustomField::getItem($CustomFieldData)->update(); } } catch (CryptoException $e) { throw new SPException(__('Error interno'), SPException::ERROR); } } /** * Migración de campos personalizados * * @return bool */ public static function migrateCustomFields() { $Log = new Log(); $LogMessage = $Log->getLogMessage(); $LogMessage->setAction(__FUNCTION__); $query = /** @lang SQL */ 'SELECT DISTINCT customfielddef_id, customfielddef_field FROM CustomFieldData LEFT JOIN CustomFieldDefinition ON customfielddef_id = customfielddata_defId WHERE customfielddata_moduleId = 20'; $Data = new QueryData(); $Data->setQuery($query); /** @var CustomFieldDefinitionData[] $oldDefs */ $oldDefs = DbWrapper::getResultsArray($Data); try { if (count($oldDefs) > 0) { $query = /** @lang SQL */ 'UPDATE CustomFieldData SET customfielddata_moduleId = 10 WHERE customfielddata_moduleId = 20'; $Data = new QueryData(); $Data->setQuery($query); $Data->setOnErrorMessage(__('Error al migrar campos personalizados', false)); DbWrapper::getQuery($Data); $query = /** @lang SQL */ 'UPDATE CustomFieldDefinition SET customfielddef_module = ?, customfielddef_field = ? WHERE customfielddef_id = ? LIMIT 1'; foreach ($oldDefs as $cf) { $CustomFieldDef = Util::unserialize(CustomFieldDefinitionData::class, $cf->customfielddef_field); $CustomFieldDef->setId($cf->customfielddef_id); $CustomFieldDef->setModule(10); $CustomFieldDef->setCustomfielddefModule(10); $Data = new QueryData(); $Data->setQuery($query); $Data->addParam(10); $Data->addParam(serialize($CustomFieldDef)); $Data->addParam($cf->customfielddef_id); try { DbWrapper::getQuery($Data); $LogMessage->addDetails(__('Campo actualizado', false), $cf->customfielddef_id); } catch (SPException $e) { $LogMessage->addDetails(__('Error al actualizar el campo personalizado', false), $cf->customfielddef_id); } } } $Log->writeLog(); return true; } catch (SPException $e) { $LogMessage->addDescription($e->getMessage()); $LogMessage->addDescription($e->getHint()); $Log->setLogLevel(Log::ERROR); $Log->writeLog(); } // We are here...wrong return false; } }