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