PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.3.3
Jetpack – WP Security, Backup, Speed, & Growth v13.3.3
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 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 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 / modules / sso / class.jetpack-sso-helpers.php
jetpack / modules / sso Last commit date
class-jetpack-force-2fa.php 2 years ago class.jetpack-sso-helpers.php 2 years ago class.jetpack-sso-notices.php 4 years ago class.jetpack-sso-user-admin.php 2 years ago jetpack-sso-admin-create-user-rtl.css 2 years ago jetpack-sso-admin-create-user-rtl.min.css 2 years ago jetpack-sso-admin-create-user.css 2 years ago jetpack-sso-admin-create-user.js 2 years ago jetpack-sso-admin-create-user.min.css 2 years ago jetpack-sso-login-rtl.css 4 years ago jetpack-sso-login-rtl.min.css 4 years ago jetpack-sso-login.css 4 years ago jetpack-sso-login.js 2 years ago jetpack-sso-login.min.css 4 years ago jetpack-sso-users.js 2 years ago
class.jetpack-sso-helpers.php
449 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * A collection of helper functions used in the SSO module.
4 *
5 * @package automattic/jetpack
6 */
7
8 use Automattic\Jetpack\Connection\Manager as Connection_Manager;
9
10 if ( ! class_exists( 'Jetpack_SSO_Helpers' ) ) :
11
12 /**
13 * A collection of helper functions used in the SSO module.
14 *
15 * @since 4.1.0
16 */
17 class Jetpack_SSO_Helpers {
18 /**
19 * Determine if the login form should be hidden or not
20 *
21 * @return bool
22 **/
23 public static function should_hide_login_form() {
24 /**
25 * Remove the default log in form, only leave the WordPress.com log in button.
26 *
27 * @module sso
28 *
29 * @since 3.1.0
30 *
31 * @param bool get_option( 'jetpack_sso_remove_login_form', false ) Should the default log in form be removed. Default to false.
32 */
33 return (bool) apply_filters( 'jetpack_remove_login_form', get_option( 'jetpack_sso_remove_login_form', false ) );
34 }
35
36 /**
37 * Returns a boolean value for whether logging in by matching the WordPress.com user email to a
38 * Jetpack site user's email is allowed.
39 *
40 * @return bool
41 */
42 public static function match_by_email() {
43 $match_by_email = defined( 'WPCC_MATCH_BY_EMAIL' ) ? WPCC_MATCH_BY_EMAIL : (bool) get_option( 'jetpack_sso_match_by_email', true );
44
45 /**
46 * Link the local account to an account on WordPress.com using the same email address.
47 *
48 * @module sso
49 *
50 * @since 2.6.0
51 *
52 * @param bool $match_by_email Should we link the local account to an account on WordPress.com using the same email address. Default to false.
53 */
54 return (bool) apply_filters( 'jetpack_sso_match_by_email', $match_by_email );
55 }
56
57 /**
58 * Returns a boolean for whether users are allowed to register on the Jetpack site with SSO,
59 * even though the site disallows normal registrations.
60 *
61 * @param object|null $user_data WordPress.com user information.
62 * @return bool
63 */
64 public static function new_user_override( $user_data = null ) {
65 $new_user_override = defined( 'WPCC_NEW_USER_OVERRIDE' ) ? WPCC_NEW_USER_OVERRIDE : false;
66
67 /**
68 * Allow users to register on your site with a WordPress.com account, even though you disallow normal registrations.
69 * If you return a string that corresponds to a user role, the user will be given that role.
70 *
71 * @module sso
72 *
73 * @since 2.6.0
74 * @since 4.6 $user_data object is now passed to the jetpack_sso_new_user_override filter
75 *
76 * @param bool $new_user_override Allow users to register on your site with a WordPress.com account. Default to false.
77 * @param object|null $user_data An object containing the user data returned from WordPress.com.
78 */
79 $role = apply_filters( 'jetpack_sso_new_user_override', $new_user_override, $user_data );
80
81 if ( $role ) {
82 if ( is_string( $role ) && get_role( $role ) ) {
83 return $role;
84 } else {
85 return get_option( 'default_role' );
86 }
87 }
88
89 return false;
90 }
91
92 /**
93 * Returns a boolean value for whether two-step authentication is required for SSO.
94 *
95 * @since 4.1.0
96 *
97 * @return bool
98 */
99 public static function is_two_step_required() {
100 /**
101 * Is it required to have 2-step authentication enabled on WordPress.com to use SSO?
102 *
103 * @module sso
104 *
105 * @since 2.8.0
106 *
107 * @param bool get_option( 'jetpack_sso_require_two_step' ) Does SSO require 2-step authentication?
108 */
109 return (bool) apply_filters( 'jetpack_sso_require_two_step', get_option( 'jetpack_sso_require_two_step', false ) );
110 }
111
112 /**
113 * Returns a boolean for whether a user that is attempting to log in will be automatically
114 * redirected to WordPress.com to begin the SSO flow.
115 *
116 * @return bool
117 */
118 public static function bypass_login_forward_wpcom() {
119 /**
120 * Redirect the site's log in form to WordPress.com's log in form.
121 *
122 * @module sso
123 *
124 * @since 3.1.0
125 *
126 * @param bool false Should the site's log in form be automatically forwarded to WordPress.com's log in form.
127 */
128 return (bool) apply_filters( 'jetpack_sso_bypass_login_forward_wpcom', false );
129 }
130
131 /**
132 * Returns a boolean for whether the SSO login form should be displayed as the default
133 * when both the default and SSO login form allowed.
134 *
135 * @since 4.1.0
136 *
137 * @return bool
138 */
139 public static function show_sso_login() {
140 if ( self::should_hide_login_form() ) {
141 return true;
142 }
143
144 /**
145 * Display the SSO login form as the default when both the default and SSO login forms are enabled.
146 *
147 * @module sso
148 *
149 * @since 4.1.0
150 *
151 * @param bool true Should the SSO login form be displayed by default when the default login form is also enabled?
152 */
153 return (bool) apply_filters( 'jetpack_sso_default_to_sso_login', true );
154 }
155
156 /**
157 * Returns a boolean for whether the two step required checkbox, displayed on the Jetpack admin page, should be disabled.
158 *
159 * @since 4.1.0
160 *
161 * @return bool
162 */
163 public static function is_require_two_step_checkbox_disabled() {
164 return (bool) has_filter( 'jetpack_sso_require_two_step' );
165 }
166
167 /**
168 * Returns a boolean for whether the match by email checkbox, displayed on the Jetpack admin page, should be disabled.
169 *
170 * @since 4.1.0
171 *
172 * @return bool
173 */
174 public static function is_match_by_email_checkbox_disabled() {
175 return defined( 'WPCC_MATCH_BY_EMAIL' ) || has_filter( 'jetpack_sso_match_by_email' );
176 }
177
178 /**
179 * Returns an array of hosts that SSO will redirect to.
180 *
181 * Instead of accessing JETPACK__API_BASE within the method directly, we set it as the
182 * default for $api_base due to restrictions with testing constants in our tests.
183 *
184 * @since 4.3.0
185 * @since 4.6.0 Added public-api.wordpress.com as an allowed redirect
186 *
187 * @param array $hosts Allowed redirect hosts.
188 * @param string $api_base Base API URL.
189 *
190 * @return array
191 */
192 public static function allowed_redirect_hosts( $hosts, $api_base = JETPACK__API_BASE ) {
193 if ( empty( $hosts ) ) {
194 $hosts = array();
195 }
196
197 $hosts[] = 'wordpress.com';
198 $hosts[] = 'jetpack.wordpress.com';
199 $hosts[] = 'public-api.wordpress.com';
200 $hosts[] = 'jetpack.com';
201
202 if ( ! str_contains( $api_base, 'jetpack.wordpress.com/jetpack' ) ) {
203 $base_url_parts = wp_parse_url( esc_url_raw( $api_base ) );
204 if ( $base_url_parts && ! empty( $base_url_parts['host'] ) ) {
205 $hosts[] = $base_url_parts['host'];
206 }
207 }
208
209 return array_unique( $hosts );
210 }
211
212 /**
213 * Generate a new user from a SSO attempt.
214 *
215 * @param object $user_data WordPress.com user information.
216 */
217 public static function generate_user( $user_data ) {
218 $username = $user_data->login;
219 /**
220 * Determines how many times the SSO module can attempt to randomly generate a user.
221 *
222 * @module sso
223 *
224 * @since 4.3.2
225 *
226 * @param int 5 By default, SSO will attempt to random generate a user up to 5 times.
227 */
228 $num_tries = (int) apply_filters( 'jetpack_sso_allowed_username_generate_retries', 5 );
229
230 $exists = username_exists( $username );
231 $tries = 0;
232 while ( $exists && $tries++ < $num_tries ) {
233 $username = $user_data->login . '_' . $user_data->ID . '_' . wp_rand();
234 $exists = username_exists( $username );
235 }
236
237 if ( $exists ) {
238 return false;
239 }
240
241 $user = (object) array();
242 $user->user_pass = wp_generate_password( 20 );
243 $user->user_login = wp_slash( $username );
244 $user->user_email = wp_slash( $user_data->email );
245 $user->display_name = $user_data->display_name;
246 $user->first_name = $user_data->first_name;
247 $user->last_name = $user_data->last_name;
248 $user->url = $user_data->url;
249 $user->description = $user_data->description;
250
251 if ( isset( $user_data->role ) && $user_data->role ) {
252 $user->role = $user_data->role;
253 }
254
255 $created_user_id = wp_insert_user( $user );
256
257 update_user_meta( $created_user_id, 'wpcom_user_id', $user_data->ID );
258 return get_userdata( $created_user_id );
259 }
260
261 /**
262 * Determines how long the auth cookie is valid for when a user logs in with SSO.
263 *
264 * @return int result of the jetpack_sso_auth_cookie_expiration filter.
265 */
266 public static function extend_auth_cookie_expiration_for_sso() {
267 /**
268 * Determines how long the auth cookie is valid for when a user logs in with SSO.
269 *
270 * @module sso
271 *
272 * @since 4.4.0
273 * @since 6.1.0 Fixed a typo. Filter was previously jetpack_sso_auth_cookie_expirtation.
274 *
275 * @param int YEAR_IN_SECONDS
276 */
277 return (int) apply_filters( 'jetpack_sso_auth_cookie_expiration', YEAR_IN_SECONDS );
278 }
279
280 /**
281 * Determines if the SSO form should be displayed for the current action.
282 *
283 * @since 4.6.0
284 *
285 * @param string $action SSO action being performed.
286 *
287 * @return bool Is SSO allowed for the current action?
288 */
289 public static function display_sso_form_for_action( $action ) {
290 /**
291 * Allows plugins the ability to overwrite actions where the SSO form is allowed to be used.
292 *
293 * @module sso
294 *
295 * @since 4.6.0
296 *
297 * @param array $allowed_actions_for_sso
298 */
299 $allowed_actions_for_sso = (array) apply_filters(
300 'jetpack_sso_allowed_actions',
301 array(
302 'login',
303 'jetpack-sso',
304 'jetpack_json_api_authorization',
305 )
306 );
307 return in_array( $action, $allowed_actions_for_sso, true );
308 }
309
310 /**
311 * This method returns an environment array that is meant to simulate `$_REQUEST` when the initial
312 * JSON API auth request was made.
313 *
314 * @since 4.6.0
315 *
316 * @return array|bool
317 */
318 public static function get_json_api_auth_environment() {
319 if ( empty( $_COOKIE['jetpack_sso_original_request'] ) ) {
320 return false;
321 }
322
323 $original_request = esc_url_raw( wp_unslash( $_COOKIE['jetpack_sso_original_request'] ) );
324
325 $parsed_url = wp_parse_url( $original_request );
326 if ( empty( $parsed_url ) || empty( $parsed_url['query'] ) ) {
327 return false;
328 }
329
330 $args = array();
331 wp_parse_str( $parsed_url['query'], $args );
332
333 if ( empty( $args ) || empty( $args['action'] ) ) {
334 return false;
335 }
336
337 if ( 'jetpack_json_api_authorization' !== $args['action'] ) {
338 return false;
339 }
340
341 return array_merge(
342 $args,
343 array( 'jetpack_json_api_original_query' => $original_request )
344 );
345 }
346
347 /**
348 * Check if the site has a custom login page URL, and return it.
349 * If default login page URL is used (`wp-login.php`), `null` will be returned.
350 *
351 * @return string|null
352 */
353 public static function get_custom_login_url() {
354 $login_url = wp_login_url();
355
356 if ( str_ends_with( $login_url, 'wp-login.php' ) ) {
357 // No custom URL found.
358 return null;
359 }
360
361 $site_url = trailingslashit( site_url() );
362
363 if ( ! str_starts_with( $login_url, $site_url ) ) {
364 // Something went wrong, we can't properly extract the custom URL.
365 return null;
366 }
367
368 // Extracting the "path" part of the URL, because we don't need the `site_url` part.
369 return str_ireplace( $site_url, '', $login_url );
370 }
371
372 /**
373 * Clear the cookies that store the profile information for the last
374 * WPCOM user to connect.
375 */
376 public static function clear_wpcom_profile_cookies() {
377 if ( isset( $_COOKIE[ 'jetpack_sso_wpcom_name_' . COOKIEHASH ] ) ) {
378 setcookie(
379 'jetpack_sso_wpcom_name_' . COOKIEHASH,
380 ' ',
381 time() - YEAR_IN_SECONDS,
382 COOKIEPATH,
383 COOKIE_DOMAIN,
384 is_ssl(),
385 true
386 );
387 }
388
389 if ( isset( $_COOKIE[ 'jetpack_sso_wpcom_gravatar_' . COOKIEHASH ] ) ) {
390 setcookie(
391 'jetpack_sso_wpcom_gravatar_' . COOKIEHASH,
392 ' ',
393 time() - YEAR_IN_SECONDS,
394 COOKIEPATH,
395 COOKIE_DOMAIN,
396 is_ssl(),
397 true
398 );
399 }
400 }
401
402 /**
403 * Remove an SSO connection for a user.
404 *
405 * @param int $user_id The local user id.
406 */
407 public static function delete_connection_for_user( $user_id ) {
408 $wpcom_user_id = get_user_meta( $user_id, 'wpcom_user_id', true );
409 if ( ! $wpcom_user_id ) {
410 return;
411 }
412
413 $xml = new Jetpack_IXR_Client(
414 array(
415 'wpcom_user_id' => $user_id,
416 )
417 );
418 $xml->query( 'jetpack.sso.removeUser', $wpcom_user_id );
419
420 if ( $xml->isError() ) {
421 return false;
422 }
423
424 // Clean up local data stored for SSO.
425 delete_user_meta( $user_id, 'wpcom_user_id' );
426 delete_user_meta( $user_id, 'wpcom_user_data' );
427 self::clear_wpcom_profile_cookies();
428
429 return $xml->getResponse();
430 }
431
432 /**
433 * Check if a local user is already connected to WordPress.com.
434 *
435 * @since 13.3
436 *
437 * @param int $user_id Local User information.
438 */
439 public static function is_user_connected( $user_id = 0 ) {
440 if ( ! $user_id ) {
441 $user_id = get_current_user_id();
442 }
443
444 return ( new Connection_Manager( 'jetpack' ) )->is_user_connected( $user_id );
445 }
446 }
447
448 endif;
449