N°2589 - Infinite loops when logging with a Contact having a non empty TagSet field

This commit is contained in:
acognet
2020-05-05 19:00:24 +02:00
parent 526a7f9817
commit f7ea6c09cd
4 changed files with 161 additions and 36 deletions

View File

@@ -4127,44 +4127,52 @@ abstract class MetaModel
*
* @param array $aArgs Context arguments (some can be persistent objects)
* @param array $aMoreArgs Other query parameters
* @param array $aExpectedArgs variables present in the query
*
* @return array
*/
public static function PrepareQueryArguments($aArgs, $aMoreArgs = array())
public static function PrepareQueryArguments($aArgs, $aMoreArgs = array(), $aExpectedArgs = null)
{
$aScalarArgs = array();
foreach(array_merge($aArgs, $aMoreArgs) as $sArgName => $value)
if (is_null($aExpectedArgs) || count($aExpectedArgs) > 0 || count($aMoreArgs)>0)
{
if (self::IsValidObject($value))
foreach (array_merge($aArgs, $aMoreArgs) as $sArgName => $value)
{
if (strpos($sArgName, '->object()') === false)
if (self::IsValidObject($value))
{
// Normalize object arguments
$aScalarArgs[$sArgName.'->object()'] = $value;
if (strpos($sArgName, '->object()') === false)
{
// Normalize object arguments
$aScalarArgs[$sArgName.'->object()'] = $value;
}
else
{
// Leave as is
$aScalarArgs[$sArgName] = $value;
}
}
else
{
// Leave as is
$aScalarArgs[$sArgName] = $value;
}
}
else
{
if (is_scalar($value))
{
$aScalarArgs[$sArgName] = (string)$value;
}
elseif (is_null($value))
{
$aScalarArgs[$sArgName] = null;
}
elseif (is_array($value))
{
$aScalarArgs[$sArgName] = $value;
if (is_scalar($value))
{
$aScalarArgs[$sArgName] = (string)$value;
}
elseif (is_null($value))
{
$aScalarArgs[$sArgName] = null;
}
elseif (is_array($value))
{
$aScalarArgs[$sArgName] = $value;
}
}
}
return static::AddMagicPlaceholders($aScalarArgs, $aExpectedArgs);
}
else
{
return array();
}
return static::AddMagicPlaceholders($aScalarArgs);
}
/**
@@ -4172,21 +4180,68 @@ abstract class MetaModel
*
* @return array of placeholder (or name->object()) => value (or object)
*/
public static function AddMagicPlaceholders($aPlaceholders)
public static function AddMagicPlaceholders($aPlaceholders, $aExpectedArgs = null)
{
// Add standard magic arguments
//
$aPlaceholders['current_contact_id'] = UserRights::GetContactId(); // legacy
$oUser = UserRights::GetUserObject();
if (!is_null($oUser))
if (is_null($aExpectedArgs))
{
$aPlaceholders['current_user->object()'] = $oUser;
$aPlaceholders['current_contact_id'] = UserRights::GetContactId(); // legacy
$oContact = UserRights::GetContactObject();
if (!is_null($oContact))
$oUser = UserRights::GetUserObject();
if (!is_null($oUser))
{
$aPlaceholders['current_contact->object()'] = $oContact;
$aPlaceholders['current_user->object()'] = $oUser;
$oContact = UserRights::GetContactObject();
if (!is_null($oContact))
{
$aPlaceholders['current_contact->object()'] = $oContact;
}
}
}
else
{
$aCurrentUser = array();
$aCurrentContact = array();
foreach ($aExpectedArgs as $expression)
{
$aName = explode('->', $expression->GetName());
if ($aName[0] == 'current_contact_id')
{
$aPlaceholders['current_contact_id'] = UserRights::GetContactId();
}
if ($aName[0] == 'current_user')
{
array_push($aCurrentUser, $aName[1]);
}
if ($aName[0] == 'current_contact')
{
array_push($aCurrentContact, $aName[1]);
}
}
if (count($aCurrentUser) > 0)
{
$oSearch = DBObjectSearch::FromOQL("SELECT User WHERE id = :id");
$oSet = new DBObjectSet($oSearch, array(), array('id' => UserRights::GetUserId()));
$oSet->OptimizeColumnLoad($aCurrentUser);
$oUser = $oSet->fetch();
$aPlaceholders['current_user->object()'] = $oUser;
foreach ($aCurrentUser as $sField)
{
$aPlaceholders['current_user->'.$sField] = $oUser->Get($sField);
}
}
if (count($aCurrentContact) > 0)
{
$oSearch = DBObjectSearch::FromOQL("SELECT Contact WHERE id = :id");
$oSet = new DBObjectSet($oSearch, array(), array('id' => UserRights::GetContactId()));
$oSet->OptimizeColumnLoad($aCurrentContact);
$oUser = $oSet->fetch();
foreach ($aCurrentContact as $sField)
{
$aPlaceholders['current_contact->'.$sField] = $oUser->Get($sField);
}
}
}