LinkDB::filterDay(): check input date format

Signed-off-by: VirtualTam <virtualtam@flibidi.net>
This commit is contained in:
VirtualTam 2015-06-27 14:57:44 +02:00
parent 46d83c20d7
commit 9186ab9594
5 changed files with 58 additions and 12 deletions

View File

@ -375,7 +375,10 @@ You use the community supported version of the original Shaarli project, by Seba
*/
public function filterDay($day)
{
// TODO: check input format
if (! checkDateFormat('Ymd', $day)) {
throw new Exception('Invalid date format');
}
$filtered = array();
foreach ($this->links as $l) {
if (startsWith($l['linkdate'], $day)) {

View File

@ -69,4 +69,19 @@ function sanitizeLink(&$link)
$link['description'] = escape($link['description']);
$link['tags'] = escape($link['tags']);
}
/**
* Checks if a string represents a valid date
*
* @param string a string-formatted date
* @param format the expected DateTime format of the string
* @return whether the string is a valid date
* @see http://php.net/manual/en/class.datetime.php
* @see http://php.net/manual/en/datetime.createfromformat.php
*/
function checkDateFormat($format, $string)
{
$date = DateTime::createFromFormat($format, $string);
return $date && $date->format($string) == $string;
}
?>

View File

@ -957,7 +957,13 @@ function showDaily()
if ($i<count($days)-1) $nextday=$days[$i+1];
}
$linksToDisplay=$LINKSDB->filterDay($day);
try {
$linksToDisplay = $LINKSDB->filterDay($day);
} catch (Exception $exc) {
error_log($exc);
$linksToDisplay = [];
}
// We pre-format some fields for proper output.
foreach($linksToDisplay as $key=>$link)
{

View File

@ -396,19 +396,22 @@ class LinkDBTest extends PHPUnit_Framework_TestCase
/**
* Use an invalid date format
* @expectedException Exception
* @expectedExceptionMessageRegExp /Invalid date format/
*/
public function testFilterInvalidDay()
public function testFilterInvalidDayWithChars()
{
$this->assertEquals(
0,
sizeof(self::$privateLinkDB->filterDay('Rainy day, dream away'))
);
self::$privateLinkDB->filterDay('Rainy day, dream away');
}
// TODO: check input format
$this->assertEquals(
6,
sizeof(self::$privateLinkDB->filterDay('20'))
);
/**
* Use an invalid date format
* @expectedException Exception
* @expectedExceptionMessageRegExp /Invalid date format/
*/
public function testFilterInvalidDayDigits()
{
self::$privateLinkDB->filterDay('20');
}
/**

View File

@ -74,5 +74,24 @@ class UtilsTest extends PHPUnit_Framework_TestCase
$this->assertTrue(endsWith('å!ùµ', 'ùµ', false));
$this->assertTrue(endsWith('µ$åù', 'åù', true));
}
/**
* Check valid date strings, according to a DateTime format
*/
public function testCheckValidDateFormat()
{
$this->assertTrue(checkDateFormat('Ymd', '20150627'));
$this->assertTrue(checkDateFormat('Y-m-d', '2015-06-27'));
}
/**
* Check erroneous date strings, according to a DateTime format
*/
public function testCheckInvalidDateFormat()
{
$this->assertFalse(checkDateFormat('Ymd', '2015'));
$this->assertFalse(checkDateFormat('Y-m-d', '2015-06'));
$this->assertFalse(checkDateFormat('Ymd', 'DeLorean'));
}
}
?>