<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="https://dev.horde.org/themes/horde//default/feed-rss.xsl" type="text/xsl"?> 
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> 
 <channel> 
  <title>Synchronization of multiple calendars with SyncML</title> 
  <pubDate>Thu, 09 Apr 2026 22:17:55 +0000</pubDate> 
  <link>https://bugs.horde.org/ticket/8734</link> 
  <atom:link rel="self" type="application/rss+xml" title="Synchronization of multiple calendars with SyncML" href="https://bugs.horde.org/ticket/8734/rss" /> 
  <description>Synchronization of multiple calendars with SyncML</description> 
 
   
   
  <item> 
   <title>I added capabilities to synchronize multiple calendars with </title> 
   <description>I added capabilities to synchronize multiple calendars with kronolith, inspired by the turba code. For me the patch works well with my mobile as well as with a thunderbird/lightning/funambol client.

Regards
Heienr
</description> 
   <pubDate>Sat, 28 Nov 2009 07:48:43 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56885</link> 
  </item> 
   
  <item> 
   <title>It looks like one part is missing: finding the correct calen</title> 
   <description>It looks like one part is missing: finding the correct calendar out of sync_cals when updating an existing event in _kronolith_replace().
OTOH please remove the changes to _kronolith_synchronize(), this method is for Kolab.
Beside those two issues, it&#039;s a great patch.</description> 
   <pubDate>Tue, 01 Dec 2009 23:05:50 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56953</link> 
  </item> 
   
  <item> 
   <title>I&#039;d like test the patch. Can you upload it?. Thanks</title> 
   <description>I&#039;d like test the patch. Can you upload it?. Thanks</description> 
   <pubDate>Wed, 02 Dec 2009 10:49:21 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56959</link> 
  </item> 
   
  <item> 
   <title>The patch is attached to this bug...</title> 
   <description>The patch is attached to this bug...</description> 
   <pubDate>Wed, 02 Dec 2009 12:46:57 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56960</link> 
  </item> 
   
  <item> 
   <title>&gt; It looks like one part is missing: finding the correct cal</title> 
   <description>&gt; It looks like one part is missing: finding the correct calendar out 
&gt; of sync_cals when updating an existing event in _kronolith_replace().
&gt; OTOH please remove the changes to _kronolith_synchronize(), this 
&gt; method is for Kolab.
&gt; Beside those two issues, it&#039;s a great patch.

Hello,

as far as I understood, the event returned by
$event = $kronolith_driver-&gt;getByUID($uid);
knows which calendar it belongs to, and hence no manual lookup is required.
For me, the patch works, and modified events appear in the correct calendar (and are not moved to the default calendar). As the synchronization framework only knows about the events returned by _kronolith_list, events from calendars not used for synchronization should not be modified.
I did not know what _kronolith_synchronize is used for, and in the turba/lib/api.php, the _turba_synchronize routine is modified in an analogous way - sorry, I  removed the modifications (they did not harm in my setup, however).

Best regards
</description> 
   <pubDate>Thu, 03 Dec 2009 17:08:58 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56973</link> 
  </item> 
   
  <item> 
   <title>
&gt; as far as I understood, the event returned by
&gt; $event </title> 
   <description>
&gt; as far as I understood, the event returned by
&gt; $event = $kronolith_driver-&gt;getByUID($uid);
&gt; knows which calendar it belongs to, and hence no manual lookup is required.

This returns an event by the UID, which uniquely identifies the event across *all* calendars - in other words, two calendars that have an entry for the same event would contain the same UID so you can&#039;t be sure which calendar the event belongs to when using that method.
</description> 
   <pubDate>Thu, 03 Dec 2009 17:20:00 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56974</link> 
  </item> 
   
  <item> 
   <title>&gt; This returns an event by the UID, which uniquely identifie</title> 
   <description>&gt; This returns an event by the UID, which uniquely identifies the event 
&gt; across *all* calendars - in other words, two calendars that have an 
&gt; entry for the same event would contain the same UID so you can&#039;t be 
&gt; sure which calendar the event belongs to when using that method.
&gt;
Thank you, now I understand the problem. I will try to solve it as soon as I find some time for it. Currently however I have no idea how to determine which calendar an event belongs to...</description> 
   <pubDate>Thu, 03 Dec 2009 17:32:02 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56975</link> 
  </item> 
   
  <item> 
   <title>&gt;
&gt;&gt; as far as I understood, the event returned by
&gt;&gt; $eve</title> 
   <description>&gt;
