Skip to content
Snippets Groups Projects
OwnCloudPlugin.class.php 7.56 KiB
Newer Older
Rasmus Fuhse's avatar
Rasmus Fuhse committed
<?php

Rasmus Fuhse's avatar
Rasmus Fuhse committed
require_once __DIR__."/classes/OAuth.class.php";
Rasmus Fuhse's avatar
Rasmus Fuhse committed
include __DIR__.'/vendor/autoload.php';
Rasmus Fuhse's avatar
Rasmus Fuhse committed

Rasmus Fuhse's avatar
Rasmus Fuhse committed
class OwnCloudPlugin extends StudIPPlugin implements FilesystemPlugin {

    public function getFileSelectNavigation()
    {
        $nav = new Navigation(_("OwnCloud"));
        $nav->setImage(Icon::create("cloud2", "clickable"));
        return $nav;
    }

    public function getFolder($folder_id = null)
    {
        $parts = parse_url(UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_ENDPOINT);
        $url = $parts['scheme']
                    .urlencode(UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_USERNAME)
                    .":"
                    .urlencode(UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_PASSWORD)
                    ."@"
                    .$parts['host']
                    .($parts['port'] ? ":".$parts['port'] : "")
                    .($parts['path'] ?: "");
        if ($url[strlen($url) - 1] !== "/") {
            $url .= "/";
        }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $webdav = $url . "remote.php/webdav/";
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $root = "remote.php/webdav/".$folder_id;
Rasmus Fuhse's avatar
Rasmus Fuhse committed


Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $header = array();
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $header[] = "Authorization: Bearer ".\Owncloud\OAuth::getAccessToken();

        $r = curl_init();
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        curl_setopt($r, CURLOPT_CUSTOMREQUEST, "PROPFIND");
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        curl_setopt($r, CURLOPT_URL, $webdav."/".$folder_id);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        curl_setopt($r, CURLOPT_HTTPHEADER, ($header));
        curl_setopt($r, CURLOPT_RETURNTRANSFER, 1);

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $xml = curl_exec($r);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        curl_close($r);

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $doc = new DOMDocument();
        $doc->loadXML($xml);

        $folder = new VirtualFolderType(array(
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            'id' => $folder_id,
            'parent_id' => $folder_id ? "" : ""
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        ), $this->getPluginId());

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        foreach ($doc->getElementsByTagNameNS("DAV:","response") as $file) {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            //response
            //  -> href
            //  -> propstat
            //    -> prop
            //      -> resourcetype
            //      -> getcontentlength
            //      -> getcontenttype
            //      -> getlastmodified
            //    -> status
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            $file_attributes = array();

            foreach ($file->childNodes as $node) {
                if ($node->tagName === "d:href") {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    $file_attributes['name'] = substr($node->nodeValue, strpos($node->nodeValue, $root) + strlen($root));
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    $file_attributes['name'] = urldecode(array_pop(preg_split("/\//", $file_attributes['name'], 0, PREG_SPLIT_NO_EMPTY)));
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    if (!$file_attributes['name']) {
                        continue 2;
                    }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                if ($node->tagName === "d:propstat") {
                    foreach ($node->childNodes as $prop) {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                        foreach ($prop->childNodes as $attr) {
                            if ($attr->tagName === "d:resourcetype") {
                                $file_attributes['type'] = $attr->childNodes[0] && $attr->childNodes[0]->tagName === "d:collection" ? "folder" : "file";
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                            }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                            if ($attr->tagName === "d:getcontentlength") {
                                $file_attributes['size'] = $attr->nodeValue;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                            }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                            if ($attr->tagName === "d:getcontenttype") {
                                $file_attributes['contenttype'] = $attr->nodeValue;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                            }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                            if ($attr->tagName === "d:getlastmodified") {
                                $file_attributes['chdate'] = strtotime($attr->nodeValue);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                            }
                        }
                    }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                }
            }
            if ($file_attributes['type'] === "folder") {
                $subfolder = new VirtualFolderType(array(
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    'id' => ($folder_id ? $folder_id."/" : "").$file_attributes['name'],
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    'name' => $file_attributes['name'],
                    'parent_id' => $folder_id
                ), $this->getPluginId());
                $folder->createSubfolder($subfolder);
            } else {
                $folder->createFile(array(
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    'id' => ($folder_id ? $folder_id."/" : "").$file_attributes['name'],
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    'name' => $file_attributes['name'],
                    'size' => $file_attributes['size'],
                    'mime_type' => $file_attributes['contenttype'],
                    'description' => "",
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    'chdate' => $file_attributes['chdate'],
                    'download_url' => PluginEngine::getURL($this, array(), "download/".($folder_id ? $folder_id."/" : "").$file_attributes['name'])
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                ));
            }
        }

        return $folder;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
    }

Rasmus Fuhse's avatar
Rasmus Fuhse committed
    public function download_action()
    {
        $args = func_get_args();
        $file_id = implode("/", $args);

        $parts = parse_url(UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_ENDPOINT);
        $url = $parts['scheme']
            .urlencode(UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_USERNAME)
            .":"
            .urlencode(UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_PASSWORD)
            ."@"
            .$parts['host']
            .($parts['port'] ? ":".$parts['port'] : "")
            .($parts['path'] ?: "");
        if ($url[strlen($url) - 1] !== "/") {
            $url .= "/";
        }
        $webdav = $url . "remote.php/webdav/";


        $header = array();
        $header[] = "Authorization: Bearer ".\Owncloud\OAuth::getAccessToken();

        $r = curl_init();
        curl_setopt($r, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($r, CURLOPT_URL, $webdav."/".$file_id);
        curl_setopt($r, CURLOPT_HTTPHEADER, ($header));
        curl_setopt($r, CURLOPT_RETURNTRANSFER, 1);

        $content = curl_exec($r);
        curl_close($r);

        header("Content-Length: ".strlen($content));
        echo $content;
        return;
    }

Rasmus Fuhse's avatar
Rasmus Fuhse committed
    public function getPreparedFile($file_id)
    {
        //TODO

        $url = "https://www.googleapis.com/books/v1/volumes/".$file_id."?key=".urlencode(self::$googlebooksapikey);
        $info = file_get_contents($url);
        $info = studip_utf8decode(json_decode($info, true));
        $download = $info['accessInfo']['pdf']['downloadLink'] ?: $info['accessInfo']['epub']['downloadLink'];
        $tmp_path = $GLOBALS['TMP_PATH']."/".md5(uniqid());
        if (!$download) {
            var_dump($info);
        } else {
            file_put_contents($tmp_path, file_get_contents($download));
            $file = array(
                'name' => $info['volumeInfo']['title'] . ($info['accessInfo']['pdf']['downloadLink'] ? ".pdf" : ".epub"),
                'size' => filesize($tmp_path),
                'type' => $info['accessInfo']['pdf']['downloadLink'] ? "application/pdf" : "application/epub+zip",
                'tmp_path' => $tmp_path,
                'description' => $info['volumeInfo']['publishedDate'].", ".implode(", ", (array) $info['volumeInfo']['authors'])
            );
            return $file;
        }
    }

    public function filesystemConfigurationURL()
    {
        return PluginEngine::getURL($this, array(), "configure/myarea");
    }

Rasmus Fuhse's avatar
Rasmus Fuhse committed
    public function hasSearch()
    {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        return false;
    }

    public function getSearchParameters()
    {
        // TODO: Implement getSearchParameters() method.
    }

    public function search($text, $parameters = array())
    {
        return null;
    }

    public function isSource()
    {
        return UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_ACTIVATED;
    }

    public function isPersonalFileArea()
    {
        return UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_ACTIVATED;
    }

}