PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta
16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-connection / legacy / class-jetpack-tracks-event.php
jetpack / jetpack_vendor / automattic / jetpack-connection / legacy Last commit date
class-jetpack-ixr-client.php 9 months ago class-jetpack-ixr-clientmulticall.php 9 months ago class-jetpack-options.php 9 months ago class-jetpack-signature.php 3 months ago class-jetpack-tracks-client.php 3 months ago class-jetpack-tracks-event.php 3 years ago class-jetpack-xmlrpc-server.php 3 months ago
class-jetpack-tracks-event.php
189 lines
1 <?php
2 /**
3 * Class Jetpack_Tracks_Event. Legacy.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8 /*
9 * Example Usage:
10 ```php
11 require_once( dirname(__FILE__) . 'path/to/tracks/class-jetpack-tracks-event.php' );
12
13 $event = new Jetpack_Tracks_Event( array(
14 '_en' => $event_name, // required
15 '_ui' => $user_id, // required unless _ul is provided
16 '_ul' => $user_login, // required unless _ui is provided
17
18 // Optional, but recommended
19 '_via_ip' => $client_ip, // for geo, etc.
20
21 // Possibly useful to set some context for the event
22 '_via_ua' => $client_user_agent,
23 '_via_url' => $client_url,
24 '_via_ref' => $client_referrer,
25
26 // For user-targeted tests
27 'abtest_name' => $abtest_name,
28 'abtest_variation' => $abtest_variation,
29
30 // Your application-specific properties
31 'custom_property' => $some_value,
32 ) );
33
34 if ( is_wp_error( $event->error ) ) {
35 // Handle the error in your app
36 }
37
38 $bump_and_redirect_pixel = $event->build_signed_pixel_url();
39 ```
40 */
41
42 /**
43 * Class Jetpack_Tracks_Event
44 */
45 #[AllowDynamicProperties]
46 class Jetpack_Tracks_Event {
47 const EVENT_NAME_REGEX = '/^(([a-z0-9]+)_){2}([a-z0-9_]+)$/';
48 const PROP_NAME_REGEX = '/^[a-z_][a-z0-9_]*$/';
49
50 /**
51 * Tracks Event Error.
52 *
53 * @var mixed Error.
54 */
55 public $error;
56
57 /**
58 * Jetpack_Tracks_Event constructor.
59 *
60 * @param object $event Tracks event.
61 */
62 public function __construct( $event ) {
63 $_event = self::validate_and_sanitize( $event );
64 if ( is_wp_error( $_event ) ) {
65 $this->error = $_event;
66 return;
67 }
68
69 foreach ( $_event as $key => $value ) {
70 $this->{$key} = $value;
71 }
72 }
73
74 /**
75 * Record a track event.
76 */
77 public function record() {
78 return Jetpack_Tracks_Client::record_event( $this );
79 }
80
81 /**
82 * Annotate the event with all relevant info.
83 *
84 * @param mixed $event Object or (flat) array.
85 * @return mixed The transformed event array or WP_Error on failure.
86 */
87 public static function validate_and_sanitize( $event ) {
88 $event = (object) $event;
89
90 // Required.
91 if ( ! $event->_en ) {
92 return new WP_Error( 'invalid_event', 'A valid event must be specified via `_en`', 400 );
93 }
94
95 // delete non-routable addresses otherwise geoip will discard the record entirely.
96 if ( property_exists( $event, '_via_ip' ) && preg_match( '/^192\.168|^10\./', $event->_via_ip ) ) {
97 unset( $event->_via_ip );
98 }
99
100 $validated = array(
101 'browser_type' => Jetpack_Tracks_Client::BROWSER_TYPE,
102 '_aua' => Jetpack_Tracks_Client::get_user_agent(),
103 );
104
105 $_event = (object) array_merge( (array) $event, $validated );
106
107 // If you want to block property names, do it here.
108
109 // Make sure we have an event timestamp.
110 if ( ! isset( $_event->_ts ) ) {
111 $_event->_ts = Jetpack_Tracks_Client::build_timestamp();
112 }
113
114 return $_event;
115 }
116
117 /**
118 * Build a pixel URL that will send a Tracks event when fired.
119 * On error, returns an empty string ('').
120 *
121 * @return string A pixel URL or empty string ('') if there were invalid args.
122 */
123 public function build_pixel_url() {
124 if ( $this->error ) {
125 return '';
126 }
127
128 $args = get_object_vars( $this );
129
130 // Request Timestamp and URL Terminator must be added just before the HTTP request or not at all.
131 unset( $args['_rt'] );
132 unset( $args['_'] );
133
134 $validated = self::validate_and_sanitize( $args );
135
136 if ( is_wp_error( $validated ) ) {
137 return '';
138 }
139
140 return Jetpack_Tracks_Client::PIXEL . '?' . http_build_query( $validated );
141 }
142
143 /**
144 * Validate the event name.
145 *
146 * @param string $name Event name.
147 * @return false|int
148 */
149 public static function event_name_is_valid( $name ) {
150 return preg_match( self::EVENT_NAME_REGEX, $name );
151 }
152
153 /**
154 * Validates prop name
155 *
156 * @param string $name Property name.
157 *
158 * @return false|int Truthy value.
159 */
160 public static function prop_name_is_valid( $name ) {
161 return preg_match( self::PROP_NAME_REGEX, $name );
162 }
163
164 /**
165 * Scrutinize event name.
166 *
167 * @param object $event Tracks event.
168 */
169 public static function scrutinize_event_names( $event ) {
170 if ( ! self::event_name_is_valid( $event->_en ) ) {
171 return;
172 }
173
174 $whitelisted_key_names = array(
175 'anonId',
176 'Browser_Type',
177 );
178
179 foreach ( array_keys( (array) $event ) as $key ) {
180 if ( in_array( $key, $whitelisted_key_names, true ) ) {
181 continue;
182 }
183 if ( ! self::prop_name_is_valid( $key ) ) {
184 return;
185 }
186 }
187 }
188 }
189