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     // http://xx.moodle.com/repository/ws.php?action=callback&repo_id=1&sid=xxx
110     // sid is the attached auth token from external source
111     $js  =<<<EOD
112 <html><head><script type="text/javascript">
113 window.opener.repository_callback($repo_id);
114 </script><body></body></html>
115 EOD;
116     break;
117 case 'list':
118 case 'search':
119     try {
120         if(!empty($p)) {
121             echo json_encode($repo->get_listing($p));
122         } else if(!empty($search)) {
123             echo json_encode($repo->get_listing('', $search));
124         } else {
125             echo json_encode($repo->get_listing());
126         }
127     } catch (repository_exception $e) {
128         $err = new stdclass;
129         $err->e = $e->getMessage();
130         die(json_encode($err));
131     }
132     break;
133 case 'download':
134     $path = $repo->get_file($file, $title);
135     $itemid = (int)substr(hexdec(uniqid()), 0, 9)+rand(1,100);
136     try {
137         $info = repository_move_to_filepool($path, $title, $itemid);
138         if($env == 'form'){
139             echo json_encode($info);
140         } elseif($env == 'editor') {
141             echo json_encode($info);
142         } else {
143         }
144     } catch (repository_exception $e){
145         $err = new stdclass;
146         $err->e = $e->getMessage();
147         die(json_encode($err));
148     } catch (Exception $e) {
149         $err = new stdclass;
150         $err->e = $e->getMessage();
151         die(json_encode($err));
152     }
153     break;
154 case 'upload':
155     try {
156         echo json_encode($repo->get_listing());
157     } catch (repository_exception $e){
158         $err = new stdclass;
159         $err->e = $e->getMessage();
160         die(json_encode($err));
161     }
162     break;