]> source.dussan.org Git - nextcloud-server.git/commitdiff
Implemented VCFExportPlugin.
authorThomas Tanghus <thomas@tanghus.net>
Sun, 8 Jul 2012 15:52:57 +0000 (17:52 +0200)
committerThomas Tanghus <thomas@tanghus.net>
Sun, 8 Jul 2012 15:52:57 +0000 (17:52 +0200)
apps/contacts/appinfo/app.php
apps/contacts/appinfo/remote.php
apps/contacts/lib/VCFExportPlugin.php [new file with mode: 0644]
apps/contacts/settings.php
apps/contacts/templates/settings.php

index 64fe00eef10c221d8d49ec860de1e2dada47f9cd..33e89c3e9be04c5debfa60559125ef728fadbe2f 100644 (file)
@@ -4,6 +4,7 @@ OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'apps/contacts/lib/addressbook.php';
 OC::$CLASSPATH['OC_Contacts_VCard'] = 'apps/contacts/lib/vcard.php';
 OC::$CLASSPATH['OC_Contacts_Hooks'] = 'apps/contacts/lib/hooks.php';
 OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php';
+OC::$CLASSPATH['Sabre_CardDAV_VCFExportPlugin'] = 'apps/contacts/lib/VCFExportPlugin.php';
 OC::$CLASSPATH['OC_Search_Provider_Contacts'] = 'apps/contacts/lib/search.php';
 OCP\Util::connectHook('OC_User', 'post_createUser', 'OC_Contacts_Hooks', 'createUser');
 OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OC_Contacts_Hooks', 'deleteUser');
index 5add3bc6889651a4a5e3c661eecfbba9e0ad4467..09c2de179907bf1c8ac8952ba1263037bed7aa6d 100644 (file)
@@ -49,6 +49,7 @@ $server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud'));
 $server->addPlugin(new Sabre_CardDAV_Plugin());
 $server->addPlugin(new Sabre_DAVACL_Plugin());
 $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
+$server->addPlugin(new Sabre_CardDAV_VCFExportPlugin());
 
 // And off we go!
 $server->exec();
diff --git a/apps/contacts/lib/VCFExportPlugin.php b/apps/contacts/lib/VCFExportPlugin.php
new file mode 100644 (file)
index 0000000..b1edcaa
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+
+/**
+ * ICS Exporter
+ *
+ * This plugin adds the ability to export entire address books as .vcf files.
+ * This is useful for clients that don't support CardDAV yet. They often do
+ * support vcf files.
+ *
+ * @package Sabre
+ * @subpackage CardDAV
+ * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Sabre_CardDAV_VCFExportPlugin extends Sabre_DAV_ServerPlugin {
+
+    /**
+     * Reference to Server class
+     *
+     * @var Sabre_DAV_Server
+     */
+    private $server;
+
+    /**
+     * Initializes the plugin and registers event handlers
+     *
+     * @param Sabre_DAV_Server $server
+     * @return void
+     */
+    public function initialize(Sabre_DAV_Server $server) {
+
+        $this->server = $server;
+        $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90);
+
+    }
+
+    /**
+     * 'beforeMethod' event handles. This event handles intercepts GET requests ending
+     * with ?export
+     *
+     * @param string $method
+     * @param string $uri
+     * @return bool
+     */
+    public function beforeMethod($method, $uri) {
+
+        if ($method!='GET') return;
+        if ($this->server->httpRequest->getQueryString()!='export') return;
+
+        // splitting uri
+        list($uri) = explode('?',$uri,2);
+
+        $node = $this->server->tree->getNodeForPath($uri);
+
+        if (!($node instanceof Sabre_CardDAV_AddressBook)) return;
+
+        // Checking ACL, if available.
+        if ($aclPlugin = $this->server->getPlugin('acl')) {
+            $aclPlugin->checkPrivileges($uri, '{DAV:}read');
+        }
+
+        $this->server->httpResponse->setHeader('Content-Type','text/directory');
+        $this->server->httpResponse->sendStatus(200);
+
+        $nodes = $this->server->getPropertiesForPath($uri, array(
+            '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data',
+        ),1);
+
+        $this->server->httpResponse->sendBody($this->generateVCF($nodes));
+
+        // Returning false to break the event chain
+        return false;
+
+    }
+
+    /**
+     * Merges all vcard objects, and builds one big vcf export
+     *
+     * @param array $nodes
+     * @return string
+     */
+    public function generateVCF(array $nodes) {
+        $objects = array();
+
+        foreach($nodes as $node) {
+
+            if (!isset($node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data'])) {
+                continue;
+            }
+            $nodeData = $node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data'];
+
+            $nodeComp = Sabre_VObject_Reader::read($nodeData);
+            $objects[] = $nodeComp;
+
+        }
+        ob_start();
+        foreach($objects as $obj) echo $obj->serialize();
+        return ob_get_clean();
+
+    }
+
+}
index c88fed0b4d6c1882bd81cc2c88fedf77c3315907..bc57f4a1d05d6bc575967aac5ff4836673db8e0f 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 $tmpl = new OCP\Template( 'contacts', 'settings');
+$tmpl->assign('addressbooks', OC_Contacts_Addressbook::all(OCP\USER::getUser()), false);
 
 return $tmpl->fetchPage();
 ?>
index 216003b6c698938437807adb6dbb54317f88a5fb..f520559d1432da97056134103709c0d01e565bfa 100644 (file)
@@ -7,6 +7,12 @@
                <dd><code><?php echo OCP\Util::linkToRemote('carddav'); ?></code></dd>
                <dt><?php echo $l->t('iOS/OS X'); ?></dt>
                <dd><code><?php echo OCP\Util::linkToRemote('carddav'); ?>principals/<?php echo OCP\USER::getUser(); ?></code>/</dd>
+               <dt><?php echo $l->t('Read only vCard directory link(s)'); ?></dt>
+               <dd>
+                       <?php foreach($_['addressbooks'] as $addressbook) { ?>
+                       <a href="<?php echo OCP\Util::linkToRemote('carddav').'addressbooks/'.OCP\USER::getUser().'/'.rawurlencode($addressbook['uri']) ?>?export"><?php echo $addressbook['displayname'] ?></a><br />
+                       <?php } ?>
+               </dd>
                </dl>
                Powered by <a href="http://geonames.org/" target="_blank">geonames.org webservice</a>
        </fieldset>