PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 1.9
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v1.9
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
bit-form / includes / Core / Util / FileHandler.php

FileHandler.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 1.9, at includes/Core/Util/FileHandler.php

213 lines 8.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace BitCode\BitForm\Core\Util;
4
5 use BitCode\BitForm\Core\Form\FormManager;
6 use WP_Error;
7
8 final class FileHandler
9 {
10 public function rmrf($dir)
11 {
12 if (is_dir($dir)) {
13 $objects = scandir($dir);
14 foreach ($objects as $object) {
15 if ($object != "." && $object != "..") {
16 if (is_dir($dir. DIRECTORY_SEPARATOR .$object) && !is_link($dir.DIRECTORY_SEPARATOR.$object)) {
17 $this->rmrf($dir. DIRECTORY_SEPARATOR .$object);
18 } else {
19 unlink($dir. DIRECTORY_SEPARATOR .$object);
20 }
21 }
22 }
23 rmdir($dir);
24 } else {
25 unlink($dir);
26 }
27 }
28
29 public function cpyr($source, $destination)
30 {
31 if (is_dir($source)) {
32 mkdir($destination);
33 // chmod($destination, 0744);
34 $objects = scandir($source);
35 foreach ($objects as $object) {
36 if ($object != "." && $object != "..") {
37 if (is_dir($source. DIRECTORY_SEPARATOR .$object) && !is_link($source.DIRECTORY_SEPARATOR.$object)) {
38 cpyr($source. DIRECTORY_SEPARATOR .$object, $destination. DIRECTORY_SEPARATOR .$object);
39 } elseif (is_file($source. DIRECTORY_SEPARATOR .$object)) {
40 copy($source. DIRECTORY_SEPARATOR .$object, $destination. DIRECTORY_SEPARATOR .$object);
41 // chmod($destination. DIRECTORY_SEPARATOR .$object, 0644);
42 } else {
43 symlink($source. DIRECTORY_SEPARATOR .$object, $destination. DIRECTORY_SEPARATOR .$object);
44 }
45 }
46 }
47 } else {
48 copy($source, $destination);
49 }
50 }
51
52 private function getByteSizeByUnit($sizeString)
53 {
54 // split 2MB into 2 and MB
55 $size = preg_replace('/[^0-9\.]/', '', $sizeString);
56 $unit = preg_replace('/[^a-zA-Z]/', '', $sizeString);
57 $unit = strtolower($unit);
58 if ('kb' === $unit) {
59 return $size * 1024;
60 } elseif ('mb' === $unit) {
61 return $size * 1024 * 1024;
62 } elseif ('gb' === $unit) {
63 return $size * 1024 * 1024 * 1024;
64 } else {
65 return $size;
66 }
67 }
68
69 public function validation($field_key, $file_details, $form_id)
70 {
71 if (!function_exists('wp_check_filetype_and_ext')) {
72 require_once ABSPATH . 'wp-admin/includes/file.php';
73 }
74
75 $formManager = new FormManager($form_id);
76 $form_contents = $formManager->getFormContent();
77 $field_content_details = $form_contents->fields;
78 $fieldDetail = $field_content_details->{$field_key};
79 $fieldType = $fieldDetail->typ;
80 $maxSizeDetails = [];
81 $allowFileTypes = [];
82 if ('file-up' === $fieldType) {
83 $allowFileTypes = !empty($fieldDetail->exts) ? $fieldDetail->exts : '';
84 if (!empty($fieldDetail->mxUp)) {
85 if (!empty($fieldDetail->mxUp)) {
86 $maxSizeDetails['maxSize'] = $fieldDetail->mxUp . $fieldDetail->unit;
87 }
88 }
89 if (!empty($allowFileTypes)) {
90 $allowFileTypes = explode(',', $allowFileTypes);
91 }
92 }
93 if (!empty($maxSizeDetails['maxSize'])) {
94 $maxSize = $this->getByteSizeByUnit($maxSizeDetails['maxSize']);
95 }
96
97 $errorMessage = [
98 'message' => '',
99 'error_type'=> '',
100 ];
101
102 if (is_array($file_details['name'])) {
103 $totalSize = 0;
104 foreach ($file_details['name'] as $key => $file) {
105 if (!empty($file)) {
106 $fileInfo = [
107 'name' => $file,
108 'type' => $file_details['type'][$key],
109 'tmp_name' => $file_details['tmp_name'][$key],
110 'error' => $file_details['error'][$key],
111 'size' => $file_details['size'][$key],
112 ];
113 $totalSize += $fileInfo['size'];
114 $validateState = $this->validateSingleFile($fieldType, $fileInfo, $allowFileTypes, $maxSize);
115 if (!empty($validateState)) {
116 return $validateState;
117 }
118 }
119 }
120 if (!is_null($maxTotalFileSize) && $totalSize > $maxTotalFileSize) {
121 $errorMessage['message'] = __('Total File size is too large', 'bit-form');
122 $errorMessage['error_type'] = 'file_size_error';
123 return $errorMessage;
124 }
125 } else {
126 $validateState = $this->validateSingleFile($fieldType, $file_details, $allowFileTypes, $maxSize);
127 if (!empty($validateState)) {
128 return $validateState;
129 }
130 }
131
132 return $errorMessage;
133 }
134
135 private function validateSingleFile($fieldType, $file, $allowTypes, $maxSize)
136 {
137 $fileName = sanitize_file_name($file['name']);
138 if (!empty($fileName)) {
139 $fileSize = $file['size'];
140 if (!empty($maxSize) && $fileSize > $maxSize) {
141 return [
142 'message' => __('File size is too large', 'bit-form'),
143 'error_type'=> 'file_size_error',
144 ];
145 }
146
147 $fileExtension = pathinfo($fileName, PATHINFO_EXTENSION);
148 $fileExtAllowedByWp = wp_check_filetype_and_ext($file['tmp_name'], $fileName);
149 $isAllowedFileType = in_array('.' . $fileExtension, $allowTypes);
150 if ((!empty($allowTypes) && !$isAllowedFileType) || (empty($allowTypes) && empty($fileExtAllowedByWp['ext']))) {
151 return [
152 'message' => __(($fileExtension ? ".{$fileExtension}" : 'empty') . ' file extension is not allowed', 'bit-form'),
153 'error_type'=> 'file_type_error',
154 ];
155 }
156 }
157 }
158
159 public function moveUploadedFiles($file_details, $form_id, $entry_id)
160 {
161 $file_upoalded = array();
162 $_upload_dir = BITFORMS_UPLOAD_DIR.DIRECTORY_SEPARATOR.$form_id.DIRECTORY_SEPARATOR.$entry_id;
163 wp_mkdir_p($_upload_dir);
164 if (is_array($file_details['name'])) {
165 foreach ($file_details['name'] as $key => $value) {
166 //check accepted filetype in_array($file_details['name'][$key], $supported_files) else \
167 if (!empty($value)) {
168 $fileNamePattern = '/\_/';
169 $file_upoalded[$key] = preg_replace($fileNamePattern, '', $value);
170 $extension = pathinfo($file_upoalded[$key], PATHINFO_EXTENSION);
171 if (in_array($extension, ['php', 'html', 'xhtml', 'js'])) {
172 $extension = 'txt';
173 }
174 $uniqueName = wp_generate_uuid4();
175 $UploadedFieldName = $uniqueName . "." . $extension;
176 $file_upoalded[$key] = $UploadedFieldName.'_'. $file_upoalded[$key];
177 $move_status = \move_uploaded_file($file_details['tmp_name'][$key], $_upload_dir.DIRECTORY_SEPARATOR.$UploadedFieldName);
178 if (!$move_status) {
179 unset($file_upoalded[$key]);
180 }
181 }
182 }
183 } else {
184 if (!empty($file_details['name'])) {
185 $fileNamePattern = '/\_/';
186 $fileName = sanitize_file_name($file_details['name']);
187 $file_upoalded[0] = preg_replace($fileNamePattern, '', $fileName);
188 $extension = pathinfo($file_upoalded[0], PATHINFO_EXTENSION);
189 if (in_array($extension, ['php', 'html', 'xhtml', 'js'])) {
190 $extension = 'txt';
191 }
192 $uniqueName= wp_generate_uuid4();
193 $UploadedFieldName = $uniqueName . "." . $extension;
194 $move_status = \move_uploaded_file($file_details['tmp_name'], $_upload_dir.DIRECTORY_SEPARATOR.$UploadedFieldName);
195 $file_upoalded[0] = $UploadedFieldName.'_'.$file_upoalded[0];
196
197 if (!$move_status) {
198 unset($file_upoalded[0]);
199 }
200 }
201 }
202 return $file_upoalded;
203 }
204
205 public function deleteFiles($form_id, $entry_id, $files)
206 {
207 $_upload_dir = BITFORMS_UPLOAD_DIR.DIRECTORY_SEPARATOR.$form_id.DIRECTORY_SEPARATOR.$entry_id;
208 foreach ($files as $name) {
209 unlink($_upload_dir.DIRECTORY_SEPARATOR.$name);
210 }
211 }
212 }
213