PluginProbe ʕ •ᴥ•ʔ
JetBackup – Backup, Restore & Migrate / 3.1.20.3
JetBackup – Backup, Restore & Migrate v3.1.20.3
3.1.22.3 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.8.1 1.4.9 1.5.0 1.5.1 1.5.1.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.10 1.6.11 1.6.12 1.6.13 1.6.15 1.6.5.1 1.6.8.8 1.6.9 1.6.9.1 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7.5 2.0.8.7 2.0.9.11 2.0.9.14 2.0.9.15 2.0.9.6 2.0.9.7 2.0.9.9 3.1.10.7 3.1.11.1 3.1.12.3 3.1.13.4 3.1.14.17 3.1.15.4 3.1.16.1 3.1.17.5 3.1.18.10 3.1.18.8 3.1.18.9 3.1.19.8 3.1.20.3 3.1.21.3 3.1.7.9 3.1.9.2 trunk 1.1.90 1.1.91 1.2.0 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2
backup / src / JetBackup / UserInput / UserInput.php
backup / src / JetBackup / UserInput Last commit date
.htaccess 1 year ago UserInput.php 1 year ago index.html 1 year ago web.config 1 year ago
UserInput.php
248 lines
1 <?php
2 /*
3 *
4 * JetBackup @ package
5 * Created By Idan Ben-Ezra
6 *
7 * Copyrights @ JetApps
8 * https://www.jetapps.com
9 *
10 **/
11 namespace JetBackup\UserInput;
12
13 use JetBackup\Data\ArrayData;
14 use JetBackup\Exception\UserInputException;
15 use JetBackup\Wordpress\Wordpress;
16
17 defined("__JETBACKUP__") or die("Restricted Access.");
18
19 class UserInput extends ArrayData {
20
21 const INT = 1<<0; // Signed and Unsigned Integer
22 const UINT = 1<<1; // Unsigned Integer
23 const SINT = 1<<2; // Signed Integer
24 const STRING = 1<<3; // String
25 const BOOL = 1<<4; // Boolean
26 const OBJECT = 1<<5; // Object
27 const ARRAY = 1<<6; // Array
28 const FLOAT = 1<<7; // Signed and Unsigned Float
29 const UFLOAT = 1<<8; // Unsigned Float
30 const SFLOAT = 1<<9; // Signed Float
31
32 const MIXED = self::INT | self::UINT | self::SINT | self::STRING | self::BOOL | self::OBJECT | self::ARRAY | self::FLOAT | self::UFLOAT | self::SFLOAT;
33
34 const NAMES = [
35 self::INT => 'Integer',
36 self::UINT => 'Unsigned Integer',
37 self::SINT => 'Signed Integer',
38 self::STRING => 'String',
39 self::BOOL => 'Boolean',
40 self::OBJECT => 'Object',
41 self::ARRAY => 'Array',
42 self::FLOAT => 'Float',
43 self::UFLOAT => 'Unsigned Float',
44 self::SFLOAT => 'Signed Float',
45 self::MIXED => 'Mixed',
46 ];
47
48 /**
49 * @param mixed $value
50 *
51 * @return bool
52 */
53 public static function validateInt($value):bool { return !self::validateArray($value) && !self::validateObject($value) && (trim($value) == (int) $value); }
54
55 /**
56 * @param mixed $value
57 *
58 * @return bool
59 */
60 public static function validateUnsignedInt($value):bool { return self::validateInt($value) && ((int) $value) >= 0; }
61
62 /**
63 * @param mixed $value
64 *
65 * @return bool
66 */
67 public static function validateSignedInt($value):bool { return self::validateInt($value) && ((int) $value) < 0; }
68
69 /**
70 * @param mixed $value
71 *
72 * @return bool
73 */
74 public static function validateString($value):bool { return is_string($value); }
75
76 /**
77 * @param mixed $value
78 *
79 * @return bool
80 */
81 public static function validateBool($value):bool { return is_bool($value) || (self::validateInt($value) && (((int) $value) == 0 || ((int) $value) == 1)); }
82
83 /**
84 * @param mixed $value
85 *
86 * @return bool
87 */
88 public static function validateObject($value):bool { return is_array($value) || is_object($value); }
89
90 /**
91 * @param mixed $value
92 *
93 * @return bool
94 */
95 public static function validateArray($value):bool { return is_array($value); }
96
97 /**
98 * @param mixed $value
99 *
100 * @return bool
101 */
102 public static function validateFloat($value):bool { return !self::validateArray($value) && !self::validateObject($value) && (trim($value) == (float) $value); }
103
104 /**
105 * @param mixed $value
106 *
107 * @return bool
108 */
109 public static function validateUnsignedFloat($value):bool { return self::validateFloat($value) && ((float) $value) >= 0; }
110
111 /**
112 * @param mixed $value
113 *
114 * @return bool
115 */
116 public static function validateSignedFloat($value):bool { return self::validateFloat($value) && ((float) $value) < 0; }
117
118 /**
119 * @param string $key
120 * @param mixed $default
121 * @param int $bits
122 * @param int $subbits
123 *
124 * @return mixed
125 * @throws UserInputException
126 */
127 private function _validate(string $key, $default, int $bits, int $subbits) {
128 $value = $this->get($key, $default);
129 return self::_validateValue($value, $bits, $subbits);
130 }
131
132 /**
133 * @param mixed $value
134 * @param int $bits
135 * @param int $subbits
136 *
137 * @return mixed
138 * @throws UserInputException
139 */
140 private static function _validateValue($value, int $bits, int $subbits=0) {
141 if($bits == self::MIXED) return $value;
142 if($bits & self::INT && self::validateInt($value)) return (int) $value;
143 if($bits & self::UINT && self::validateUnsignedInt($value)) return (int) $value;
144 if($bits & self::SINT && self::validateSignedInt($value)) return (int) $value;
145 if($bits & self::STRING && self::validateString($value)) return Wordpress::sanitizeTextField($value);
146 if($bits & self::BOOL && self::validateBool($value)) return (bool) $value;
147 if($bits & self::OBJECT && self::validateObject($value)) {
148 $value = (object) $value;
149 if($subbits) foreach($value as $item) self::_validateValue($item, $subbits);
150 return $value;
151 }
152 if($bits & self::ARRAY && self::validateArray($value)) {
153 $value = (array) $value;
154 if($subbits) foreach($value as $item) self::_validateValue($item, $subbits);
155 return $value;
156 }
157 if($bits & self::FLOAT && self::validateFloat($value)) return (float) $value;
158 if($bits & self::UFLOAT && self::validateUnsignedFloat($value)) return (float) $value;
159 if($bits & self::SFLOAT && self::validateSignedFloat($value)) return (float) $value;
160
161 throw new UserInputException("Invalid value provided");
162 }
163
164 /**
165 * @param string $key
166 * @param mixed $default
167 * @param int $bits
168 * @param int $subbits
169 *
170 * @return mixed
171 * @throws UserInputException
172 */
173 private function _validateArray(string &$key, $default, int $bits, int $subbits) {
174
175 preg_match("/^[^\[]+/", $key, $match);
176 preg_match_all("/\[(.*?)]/", $key, $matches);
177
178 $key = $match[0];
179 $subkeys = $matches[1];
180 $value = $this->get($key, []);
181 $invalid = [];
182
183 try {
184 foreach($subkeys as $i => $subkey) {
185
186 self::_validateValue($value, UserInput::OBJECT);
187 $invalid[] = $subkey;
188
189 $last = $i >= (sizeof($subkeys)-1);
190 $value = $value[$subkey] ?? ($last ? $default : []);
191 if(!$last) continue;
192
193 return self::_validateValue($value, $bits, $subbits);
194 }
195 } catch(UserInputException $e) {
196 foreach($invalid as $key_name) $key .= "[$key_name]";
197 throw $e;
198 }
199
200 return $default;
201 }
202
203 /**
204 * @param string $key
205 * @param mixed $default
206 * @param int $bits
207 * @param int $subbits
208 *
209 * @return mixed
210 * @throws UserInputException
211 */
212 public function getValidated(string $key, $default, int $bits, int $subbits=0) {
213
214 if(($bits & self::ARRAY || $bits & self::OBJECT) && !$subbits) throw new UserInputException("Invalid field '$key' implementation. You must provide subtype for Array and Object fields");
215
216 try {
217 if(preg_match("/\[[^]]+]/", $key)) return $this->_validateArray($key, $default, $bits, $subbits);
218 else return $this->_validate($key, $default, $bits, $subbits);
219 } catch(UserInputException $e) {
220 throw new UserInputException("Invalid data provided for field '%s', Valid data types: %s", [$key, implode(', ', self::_getName($bits, $subbits))]);
221 }
222 }
223
224 /**
225 * @param int $bits
226 * @param int $subbits
227 *
228 * @return array
229 */
230 private static function _getName(int $bits, int $subbits=0):array {
231 $name = [];
232 if($bits == self::MIXED) return [self::NAMES[self::MIXED]];
233 if($bits & self::INT) $name[] = self::NAMES[self::INT];
234 if($bits & self::UINT) $name[] = self::NAMES[self::UINT];
235 if($bits & self::SINT) $name[] = self::NAMES[self::SINT];
236 if($bits & self::STRING) $name[] = self::NAMES[self::STRING];
237 if($bits & self::BOOL) $name[] = self::NAMES[self::BOOL];
238 if($bits & self::ARRAY || $bits & self::OBJECT) {
239 $iname = ($bits & self::ARRAY) ? self::ARRAY : self::OBJECT;
240 if($subbits) foreach (self::_getName($subbits) as $sname) $name[] = self::NAMES[$iname] . ' of ' . $sname . 's';
241 else $name[] = self::NAMES[$iname];
242 }
243 if($bits & self::FLOAT) $name[] = self::NAMES[self::FLOAT];
244 if($bits & self::UFLOAT) $name[] = self::NAMES[self::UFLOAT];
245 if($bits & self::SFLOAT) $name[] = self::NAMES[self::SFLOAT];
246 return $name;
247 }
248 }