PluginProbe
The WP Remote WordPress Plugin / 5.38
The WP Remote WordPress Plugin v5.38
6.72 6.69 6.65 6.62 6.48 6.47 4.87 4.97 5.05 5.09 5.16 5.22 5.24 5.25 5.38 5.41 5.42 5.45 5.47 5.53 5.56 5.65 5.68 5.72 5.73 All 53 releases
wpremote / callback / wings / fs_write.php

fs_write.php in The WP Remote WordPress Plugin 5.38, at callback/wings/fs_write.php

438 lines 9.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if (!defined('ABSPATH')) exit;
4 if (!class_exists('BVFSWriteCallback')) :
5
6 class BVFSWriteCallback extends BVCallbackBase {
7
8 const MEGABYTE = 1048576;
9 const FS_WRITE_WING_VERSION = 1.0;
10
11 public function __construct() {
12 }
13
14 public function removeFiles($files) {
15 $result = array();
16
17 foreach($files as $file) {
18 $file_result = array();
19
20 if (file_exists($file)) {
21
22 $file_result['status'] = unlink($file);
23 if ($file_result['status'] === false) {
24 $file_result['error'] = "UNLINK_FAILED";
25 }
26
27 } else {
28 $file_result['status'] = true;
29 $file_result['error'] = "NOT_PRESENT";
30 }
31
32 $result[$file] = $file_result;
33 }
34
35 $result['status'] = true;
36 return $result;
37 }
38
39 public function makeDirs($dirs, $permissions = 0777, $recursive = true) {
40 $result = array();
41
42 foreach($dirs as $dir) {
43 $dir_result = array();
44
45 if (file_exists($dir)) {
46
47 if (is_dir($dir)) {
48 $dir_result['status'] = true;
49 $dir_result['message'] = "DIR_ALREADY_PRESENT";
50 } else {
51 $dir_result['status'] = false;
52 $dir_result['error'] = "FILE_PRESENT_IN_PLACE_OF_DIR";
53 }
54
55 } else {
56
57 $dir_result['status'] = mkdir($dir, $permissions, $recursive);
58 if ($dir_result['status'] === false) {
59 $dir_result['error'] = "MKDIR_FAILED";
60 }
61
62 }
63
64 $result[$dir] = $dir_result;
65 }
66
67 $result['status'] = true;
68 return $result;
69 }
70
71 public function removeDirs($dirs) {
72 $result = array();
73
74 foreach($dirs as $dir) {
75 $dir_result = array();
76
77 if (is_dir($dir) && !is_link($dir)) {
78
79 if ($this->isEmptyDir($dir)) {
80
81 $dir_result['status'] = rmdir($dir);
82 if ($dir_result['status'] === false) {
83 $dir_result['error'] = "RMDIR_FAILED";
84 }
85
86 } else {
87 $dir_result['status'] = false;
88 $dir_result['error'] = "NOT_EMPTY";
89 }
90
91 } else {
92 $dir_result['status'] = false;
93 $dir_result['error'] = "NOT_DIR";
94 }
95
96 $result[$dir] = $dir_result;
97 }
98
99 $result['status'] = true;
100 return $result;
101 }
102
103 public function isEmptyDir($dir) {
104 $handle = opendir($dir);
105
106 while (false !== ($entry = readdir($handle))) {
107 if ($entry != "." && $entry != "..") {
108 closedir($handle);
109 return false;
110 }
111 }
112 closedir($handle);
113
114 return true;
115 }
116
117 public function doChmod($path_infos) {
118 $result = array();
119
120 foreach($path_infos as $path => $mode) {
121 $path_result = array();
122
123 if (file_exists($path)) {
124
125 $path_result['status'] = chmod($path, $mode);
126 if ($path_result['status'] === false) {
127 $path_result['error'] = "CHMOD_FAILED";
128 }
129
130 } else {
131 $path_result['status'] = false;
132 $path_result['error'] = "NOT_FOUND";
133 }
134
135 $result[$path] = $path_result;
136 }
137
138 $result['status'] = true;
139 return $result;
140 }
141
142 public function concatFiles($ifiles, $ofile, $bsize, $offset) {
143 if (($offset !== 0) && (!file_exists($ofile))) {
144 return array(
145 'status' => false,
146 'error' => 'OFILE_NOT_FOUND_BEFORE_CONCAT'
147 );
148 }
149
150 if (file_exists($ofile) && ($offset !== 0)) {
151 $handle = fopen($ofile, 'rb+');
152 } else {
153 $handle = fopen($ofile, 'wb+');
154 }
155
156 if ($handle === false) {
157 return array(
158 'status' => false,
159 'error' => 'FOPEN_FAILED'
160 );
161 }
162
163 if ($offset !== 0) {
164 if (fseek($handle, $offset, SEEK_SET) === -1) {
165 return array(
166 'status' => false,
167 'error' => 'FSEEK_FAILED'
168 );
169 }
170 }
171
172 $total_written = 0;
173 foreach($ifiles as $file) {
174 $fp = fopen($file, 'rb');
175 if ($fp === false) {
176 return array(
177 'status' => false,
178 'error' => "UNABLE_TO_OPEN_TMP_OFILE_FOR_READING"
179 );
180 }
181
182 while (!feof($fp)) {
183 $content = fread($fp, $bsize);
184 if ($content === false) {
185 return array(
186 'status' => false,
187 'error' => "UNABLE_TO_READ_INFILE",
188 'filename' => $file
189 );
190 }
191
192 $written = fwrite($handle, $content);
193 if ($written === false) {
194 return array(
195 'status' => false,
196 'error' => "UNABLE_TO_WRITE_TO_OFILE",
197 'filename' => $file
198 );
199 }
200 $total_written += $written;
201 }
202
203 fclose($fp);
204 }
205
206 $result = array();
207 $result['fclose'] = fclose($handle);
208
209 if (file_exists($ofile) && ($total_written != 0)) {
210 $result['status'] = true;
211 $result['fsize'] = filesize($ofile);
212 $result['total_written'] = $total_written;
213 } else {
214 $result['status'] = false;
215 $result['error'] = 'CONCATINATED_FILE_FAILED';
216 }
217
218 return $result;
219 }
220
221 public function renameFiles($path_infos) {
222 $result = array();
223
224 foreach($path_infos as $oldpath => $newpath) {
225 $action_result = array();
226 $failed = array();
227
228 if (file_exists($oldpath)) {
229
230 $action_result['status'] = rename($oldpath, $newpath);
231 if ($action_result['status'] === false) {
232 $action_result['error'] = "RENAME_FAILED";
233 }
234
235 } else {
236 $action_result['status'] = false;
237 $action_result['error'] = "NOT_FOUND";
238 }
239
240 $result[$oldpath] = $action_result;
241 }
242
243 $result['status'] = true;
244 return $result;
245 }
246
247 public function curlFile($ifile_url, $ofile, $timeout) {
248 $fp = fopen($ofile, "wb+");
249 if ($fp === false) {
250 return array(
251 'error' => 'FOPEN_FAILED_FOR_TEMP_OFILE'
252 );
253 }
254
255 $result = array();
256 $ch = curl_init($ifile_url);
257 curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
258 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
259 curl_setopt($ch, CURLOPT_HEADER, 0);
260 curl_setopt($ch, CURLOPT_FILE, $fp);
261
262 if (!curl_exec($ch)) {
263 $result['error'] = curl_error($ch);
264 $result['errorno'] = curl_errno($ch);
265 }
266
267 curl_close($ch);
268 fclose($fp);
269
270 return $result;
271 }
272
273 public function streamCopyFile($ifile_url, $ofile) {
274 $result = array();
275 $handle = fopen($ifile_url, "rb");
276
277 if ($handle === false) {
278 return array(
279 'error' => "UNABLE_TO_OPEN_REMOTE_FILE_STREAM"
280 );
281 }
282
283 $fp = fopen($ofile, "wb+");
284 if ($fp === false) {
285 fclose($handle);
286
287 return array(
288 'error' => 'FOPEN_FAILED_FOR_OFILE'
289 );
290 }
291
292 if (stream_copy_to_stream($handle, $fp) === false) {
293 $result['error'] = "UNABLE_TO_WRITE_TO_TMP_OFILE";
294 }
295
296 fclose($handle);
297 fclose($fp);
298
299 return $result;
300 }
301
302 public function writeContentToFile($content, $ofile) {
303 $result = array();
304
305 $fp = fopen($ofile, "wb+");
306 if ($fp === false) {
307 return array(
308 'error' => 'FOPEN_FAILED_FOR_TEMP_OFILE'
309 );
310 }
311
312 if (fwrite($fp, $content) === false) {
313 $result['error'] = "UNABLE_TO_WRITE_TO_TMP_OFILE";
314 }
315 fclose($fp);
316
317 return $result;
318 }
319
320 public function moveUploadedFile($ofile) {
321 $result = array();
322
323 if (isset($_FILES['myfile'])) {
324 $myfile = $_FILES['myfile'];
325 $is_upload_ok = false;
326
327 switch ($myfile['error']) {
328 case UPLOAD_ERR_OK:
329 $is_upload_ok = true;
330 break;
331 case UPLOAD_ERR_NO_FILE:
332 $result['error'] = "UPLOADERR_NO_FILE";
333 break;
334 case UPLOAD_ERR_INI_SIZE:
335 case UPLOAD_ERR_FORM_SIZE:
336 $result['error'] = "UPLOADERR_FORM_SIZE";
337 break;
338 default:
339 $result['error'] = "UPLOAD_ERR_UNKNOWN";
340 }
341
342 if ($is_upload_ok && !isset($myfile['tmp_name'])) {
343 $result['error'] = "MYFILE_TMP_NAME_NOT_FOUND";
344 $is_upload_ok = false;
345 }
346
347 if ($is_upload_ok) {
348 if (move_uploaded_file($myfile['tmp_name'], $ofile) === false) {
349 $result['error'] = 'MOVE_UPLOAD_FILE_FAILED';
350 }
351 }
352
353 } else {
354 $result['error'] = "FILE_NOT_PRESENT_IN_FILES";
355 }
356
357 return $result;
358 }
359
360
361 public function uploadFile($params) {
362 $resp = array();
363 $ofile = $params['ofile'];
364
365 switch($params['protocol']) {
366 case "curl":
367 $timeout = isset($params['timeout']) ? $params['timeout'] : 60;
368 $ifile_url = isset($params['ifileurl']) ? $params['ifileurl'] : null;
369
370 $resp = $this->curlFile($ifile_url, $ofile, $timeout);
371 break;
372 case "streamcopy":
373 $ifile_url = isset($params['ifileurl']) ? $params['ifileurl'] : null;
374
375 $resp = $this->streamCopyFile($ifile_url, $ofile);
376 break;
377 case "httpcontenttransfer":
378 $resp = $this->writeContentToFile($params['content'], $ofile);
379 break;
380 case "httpfiletransfer":
381 $resp = $this->moveUploadedFile($ofile);
382 break;
383 default:
384 $resp['error'] = "INVALID_PROTOCOL";
385 }
386
387 if (isset($resp['error'])) {
388 $resp['status'] = false;
389 } else {
390
391 if (file_exists($ofile)) {
392 $resp['status'] = true;
393 $resp['fsize'] = filesize($ofile);
394 } else {
395 $resp['status'] = false;
396 $resp['error'] = "OFILE_NOT_FOUND";
397 }
398
399 }
400
401 return $resp;
402 }
403
404 public function process($request) {
405 $params = $request->params;
406
407 switch ($request->method) {
408 case "rmfle":
409 $resp = $this->removeFiles($params['files']);
410 break;
411 case "chmd":
412 $resp = $this->doChmod($params['pathinfos']);
413 break;
414 case "mkdr":
415 $resp = $this->makeDirs($params['dirs'], $params['permissions'], $params['recursive']);
416 break;
417 case "rmdr":
418 $resp = $this->removeDirs($params['dirs']);
419 break;
420 case "renmefle":
421 $resp = $this->renameFiles($params['pathinfos']);
422 break;
423 case "wrtfle":
424 $resp = $this->uploadFile($params);
425 break;
426 case "cncatfls":
427 $bsize = (isset($params['bsize'])) ? $params['bsize'] : (8 * BVFSWriteCallback::MEGABYTE);
428 $offset = (isset($params['offset'])) ? $params['offset'] : 0;
429 $resp = $this->concatFiles($params['infiles'], $params['ofile'], $bsize, $offset);
430 break;
431 default:
432 $resp = false;
433 }
434
435 return $resp;
436 }
437 }
438 endif;