&gt;&gt; as far as I understood, the event returned by
&gt;&gt; $event = $kronolith_driver-&gt;getByUID($uid);
&gt;&gt; knows which calendar it belongs to, and hence no manual lookup is required.
&gt;
&gt; This returns an event by the UID, which uniquely identifies the event 
&gt; across *all* calendars - in other words, two calendars that have an 
&gt; entry for the same event would contain the same UID so you can&#039;t be 
&gt; sure which calendar the event belongs to when using that method.

This shouldn&#039;t happen actually, because we check for the existence of the UID when adding new events.</description> 
   <pubDate>Thu, 03 Dec 2009 17:49:05 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t56976</link> 
  </item> 
   
  <item> 
   <title>The patch doesn&#039;t apply to the latest version of api.php at </title> 
   <description>The patch doesn&#039;t apply to the latest version of api.php at all. Can you provide a patch against the latest api.php version?
http://cvs.horde.org/h/chora/co.php/kronolith/lib/api.php?r=1.126.2.65&amp;p=1</description> 
   <pubDate>Fri, 04 Dec 2009 16:55:36 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57003</link> 
  </item> 
   
  <item> 
   <title>&gt;&gt; This returns an event by the UID, which uniquely identifi</title> 
   <description>&gt;&gt; This returns an event by the UID, which uniquely identifies the event
&gt;&gt; across *all* calendars - in other words, two calendars that have an
&gt;&gt; entry for the same event would contain the same UID so you can&#039;t be
&gt;&gt; sure which calendar the event belongs to when using that method.
&gt;&gt;
&gt; Thank you, now I understand the problem. I will try to solve it as 
&gt; soon as I find some time for it. Currently however I have no idea how 
&gt; to determine which calendar an event belongs to...

I changed my mind: Actually, i did not modify _kronolith_replace() at all, so if there is a problem with UIDs not identifying an event uniquely, that problem would have existed before my modifications.</description> 
   <pubDate>Sat, 05 Dec 2009 14:54:40 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57013</link> 
  </item> 
   
  <item> 
   <title>&gt; The patch doesn&#039;t apply to the latest version of api.php a</title> 
   <description>&gt; The patch doesn&#039;t apply to the latest version of api.php at all. Can 
&gt; you provide a patch against the latest api.php version?
&gt; http://cvs.horde.org/h/chora/co.php/kronolith/lib/api.php?r=1.126.2.65&amp;p=1

I will try to provide a patch soon (within the next one or two weeks). Is it possible to replace kronolith 2.3 api.php with the current version, or do I have to upgrade kronolith? If an upgrade is required, is it enough to upgrade kronolith only or do I have to upgrade the complete horde setup?</description> 
   <pubDate>Sat, 05 Dec 2009 15:00:58 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57014</link> 
  </item> 
   
  <item> 
   <title>&gt; The patch doesn&#039;t apply to the latest version of api.php a</title> 
   <description>&gt; The patch doesn&#039;t apply to the latest version of api.php at all. Can 
&gt; you provide a patch against the latest api.php version?
&gt; http://cvs.horde.org/h/chora/co.php/kronolith/lib/api.php?r=1.126.2.65&amp;p=1

I attached a patch against the current FRAMEWORK_3 cvs branch.
The .tar.gz file contains three .diffs for the files config/prefs.php, lib/api.php and lib/prefs.php in kronolith.

I tested the code with a thunderbird/funambol client and a test server setup, for me all sorts of adding, deleting and modifying events work and are correctly synchronized.

Where are conflicts handled (i.e. if the same event is changed on both client and horde before synchronizing)? I am wondering whether there is a possibility to configure what happens in that case (like duplicate event, client is right, horde is right, select newer, etc.)...
</description> 
   <pubDate>Thu, 10 Dec 2009 11:37:57 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57106</link> 
  </item> 
   
  <item> 
   <title>&gt; It looks like one part is missing: finding the correct cal</title> 
   <description>&gt; It looks like one part is missing: finding the correct calendar out 
&gt; of sync_cals when updating an existing event in _kronolith_replace().
&gt; OTOH please remove the changes to _kronolith_synchronize(), this 
&gt; method is for Kolab.
&gt; Beside those two issues, it&#039;s a great patch.

