Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
/
tracks
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php use Automattic\Jetpack\Constants; defined('ABSPATH') || exit; class WC_Tracks_Event { const EVENT_NAME_REGEX = '/^(([a-z0-9]+)_){2}([a-z0-9_]+)$/'; const PROP_NAME_REGEX = '/^[a-z_][a-z0-9_]*$/'; public $error; public function __construct($event) { $_event = self::validate_and_sanitize($event); if (is_wp_error($_event)) { $this->error = $_event; return; } foreach ($_event as $key => $value) { $this->{$key} = $value; } } public function record() { if (wp_doing_ajax() || Constants::is_true('REST_REQUEST')) { return WC_Tracks_Client::record_event($this); } return WC_Tracks_Footer_Pixel::record_event($this); } public static function validate_and_sanitize($event) { $event = (object) $event; if (!$event->_en) { return new WP_Error('invalid_event', 'A valid event must be specified via `_en`', 400); } if (property_exists($event, '_via_ip') && preg_match('/^192\\.168|^10\\./', $event->_via_ip)) { unset($event->_via_ip); } $validated = array('browser_type' => WC_Tracks_Client::BROWSER_TYPE); $_event = (object) array_merge((array) $event, $validated); if (!isset($_event->_ts)) { $_event->_ts = WC_Tracks_Client::build_timestamp(); } return $_event; } public function build_pixel_url() { if ($this->error) { return ''; } $args = get_object_vars($this); unset($args['_rt'], $args['_']); $validated = self::validate_and_sanitize($args); if (is_wp_error($validated)) { return ''; } return esc_url_raw(WC_Tracks_Client::PIXEL . '?' . http_build_query($validated)); } public static function event_name_is_valid($name) { return preg_match(self::EVENT_NAME_REGEX, $name); } public static function prop_name_is_valid($name) { return preg_match(self::PROP_NAME_REGEX, $name); } public static function scrutinize_event_names($event) { if (!self::event_name_is_valid($event->_en)) { return; } $allowed_key_names = array('anonId', 'Browser_Type'); foreach (array_keys((array) $event) as $key) { if (in_array($key, $allowed_key_names, true)) { continue; } if (!self::prop_name_is_valid($key)) { return; } } } }