assword for the following account on %s:', 'powerpack' ), $blogname ) . '
'; /* translators: %s Username */ $content .= '' . sprintf( esc_html__( 'Username: %s', 'powerpack' ), esc_html( $user->data->user_login ) ) . '
'; $content .= esc_html__( 'If you didn\'t make this request, just ignore this email. If you\'d like to proceed:', 'powerpack' ); $content .= ''; $content .= ''; $content .= esc_html__( 'Click here to reset your password', 'powerpack' ); $content .= ''; $content .= '
'; // translators: %s: email_from_name $headers = sprintf( 'From: %s <%s>' . "\r\n", $blogname, get_option( 'admin_email' ) ); // translators: %s: email_reply_to $headers .= sprintf( 'Reply-To: %s' . "\r\n", $admin_email ); $headers .= 'Content-Type: text/html; charset=UTF-8' . "\r\n"; // Send email to user. $email_sent = wp_mail( $email, $subject, $content, $headers ); return $email_sent; } public function process_reset_password() { if ( ! isset( $_POST['pp-lf-reset-password-nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['pp-lf-reset-password-nonce'] ), 'reset_password' ) ) { wp_send_json_error( __( 'Invalid data.', 'powerpack' ) ); } $posted_fields = array( 'password_1', 'password_2', 'reset_key', 'reset_login' ); foreach ( $posted_fields as $field ) { if ( ! isset( $_POST[ $field ] ) ) { wp_send_json_error( __( 'Invalid data.', 'powerpack' ) ); } if ( in_array( $field, array( 'password_1', 'password_2' ) ) ) { //phpcs:ignore // Don't unslash password fields $posted_fields[ $field ] = $_POST[ $field ]; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash } else { $posted_fields[ $field ] = wp_unslash( $_POST[ $field ] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized } } if ( empty( $posted_fields['password_1'] ) ) { $this->form_error = __( 'Please enter your password.', 'powerpack' ); } elseif ( $posted_fields['password_1'] !== $posted_fields['password_2'] ) { $this->form_error = __( 'Passwords do not match.', 'powerpack' ); } $user = $this->check_password_reset_key( $posted_fields['reset_key'], $posted_fields['reset_login'] ); if ( is_object( $user ) && empty( $this->form_error ) ) { $errors = new \WP_Error(); do_action( 'validate_password_reset', $errors, $user ); if ( is_wp_error( $errors ) && $errors->get_error_messages() ) { foreach ( $errors->get_error_messages() as $error ) { $this->form_error .= $error . "\r\n"; } } $this->reset_password( $user, $posted_fields['password_1'] ); do_action( 'pp_login_form_user_reset_password', $user ); wp_send_json_success(); } if ( ! empty( $this->form_error ) ) { wp_send_json_error( $this->form_error ); } wp_send_json_error( __( 'Unknown error', 'powerpack' ) ); //phpcs:ignore } public function check_password_reset_key( $key, $login ) { // Check for the password reset key. // Get user data or an error message in case of invalid or expired key. $user = check_password_reset_key( $key, $login ); if ( is_wp_error( $user ) ) { $this->form_error = __( 'This key is invalid or has already been used. Please reset your password again if needed.', 'powerpack' ); return false; } return $user; } /** * Handles resetting the user's password. * * @param object $user The user. * @param string $new_pass New password for the user in plaintext. */ private function reset_password( $user, $new_pass ) { do_action( 'password_reset', $user, $new_pass ); wp_set_password( $new_pass, $user->ID ); $this->set_reset_password_cookie(); if ( ! apply_filters( 'pp_login_form_disable_password_change_notification', false ) ) { wp_password_change_notification( $user ); } } /** * Set or unset the cookie. * * @param string $value Cookie value. */ private function set_reset_password_cookie( $value = '' ) { $rp_cookie = 'wp-resetpass-' . COOKIEHASH; $rp_path = isset( $_POST['page_url'] ) ? current( explode( '?', wp_unslash( $_POST['page_url'] ) ) ) : ''; // WPCS: input var ok, sanitization ok. if ( $value ) { setcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true ); } else { setcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true ); } } private function get_redirect_url() { if ( ! empty( $_POST['redirect'] ) ) { $redirect = wp_unslash( $_POST['redirect'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized } elseif ( $this->get_raw_referer() ) { $redirect = $this->get_raw_referer(); } else { $redirect = wp_unslash( $_POST['page_url'] ); } return wp_validate_redirect( $redirect, wp_unslash( $_POST['page_url'] ) ); } /** * Get raw referer. * * @since 1.5.0 * @access private */ private function get_raw_referer() { if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { // phpcs:ignore input var ok, CSRF ok. return wp_unslash( $_REQUEST['_wp_http_referer'] ); // phpcs:ignore input var ok, CSRF ok, sanitization ok. } elseif ( ! empty( $_SERVER['HTTP_REFERER'] ) ) { // phpcs:ignore input var ok, CSRF ok. return wp_unslash( $_SERVER['HTTP_REFERER'] ); // phpcs:ignore input var ok, CSRF ok, sanitization ok. } return false; } public function get_error_message() { return $this->form_error; } }