I am using the first version of the patch with a kolab 2.2.2 server, and there, the modification to _kronolith_synchronize is required. If I remove it (the second version of the patch) and create a new event in a calender selected for synchronization that is NOT the default calendar, this event will be duplicated on the client during synchronization, probably because some of the settings in the imap backend of kolab do not get correctly updated. With the patch to _kronolith_synchronize, everything works as expected.</description> 
   <pubDate>Tue, 15 Dec 2009 14:33:25 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57176</link> 
  </item> 
   
  <item> 
   <title>Thanks for the hint!</title> 
   <description>Thanks for the hint!</description> 
   <pubDate>Tue, 15 Dec 2009 15:06:11 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57177</link> 
  </item> 
   
  <item> 
   <title>&gt; I attached a patch against the current FRAMEWORK_3 cvs bra</title> 
   <description>&gt; I attached a patch against the current FRAMEWORK_3 cvs branch.
&gt; The .tar.gz file contains three .diffs for the files 
&gt; config/prefs.php, lib/api.php and lib/prefs.php in kronolith.

Could it be, that the tar.gz is broken? Everytime I try do download it, I only get a empty 0 Byte sized file.</description> 
   <pubDate>Fri, 12 Feb 2010 00:53:58 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57970</link> 
  </item> 
   
  <item> 
   <title>&gt;&gt; I attached a patch against the current FRAMEWORK_3 cvs br</title> 
   <description>&gt;&gt; I attached a patch against the current FRAMEWORK_3 cvs branch.
&gt;&gt; The .tar.gz file contains three .diffs for the files
&gt;&gt; config/prefs.php, lib/api.php and lib/prefs.php in kronolith.
&gt;
&gt; Could it be, that the tar.gz is broken? Everytime I try do download 
&gt; it, I only get a empty 0 Byte sized file.

Clicking on the little disk symbol on the right hand side of the text worked for me. I also get a 0 Byte file when I use the text link.
</description> 
   <pubDate>Fri, 12 Feb 2010 18:50:20 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57974</link> 
  </item> 
   
  <item> 
   <title>&gt; Clicking on the little disk symbol on the right hand side </title> 
   <description>&gt; Clicking on the little disk symbol on the right hand side of the text 
&gt; worked for me. I also get a 0 Byte file when I use the text link.

Thanks - that worked for me too :-)
</description> 
   <pubDate>Fri, 12 Feb 2010 19:27:50 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t57975</link> 
  </item> 
   
  <item> 
   <title>Implemented in 3.0.5</title> 
   <description>Implemented in 3.0.5</description> 
   <pubDate>Fri, 01 Jul 2011 20:42:43 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t66101</link> 
  </item> 
   
  <item> 
   <title>
Hi,

&gt; Implemented in 3.0.5

Thank you very much for t</title> 
   <description>
Hi,

&gt; Implemented in 3.0.5

Thank you very much for this change. 
It seems multiple calendarsynchronizations are only working for owner-owned calendars. We have some group calendars and most of our users wants to be able to sync the calendars they have read-access to. 
So is it possible to add synchronaization for &quot;not&quot; owned calendars?
</description> 
   <pubDate>Tue, 09 Aug 2011 09:59:06 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t66877</link> 
  </item> 
   
  <item> 
   <title>&gt; It seems multiple calendarsynchronizations are only workin</title> 
   <description>&gt; It seems multiple calendarsynchronizations are only working for 
&gt; owner-owned calendars. We have some group calendars and most of our 
&gt; users wants to be able to sync the calendars they have read-access to.
&gt; So is it possible to add synchronaization for &quot;not&quot; owned calendars?

No. There are a number of issues with this. For your case,the most important is that there is no way to mark calendar entries readonly in activesync. Editing an event in a read only calendar would appear to work on the client,would fail to update server side which would cause the client to continuously attempt to sync this change. There is a thread on the dev list with more detailed discussion about this owner-only limitation.
</description> 
   <pubDate>Fri, 12 Aug 2011 18:06:30 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t66950</link> 
  </item> 
   
  <item> 
   <title>&gt;&gt; It seems multiple calendarsynchronizations are only worki</title> 
   <description>&gt;&gt; It seems multiple calendarsynchronizations are only working for
&gt;&gt; owner-owned calendars. We have some group calendars and most of our
&gt;&gt; users wants to be able to sync the calendars they have read-access to.
&gt;&gt; So is it possible to add synchronaization for &quot;not&quot; owned calendars?
&gt;
&gt; No. There are a number of issues with this. For your case,the most 
&gt; important is that there is no way to mark calendar entries readonly 
&gt; in activesync. Editing an event in a read only calendar would appear 
&gt; to work on the client,would fail to update server side which would 
&gt; cause the client to continuously attempt to sync this change. There 
&gt; is a thread on the dev list with more detailed discussion about this 
&gt; owner-only limitation.

