From b32fab16efb715568f54781bcc9e14e30ce41bff Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Sat, 24 Aug 2013 18:08:54 +0200 Subject: Fix handling of non-default date formats (#1489294) - remove ambiguous m/d/Y format from default config --- CHANGELOG | 1 + config/defaults.inc.php | 3 ++- program/lib/Roundcube/rcube_utils.php | 17 ++++++++++++++--- tests/Framework/Utils.php | 10 +++++++++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1d1149dc1..c4d007d52 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix handling of non-default date formats (#1489294) - Fix unquoted path in PREG expression on Windows (#1489290) - Fix replacement variables in user-specific base_dn in some LDAP requests (#1489279) - Fix image scaling issues when image has only one dimension smaller than the limit (#1489274) diff --git a/config/defaults.inc.php b/config/defaults.inc.php index f48827eb9..54d0b1d27 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -478,7 +478,8 @@ $config['language'] = null; $config['date_format'] = 'Y-m-d'; // give this choice of date formats to the user to select from -$config['date_formats'] = array('Y-m-d', 'd-m-Y', 'Y/m/d', 'm/d/Y', 'd/m/Y', 'd.m.Y', 'j.n.Y'); +// Note: do not use ambiguous formats like m/d/Y +$config['date_formats'] = array('Y-m-d', 'Y/m/d', 'Y.m.d', 'd-m-Y', 'd/m/Y', 'd.m.Y', 'j.n.Y'); // use this format for time display (date or strftime format) $config['time_format'] = 'H:i'; diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index cf87dedb7..2540f779d 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -739,11 +739,22 @@ class rcube_utils */ public static function strtotime($date) { + $date = trim($date); + // check for MS Outlook vCard date format YYYYMMDD - if (preg_match('/^([12][90]\d\d)([01]\d)(\d\d)$/', trim($date), $matches)) { - return mktime(0,0,0, intval($matches[2]), intval($matches[3]), intval($matches[1])); + if (preg_match('/^([12][90]\d\d)([01]\d)([0123]\d)$/', $date, $m)) { + return mktime(0,0,0, intval($m[2]), intval($m[3]), intval($m[1])); } - else if (is_numeric($date)) { + + // common little-endian formats, e.g. dd/mm/yyyy (not all are supported by strtotime) + if (preg_match('/^(\d{1,2})[.\/-](\d{1,2})[.\/-](\d{4})$/', $date, $m) + && $m[1] > 0 && $m[1] <= 31 && $m[2] > 0 && $m[2] <= 12 && $m[3] >= 1970 + ) { + return mktime(0,0,0, intval($m[2]), intval($m[1]), intval($m[3])); + } + + // unix timestamp + if (is_numeric($date)) { return (int) $date; } diff --git a/tests/Framework/Utils.php b/tests/Framework/Utils.php index abfb7cb65..3f7f48c3a 100644 --- a/tests/Framework/Utils.php +++ b/tests/Framework/Utils.php @@ -271,11 +271,19 @@ class Framework_Utils extends PHPUnit_Framework_TestCase $test = array( '1' => 1, '' => 0, + '2013-04-22' => 1366581600, + '2013/04/22' => 1366581600, + '2013.04.22' => 1366581600, + '22-04-2013' => 1366581600, + '22/04/2013' => 1366581600, + '22.04.2013' => 1366581600, + '22.4.2013' => 1366581600, + '20130422' => 1366581600, ); foreach ($test as $datetime => $ts) { $result = rcube_utils::strtotime($datetime); - $this->assertSame($ts, $result); + $this->assertSame($ts, $result, "Error parsing date: $datetime"); } } -- cgit v1.2.3