PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
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 / src / class-connection-notice.php
jetpack / jetpack_vendor / automattic / jetpack-connection / src Last commit date
abilities 2 days ago connectors 2 days ago health 2 days ago identity-crisis 1 month ago sso 1 month ago traits 8 months ago webhooks 8 months ago class-authorize-json-api.php 1 month ago class-client.php 2 days ago class-connection-assets.php 1 year ago class-connection-notice.php 8 months ago class-error-handler.php 2 days ago class-external-storage.php 4 months ago class-heartbeat.php 1 month ago class-initial-state.php 3 weeks ago class-manager.php 2 days ago class-nonce-handler.php 8 months ago class-package-version-tracker.php 1 month ago class-package-version.php 2 days ago class-partner-coupon.php 2 months ago class-partner.php 2 years ago class-plugin-storage.php 8 months ago class-plugin.php 8 months ago class-rest-authentication.php 2 days ago class-rest-connector.php 2 days ago class-secrets.php 8 months ago class-server-sandbox.php 2 months ago class-site-health.php 2 days ago class-terms-of-service.php 2 days ago class-tokens-locks.php 8 months ago class-tokens.php 2 days ago class-tracking.php 2 days ago class-urls.php 6 months ago class-user-account-status.php 2 days ago class-users-connection-admin.php 2 months ago class-utils.php 2 years ago class-webhooks.php 1 month ago class-xmlrpc-async-call.php 2 years ago class-xmlrpc-connector.php 8 months ago interface-manager.php 4 years ago interface-storage-provider.php 6 months ago
class-connection-notice.php
242 lines
1 <?php
2 /**
3 * Admin connection notices.
4 *
5 * @package automattic/jetpack-admin-ui
6 */
7
8 namespace Automattic\Jetpack\Connection;
9
10 use Automattic\Jetpack\Redirect;
11 use Automattic\Jetpack\Tracking;
12
13 /**
14 * Admin connection notices.
15 *
16 * @phan-constructor-used-for-side-effects
17 */
18 class Connection_Notice {
19
20 /**
21 * Whether the class has been initialized.
22 *
23 * @var bool
24 */
25 private static $is_initialized = false;
26
27 /**
28 * The constructor.
29 */
30 public function __construct() {
31 if ( ! static::$is_initialized ) {
32 add_action( 'current_screen', array( $this, 'initialize_notices' ) );
33 static::$is_initialized = true;
34 }
35 }
36
37 /**
38 * Initialize the notices if needed.
39 *
40 * @param \WP_Screen $screen WP Core's screen object.
41 *
42 * @return void
43 */
44 public function initialize_notices( $screen ) {
45 if ( in_array(
46 $screen->id,
47 array(
48 'jetpack_page_akismet-key-config',
49 'admin_page_jetpack_modules',
50 ),
51 true
52 ) ) {
53 return;
54 }
55
56 /*
57 * phpcs:disable WordPress.Security.NonceVerification.Recommended
58 *
59 * This function is firing within wp-admin and checks (below) if it is in the midst of a deletion on the users
60 * page. Nonce will be already checked by WordPress, so we do not need to check ourselves.
61 */
62
63 if ( isset( $screen->base ) && 'users' === $screen->base
64 && isset( $_REQUEST['action'] ) && 'delete' === $_REQUEST['action']
65 ) {
66 add_action( 'admin_notices', array( $this, 'delete_user_update_connection_owner_notice' ) );
67 }
68 }
69
70 /**
71 * This is an entire admin notice dedicated to messaging and handling of the case where a user is trying to delete
72 * the connection owner.
73 */
74 public function delete_user_update_connection_owner_notice() {
75 // Get connection owner or bail.
76 $connection_manager = new Manager();
77 $connection_owner_id = $connection_manager->get_connection_owner_id();
78 if ( ! $connection_owner_id ) {
79 return;
80 }
81 $connection_owner_userdata = get_userdata( $connection_owner_id );
82
83 // Bail if we're not trying to delete connection owner.
84 $user_ids_to_delete = array();
85 if ( isset( $_REQUEST['users'] ) ) {
86 $user_ids_to_delete = array_map( 'sanitize_text_field', wp_unslash( $_REQUEST['users'] ) );
87 } elseif ( isset( $_REQUEST['user'] ) ) {
88 $user_ids_to_delete[] = sanitize_text_field( wp_unslash( $_REQUEST['user'] ) );
89 }
90
91 // phpcs:enable
92 $user_ids_to_delete = array_map( 'absint', $user_ids_to_delete );
93 $deleting_connection_owner = in_array( $connection_owner_id, (array) $user_ids_to_delete, true );
94 if ( ! $deleting_connection_owner ) {
95 return;
96 }
97
98 // Bail if they're trying to delete themselves to avoid confusion.
99 if ( get_current_user_id() === $connection_owner_id ) {
100 return;
101 }
102
103 $tracking = new Tracking();
104
105 // Track it!
106 if ( method_exists( $tracking, 'record_user_event' ) ) {
107 $tracking->record_user_event( 'delete_connection_owner_notice_view' );
108 }
109
110 $connected_admins = $connection_manager->get_connected_users( 'jetpack_disconnect' );
111 $user = is_a( $connection_owner_userdata, 'WP_User' ) ? esc_html( $connection_owner_userdata->data->user_login ) : '';
112
113 echo "<div class='notice notice-warning' id='jetpack-notice-switch-connection-owner'>";
114 echo '<h2>' . esc_html__( 'Important notice about your Jetpack connection:', 'jetpack-connection' ) . '</h2>';
115 echo '<p>' . sprintf(
116 /* translators: WordPress User, if available. */
117 esc_html__( 'Warning! You are about to delete the Jetpack connection owner (%s) for this site, which may cause some of your Jetpack features to stop working.', 'jetpack-connection' ),
118 esc_html( $user )
119 ) . '</p>';
120
121 if ( ! empty( $connected_admins ) && count( $connected_admins ) > 1 ) {
122 echo '<form id="jp-switch-connection-owner" action="" method="post">';
123 echo "<label for='owner'>" . esc_html__( 'You can choose to transfer connection ownership to one of these already-connected admins:', 'jetpack-connection' ) . ' </label>';
124
125 $connected_admin_ids = array_map(
126 function ( $connected_admin ) {
127 return $connected_admin->ID;
128 },
129 $connected_admins
130 );
131
132 wp_dropdown_users(
133 array(
134 'name' => 'owner',
135 'include' => array_diff( $connected_admin_ids, array( $connection_owner_id ) ),
136 'show' => 'display_name_with_login',
137 )
138 );
139
140 echo '<p>';
141 submit_button( esc_html__( 'Set new connection owner', 'jetpack-connection' ), 'primary', 'jp-switch-connection-owner-submit', false );
142 echo '</p>';
143
144 echo "<div id='jp-switch-user-results'></div>";
145 echo '</form>';
146 ?>
147 <script type="text/javascript">
148 ( function() {
149 const switchOwnerButton = document.getElementById('jp-switch-connection-owner');
150 if ( ! switchOwnerButton ) {
151 return;
152 }
153
154 switchOwnerButton.addEventListener( 'submit', function ( e ) {
155 e.preventDefault();
156
157 const submitBtn = document.getElementById('jp-switch-connection-owner-submit');
158 submitBtn.disabled = true;
159
160 const results = document.getElementById('jp-switch-user-results');
161 results.innerHTML = '';
162 results.classList.remove( 'error-message' );
163
164 const handleAPIError = ( message ) => {
165 submitBtn.disabled = false;
166
167 results.classList.add( 'error-message' );
168 results.innerHTML = message || "<?php esc_html_e( 'Something went wrong. Please try again.', 'jetpack-connection' ); ?>";
169 }
170
171 fetch(
172 <?php echo wp_json_encode( esc_url_raw( get_rest_url() . 'jetpack/v4/connection/owner' ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ); ?>,
173 {
174 method: 'POST',
175 headers: {
176 'X-WP-Nonce': <?php echo wp_json_encode( wp_create_nonce( 'wp_rest' ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ); ?>,
177 },
178 body: new URLSearchParams( new FormData( this ) ),
179 }
180 )
181 .then( response => response.json() )
182 .then( data => {
183 if ( data.hasOwnProperty( 'code' ) && data.code === 'success' ) {
184 // Owner successfully changed.
185 results.innerHTML = <?php echo wp_json_encode( esc_html__( 'Success!', 'jetpack-connection' ), JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ); ?>;
186 setTimeout(function () {
187 document.getElementById( 'jetpack-notice-switch-connection-owner' ).style.display = 'none';
188 }, 1000);
189
190 return;
191 }
192
193 handleAPIError( data?.message );
194 } )
195 .catch( () => handleAPIError() );
196 });
197 } )();
198 </script>
199 <?php
200 } else {
201 echo '<p>' . esc_html__( 'Every Jetpack site needs at least one connected admin for the features to work properly. Please connect to your WordPress.com account via the button below. Once you connect, you may refresh this page to see an option to change the connection owner.', 'jetpack-connection' ) . '</p>';
202 $connect_url = $connection_manager->get_authorization_url();
203 $connect_url = add_query_arg( 'from', 'delete_connection_owner_notice', $connect_url );
204 echo "<a href='" . esc_url( $connect_url ) . "' target='_blank' rel='noopener noreferrer' class='button-primary'>" . esc_html__( 'Connect to WordPress.com', 'jetpack-connection' ) . '</a>';
205 }
206
207 echo '<p>';
208 printf(
209 wp_kses(
210 /* translators: URL to Jetpack support doc regarding the primary user. */
211 __( "<a href='%s' target='_blank' rel='noopener noreferrer'>Learn more</a> about the connection owner and what will break if you do not have one.", 'jetpack-connection' ),
212 array(
213 'a' => array(
214 'href' => true,
215 'target' => true,
216 'rel' => true,
217 ),
218 )
219 ),
220 esc_url( Redirect::get_url( 'jetpack-support-primary-user' ) )
221 );
222 echo '</p>';
223 echo '<p>';
224 printf(
225 wp_kses(
226 /* translators: URL to contact Jetpack support. */
227 __( 'As always, feel free to <a href="%s" target="_blank" rel="noopener noreferrer">contact our support team</a> if you have any questions.', 'jetpack-connection' ),
228 array(
229 'a' => array(
230 'href' => true,
231 'target' => true,
232 'rel' => true,
233 ),
234 )
235 ),
236 esc_url( Redirect::get_url( 'jetpack-contact-support' ) )
237 );
238 echo '</p>';
239 echo '</div>';
240 }
241 }
242