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 +132 -53 12.3.2 → 16.3 View file →
@@ -6,8 +6,9 @@
6 6 */
7 7
8 8 namespace Automattic\Jetpack\Stats_Admin;
9 9
10 +use Automattic\Jetpack\Blaze;
10 11 use Automattic\Jetpack\Current_Plan as Jetpack_Plan;
11 12 use Automattic\Jetpack\Modules;
12 13 use Automattic\Jetpack\Status\Host;
13 14 use Jetpack_Options;
@@ -26,9 +27,10 @@
26 27 * @param array $config_data The config data.
27 28 */
28 29 public function get_js_config_data( $config_variable_name = 'configData', $config_data = null ) {
29 30 return "window.{$config_variable_name} = " . wp_json_encode(
30 - $config_data === null ? $this->get_data() : $config_data
31 + $config_data === null ? $this->get_data() : $config_data,
32 + JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP
31 33 ) . ';';
32 34 }
33 35
34 36 /**
@@ -34,18 +36,57 @@
34 36 /**
35 37 * Return the config for the app.
36 38 */
37 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 ) {
38 83 global $wp_version;
39 84
40 - $blog_id = Jetpack_Options::get_option( 'id' );
41 - $empty_object = json_decode( '{}' );
42 - $host = new Host();
43 -
44 85 return array(
45 86 'admin_page_base' => $this->get_admin_path(),
46 87 'api_root' => esc_url_raw( rest_url() ),
47 - 'blog_id' => Jetpack_Options::get_option( 'id' ),
88 + 'blog_id' => $blog_id,
48 89 'enable_all_sections' => false,
49 90 'env_id' => 'production',
50 91 'google_analytics_key' => 'UA-10673494-15',
51 92 'google_maps_and_places_api_key' => '',
@@ -50,9 +91,9 @@
50 91 'google_analytics_key' => 'UA-10673494-15',
51 92 'google_maps_and_places_api_key' => '',
52 93 'hostname' => wp_parse_url( get_site_url(), PHP_URL_HOST ),
53 94 'i18n_default_locale_slug' => 'en',
54 - 'i18n_locale_slug' => $this->get_site_locale(),
95 + 'i18n_locale_slug' => $this->get_user_locale(),
55 96 'mc_analytics_enabled' => false,
56 97 'meta' => array(),
57 98 'nonce' => wp_create_nonce( 'wp_rest' ),
58 99 'site_name' => \get_bloginfo( 'name' ),
@@ -57,48 +98,74 @@
57 98 'nonce' => wp_create_nonce( 'wp_rest' ),
58 99 'site_name' => \get_bloginfo( 'name' ),
59 100 'sections' => array(),
60 101 // Features are inlined @see https://github.com/Automattic/wp-calypso/pull/70122
61 - 'features' => array(),
102 + 'features' => array(
103 + 'is_running_in_jetpack_site' => ! ( new Host() )->is_wpcom_simple(),
104 + ),
62 105 // Intended for apps that do not use redux.
63 106 'gmt_offset' => $this->get_gmt_offset(),
64 107 'odyssey_stats_base_url' => admin_url( 'admin.php?page=stats' ),
65 - 'intial_state' => array(
66 - 'currentUser' => array(
67 - 'id' => 1000,
68 - 'user' => array(
69 - 'ID' => 1000,
70 - 'username' => 'no-user',
71 - ),
72 - 'capabilities' => array(
73 - "$blog_id" => $this->get_current_user_capabilities(),
74 - ),
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',
75 135 ),
76 - 'sites' => array(
77 - 'items' => array(
78 - "$blog_id" => array(
79 - 'ID' => $blog_id,
80 - 'URL' => site_url(),
81 - 'jetpack' => true,
82 - 'visible' => true,
83 - 'capabilities' => $this->get_current_user_capabilities(),
84 - 'products' => array(),
85 - 'plan' => $empty_object, // we need this empty object, otherwise the front end would crash on insight page.
86 - 'options' => array(
87 - 'wordads' => ( new Modules() )->is_active( 'wordads' ),
88 - 'admin_url' => admin_url(),
89 - 'gmt_offset' => $this->get_gmt_offset(),
90 - 'is_automated_transfer' => $this->is_automated_transfer( $blog_id ),
91 - 'is_wpcom_atomic' => $host->is_woa_site(),
92 - 'is_vip' => $host->is_vip_site(),
93 - 'jetpack_version' => defined( 'JETPACK__VERSION' ) ? JETPACK__VERSION : '',
94 - 'stats_admin_version' => Main::VERSION,
95 - 'software_version' => $wp_version,
96 - ),
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(),
97 164 ),
98 165 ),
99 - 'features' => array( "$blog_id" => array( 'data' => $this->get_plan_features() ) ),
100 166 ),
167 + 'features' => array( "$blog_id" => array( 'data' => $this->get_plan_features() ) ),
101 168 ),
102 169 );
103 170 }
104 171
@@ -141,9 +208,8 @@
141 208 /**
142 209 * Page base for the Calypso admin page.
143 210 */
144 211 protected function get_admin_path() {
145 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
146 212 if ( ! isset( $_SERVER['PHP_SELF'] ) || ! isset( $_SERVER['QUERY_STRING'] ) ) {
147 213 $parsed = wp_parse_url( admin_url( 'admin.php?page=stats' ) );
148 214 return $parsed['path'] . '?' . $parsed['query'];
149 215 }
@@ -154,15 +220,15 @@
154 220
155 221 /**
156 222 * Get locale acceptable by Calypso.
157 223 */
158 - protected function get_site_locale() {
224 + protected function get_user_locale() {
159 225 /**
160 226 * In WP, locales are formatted as LANGUAGE_REGION, for example `en`, `en_US`, `es_AR`,
161 227 * but Calypso expects language-region, e.g. `en-us`, `en`, `es-ar`. So we need to convert
162 228 * them to lower case and replace the underscore with a dash.
163 229 */
164 - $locale = strtolower( get_locale() );
230 + $locale = strtolower( get_user_locale() );
165 231 $locale = str_replace( '_', '-', $locale );
166 232
167 233 return $locale;
168 234 }
@@ -168,10 +234,21 @@
168 234 }
169 235
170 236 /**
171 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.
172 241 */
173 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 +
174 251 $plan = Jetpack_Plan::get();
175 252 if ( empty( $plan['features'] ) ) {
176 253 return array();
177 254 }
@@ -178,8 +255,20 @@
178 255 return $plan['features'];
179 256 }
180 257
181 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 + /**
182 271 * Get the capabilities of the current user.
183 272 *
184 273 * @return array An array of capabilities.
185 274 */
@@ -203,18 +292,8 @@
203 292 'upload_files' => current_user_can( 'upload_files' ),
204 293 'delete_users' => current_user_can( 'delete_users' ),
205 294 'remove_users' => current_user_can( 'remove_users' ),
206 295 'own_site' => current_user_can( 'manage_options' ), // Administrators are considered owners on site.
207 - /**
208 - * Filter whether the Hosting section in Calypso should be available for site.
209 - *
210 - * @module json-api
211 - *
212 - * @since 8.2.0
213 - *
214 - * @param bool $view_hosting Can site access Hosting section. Default to false.
215 - */
216 - 'view_hosting' => apply_filters( 'jetpack_json_api_site_can_view_hosting', false ),
217 296 'view_stats' => current_user_can( 'view_stats' ),
218 297 'activate_plugins' => current_user_can( 'activate_plugins' ),
219 298 );
220 299 }