PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
5.36.0 5.35.1 5.35.0 5.34.3 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 / vendor / woocommerce / email-editor / src / Validator / class-validator.php
mailpoet / vendor / woocommerce / email-editor / src / Validator Last commit date
Schema 11 months ago class-builder.php 11 months ago class-schema.php 11 months ago class-validation-exception.php 11 months ago class-validator.php 11 months ago index.php 11 months ago
class-validator.php
156 lines
1 <?php
2 declare( strict_types = 1 );
3 namespace Automattic\WooCommerce\EmailEditor\Validator;
4 if (!defined('ABSPATH')) exit;
5 use JsonSerializable;
6 use stdClass;
7 use WP_Error;
8 class Validator {
9 public function validate( Schema $schema, $value, string $param_name = 'value' ) {
10 return $this->validate_schema_array( $schema->to_array(), $value, $param_name );
11 }
12 public function validate_schema_array( array $schema, $value, string $param_name = 'value' ) {
13 $result = $this->validate_and_sanitize_value_from_schema( $value, $schema, $param_name );
14 if ( $result instanceof WP_Error ) {
15 throw Validation_Exception::create_from_wp_error( $result ); // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
16 }
17 return $result;
18 }
19 private function validate_and_sanitize_value_from_schema( $value, array $schema, string $param_name ) {
20 // nullable.
21 $full_type = $schema['type'] ?? null;
22 if ( is_array( $full_type ) && in_array( 'null', $full_type, true ) && null === $value ) {
23 return null;
24 }
25 // anyOf, oneOf.
26 if ( isset( $schema['anyOf'] ) ) {
27 return $this->validate_and_sanitize_any_of( $value, $schema, $param_name );
28 } elseif ( isset( $schema['oneOf'] ) ) {
29 return $this->validate_and_sanitize_one_of( $value, $schema, $param_name );
30 }
31 // make types strict.
32 $type = is_array( $full_type ) ? $full_type[0] : $full_type;
33 switch ( $type ) {
34 case 'number':
35 if ( ! is_float( $value ) && ! is_int( $value ) ) {
36 return $this->get_type_error( $param_name, $full_type );
37 }
38 break;
39 case 'integer':
40 if ( ! is_int( $value ) ) {
41 return $this->get_type_error( $param_name, $full_type );
42 }
43 break;
44 case 'boolean':
45 if ( ! is_bool( $value ) ) {
46 return $this->get_type_error( $param_name, $full_type );
47 }
48 break;
49 case 'array':
50 if ( ! is_array( $value ) ) {
51 return $this->get_type_error( $param_name, $full_type );
52 }
53 if ( isset( $schema['items'] ) ) {
54 foreach ( $value as $i => $v ) {
55 $result = $this->validate_and_sanitize_value_from_schema( $v, $schema['items'], $param_name . '[' . $i . ']' );
56 if ( is_wp_error( $result ) ) {
57 return $result;
58 }
59 }
60 }
61 break;
62 case 'object':
63 if ( ! is_array( $value ) && ! $value instanceof stdClass && ! $value instanceof JsonSerializable ) {
64 return $this->get_type_error( $param_name, $full_type );
65 }
66 // ensure string keys.
67 $value = (array) ( $value instanceof JsonSerializable ? $value->jsonSerialize() : $value );
68 if ( count( array_filter( array_keys( $value ), 'is_string' ) ) !== count( $value ) ) {
69 return $this->get_type_error( $param_name, $full_type );
70 }
71 // validate object properties.
72 foreach ( $value as $k => $v ) {
73 if ( isset( $schema['properties'][ $k ] ) ) {
74 $result = $this->validate_and_sanitize_value_from_schema( $v, $schema['properties'][ $k ], $param_name . '[' . $k . ']' );
75 if ( is_wp_error( $result ) ) {
76 return $result;
77 }
78 continue;
79 }
80 $pattern_property_schema = rest_find_matching_pattern_property_schema( $k, $schema );
81 if ( $pattern_property_schema ) {
82 $result = $this->validate_and_sanitize_value_from_schema( $v, $pattern_property_schema, $param_name . '[' . $k . ']' );
83 if ( is_wp_error( $result ) ) {
84 return $result;
85 }
86 continue;
87 }
88 if ( isset( $schema['additionalProperties'] ) && is_array( $schema['additionalProperties'] ) ) {
89 $result = $this->validate_and_sanitize_value_from_schema( $v, $schema['additionalProperties'], $param_name . '[' . $k . ']' );
90 if ( is_wp_error( $result ) ) {
91 return $result;
92 }
93 }
94 }
95 break;
96 }
97 $result = rest_validate_value_from_schema( $value, $schema, $param_name );
98 if ( is_wp_error( $result ) ) {
99 return $result;
100 }
101 return rest_sanitize_value_from_schema( $value, $schema, $param_name );
102 }
103 private function validate_and_sanitize_any_of( $value, array $any_of_schema, string $param_name ) {
104 $errors = array();
105 foreach ( $any_of_schema['anyOf'] as $index => $schema ) {
106 $result = $this->validate_and_sanitize_value_from_schema( $value, $schema, $param_name );
107 if ( ! is_wp_error( $result ) ) {
108 return $result;
109 }
110 $errors[] = array(
111 'error_object' => $result,
112 'schema' => $schema,
113 'index' => $index,
114 );
115 }
116 return rest_get_combining_operation_error( $value, $param_name, $errors );
117 }
118 private function validate_and_sanitize_one_of( $value, array $one_of_schema, string $param_name ) {
119 $matching_schemas = array();
120 $errors = array();
121 $data = null;
122 foreach ( $one_of_schema['oneOf'] as $index => $schema ) {
123 $result = $this->validate_and_sanitize_value_from_schema( $value, $schema, $param_name );
124 if ( is_wp_error( $result ) ) {
125 $errors[] = array(
126 'error_object' => $result,
127 'schema' => $schema,
128 'index' => $index,
129 );
130 } else {
131 $data = $result;
132 $matching_schemas[ $index ] = $schema;
133 }
134 }
135 if ( ! $matching_schemas ) {
136 return rest_get_combining_operation_error( $value, $param_name, $errors );
137 }
138 if ( count( $matching_schemas ) > 1 ) {
139 // reuse WP method to generate detailed error.
140 $invalid_schema = array( 'type' => array() );
141 $one_of = array_replace( array_fill( 0, count( $one_of_schema['oneOf'] ), $invalid_schema ), $matching_schemas );
142 return rest_find_one_matching_schema( $value, array( 'oneOf' => $one_of ), $param_name );
143 }
144 return $data;
145 }
146 private function get_type_error( string $param, $type ): WP_Error {
147 $type = is_array( $type ) ? $type : array( $type );
148 return new WP_Error(
149 'rest_invalid_type',
150 // translators: %1$s is the current parameter and %2$s a comma-separated list of the allowed types.
151 sprintf( __( '%1$s is not of type %2$s.', 'woocommerce' ), $param, implode( ',', $type ) ),
152 array( 'param' => $param )
153 );
154 }
155 }
156