Automatically generated installer lang files
[moodle.git] / portfolio / boxnet / lib.php
1 <?php
2 require_once($CFG->libdir.'/portfolio/plugin.php');
3 require_once($CFG->libdir.'/filelib.php');
4 require_once($CFG->libdir.'/boxlib.php');
6 class portfolio_plugin_boxnet extends portfolio_plugin_push_base {
8     public $boxclient;
9     private $ticket;
10     private $authtoken;
11     private $folders;
12     private $accounttree;
14     public static function get_name() {
15         return get_string('pluginname', 'portfolio_boxnet');
16     }
18     public function prepare_package() {
19         // don't do anything for this plugin, we want to send all files as they are.
20     }
22     public function send_package() {
23         // if we need to create the folder, do it now
24         if ($newfolder = $this->get_export_config('newfolder')) {
25             if (!$created = $this->boxclient->createFolder($newfolder, array('share' => (int)$this->get_export_config('sharefolder')))) {
26                 throw new portfolio_plugin_exception('foldercreatefailed', 'portfolio_boxnet');
27             }
28             $this->folders[$created['folder_id']] = $created['folder_name'];
29             $this->set_export_config(array('folder' => $created['folder_id']));
30         }
31         foreach ($this->exporter->get_tempfiles() as $file) {
32             $return = $this->boxclient->uploadFile(
33                 array(
34                     'file'      => $file,
35                     'folder_id' => $this->get_export_config('folder'),
36                     'share'     => $this->get_export_config('sharefile'),
37                 )
38             );
39             if (array_key_exists('status', $return) && $return['status'] == 'upload_ok'
40                     && array_key_exists('id', $return) && count($return['id']) == 1) {
41                 $returnid = array_keys($return['id']);
42                 $this->rename_file($return['id'][array_pop($returnid)], $file->get_filename());
43                 // if this fails, the file was sent but not renamed - this triggers a warning but is not fatal.
44             }
45         }
46         if ($this->boxclient->isError()) {
47             throw new portfolio_plugin_exception('sendfailed', 'portfolio_boxnet', $this->boxclient->getErrorMsg());
48         }
49     }
51     public function get_export_summary() {
52         $allfolders = $this->get_folder_list();
53         if ($newfolder = $this->get_export_config('newfolder')) {
54             $foldername = $newfolder . ' (' . get_string('tobecreated', 'portfolio_boxnet') . ')';
55         } elseif ($this->get_export_config('folder')) {
56             $foldername = $allfolders[$this->get_export_config('folder')];
57         } else {
58             $foldername = '';
59         }
60         return array(
61             get_string('targetfolder', 'portfolio_boxnet') => $foldername
62         );
63     }
65     public function get_interactive_continue_url() {
66         return 'http://box.net/files#0:f:' . $this->get_export_config('folder');
67     }
69     public function expected_time($callertime) {
70         return $callertime;
71     }
73     public static function has_admin_config() {
74         return true;
75     }
77     public static function get_allowed_config() {
78         return array('apikey');
79     }
81     public function has_export_config() {
82         return true;
83     }
85     public function get_allowed_user_config() {
86         return array('authtoken', 'authtokenctime');
87     }
89     public function get_allowed_export_config() {
90         return array('folder', 'newfolder', 'sharefile', 'sharefolder');
91     }
93     public function export_config_form(&$mform) {
94         $folders = $this->get_folder_list();
95         $mform->addElement('checkbox', 'plugin_sharefile', get_string('sharefile', 'portfolio_boxnet'));
96         $mform->addElement('text', 'plugin_newfolder', get_string('newfolder', 'portfolio_boxnet'));
97         $mform->addElement('checkbox', 'plugin_sharefolder', get_string('sharefolder', 'portfolio_boxnet'));
98         $folders[0] = '----';
99         ksort($folders);
100         $mform->addElement('select', 'plugin_folder', get_string('existingfolder', 'portfolio_boxnet'), $folders);
101     }
103     public function export_config_validation(array $data) {
104         $allfolders = $this->get_folder_list();
105         if (in_array($data['plugin_newfolder'], $allfolders)) {
106             return array('plugin_newfolder' => get_string('folderclash', 'portfolio_boxnet'));
107         }
108     }
110     public static function admin_config_form(&$mform) {
111         global $CFG;
113         $mform->addElement('text', 'apikey', get_string('apikey', 'portfolio_boxnet'));
114         $mform->addRule('apikey', get_string('required'), 'required', null, 'client');
115         $a = new stdClass();
116         $a->servicesurl = 'http://www.box.net/developers/services';
117         $a->callbackurl = $CFG->wwwroot . '/portfolio/add.php?postcontrol=1&type=boxnet';
118         $mform->addElement('static', 'setupinfo', get_string('setupinfo', 'portfolio_boxnet'),
119             get_string('setupinfodetails', 'portfolio_boxnet', $a));
120     }
122     public function steal_control($stage) {
123         if ($stage != PORTFOLIO_STAGE_CONFIG) {
124             return false;
125         }
126         if ($this->authtoken) {
127             return false;
128         }
129         if (!$this->ensure_ticket()) {
130             throw new portfolio_plugin_exception('noticket', 'portfolio_boxnet');
131         }
132         $token = $this->get_user_config('authtoken', $this->get('user')->id);
133         $ctime= $this->get_user_config('authtokenctime', $this->get('user')->id);
134         if (!empty($token) && (($ctime + 60*60*20) > time())) {
135             $this->authtoken = $token;
136             $this->boxclient->auth_token = $token;
137             return false;
138         }
139         return 'http://www.box.net/api/1.0/auth/'.$this->ticket;
140     }
142     public function post_control($stage, $params) {
143         if ($stage != PORTFOLIO_STAGE_CONFIG) {
144             return;
145         }
146         if (!array_key_exists('auth_token', $params) || empty($params['auth_token'])) {
147             throw new portfolio_plugin_exception('noauthtoken', 'portfolio_boxnet');
148         }
149         $this->authtoken = $params['auth_token'];
150         $this->boxclient->auth_token = $this->authtoken;
151         $this->set_user_config(array('authtoken' => $this->authtoken, 'authtokenctime' => time()), $this->get('user')->id);
152     }
154     private function ensure_ticket() {
155         if (!empty($this->boxclient)) {
156             return true;
157         }
158         $this->boxclient = new boxclient($this->get_config('apikey'), '');
159         $ticket_return = $this->boxclient->getTicket();
160         if ($this->boxclient->isError() || empty($ticket_return)) {
161             throw new portfolio_plugin_exception('noticket', 'portfolio_boxnet');
162         }
163         $this->ticket = $ticket_return['ticket'];
164         return $this->ticket;
165     }
167     private function ensure_account_tree() {
168         if (!empty($this->accounttree)) {
169             return;
170         }
171         if (empty($this->ticket)
172             || empty($this->authtoken)
173             || empty($this->boxclient)) {
174             // if we don't have these we're pretty much screwed
175             throw new portfolio_plugin_exception('folderlistfailed', 'portfolio_boxnet');
176             return false;
177         }
178         $this->accounttree = $this->boxclient->getAccountTree();
179         if ($this->boxclient->isError()) {
180             throw new portfolio_plugin_exception('folderlistfailed', 'portfolio_boxnet');
181         }
182         if (!is_array($this->accounttree)) {
183             return false;
184         }
185     }
187     private function get_folder_list() {
188         if (!empty($this->folders)) {
189             return $this->folders;
190         }
191         $this->ensure_account_tree();
192         $folders = array();
193         foreach ($this->accounttree['folder_id'] as $key => $id) {
194             if (empty($id)) {
195                 continue;
196             }
197             $name = $this->accounttree['folder_name'][$key];
198             if (!empty($this->accounttree['shared'][$key])) {
199                 $name .= ' (' . get_string('sharedfolder', 'portfolio_boxnet') . ')';
200             }
201             $folders[$id] = $name;
202         }
203         $this->folders = $folders;
204         return $folders;
205     }
207     private function rename_file($fileid, $newname) {
208         // look at moving this to the boxnet client class
209         $this->ensure_account_tree();
210         $count = 1;
211         $bits = explode('.', $newname);
212         $suffix = '';
213         if (count($bits) == 1) {
214             $prefix = $newname;
215         } else {
216             $suffix = '.' . array_pop($bits);
217             $prefix = implode('.', $bits);
218         }
219         while (true) {
220             if (!array_key_exists('file_name', $this->accounttree) || !in_array($newname, $this->accounttree['file_name'])) {
221                 for ($i = 0; $i < 2; $i++) {
222                     if ($this->boxclient->renameFile($fileid, $newname)) {
223                         return true;
224                     }
225                 }
226                 debugging("tried three times to rename file and failed");
227                 return false;
228             }
229             $newname = $prefix . '(' . $count . ')' . $suffix;
230             $count++;
231         }
232         return false;
233     }
235     public function instance_sanity_check() {
236         if (!$this->get_config('apikey')) {
237             return 'err_noapikey';
238         }
239     //@TODO see if we can verify the api key without actually getting an authentication token
240     }
242     public static function allows_multiple_instances() {
243         return false;
244     }
246     public function supported_formats() {
247         return array(PORTFOLIO_FORMAT_FILE, PORTFOLIO_FORMAT_RICHHTML);
248     }
250     /*
251      * for now , boxnet doesn't support this,
252      * because we can't dynamically construct return urls.
253      */
254     public static function allows_multiple_exports() {
255         return false;
256     }