4 commits - plugins/calendar plugins/kolab_addressbook plugins/libkolab

Thomas Brüderli bruederli at kolabsys.com
Thu Oct 3 12:45:34 CEST 2013


 plugins/calendar/calendar_ui.js                        |    8 +++
 plugins/calendar/config.inc.php.dist                   |    7 +++
 plugins/calendar/drivers/kolab/kolab_calendar.php      |   18 ++++++++
 plugins/calendar/drivers/kolab/kolab_driver.php        |    1 
 plugins/calendar/localization/de_CH.inc                |    1 
 plugins/calendar/localization/de_DE.inc                |    1 
 plugins/calendar/localization/en_US.inc                |    1 
 plugins/calendar/skins/classic/calendar.css            |    3 -
 plugins/calendar/skins/classic/templates/calendar.html |    4 +
 plugins/calendar/skins/larry/calendar.css              |    3 -
 plugins/calendar/skins/larry/templates/calendar.html   |    4 +
 plugins/kolab_addressbook/config.inc.php.dist          |    8 +++
 plugins/kolab_addressbook/kolab_addressbook.js         |   24 +++++++++++
 plugins/kolab_addressbook/kolab_addressbook.php        |    1 
 plugins/kolab_addressbook/lib/kolab_addressbook_ui.php |    7 ++-
 plugins/kolab_addressbook/lib/rcube_kolab_contacts.php |   18 ++++++++
 plugins/kolab_addressbook/localization/de_CH.inc       |    2 
 plugins/kolab_addressbook/localization/de_DE.inc       |    2 
 plugins/kolab_addressbook/localization/en_US.inc       |    2 
 plugins/libkolab/lib/kolab_storage.php                 |    3 +
 plugins/libkolab/lib/kolab_storage_folder.php          |   37 +++++++++++++++++
 21 files changed, 152 insertions(+), 3 deletions(-)

New commits:
commit fd10ffb9e10f9661b78898f629414a81018d61eb
Merge: e6e2044 ec38ede
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Oct 3 12:45:07 2013 +0200

    Merge branch 'master' of ssh://git.kolab.org/git/roundcubemail-plugins-kolab



commit e6e2044d403cc0bef84b670db104616644476c09
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Oct 3 12:44:41 2013 +0200

    Add option to display direct CardDAV urls for Kolab address books in the Roundcube UI

diff --git a/plugins/kolab_addressbook/config.inc.php.dist b/plugins/kolab_addressbook/config.inc.php.dist
index 02745c8..0a0decf 100644
--- a/plugins/kolab_addressbook/config.inc.php.dist
+++ b/plugins/kolab_addressbook/config.inc.php.dist
@@ -11,4 +11,12 @@
 */
 $rcmail_config['kolab_addressbook_prio'] = 0;
 
+// Base URL to build fully qualified URIs to access calendars via CALDAV
+// The following replacement variables are supported:
+// %h - Current HTTP host
+// %u - Current webmail user name
+// %n - Folder name
+// %i - Folder UUID
+// $rcmail_config['kolab_addressbook_carddav_url'] = 'http://%h/iRony/addressbooks/%u/%i';
+
 ?>
diff --git a/plugins/kolab_addressbook/kolab_addressbook.js b/plugins/kolab_addressbook/kolab_addressbook.js
index b024fab..5824880 100644
--- a/plugins/kolab_addressbook/kolab_addressbook.js
+++ b/plugins/kolab_addressbook/kolab_addressbook.js
@@ -18,6 +18,7 @@ rcube_webmail.prototype.set_book_actions = function()
 
     this.enable_command('book-create', true);
     this.enable_command('book-edit', 'book-delete', source && sources[source] && sources[source].kolab && sources[source].editable);
+    this.enable_command('book-showurl', source && sources[source] && sources[source].carddavurl);
 };
 
 rcube_webmail.prototype.book_create = function()
@@ -38,6 +39,29 @@ rcube_webmail.prototype.book_delete = function()
     }
 };
 