OK, i solved this issue for me with his script... Maybe this will help someone else:


#!/usr/bin/perl

use DBD::mysql;
use strict;

# CONFIGURE
my $user=&quot;$ARGV[0]&quot;;
my $database=&quot;$ARGV[1]&quot;;
my $host=&quot;localhost&quot;;
my $dbuser=&quot;root&quot;;
my $password=`gtc-crypt -a mysqlroot -p`;
chomp($password);

# Connect to the DB
my $dbh = DBI-&gt;connect(&quot;DBI:mysql:database=$database;host=$host&quot;,&quot;$dbuser&quot;, &quot;$password&quot;, {&#039;RaiseError&#039; =&gt; 1}) || die &quot;No connection to DB $database: $? $!&quot;;
$password=&quot;&quot;;

# Create synccalendar if not exists
# Get primary calendar of the user
my $sth = $dbh-&gt;prepare(&quot;SELECT share_name FROM kronolith_sharesng WHERE share_owner=&#039;$user&#039;&quot;);
$sth-&gt;execute();
my $synccal;
my $nosynccal=1;
my $first=1;
while (my $cal = $sth-&gt;fetchrow_array()) {
 if ($first) {
  $synccal=$cal;
  $synccal=~s/^...../SYNC-/;
  $first=0;
 }
 else {
  if ($cal eq $synccal) {
   $nosynccal=0;
   last;
  }
 }
}
if (($nosynccal) &amp;&amp; ($synccal)) {
 my $insert=&quot;INSERT INTO kronolith_sharesng (share_name, share_owner, share_flags, perm_creator_2, perm_creator_4, perm_creator_8, perm_creator_16, perm_creator_1024, perm_default_2, perm_default_4, perm_default_8, perm_default_16, perm_default_1024, perm_guest_2, perm_guest_4, perm_guest_8, perm_guest_16, perm_guest_1024, attribute_name, attribute_desc, attribute_color, share_parents) VALUES (&#039;$synccal&#039;, &#039;$user&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;0&#039;, &#039;Sync&#039;, &#039;Only for syncing&#039;, &#039;#ffffff&#039;, &#039;NULL&#039;)&quot;;
 $dbh-&gt;do($insert) || die &quot;Error: $! $?&quot;;
}
exit 1 unless ($synccal);

# Get displayed calendars of user
my @cals;
my $sth = $dbh-&gt;prepare(&quot;SELECT pref_value FROM horde_prefs WHERE pref_scope=&#039;kronolith&#039; AND pref_name=&#039;display_cals&#039; AND pref_uid=&#039;$user&#039;&quot;);
$sth-&gt;execute();
while (my $ref = $sth-&gt;fetchrow_hashref()) {
 my $cals= $ref-&gt;{&#039;pref_value&#039;};
 $cals=~s/^a:.+:{//;
 $cals=~s/i:.;s:23://g;
 $cals=~s/\&quot;//g;
 $cals=~s/;}$//;
 @cals=split(/;/, $cals);
}
exit 1 unless ($cals[0]);

# Set Sync-Calendar in Horde-Prefs
$dbh-&gt;do(&quot;DELETE FROM horde_prefs WHERE pref_uid=&#039;$user&#039; AND pref_name=&#039;sync_calendars&#039; AND pref_scope=&#039;kronolith&#039;&quot;);
$dbh-&gt;do(&quot;INSERT INTO horde_prefs (pref_uid, pref_scope, pref_name, pref_value) VALUES (&#039;$user&#039;, &#039;kronolith&#039;, &#039;sync_calendars&#039;, &#039;a:1:{i:0;s:23:\&quot;$synccal\&quot;;}&#039;)&quot;);

# Clear the sync-calendar
$dbh-&gt;do(&quot;DELETE FROM kronolith_events WHERE calendar_id=&#039;$synccal&#039;&quot;);

# Copy Calendars to sync-Calendar
foreach my $cal (@cals) {
 if ($cal eq $synccal) { next }
 my $sth = $dbh-&gt;prepare(&quot;SELECT * FROM kronolith_events WHERE calendar_id=&#039;$cal&#039;&quot;);
 $sth-&gt;execute();
 while (my $ref = $sth-&gt;fetchrow_hashref()) {
  $ref-&gt;{&#039;event_id&#039;}=~s/^...../SYNC-/;
  my $insert=&quot;INSERT INTO kronolith_events (event_keywords, event_exceptions, event_recurinterval, event_recurdays, event_recurenddate, event_recurcount, event_baseid, event_exceptionoriginaldate, event_id, event_uid, event_creator_id, event_title, event_description, event_location, event_url, event_private, event_status, event_attendees, event_resources, event_modified, event_start, event_end, event_allday, event_alarm, event_alarm_methods, event_recurtype, calendar_id) VALUES (&#039;$ref-&gt;{&#039;event_keywords&#039;}&#039;, &#039;$ref-&gt;{&#039;event_exceptions&#039;}&#039;, &#039;$ref-&gt;{&#039;event_recurinterval&#039;}&#039;, &#039;$ref-&gt;{&#039;event_recurdays&#039;}&#039;, &#039;$ref-&gt;{&#039;event_recurenddate&#039;}&#039;, &#039;$ref-&gt;{&#039;event_recurcount&#039;}&#039;, &#039;$ref-&gt;{&#039;event_baseid&#039;}&#039;, &#039;$ref-&gt;{&#039;event_exceptionoriginaldate&#039;}&#039;, &#039;$ref-&gt;{&#039;event_id&#039;}&#039;, &#039;$ref-&gt;{&#039;event_uid&#039;}&#039;, &#039;$ref-&gt;{&#039;event_creator_id&#039;}&#039;, &#039;$ref-&gt;{&#039;event_title&#039;}&#039;, &#039;$ref-&gt;{&#039;event_description&#039;}&#039;, &#039;$ref-&gt;{&#039;event_location&#039;}&#039;, &#039;$ref-&gt;{&#039;event_url&#039;}&#039;, &#039;$ref-&gt;{&#039;event_private&#039;}&#039;, &#039;$ref-&gt;{&#039;event_status&#039;}&#039;, &#039;$ref-&gt;{&#039;event_attendees&#039;}&#039;, &#039;$ref-&gt;{&#039;event_resources&#039;}&#039;, &#039;$ref-&gt;{&#039;event_modified&#039;}&#039;, &#039;$ref-&gt;{&#039;event_start&#039;}&#039;, &#039;$ref-&gt;{&#039;event_end&#039;}&#039;, &#039;$ref-&gt;{&#039;event_allday&#039;}&#039;, &#039;$ref-&gt;{&#039;event_alarm&#039;}&#039;, &#039;$ref-&gt;{&#039;event_alarm_methods&#039;}&#039;, &#039;$ref-&gt;{&#039;event_recurtype&#039;}&#039;, &#039;$synccal&#039;)&quot;;
  $dbh-&gt;do($insert) || die &quot;Error: $! $?&quot;;
 }
 $sth-&gt;finish();

 # Copy Horde-Histories-Settings for synchronization
 $sth = $dbh-&gt;prepare(&quot;SELECT * FROM horde_histories&quot;);
 $sth-&gt;execute();
 while (my $ref = $sth-&gt;fetchrow_hashref()) {
  if ($ref-&gt;{&#039;object_uid&#039;} =~ /^kronolith\:$cal/) {
   $ref-&gt;{&#039;object_uid&#039;}=~s/^kronolith\:$cal/kronolith\:$synccal/;
   my $insert=&quot;INSERT INTO horde_histories (object_uid, history_action, history_ts, history_desc, history_who, history_extra) VALUES (&#039;$ref-&gt;{&#039;object_uid&#039;}&#039;, &#039;$ref-&gt;{&#039;history_action&#039;}&#039;, &#039;$ref-&gt;{&#039;history_ts&#039;}&#039;, &#039;$ref-&gt;{&#039;history_desc&#039;}&#039;, &#039;$ref-&gt;{&#039;history_who&#039;}&#039;, &#039;$ref-&gt;{&#039;history_extra&#039;}&#039;)&quot;;
   $dbh-&gt;do($insert) || die &quot;Error: $! $?&quot;;
   next;
  }
  if ($ref-&gt;{&#039;object_uid&#039;} =~ /^kronolith\:$synccal/) {
   $dbh-&gt;do(&quot;DELETE FROM horde_histories WHERE history_id=&#039;$ref-&gt;{&#039;history_id&#039;}&#039;&quot;);
  }
 }
 $sth-&gt;finish();
}


</description> 
   <pubDate>Thu, 25 Aug 2011 14:39:38 +0000</pubDate> 
   <link>https://bugs.horde.org/ticket/8734#t67115</link> 
  </item> 
   
   
 
 </channel> 
</rss> 
