9dda46296e7e7e2ff0fe3929612ad10557cef11e
[moodle.git] / repository / webdav / repository.class.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * repository_webdav class
20  *
21  * @since 2.0
22  * @package moodlecore
23  * @subpackage repository
24  * @copyright 2009 Dongsheng Cai
25  * @author Dongsheng Cai <dongsheng@moodle.com>
26  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27  */
29 require_once($CFG->libdir.'/webdavlib.php');
31 class repository_webdav extends repository {
32     public function __construct($repositoryid, $context = SITEID, $options = array()) {
33         parent::__construct($repositoryid, $context, $options);
34         // set up webdav client
35         $this->wd = new webdav_client();
36         if (empty($this->options['webdav_server'])) {
37             return;
38         }
39         if (empty($this->options['webdav_type'])) {
40             $this->options['webdav_type'] = '';
41         } else {
42             $this->options['webdav_type'] = 'ssl://';
43         }
44         $this->wd->set_server($this->options['webdav_server']);
45         if (empty($this->options['webdav_port'])) {
46             if (empty($this->options['webdav_type'])) {
47                 $this->wd->set_port(80);
48             } else {
49                 $this->wd->set_port(443);
50             }
51             $port = '';
52         } else {
53             $this->wd->set_port($this->options['webdav_port']);
54             $port = ':'.$this->options['webdav_port'];
55         }
56         $this->webdav_host = $this->options['webdav_type'].$this->options['webdav_server'].$port;
57         if(!empty($this->options['webdav_user'])){
58             $this->wd->set_user($this->options['webdav_user']);
59         }
60         if(!empty($this->options['webdav_password'])) {
61             $this->wd->set_pass($this->options['webdav_password']);
62         }
63         $this->wd->set_protocol(1);
64         $this->wd->set_debug(false);
65     }
66     public function check_login() {
67         return true;
68     }
69     public function get_file($url, $title) {
70         global $CFG;
71         $path = $this->prepare_file($title);
72         $buffer = '';
73         if (!$this->wd->open()) {
74             return false;
75         }
76         $this->wd->get($url, $buffer);
77         $fp = fopen($path, 'wb');
78         fwrite($fp, $buffer);
79         return $path;
80     }
81     public function global_search() {
82         return false;
83     }
84     public function get_listing($path='', $page = '') {
85         global $CFG, $OUTPUT;
86         $list = array();
87         $ret  = array();
88         $ret['dynload'] = true;
89         $ret['nosearch'] = true;
90         $ret['nologin'] = true;
91         $ret['path'] = array(array('name'=>'Root', 'path'=>0));
92         $ret['list'] = array();
93         if (!$this->wd->open()) {
94             return $ret;
95         }
96         if (empty($path)) {
97             $path = '/';
98             $dir = $this->wd->ls($path);
99         } else {
100             if (empty($this->options['webdav_type'])) {
101                 $partern = '#http://'.$this->webdav_host.'/#';
102             } else {
103                 $partern = '#http://'.$this->webdav_type.$this->webdav_host.'/#';
104             }
105             $path = '/'.preg_replace($partern, '', $path);
106             $dir = $this->wd->ls($path);
107         }
108         if (!is_array($dir)) {
109             return $ret;
110         }
111         foreach ($dir as $v) {
112             if (!empty($v['creationdate'])) {
113                 $ts = $this->wd->iso8601totime($v['creationdate']);
114                 $filedate = userdate($ts);
115             } else {
116                 $filedate = '';
117             }
118             if (!empty($v['resourcetype']) && $v['resourcetype'] == 'collection') {
119                 // a folder
120                 if ($path != $v['href']) {
121                     $matches = array();
122                     preg_match('#(\w+)$#i', $v['href'], $matches);
123                     if (!empty($matches[1])) {
124                         $title = urldecode($matches[1]);
125                     } else {
126                         $title = urldecode($v['href']);
127                     }
128                     $ret['list'][] = array(
129                         'title'=>$title,
130                         'thumbnail'=>$OUTPUT->pix_url('f/folder-32'),
131                         'children'=>array(),
132                         'date'=>$filedate,
133                         'size'=>0,
134                         'path'=>$v['href']
135                     );
136                 }
137             }else{
138                 // a file
139                 $title = urldecode(substr($v['href'], strpos($v['href'], $path)+strlen($path)));
140                 $size = !empty($v['getcontentlength'])? $v['getcontentlength']:'';
141                 $ret['list'][] = array(
142                     'title'=>$title,
143                     'thumbnail' => $OUTPUT->pix_url(file_extension_icon($title, 32)),
144                     'size'=>$size,
145                     'date'=>$filedate,
146                     'source'=>$v['href']
147                 );
148             }
149         }
150         return $ret;
151     }
152     public static function get_instance_option_names() {
153         return array('webdav_type', 'webdav_server', 'webdav_port', 'webdav_user', 'webdav_password');
154     }
156     public function instance_config_form($mform) {
157         $choices = array(0 => get_string('http', 'repository_webdav'), 1 => get_string('https', 'repository_webdav'));
158         $mform->addElement('select', 'webdav_type', get_string('webdav_type', 'repository_webdav'), $choices);
159         $mform->addRule('webdav_type', get_string('required'), 'required', null, 'client');
161         $mform->addElement('text', 'webdav_server', get_string('webdav_server', 'repository_webdav'), array('size' => '40'));
162         $mform->addRule('webdav_server', get_string('required'), 'required', null, 'client');
163         $mform->addElement('text', 'webdav_port', get_string('webdav_port', 'repository_webdav'), array('size' => '40'));
164         $mform->addElement('text', 'webdav_user', get_string('webdav_user', 'repository_webdav'), array('size' => '40'));
165         $mform->addElement('text', 'webdav_password', get_string('webdav_password', 'repository_webdav'), array('size' => '40'));
166     }
167     public function supported_returntypes() {
168         return (FILE_INTERNAL | FILE_EXTERNAL);
169     }