N.497 Continuation of the fix done in [r4461], to correctly handle validation patterns containing a slash (AttributeURL in the enhanced customer portal). The initial fix has broken the validation of date (+time) fields because the slash was escaped twice, leading to an invalid regular expression. Requires testing of synchro, CSV import, console, customer portal...

SVN:trunk[4538]
This commit is contained in:
Romain Quetiez
2016-12-19 16:04:21 +00:00
parent 6bfead405d
commit 6e327e245b
4 changed files with 16 additions and 10 deletions

View File

@@ -828,8 +828,8 @@ class BulkChange
$sFormat = $sDateFormat;
}
$oFormat = new DateTimeFormat($sFormat);
$sRegExp = $oFormat->ToRegExpr();
if (!preg_match('/'.$sRegExp.'/', $this->m_aData[$iRow][$iCol]))
$sRegExp = $oFormat->ToRegExpr('/');
if (!preg_match($sRegExp, $this->m_aData[$iRow][$iCol]))
{
$aResult[$iRow]["__STATUS__"]= new RowStatus_Issue(Dict::S('UI:CSVReport-Row-Issue-DateFormat'));
}

View File

@@ -413,10 +413,16 @@ EOF
/**
* Get the regular expression to (approximately) validate a date/time for the current format
* The validation does not take into account the number of days in a month (i.e. June 31st will pass, as well as Feb 30th!)
* @param string $sDelimiter Surround the regexp (and escape) if needed
* @return string The regular expression in PCRE syntax
*/
public function ToRegExpr()
public function ToRegExpr($sDelimiter = null)
{
return '^'.$this->Transform('regexpr', "\\%s", false /* escape all */, '.?*$^()[]/:').'$';
$sRet = '^'.$this->Transform('regexpr', "\\%s", false /* escape all */, '.?*$^()[]:').'$';
if ($sDelimiter !== null)
{
$sRet = $sDelimiter.str_replace($sDelimiter, '\\'.$sDelimiter, $sRet).$sDelimiter;
}
return $sRet;
}
}

View File

@@ -218,8 +218,8 @@ function ChangeDateFormat($sProposedDate, $sFormat)
{
// Convert to a valid MySQL datetime
$oFormat = new DateTimeFormat($sFormat);
$sRegExpr = $oFormat->ToRegExpr();
if (!preg_match('/'.$sRegExpr.'/', $sProposedDate))
$sRegExpr = $oFormat->ToRegExpr('/');
if (!preg_match($sRegExpr, $sProposedDate))
{
return false;
}

View File

@@ -4930,14 +4930,14 @@ class TestDateTimeFormats extends TestBizModel
$oDate = new DateTime($sTestDate);
$sFormattedDate = $oFormat->Format($oDate);
$oParsedDate = $oFormat->Parse($sFormattedDate);
$sPattern = $oFormat->ToRegExpr();
$sPattern = $oFormat->ToRegExpr('/');
$bParseOk = ($oParsedDate->format('Y-m-d H:i:s') == $sTestDate);
if (!$bParseOk)
{
$this->ReportError('Parsed ('.$sFormattedDate.') date different from initial date (difference of '.((int)$oParsedDate->format('U')- (int)$oDate->format('U')).'s)');
$bRet = false;
}
$bValidateOk = preg_match('/'.$sPattern.'/', $sFormattedDate);
$bValidateOk = preg_match($sPattern, $sFormattedDate);
if (!$bValidateOk)
{
$this->ReportError('Formatted date ('.$sFormattedDate.') does not match the validation pattern ('.$sPattern.')');
@@ -4963,8 +4963,8 @@ class TestDateTimeFormats extends TestBizModel
$this->ReportSuccess("Test of the '$sFormatName' format: '$sFormat':");
foreach($aDatesToParse as $sDate)
{
$sPattern = $oFormat->ToRegExpr();
$bValidateOk = preg_match('/'.$sPattern.'/', $sDate);
$sPattern = $oFormat->ToRegExpr('/');
$bValidateOk = preg_match($sPattern, $sDate);
if ($bValidateOk)
{
$this->ReportError('Formatted date ('.$sFormattedDate.') matches the validation pattern ('.$sPattern.') whereas it should not!');