From: <tr...@eg...> - 2010-09-25 09:18:06
|
Ticket modified by Jörg Lehrke at 2010/09/25 11:17 Tracking System: Bugs Category: SyncML Version: Version 1.6.003 > Status: Pending Resolution: None Completed: 0% Priority: 5 - medium Created By: Arnaud SUEL Assigned to: Jörg Lehrke Summary: #2585 - Recuring events parsed dates bug due to PHP specific mktime function using bug Environment: - OS :Debian Lenny (2.6.32-trunk-vserver-686) - apache 2.2.9 - mysql 5.0.51a - php 5.2.6-1 - egroupware 1.6.003 (daily snapshot 10/05/07) Recuring events parsed dates bug due to PHP specific mktime function using bug When creating a recurring event on Nokia N97, if end date not supplied, then end date year is fixed to 2100. When syncing, dates differs (egw limitations below) - Explanations : Recurring events date (start, end, exceptions) are parsed within Horde_iCalendar::_parseDateTime function This function extracts date parts and then compose an UTC epoc integer with mktime PHP function mktime UTC range is between 1901 and 2038 (see php mktime ref page) In eGroupware if end date is not specified, then it is set as 0. This differs from any specified date that will be created in phones. Solution : - the best one would be to use a DateTime object - my solution is to limit Horde_iCalendar::_parseDate results between 1970 to 2038 (positive integers) - in calendar_ical::importVCal function : check if end date year is > 2037, then consider as 0 ******************** PATCH *************************************** @@ -1501,7 +1502,7 @@ class Horde_iCalendar { return false; } - return array('year' => $match[1], + return array('year' => min(max($match[1], 1970), 2038), 'month' => $match[2], 'mday' => $match[3]); } ******************** PATCH *************************************** @@ -2358,7 +2364,18 @@ class calendar_ical extends calendar_bou $vcardData['recur_interval'] = $recurenceMatches[1]; if ($recurenceMatches[2] != '#0') { - $vcardData['recur_enddate'] = $this->vCalendar->_parseDateTime(trim($recurenceMatches[2])); + //Patch fix : Out of range dates => 0 + $checkYear=substr($recurenceMatches[2], 0, 4); + if(intval($checkYear) > 2037) $vcardData['recur_enddate'] = 0; + //End Patch + else + $vcardData['recur_enddate'] = $this->vCalendar->_parseDateTime(trim($recurenceMatches[2])); } } else break; ---------------------------------------------------------------- > Comment by Jörg Lehrke at 2010/09/25 11:17: Does this issue apply to 1.8/trunk, too? ---------------------------------------------------------------- Comment by Anonymous User at 2010/05/14 16:03: I can see your issue but I'm not sure about the limit. The current code is able to handle later events then 2038 right now. This would be broken. Maybe we need a more specific solution for this problem. linked entries: http://www.egroupware.org/egroupware/index.php?menuaction=tracker.tracker_ui.edit&tr_id=2585&no_popup=1 |