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