PluginProbe
Fluent Support – Helpdesk & Customer Support Ticket System / 2.4.5
Fluent Support – Helpdesk & Customer Support Ticket System v2.4.5
2.4.5 2.4.0 2.3.2 2.3.1 2.3.0 2.2.1 2.2.0 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.10.5 1.4.0 1.4.1 1.4.2 1.4.5 1.4.6 1.4.7 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 All 69 releases
fluent-support / app / Services / Includes / FileSystem.php

FileSystem.php in Fluent Support – Helpdesk & Customer Support Ticket System 2.4.5, at app/Services/Includes/FileSystem.php

275 lines 7.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentSupport\App\Services\Includes;
4
5 use FluentSupport\Framework\Support\Arr;
6
7 class FileSystem
8 {
9
10 protected $subDir = '';
11
12
13 public function _setSubDir($subDir)
14 {
15 $this->subDir = $subDir;
16 return $this;
17 }
18
19 /**
20 * Read a file from the plugin's upload dir. Only the basename of $file is used.
21 *
22 * @param string $file
23 * @return string|false
24 */
25 public function _get($file)
26 {
27 $arr = explode('/', $file);
28 $fileName = end($arr);
29 return file_get_contents(
30 $this->getDir() . '/' . $fileName
31 );
32 }
33
34 /**
35 * @return string Absolute path of the plugin's upload dir.
36 */
37 public function _getDir()
38 {
39 $uploadDir = wp_upload_dir();
40
41 return $uploadDir['basedir'] . DIRECTORY_SEPARATOR . FLUENT_SUPPORT_UPLOAD_DIR;
42 }
43
44 /**
45 * @param string $file
46 * @return string
47 */
48 public function _getAbsolutePathOfFile($file)
49 {
50 return $this->_getDir() . '/' . $file;
51 }
52
53 /**
54 * @return array
55 */
56 public function _uploadFromRequest()
57 {
58 return $this->_put(\FluentSupport\App\Services\Helper::FluentSupport('request')->files());
59 }
60
61 /**
62 * @param array $files
63 * @return array
64 */
65 public function _put($files)
66 {
67 if (!function_exists('wp_handle_upload')) {
68 require_once(ABSPATH . 'wp-admin/includes/file.php');
69 }
70
71 $this->overrideUploadDir();
72
73 $uploadOverrides = ['test_form' => false];
74 $uploadedFiles = [];
75
76 $truncate_files = apply_filters('fluent_support/truncate_uploaded_file_names', false);
77
78 foreach ((array)$files as $file) {
79 $filesArray = $file->toArray();
80
81 if ($truncate_files) {
82 $filesArray['name'] = $this->truncateFileName($filesArray['name']);
83 }
84
85 $extraData = Arr::only($filesArray, ['name', 'size']);
86 $uploadsData = \wp_handle_upload($filesArray, $uploadOverrides);
87 $uploadedFiles[] = array_merge($extraData, $uploadsData);
88 }
89
90 return $uploadedFiles;
91 }
92
93 private function truncateFileName($fileName)
94 {
95 $file_extension = pathinfo($fileName, PATHINFO_EXTENSION);
96 $file_base_name = pathinfo($fileName, PATHINFO_FILENAME);
97
98 $max_base_length = 50 - strlen($file_extension) - 1;
99 if (strlen($file_base_name) > $max_base_length) {
100 $file_base_name = substr($file_base_name, 0, $max_base_length);
101 }
102
103 return $file_base_name . '.' . $file_extension;
104 }
105
106 public function _putAsContent($fileName, $fileContent)
107 {
108 add_filter('upload_dir', [$this, '_setCustomUploadDir']);
109 $item = wp_upload_bits($fileName, null, $fileContent);
110 remove_filter('upload_dir', [$this, '_setCustomUploadDir']);
111 return $item;
112 }
113
114 /**
115 * Copy a file into the current sub dir of the plugin's upload dir.
116 *
117 * @param string $source Absolute file path
118 * @return array|false
119 */
120 public function _copy($source)
121 {
122 if (!file_exists($source)) {
123 return false;
124 }
125
126 [$destDir, $folderName] = $this->_getCustomDir();
127 $fileName = basename($source);
128 $destFile = $destDir . DIRECTORY_SEPARATOR . $fileName;
129
130 $indexFile = $destDir.DIRECTORY_SEPARATOR.'index.html';
131 if(!is_file($indexFile)) {
132 @file_put_contents($indexFile, '');
133 }
134
135 if (@copy($source, $destFile)) {
136 return $this->_updateUploadDirForCopy($fileName, $folderName);
137 }
138
139 return false;
140 }
141
142 private function _getCustomDir()
143 {
144 $folderName = '';
145 $directory = $this->_getDir();
146
147 if ($this->subDir) {
148 $folderName .= DIRECTORY_SEPARATOR . $this->subDir;
149 $directory .= $folderName;
150 if (!is_dir($directory)) {
151 @mkdir($directory, 0755);
152 // Blank index.html prevents directory listing.
153 @file_put_contents($directory . DIRECTORY_SEPARATOR . 'index.html', '');
154 }
155 }
156
157 return [$directory, $folderName];
158 }
159
160 private function _updateUploadDirForCopy($fileName, $folderName)
161 {
162 $uploadDir = wp_upload_dir();
163 $destDir = $this->_getDir() . $folderName;
164 $uploadDir['file_path'] = $destDir . DIRECTORY_SEPARATOR . $fileName;
165 $uploadDir['basedir'] = $destDir;
166 $uploadDir['subdir'] = $folderName;
167 $uploadDir['url'] = $uploadDir['baseurl'] . DIRECTORY_SEPARATOR . FLUENT_SUPPORT_UPLOAD_DIR . $folderName . DIRECTORY_SEPARATOR . $fileName;
168 $uploadDir['baseurl'] = $uploadDir['baseurl'] . DIRECTORY_SEPARATOR . FLUENT_SUPPORT_UPLOAD_DIR . $folderName;
169
170
171
172 return $uploadDir;
173 }
174
175 /**
176 * Only each file's basename is used.
177 *
178 * @param array $files
179 * @return void
180 */
181 public function _delete($files)
182 {
183 $files = (array)$files;
184
185 foreach ($files as $file) {
186 $arr = explode('/', $file);
187 $fileName = end($arr);
188 @unlink($this->getDir() . '/' . $fileName);
189 }
190 }
191
192 /**
193 * Route the next wp_handle_upload() into the plugin's upload dir.
194 */
195 public function _overrideUploadDir()
196 {
197 add_filter('wp_handle_upload_prefilter', function ($file) {
198 add_filter('upload_dir', [$this, '_setCustomUploadDir']);
199
200 add_filter('wp_handle_upload', function ($fileinfo) {
201 remove_filter('upload_dir', [$this, '_setCustomUploadDir']);
202 $filePath = $fileinfo['file'];
203 $fileinfo['file'] = basename($filePath);
204 $fileinfo['file_path'] = $filePath;
205 return $fileinfo;
206 });
207
208 return $this->_renameFileName($file);
209 });
210 }
211
212 /**
213 * upload_dir filter callback.
214 *
215 * @param array $param
216 * @return array $param
217 */
218 public function _setCustomUploadDir($param)
219 {
220 $folderName = '/' . FLUENT_SUPPORT_UPLOAD_DIR;
221
222 if ($this->subDir) {
223 $folderName .= '/' . $this->subDir;
224 $temFile = $param['basedir'] . $folderName . '/index.html';
225 if(!is_file($temFile)) {
226 if (!is_dir($param['basedir'] . $folderName)) {
227 @mkdir($param['basedir'] . $folderName, 0755);
228 }
229 @file_put_contents($temFile, '');
230 }
231 }
232
233 $param['url'] = $param['baseurl'] . $folderName;
234
235 $param['path'] = $param['basedir'] . $folderName;
236
237 if (!is_dir($param['path'])) {
238 @mkdir($param['path'], 0755);
239 @file_put_contents($param['basedir'] . $folderName . '/index.html', '');
240 }
241
242 return $param;
243 }
244
245 /**
246 * Prefix uploaded file names with a random token.
247 *
248 * @param array $file
249 * @return array $file
250 */
251 public function _renameFileName($file)
252 {
253 $prefix = 'fluent_support-' . md5(uniqid(wp_rand())) . '___';
254 $prefix = apply_filters('fluent_support/uploaded_file_name_prefix', $prefix);
255 $file['name'] = $prefix . $file['name'];
256 return $file;
257 }
258
259 public static function __callStatic($method, $params)
260 {
261 $instance = new static;
262
263 return call_user_func_array([$instance, $method], $params);
264 }
265
266 public function __call($method, $params)
267 {
268 $hiddenMethod = "_" . $method;
269
270 $method = method_exists($this, $hiddenMethod) ? $hiddenMethod : $method;
271
272 return call_user_func_array([$this, $method], $params);
273 }
274 }
275