Make WordPress Core

Ticket #54659: 54659.diff

File 54659.diff, 16.6 KB (added by SergeyBiryukov, 3 years ago)
  • src/wp-includes/class-simplepie.php

     
    460460        public $error;
    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()
    465472         * @access private
     
    944951        }
    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         *
    949989         * @param bool $enable Sort as reverse chronological order.
     
    11811221                        $this->strip_attributes(false);
    11821222                        $this->add_attributes(false);
    11831223                        $this->set_image_handler(false);
     1224                        $this->set_https_domains(array());
    11841225                }
    11851226        }
    11861227
     
    12841325        }
    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         *
    12891343         * @param string $page Web-accessible path to the handler_image.php file.
     
    14081462                        // Decide whether to enable caching
    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
    14151469                        // Fetch the data via SimplePie_File into $this->raw_data
     
    15491603         * Fetch the data via SimplePie_File
    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         */
    15551609        protected function fetch_data(&$cache)
     
    16121666                                                }
    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)
    16171672                                                {
     
    16661721                                $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
    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)))
    16711728                {
     
    17731830        }
    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         *
    17781845         * This is the same as the old `$feed->enable_xml_dump(true)`, but returns
     
    26152682                        }
    26162683                }
    26172684
    2618                 if (isset($this->data['headers']['link']) &&
    2619                     preg_match('/<([^>]+)>; rel='.preg_quote($rel).'/',
    2620                                $this->data['headers']['link'], $match))
     2685                if (isset($this->data['headers']['link']))
    26212686                {
    2622                         return array($match[1]);
     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                        }
    26232695                }
    2624                 else if (isset($this->data['links'][$rel]))
     2696
     2697                if (isset($this->data['links'][$rel]))
    26252698                {
    26262699                        return $this->data['links'][$rel];
    26272700                }
  • src/wp-includes/SimplePie/Cache/Redis.php

     
    152152        if ($data !== false) {
    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;
    158158        }
  • src/wp-includes/SimplePie/Enclosure.php

     
    11521152                // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
    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
    11581163                                case 'aac':
  • src/wp-includes/SimplePie/File.php

     
    106106                                curl_setopt($fp, CURLOPT_FAILONERROR, 1);
    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);
    112112                                foreach ($curl_options as $curl_param => $curl_value) {
     
    119119                                        curl_setopt($fp, CURLOPT_ENCODING, 'none');
    120120                                        $this->headers = curl_exec($fp);
    121121                                }
     122                                $this->status_code = curl_getinfo($fp, CURLINFO_HTTP_CODE);
    122123                                if (curl_errno($fp))
    123124                                {
    124125                                        $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
  • src/wp-includes/SimplePie/HTTP/Parser.php

     
    507507        {
    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);
     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);
    512513                }
    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);
     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;
    517519        }
  • src/wp-includes/SimplePie/Item.php

     
    18031803                                                        }
    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']))
    18091809                                                        {
     
    24252425                                                }
    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']))
    24312431                                                {
     
    27902790                                        }
    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']))
    27962796                                        {
     
    28332833                                        }
    28342834                                        if (isset($link['attribs']['']['length']))
    28352835                                        {
    2836                                                 $length = ceil($link['attribs']['']['length']);
     2836                                                $length = intval($link['attribs']['']['length']);
    28372837                                        }
    28382838
    28392839                                        // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
     
    28622862                                        $width = null;
    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                                        {
    28672868                                                $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
     
    28682869                                        }
    28692870                                        if (isset($enclosure[0]['attribs']['']['length']))
    28702871                                        {
    2871                                                 $length = ceil($enclosure[0]['attribs']['']['length']);
     2872                                                $length = intval($enclosure[0]['attribs']['']['length']);
    28722873                                        }
    28732874
    28742875                                        // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
  • src/wp-includes/SimplePie/Locator.php

     
    6464        var $max_checked_feeds = 10;
    6565        var $force_fsockopen = false;
    6666        var $curl_options = array();
     67        var $dom;
    6768        protected $registry;
    6869
    6970        public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10, $force_fsockopen = false, $curl_options = array())
     
    7576                $this->force_fsockopen = $force_fsockopen;
    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                }
    8694                else
  • src/wp-includes/SimplePie/Misc.php

     
    22602260        {
    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}
  • src/wp-includes/SimplePie/Parser.php

     
    164164                        xml_set_element_handler($xml, 'tag_open', 'tag_close');
    165165
    166166                        // Parse!
    167                         if (!xml_parse($xml, $data, true))
     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))
    168171                        {
    169                                 $this->error_code = xml_get_error_code($xml);
    170                                 $this->error_string = xml_error_string($this->error_code);
     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);
    175193                        $this->current_byte = xml_get_current_byte_index($xml);
  • src/wp-includes/SimplePie/Registry.php

     
    208208                        {
    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                                        {
    214215                                                $result = @call_user_func_array(array($class, 'create'), $parameters);
  • src/wp-includes/SimplePie/Sanitize.php

     
    7171        var $useragent = '';
    7272        var $force_fsockopen = false;
    7373        var $replace_url_attributes = null;
     74        var $registry;
    7475
     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();
     83
    7584        public function __construct()
    7685        {
    7786                // Set defaults
     
    241250                $this->replace_url_attributes = (array) $element_attribute;
    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        {
    246317                $data = trim($data);
     
    443514                                                $value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base));
    444515                                                if ($value !== false)
    445516                                                {
     517                                                        $value = $this->https_url($value);
    446518                                                        $element->setAttribute($attribute, $value);
    447519                                                }
    448520                                        }