PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / CustomFields / ApiDataSanitizer.php
mailpoet / lib / CustomFields Last commit date
RestApi 1 month ago ApiDataSanitizer.php 2 months ago CustomFieldsRepository.php 1 month ago index.php 3 years ago
ApiDataSanitizer.php
185 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\CustomFields;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use InvalidArgumentException;
9 use MailPoet\Entities\CustomFieldEntity;
10
11 class ApiDataSanitizer {
12
13 const ERROR_MANDATORY_ARGUMENT_MISSING = 1001;
14 const ERROR_MANDATORY_ARGUMENT_WRONG_TYPE = 1002;
15 const ERROR_PARAMS_WRONG_TYPE = 1003;
16 const ERROR_INVALID_TYPE = 1004;
17 const ERROR_INVALID_VALIDATE = 1005;
18 const ERROR_CHECKBOX_WRONG_VALUES_COUNT = 1006;
19 const ERROR_INVALID_DATE_FORMAT = 1007;
20 const ERROR_INVALID_DATE_TYPE = 1008;
21 const ERROR_NO_VALUES = 1009;
22 const ERROR_NO_VALUE = 1010;
23
24 public function sanitize(array $data = []) {
25 $this->checkMandatoryStringParameter($data, 'name');
26 $this->checkMandatoryStringParameter($data, 'type');
27 $this->checkParamsType($data);
28 return [
29 'name' => $data['name'],
30 'type' => strtolower($data['type']),
31 'params' => $this->sanitizeParams($data),
32 ];
33 }
34
35 private function checkMandatoryStringParameter(array $data, $parameterName) {
36 if (empty($data[$parameterName])) {
37 // translators: %s is the name of the missing argument.
38 throw new InvalidArgumentException(sprintf(__('Mandatory argument "%s" is missing', 'mailpoet'), $parameterName), self::ERROR_MANDATORY_ARGUMENT_MISSING);
39 }
40 if (!is_string($data[$parameterName])) {
41 // translators: %s is the name of the malformed argument.
42 throw new InvalidArgumentException(sprintf(__('Mandatory argument "%s" has to be string', 'mailpoet'), $parameterName), self::ERROR_MANDATORY_ARGUMENT_WRONG_TYPE);
43 }
44 }
45
46 private function checkParamsType($data) {
47 if (isset($data['params']) && !is_array($data['params'])) {
48 throw new InvalidArgumentException(sprintf(__('Params has to be array', 'mailpoet')), self::ERROR_PARAMS_WRONG_TYPE);
49 }
50 }
51
52 private function sanitizeParams($data) {
53 $data['params'] = isset($data['params']) ? $data['params'] : [];
54 $result = [];
55 $result['required'] = $this->getRequired($data['params']);
56 $result['label'] = $this->getLabel($data);
57 return $result + $this->getExtraParams($data);
58 }
59
60 private function getLabel($data) {
61 if (empty($data['params']['label'])) {
62 return $data['name'];
63 } else {
64 return $data['params']['label'];
65 }
66 }
67
68 private function getRequired($params) {
69 if (isset($params['required']) && $params['required']) {
70 return '1';
71 }
72 return '';
73 }
74
75 private function getExtraParams($data) {
76 $type = strtolower($data['type']);
77 if (in_array($type, [CustomFieldEntity::TYPE_TEXT, CustomFieldEntity::TYPE_TEXTAREA], true)) {
78 return $this->getExtraParamsForText($data['params']);
79 }
80
81 if (in_array($type, [CustomFieldEntity::TYPE_RADIO, CustomFieldEntity::TYPE_SELECT], true)) {
82 return $this->getExtraParamsForSelect($data['params']);
83 }
84
85 if ($type === CustomFieldEntity::TYPE_CHECKBOX) {
86 return $this->getExtraParamsForCheckbox($data['params']);
87 }
88
89 if ($type === CustomFieldEntity::TYPE_DATE) {
90 return $this->getExtraParamsForDate($data['params']);
91 }
92
93 // translators: %s is the name of the type.
94 throw new InvalidArgumentException(sprintf(__('Invalid type "%s"', 'mailpoet'), $type), self::ERROR_INVALID_TYPE);
95 }
96
97 private function getExtraParamsForText($params) {
98 if (isset($params['validate'])) {
99 $validate = trim(strtolower($params['validate']));
100 if ($validate === '') {
101 return [];
102 }
103 if (in_array($validate, ['number', 'alphanum', 'phone'], true)) {
104 return ['validate' => $validate];
105 }
106 throw new InvalidArgumentException(__('Validate parameter is not valid', 'mailpoet'), self::ERROR_INVALID_VALIDATE);
107 }
108 return [];
109 }
110
111 private function getExtraParamsForCheckbox($params) {
112 if (empty($params['values']) || count($params['values']) > 1) {
113 throw new InvalidArgumentException(__('You need to pass exactly one value for checkbox', 'mailpoet'), self::ERROR_CHECKBOX_WRONG_VALUES_COUNT);
114 }
115 $value = reset($params['values']);
116 return ['values' => [$this->sanitizeValue($value)]];
117 }
118
119 private function getExtraParamsForDate($params) {
120 $dateType = (isset($params['date_type'])
121 ? $params['date_type']
122 : 'year_month_day'
123 );
124 $inputDateFormat = (isset($params['date_format'])
125 ? $params['date_format']
126 : ''
127 );
128
129 switch ($dateType) {
130 case 'year_month_day':
131 if (!in_array($inputDateFormat, ['MM/DD/YYYY', 'DD/MM/YYYY', 'YYYY/MM/DD'], true)) {
132 throw new InvalidArgumentException(__('Invalid date_format for year_month_day', 'mailpoet'), self::ERROR_INVALID_DATE_FORMAT);
133 }
134 $dateFormat = $inputDateFormat;
135 break;
136 case 'year_month':
137 if (!in_array($inputDateFormat, ['YYYY/MM', 'MM/YYYY', 'MM/YY'], true)) {
138 throw new InvalidArgumentException(__('Invalid date_format for year_month', 'mailpoet'), self::ERROR_INVALID_DATE_FORMAT);
139 }
140 $dateFormat = $inputDateFormat;
141 break;
142 case 'month':
143 $dateFormat = 'MM';
144 break;
145 case 'year':
146 $dateFormat = 'YYYY';
147 break;
148 case 'day':
149 $dateFormat = 'DD';
150 break;
151 default:
152 throw new InvalidArgumentException(__('Invalid value for date_type', 'mailpoet'), self::ERROR_INVALID_DATE_TYPE);
153 }
154 return [
155 'date_type' => $dateType,
156 'date_format' => $dateFormat,
157 'is_default_today' => !empty($params['is_default_today']) ? '1' : '',
158 ];
159 }
160
161 private function getExtraParamsForSelect($params) {
162 if (empty($params['values'])) {
163 throw new InvalidArgumentException(__('You need to pass some values for this type', 'mailpoet'), self::ERROR_NO_VALUES);
164 }
165 $values = [];
166 foreach ($params['values'] as $value) {
167 $values[] = $this->sanitizeValue($value);
168 }
169 return ['values' => $values];
170 }
171
172 private function sanitizeValue($value) {
173 if (empty($value['value'])) {
174 throw new InvalidArgumentException(__('Value cannot be empty', 'mailpoet'), self::ERROR_NO_VALUE);
175 }
176 $result = ['value' => $value['value']];
177 if (isset($value['is_checked']) && $value['is_checked']) {
178 $result['is_checked'] = '1';
179 } else {
180 $result['is_checked'] = '';
181 }
182 return $result;
183 }
184 }
185