Make WordPress Core

Changeset 52393


Ignore:
Timestamp:
12/20/2021 07:31:37 PM (3 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.