PluginProbe
Import WP – CSV & XML Import Export for WordPress / 2.7.9
Import WP – CSV & XML Import Export for WordPress v2.7.9
2.15.1 2.15.0 2.14.24 2.14.23 2.7.0 2.7.1 2.7.10 2.7.11 2.7.12 2.7.13 2.7.14 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 2.7.9 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 2.9.1 All 144 releases
jc-importer / class / Common / Filesystem / Filesystem.php

Filesystem.php in Import WP – CSV & XML Import Export for WordPress 2.7.9, at class/Common/Filesystem/Filesystem.php

299 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 namespace ImportWP\Common\Filesystem;
4
5 use ImportWP\Common\Http\Http;
6 use ImportWP\Common\Util\Logger;
7 use ImportWP\Common\Util\Singleton;
8 use ImportWP\Container;
9 use ImportWP\EventHandler;
10
11 class Filesystem
12 {
13 use Singleton;
14
15 /**
16 * @var ImportWP\Container\Container
17 */
18 private $container;
19
20 /**
21 * @var EventHandler $event_handler
22 */
23 private $event_handler;
24
25 public function __construct(EventHandler $event_handler)
26 {
27 $this->event_handler = $event_handler;
28 $this->container = Container::getInstance();
29 }
30
31 public function copy($source, $destination, $allowed_mimes = null)
32 {
33
34 if (!file_exists($source)) {
35 Logger::write('File doesn`t exist on local filesystem: ' . $source);
36 return new \WP_Error('IWP_FS_7', 'File doesn`t exist on local filesystem.');
37 }
38
39 $filetype = $this->get_filetype($source);
40
41 if (!is_null($allowed_mimes)) {
42
43 if (!$filetype) {
44 Logger::write('Unable to determine filetype: ' . $source);
45 return new \WP_Error('IWP_FS_6', 'Unable to determine filetype.');
46 }
47
48 if (!in_array($filetype, $allowed_mimes, true)) {
49 Logger::write('Invalid filetype: ' . $filetype . ', allowed(' . implode(', ', $allowed_mimes) . ')');
50 return new \WP_Error('IWP_FS_4', 'Invalid filetype.');
51 }
52 }
53
54 if (!copy($source, $destination)) {
55 return new \WP_Error('IWP_FS_4', 'Unable to copy file: ' . $source . '.');
56 }
57
58 $type = $this->get_file_mime($source);
59 Logger::write('Copied file: ' . $destination . ' -type=' . $filetype . ' -mime=' . $type);
60 return true;
61 }
62
63 public function upload_file($attachment, $allowed_mimes = null)
64 {
65 // use built in wordpress file upload
66 if (!function_exists('wp_handle_upload')) {
67 require_once ABSPATH . "wp-admin" . '/includes/file.php';
68 }
69
70 $uploaded_file = wp_handle_upload($attachment, ['test_form' => false, 'test_type' => false]);
71
72 if (isset($uploaded_file['error'])) {
73 Logger::write($uploaded_file['error']);
74 return new \WP_Error('IWP_FS_UF', $uploaded_file['error']);
75 }
76
77 $file = $uploaded_file['file'];
78 $type = $uploaded_file['type'];
79
80 $filetype = $this->check_mime_header($uploaded_file['type']);
81
82 // if header doesnt match check for file extension.
83 if (!$filetype) {
84 $filetype = $this->get_filetype_from_ext($attachment['name']);
85 }
86
87 // determine file type from mimetype.
88 if (!is_null($allowed_mimes) && !in_array($filetype, $allowed_mimes, true)) {
89 Logger::write('Invalid filetype: ' . $filetype . ', allowed(' . implode(', ', $allowed_mimes) . ')');
90 return new \WP_Error('IWP_FS_4', 'Invalid filetype.');
91 }
92
93 Logger::write('Uploaded file: ' . $file . ' -type=' . $filetype . ' -mime=' . $type);
94
95 return array(
96 'dest' => $file,
97 'type' => $filetype,
98 'mime' => $type
99 );
100 }
101
102 public function download_file($remote_url, $filetype = null, $allowed_mimes = null, $override_filename = null, $prefix = '')
103 {
104 $remote_url_temp = strtok($remote_url, '?');
105
106 if (!is_null($allowed_mimes)) {
107 if (is_null($filetype)) {
108 $filetype = $this->get_filetype_from_ext($remote_url_temp);
109 }
110 if (!in_array($filetype, $allowed_mimes, true)) {
111 Logger::write('Invalid filetype: ' . $filetype . ', allowed(' . implode(', ', $allowed_mimes) . ')');
112 return new \WP_Error('IWP_FS_4', 'Invalid filetype.');
113 }
114 }
115
116 $wp_upload_dir = wp_upload_dir();
117 $filename = !empty($override_filename) ? $override_filename : $prefix . basename($remote_url_temp);
118
119 // force extension of file if it doesnt match
120 if ($filetype === 'xml') {
121 if (preg_match('/\.(xml|zip|gz)$/', $filename) === 0) {
122 $filename .= '.xml';
123 }
124 } elseif ($filetype === 'csv') {
125 if (preg_match('/\.(csv|zip|gz)$/', $filename) === 0) {
126 $filename .= '.csv';
127 }
128 }
129
130 $dest = wp_unique_filename($wp_upload_dir['path'], $filename);
131 $wp_dest = $wp_upload_dir['path'] . '/' . $dest;
132 touch($wp_dest);
133
134 /**
135 * @var Http $http
136 */
137 $http = Container::getInstance()->get('http');
138
139 $headers = [];
140 if ($filetype === 'xml') {
141 $headers['Content-Type'] = 'text/xml';
142 $headers['Accept'] = 'text/xml';
143 } elseif ($filetype === 'csv') {
144 $headers['Content-Type'] = 'text/csv';
145 $headers['Accept'] = 'text/csv';
146 }
147
148 $result = $http->download_file_stream($remote_url, $wp_dest, $headers);
149 if (is_wp_error($result)) {
150 @unlink($wp_dest);
151 Logger::write($result->get_error_message());
152 return $result;
153 }
154
155 if (is_string($result)) {
156 $filename = !empty($override_filename) ? $override_filename : $prefix . basename($result);
157 $dest = wp_unique_filename($wp_upload_dir['path'], $filename);
158 $wp_tmp_dest = $wp_upload_dir['path'] . '/' . $dest;
159
160 if (copy($wp_dest, $wp_tmp_dest)) {
161 Logger::write('Rename file: ' . $wp_dest . ' -output=' . $wp_tmp_dest);
162 unlink($wp_dest);
163 $wp_dest = $wp_tmp_dest;
164 }
165 }
166
167 $exists = $this->file_exists($wp_dest);
168 if (is_wp_error($exists)) {
169 return $exists;
170 }
171
172 $type = $this->get_file_mime($wp_dest);
173 Logger::write('Downloaded file: ' . $wp_dest . ' -type=' . $filetype . ' -mime=' . $type);
174
175 return array(
176 'dest' => $wp_dest,
177 'type' => $filetype,
178 'mime' => $type
179 );
180 }
181
182 public function file_exists($src)
183 {
184 try {
185 if (!file_exists($src)) {
186 throw new \Exception("File not found: " . $src);
187 }
188
189 $size = filesize($src);
190 if ($size == 0) {
191 unlink($src);
192 throw new \Exception("File not found or empty: " . $src);
193 }
194 } catch (\Exception $e) {
195 return new \WP_Error('IWP_FS_8', $e->getMessage());
196 }
197
198 return true;
199 }
200
201 public function copy_file($remote_url, $allowed_mimes = null, $override_filename = null, $prefix = '')
202 {
203 $remote_url = strtok($remote_url, '?');
204
205 $wp_upload_dir = wp_upload_dir();
206
207 $filename = !empty($override_filename) ? $override_filename : $prefix . basename($remote_url);
208 $dest = wp_unique_filename($wp_upload_dir['path'], $filename);
209 $wp_dest = $wp_upload_dir['path'] . '/' . $dest;
210
211 $result = $this->copy($remote_url, $wp_dest, $allowed_mimes);
212 if (is_wp_error($result)) {
213 return $result;
214 }
215
216 return array(
217 'dest' => $wp_dest,
218 'type' => $this->get_filetype($wp_dest),
219 'mime' => $this->get_file_mime($wp_dest)
220 );
221 }
222
223
224
225 /**
226 * Get and/or create the plugins tmp directory
227 *
228 * @return string
229 */
230 public function get_temp_directory($url = false)
231 {
232 $base = $url ? WP_CONTENT_URL : WP_CONTENT_DIR;
233 $ds = $url ? '/' : DIRECTORY_SEPARATOR;
234 $path = $base . $ds . 'uploads';
235 if (!is_dir($path)) {
236 mkdir($path);
237 }
238
239 $path .= $ds . 'importwp';
240 if (!is_dir($path)) {
241 mkdir($path);
242 }
243
244 return $path;
245 }
246
247 public function check_mime_header($mime)
248 {
249 switch ($mime) {
250 case 'text/comma-separated-values':
251 case 'text/csv':
252 case 'application/csv':
253 case 'application/excel':
254 case 'application/vnd.ms-excel':
255 case 'application/vnd.msexcel':
256 case 'text/anytext':
257 case 'text/plain':
258 return 'csv';
259 case 'text/xml':
260 case 'application/xml':
261 case 'application/x-xml':
262 return 'xml';
263 }
264
265 return $this->event_handler->run('importer.allowed_mime_types', [false, $mime]);
266 }
267
268 public function get_filetype($file)
269 {
270 $mime_type = $this->get_file_mime($file);
271 if ($mime_type) {
272 return $this->check_mime_header($mime_type);
273 }
274
275 return $this->get_filetype_from_ext($file);
276 }
277
278 public function get_file_mime($file)
279 {
280 $check = wp_check_filetype_and_ext($file, basename($file));
281 return $check['type'];
282 }
283
284 public function get_filetype_from_ext($file)
285 {
286
287 $filetype = null;
288 if (stripos($file, '.csv')) {
289 $filetype = 'csv';
290 } elseif (stripos($file, '.xml')) {
291 $filetype = 'xml';
292 }
293
294 $filetype = apply_filters('iwp/get_filetype_from_ext', $filetype, $file);
295
296 return $filetype;
297 }
298 }
299