Skip to content
Snippets Groups Projects
OwnCloudPlugin.class.php 8.23 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";
require_once __DIR__."/classes/OwncloudFile.php";
require_once __DIR__."/classes/OwncloudFolder.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(Config::get()->OWNCLOUD_NAME);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $nav->setImage(Icon::create("cloud", "clickable"));
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        return $nav;
    }

    public function getFolder($folder_id = null)
    {
        Navigation::activateItem('/files/my_files');
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if ($folder_id[0] === "/") {
            $folder_id = substr($folder_id, 1);
        }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if ($folder_id && !$this->isFolder($folder_id)) {
            return null;
        }
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $folder_path = explode("/", $folder_id);
        $name = rawurldecode(array_pop($folder_path));
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $parent_folder_id = implode("/", $folder_path);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $folder = new OwncloudFolder(array(
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            'id' => $folder_id,
            'name' => $name,
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            'parent_id' => $parent_folder_id,
            'range_type' => $this->getPluginId(),
            'range_id' => $this->getPluginName()
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        ), $this->getPluginId());
        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("/", array_map("rawurlencode", $args));
Rasmus Fuhse's avatar
Rasmus Fuhse committed

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $url = Config::get()->OWNCLOUD_ENDPOINT ?: UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_ENDPOINT_USER;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if ($url[strlen($url) - 1] !== "/") {
            $url .= "/";
        }
        $webdav = $url . "remote.php/webdav/";


        $header = array();
        $header[] = OwnCloudFolder::getAuthHeader();
Rasmus Fuhse's avatar
Rasmus Fuhse committed

        $r = curl_init();
        curl_setopt($r, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($r, CURLOPT_URL, $webdav . $file_id);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        curl_setopt($r, CURLOPT_HTTPHEADER, ($header));
        curl_setopt($r, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($r, CURLOPT_SSL_VERIFYPEER, (bool) Config::get()->OWNCLOUD_SSL_VERIFYPEER);
        curl_setopt($r, CURLOPT_SSL_VERIFYHOST, (bool) Config::get()->OWNCLOUD_SSL_VERIFYPEER);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if ($GLOBALS['OWNCLOUD_VERBOSE']) {
            curl_setopt($r, CURLOPT_VERBOSE, true);
        }
Rasmus Fuhse's avatar
Rasmus Fuhse committed

        $content = curl_exec($r);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $info = curl_getinfo($r);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        curl_close($r);

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        header("Content-Length: ".$info['size_download']);
        header("Content-Type: ".$info['content_type']);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        echo $content;
        return;
    }

    /**
     * @param $file_id : this is a path to the file. Remind that the chunks of this path need to be rawurlencoded!
     * @param bool $with_blob : should OwnCloudPlugin retrieve the blib of the file as well?
     * @return FileRef|null : Returns the FileRef on success and null if the file doesn't exist.
     */
Rasmus Fuhse's avatar
Rasmus Fuhse committed
    public function getPreparedFile($file_id, $with_blob = false)
Rasmus Fuhse's avatar
Rasmus Fuhse committed
    {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if (!$this->isFile($file_id)) {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $folder_path = explode("/", $file_id);
        $filename = rawurldecode(array_pop($folder_path));
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $folder_id = implode("/", $folder_path);
        $name = array_pop($folder_path);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $parent_folder_id = implode("/", $folder_path);

        $folder = new OwncloudFolder(array(
            'id' => $folder_id,
            'name' => $name,
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            'parent_id' => $parent_folder_id,
            'range_type' => $this->getPluginId(),
            'range_id' => $this->getPluginName()
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        ), $this->getPluginId());

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        foreach ($folder->getFiles() as $file_info) {
            if (($file_info->getFilename() === $file_id)
                    || ($file_info->getFilename() === rawurldecode($file_id))) {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                $info = $file_info;
                break;
            }
        }
        return $info;
Rasmus Fuhse's avatar
Rasmus Fuhse committed

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $file = new FileRef();
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $file->id           = $file_id;
        $file->foldertype   = $folder;
        $file->name         = $filename;
        $file->size         = $info->size;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $file->mime_type    = $info->mime_type;
        $file->download_url = $info->download_url;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $file->mkdate       = $info->chdate;
        $file->chdate       = $info->chdate;
        $file->content_terms_of_use_id = 'UNDEF_LICENSE';
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if ($with_blob) {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            $url = Config::get()->OWNCLOUD_ENDPOINT ?: UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_ENDPOINT_USER;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            if ($url[strlen($url) - 1] !== "/") {
                $url .= "/";
            }
            $webdav = $url . "remote.php/webdav/";


            $header = array();
            $header[] = OwnCloudFolder::getAuthHeader();
Rasmus Fuhse's avatar
Rasmus Fuhse committed

            $r = curl_init();
            curl_setopt($r, CURLOPT_CUSTOMREQUEST, "GET");
            curl_setopt($r, CURLOPT_URL, $webdav.$file_id);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            curl_setopt($r, CURLOPT_HTTPHEADER, ($header));
            curl_setopt($r, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($r, CURLOPT_SSL_VERIFYPEER, (bool) Config::get()->OWNCLOUD_SSL_VERIFYPEER);
            curl_setopt($r, CURLOPT_SSL_VERIFYHOST, (bool) Config::get()->OWNCLOUD_SSL_VERIFYPEER);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            if ($GLOBALS['OWNCLOUD_VERBOSE']) {
                curl_setopt($r, CURLOPT_VERBOSE, true);
            }
Rasmus Fuhse's avatar
Rasmus Fuhse committed

            $content = curl_exec($r);
            $info = curl_getinfo($r);
            curl_close($r);
            $path = $GLOBALS['TMP_PATH']."/".md5(uniqid());
            file_put_contents(
                $path,
                $content
            );
            $file->path_to_blob = $path;
        }
Rasmus Fuhse's avatar
Rasmus Fuhse committed

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

    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;
    }

Timo Hartge's avatar
Timo Hartge committed
    protected function getType($id)
    {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $url = Config::get()->OWNCLOUD_ENDPOINT ?: UserConfig::get($GLOBALS['user']->id)->OWNCLOUD_ENDPOINT_USER;
Timo Hartge's avatar
Timo Hartge committed
        if ($url[strlen($url) - 1] !== "/") {
            $url .= "/";
        }
        $webdav = $url . "remote.php/webdav/";
        $header = array();
        $header[] = OwnCloudFolder::getAuthHeader();
Timo Hartge's avatar
Timo Hartge committed
        $r = curl_init();
        curl_setopt($r, CURLOPT_CUSTOMREQUEST, "PROPFIND");
        curl_setopt($r, CURLOPT_URL, $webdav."/".$id);
        curl_setopt($r, CURLOPT_HTTPHEADER, ($header));
        curl_setopt($r, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($r, CURLOPT_SSL_VERIFYPEER, (bool) Config::get()->OWNCLOUD_SSL_VERIFYPEER);
        curl_setopt($r, CURLOPT_SSL_VERIFYHOST, (bool) Config::get()->OWNCLOUD_SSL_VERIFYPEER);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if ($GLOBALS['OWNCLOUD_VERBOSE']) {
            curl_setopt($r, CURLOPT_VERBOSE, true);
        }
Timo Hartge's avatar
Timo Hartge committed
        $xml = curl_exec($r);
        curl_close($r);
        $doc = new DOMDocument();
        $doc->loadXML($xml);
Rasmus Fuhse's avatar
Rasmus Fuhse committed

Timo Hartge's avatar
Timo Hartge committed
        foreach ($doc->getElementsByTagNameNS("DAV:","response") as $file) {
            foreach ($file->childNodes as $node) {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                if (strtolower($node->tagName) === "d:propstat") {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
                    if ($node->childNodes) {
                        foreach ($node->childNodes as $prop) {
                            if ($prop->childNodes) {
                                foreach ($prop->childNodes as $attr) {
                                    if (strtolower($attr->tagName) === "d:resourcetype") {
                                        return $file_attributes['type'] = ($attr->childNodes[0] && strtolower($attr->childNodes[0]->tagName) === "d:collection")
                                            ? "folder"
                                            : "file";
                                    }
                                }
Timo Hartge's avatar
Timo Hartge committed
                            }
                        }
                    }
                }
            }
        }
        return $file_attributes['type'];
    }

Timo Hartge's avatar
Timo Hartge committed
    {
       return $this->getType($id) == 'folder';
    }

Timo Hartge's avatar
Timo Hartge committed
    {
        return $this->getType($id) == 'file';
    }