From 22188b3e8517cd5b88c0e04e85b557bbb589da0a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 2 Feb 2021 12:37:03 +0000 Subject: [PATCH] Users: Move `retrieve_password()` to `wp-includes/user.php`, for consistency with other user functions. Follow-up to [25231], [50129]. Props jfarthing84, dimadin. See #34281, #31039. Built from https://develop.svn.wordpress.org/trunk@50140 git-svn-id: http://core.svn.wordpress.org/trunk@49819 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-includes/functions.php | 169 -------------------------------------- wp-includes/user.php | 167 +++++++++++++++++++++++++++++++++++++ wp-includes/version.php | 2 +- 3 files changed, 168 insertions(+), 170 deletions(-) diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 75a2463b0d..e6c218d8ad 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -7866,172 +7866,3 @@ function is_php_version_compatible( $required ) { function wp_fuzzy_number_match( $expected, $actual, $precision = 1 ) { return abs( (float) $expected - (float) $actual ) <= $precision; } - -/** - * Handles sending a password retrieval email to a user. - * - * @since 2.5.0 - * @since 5.7.0 Added `$user_login` parameter. - * - * Note: prior to 5.7.0 this function was in wp_login.php. - * - * @global wpdb $wpdb WordPress database abstraction object. - * @global PasswordHash $wp_hasher Portable PHP password hashing framework. - * - * @param string $user_login Optional user_login, default null. Uses - * `$_POST['user_login']` if `$user_login` not set. - * @return true|WP_Error True when finished, WP_Error object on error. - */ -function retrieve_password( $user_login = null ) { - $errors = new WP_Error(); - $user_data = false; - - // Use the passed $user_login if available, otherwise use $_POST['user_login']. - if ( ! $user_login && ! empty( $_POST['user_login'] ) ) { - $user_login = $_POST['user_login']; - } - - if ( empty( $user_login ) ) { - $errors->add( 'empty_username', __( 'Error: Please enter a username or email address.' ) ); - } elseif ( strpos( $user_login, '@' ) ) { - $user_data = get_user_by( 'email', trim( wp_unslash( $user_login ) ) ); - if ( empty( $user_data ) ) { - $errors->add( 'invalid_email', __( 'Error: There is no account with that username or email address.' ) ); - } - } else { - $user_data = get_user_by( 'login', trim( wp_unslash( $user_login ) ) ); - } - - /** - * Filters the user data during a password reset request. - * - * Allows, for example, custom validation using data other than username or email address. - * - * @since 5.7.0 - * - * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. - * @param WP_Error $errors A WP_Error object containing any errors generated - * by using invalid credentials. - */ - $user_data = apply_filters( 'lostpassword_user_data', $user_data, $errors ); - - /** - * Fires before errors are returned from a password reset request. - * - * @since 2.1.0 - * @since 4.4.0 Added the `$errors` parameter. - * @since 5.4.0 Added the `$user_data` parameter. - * - * @param WP_Error $errors A WP_Error object containing any errors generated - * by using invalid credentials. - * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. - */ - do_action( 'lostpassword_post', $errors, $user_data ); - - /** - * Filters the errors encountered on a password reset request. - * - * The filtered WP_Error object may, for example, contain errors for an invalid - * username or email address. A WP_Error object should always be returned, - * but may or may not contain errors. - * - * If any errors are present in $errors, this will abort the password reset request. - * - * @since 5.5.0 - * - * @param WP_Error $errors A WP_Error object containing any errors generated - * by using invalid credentials. - * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. - */ - $errors = apply_filters( 'lostpassword_errors', $errors, $user_data ); - - if ( $errors->has_errors() ) { - return $errors; - } - - if ( ! $user_data ) { - $errors->add( 'invalidcombo', __( 'Error: There is no account with that username or email address.' ) ); - return $errors; - } - - // Redefining user_login ensures we return the right case in the email. - $user_login = $user_data->user_login; - $user_email = $user_data->user_email; - $key = get_password_reset_key( $user_data ); - - if ( is_wp_error( $key ) ) { - return $key; - } - - if ( is_multisite() ) { - $site_name = get_network()->site_name; - } else { - /* - * The blogname option is escaped with esc_html on the way into the database - * in sanitize_option. We want to reverse this for the plain text arena of emails. - */ - $site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); - } - - $message = __( 'Someone has requested a password reset for the following account:' ) . "\r\n\r\n"; - /* translators: %s: Site name. */ - $message .= sprintf( __( 'Site Name: %s' ), $site_name ) . "\r\n\r\n"; - /* translators: %s: User login. */ - $message .= sprintf( __( 'Username: %s' ), $user_login ) . "\r\n\r\n"; - $message .= __( 'If this was a mistake, ignore this email and nothing will happen.' ) . "\r\n\r\n"; - $message .= __( 'To reset your password, visit the following address:' ) . "\r\n\r\n"; - $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\r\n\r\n"; - - $requester_ip = $_SERVER['REMOTE_ADDR']; - if ( $requester_ip ) { - $message .= sprintf( - /* translators: %s: IP address of password reset requester. */ - __( 'This password reset request originated from the IP address %s.' ), - $requester_ip - ) . "\r\n"; - } - - /* translators: Password reset notification email subject. %s: Site title. */ - $title = sprintf( __( '[%s] Password Reset' ), $site_name ); - - /** - * Filters the subject of the password reset email. - * - * @since 2.8.0 - * @since 4.4.0 Added the `$user_login` and `$user_data` parameters. - * - * @param string $title Email subject. - * @param string $user_login The username for the user. - * @param WP_User $user_data WP_User object. - */ - $title = apply_filters( 'retrieve_password_title', $title, $user_login, $user_data ); - - /** - * Filters the message body of the password reset mail. - * - * If the filtered message is empty, the password reset email will not be sent. - * - * @since 2.8.0 - * @since 4.1.0 Added `$user_login` and `$user_data` parameters. - * - * @param string $message Email message. - * @param string $key The activation key. - * @param string $user_login The username for the user. - * @param WP_User $user_data WP_User object. - */ - $message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data ); - - if ( $message && ! wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) ) { - $errors->add( - 'retrieve_password_email_failure', - sprintf( - /* translators: %s: Documentation URL. */ - __( 'Error: The email could not be sent. Your site may not be correctly configured to send emails. Get support for resetting your password.' ), - esc_url( __( 'https://wordpress.org/support/article/resetting-your-password/' ) ) - ) - ); - return $errors; - } - - return true; -} diff --git a/wp-includes/user.php b/wp-includes/user.php index b4a7d36b3f..e0127f440f 100644 --- a/wp-includes/user.php +++ b/wp-includes/user.php @@ -2655,6 +2655,173 @@ function check_password_reset_key( $key, $login ) { return new WP_Error( 'invalid_key', __( 'Invalid key.' ) ); } +/** + * Handles sending a password retrieval email to a user. + * + * @since 2.5.0 + * @since 5.7.0 Added `$user_login` parameter. + * + * @global wpdb $wpdb WordPress database abstraction object. + * @global PasswordHash $wp_hasher Portable PHP password hashing framework. + * + * @param string $user_login Optional user_login, default null. Uses + * `$_POST['user_login']` if `$user_login` not set. + * @return true|WP_Error True when finished, WP_Error object on error. + */ +function retrieve_password( $user_login = null ) { + $errors = new WP_Error(); + $user_data = false; + + // Use the passed $user_login if available, otherwise use $_POST['user_login']. + if ( ! $user_login && ! empty( $_POST['user_login'] ) ) { + $user_login = $_POST['user_login']; + } + + if ( empty( $user_login ) ) { + $errors->add( 'empty_username', __( 'Error: Please enter a username or email address.' ) ); + } elseif ( strpos( $user_login, '@' ) ) { + $user_data = get_user_by( 'email', trim( wp_unslash( $user_login ) ) ); + if ( empty( $user_data ) ) { + $errors->add( 'invalid_email', __( 'Error: There is no account with that username or email address.' ) ); + } + } else { + $user_data = get_user_by( 'login', trim( wp_unslash( $user_login ) ) ); + } + + /** + * Filters the user data during a password reset request. + * + * Allows, for example, custom validation using data other than username or email address. + * + * @since 5.7.0 + * + * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. + * @param WP_Error $errors A WP_Error object containing any errors generated + * by using invalid credentials. + */ + $user_data = apply_filters( 'lostpassword_user_data', $user_data, $errors ); + + /** + * Fires before errors are returned from a password reset request. + * + * @since 2.1.0 + * @since 4.4.0 Added the `$errors` parameter. + * @since 5.4.0 Added the `$user_data` parameter. + * + * @param WP_Error $errors A WP_Error object containing any errors generated + * by using invalid credentials. + * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. + */ + do_action( 'lostpassword_post', $errors, $user_data ); + + /** + * Filters the errors encountered on a password reset request. + * + * The filtered WP_Error object may, for example, contain errors for an invalid + * username or email address. A WP_Error object should always be returned, + * but may or may not contain errors. + * + * If any errors are present in $errors, this will abort the password reset request. + * + * @since 5.5.0 + * + * @param WP_Error $errors A WP_Error object containing any errors generated + * by using invalid credentials. + * @param WP_User|false $user_data WP_User object if found, false if the user does not exist. + */ + $errors = apply_filters( 'lostpassword_errors', $errors, $user_data ); + + if ( $errors->has_errors() ) { + return $errors; + } + + if ( ! $user_data ) { + $errors->add( 'invalidcombo', __( 'Error: There is no account with that username or email address.' ) ); + return $errors; + } + + // Redefining user_login ensures we return the right case in the email. + $user_login = $user_data->user_login; + $user_email = $user_data->user_email; + $key = get_password_reset_key( $user_data ); + + if ( is_wp_error( $key ) ) { + return $key; + } + + if ( is_multisite() ) { + $site_name = get_network()->site_name; + } else { + /* + * The blogname option is escaped with esc_html on the way into the database + * in sanitize_option. We want to reverse this for the plain text arena of emails. + */ + $site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); + } + + $message = __( 'Someone has requested a password reset for the following account:' ) . "\r\n\r\n"; + /* translators: %s: Site name. */ + $message .= sprintf( __( 'Site Name: %s' ), $site_name ) . "\r\n\r\n"; + /* translators: %s: User login. */ + $message .= sprintf( __( 'Username: %s' ), $user_login ) . "\r\n\r\n"; + $message .= __( 'If this was a mistake, ignore this email and nothing will happen.' ) . "\r\n\r\n"; + $message .= __( 'To reset your password, visit the following address:' ) . "\r\n\r\n"; + $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\r\n\r\n"; + + $requester_ip = $_SERVER['REMOTE_ADDR']; + if ( $requester_ip ) { + $message .= sprintf( + /* translators: %s: IP address of password reset requester. */ + __( 'This password reset request originated from the IP address %s.' ), + $requester_ip + ) . "\r\n"; + } + + /* translators: Password reset notification email subject. %s: Site title. */ + $title = sprintf( __( '[%s] Password Reset' ), $site_name ); + + /** + * Filters the subject of the password reset email. + * + * @since 2.8.0 + * @since 4.4.0 Added the `$user_login` and `$user_data` parameters. + * + * @param string $title Email subject. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $title = apply_filters( 'retrieve_password_title', $title, $user_login, $user_data ); + + /** + * Filters the message body of the password reset mail. + * + * If the filtered message is empty, the password reset email will not be sent. + * + * @since 2.8.0 + * @since 4.1.0 Added `$user_login` and `$user_data` parameters. + * + * @param string $message Email message. + * @param string $key The activation key. + * @param string $user_login The username for the user. + * @param WP_User $user_data WP_User object. + */ + $message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data ); + + if ( $message && ! wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) ) { + $errors->add( + 'retrieve_password_email_failure', + sprintf( + /* translators: %s: Documentation URL. */ + __( 'Error: The email could not be sent. Your site may not be correctly configured to send emails. Get support for resetting your password.' ), + esc_url( __( 'https://wordpress.org/support/article/resetting-your-password/' ) ) + ) + ); + return $errors; + } + + return true; +} + /** * Handles resetting the user's password. * diff --git a/wp-includes/version.php b/wp-includes/version.php index adf2f7754c..52ed9d5116 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.7-alpha-50139'; +$wp_version = '5.7-alpha-50140'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.