Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F15398229
D4839.id13851.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D4839.id13851.diff
View Options
diff --git a/lib/ext/Syncroton/Command/Sync.php b/lib/ext/Syncroton/Command/Sync.php
--- a/lib/ext/Syncroton/Command/Sync.php
+++ b/lib/ext/Syncroton/Command/Sync.php
@@ -651,7 +651,7 @@
if(is_array($collectionData->syncState->pendingdata)) {
$serverModifications = $collectionData->syncState->pendingdata;
if ($this->_logger instanceof Zend_Log) {
- $this->_logger->info(__METHOD__ . '::' . __LINE__ . " restored from sync state: (added/changed/deleted) " . count($serverModifications['added']) . '/' . count($serverModifications['changed']) . '/' . count($serverModifications['deleted']) . ' entries for sync from server to client');
+ $this->_logger->info(__METHOD__ . '::' . __LINE__ . " restored from sync state: (added/changed/deleted) " . count($serverModifications['added']) . '/' . count($serverModifications['changed']) . '/' . count($serverModifications['deleted']) . ' entries for sync from server to client');
}
} else {
try {
@@ -777,7 +777,7 @@
if ($this->_logger instanceof Zend_Log) {
$this->_logger->info(__METHOD__ . '::' . __LINE__ . " Processing collection " . $collectionData->collectionId);
}
-
+
// send reponse for newly added entries
if(!empty($clientModifications['added'])) {
foreach($clientModifications['added'] as $entryData) {
diff --git a/lib/kolab_sync_data_email.php b/lib/kolab_sync_data_email.php
--- a/lib/kolab_sync_data_email.php
+++ b/lib/kolab_sync_data_email.php
@@ -393,7 +393,7 @@
$result['messageClass'] = 'IPM.Note.SMIME.MultipartSigned';
} elseif ($headers->ctype == 'application/pkcs7-mime' || $headers->ctype == 'application/x-pkcs7-mime') {
$result['messageClass'] = 'IPM.Note.SMIME';
- } elseif ($event = $this->get_invitation_event_from_message($message)) {
+ } elseif ($event = $this->get_invitation_event_from_message($message, true)) {
// Note: Depending on MessageClass a client will display a proper set of buttons
// Either Accept/Maybe/Decline (REQUEST), or "Remove from Calendar" (CANCEL) or none (REPLY).
$result['messageClass'] = 'IPM.Schedule.Meeting.Request';
@@ -1460,27 +1460,44 @@
/**
* Returns calendar event data from the iTip invitation attached to a mail message
+ *
+ * @param rcube_message $message Mail message
+ * @param bool $ignoreErrors Ignore iTip parse errors
+ *
+ * @return null|array Event data or NULL if no iTips found or an error occured
*/
- public function get_invitation_event_from_message($message)
+ public function get_invitation_event_from_message($message, $ignoreErrors = false)
{
- // Parse the message and find iTip attachments
- $libcal = libcalendaring::get_instance();
- $libcal->mail_message_load(['object' => $message]);
- $ical_objects = $libcal->get_mail_ical_objects();
-
- // Skip methods we do not support here
- if (!in_array($ical_objects->method, ['REQUEST', 'CANCEL', 'REPLY'])) {
- return null;
- }
+ try {
+ // Parse the message and find iTip attachments
+ $libcal = libcalendaring::get_instance();
+ $libcal->mail_message_load(['object' => $message]);
+ $ical_objects = $libcal->get_mail_ical_objects();
+
+ // Skip methods we do not support here
+ if (!in_array($ical_objects->method, ['REQUEST', 'CANCEL', 'REPLY'])) {
+ return null;
+ }
- // We support only one event in the iTip
- foreach ($ical_objects as $mime_id => $event) {
- if ($event['_type'] == 'event') {
- $event['_method'] = $ical_objects->method;
- $event['_mime_id'] = $ical_objects->mime_id;
+ // We support only one event in the iTip
+ foreach ($ical_objects as $mime_id => $event) {
+ if ($event['_type'] == 'event') {
+ $event['_method'] = $ical_objects->method;
+ $event['_mime_id'] = $ical_objects->mime_id;
- return $event;
+ return $event;
+ }
}
+ } catch (\Exception $e) {
+ // To minimize occurrence of fatal errors while syncing, which would stop the whole process,
+ // we ignore any exceptions on parsing iTips. This allows the email message to be syncrotnized
+ // anyway, without stopping the sync process. We make it optional as there are cases which should throw.
+ if (!$ignoreErrors) {
+ throw $e;
+ }
+
+ $id = kolab_sync::get_instance()->get_user_name() . '/' . $message->folder . '/' . $message->uid;
+ rcube::raise_error("Failed to parse iTip message in {$id}. " . $e->getMessage(), true);
}
return null;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Sep 20, 2:18 AM (2 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
9465843
Default Alt Text
D4839.id13851.diff (5 KB)
Attached To
Mode
D4839: Ignore iTip parsing errors when synchronizing mail
Attached
Detach File
Event Timeline
Log In to Comment