Making WordPress.org

Changeset 7041


Ignore:
Timestamp:
04/05/2018 08:01:26 PM (8 years ago)
Author:
ocean90
Message:

Slack/Trac: Add support for Multipart content type which is used by newer Trac versions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/common/includes/slack/trac/comment-handler.php

    r3087 r7041  
    4848                        } elseif ( 0 === strpos( $line, 'Content-Transfer-Encoding: base64' ) ) {
    4949                                $base64 = true;
     50                        } elseif ( 0 === strpos( $line, 'Content-Type: multipart/' ) ) {
     51                                $multipart = true;
     52                                $content_type = $line;
     53
     54                                $content_type_lines = $lines;
     55                                while ( $content_type_lines && ! preg_match( '/(^[\x21-\x7E][^:]+):/', current( $content_type_lines ) ) ) {
     56                                        $content_type .= array_shift( $content_type_lines );
     57                                }
     58                                unset( $content_type_lines );
     59
     60                                if ( preg_match('/boundary="?([a-zA-Z0-9\'()+_,-.\/:=?]+)"?/', $content_type, $matches ) ) {
     61                                        $boundary = $matches[1];
     62                                }
    5063                        } elseif ( 0 === strpos( $line, 'Subject:' ) ) {
    5164                                $subject = str_replace( 'Subject: ', '', $line );
     
    6679                if ( ! $base64 ) {
    6780                        array_shift( $lines );
     81                }
     82
     83                // Get the email body if multipart.
     84                if ( $multipart && $boundary ) {
     85                        // Split content by boundary.
     86                        $body = implode( "\n", $lines );
     87                        $body_parts = explode( '--' . $boundary, $body );
     88                        array_shift( $body_parts ); // Remove empty line.
     89                        array_pop( $body_parts ); // Remove --.
     90
     91                        // Assume that there's only one part and the first part is what we need.
     92                        $lines = explode( "\n", trim( $body_parts[0] ) );
     93
     94                        $base64 = false;
     95
     96                        // Trim off headers.
     97                        while ( $lines && '' !== current( $lines ) ) {
     98                                $line = array_shift( $lines );#
     99                                if ( 0 === strpos( $line, 'Content-Transfer-Encoding: base64' ) ) {
     100                                        $base64 = true;
     101                                }
     102                        }
     103
     104                        if ( $base64 ) {
     105                                $lines = explode( "\n", base64_decode( implode( "\n", $lines ) ) );
     106                        }
     107
     108                        // Remove empty line between headers and body if not base64.
     109                        if ( ! $base64 ) {
     110                                array_shift( $lines );
     111                        }
    68112                }
    69113
Note: See TracChangeset for help on using the changeset viewer.