Skip to content
Snippets Groups Projects
OwnCloudPlugin.class.php 6.78 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)
    {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        if (Navigation::hasItem('/files/my_files')) {
            Navigation::activateItem('/files/my_files');
        } elseif (Navigation::hasItem('/contents/files/my_files')) {
            Navigation::activateItem('/contents/files/my_files');
        }
        if ($folder_id && $folder_id[0] === "/") {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            $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 blob 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);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $folder_path = array_map("rawurldecode", $folder_path);
        $filename = array_pop($folder_path);
        $folder_id = implode("/", array_map("rawurlencode", $folder_path));
        $name = array_pop($folder_path);
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $parent_folder_id = implode("/", array_map("rawurlencode", $folder_path));
Rasmus Fuhse's avatar
Rasmus Fuhse committed

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $data = [
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
        ];
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        $folder = new OwncloudFolder(
            $data,
            $this->getPluginId()
        );
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        foreach ($folder->getFiles() as $file) {
            if ($file->getFilename() === $filename) {
                return $file;
Rasmus Fuhse's avatar
Rasmus Fuhse committed
        }
Rasmus Fuhse's avatar
Rasmus Fuhse committed

Rasmus Fuhse's avatar
Rasmus Fuhse committed
        return null;
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);
Timo Hartge's avatar
Timo Hartge 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);
        if (!empty($GLOBALS['OWNCLOUD_VERBOSE'])) {
Rasmus Fuhse's avatar
Rasmus Fuhse committed
            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';
    }