+rcube_webmail.prototype.book_showurl = function()
+{
+    var source = this.env.source ? this.env.address_sources[this.env.source] : null;
+    if (source && source.carddavurl) {
+        $('div.showurldialog:ui-dialog').dialog('close');
+
+        var $dialog = $('<div>').addClass('showurldialog').append('<p>'+rcmail.gettext('carddavurldescription', 'kolab_addressbook')+'</p>'),
+            textbox = $('<textarea>').addClass('urlbox').css('width', '100%').attr('rows', 2).appendTo($dialog);
+
+          $dialog.dialog({
+            resizable: true,
+            closeOnEscape: true,
+            title: rcmail.gettext('bookshowurl', 'kolab_addressbook'),
+            close: function() {
+              $dialog.dialog("destroy").remove();
+            },
+            width: 520
+          }).show();
+
+          textbox.val(source.carddavurl).select();
+    }
+};
+
 // displays page with book edit/create form
 rcube_webmail.prototype.book_show_contentframe = function(action, framed)
 {
diff --git a/plugins/kolab_addressbook/kolab_addressbook.php b/plugins/kolab_addressbook/kolab_addressbook.php
index d6f0d6d..a3f480c 100644
--- a/plugins/kolab_addressbook/kolab_addressbook.php
+++ b/plugins/kolab_addressbook/kolab_addressbook.php
@@ -117,6 +117,7 @@ class kolab_addressbook extends rcube_plugin
                 'undelete' => $abook->undelete && $undelete,
                 'realname' => rcube_charset::convert($abook->get_realname(), 'UTF7-IMAP'), // IMAP folder name
                 'class_name' => $abook->get_namespace(),
+                'carddavurl' => $abook->get_carddav_url(),
                 'kolab'    => true,
             );
         }
diff --git a/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php b/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php
index 7546046..5e4e4d5 100644
--- a/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php
+++ b/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php
@@ -58,6 +58,10 @@ class kolab_addressbook_ui
             $options = array('book-create', 'book-edit', 'book-delete');
             $idx     = 0;
 
