PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
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 / _inc / lib / admin-pages / class-jetpack-redux-state-helper.php
jetpack / _inc / lib / admin-pages Last commit date
class-akismet-admin-chrome.php 1 month ago class-jetpack-about-page.php 2 months ago class-jetpack-ai-page.php 6 days ago class-jetpack-redux-state-helper.php 6 days ago class.jetpack-admin-page.php 3 weeks ago class.jetpack-landing-page.php 2 years ago class.jetpack-react-page.php 7 months ago class.jetpack-settings-page.php 3 weeks ago
class-jetpack-redux-state-helper.php
460 lines
1 <?php
2 /**
3 * A utility class that generates the initial state for Redux in wp-admin.
4 * Modularized from `class.jetpack-react-page.php`.
5 *
6 * @package automattic/jetpack
7 */
8
9 use Automattic\Jetpack\Blaze;
10 use Automattic\Jetpack\Boost_Speed_Score\Speed_Score_History;
11 use Automattic\Jetpack\Connection\Manager as Connection_Manager;
12 use Automattic\Jetpack\Connection\Plugin_Storage as Connection_Plugin_Storage;
13 use Automattic\Jetpack\Connection\REST_Connector;
14 use Automattic\Jetpack\Constants;
15 use Automattic\Jetpack\Current_Plan as Jetpack_Plan;
16 use Automattic\Jetpack\Device_Detection\User_Agent_Info;
17 use Automattic\Jetpack\Identity_Crisis;
18 use Automattic\Jetpack\IP\Utils as IP_Utils;
19 use Automattic\Jetpack\Licensing;
20 use Automattic\Jetpack\Licensing\Endpoints as Licensing_Endpoints;
21 use Automattic\Jetpack\My_Jetpack\Initializer as My_Jetpack_Initializer;
22 use Automattic\Jetpack\My_Jetpack\Jetpack_Manage;
23 use Automattic\Jetpack\Partner;
24 use Automattic\Jetpack\Partner_Coupon as Jetpack_Partner_Coupon;
25 use Automattic\Jetpack\Publicize\Keyring_Helper;
26 use Automattic\Jetpack\Stats\Options as Stats_Options;
27 use Automattic\Jetpack\Status;
28 use Automattic\Jetpack\Status\Host;
29
30 /**
31 * Responsible for populating the initial Redux state.
32 */
33 class Jetpack_Redux_State_Helper {
34 /**
35 * Generate minimal state for React to fetch its own data asynchronously after load
36 * This can improve user experience, reducing time spent on server requests before serving the page
37 * e.g. used by React Disconnect Dialog on plugins page where the full initial state is not needed
38 */
39 public static function get_minimal_state() {
40 return array(
41 'WP_API_root' => esc_url_raw( rest_url() ),
42 'WP_API_nonce' => wp_create_nonce( 'wp_rest' ),
43 );
44 }
45
46 /**
47 * Generate the initial state array to be used by the Redux store.
48 */
49 public static function get_initial_state() {
50 global $is_safari;
51
52 // Load API endpoint base classes and endpoints for getting the module list fed into the JS Admin Page.
53 require_once JETPACK__PLUGIN_DIR . '_inc/lib/core-api/class.jetpack-core-api-xmlrpc-consumer-endpoint.php';
54 require_once JETPACK__PLUGIN_DIR . '_inc/lib/core-api/class.jetpack-core-api-module-endpoints.php';
55 require_once JETPACK__PLUGIN_DIR . '_inc/lib/core-api/class.jetpack-core-api-site-endpoints.php';
56
57 $module_list_endpoint = new Jetpack_Core_API_Module_List_Endpoint();
58 $modules = $module_list_endpoint->get_modules();
59
60 // Preparing translated fields for JSON encoding by transforming all HTML entities to
61 // respective characters.
62 foreach ( $modules as $slug => $data ) {
63 $modules[ $slug ]['name'] = html_entity_decode( $data['name'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 );
64 $modules[ $slug ]['description'] = html_entity_decode( $data['description'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 );
65 $modules[ $slug ]['short_description'] = html_entity_decode( $data['short_description'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 );
66 $modules[ $slug ]['long_description'] = html_entity_decode( $data['long_description'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 );
67 }
68
69 // "mock" a block module in order to get it searchable in the settings.
70 $modules['blocks']['module'] = 'blocks';
71 $modules['blocks']['additional_search_queries'] = esc_html_x( 'blocks, block, gutenberg', 'Search terms', 'jetpack' );
72
73 // "mock" an Earn module in order to get it searchable in the settings.
74 $modules['earn']['module'] = 'earn';
75 $modules['earn']['additional_search_queries'] = esc_html_x( 'earn, paypal, stripe, payments, pay', 'Search terms', 'jetpack' );
76
77 // Collecting roles that can view site stats.
78 $stats_roles = array();
79 $enabled_roles = Stats_Options::get_option( 'roles' );
80
81 if ( ! function_exists( 'get_editable_roles' ) ) {
82 require_once ABSPATH . 'wp-admin/includes/user.php';
83 }
84 foreach ( get_editable_roles() as $slug => $role ) {
85 $stats_roles[ $slug ] = array(
86 'name' => translate_user_role( $role['name'] ),
87 'canView' => is_array( $enabled_roles ) ? in_array( $slug, $enabled_roles, true ) : false,
88 );
89 }
90
91 // Get information about current theme.
92 $current_theme = wp_get_theme();
93
94 // Get all themes that Infinite Scroll provides support for natively.
95 $inf_scr_support_themes = array();
96 foreach ( Jetpack::glob_php( JETPACK__PLUGIN_DIR . 'modules/infinite-scroll/themes' ) as $path ) {
97 if ( is_readable( $path ) ) {
98 $inf_scr_support_themes[] = basename( $path, '.php' );
99 }
100 }
101
102 // Get last post, to build the link to Customizer in the Related Posts module.
103 $last_post = get_posts( array( 'posts_per_page' => 1 ) );
104 $last_post = isset( $last_post[0] ) && $last_post[0] instanceof WP_Post
105 ? get_permalink( $last_post[0]->ID )
106 : get_home_url();
107
108 $current_user_data = jetpack_current_user_data();
109
110 /**
111 * Adds information to the `connectionStatus` API field that is unique to the Jetpack React dashboard.
112 */
113 $connection_status = array(
114 'isInIdentityCrisis' => Identity_Crisis::validate_sync_error_idc_option(),
115 'sandboxDomain' => JETPACK__SANDBOX_DOMAIN,
116
117 /**
118 * Filter to add connection errors
119 * Format: array( array( 'code' => '...', 'message' => '...', 'action' => '...' ), ... )
120 *
121 * @since 8.7.0
122 *
123 * @param array $errors Connection errors.
124 */
125 'errors' => apply_filters( 'react_connection_errors_initial_state', array() ),
126 );
127
128 $connection_status = array_merge( REST_Connector::connection_status( false ), $connection_status );
129
130 $speed_score_history = new Speed_Score_History( wp_parse_url( get_site_url(), PHP_URL_HOST ) );
131
132 $block_availability = Jetpack_Gutenberg::get_cached_availability();
133
134 return array(
135 'WP_API_root' => esc_url_raw( rest_url() ),
136 'WP_API_nonce' => wp_create_nonce( 'wp_rest' ),
137 'registrationNonce' => '', // Not used, keeping it for compatibility reasons, see https://github.com/Automattic/jetpack/pull/42076
138 'purchaseToken' => self::get_purchase_token(),
139 'partnerCoupon' => Jetpack_Partner_Coupon::get_coupon(),
140 'pluginBaseUrl' => plugins_url( '', JETPACK__PLUGIN_FILE ),
141 'connectionStatus' => $connection_status,
142 'connectedPlugins' => Connection_Plugin_Storage::get_all(),
143 'connectUrl' => false == $current_user_data['isConnected'] // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
144 ? Jetpack::init()->build_connect_url( true, false, false )
145 : '',
146 'dismissedNotices' => self::get_dismissed_jetpack_notices(),
147 'isDevVersion' => Jetpack::is_development_version(),
148 'currentVersion' => JETPACK__VERSION,
149 'is_gutenberg_available' => true,
150 'getModules' => $modules,
151 'rawUrl' => ( new Status() )->get_site_suffix(),
152 'adminUrl' => esc_url( admin_url() ),
153 'siteTitle' => htmlspecialchars_decode( get_option( 'blogname' ), ENT_QUOTES ),
154 'stats' => array(
155 // data is populated asynchronously on page load.
156 'data' => array(
157 'general' => false,
158 'day' => false,
159 'week' => false,
160 'month' => false,
161 ),
162 'roles' => $stats_roles,
163 ),
164 'aff' => Partner::init()->get_partner_code( Partner::AFFILIATE_CODE ),
165 'partnerSubsidiaryId' => Partner::init()->get_partner_code( Partner::SUBSIDIARY_CODE ),
166 'settings' => self::get_flattened_settings(),
167 'userData' => array(
168 'currentUser' => $current_user_data,
169 ),
170 'siteData' => array(
171 'blog_id' => Jetpack_Options::get_option( 'id', 0 ),
172 'icon' => has_site_icon()
173 ? apply_filters( 'jetpack_photon_url', get_site_icon_url(), array( 'w' => 64 ) )
174 : '',
175 'representativeImage' => self::get_site_image(),
176 'siteVisibleToSearchEngines' => '1' == get_option( 'blog_public' ), // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
177 /**
178 * Whether promotions are visible or not.
179 *
180 * @since 4.8.0
181 *
182 * @param bool $are_promotions_active Status of promotions visibility. True by default.
183 */
184 'showPromotions' => apply_filters( 'jetpack_show_promotions', true ),
185 'plan' => Jetpack_Plan::get(),
186 'showBackups' => Jetpack::show_backups_ui(),
187 'showScan' => Jetpack::show_scan_ui(),
188 'showRecommendations' => Jetpack_Recommendations::is_enabled(),
189 /** This filter is documented in my-jetpack/src/class-initializer.php */
190 'showMyJetpack' => My_Jetpack_Initializer::should_initialize(),
191 'isMultisite' => is_multisite(),
192 'dateFormat' => get_option( 'date_format' ),
193 'latestBoostSpeedScores' => $speed_score_history->latest(),
194 'isSharingBlockAvailable' => isset( $block_availability['sharing-buttons'] )
195 && $block_availability['sharing-buttons']['available'],
196 'isLikeBlockAvailable' => isset( $block_availability['like'] )
197 && $block_availability['like']['available'],
198 ),
199 'themeData' => array(
200 'name' => $current_theme->get( 'Name' ),
201 'stylesheet' => $current_theme->get_stylesheet(),
202 'hasUpdate' => (bool) get_theme_update_available( $current_theme ),
203 'isBlockTheme' => (bool) $current_theme->is_block_theme(),
204 'support' => array(
205 'infinite-scroll' => current_theme_supports( 'infinite-scroll' ) || in_array( $current_theme->get_stylesheet(), $inf_scr_support_themes, true ),
206 'widgets' => current_theme_supports( 'widgets' ),
207 'webfonts' => wp_theme_has_theme_json()
208 && ( function_exists( 'wp_register_webfont_provider' ) || function_exists( 'wp_register_webfonts' ) ),
209 ),
210 ),
211 'jetpackStateNotices' => array(
212 'messageCode' => Jetpack::state( 'message' ),
213 'errorCode' => Jetpack::state( 'error' ),
214 'errorDescription' => Jetpack::state( 'error_description' ),
215 ),
216 'tracksUserData' => Jetpack_Tracks_Client::get_connected_user_tracks_identity(),
217 'currentIp' => IP_Utils::get_ip(),
218 'lastPostUrl' => esc_url( $last_post ),
219 'externalServicesConnectUrls' => self::get_external_services_connect_urls(),
220 'calypsoEnv' => ( new Host() )->get_calypso_env(),
221 'products' => Jetpack::get_products_for_purchase(),
222 'recommendationsStep' => Jetpack_Core_Json_Api_Endpoints::get_recommendations_step()['step'],
223 'isSafari' => $is_safari || User_Agent_Info::is_opera_desktop(), // @todo Rename isSafari everywhere.
224 'doNotUseConnectionIframe' => Constants::is_true( 'JETPACK_SHOULD_NOT_USE_CONNECTION_IFRAME' ),
225 'licensing' => array(
226 'error' => Licensing::instance()->last_error(),
227 'showLicensingUi' => Licensing::instance()->is_licensing_input_enabled(),
228 'userCounts' => Licensing_Endpoints::get_user_license_counts(),
229 'activationNoticeDismiss' => Licensing::instance()->get_license_activation_notice_dismiss(),
230 ),
231 'jetpackManage' => array(
232 'isEnabled' => Jetpack_Manage::could_use_jp_manage(),
233 'isAgencyAccount' => Jetpack_Manage::is_agency_account(),
234 ),
235 'hasSeenWCConnectionModal' => Jetpack_Options::get_option( 'has_seen_wc_connection_modal', false ),
236 'newRecommendations' => Jetpack_Recommendations::get_new_conditional_recommendations(),
237 // Check if WooCommerce plugin is active (based on https://docs.woocommerce.com/document/create-a-plugin/).
238 'isWooCommerceActive' => in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', Jetpack::get_active_plugins() ), true ),
239 'useMyJetpackLicensingUI' => My_Jetpack_Initializer::is_licensing_ui_enabled(),
240 'isOdysseyStatsEnabled' => Stats_Options::get_option( 'enable_odyssey_stats' ),
241 'shouldInitializeBlaze' => Blaze::should_initialize(),
242 'isBlazeDashboardEnabled' => Blaze::is_dashboard_enabled(),
243 'isSubscriptionSiteEnabled' => apply_filters( 'jetpack_subscription_site_enabled', false ),
244 'newsletterDateExample' => gmdate( get_option( 'date_format' ), time() ),
245 'subscriptionSiteEditSupported' => $current_theme->is_block_theme(),
246
247 /*
248 * This filter is already documented in jetpack/modules/subscriptions.php.
249 * Defaults on for every site; hosts can opt out with the filter.
250 */
251 'isWpAdminSubscriberManagementEnabled' => apply_filters(
252 'jetpack_wp_admin_subscriber_management_enabled',
253 true
254 ),
255 );
256 }
257
258 /**
259 * Gets array of any Jetpack notices that have been dismissed.
260 *
261 * @return mixed|void
262 */
263 public static function get_dismissed_jetpack_notices() {
264 $jetpack_dismissed_notices = get_option( 'jetpack_dismissed_notices', array() );
265 /**
266 * Array of notices that have been dismissed.
267 *
268 * @param array $jetpack_dismissed_notices If empty, will not show any Jetpack notices.
269 */
270 $dismissed_notices = apply_filters( 'jetpack_dismissed_notices', $jetpack_dismissed_notices );
271 return $dismissed_notices;
272 }
273
274 /**
275 * Returns an array of modules and settings both as first class members of the object.
276 *
277 * @return array flattened settings with modules.
278 */
279 public static function get_flattened_settings() {
280 $core_api_endpoint = new Jetpack_Core_API_Data();
281 $settings = $core_api_endpoint->get_all_options();
282 return $settings->data;
283 }
284
285 /**
286 * Returns the release post content and image data as an associative array.
287 *
288 * The update modal that consumed this data has been removed, so there is nothing to return.
289 *
290 * @deprecated 16.2
291 *
292 * @return null
293 */
294 public static function get_update_modal_data() {
295 _deprecated_function( __METHOD__, 'jetpack-16.2' );
296 return null;
297 }
298
299 /**
300 * Temporarily allow post content to contain iframes, e.g. for videopress.
301 *
302 * Only ever used while sanitizing the release post for the removed update modal.
303 *
304 * @deprecated 16.2
305 *
306 * @param string $tags The tags.
307 * @param string $context The context.
308 */
309 public static function allow_post_embed_iframe( $tags, $context ) {
310 _deprecated_function( __METHOD__, 'jetpack-16.2' );
311
312 if ( 'post' === $context ) {
313 $tags['iframe'] = array(
314 'src' => true,
315 'height' => true,
316 'width' => true,
317 'frameborder' => true,
318 'allowfullscreen' => true,
319 );
320 }
321
322 return $tags;
323 }
324
325 /**
326 * Obtains the release post from the Jetpack release post blog.
327 *
328 * The release post blog has had no post tagged for a current Jetpack version since 2023, and the
329 * update modal that consumed this has been removed, so this no longer makes a remote request.
330 *
331 * @deprecated 16.2
332 *
333 * @return null
334 */
335 public static function get_release_post_data() {
336 _deprecated_function( __METHOD__, 'jetpack-16.2' );
337 return null;
338 }
339
340 /**
341 * Get external services connect URLs.
342 */
343 public static function get_external_services_connect_urls() {
344 $connect_urls = array();
345 foreach ( Keyring_Helper::SERVICES as $service_name => $service_info ) {
346 $connect_urls[ $service_name ] = Keyring_Helper::connect_url( $service_name, $service_info['for'] );
347 }
348 return $connect_urls;
349 }
350
351 /**
352 * Gets a purchase token that is used for Jetpack logged out visitor checkout.
353 * The purchase token should be appended to all CTA url's that lead to checkout.
354 *
355 * @since 9.8.0
356 * @return string|boolean
357 */
358 public static function get_purchase_token() {
359 if ( ! Jetpack::current_user_can_purchase() ) {
360 return false;
361 }
362
363 $purchase_token = Jetpack_Options::get_option( 'purchase_token', false );
364
365 if ( $purchase_token ) {
366 return $purchase_token;
367 }
368 // If the purchase token is not saved in the options table yet, then add it.
369 Jetpack_Options::update_option( 'purchase_token', self::generate_purchase_token(), true );
370 return Jetpack_Options::get_option( 'purchase_token', false );
371 }
372
373 /**
374 * Generates a purchase token that is used for Jetpack logged out visitor checkout.
375 *
376 * @since 9.8.0
377 * @return string
378 */
379 public static function generate_purchase_token() {
380 return wp_generate_password( 12, false );
381 }
382
383 /**
384 * Get a representative image for the site.
385 *
386 * @since 15.0
387 *
388 * @return string
389 */
390 public static function get_site_image(): string {
391 // Get the dynamic image generated for the Open Graph Meta tags.
392 require_once JETPACK__PLUGIN_DIR . 'functions.opengraph.php';
393 return jetpack_og_get_fallback_social_image( 200, 200 )['src'];
394 }
395 }
396
397 // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move these functions to some other file.
398
399 /**
400 * Gather data about the current user.
401 *
402 * @since 4.1.0
403 *
404 * @return array
405 */
406 function jetpack_current_user_data() {
407 $jetpack_connection = new Connection_Manager( 'jetpack' );
408
409 $current_user = wp_get_current_user();
410 $is_user_connected = $jetpack_connection->is_user_connected( $current_user->ID );
411 $is_master_user = $is_user_connected && (int) $current_user->ID && (int) Jetpack_Options::get_option( 'master_user' ) === (int) $current_user->ID;
412 $dotcom_data = $jetpack_connection->get_connected_user_data();
413
414 // Add connected user gravatar to the returned dotcom_data.
415 // Probably we shouldn't do this when $dotcom_data is false, but we have been since 2016 so
416 // clients probably expect that by now.
417 if ( false === $dotcom_data ) {
418 $dotcom_data = array();
419 }
420 $dotcom_data['avatar'] = ( ! empty( $dotcom_data['email'] ) ?
421 get_avatar_url(
422 $dotcom_data['email'],
423 array(
424 'size' => 64,
425 'default' => 'mysteryman',
426 )
427 )
428 : false );
429
430 $current_user_data = array(
431 'isConnected' => $is_user_connected,
432 'isMaster' => $is_master_user,
433 'username' => $current_user->user_login,
434 'displayName' => $current_user->display_name,
435 'email' => $current_user->user_email,
436 'id' => $current_user->ID,
437 'wpcomUser' => $dotcom_data,
438 'gravatar' => get_avatar_url( $current_user->ID ),
439 'permissions' => array(
440 'admin_page' => current_user_can( 'jetpack_admin_page' ),
441 'connect' => current_user_can( 'jetpack_connect' ),
442 'connect_user' => current_user_can( 'jetpack_connect_user' ),
443 'disconnect' => current_user_can( 'jetpack_disconnect' ),
444 'manage_modules' => current_user_can( 'jetpack_manage_modules' ),
445 'network_admin' => current_user_can( 'jetpack_network_admin_page' ),
446 'network_sites_page' => current_user_can( 'jetpack_network_sites_page' ),
447 'edit_posts' => current_user_can( 'edit_posts' ),
448 'publish_posts' => current_user_can( 'publish_posts' ),
449 'manage_options' => current_user_can( 'manage_options' ),
450 'view_stats' => current_user_can( 'view_stats' ),
451 'manage_plugins' => current_user_can( 'install_plugins' )
452 && current_user_can( 'activate_plugins' )
453 && current_user_can( 'update_plugins' )
454 && current_user_can( 'delete_plugins' ),
455 ),
456 );
457
458 return $current_user_data;
459 }
460