PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3
Jetpack – WP Security, Backup, Speed, & Growth v16.3
16.3 16.3-beta 16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 All 508 releases
← All changes | jetpack_vendor/automattic/jetpack-stats-admin/src/class-odyssey-config-data.php +300 -0 16.2-beta → 16.3 View file →
@@ -1,0 +1,300 @@
1 +<?php
2 +/**
3 + * Stats Initial State
4 + *
5 + * @package automattic/jetpack-stats-admin
6 + */
7 +
8 +namespace Automattic\Jetpack\Stats_Admin;
9 +
10 +use Automattic\Jetpack\Blaze;
11 +use Automattic\Jetpack\Current_Plan as Jetpack_Plan;
12 +use Automattic\Jetpack\Modules;
13 +use Automattic\Jetpack\Status\Host;
14 +use Jetpack_Options;
15 +
16 +/**
17 + * Class Odyssey_Config_Data
18 + *
19 + * @package automattic/jetpack-stats-admin
20 + */
21 +class Odyssey_Config_Data {
22 +
23 + /**
24 + * Set configData to window.configData.
25 + *
26 + * @param string $config_variable_name The config variable name.
27 + * @param array $config_data The config data.
28 + */
29 + public function get_js_config_data( $config_variable_name = 'configData', $config_data = null ) {
30 + return "window.{$config_variable_name} = " . wp_json_encode(
31 + $config_data === null ? $this->get_data() : $config_data,
32 + JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP
33 + ) . ';';
34 + }
35 +
36 + /**
37 + * Return the config for the app.
38 + */
39 + public function get_data() {
40 + $blog_id = $this->get_connected_blog_id();
41 + $data = $this->get_site_agnostic_data( $blog_id );
42 +
43 + /*
44 + * A site the app cannot reach has no record to seed its store with. Emitting one anyway
45 + * would key every entry on a blog ID of 0 and make each lookup miss, so leave it out and
46 + * let the app fall back to the screens it shows without a site.
47 + */
48 + if ( $blog_id ) {
49 + $data['intial_state'] = $this->get_initial_state( $blog_id );
50 + }
51 +
52 + return $data;
53 + }
54 +
55 + /**
56 + * The WordPress.com blog ID the app can talk to, or 0 when there is none.
57 + *
58 + * A site keeps its blog ID when it disconnects, but every request the app would make with it
59 + * has to be signed with a token the site no longer holds. Such a site has no more to offer
60 + * the app than one that was never connected.
61 + *
62 + * @return int
63 + */
64 + protected function get_connected_blog_id() {
65 + $blog_id = (int) Jetpack_Options::get_option( 'id' );
66 +
67 + if ( ! Main::is_site_connected() ) {
68 + return 0;
69 + }
70 +
71 + // Keep registered sites in the dashboard even when their token is malformed.
72 + // The traffic request reports the connection error; an ID of 0 routes to plan selection.
73 + return $blog_id;
74 + }
75 +
76 + /**
77 + * Config the app can rely on with or without a WordPress.com connection.
78 + *
79 + * @param int $blog_id The WordPress.com blog ID, 0 when the site is not connected.
80 + * @return array
81 + */
82 + protected function get_site_agnostic_data( $blog_id ) {
83 + global $wp_version;
84 +
85 + return array(
86 + 'admin_page_base' => $this->get_admin_path(),
87 + 'api_root' => esc_url_raw( rest_url() ),
88 + 'blog_id' => $blog_id,
89 + 'enable_all_sections' => false,
90 + 'env_id' => 'production',
91 + 'google_analytics_key' => 'UA-10673494-15',
92 + 'google_maps_and_places_api_key' => '',
93 + 'hostname' => wp_parse_url( get_site_url(), PHP_URL_HOST ),
94 + 'i18n_default_locale_slug' => 'en',
95 + 'i18n_locale_slug' => $this->get_user_locale(),
96 + 'mc_analytics_enabled' => false,
97 + 'meta' => array(),
98 + 'nonce' => wp_create_nonce( 'wp_rest' ),
99 + 'site_name' => \get_bloginfo( 'name' ),
100 + 'sections' => array(),
101 + // Features are inlined @see https://github.com/Automattic/wp-calypso/pull/70122
102 + 'features' => array(
103 + 'is_running_in_jetpack_site' => ! ( new Host() )->is_wpcom_simple(),
104 + ),
105 + // Intended for apps that do not use redux.
106 + 'gmt_offset' => $this->get_gmt_offset(),
107 + 'odyssey_stats_base_url' => admin_url( 'admin.php?page=stats' ),
108 + // Repeated in the site record below, which a site without a connection never gets.
109 + 'admin_url' => admin_url(),
110 + 'jetpack_version' => defined( 'JETPACK__VERSION' ) ? JETPACK__VERSION : '',
111 + 'stats_admin_version' => Main::VERSION,
112 + 'software_version' => $wp_version,
113 + );
114 + }
115 +
116 + /**
117 + * The Redux state the app boots with.
118 + *
119 + * @param int $blog_id The WordPress.com blog ID.
120 + * @return array
121 + */
122 + protected function get_initial_state( $blog_id ) {
123 + global $wp_version;
124 +
125 + $host = new Host();
126 + $capabilities = $this->get_current_user_capabilities();
127 + $can_blaze = class_exists( 'Automattic\Jetpack\Blaze' ) && Blaze::should_initialize()['can_init'];
128 +
129 + return array(
130 + 'currentUser' => array(
131 + 'id' => 1000,
132 + 'user' => array(
133 + 'ID' => 1000,
134 + 'username' => 'no-user',
135 + ),
136 + 'capabilities' => array(
137 + "$blog_id" => $capabilities,
138 + ),
139 + ),
140 + 'sites' => array(
141 + 'items' => array(
142 + "$blog_id" => array(
143 + 'ID' => $blog_id,
144 + 'URL' => site_url(),
145 + // Atomic and jetpack sites should return true.
146 + 'jetpack' => ! $host->is_wpcom_simple(),
147 + 'visible' => true,
148 + 'capabilities' => $capabilities,
149 + 'products' => Jetpack_Plan::get_products(),
150 + 'plan' => $this->get_plan(),
151 + 'options' => array(
152 + 'wordads' => ( new Modules() )->is_active( 'wordads' ),
153 + 'admin_url' => admin_url(),
154 + 'gmt_offset' => $this->get_gmt_offset(),
155 + 'is_automated_transfer' => $this->is_automated_transfer( $blog_id ),
156 + 'is_wpcom_atomic' => $host->is_woa_site(),
157 + 'is_wpcom_simple' => $host->is_wpcom_simple(),
158 + 'is_vip' => $host->is_vip_site(),
159 + 'jetpack_version' => defined( 'JETPACK__VERSION' ) ? JETPACK__VERSION : '',
160 + 'stats_admin_version' => Main::VERSION,
161 + 'software_version' => $wp_version,
162 + 'can_blaze' => $can_blaze,
163 + 'has_stats_settings' => ! $host->is_wpcom_simple(),
164 + ),
165 + ),
166 + ),
167 + 'features' => array( "$blog_id" => array( 'data' => $this->get_plan_features() ) ),
168 + ),
169 + );
170 + }
171 +
172 + /**
173 + * Defines a filter to set whether a site is an automated_transfer site or not.
174 + *
175 + * Default is false. On Atomic, this is set to true by `wpcomsh`.
176 + *
177 + * @param int $blog_id Blog ID.
178 + *
179 + * @return bool
180 + */
181 + public function is_automated_transfer( $blog_id ) {
182 + /**
183 + * Filter if a site is an automated-transfer site.
184 + *
185 + * @module json-api
186 + *
187 + * @since 6.4.0
188 + *
189 + * @param bool is_automated_transfer( $this->blog_id )
190 + * @param int $blog_id Blog identifier.
191 + */
192 + return apply_filters(
193 + 'jetpack_site_automated_transfer',
194 + false,
195 + $blog_id
196 + );
197 + }
198 +
199 + /**
200 + * Get the current site GMT Offset.
201 + *
202 + * @return float The current site GMT Offset by hours.
203 + */
204 + protected function get_gmt_offset() {
205 + return (float) get_option( 'gmt_offset' );
206 + }
207 +
208 + /**
209 + * Page base for the Calypso admin page.
210 + */
211 + protected function get_admin_path() {
212 + if ( ! isset( $_SERVER['PHP_SELF'] ) || ! isset( $_SERVER['QUERY_STRING'] ) ) {
213 + $parsed = wp_parse_url( admin_url( 'admin.php?page=stats' ) );
214 + return $parsed['path'] . '?' . $parsed['query'];
215 + }
216 + // We do this because page.js requires the exactly page base to be set otherwise it will not work properly.
217 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
218 + return wp_unslash( $_SERVER['PHP_SELF'] ) . '?' . wp_unslash( $_SERVER['QUERY_STRING'] );
219 + }
220 +
221 + /**
222 + * Get locale acceptable by Calypso.
223 + */
224 + protected function get_user_locale() {
225 + /**
226 + * In WP, locales are formatted as LANGUAGE_REGION, for example `en`, `en_US`, `es_AR`,
227 + * but Calypso expects language-region, e.g. `en-us`, `en`, `es-ar`. So we need to convert
228 + * them to lower case and replace the underscore with a dash.
229 + */
230 + $locale = strtolower( get_user_locale() );
231 + $locale = str_replace( '_', '-', $locale );
232 +
233 + return $locale;
234 + }
235 +
236 + /**
237 + * Get the features of the current plan.
238 + *
239 + * The app cannot refresh what it paywalls on, so a WordPress.com-hosted site is asked
240 + * directly; a plan cached before an upgrade gates a feature the site has already paid for.
241 + */
242 + protected function get_plan_features() {
243 + // method_exists guard: an older plans package may win the autoloader on another plugin.
244 + if ( method_exists( Jetpack_Plan::class, 'get_wpcom_site_specific_features' ) ) {
245 + $features = Jetpack_Plan::get_wpcom_site_specific_features();
246 + if ( null !== $features ) {
247 + return $features;
248 + }
249 + }
250 +
251 + $plan = Jetpack_Plan::get();
252 + if ( empty( $plan['features'] ) ) {
253 + return array();
254 + }
255 + return $plan['features'];
256 + }
257 +
258 + /**
259 + * Get the current plan.
260 + *
261 + * @return array
262 + */
263 + protected function get_plan() {
264 + $plan = Jetpack_Plan::get();
265 + unset( $plan['features'] );
266 + unset( $plan['supports'] );
267 + return $plan;
268 + }
269 +
270 + /**
271 + * Get the capabilities of the current user.
272 + *
273 + * @return array An array of capabilities.
274 + */
275 + protected function get_current_user_capabilities() {
276 + return array(
277 + 'edit_pages' => current_user_can( 'edit_pages' ),
278 + 'edit_posts' => current_user_can( 'edit_posts' ),
279 + 'edit_others_posts' => current_user_can( 'edit_others_posts' ),
280 + 'edit_others_pages' => current_user_can( 'edit_others_pages' ),
281 + 'delete_posts' => current_user_can( 'delete_posts' ),
282 + 'delete_others_posts' => current_user_can( 'delete_others_posts' ),
283 + 'edit_theme_options' => current_user_can( 'edit_theme_options' ),
284 + 'edit_users' => current_user_can( 'edit_users' ),
285 + 'list_users' => current_user_can( 'list_users' ),
286 + 'manage_categories' => current_user_can( 'manage_categories' ),
287 + 'manage_options' => current_user_can( 'manage_options' ),
288 + 'moderate_comments' => current_user_can( 'moderate_comments' ),
289 + 'activate_wordads' => current_user_can( 'manage_options' ),
290 + 'promote_users' => current_user_can( 'promote_users' ),
291 + 'publish_posts' => current_user_can( 'publish_posts' ),
292 + 'upload_files' => current_user_can( 'upload_files' ),
293 + 'delete_users' => current_user_can( 'delete_users' ),
294 + 'remove_users' => current_user_can( 'remove_users' ),
295 + 'own_site' => current_user_can( 'manage_options' ), // Administrators are considered owners on site.
296 + 'view_stats' => current_user_can( 'view_stats' ),
297 + 'activate_plugins' => current_user_can( 'activate_plugins' ),
298 + );
299 + }
300 +}