WordPress.org

Make WordPress Core


Ignore:
Timestamp:
04/07/2015 08:09:46 PM (5 years ago)
Author:
boonebgorges
Message:

Improve handling of incomplete From and Content-Type headers in wp_mail().

When an incomplete header is provided (eg, 'From' with an email address but no
name), ensure that the WP defaults are filled in properly.

Props valendesigns.
Fixes #30266.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/pluggable.php

    r32045 r32070  
    303303                    // Mainly for legacy -- process a From: header if it's there
    304304                    case 'from':
    305                         if ( strpos($content, '<' ) !== false ) {
    306                             // So... making my life hard again?
    307                             $from_name = substr( $content, 0, strpos( $content, '<' ) - 1 );
    308                             $from_name = str_replace( '"', '', $from_name );
    309                             $from_name = trim( $from_name );
    310 
    311                             $from_email = substr( $content, strpos( $content, '<' ) + 1 );
     305                        $bracket_pos = strpos( $content, '<' );
     306                        if ( $bracket_pos !== false ) {
     307                            // Text before the bracketed email is the "From" name.
     308                            if ( $bracket_pos > 0 ) {
     309                                $from_name = substr( $content, 0, $bracket_pos - 1 );
     310                                $from_name = str_replace( '"', '', $from_name );
     311                                $from_name = trim( $from_name );
     312                            }
     313
     314                            $from_email = substr( $content, $bracket_pos + 1 );
    312315                            $from_email = str_replace( '>', '', $from_email );
    313316                            $from_email = trim( $from_email );
    314                         } else {
     317
     318                        // Avoid setting an empty $from_email.
     319                        } elseif ( '' !== trim( $content ) ) {
    315320                            $from_email = trim( $content );
    316321                        }
     
    318323                    case 'content-type':
    319324                        if ( strpos( $content, ';' ) !== false ) {
    320                             list( $type, $charset ) = explode( ';', $content );
     325                            list( $type, $charset_content ) = explode( ';', $content );
    321326                            $content_type = trim( $type );
    322                             if ( false !== stripos( $charset, 'charset=' ) ) {
    323                                 $charset = trim( str_replace( array( 'charset=', '"' ), '', $charset ) );
    324                             } elseif ( false !== stripos( $charset, 'boundary=' ) ) {
    325                                 $boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset ) );
     327                            if ( false !== stripos( $charset_content, 'charset=' ) ) {
     328                                $charset = trim( str_replace( array( 'charset=', '"' ), '', $charset_content ) );
     329                            } elseif ( false !== stripos( $charset_content, 'boundary=' ) ) {
     330                                $boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset_content ) );
    326331                                $charset = '';
    327332                            }
    328                         } else {
     333
     334                        // Avoid setting an empty $content_type.
     335                        } elseif ( '' !== trim( $content ) ) {
    329336                            $content_type = trim( $content );
    330337                        }
Note: See TracChangeset for help on using the changeset viewer.