public function test_type_unknown()
 {
     $schema = array('type' => 'lalala');
     $this->assertTrue(rest_validate_value_from_schema('Best lyrics', $schema));
     $this->assertTrue(rest_validate_value_from_schema(1, $schema));
     $this->assertTrue(rest_validate_value_from_schema(array(), $schema));
 }
Example #2
0
/**
 * Validate a value based on a schema.
 *
 * @param mixed  $value The value to validate.
 * @param array  $args  Schema array to use for validation.
 * @param string $param The parameter name, used in error messages.
 * @return true|WP_Error
 */
function rest_validate_value_from_schema($value, $args, $param = '')
{
    if ('array' === $args['type']) {
        if (!is_array($value)) {
            $value = preg_split('/[\\s,]+/', $value);
        }
        foreach ($value as $index => $v) {
            $is_valid = rest_validate_value_from_schema($v, $args['items'], $param . '[' . $index . ']');
            if (is_wp_error($is_valid)) {
                return $is_valid;
            }
        }
    }
    if (!empty($args['enum'])) {
        if (!in_array($value, $args['enum'], true)) {
            return new WP_Error('rest_invalid_param', sprintf(__('%1$s is not one of %2$s.'), $param, implode(', ', $args['enum'])));
        }
    }
    if (in_array($args['type'], array('integer', 'number')) && !is_numeric($value)) {
        return new WP_Error('rest_invalid_param', sprintf(__('%1$s is not of type %2$s.'), $param, $args['type']));
    }
    if ('integer' === $args['type'] && round(floatval($value)) !== floatval($value)) {
        return new WP_Error('rest_invalid_param', sprintf(__('%1$s is not of type %2$s.'), $param, 'integer'));
    }
    if ('boolean' === $args['type'] && !rest_is_boolean($value)) {
        return new WP_Error('rest_invalid_param', sprintf(__('%1$s is not of type %2$s.'), $value, 'boolean'));
    }
    if ('string' === $args['type'] && !is_string($value)) {
        return new WP_Error('rest_invalid_param', sprintf(__('%1$s is not of type %2$s.'), $param, 'string'));
    }
    if (isset($args['format'])) {
        switch ($args['format']) {
            case 'date-time':
                if (!rest_parse_date($value)) {
                    return new WP_Error('rest_invalid_date', __('The date you provided is invalid.'));
                }
                break;
            case 'email':
                // is_email() checks for 3 characters (a@b), but
                // wp_handle_comment_submission() requires 6 characters (a@b.co)
                //
                // https://core.trac.wordpress.org/ticket/38506
                if (!is_email($value) || strlen($value) < 6) {
                    return new WP_Error('rest_invalid_email', __('The email address you provided is invalid.'));
                }
                break;
            case 'ipv4':
                if (!rest_is_ip_address($value)) {
                    return new WP_Error('rest_invalid_param', sprintf(__('%s is not a valid IP address.'), $value));
                }
                break;
        }
    }
    if (in_array($args['type'], array('number', 'integer'), true) && (isset($args['minimum']) || isset($args['maximum']))) {
        if (isset($args['minimum']) && !isset($args['maximum'])) {
            if (!empty($args['exclusiveMinimum']) && $value <= $args['minimum']) {
                return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be greater than %2$d (exclusive)'), $param, $args['minimum']));
            } elseif (empty($args['exclusiveMinimum']) && $value < $args['minimum']) {
                return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be greater than %2$d (inclusive)'), $param, $args['minimum']));
            }
        } elseif (isset($args['maximum']) && !isset($args['minimum'])) {
            if (!empty($args['exclusiveMaximum']) && $value >= $args['maximum']) {
                return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be less than %2$d (exclusive)'), $param, $args['maximum']));
            } elseif (empty($args['exclusiveMaximum']) && $value > $args['maximum']) {
                return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be less than %2$d (inclusive)'), $param, $args['maximum']));
            }
        } elseif (isset($args['maximum']) && isset($args['minimum'])) {
            if (!empty($args['exclusiveMinimum']) && !empty($args['exclusiveMaximum'])) {
                if ($value >= $args['maximum'] || $value <= $args['minimum']) {
                    return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be between %2$d (exclusive) and %3$d (exclusive)'), $param, $args['minimum'], $args['maximum']));
                }
            } elseif (empty($args['exclusiveMinimum']) && !empty($args['exclusiveMaximum'])) {
                if ($value >= $args['maximum'] || $value < $args['minimum']) {
                    return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be between %2$d (inclusive) and %3$d (exclusive)'), $param, $args['minimum'], $args['maximum']));
                }
            } elseif (!empty($args['exclusiveMinimum']) && empty($args['exclusiveMaximum'])) {
                if ($value > $args['maximum'] || $value <= $args['minimum']) {
                    return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be between %2$d (exclusive) and %3$d (inclusive)'), $param, $args['minimum'], $args['maximum']));
                }
            } elseif (empty($args['exclusiveMinimum']) && empty($args['exclusiveMaximum'])) {
                if ($value > $args['maximum'] || $value < $args['minimum']) {
                    return new WP_Error('rest_invalid_param', sprintf(__('%1$s must be between %2$d (inclusive) and %3$d (inclusive)'), $param, $args['minimum'], $args['maximum']));
                }
            }
        }
    }
    return true;
}
 /**
  * Updates meta values.
  *
  * @since 4.7.0
  * @access public
  *
  * @param WP_REST_Request $request   Full details about the request.
  * @param int             $object_id Object ID to fetch meta for.
  * @return WP_Error|null WP_Error if one occurs, null on success.
  */
 public function update_value($request, $object_id)
 {
     $fields = $this->get_registered_fields();
     foreach ($fields as $name => $args) {
         if (!array_key_exists($name, $request)) {
             continue;
         }
         /*
          * A null value means reset the field, which is essentially deleting it
          * from the database and then relying on the default value.
          */
         if (is_null($request[$name])) {
             $result = $this->delete_meta_value($object_id, $name);
             if (is_wp_error($result)) {
                 return $result;
             }
             continue;
         }
         $is_valid = rest_validate_value_from_schema($request[$name], $args['schema'], 'meta.' . $name);
         if (is_wp_error($is_valid)) {
             $is_valid->add_data(array('status' => 400));
             return $is_valid;
         }
         $value = rest_sanitize_value_from_schema($request[$name], $args['schema']);
         if ($args['single']) {
             $result = $this->update_meta_value($object_id, $name, $value);
         } else {
             $result = $this->update_multi_meta_value($object_id, $name, $value);
         }
         if (is_wp_error($result)) {
             return $result;
         }
     }
     return null;
 }