PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.2
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.2
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-client.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-client.php
231 lines
1 <?php
2 /**
3 * Legacy Jetpack Tracks Client
4 *
5 * @package automattic/jetpack-tracking
6 */
7
8 use Automattic\Jetpack\Connection\Manager;
9
10 /**
11 * Jetpack_Tracks_Client
12 *
13 * Send Tracks events on behalf of a user
14 *
15 * Example Usage:
16 ```php
17 require( dirname(__FILE__).'path/to/tracks/class-jetpack-tracks-client.php' );
18
19 $result = Jetpack_Tracks_Client::record_event( array(
20 '_en' => $event_name, // required
21 '_ui' => $user_id, // required unless _ul is provided
22 '_ul' => $user_login, // required unless _ui is provided
23
24 // Optional, but recommended
25 '_ts' => $ts_in_ms, // Default: now
26 '_via_ip' => $client_ip, // we use it for geo, etc.
27
28 // Possibly useful to set some context for the event
29 '_via_ua' => $client_user_agent,
30 '_via_url' => $client_url,
31 '_via_ref' => $client_referrer,
32
33 // For user-targeted tests
34 'abtest_name' => $abtest_name,
35 'abtest_variation' => $abtest_variation,
36
37 // Your application-specific properties
38 'custom_property' => $some_value,
39 ) );
40
41 if ( is_wp_error( $result ) ) {
42 // Handle the error in your app
43 }
44 ```
45 */
46 class Jetpack_Tracks_Client {
47 const PIXEL = 'https://pixel.wp.com/t.gif';
48 const BROWSER_TYPE = 'php-agent';
49 const USER_AGENT_SLUG = 'tracks-client';
50 const VERSION = '0.3';
51
52 /**
53 * Stores the Terms of Service Object Reference.
54 *
55 * @var null
56 */
57 private static $terms_of_service = null;
58
59 /**
60 * Record an event.
61 *
62 * @param mixed $event Event object to send to Tracks. An array will be cast to object. Required.
63 * Properties are included directly in the pixel query string after light validation.
64 * @return mixed True on success, WP_Error on failure
65 */
66 public static function record_event( $event ) {
67 if ( ! self::$terms_of_service ) {
68 self::$terms_of_service = new \Automattic\Jetpack\Terms_Of_Service();
69 }
70
71 // Don't track users who have opted out or not agreed to our TOS, or are not running an active Jetpack.
72 if ( ! self::$terms_of_service->has_agreed() || ! empty( $_COOKIE['tk_opt-out'] ) ) {
73 return false;
74 }
75
76 if ( ! $event instanceof Jetpack_Tracks_Event ) {
77 $event = new Jetpack_Tracks_Event( $event );
78 }
79 if ( is_wp_error( $event ) ) {
80 return $event;
81 }
82
83 $pixel = $event->build_pixel_url();
84
85 if ( ! $pixel ) {
86 return new WP_Error( 'invalid_pixel', 'cannot generate tracks pixel for given input', 400 );
87 }
88
89 return self::record_pixel( $pixel );
90 }
91
92 /**
93 * Synchronously request the pixel.
94 *
95 * @param string $pixel The wp.com tracking pixel.
96 * @return array|bool|WP_Error True if successful. wp_remote_get response or WP_Error if not.
97 */
98 public static function record_pixel( $pixel ) {
99 // Add the Request Timestamp and URL terminator just before the HTTP request.
100 $pixel .= '&_rt=' . self::build_timestamp() . '&_=_';
101
102 $response = wp_remote_get(
103 $pixel,
104 array(
105 'blocking' => true, // The default, but being explicit here :).
106 'timeout' => 1,
107 'redirection' => 2,
108 'httpversion' => '1.1',
109 'user-agent' => self::get_user_agent(),
110 )
111 );
112
113 if ( is_wp_error( $response ) ) {
114 return $response;
115 }
116
117 $code = $response['response']['code'] ?? 0;
118
119 if ( 200 !== $code ) {
120 return new WP_Error( 'request_failed', 'Tracks pixel request failed', $code );
121 }
122
123 return true;
124 }
125
126 /**
127 * Get the user agent.
128 *
129 * @return string The user agent.
130 */
131 public static function get_user_agent() {
132 return self::USER_AGENT_SLUG . '-v' . self::VERSION;
133 }
134
135 /**
136 * Build an event and return its tracking URL
137 *
138 * @deprecated Call the `build_pixel_url` method on a Jetpack_Tracks_Event object instead.
139 * @param array $event Event keys and values.
140 * @return string URL of a tracking pixel.
141 */
142 public static function build_pixel_url( $event ) {
143 $_event = new Jetpack_Tracks_Event( $event );
144 return $_event->build_pixel_url();
145 }
146
147 /**
148 * Validate input for a tracks event.
149 *
150 * @deprecated Instantiate a Jetpack_Tracks_Event object instead
151 * @param array $event Event keys and values.
152 * @return mixed Validated keys and values or WP_Error on failure
153 */
154 private static function validate_and_sanitize( $event ) {
155 $_event = new Jetpack_Tracks_Event( $event );
156 if ( is_wp_error( $_event ) ) {
157 return $_event;
158 }
159 return get_object_vars( $_event );
160 }
161
162 /**
163 * Builds a timestamp.
164 *
165 * Milliseconds since 1970-01-01.
166 *
167 * @return string
168 */
169 public static function build_timestamp() {
170 $ts = round( microtime( true ) * 1000 );
171 return number_format( $ts, 0, '', '' );
172 }
173
174 /**
175 * Grabs the user's anon id from cookies, or generates and sets a new one
176 *
177 * @return string An anon id for the user
178 */
179 public static function get_anon_id() {
180 static $anon_id = null;
181
182 if ( ! isset( $anon_id ) ) {
183
184 // Did the browser send us a cookie?
185 if ( isset( $_COOKIE['tk_ai'] ) && preg_match( '#^[a-z]+:[A-Za-z0-9+/=]{24}$#', $_COOKIE['tk_ai'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- This is validating.
186 $anon_id = $_COOKIE['tk_ai']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- This is validating.
187 } else {
188
189 $binary = '';
190
191 // Generate a new anonId and try to save it in the browser's cookies.
192 // Note that base64-encoding an 18 character string generates a 24-character anon id.
193 for ( $i = 0; $i < 18; ++$i ) {
194 $binary .= chr( wp_rand( 0, 255 ) );
195 }
196
197 $anon_id = 'jetpack:' . base64_encode( $binary ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
198
199 if ( ! headers_sent()
200 && ! ( defined( 'REST_REQUEST' ) && REST_REQUEST )
201 && ! ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST )
202 ) {
203 setcookie( 'tk_ai', $anon_id, 0, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), false ); // phpcs:ignore Jetpack.Functions.SetCookie -- This is a random value and should be fine.
204 }
205 }
206 }
207
208 return $anon_id;
209 }
210
211 /**
212 * Gets the WordPress.com user's Tracks identity, if connected.
213 *
214 * @return array|bool
215 */
216 public static function get_connected_user_tracks_identity() {
217 $user_data = ( new Manager() )->get_connected_user_data();
218 if ( ! $user_data ) {
219 return false;
220 }
221
222 return array(
223 'blogid' => Jetpack_Options::get_option( 'id', 0 ),
224 'email' => $user_data['email'],
225 'userid' => $user_data['ID'],
226 'username' => $user_data['login'],
227 'user_locale' => $user_data['user_locale'],
228 );
229 }
230 }
231