2 commits - plugins/libcalendaring plugins/libkolab
Thomas Brüderli
bruederli at kolabsys.com
Wed Oct 16 15:32:43 CEST 2013
plugins/libcalendaring/libcalendaring.php | 12 +++-
plugins/libcalendaring/libvcalendar.php | 7 +-
plugins/libcalendaring/tests/libvcalendar.php | 28 +++++++++--
plugins/libcalendaring/tests/resources/alarms.ics | 43 +++++++++++++++++
plugins/libkolab/lib/kolab_format.php | 8 ++-
plugins/libkolab/lib/kolab_format_contact.php | 2
plugins/libkolab/lib/kolab_format_distributionlist.php | 2
plugins/libkolab/lib/kolab_format_event.php | 3 -
plugins/libkolab/lib/kolab_format_file.php | 2
plugins/libkolab/lib/kolab_format_journal.php | 2
plugins/libkolab/lib/kolab_format_note.php | 2
plugins/libkolab/lib/kolab_format_task.php | 2
12 files changed, 94 insertions(+), 19 deletions(-)
New commits:
commit 29ab9b594e7189c60a7474bba7e65dcea7c175ee
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date: Wed Oct 16 15:30:51 2013 +0200
Reflect format errors in is_valid() method to avoid invalid data being loadd and written to cache (#2360)
diff --git a/plugins/libkolab/lib/kolab_format.php b/plugins/libkolab/lib/kolab_format.php
index ec520e2..5bcc57a 100644
--- a/plugins/libkolab/lib/kolab_format.php
+++ b/plugins/libkolab/lib/kolab_format.php
@@ -40,6 +40,7 @@ abstract class kolab_format
protected $data;
protected $xmldata;
protected $xmlobject;
+ protected $formaterror;
protected $loaded = false;
protected $version = '3.0';
@@ -248,7 +249,7 @@ abstract class kolab_format
$log = "Error";
}
- if ($log) {
+ if ($log && !isset($this->formaterror)) {
rcube::raise_error(array(
'code' => 660,
'type' => 'php',
@@ -256,6 +257,8 @@ abstract class kolab_format
'line' => __LINE__,
'message' => "kolabformat $log: " . kolabformat::errorMessage(),
), true);
+
+ $this->formaterror = $ret;
}
return $ret;
@@ -342,6 +345,7 @@ abstract class kolab_format
*/
public function load($xml)
{
+ $this->formaterror = null;
$read_func = $this->libfunc($this->read_func);
if (is_array($read_func))
@@ -365,6 +369,8 @@ abstract class kolab_format
*/
public function write($version = null)
{
+ $this->formaterror = null;
+
$this->init();
$write_func = $this->libfunc($this->write_func);
if (is_array($write_func))
diff --git a/plugins/libkolab/lib/kolab_format_contact.php b/plugins/libkolab/lib/kolab_format_contact.php
index 72867fc..0d0bc75 100644
--- a/plugins/libkolab/lib/kolab_format_contact.php
+++ b/plugins/libkolab/lib/kolab_format_contact.php
@@ -268,7 +268,7 @@ class kolab_format_contact extends kolab_format
*/
public function is_valid()
{
- return $this->data || (is_object($this->obj) && $this->obj->uid() /*$this->obj->isValid()*/);
+ return !$this->formaterror && ($this->data || (is_object($this->obj) && $this->obj->uid() /*$this->obj->isValid()*/));
}
/**
diff --git a/plugins/libkolab/lib/kolab_format_distributionlist.php b/plugins/libkolab/lib/kolab_format_distributionlist.php
index 304cdc4..46dda01 100644
--- a/plugins/libkolab/lib/kolab_format_distributionlist.php
+++ b/plugins/libkolab/lib/kolab_format_distributionlist.php
@@ -69,7 +69,7 @@ class kolab_format_distributionlist extends kolab_format
public function is_valid()
{
- return $this->data || (is_object($this->obj) && $this->obj->isValid());
+ return !$this->formaterror && ($this->data || (is_object($this->obj) && $this->obj->isValid()));
}
/**
diff --git a/plugins/libkolab/lib/kolab_format_event.php b/plugins/libkolab/lib/kolab_format_event.php
index e5ea3ef..9be9bdf 100644
--- a/plugins/libkolab/lib/kolab_format_event.php
+++ b/plugins/libkolab/lib/kolab_format_event.php
@@ -111,7 +111,8 @@ class kolab_format_event extends kolab_format_xcal
*/
public function is_valid()
{
- return $this->data || (is_object($this->obj) && $this->obj->isValid() && $this->obj->uid());
+ return !$this->formaterror && (($this->data && !empty($this->data['start']) && !empty($this->data['end'])) ||
+ (is_object($this->obj) && $this->obj->isValid() && $this->obj->uid()));
}
/**
diff --git a/plugins/libkolab/lib/kolab_format_file.php b/plugins/libkolab/lib/kolab_format_file.php
index f5b153b..5f73bf1 100644
--- a/plugins/libkolab/lib/kolab_format_file.php
+++ b/plugins/libkolab/lib/kolab_format_file.php
@@ -95,7 +95,7 @@ class kolab_format_file extends kolab_format
*/
public function is_valid()
{
- return $this->data || (is_object($this->obj) && $this->obj->isValid());
+ return !$this->formaterror && ($this->data || (is_object($this->obj) && $this->obj->isValid()));
}
/**
diff --git a/plugins/libkolab/lib/kolab_format_journal.php b/plugins/libkolab/lib/kolab_format_journal.php
index b9a1b4f..f7ccd31 100644
--- a/plugins/libkolab/lib/kolab_format_journal.php
+++ b/plugins/libkolab/lib/kolab_format_journal.php
@@ -54,7 +54,7 @@ class kolab_format_journal extends kolab_format
*/
public function is_valid()
{
- return $this->data || (is_object($this->obj) && $this->obj->isValid());
+ return !$this->formaterror && ($this->data || (is_object($this->obj) && $this->obj->isValid()));
}
/**
diff --git a/plugins/libkolab/lib/kolab_format_note.php b/plugins/libkolab/lib/kolab_format_note.php
index 466c536..04a8421 100644
--- a/plugins/libkolab/lib/kolab_format_note.php
+++ b/plugins/libkolab/lib/kolab_format_note.php
@@ -54,7 +54,7 @@ class kolab_format_note extends kolab_format
*/
public function is_valid()
{
- return $this->data || (is_object($this->obj) && $this->obj->isValid());
+ return !$this->formaterror && ($this->data || (is_object($this->obj) && $this->obj->isValid()));
}
/**
diff --git a/plugins/libkolab/lib/kolab_format_task.php b/plugins/libkolab/lib/kolab_format_task.php
index 56f22dc..a15cb0b 100644
--- a/plugins/libkolab/lib/kolab_format_task.php
+++ b/plugins/libkolab/lib/kolab_format_task.php
@@ -63,7 +63,7 @@ class kolab_format_task extends kolab_format_xcal
*/
public function is_valid()
{
- return $this->data || (is_object($this->obj) && $this->obj->isValid());
+ return !$this->formaterror && ($this->data || (is_object($this->obj) && $this->obj->isValid()));
}
/**
commit fbf3207dfb39707c5399ec36b8e7141f3c4f09ca
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date: Wed Oct 16 14:28:17 2013 +0200
Improve ical parser to read alarms with zero-values exported by Google (e.g. TRIGGER:-P0DT0H30M0S)
diff --git a/plugins/libcalendaring/libcalendaring.php b/plugins/libcalendaring/libcalendaring.php
index 47cf67e..05465b0 100644
--- a/plugins/libcalendaring/libcalendaring.php
+++ b/plugins/libcalendaring/libcalendaring.php
@@ -313,10 +313,16 @@ class libcalendaring extends rcube_plugin
*/
public static function parse_alaram_value($val)
{
- if ($val[0] == '@')
+ if ($val[0] == '@') {
return array(substr($val, 1));
- else if (preg_match('/([+-])P?T?(\d+)([HMSDW])/', $val, $m))
- return array($m[2], $m[1].$m[3]);
+ }
+ else if (preg_match('/([+-])P?(T?\d+[HMSDW])+/', $val, $m) && preg_match_all('/T?(\d+)([HMSDW])/', $val, $m2, PREG_SET_ORDER)) {
+ foreach ($m2 as $seg) {
+ if ($seg[1] > 0) { // ignore zero values
+ return array($seg[1], $m[1].$seg[2], $m[1].$seg[1].$seg[2]);
+ }
+ }
+ }
return false;
}
diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php
index 24781c9..245f819 100644
--- a/plugins/libcalendaring/libvcalendar.php
+++ b/plugins/libcalendaring/libvcalendar.php
@@ -115,10 +115,9 @@ class libvcalendar
try {
// estimate the memory usage and try to avoid fatal errors when allowed memory gets exhausted
$count = substr_count($vcal, 'BEGIN:VEVENT');
- $memory_available = parse_bytes(ini_get('memory_limit')) - (function_exists('memory_get_usage') ? memory_get_usage() : 16*1024*1024);
$expected_memory = $count * 70*1024; // assume ~ 70K per event (empirically determined)
- if ($memory_available > 0 && $expected_memory > $memory_available) {
+ if (!rcube_utils::mem_check($expected_memory)) {
throw new Exception("iCal file too big");
}
@@ -448,8 +447,8 @@ class libvcalendar
$trigger = '@' . $prop->getDateTime()->format('U');
}
}
- if (!$trigger) {
- $trigger = preg_replace('/PT?/', '', $prop->value);
+ if (!$trigger && ($values = libcalendaring::parse_alaram_value($prop->value))) {
+ $trigger = $values[2];
}
break;
diff --git a/plugins/libcalendaring/tests/libvcalendar.php b/plugins/libcalendaring/tests/libvcalendar.php
index 3404473..4bb7941 100644
--- a/plugins/libcalendaring/tests/libvcalendar.php
+++ b/plugins/libcalendaring/tests/libvcalendar.php
@@ -139,15 +139,35 @@ class libvcalendar_test extends PHPUnit_Framework_TestCase
$this->assertEquals(2, count($rrule['EXDATE']), "Recurrence EXDATEs");
$this->assertInstanceOf('DateTime', $rrule['EXDATE'][0], "Recurrence EXDATE as DateTime");
- // alarms
+ // categories, class
+ $this->assertEquals('libcalendaring tests', join(',', (array)$event['categories']), "Event categories");
+ $this->assertEquals('confidential', $event['sensitivity'], "Class/sensitivity = confidential");
+ }
+
+ /**
+ * @depends test_import_from_file
+ */
+ function test_alarms()
+ {
+ $ical = new libvcalendar();
+
+ $events = $ical->import_from_file(__DIR__ . '/resources/recurring.ics', 'UTF-8');
+ $event = $events[0];
+
$this->assertEquals('-12H:DISPLAY', $event['alarms'], "Serialized alarms string");
$alarm = libcalendaring::parse_alaram_value($event['alarms']);
$this->assertEquals('12', $alarm[0], "Alarm value");
$this->assertEquals('-H', $alarm[1], "Alarm unit");
- // categories, class
- $this->assertEquals('libcalendaring tests', join(',', (array)$event['categories']), "Event categories");
- $this->assertEquals('confidential', $event['sensitivity'], "Class/sensitivity = confidential");
+ // alarm trigger with 0 values
+ $events = $ical->import_from_file(__DIR__ . '/resources/alarms.ics', 'UTF-8');
+ $event = $events[0];
+
+ $this->assertEquals('-30M:DISPLAY', $event['alarms'], "Stripped alarm string");
+ $alarm = libcalendaring::parse_alaram_value($event['alarms']);
+ $this->assertEquals('30', $alarm[0], "Alarm value");
+ $this->assertEquals('-M', $alarm[1], "Alarm unit");
+ $this->assertEquals('-30M', $alarm[2], "Alarm string");
}
/**
diff --git a/plugins/libcalendaring/tests/resources/alarms.ics b/plugins/libcalendaring/tests/resources/alarms.ics
new file mode 100644
index 0000000..a9d7b19
--- /dev/null
+++ b/plugins/libcalendaring/tests/resources/alarms.ics
@@ -0,0 +1,43 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 5.0.3//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:Europe/Zurich
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+DTSTART:19810329T020000
+TZNAME:CEST
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+DTSTART:19961027T030000
+TZNAME:CET
+TZOFFSETTO:+0100
+END:STANDARD
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:1dq52u617gkfqrr4uo1i2uh70
+CREATED:20130924T221822Z
+DESCRIPTION:
+DTSTART:20130818T230000Z
+DTEND:20130819T010000Z
+DTSTAMP:20130824T235608Z
+LAST-MODIFIED:20130924T222118Z
+LOCATION:
+SEQUENCE:2
+STATUS:CONFIRMED
+SUMMARY:Alarms test
+TRANSP:OPAQUE
+BEGIN:VALARM
+ACTION:DISPLAY
+DESCRIPTION:This is an event reminder
+TRIGGER:-P0DT0H30M0S
+END:VALARM
+END:VEVENT
+
+END:VCALENDAR
More information about the commits
mailing list