+            if ($this->rc->config->get('kolab_addressbook_carddav_url')) {
+              $options[] = 'book-showurl';
+            }
+
             foreach ($options as $command) {
                 $content = html::tag('li', $idx ? null : array('class' => 'separator_above'),
                     $this->plugin->api->output->button(array(
@@ -82,7 +86,8 @@ class kolab_addressbook_ui
             $this->plugin->api->add_content($content, 'groupoptions');
 
             $this->rc->output->add_label('kolab_addressbook.bookdeleteconfirm',
-                'kolab_addressbook.bookdeleting');
+                'kolab_addressbook.bookdeleting', 'kolab_addressbook.bookshowurl',
+                'kolab_addressbook.carddavurldescription');
         }
         // book create/edit form
         else {
diff --git a/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php b/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php
index 365e251..13c7740 100644
--- a/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php
+++ b/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php
@@ -178,6 +178,24 @@ class rcube_kolab_contacts extends rcube_addressbook
         return $this->namespace;
     }
 
+    /**
+     * Compose an URL for CardDAV access to this address book (if configured)
+     */
+    public function get_carddav_url()
+    {
+      $url = null;
+      $rcmail = rcmail::get_instance();
+      if ($template = $rcmail->config->get('kolab_addressbook_carddav_url', null)) {
+        return strtr($template, array(
+          '%h' => $_SERVER['HTTP_HOST'],
+          '%u' => urlencode($rcmail->get_user_name()),
+          '%i' => urlencode($this->storagefolder->get_uid()),
+          '%n' => urlencode($this->imap_folder),
+        ));
+      }
+
+      return false;
+    }
 
     /**
      * Setter for the current group
diff --git a/plugins/kolab_addressbook/localization/de_CH.inc b/plugins/kolab_addressbook/localization/de_CH.inc
index 3439448..130564b 100644
--- a/plugins/kolab_addressbook/localization/de_CH.inc
+++ b/plugins/kolab_addressbook/localization/de_CH.inc
@@ -25,6 +25,8 @@ $labels['bookdelete'] = 'Adressbuch löschen';
 $labels['bookproperties'] = 'Eigenschaften des Adressbuchs';
 $labels['bookname'] = 'Name des Buches';
 $labels['parentbook'] = 'Ãœbergeordnetes Buch';
+$labels['bookshowurl'] = 'CardDAV-URL anzeigen';
+$labels['carddavurldescription'] = 'Benutzen Sie folgende Addresse in einer <a href="http://en.wikipedia.org/wiki/CardDAV" target="_blank">CalDAV</a>-Anwendung um dieses spezifische Adressbuch mit dem Computer oder Mobiltelefon zu synchronisieren.';
 
 $labels['addressbookprio'] = 'Reihenfolge der Adressbücher';
 $labels['personalfirst'] = 'Private(s) Adressbuch/Adressbücher zuerst';
diff --git a/plugins/kolab_addressbook/localization/de_DE.inc b/plugins/kolab_addressbook/localization/de_DE.inc
index 2c2a5d2..8f44c8f 100644
--- a/plugins/kolab_addressbook/localization/de_DE.inc
+++ b/plugins/kolab_addressbook/localization/de_DE.inc
@@ -25,6 +25,8 @@ $labels['bookdelete'] = 'Adressbuch löschen';
 $labels['bookproperties'] = 'Eigenschaften des Adressbuchs';
 $labels['bookname'] = 'Name des Buches';
 $labels['parentbook'] = 'Ãœbergeordnetes Buch';
+$labels['bookshowurl'] = 'CardDAV-URL anzeigen';
+$labels['carddavurldescription'] = 'Benutzen Sie folgende Addresse in einer <a href="http://en.wikipedia.org/wiki/CardDAV" target="_blank">CalDAV</a>-Anwendung um dieses spezifische Adressbuch mit dem Computer oder Mobiltelefon zu synchronisieren.';
 
 $labels['addressbookprio'] = 'Reihenfolge der Adressbücher';
 $labels['personalfirst'] = 'Private(s) Adressbuch/Adressbücher zuerst';
diff --git a/plugins/kolab_addressbook/localization/en_US.inc b/plugins/kolab_addressbook/localization/en_US.inc
index a66426f..c1ab0f5 100644
--- a/plugins/kolab_addressbook/localization/en_US.inc
+++ b/plugins/kolab_addressbook/localization/en_US.inc
@@ -25,6 +25,8 @@ $labels['bookdelete'] = 'Delete address book';
 $labels['bookproperties'] = 'Address book properties';
 $labels['bookname'] = 'Book name';
 $labels['parentbook'] = 'Superior book';
+$labels['bookshowurl'] = 'Show CardDAV URL';
+$labels['carddavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CardDAV" target="_blank">CardDAV</a> client application to fully synchronize this specific address book with your computer or mobile device.';
 
 $labels['addressbookprio'] = 'Address book(s) selection/behaviour';
 $labels['personalfirst'] = 'Personal address book(s) first';


commit 1800bd65562b12fa58dbc2a3efdffe31ef2c0098
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Oct 3 12:07:02 2013 +0200

    Add option to display direct CalDAV urls for calendars in the UI

diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js
index 2747641..81e350f 100644
--- a/plugins/calendar/calendar_ui.js
+++ b/plugins/calendar/calendar_ui.js
@@ -2009,6 +2009,14 @@ function rcube_calendar_ui(settings)
         $dialog.dialog('close');
 
       if (calendar.feedurl) {
+        if (calendar.caldavurl) {
+          $('#caldavurl').val(calendar.caldavurl);
+          $('#calendarcaldavurl').show();
+        }
+        else {
+          $('#calendarcaldavurl').hide();
+        }
+
         $dialog.dialog({
           resizable: true,
           closeOnEscape: true,
diff --git a/plugins/calendar/config.inc.php.dist b/plugins/calendar/config.inc.php.dist
index a8d5da8..56748bf 100644
--- a/plugins/calendar/config.inc.php.dist
+++ b/plugins/calendar/config.inc.php.dist
@@ -119,5 +119,12 @@ $rcmail_config['calendar_itip_smtp_user'] = 'smtpauth';
 // SMTP password used to send (anonymous) itip messages
 $rcmail_config['calendar_itip_smtp_pass'] = '123456';
 
+// Base URL to build fully qualified URIs to access calendars via CALDAV
+// The following replacement variables are supported:
+// %h - Current HTTP host
+// %u - Current webmail user name
+// %n - Calendar name
+// %i - Calendar UUID
+// $rcmail_config['calendar_caldav_url'] = 'http://%h/iRony/calendars/%u/%i';
 
 ?>
\ No newline at end of file
diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php
index 1cf7107..877c3f5 100644
--- a/plugins/calendar/drivers/kolab/kolab_calendar.php
+++ b/plugins/calendar/drivers/kolab/kolab_calendar.php
@@ -156,6 +156,24 @@ class kolab_calendar
   }
 
   /**
+   * Compose an URL for CalDAV access to this calendar (if configured)
+   */
+  public function get_caldav_url()
+  {
+    $url = null;
+    if ($template = $this->cal->rc->config->get('calendar_caldav_url', null)) {
+      return strtr($template, array(
+        '%h' => $_SERVER['HTTP_HOST'],
+        '%u' => urlencode($this->cal->rc->get_user_name()),
+        '%i' => urlencode($this->storage->get_uid()),
+        '%n' => urlencode($this->imap_folder),
+      ));
+    }
+
+    return false;
+  }
+
+  /**
    * Return the corresponding kolab_storage_folder instance
    */
   public function get_folder()
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index 75810b6..2edc7cd 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -123,6 +123,7 @@ class kolab_driver extends calendar_driver
         'active'   => $cal->storage->is_active(),
         'owner'    => $cal->get_owner(),
         'children' => true,  // TODO: determine if that folder indeed has child folders
+        'caldavurl' => $cal->get_caldav_url(),
       );
     }
 
