MDL-13766
[moodle.git] / repository / ws.php
1 <?php
2 set_time_limit(0);
3 header("Cache-Control: no-cache, must-revalidate");
4 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
5 require_once('../config.php');
6 require_once('../lib/filelib.php');
7 require_once('lib.php');
8 // page or path
9 $p     = optional_param('p', '', PARAM_INT);
10 // opened in editor or moodleform
11 $env   = optional_param('env', 'form', PARAM_ALPHA);
12 // file to download
13 $file  = optional_param('file', '', PARAM_RAW);
14 // rename the file name
15 $title = optional_param('title', '', PARAM_FILE);
16 $action = optional_param('action', '', PARAM_ALPHA);
17 $search = optional_param('s', '', PARAM_CLEANHTML);
18 // repository ID
19 $repo_id = optional_param('repo_id', 1, PARAM_INT);
20 $ctx_id  = optional_param('ctx_id', SITEID, PARAM_INT);
21 $userid  = $USER->id;
23 // check context id
24 if (!repository_check_context($ctx_id)) {
25     $err = new stdclass;
26     $err->e = get_string('nopermissiontoaccess', 'repository');
27     die(json_encode($err));
28 }
30 /**
31  * walk an array to attach repository ID
32  */
33 function attach_repository_id(&$value, $key, $id){
34     $value['repo_id'] = $id;
35 }
37 /**
38  * these actions are requested without repository ID
39  */
40 switch ($action) {
41 case 'gsearch':
42     // global search
43     $repos = repository_get_instances(array(get_context_instance_by_id($ctx_id), get_system_context()));
44     $list = array();
45     foreach($repos as $repo){
46         if ($repo->global_search()) {
47             try {
48                 $ret = $repo->get_listing(null, $search);
49                 array_walk($ret['list'], 'attach_repository_id', $repo->id);
50                 $tmp = array_merge($list, $ret['list']);
51                 $list = $tmp;
52             } catch (repository_exception $e) {
53                 $err = new stdclass;
54                 $err->e = $e->getMessage();
55                 die(json_encode($err));
56             }
57         }
58     }
59     die(json_encode(array('list'=>$list)));
60     break;
61 case 'ccache':
62     //clean cache
63     $cache = new curl_cache;
64     $cache->refresh();
65     $action = 'list';
66     break;
67 }
69 // Get repository instance information
70 $sql = 'SELECT i.name, i.typeid, r.type FROM {repository} r, {repository_instances} i WHERE i.id='.$repo_id.' AND i.typeid=r.id';
71 if(!$repository = $DB->get_record_sql($sql)) {
72     $err = new stdclass;
73     $err->e = get_string('invalidrepositoryid', 'repository');
74     die(json_encode($err));
75 } else {
76     $type = $repository->type;
77 }
79 if(file_exists($CFG->dirroot.'/repository/'.
80     $type.'/repository.class.php'))
81 {
82     require_once($CFG->dirroot.'/repository/'.
83         $type.'/repository.class.php');
84     $classname = 'repository_' . $type;
85     try{
86         $repo = new $classname($repo_id, $ctx_id, array('ajax'=>true, 'name'=>$repository->name));
87     } catch (repository_exception $e){
88         $err = new stdclass;
89         $err->e = $e->getMessage();
90         die(json_encode($err));
91     }
92 } else {
93     $err = new stdclass;
94     $err->e = get_string('invalidplugin', 'repository');
95     die(json_encode($err));
96 }
98 switch ($action) {
99 case 'login':
100     try {
101         echo json_encode($repo->print_login());
102     } catch (repository_exception $e){
103         $err = new stdclass;
104         $err->e = $e->getMessage();
105         die(json_encode($err));
106     }
107     break;
108 case 'callback':
109     // call opener window to refresh repository
110     // the callback url should be something like this:
111     // http://xx.moodle.com/repository/ws.php?action=callback&repo_id=1&sid=xxx
112     // sid is the attached auth token from external source
113     $js  =<<<EOD
114 <html><head><script type="text/javascript">
115 window.opener.repository_callback($repo_id);
116 </script><body></body></html>
117 EOD;
118     break;
119 case 'list':
120 case 'search':
121     try {
122         if(!empty($p)) {
123             echo json_encode($repo->get_listing($p));
124         } else if(!empty($search)) {
125             echo json_encode($repo->get_listing('', $search));
126         } else {
127             echo json_encode($repo->get_listing());
128         }
129     } catch (repository_exception $e) {
130         $err = new stdclass;
131         $err->e = $e->getMessage();
132         die(json_encode($err));
133     }
134     break;
135 case 'download':
136     $path = $repo->get_file($file, $title);
137     $itemid = (int)substr(hexdec(uniqid()), 0, 9)+rand(1,100);
138     try {
139         $info = repository_move_to_filepool($path, $title, $itemid);
140         if($env == 'form'){
141             echo json_encode($info);
142         } elseif($env == 'editor') {
143             echo json_encode($info);
144         } else {
145         }
146     } catch (repository_exception $e){
147         $err = new stdclass;
148         $err->e = $e->getMessage();
149         die(json_encode($err));
150     } catch (Exception $e) {
151         $err = new stdclass;
152         $err->e = $e->getMessage();
153         die(json_encode($err));
154     }
155     break;
156 case 'upload':
157     try {
158         echo json_encode($repo->get_listing());
159     } catch (repository_exception $e){
160         $err = new stdclass;
161         $err->e = $e->getMessage();
162         die(json_encode($err));
163     }
164     break;