X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/784f914b1e4b1c62d6657e86397c2e83bcee4295..3d39054f012aefe514b3f5509e32f09fc4feda44:/wp-includes/pluggable.php diff --git a/wp-includes/pluggable.php b/wp-includes/pluggable.php index 31533d51..5c774777 100644 --- a/wp-includes/pluggable.php +++ b/wp-includes/pluggable.php @@ -154,10 +154,10 @@ if ( !function_exists( 'wp_mail' ) ) : * * The default content type is 'text/plain' which does not allow using HTML. * However, you can set the content type of the email by using the - * 'wp_mail_content_type' filter. + * {@see 'wp_mail_content_type'} filter. * * The default charset is based on the charset used on the blog. The charset can - * be set using the 'wp_mail_charset' filter. + * be set using the {@see 'wp_mail_charset'} filter. * * @since 1.2.1 * @@ -174,7 +174,7 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() // Compact the input, apply the filters, and extract them back out /** - * Filter the wp_mail() arguments. + * Filters the wp_mail() arguments. * * @since 2.2.0 * @@ -216,6 +216,8 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() } // Headers + $cc = $bcc = $reply_to = array(); + if ( empty( $headers ) ) { $headers = array(); } else { @@ -227,8 +229,6 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() $tempheaders = $headers; } $headers = array(); - $cc = array(); - $bcc = array(); // If it's actually got contents if ( !empty( $tempheaders ) ) { @@ -291,6 +291,9 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() case 'bcc': $bcc = array_merge( (array) $bcc, explode( ',', $content ) ); break; + case 'reply-to': + $reply_to = array_merge( (array) $reply_to, explode( ',', $content ) ); + break; default: // Add it to our grand headers array $headers[trim( $name )] = trim( $content ); @@ -329,78 +332,67 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() } /** - * Filter the email address to send from. + * Filters the email address to send from. * * @since 2.2.0 * * @param string $from_email Email address to send from. */ - $phpmailer->From = apply_filters( 'wp_mail_from', $from_email ); + $from_email = apply_filters( 'wp_mail_from', $from_email ); /** - * Filter the name to associate with the "from" email address. + * Filters the name to associate with the "from" email address. * * @since 2.3.0 * * @param string $from_name Name associated with the "from" email address. */ - $phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name ); + $from_name = apply_filters( 'wp_mail_from_name', $from_name ); + + $phpmailer->setFrom( $from_email, $from_name, false ); // Set destination addresses if ( !is_array( $to ) ) $to = explode( ',', $to ); - foreach ( (array) $to as $recipient ) { - try { - // Break $recipient into name and address parts if in the format "Foo " - $recipient_name = ''; - if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) { - if ( count( $matches ) == 3 ) { - $recipient_name = $matches[1]; - $recipient = $matches[2]; - } - } - $phpmailer->AddAddress( $recipient, $recipient_name); - } catch ( phpmailerException $e ) { - continue; - } - } - // Set mail's subject and body $phpmailer->Subject = $subject; $phpmailer->Body = $message; - // Add any CC and BCC recipients - if ( !empty( $cc ) ) { - foreach ( (array) $cc as $recipient ) { - try { - // Break $recipient into name and address parts if in the format "Foo " - $recipient_name = ''; - if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) { - if ( count( $matches ) == 3 ) { - $recipient_name = $matches[1]; - $recipient = $matches[2]; - } - } - $phpmailer->AddCc( $recipient, $recipient_name ); - } catch ( phpmailerException $e ) { - continue; - } + // Use appropriate methods for handling addresses, rather than treating them as generic headers + $address_headers = compact( 'to', 'cc', 'bcc', 'reply_to' ); + + foreach ( $address_headers as $address_header => $addresses ) { + if ( empty( $addresses ) ) { + continue; } - } - if ( !empty( $bcc ) ) { - foreach ( (array) $bcc as $recipient) { + foreach ( (array) $addresses as $address ) { try { // Break $recipient into name and address parts if in the format "Foo " $recipient_name = ''; - if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) { + + if ( preg_match( '/(.*)<(.+)>/', $address, $matches ) ) { if ( count( $matches ) == 3 ) { $recipient_name = $matches[1]; - $recipient = $matches[2]; + $address = $matches[2]; } } - $phpmailer->AddBcc( $recipient, $recipient_name ); + + switch ( $address_header ) { + case 'to': + $phpmailer->addAddress( $address, $recipient_name ); + break; + case 'cc': + $phpmailer->addCc( $address, $recipient_name ); + break; + case 'bcc': + $phpmailer->addBcc( $address, $recipient_name ); + break; + case 'reply_to': + $phpmailer->addReplyTo( $address, $recipient_name ); + break; + } } catch ( phpmailerException $e ) { continue; } @@ -416,7 +408,7 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() $content_type = 'text/plain'; /** - * Filter the wp_mail() content type. + * Filters the wp_mail() content type. * * @since 2.3.0 * @@ -437,7 +429,7 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() // Set the content-type and charset /** - * Filter the default wp_mail() charset. + * Filters the default wp_mail() charset. * * @since 2.3.0 * @@ -513,7 +505,7 @@ function wp_authenticate($username, $password) { $password = trim($password); /** - * Filter whether a set of user login credentials are valid. + * Filters whether a set of user login credentials are valid. * * A WP_User object is returned if the credentials authenticate a user. * WP_Error or null otherwise. @@ -610,7 +602,7 @@ function wp_validate_auth_cookie($cookie = '', $scheme = '') { $token = $cookie_elements['token']; $expired = $expiration = $cookie_elements['expiration']; - // Allow a grace period for POST and AJAX requests + // Allow a grace period for POST and Ajax requests if ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] ) { $expired += HOUR_IN_SECONDS; } @@ -667,7 +659,7 @@ function wp_validate_auth_cookie($cookie = '', $scheme = '') { return false; } - // AJAX/POST grace period set above + // Ajax/POST grace period set above if ( $expiration < time() ) { $GLOBALS['login_grace_period'] = 1; } @@ -693,7 +685,7 @@ if ( !function_exists('wp_generate_auth_cookie') ) : * @since 2.5.0 * * @param int $user_id User ID - * @param int $expiration Cookie expiration in seconds + * @param int $expiration The time the cookie expires as a UNIX timestamp. * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in * @param string $token User's session token to use for this cookie * @return string Authentication cookie contents. Empty string if user does not exist. @@ -720,13 +712,13 @@ function wp_generate_auth_cookie( $user_id, $expiration, $scheme = 'auth', $toke $cookie = $user->user_login . '|' . $expiration . '|' . $token . '|' . $hash; /** - * Filter the authentication cookie. + * Filters the authentication cookie. * * @since 2.5.0 * * @param string $cookie Authentication cookie. * @param int $user_id User ID. - * @param int $expiration Authentication cookie expiration in seconds. + * @param int $expiration The time the cookie expires as a UNIX timestamp. * @param string $scheme Cookie scheme used. Accepts 'auth', 'secure_auth', or 'logged_in'. * @param string $token User's session token used. */ @@ -802,7 +794,7 @@ if ( !function_exists('wp_set_auth_cookie') ) : function wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = '' ) { if ( $remember ) { /** - * Filter the duration of the authentication cookie expiration period. + * Filters the duration of the authentication cookie expiration period. * * @since 2.8.0 * @@ -831,7 +823,7 @@ function wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = $secure_logged_in_cookie = $secure && 'https' === parse_url( get_option( 'home' ), PHP_URL_SCHEME ); /** - * Filter whether the connection is secure. + * Filters whether the connection is secure. * * @since 3.1.0 * @@ -841,7 +833,7 @@ function wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = $secure = apply_filters( 'secure_auth_cookie', $secure, $user_id ); /** - * Filter whether to use a secure cookie when logged-in. + * Filters whether to use a secure cookie when logged-in. * * @since 3.1.0 * @@ -873,23 +865,25 @@ function wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = * @since 2.5.0 * * @param string $auth_cookie Authentication cookie. - * @param int $expire Login grace period in seconds. Default 43,200 seconds, or 12 hours. - * @param int $expiration Duration in seconds the authentication cookie should be valid. - * Default 1,209,600 seconds, or 14 days. + * @param int $expire The time the login grace period expires as a UNIX timestamp. + * Default is 12 hours past the cookie's expiration time. + * @param int $expiration The time when the authentication cookie expires as a UNIX timestamp. + * Default is 14 days from now. * @param int $user_id User ID. * @param string $scheme Authentication scheme. Values include 'auth', 'secure_auth', or 'logged_in'. */ do_action( 'set_auth_cookie', $auth_cookie, $expire, $expiration, $user_id, $scheme ); /** - * Fires immediately before the secure authentication cookie is set. + * Fires immediately before the logged-in authentication cookie is set. * * @since 2.6.0 * * @param string $logged_in_cookie The logged-in cookie. - * @param int $expire Login grace period in seconds. Default 43,200 seconds, or 12 hours. - * @param int $expiration Duration in seconds the authentication cookie should be valid. - * Default 1,209,600 seconds, or 14 days. + * @param int $expire The time the login grace period expires as a UNIX timestamp. + * Default is 12 hours past the cookie's expiration time. + * @param int $expiration The time when the logged-in authentication cookie expires as a UNIX timestamp. + * Default is 14 days from now. * @param int $user_id User ID. * @param string $scheme Authentication scheme. Default 'logged_in'. */ @@ -965,7 +959,7 @@ function auth_redirect() { $secure = ( is_ssl() || force_ssl_admin() ); /** - * Filter whether to use a secure authentication redirect. + * Filters whether to use a secure authentication redirect. * * @since 3.1.0 * @@ -984,18 +978,14 @@ function auth_redirect() { } } - if ( is_user_admin() ) { - $scheme = 'logged_in'; - } else { - /** - * Filter the authentication redirect scheme. - * - * @since 2.9.0 - * - * @param string $scheme Authentication redirect scheme. Default empty. - */ - $scheme = apply_filters( 'auth_redirect_scheme', '' ); - } + /** + * Filters the authentication redirect scheme. + * + * @since 2.9.0 + * + * @param string $scheme Authentication redirect scheme. Default empty. + */ + $scheme = apply_filters( 'auth_redirect_scheme', '' ); if ( $user_id = wp_validate_auth_cookie( '', $scheme) ) { /** @@ -1049,7 +1039,7 @@ if ( !function_exists('check_admin_referer') ) : */ function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) { if ( -1 == $action ) - _doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2' ); + _doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2.0' ); $adminurl = strtolower(admin_url()); $referer = strtolower(wp_get_referer()); @@ -1077,7 +1067,7 @@ endif; if ( !function_exists('check_ajax_referer') ) : /** - * Verifies the AJAX request to prevent processing requests external of the blog. + * Verifies the Ajax request to prevent processing requests external of the blog. * * @since 2.0.3 * @@ -1103,11 +1093,11 @@ function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) { $result = wp_verify_nonce( $nonce, $action ); /** - * Fires once the AJAX request has been validated or not. + * Fires once the Ajax request has been validated or not. * * @since 2.1.0 * - * @param string $action The AJAX nonce action. + * @param string $action The Ajax nonce action. * @param false|int $result False if the nonce is invalid, 1 if the nonce is valid and generated between * 0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago. */ @@ -1129,6 +1119,19 @@ if ( !function_exists('wp_redirect') ) : /** * Redirects to another page. * + * Note: wp_redirect() does not exit automatically, and should almost always be + * followed by a call to `exit;`: + * + * wp_redirect( $url ); + * exit; + * + * Exiting can also be selectively manipulated by using wp_redirect() as a conditional + * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_location'} hooks: + * + * if ( wp_redirect( $url ) { + * exit; + * } + * * @since 1.5.1 * * @global bool $is_IIS @@ -1141,7 +1144,7 @@ function wp_redirect($location, $status = 302) { global $is_IIS; /** - * Filter the redirect location. + * Filters the redirect location. * * @since 2.1.0 * @@ -1151,7 +1154,7 @@ function wp_redirect($location, $status = 302) { $location = apply_filters( 'wp_redirect', $location, $status ); /** - * Filter the redirect status code. + * Filters the redirect status code. * * @since 2.3.0 * @@ -1245,7 +1248,7 @@ function wp_safe_redirect($location, $status = 302) { $location = wp_sanitize_redirect($location); /** - * Filter the redirect fallback URL for when the provided redirect is not safe (local). + * Filters the redirect fallback URL for when the provided redirect is not safe (local). * * @since 4.3.0 * @@ -1309,7 +1312,7 @@ function wp_validate_redirect($location, $default = '') { $wpp = parse_url(home_url()); /** - * Filter the whitelist of hosts to redirect to. + * Filters the whitelist of hosts to redirect to. * * @since 2.3.0 * @@ -1337,7 +1340,7 @@ if ( ! function_exists('wp_notify_postauthor') ) : */ function wp_notify_postauthor( $comment_id, $deprecated = null ) { if ( null !== $deprecated ) { - _deprecated_argument( __FUNCTION__, '3.8' ); + _deprecated_argument( __FUNCTION__, '3.8.0' ); } $comment = get_comment( $comment_id ); @@ -1354,7 +1357,7 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { } /** - * Filter the list of email addresses to receive a comment notification. + * Filters the list of email addresses to receive a comment notification. * * By default, only post authors are notified of comments. This filter allows * others to be added. @@ -1376,7 +1379,7 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { $emails = array_flip( $emails ); /** - * Filter whether to notify comment authors of their comments on their own posts. + * Filters whether to notify comment authors of their comments on their own posts. * * By default, comment authors aren't notified of their comments on their own * posts. This filter allows you to override that. @@ -1482,7 +1485,7 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { $message_headers .= $reply_to . "\n"; /** - * Filter the comment notification email text. + * Filters the comment notification email text. * * @since 1.5.2 * @@ -1492,7 +1495,7 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { $notify_message = apply_filters( 'comment_notification_text', $notify_message, $comment->comment_ID ); /** - * Filter the comment notification email subject. + * Filters the comment notification email subject. * * @since 1.5.2 * @@ -1502,7 +1505,7 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { $subject = apply_filters( 'comment_notification_subject', $subject, $comment->comment_ID ); /** - * Filter the comment notification email headers. + * Filters the comment notification email headers. * * @since 1.5.2 * @@ -1539,7 +1542,7 @@ function wp_notify_moderator($comment_id) { $maybe_notify = get_option( 'moderation_notify' ); /** - * Filter whether to send the site moderator email notifications, overriding the site setting. + * Filters whether to send the site moderator email notifications, overriding the site setting. * * @since 4.4.0 * @@ -1614,7 +1617,7 @@ function wp_notify_moderator($comment_id) { $message_headers = ''; /** - * Filter the list of recipients for comment moderation emails. + * Filters the list of recipients for comment moderation emails. * * @since 3.7.0 * @@ -1624,7 +1627,7 @@ function wp_notify_moderator($comment_id) { $emails = apply_filters( 'comment_moderation_recipients', $emails, $comment_id ); /** - * Filter the comment moderation email text. + * Filters the comment moderation email text. * * @since 1.5.2 * @@ -1634,7 +1637,7 @@ function wp_notify_moderator($comment_id) { $notify_message = apply_filters( 'comment_moderation_text', $notify_message, $comment_id ); /** - * Filter the comment moderation email subject. + * Filters the comment moderation email subject. * * @since 1.5.2 * @@ -1644,7 +1647,7 @@ function wp_notify_moderator($comment_id) { $subject = apply_filters( 'comment_moderation_subject', $subject, $comment_id ); /** - * Filter the comment moderation email headers. + * Filters the comment moderation email headers. * * @since 2.8.0 * @@ -1673,11 +1676,13 @@ function wp_password_change_notification( $user ) { // send a copy of password change notification to the admin // but check to see if it's the admin whose password we're changing, and skip this if ( 0 !== strcasecmp( $user->user_email, get_option( 'admin_email' ) ) ) { - $message = sprintf(__('Password Lost and Changed for user: %s'), $user->user_login) . "\r\n"; + /* translators: %s: user name */ + $message = sprintf( __( 'Password changed for user: %s' ), $user->user_login ) . "\r\n"; // 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. $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); - wp_mail(get_option('admin_email'), sprintf(__('[%s] Password Lost/Changed'), $blogname), $message); + /* translators: %s: site title */ + wp_mail( get_option( 'admin_email' ), sprintf( __( '[%s] Password Changed' ), $blogname ), $message ); } } endif; @@ -1691,6 +1696,7 @@ if ( !function_exists('wp_new_user_notification') ) : * @since 2.0.0 * @since 4.3.0 The `$plaintext_pass` parameter was changed to `$notify`. * @since 4.3.1 The `$plaintext_pass` parameter was deprecated. `$notify` added as a third parameter. + * @since 4.6.0 The `$notify` parameter accepts 'user' for sending notification only to the user created. * * @global wpdb $wpdb WordPress database object for queries. * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance. @@ -1698,7 +1704,7 @@ if ( !function_exists('wp_new_user_notification') ) : * @param int $user_id User ID. * @param null $deprecated Not used (argument deprecated). * @param string $notify Optional. Type of notification that should happen. Accepts 'admin' or an empty - * string (admin only), or 'both' (admin and user). Default empty. + * string (admin only), 'user', or 'both' (admin and user). Default empty. */ function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) { if ( $deprecated !== null ) { @@ -1712,11 +1718,13 @@ function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) // we want to reverse this for the plain text arena of emails. $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); - $message = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n"; - $message .= sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n"; - $message .= sprintf(__('Email: %s'), $user->user_email) . "\r\n"; + if ( 'user' !== $notify ) { + $message = sprintf( __( 'New user registration on your site %s:' ), $blogname ) . "\r\n\r\n"; + $message .= sprintf( __( 'Username: %s' ), $user->user_login ) . "\r\n\r\n"; + $message .= sprintf( __( 'Email: %s' ), $user->user_email ) . "\r\n"; - @wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message); + @wp_mail( get_option( 'admin_email' ), sprintf( __( '[%s] New User Registration' ), $blogname ), $message ); + } // `$deprecated was pre-4.3 `$plaintext_pass`. An empty `$plaintext_pass` didn't sent a user notifcation. if ( 'admin' === $notify || ( empty( $deprecated ) && empty( $notify ) ) ) { @@ -1760,7 +1768,7 @@ if ( !function_exists('wp_nonce_tick') ) : */ function wp_nonce_tick() { /** - * Filter the lifespan of nonces in seconds. + * Filters the lifespan of nonces in seconds. * * @since 2.5.0 * @@ -1792,7 +1800,7 @@ function wp_verify_nonce( $nonce, $action = -1 ) { $uid = (int) $user->ID; if ( ! $uid ) { /** - * Filter whether the user who generated the nonce is logged out. + * Filters whether the user who generated the nonce is logged out. * * @since 3.5.0 * @@ -1904,7 +1912,7 @@ function wp_salt( $scheme = 'auth' ) { static $cached_salts = array(); if ( isset( $cached_salts[ $scheme ] ) ) { /** - * Filter the WordPress salt. + * Filters the WordPress salt. * * @since 2.5.0 * @@ -2051,7 +2059,7 @@ function wp_check_password($password, $hash, $user_id = '') { } /** - * Filter whether the plaintext password matches the encrypted password. + * Filters whether the plaintext password matches the encrypted password. * * @since 2.5.0 * @@ -2104,7 +2112,7 @@ function wp_generate_password( $length = 12, $special_chars = true, $extra_speci } /** - * Filter the randomly-generated password. + * Filters the randomly-generated password. * * @since 3.0.0 * @@ -2293,7 +2301,7 @@ function get_avatar( $id_or_email, $size = 96, $default = '', $alt = '', $args = } /** - * Filter whether to retrieve the avatar URL early. + * Filters whether to retrieve the avatar URL early. * * Passing a non-null value will effectively short-circuit get_avatar(), passing * the value through the {@see 'get_avatar'} filter and returning early. @@ -2352,7 +2360,7 @@ function get_avatar( $id_or_email, $size = 96, $default = '', $alt = '', $args = ); /** - * Filter the avatar to retrieve. + * Filters the avatar to retrieve. * * @since 2.5.0 * @since 4.2.0 The `$args` parameter was added.