diff --git a/plugins/calendar/localization/de_CH.inc b/plugins/calendar/localization/de_CH.inc
index cd3399f..b580fc2 100644
--- a/plugins/calendar/localization/de_CH.inc
+++ b/plugins/calendar/localization/de_CH.inc
@@ -76,6 +76,7 @@ $labels['onemonthback'] = '1 Monat zurück';
 $labels['nmonthsback'] = '$nr Monate zurück';
 $labels['showurl'] = 'URL anzeigen';
 $labels['showurldescription'] = 'Über die folgende Adresse können Sie mit einem beliebigen Kalenderprogramm Ihren Kalender abrufen (nur lesend), sofern dieses das iCal-Format unterstützt.';
+$labels['caldavurldescription'] = 'Benutzen Sie folgende Addresse in einer <a href="http://de.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a>-Anwendung (wie z.B. Evolution oder Mozilla Thunderbird) um diesen spezifischen Kalender mit dem Computer oder Mobiltelefon zu synchronisieren.';
 
 // agenda view
 $labels['listrange'] = 'Angezeigter Bereich:';
diff --git a/plugins/calendar/localization/de_DE.inc b/plugins/calendar/localization/de_DE.inc
index cb96b0d..60e6ad2 100644
--- a/plugins/calendar/localization/de_DE.inc
+++ b/plugins/calendar/localization/de_DE.inc
@@ -76,6 +76,7 @@ $labels['onemonthback'] = '1 Monat zurück';
 $labels['nmonthsback'] = '$nr Monate zurück';
 $labels['showurl'] = 'URL anzeigen';
 $labels['showurldescription'] = 'Über die folgende Adresse können Sie mit einem beliebigen Kalenderprogramm Ihren Kalender abrufen (nur lesend), sofern dieses das iCal-Format unterstützt.';
+$labels['caldavurldescription'] = 'Benutzen Sie folgende Addresse in einer <a href="http://de.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a>-Anwendung (wie z.B. Evolution oder Mozilla Thunderbird) um diesen spezifischen Kalender mit dem Computer oder Mobiltelefon zu synchronisieren.';
 
 // agenda view
 $labels['listrange'] = 'Angezeigter Bereich:';
diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc
index 3bf52ba..9a631b2 100644
--- a/plugins/calendar/localization/en_US.inc
+++ b/plugins/calendar/localization/en_US.inc
@@ -77,6 +77,7 @@ $labels['onemonthback'] = '1 month back';
 $labels['nmonthsback'] = '$nr months back';
 $labels['showurl'] = 'Show calendar URL';
 $labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.';
+$labels['caldavurldescription'] = 'Copy this address to a <a href="http://en.wikipedia.org/wiki/CalDAV" target="_blank">CalDAV</a> client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.';
 
 // agenda view
 $labels['listrange'] = 'Range to display:';
diff --git a/plugins/calendar/skins/classic/calendar.css b/plugins/calendar/skins/classic/calendar.css
index 117c2ce..835bdac 100644
--- a/plugins/calendar/skins/classic/calendar.css
+++ b/plugins/calendar/skins/classic/calendar.css
@@ -164,7 +164,8 @@ pre {
     background-position: 0 -92px;
 }
 
-#calfeedurl {
+#calfeedurl,
+#caldavurl {
 	width: 98%;
 	background: #fbfbfb;
 	padding: 4px;
diff --git a/plugins/calendar/skins/classic/templates/calendar.html b/plugins/calendar/skins/classic/templates/calendar.html
index a78e76f..ba80ca3 100644
--- a/plugins/calendar/skins/classic/templates/calendar.html
+++ b/plugins/calendar/skins/classic/templates/calendar.html
@@ -150,6 +150,10 @@
 <div id="calendarurlbox" class="uidialog">
   <p><roundcube:label name="calendar.showurldescription" /></p>
   <textarea id="calfeedurl" rows="2" readonly="readonly"></textarea>
