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
← All changes | app/Services/Includes/FileSystem.php +117 -21 1.4.6 → 2.4.5 View file →
@@ -16,10 +16,12 @@
16 16 return $this;
17 17 }
18 18
19 19 /**
20 - * Read file content from custom upload dir of this application
21 - * @return string [path]
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
22 24 */
23 25 public function _get($file)
24 26 {
25 27 $arr = explode('/', $file);
@@ -29,21 +31,20 @@
29 31 );
30 32 }
31 33
32 34 /**
33 - * Get custom upload dir name of this application
34 - * @return string [directory path]
35 + * @return string Absolute path of the plugin's upload dir.
35 36 */
36 37 public function _getDir()
37 38 {
38 39 $uploadDir = wp_upload_dir();
39 40
40 - return $uploadDir['basedir'] . FLUENT_SUPPORT_UPLOAD_DIR;
41 + return $uploadDir['basedir'] . DIRECTORY_SEPARATOR . FLUENT_SUPPORT_UPLOAD_DIR;
41 42 }
42 43
43 44 /**
44 - * Get absolute path of file using custom upload dir name of this application
45 - * @return string [file path]
45 + * @param string $file
46 + * @return string
46 47 */
47 48 public function _getAbsolutePathOfFile($file)
48 49 {
49 50 return $this->_getDir() . '/' . $file;
@@ -49,9 +50,8 @@
49 50 return $this->_getDir() . '/' . $file;
50 51 }
51 52
52 53 /**
53 - * Upload files into custom upload dir of this application
54 54 * @return array
55 55 */
56 56 public function _uploadFromRequest()
57 57 {
@@ -58,9 +58,8 @@
58 58 return $this->_put(\FluentSupport\App\Services\Helper::FluentSupport('request')->files());
59 59 }
60 60
61 61 /**
62 - * Upload files into custom upload dir of this application
63 62 * @param array $files
64 63 * @return array
65 64 */
66 65 public function _put($files)
@@ -71,11 +70,19 @@
71 70
72 71 $this->overrideUploadDir();
73 72
74 73 $uploadOverrides = ['test_form' => false];
74 + $uploadedFiles = [];
75 75
76 + $truncate_files = apply_filters('fluent_support/truncate_uploaded_file_names', false);
77 +
76 78 foreach ((array)$files as $file) {
77 79 $filesArray = $file->toArray();
80 +
81 + if ($truncate_files) {
82 + $filesArray['name'] = $this->truncateFileName($filesArray['name']);
83 + }
84 +
78 85 $extraData = Arr::only($filesArray, ['name', 'size']);
79 86 $uploadsData = \wp_handle_upload($filesArray, $uploadOverrides);
80 87 $uploadedFiles[] = array_merge($extraData, $uploadsData);
81 88 }
@@ -82,10 +89,93 @@
82 89
83 90 return $uploadedFiles;
84 91 }
85 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 +
86 114 /**
87 - * Delete a file from custom upload directory of this application
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 + *
88 178 * @param array $files
89 179 * @return void
90 180 */
91 181 public function _delete($files)
@@ -99,9 +189,9 @@
99 189 }
100 190 }
101 191
102 192 /**
103 - * Register filters for custom upload dir
193 + * Route the next wp_handle_upload() into the plugin's upload dir.
104 194 */
105 195 public function _overrideUploadDir()
106 196 {
107 197 add_filter('wp_handle_upload_prefilter', function ($file) {
@@ -119,20 +209,25 @@
119 209 });
120 210 }
121 211
122 212 /**
123 - * Set plugin's custom upload dir
213 + * upload_dir filter callback.
214 + *
124 215 * @param array $param
125 216 * @return array $param
126 217 */
127 218 public function _setCustomUploadDir($param)
128 219 {
129 - $folderName = '/'.FLUENT_SUPPORT_UPLOAD_DIR;
220 + $folderName = '/' . FLUENT_SUPPORT_UPLOAD_DIR;
130 221
131 - if($this->subDir) {
132 - $folderName .= '/'.$this->subDir;
133 - if(!is_dir($param['basedir'] . $folderName)) {
134 - @mkdir($param['basedir'] . $folderName, 0755);
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, '');
135 230 }
136 231 }
137 232
138 233 $param['url'] = $param['baseurl'] . $folderName;
@@ -138,11 +233,11 @@
138 233 $param['url'] = $param['baseurl'] . $folderName;
139 234
140 235 $param['path'] = $param['basedir'] . $folderName;
141 236
142 -
143 237 if (!is_dir($param['path'])) {
144 238 @mkdir($param['path'], 0755);
239 + @file_put_contents($param['basedir'] . $folderName . '/index.html', '');
145 240 }
146 241
147 242 return $param;
148 243 }
@@ -147,16 +242,17 @@
147 242 return $param;
148 243 }
149 244
150 245 /**
151 - * Rename the uploaded file name before saving
246 + * Prefix uploaded file names with a random token.
247 + *
152 248 * @param array $file
153 249 * @return array $file
154 250 */
155 251 public function _renameFileName($file)
156 252 {
157 - $prefix = 'fluent_support-' . md5(uniqid(rand())) . '___';
158 -
253 + $prefix = 'fluent_support-' . md5(uniqid(wp_rand())) . '___';
254 + $prefix = apply_filters('fluent_support/uploaded_file_name_prefix', $prefix);
159 255 $file['name'] = $prefix . $file['name'];
160 256 return $file;
161 257 }
162 258