Make WordPress Core

Changeset 52393


Ignore:
Timestamp:
12/20/2021 07:31:37 PM (5 years ago)
Author:
SergeyBiryukov
Message:

External Libraries: Update the SimplePie library to version 1.5.7.

This version shows significant improvements in the compatibility of SimplePie with PHP 8.0, 8.1, and even contains an initial PHP 8.2 fix. The release also contains a number of other bug fixes.

Release notes: https://github.com/simplepie/simplepie/releases/tag/1.5.7

For a full list of changes in this update, see the SimplePie GitHub:
https://github.com/simplepie/simplepie/compare/1.5.6...1.5.7

Follow-up to [47733], [49176].

Props jrf, SergeyBiryukov.
Fixes #54659.

Location:
trunk/src/wp-includes
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/SimplePie/Cache/Redis.php

    r47733 r52393  
    153153            $return = $this->cache->set($this->name, $data);
    154154            if ($this->options['expire']) {
    155                 return $this->cache->expire($this->name, $this->ttl);
     155                return $this->cache->expire($this->name, $this->options['expire']);
    156156            }
    157157            return $return;
  • trunk/src/wp-includes/SimplePie/Enclosure.php

    r47733 r52393  
    11531153                if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
    11541154                {
    1155                         switch (strtolower($this->get_extension()))
     1155                        $extension = $this->get_extension();
     1156                        if ($extension === null) {
     1157                                return null;
     1158                        }
     1159
     1160                        switch (strtolower($extension))
    11561161                        {
    11571162                                // Audio mime-types
  • trunk/src/wp-includes/SimplePie/File.php

    r49176 r52393  
    107107                                curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
    108108                                curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
    109                                 curl_setopt($fp, CURLOPT_REFERER, $url);
     109                                curl_setopt($fp, CURLOPT_REFERER, SimplePie_Misc::url_remove_credentials($url));
    110110                                curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
    111111                                curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
     
    120120                                        $this->headers = curl_exec($fp);
    121121                                }
     122                                $this->status_code = curl_getinfo($fp, CURLINFO_HTTP_CODE);
    122123                                if (curl_errno($fp))
    123124                                {
  • trunk/src/wp-includes/SimplePie/HTTP/Parser.php

    r47733 r52393  
    508508                $data = explode("\r\n\r\n", $headers, $count);
    509509                $data = array_pop($data);
    510                 if (false !== stripos($data, "HTTP/1.0 200 Connection established\r\n\r\n")) {
    511                         $data = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $data);
    512                 }
    513                 if (false !== stripos($data, "HTTP/1.1 200 Connection established\r\n\r\n")) {
    514                         $data = str_ireplace("HTTP/1.1 200 Connection established\r\n\r\n", '', $data);
     510                if (false !== stripos($data, "HTTP/1.0 200 Connection established\r\n")) {
     511                        $exploded = explode("\r\n\r\n", $data, 2);
     512                        $data = end($exploded);
     513                }
     514                if (false !== stripos($data, "HTTP/1.1 200 Connection established\r\n")) {
     515                        $exploded = explode("\r\n\r\n", $data, 2);
     516                        $data = end($exploded);
    515517                }
    516518                return $data;
  • trunk/src/wp-includes/SimplePie/Item.php

    r47733 r52393  
    18041804                                                        if (isset($content['attribs']['']['fileSize']))
    18051805                                                        {
    1806                                                                 $length = ceil($content['attribs']['']['fileSize']);
     1806                                                                $length = intval($content['attribs']['']['fileSize']);
    18071807                                                        }
    18081808                                                        if (isset($content['attribs']['']['medium']))
     
    24262426                                                if (isset($content['attribs']['']['fileSize']))
    24272427                                                {
    2428                                                         $length = ceil($content['attribs']['']['fileSize']);
     2428                                                        $length = intval($content['attribs']['']['fileSize']);
    24292429                                                }
    24302430                                                if (isset($content['attribs']['']['medium']))
     
    27912791                                        if (isset($link['attribs']['']['length']))
    27922792                                        {
    2793                                                 $length = ceil($link['attribs']['']['length']);
     2793                                                $length = intval($link['attribs']['']['length']);
    27942794                                        }
    27952795                                        if (isset($link['attribs']['']['title']))
     
    28342834                                        if (isset($link['attribs']['']['length']))
    28352835                                        {
    2836                                                 $length = ceil($link['attribs']['']['length']);
     2836                                                $length = intval($link['attribs']['']['length']);
    28372837                                        }
    28382838
     
    28632863
    28642864                                        $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
     2865                                        $url = $this->feed->sanitize->https_url($url);
    28652866                                        if (isset($enclosure[0]['attribs']['']['type']))
    28662867                                        {
     
    28692870                                        if (isset($enclosure[0]['attribs']['']['length']))
    28702871                                        {
    2871                                                 $length = ceil($enclosure[0]['attribs']['']['length']);
     2872                                                $length = intval($enclosure[0]['attribs']['']['length']);
    28722873                                        }
    28732874
  • trunk/src/wp-includes/SimplePie/Locator.php

    r49176 r52393  
    6565        var $force_fsockopen = false;
    6666        var $curl_options = array();
     67        var $dom;
    6768        protected $registry;
    6869
     
    7677                $this->curl_options = $curl_options;
    7778
    78                 if (class_exists('DOMDocument'))
     79                if (class_exists('DOMDocument') && $this->file->body != '')
    7980                {
    8081                        $this->dom = new DOMDocument();
    8182
    8283                        set_error_handler(array('SimplePie_Misc', 'silence_errors'));
    83                         $this->dom->loadHTML($this->file->body);
     84                        try
     85                        {
     86                                $this->dom->loadHTML($this->file->body);
     87                        }
     88                        catch (Throwable $ex)
     89                        {
     90                                $this->dom = null;
     91                        }
    8492                        restore_error_handler();
    8593                }
  • trunk/src/wp-includes/SimplePie/Misc.php

    r49176 r52393  
    22612261                // No-op
    22622262        }
     2263
     2264        /**
     2265         * Sanitize a URL by removing HTTP credentials.
     2266         * @param string $url the URL to sanitize.
     2267         * @return string the same URL without HTTP credentials.
     2268         */
     2269        public static function url_remove_credentials($url)
     2270        {
     2271                return preg_replace('#^(https?://)[^/:@]+:[^/:@]+@#i', '$1', $url);
     2272        }
    22632273}
  • trunk/src/wp-includes/SimplePie/Parser.php

    r47733 r52393  
    165165
    166166                        // Parse!
    167                         if (!xml_parse($xml, $data, true))
    168                         {
    169                                 $this->error_code = xml_get_error_code($xml);
    170                                 $this->error_string = xml_error_string($this->error_code);
     167                        $wrapper = @is_writable(sys_get_temp_dir()) ? 'php://temp' : 'php://memory';
     168                        if (($stream = fopen($wrapper, 'r+')) &&
     169                                fwrite($stream, $data) &&
     170                                rewind($stream))
     171                        {
     172                                //Parse by chunks not to use too much memory
     173                                do
     174                                {
     175                                        $stream_data = fread($stream, 1048576);
     176                                        if (!xml_parse($xml, $stream_data === false ? '' : $stream_data, feof($stream)))
     177                                        {
     178                                                $this->error_code = xml_get_error_code($xml);
     179                                                $this->error_string = xml_error_string($this->error_code);
     180                                                $return = false;
     181                                                break;
     182                                        }
     183                                } while (!feof($stream));
     184                                fclose($stream);
     185                        }
     186                        else
     187                        {
    171188                                $return = false;
    172189                        }
     190
    173191                        $this->current_line = xml_get_current_line_number($xml);
    174192                        $this->current_column = xml_get_current_column_number($xml);
  • trunk/src/wp-includes/SimplePie/Registry.php

    r47733 r52393  
    209209                                case 'Cache':
    210210                                        // For backwards compatibility with old non-static
    211                                         // Cache::create() methods
     211                                        // Cache::create() methods in PHP < 8.0.
     212                                        // No longer supported as of PHP 8.0.
    212213                                        if ($method === 'get_handler')
    213214                                        {
  • trunk/src/wp-includes/SimplePie/Sanitize.php

    r47733 r52393  
    7272        var $force_fsockopen = false;
    7373        var $replace_url_attributes = null;
     74        var $registry;
     75
     76        /**
     77         * List of domains for which to force HTTPS.
     78         * @see SimplePie_Sanitize::set_https_domains()
     79         * Array is a tree split at DNS levels. Example:
     80         * array('biz' => true, 'com' => array('example' => true), 'net' => array('example' => array('www' => true)))
     81         */
     82        var $https_domains = array();
    7483
    7584        public function __construct()
     
    242251        }
    243252
     253        /**
     254         * Set the list of domains for which to force HTTPS.
     255         * @see SimplePie_Misc::https_url()
     256         * Example array('biz', 'example.com', 'example.org', 'www.example.net');
     257         */
     258        public function set_https_domains($domains)
     259        {
     260                $this->https_domains = array();
     261                foreach ($domains as $domain)
     262                {
     263                        $domain = trim($domain, ". \t\n\r\0\x0B");
     264                        $segments = array_reverse(explode('.', $domain));
     265                        $node =& $this->https_domains;
     266                        foreach ($segments as $segment)
     267                        {//Build a tree
     268                                if ($node === true)
     269                                {
     270                                        break;
     271                                }
     272                                if (!isset($node[$segment]))
     273                                {
     274                                        $node[$segment] = array();
     275                                }
     276                                $node =& $node[$segment];
     277                        }
     278                        $node = true;
     279                }
     280        }
     281
     282        /**
     283         * Check if the domain is in the list of forced HTTPS.
     284         */
     285        protected function is_https_domain($domain)
     286        {
     287                $domain = trim($domain, '. ');
     288                $segments = array_reverse(explode('.', $domain));
     289                $node =& $this->https_domains;
     290                foreach ($segments as $segment)
     291                {//Explore the tree
     292                        if (isset($node[$segment]))
     293                        {
     294                                $node =& $node[$segment];
     295                        }
     296                        else
     297                        {
     298                                break;
     299                        }
     300                }
     301                return $node === true;
     302        }
     303
     304        /**
     305         * Force HTTPS for selected Web sites.
     306         */
     307        public function https_url($url)
     308        {
     309                return (strtolower(substr($url, 0, 7)) === 'http://') &&
     310                        $this->is_https_domain(parse_url($url, PHP_URL_HOST)) ?
     311                        substr_replace($url, 's', 4, 0) :       //Add the 's' to HTTPS
     312                        $url;
     313        }
     314
    244315        public function sanitize($data, $type, $base = '')
    245316        {
     
    444515                                                if ($value !== false)
    445516                                                {
     517                                                        $value = $this->https_url($value);
    446518                                                        $element->setAttribute($attribute, $value);
    447519                                                }
  • trunk/src/wp-includes/class-simplepie.php

    r49176 r52393  
    461461
    462462        /**
     463         * @var int HTTP status code
     464         * @see SimplePie::status_code()
     465         * @access private
     466         */
     467        public $status_code;
     468
     469        /**
    463470         * @var object Instance of SimplePie_Sanitize (or other class)
    464471         * @see SimplePie::set_sanitize_class()
     
    945952
    946953        /**
     954         * Return the filename (i.e. hash, without path and without extension) of the file to cache a given URL.
     955         * @param string $url The URL of the feed to be cached.
     956         * @return string A filename (i.e. hash, without path and without extension).
     957         */
     958        public function get_cache_filename($url)
     959        {
     960                // Append custom parameters to the URL to avoid cache pollution in case of multiple calls with different parameters.
     961                $url .= $this->force_feed ? '#force_feed' : '';
     962                $options = array();
     963                if ($this->timeout != 10)
     964                {
     965                        $options[CURLOPT_TIMEOUT] = $this->timeout;
     966                }
     967                if ($this->useragent !== SIMPLEPIE_USERAGENT)
     968                {
     969                        $options[CURLOPT_USERAGENT] = $this->useragent;
     970                }
     971                if (!empty($this->curl_options))
     972                {
     973                        foreach ($this->curl_options as $k => $v)
     974                        {
     975                                $options[$k] = $v;
     976                        }
     977                }
     978                if (!empty($options))
     979                {
     980                        ksort($options);
     981                        $url .= '#' . urlencode(var_export($options, true));
     982                }
     983                return call_user_func($this->cache_name_function, $url);
     984        }
     985
     986        /**
    947987         * Set whether feed items should be sorted into reverse chronological order
    948988         *
     
    11821222                        $this->add_attributes(false);
    11831223                        $this->set_image_handler(false);
     1224                        $this->set_https_domains(array());
    11841225                }
    11851226        }
     
    12851326
    12861327        /**
     1328         * Set the list of domains for which to force HTTPS.
     1329         * @see SimplePie_Sanitize::set_https_domains()
     1330         * @param array List of HTTPS domains. Example array('biz', 'example.com', 'example.org', 'www.example.net').
     1331         */
     1332        public function set_https_domains($domains = array())
     1333        {
     1334                if (is_array($domains))
     1335                {
     1336                        $this->sanitize->set_https_domains($domains);
     1337                }
     1338        }
     1339
     1340        /**
    12871341         * Set the handler to enable the display of cached images.
    12881342         *
     
    14091463                        if ($this->cache && $parsed_feed_url['scheme'] !== '')
    14101464                        {
    1411                                 $url = $this->feed_url . ($this->force_feed ? '#force_feed' : '');
    1412                                 $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $url), 'spc'));
     1465                                $filename = $this->get_cache_filename($this->feed_url);
     1466                                $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $filename, 'spc'));
    14131467                        }
    14141468
     
    15501604         *
    15511605         * If the data is already cached, attempt to fetch it from there instead
    1552          * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache
     1606         * @param SimplePie_Cache_Base|false $cache Cache handler, or false to not load from the cache
    15531607         * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type
    15541608         */
     
    16131667
    16141668                                                $file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
     1669                                                $this->status_code = $file->status_code;
    16151670
    16161671                                                if ($file->success)
     
    16671722                        }
    16681723                }
     1724                $this->status_code = $file->status_code;
     1725
    16691726                // If the file connection has an error, set SimplePie::error to that and quit
    16701727                if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
     
    17741831
    17751832        /**
     1833         * Get the last HTTP status code
     1834         *
     1835         * @return int Status code
     1836         */
     1837        public function status_code()
     1838        {
     1839                return $this->status_code;
     1840        }
     1841
     1842        /**
    17761843         * Get the raw XML
    17771844         *
     
    26162683                }
    26172684
    2618                 if (isset($this->data['headers']['link']) &&
    2619                     preg_match('/<([^>]+)>; rel='.preg_quote($rel).'/',
    2620                                $this->data['headers']['link'], $match))
    2621                 {
    2622                         return array($match[1]);
    2623                 }
    2624                 else if (isset($this->data['links'][$rel]))
     2685                if (isset($this->data['headers']['link']))
     2686                {
     2687                        $link_headers = $this->data['headers']['link'];
     2688                        if (is_string($link_headers)) {
     2689                                $link_headers = array($link_headers);
     2690                        }
     2691                        $matches = preg_filter('/<([^>]+)>; rel='.preg_quote($rel).'/', '$1', $link_headers);
     2692                        if (!empty($matches)) {
     2693                                return $matches;
     2694                        }
     2695                }
     2696
     2697                if (isset($this->data['links'][$rel]))
    26252698                {
    26262699                        return $this->data['links'][$rel];
Note: See TracChangeset for help on using the changeset viewer.