+  <div id="calendarcaldavurl" style="display:none">
+    <p><roundcube:label name="calendar.caldavurldescription" html="yes" /></p>
+    <textarea id="caldavurl" rows="2" readonly="readonly"></textarea>
+  </div>
 </div>
 
 <div id="calendartoolbar">
diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css
index b11abfa..8775b2a 100644
--- a/plugins/calendar/skins/larry/calendar.css
+++ b/plugins/calendar/skins/larry/calendar.css
@@ -225,7 +225,8 @@ pre {
 	background-position: right -92px;
 }
 
-#calfeedurl {
+#calfeedurl,
+#caldavurl {
 	width: 98%;
 	background: #fbfbfb;
 	padding: 4px;
diff --git a/plugins/calendar/skins/larry/templates/calendar.html b/plugins/calendar/skins/larry/templates/calendar.html
index bc9beca..79ce5ad 100644
--- a/plugins/calendar/skins/larry/templates/calendar.html
+++ b/plugins/calendar/skins/larry/templates/calendar.html
@@ -164,6 +164,10 @@
 <div id="calendarurlbox" class="uidialog">
 	<p><roundcube:label name="calendar.showurldescription" /></p>
 	<textarea id="calfeedurl" rows="2" readonly="readonly"></textarea>
+	<div id="calendarcaldavurl" style="display:none">
+		<p><roundcube:label name="calendar.caldavurldescription" html="yes" /></p>
+		<textarea id="caldavurl" rows="2" readonly="readonly"></textarea>
+	</div>
 </div>
 
 <roundcube:object name="plugin.calendar_css" />


commit 38f521546724a453e2b09845b02afb68ed3d26a0
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Oct 3 12:02:19 2013 +0200

    Add methods to read and set a folder's UID (migrated from iRony)

diff --git a/plugins/libkolab/lib/kolab_storage.php b/plugins/libkolab/lib/kolab_storage.php
index 0f81cec..eb0211c 100644
--- a/plugins/libkolab/lib/kolab_storage.php
+++ b/plugins/libkolab/lib/kolab_storage.php
@@ -31,6 +31,9 @@ class kolab_storage
     const COLOR_KEY_PRIVATE = '/private/vendor/kolab/color';
     const NAME_KEY_SHARED   = '/shared/vendor/kolab/displayname';
     const NAME_KEY_PRIVATE  = '/private/vendor/kolab/displayname';
+    const UID_KEY_SHARED    = '/shared/vendor/kolab/uniqueid';
+    const UID_KEY_PRIVATE   = '/private/vendor/kolab/uniqueid';
+    const UID_KEY_CYRUS     = '/shared/vendor/cmu/cyrus-imapd/uniqueid';
 
     public static $version = '3.0';
     public static $last_error;
diff --git a/plugins/libkolab/lib/kolab_storage_folder.php b/plugins/libkolab/lib/kolab_storage_folder.php
index 7da57ff..e81153d 100644
--- a/plugins/libkolab/lib/kolab_storage_folder.php
+++ b/plugins/libkolab/lib/kolab_storage_folder.php
@@ -260,6 +260,43 @@ class kolab_storage_folder
     }
 
     /**
+     * Helper method to extract folder UID metadata
+     *
+     * @return string Folder's UID
+     */
+    public function get_uid()
+    {
+        // UID is defined in folder METADATA
+        $metakeys = array(kolab_storage::UID_KEY_SHARED, kolab_storage::UID_KEY_PRIVATE, kolab_storage::UID_KEY_CYRUS);
+        $metadata = $this->get_metadata($metakeys);
+        foreach ($metakeys as $key) {
+            if (($uid = $metadata[$key])) {
+                return $uid;
+            }
+        }
+
+        // generate a folder UID and set it to IMAP
+        $uid = rtrim(chunk_split(md5($this->name . $this->get_owner()), 12, '-'), '-');
+        $this->set_uid($uid);
+
+        return $uid;
+    }
+
+    /**
+     * Helper method to set an UID value to the given IMAP folder instance
+     *
+     * @param string Folder's UID
+     * @return boolean True on succes, False on failure
+     */
+    public function set_uid($uid)
+    {
+        if (!($success = $this->set_metadata(array(kolab_storage::UID_KEY_SHARED => $uid)))) {
+            $success = $this->set_metadata(array(kolab_storage::UID_KEY_PRIVATE => $uid));
+        }
+        return $success;
+    }
+
+    /**
      * Check activation status of this folder
      *
      * @return boolean True if enabled, false if not




More information about the commits mailing list