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