Make WordPress Core

Ticket #36669: 36669.2.diff

File 36669.2.diff, 170.3 KB (added by desrosj, 4 years ago)
  • src/wp-includes/SimplePie/Author.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    114113                {
    115114                        return $this->name;
    116115                }
    117                 else
    118                 {
    119                         return null;
    120                 }
     116
     117                return null;
    121118        }
    122119
    123120        /**
     
    131128                {
    132129                        return $this->link;
    133130                }
    134                 else
    135                 {
    136                         return null;
    137                 }
     131
     132                return null;
    138133        }
    139134
    140135        /**
     
    148143                {
    149144                        return $this->email;
    150145                }
    151                 else
    152                 {
    153                         return null;
    154                 }
     146
     147                return null;
    155148        }
    156149}
    157 
  • src/wp-includes/SimplePie/Cache/Base.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
  • src/wp-includes/SimplePie/Cache/DB.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
  • src/wp-includes/SimplePie/Cache/File.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    102101         */
    103102        public function save($data)
    104103        {
    105                 if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
     104                if (file_exists($this->name) && is_writable($this->name) || file_exists($this->location) && is_writable($this->location))
    106105                {
    107106                        if ($data instanceof SimplePie)
    108107                        {
     
    136135         */
    137136        public function mtime()
    138137        {
    139                 if (file_exists($this->name))
    140                 {
    141                         return filemtime($this->name);
    142                 }
    143                 return false;
     138                return @filemtime($this->name);
    144139        }
    145140
    146141        /**
     
    150145         */
    151146        public function touch()
    152147        {
    153                 if (file_exists($this->name))
    154                 {
    155                         return touch($this->name);
    156                 }
    157                 return false;
     148                return @touch($this->name);
    158149        }
    159150
    160151        /**
  • src/wp-includes/SimplePie/Cache/Memcache.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    9594                                'prefix' => 'simplepie_',
    9695                        ),
    9796                );
    98                 $parsed = SimplePie_Cache::parse_URL($location);
    99                 $this->options['host'] = empty($parsed['host']) ? $this->options['host'] : $parsed['host'];
    100                 $this->options['port'] = empty($parsed['port']) ? $this->options['port'] : $parsed['port'];
    101                 $this->options['extras'] = array_merge($this->options['extras'], $parsed['extras']);
     97                $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
     98
    10299                $this->name = $this->options['extras']['prefix'] . md5("$name:$type");
    103100
    104101                $this->cache = new Memcache();
     
    147144
    148145                if ($data !== false)
    149146                {
    150                         // essentially ignore the mtime because Memcache expires on it's own
     147                        // essentially ignore the mtime because Memcache expires on its own
    151148                        return time();
    152149                }
    153150
     
    165162
    166163                if ($data !== false)
    167164                {
    168                         return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->duration);
     165                        return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']);
    169166                }
    170167
    171168                return false;
  • src/wp-includes/SimplePie/Cache/Memcached.php

     
     1<?php
     2/**
     3 * SimplePie
     4 *
     5 * A PHP-Based RSS and Atom Feed Framework.
     6 * Takes the hard work out of managing a complete RSS/Atom solution.
     7 *
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     9 * All rights reserved.
     10 *
     11 * Redistribution and use in source and binary forms, with or without modification, are
     12 * permitted provided that the following conditions are met:
     13 *
     14 *      * Redistributions of source code must retain the above copyright notice, this list of
     15 *        conditions and the following disclaimer.
     16 *
     17 *      * Redistributions in binary form must reproduce the above copyright notice, this list
     18 *        of conditions and the following disclaimer in the documentation and/or other materials
     19 *        provided with the distribution.
     20 *
     21 *      * Neither the name of the SimplePie Team nor the names of its contributors may be used
     22 *        to endorse or promote products derived from this software without specific prior
     23 *        written permission.
     24 *
     25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
     26 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
     27 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
     28 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     32 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     33 * POSSIBILITY OF SUCH DAMAGE.
     34 *
     35 * @package SimplePie
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     37 * @author Ryan Parman
     38 * @author Geoffrey Sneddon
     39 * @author Ryan McCue
     40 * @link http://simplepie.org/ SimplePie
     41 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
     42 */
     43
     44/**
     45 * Caches data to memcached
     46 *
     47 * Registered for URLs with the "memcached" protocol
     48 *
     49 * For example, `memcached://localhost:11211/?timeout=3600&prefix=sp_` will
     50 * connect to memcached on `localhost` on port 11211. All tables will be
     51 * prefixed with `sp_` and data will expire after 3600 seconds
     52 *
     53 * @package    SimplePie
     54 * @subpackage Caching
     55 * @author     Paul L. McNeely
     56 * @uses       Memcached
     57 */
     58class SimplePie_Cache_Memcached implements SimplePie_Cache_Base
     59{
     60    /**
     61     * Memcached instance
     62     * @var Memcached
     63     */
     64    protected $cache;
     65
     66    /**
     67     * Options
     68     * @var array
     69     */
     70    protected $options;
     71
     72    /**
     73     * Cache name
     74     * @var string
     75     */
     76    protected $name;
     77
     78    /**
     79     * Create a new cache object
     80     * @param string $location Location string (from SimplePie::$cache_location)
     81     * @param string $name     Unique ID for the cache
     82     * @param string $type     Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
     83     */
     84    public function __construct($location, $name, $type) {
     85        $this->options = array(
     86            'host'   => '127.0.0.1',
     87            'port'   => 11211,
     88            'extras' => array(
     89                'timeout' => 3600, // one hour
     90                'prefix'  => 'simplepie_',
     91            ),
     92        );
     93        $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
     94
     95        $this->name = $this->options['extras']['prefix'] . md5("$name:$type");
     96
     97        $this->cache = new Memcached();
     98        $this->cache->addServer($this->options['host'], (int)$this->options['port']);
     99    }
     100
     101    /**
     102     * Save data to the cache
     103     * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
     104     * @return bool Successfulness
     105     */
     106    public function save($data) {
     107        if ($data instanceof SimplePie) {
     108            $data = $data->data;
     109        }
     110
     111        return $this->setData(serialize($data));
     112    }
     113
     114    /**
     115     * Retrieve the data saved to the cache
     116     * @return array Data for SimplePie::$data
     117     */
     118    public function load() {
     119        $data = $this->cache->get($this->name);
     120
     121        if ($data !== false) {
     122            return unserialize($data);
     123        }
     124        return false;
     125    }
     126
     127    /**
     128     * Retrieve the last modified time for the cache
     129     * @return int Timestamp
     130     */
     131    public function mtime() {
     132        $data = $this->cache->get($this->name . '_mtime');
     133        return (int) $data;
     134    }
     135
     136    /**
     137     * Set the last modified time to the current time
     138     * @return bool Success status
     139     */
     140    public function touch() {
     141        $data = $this->cache->get($this->name);
     142        return $this->setData($data);
     143    }
     144
     145    /**
     146     * Remove the cache
     147     * @return bool Success status
     148     */
     149    public function unlink() {
     150        return $this->cache->delete($this->name, 0);
     151    }
     152
     153    /**
     154     * Set the last modified time and data to Memcached
     155     * @return bool Success status
     156     */
     157    private function setData($data) {
     158
     159        if ($data !== false) {
     160            $this->cache->set($this->name . '_mtime', time(), (int)$this->options['extras']['timeout']);
     161            return $this->cache->set($this->name, $data, (int)$this->options['extras']['timeout']);
     162        }
     163
     164        return false;
     165    }
     166}
  • src/wp-includes/SimplePie/Cache/MySQL.php

    Property changes on: src/wp-includes/SimplePie/Cache/Memcached.php
    ___________________________________________________________________
    Added: svn:eol-style
    ## -0,0 +1 ##
    +native
    \ No newline at end of property
    Added: svn:executable
    ## -0,0 +1 ##
    +*
    \ No newline at end of property
     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    9493                        'path' => '',
    9594                        'extras' => array(
    9695                                'prefix' => '',
     96                                'cache_purge_time' => 2592000
    9797                        ),
    9898                );
    99                 $this->options = array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
    10099
     100                $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
     101
    101102                // Path is prefixed with a "/"
    102103                $this->options['dbname'] = substr($this->options['path'], 1);
    103104
     
    130131                        $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))');
    131132                        if ($query === false)
    132133                        {
     134                                trigger_error("Can't create " . $this->options['extras']['prefix'] . "cache_data table, check permissions", E_USER_WARNING);
    133135                                $this->mysql = null;
     136                                return;
    134137                        }
    135138                }
    136139
    137140                if (!in_array($this->options['extras']['prefix'] . 'items', $db))
    138141                {
    139                         $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))');
     142                        $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` MEDIUMBLOB NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))');
    140143                        if ($query === false)
    141144                        {
     145                                trigger_error("Can't create " . $this->options['extras']['prefix'] . "items table, check permissions", E_USER_WARNING);
    142146                                $this->mysql = null;
     147                                return;
    143148                        }
    144149                }
    145150        }
     
    157162                        return false;
    158163                }
    159164
     165                $query = $this->mysql->prepare('DELETE i, cd FROM `' . $this->options['extras']['prefix'] . 'cache_data` cd, ' .
     166                        '`' . $this->options['extras']['prefix'] . 'items` i ' .
     167                        'WHERE cd.id = i.feed_id ' .
     168                        'AND cd.mtime < (unix_timestamp() - :purge_time)');
     169                $query->bindValue(':purge_time', $this->options['extras']['cache_purge_time']);
     170
     171                if (!$query->execute())
     172                {
     173                        return false;
     174                }
     175
    160176                if ($data instanceof SimplePie)
    161177                {
    162178                        $data = clone $data;
     
    379395                {
    380396                        return $time;
    381397                }
    382                 else
    383                 {
    384                         return false;
    385                 }
     398
     399                return false;
    386400        }
    387401
    388402        /**
     
    400414                $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id');
    401415                $query->bindValue(':time', time());
    402416                $query->bindValue(':id', $this->id);
    403                 if ($query->execute() && $query->rowCount() > 0)
    404                 {
    405                         return true;
    406                 }
    407                 else
    408                 {
    409                         return false;
    410                 }
     417
     418                return $query->execute() && $query->rowCount() > 0;
    411419        }
    412420
    413421        /**
     
    426434                $query->bindValue(':id', $this->id);
    427435                $query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id');
    428436                $query2->bindValue(':id', $this->id);
    429                 if ($query->execute() && $query2->execute())
    430                 {
    431                         return true;
    432                 }
    433                 else
    434                 {
    435                         return false;
    436                 }
     437
     438                return $query->execute() && $query2->execute();
    437439        }
    438440}
  • src/wp-includes/SimplePie/Cache/Redis.php

     
     1<?php
     2
     3/**
     4 * SimplePie Redis Cache Extension
     5 *
     6 * @package SimplePie
     7 * @author Jan Kozak <galvani78@gmail.com>
     8 * @link http://galvani.cz/
     9 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
     10 * @version 0.2.9
     11 */
     12
     13
     14/**
     15 * Caches data to redis
     16 *
     17 * Registered for URLs with the "redis" protocol
     18 *
     19 * For example, `redis://localhost:6379/?timeout=3600&prefix=sp_&dbIndex=0` will
     20 * connect to redis on `localhost` on port 6379. All tables will be
     21 * prefixed with `simple_primary-` and data will expire after 3600 seconds
     22 *
     23 * @package SimplePie
     24 * @subpackage Caching
     25 * @uses Redis
     26 */
     27class SimplePie_Cache_Redis implements SimplePie_Cache_Base {
     28    /**
     29     * Redis instance
     30     *
     31     * @var \Redis
     32     */
     33    protected $cache;
     34
     35    /**
     36     * Options
     37     *
     38     * @var array
     39     */
     40    protected $options;
     41
     42    /**
     43     * Cache name
     44     *
     45     * @var string
     46     */
     47    protected $name;
     48
     49    /**
     50     * Cache Data
     51     *
     52     * @var type
     53     */
     54    protected $data;
     55
     56    /**
     57     * Create a new cache object
     58     *
     59     * @param string $location Location string (from SimplePie::$cache_location)
     60     * @param string $name Unique ID for the cache
     61     * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
     62     */
     63    public function __construct($location, $name, $options = null) {
     64        //$this->cache = \flow\simple\cache\Redis::getRedisClientInstance();
     65        $parsed = SimplePie_Cache::parse_URL($location);
     66        $redis = new Redis();
     67        $redis->connect($parsed['host'], $parsed['port']);
     68        if (isset($parsed['pass'])) {
     69            $redis->auth($parsed['pass']);
     70        }
     71        if (isset($parsed['path'])) {
     72            $redis->select((int)substr($parsed['path'], 1));
     73        }
     74        $this->cache = $redis;
     75
     76        if (!is_null($options) && is_array($options)) {
     77            $this->options = $options;
     78        } else {
     79            $this->options = array (
     80                'prefix' => 'rss:simple_primary:',
     81                'expire' => 0,
     82            );
     83        }
     84
     85        $this->name = $this->options['prefix'] . $name;
     86    }
     87
     88    /**
     89     * @param \Redis $cache
     90     */
     91    public function setRedisClient(\Redis $cache) {
     92        $this->cache = $cache;
     93    }
     94
     95    /**
     96     * Save data to the cache
     97     *
     98     * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
     99     * @return bool Successfulness
     100     */
     101    public function save($data) {
     102        if ($data instanceof SimplePie) {
     103            $data = $data->data;
     104        }
     105        $response = $this->cache->set($this->name, serialize($data));
     106        if ($this->options['expire']) {
     107            $this->cache->expire($this->name, $this->options['expire']);
     108        }
     109
     110        return $response;
     111    }
     112
     113    /**
     114     * Retrieve the data saved to the cache
     115     *
     116     * @return array Data for SimplePie::$data
     117     */
     118    public function load() {
     119        $data = $this->cache->get($this->name);
     120
     121        if ($data !== false) {
     122            return unserialize($data);
     123        }
     124        return false;
     125    }
     126
     127    /**
     128     * Retrieve the last modified time for the cache
     129     *
     130     * @return int Timestamp
     131     */
     132    public function mtime() {
     133
     134        $data = $this->cache->get($this->name);
     135
     136        if ($data !== false) {
     137            return time();
     138        }
     139
     140        return false;
     141    }
     142
     143    /**
     144     * Set the last modified time to the current time
     145     *
     146     * @return bool Success status
     147     */
     148    public function touch() {
     149
     150        $data = $this->cache->get($this->name);
     151
     152        if ($data !== false) {
     153            $return = $this->cache->set($this->name, $data);
     154            if ($this->options['expire']) {
     155                return $this->cache->expire($this->name, $this->ttl);
     156            }
     157            return $return;
     158        }
     159
     160        return false;
     161    }
     162
     163    /**
     164     * Remove the cache
     165     *
     166     * @return bool Success status
     167     */
     168    public function unlink() {
     169        return $this->cache->set($this->name, null);
     170    }
     171
     172}
  • src/wp-includes/SimplePie/Cache.php

    Property changes on: src/wp-includes/SimplePie/Cache/Redis.php
    ___________________________________________________________________
    Added: svn:eol-style
    ## -0,0 +1 ##
    +native
    \ No newline at end of property
     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    6261         * @var array
    6362         */
    6463        protected static $handlers = array(
    65                 'mysql' => 'SimplePie_Cache_MySQL',
    66                 'memcache' => 'SimplePie_Cache_Memcache',
     64                'mysql'     => 'SimplePie_Cache_MySQL',
     65                'memcache'  => 'SimplePie_Cache_Memcache',
     66                'memcached' => 'SimplePie_Cache_Memcached',
     67                'redis'     => 'SimplePie_Cache_Redis'
    6768        );
    6869
    6970        /**
  • src/wp-includes/SimplePie/Caption.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    132131                {
    133132                        return $this->endTime;
    134133                }
    135                 else
    136                 {
    137                         return null;
    138                 }
     134
     135                return null;
    139136        }
    140137
    141138        /**
     
    150147                {
    151148                        return $this->lang;
    152149                }
    153                 else
    154                 {
    155                         return null;
    156                 }
     150
     151                return null;
    157152        }
    158153
    159154        /**
     
    167162                {
    168163                        return $this->startTime;
    169164                }
    170                 else
    171                 {
    172                         return null;
    173                 }
     165
     166                return null;
    174167        }
    175168
    176169        /**
     
    184177                {
    185178                        return $this->text;
    186179                }
    187                 else
    188                 {
    189                         return null;
    190                 }
     180
     181                return null;
    191182        }
    192183
    193184        /**
     
    201192                {
    202193                        return $this->type;
    203194                }
    204                 else
    205                 {
    206                         return null;
    207                 }
     195
     196                return null;
    208197        }
    209198}
    210 
  • src/wp-includes/SimplePie/Category.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    5756        /**
    5857         * Category identifier
    5958         *
    60          * @var string
     59         * @var string|null
    6160         * @see get_term
    6261         */
    6362        var $term;
     
    6564        /**
    6665         * Categorization scheme identifier
    6766         *
    68          * @var string
     67         * @var string|null
    6968         * @see get_scheme()
    7069         */
    7170        var $scheme;
     
    7372        /**
    7473         * Human readable label
    7574         *
    76          * @var string
     75         * @var string|null
    7776         * @see get_label()
    7877         */
    7978        var $label;
    8079
    8180        /**
     81         * Category type
     82         *
     83         * category for <category>
     84         * subject for <dc:subject>
     85         *
     86         * @var string|null
     87         * @see get_type()
     88         */
     89        var $type;
     90
     91        /**
    8292         * Constructor, used to input the data
    8393         *
    84          * @param string $term
    85          * @param string $scheme
    86          * @param string $label
     94         * @param string|null $term
     95         * @param string|null $scheme
     96         * @param string|null $label
     97         * @param string|null $type
    8798         */
    88         public function __construct($term = null, $scheme = null, $label = null)
     99        public function __construct($term = null, $scheme = null, $label = null, $type = null)
    89100        {
    90101                $this->term = $term;
    91102                $this->scheme = $scheme;
    92103                $this->label = $label;
     104                $this->type = $type;
    93105        }
    94106
    95107        /**
     
    110122         */
    111123        public function get_term()
    112124        {
    113                 if ($this->term !== null)
    114                 {
    115                         return $this->term;
    116                 }
    117                 else
    118                 {
    119                         return null;
    120                 }
     125                return $this->term;
    121126        }
    122127
    123128        /**
     
    127132         */
    128133        public function get_scheme()
    129134        {
    130                 if ($this->scheme !== null)
    131                 {
    132                         return $this->scheme;
    133                 }
    134                 else
    135                 {
    136                         return null;
    137                 }
     135                return $this->scheme;
    138136        }
    139137
    140138        /**
    141139         * Get the human readable label
    142140         *
     141         * @param bool $strict
    143142         * @return string|null
    144143         */
    145         public function get_label()
     144        public function get_label($strict = false)
    146145        {
    147                 if ($this->label !== null)
     146                if ($this->label === null && $strict !== true)
    148147                {
    149                         return $this->label;
    150                 }
    151                 else
    152                 {
    153148                        return $this->get_term();
    154149                }
     150                return $this->label;
    155151        }
     152
     153        /**
     154         * Get the category type
     155         *
     156         * @return string|null
     157         */
     158        public function get_type()
     159        {
     160                return $this->type;
     161        }
    156162}
    157163
  • src/wp-includes/SimplePie/Content/Type/Sniffer.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    121120                                {
    122121                                        return $return;
    123122                                }
    124                                 else
    125                                 {
    126                                         return $official;
    127                                 }
     123
     124                                return $official;
    128125                        }
    129126                        elseif ($official === 'text/html')
    130127                        {
    131128                                return $this->feed_or_html();
    132129                        }
    133                         else
    134                         {
    135                                 return $official;
    136                         }
     130
     131                        return $official;
    137132                }
    138                 else
    139                 {
    140                         return $this->unknown();
    141                 }
     133
     134                return $this->unknown();
    142135        }
    143136
    144137        /**
     
    159152                {
    160153                        return 'application/octect-stream';
    161154                }
    162                 else
    163                 {
    164                         return 'text/plain';
    165                 }
     155
     156                return 'text/plain';
    166157        }
    167158
    168159        /**
     
    208199                {
    209200                        return 'image/vnd.microsoft.icon';
    210201                }
    211                 else
    212                 {
    213                         return $this->text_or_binary();
    214                 }
     202
     203                return $this->text_or_binary();
    215204        }
    216205
    217206        /**
     
    242231                {
    243232                        return 'image/vnd.microsoft.icon';
    244233                }
    245                 else
    246                 {
    247                         return false;
    248                 }
     234
     235                return false;
    249236        }
    250237
    251238        /**
     
    256243        public function feed_or_html()
    257244        {
    258245                $len = strlen($this->file->body);
    259                 $pos = strspn($this->file->body, "\x09\x0A\x0D\x20");
     246                $pos = strspn($this->file->body, "\x09\x0A\x0D\x20\xEF\xBB\xBF");
    260247
    261248                while ($pos < $len)
    262249                {
     
    329316                return 'text/html';
    330317        }
    331318}
    332 
  • src/wp-includes/SimplePie/Copyright.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    104103                {
    105104                        return $this->url;
    106105                }
    107                 else
    108                 {
    109                         return null;
    110                 }
     106
     107                return null;
    111108        }
    112109
    113110        /**
     
    121118                {
    122119                        return $this->label;
    123120                }
    124                 else
    125                 {
    126                         return null;
    127                 }
     121
     122                return null;
    128123        }
    129124}
    130 
  • src/wp-includes/SimplePie/Core.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2009, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
  • src/wp-includes/SimplePie/Credit.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    113112                {
    114113                        return $this->role;
    115114                }
    116                 else
    117                 {
    118                         return null;
    119                 }
     115
     116                return null;
    120117        }
    121118
    122119        /**
     
    130127                {
    131128                        return $this->scheme;
    132129                }
    133                 else
    134                 {
    135                         return null;
    136                 }
     130
     131                return null;
    137132        }
    138133
    139134        /**
     
    147142                {
    148143                        return $this->name;
    149144                }
    150                 else
    151                 {
    152                         return null;
    153                 }
     145
     146                return null;
    154147        }
    155148}
    156 
  • src/wp-includes/SimplePie/Decode/HTML/Entities.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    118117                        $this->consumed .= $this->data[$this->position];
    119118                        return $this->data[$this->position++];
    120119                }
    121                 else
    122                 {
    123                         return false;
    124                 }
     120
     121                return false;
    125122        }
    126123
    127124        /**
     
    140137                        $this->position += $len;
    141138                        return $data;
    142139                }
    143                 else
    144                 {
    145                         return false;
    146                 }
     140
     141                return false;
    147142        }
    148143
    149144        /**
     
    169164                        case "\x09":
    170165                        case "\x0A":
    171166                        case "\x0B":
    172                         case "\x0B":
    173167                        case "\x0C":
    174168                        case "\x20":
    175169                        case "\x3C":
     
    614608                }
    615609        }
    616610}
    617 
  • src/wp-includes/SimplePie/Enclosure.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    283282                {
    284283                        return $this->bitrate;
    285284                }
    286                 else
    287                 {
    288                         return null;
    289                 }
     285
     286                return null;
    290287        }
    291288
    292289        /**
     
    302299                {
    303300                        return $captions[$key];
    304301                }
    305                 else
    306                 {
    307                         return null;
    308                 }
     302
     303                return null;
    309304        }
    310305
    311306        /**
     
    319314                {
    320315                        return $this->captions;
    321316                }
    322                 else
    323                 {
    324                         return null;
    325                 }
     317
     318                return null;
    326319        }
    327320
    328321        /**
     
    338331                {
    339332                        return $categories[$key];
    340333                }
    341                 else
    342                 {
    343                         return null;
    344                 }
     334
     335                return null;
    345336        }
    346337
    347338        /**
     
    355346                {
    356347                        return $this->categories;
    357348                }
    358                 else
    359                 {
    360                         return null;
    361                 }
     349
     350                return null;
    362351        }
    363352
    364353        /**
     
    372361                {
    373362                        return $this->channels;
    374363                }
    375                 else
    376                 {
    377                         return null;
    378                 }
     364
     365                return null;
    379366        }
    380367
    381368        /**
     
    389376                {
    390377                        return $this->copyright;
    391378                }
    392                 else
    393                 {
    394                         return null;
    395                 }
     379
     380                return null;
    396381        }
    397382
    398383        /**
     
    408393                {
    409394                        return $credits[$key];
    410395                }
    411                 else
    412                 {
    413                         return null;
    414                 }
     396
     397                return null;
    415398        }
    416399
    417400        /**
     
    425408                {
    426409                        return $this->credits;
    427410                }
    428                 else
    429                 {
    430                         return null;
    431                 }
     411
     412                return null;
    432413        }
    433414
    434415        /**
     
    442423                {
    443424                        return $this->description;
    444425                }
    445                 else
    446                 {
    447                         return null;
    448                 }
     426
     427                return null;
    449428        }
    450429
    451430        /**
    452431         * Get the duration of the enclosure
    453432         *
    454          * @param string $convert Convert seconds into hh:mm:ss
     433         * @param bool $convert Convert seconds into hh:mm:ss
    455434         * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found)
    456435         */
    457436        public function get_duration($convert = false)
     
    463442                                $time = SimplePie_Misc::time_hms($this->duration);
    464443                                return $time;
    465444                        }
    466                         else
    467                         {
    468                                 return $this->duration;
    469                         }
     445
     446                        return $this->duration;
    470447                }
    471                 else
    472                 {
    473                         return null;
    474                 }
     448
     449                return null;
    475450        }
    476451
    477452        /**
     
    485460                {
    486461                        return $this->expression;
    487462                }
    488                 else
    489                 {
    490                         return 'full';
    491                 }
     463
     464                return 'full';
    492465        }
    493466
    494467        /**
     
    520493                {
    521494                        return $this->framerate;
    522495                }
    523                 else
    524                 {
    525                         return null;
    526                 }
     496
     497                return null;
    527498        }
    528499
    529500        /**
     
    550521                {
    551522                        return $hashes[$key];
    552523                }
    553                 else
    554                 {
    555                         return null;
    556                 }
     524
     525                return null;
    557526        }
    558527
    559528        /**
     
    567536                {
    568537                        return $this->hashes;
    569538                }
    570                 else
    571                 {
    572                         return null;
    573                 }
     539
     540                return null;
    574541        }
    575542
    576543        /**
     
    584551                {
    585552                        return $this->height;
    586553                }
    587                 else
    588                 {
    589                         return null;
    590                 }
     554
     555                return null;
    591556        }
    592557
    593558        /**
     
    602567                {
    603568                        return $this->lang;
    604569                }
    605                 else
    606                 {
    607                         return null;
    608                 }
     570
     571                return null;
    609572        }
    610573
    611574        /**
     
    621584                {
    622585                        return $keywords[$key];
    623586                }
    624                 else
    625                 {
    626                         return null;
    627                 }
     587
     588                return null;
    628589        }
    629590
    630591        /**
     
    638599                {
    639600                        return $this->keywords;
    640601                }
    641                 else
    642                 {
    643                         return null;
    644                 }
     602
     603                return null;
    645604        }
    646605
    647606        /**
     
    655614                {
    656615                        return $this->length;
    657616                }
    658                 else
    659                 {
    660                         return null;
    661                 }
     617
     618                return null;
    662619        }
    663620
    664621        /**
     
    672629                {
    673630                        return urldecode($this->link);
    674631                }
    675                 else
    676                 {
    677                         return null;
    678                 }
     632
     633                return null;
    679634        }
    680635
    681636        /**
     
    690645                {
    691646                        return $this->medium;
    692647                }
    693                 else
    694                 {
    695                         return null;
    696                 }
     648
     649                return null;
    697650        }
    698651
    699652        /**
     
    708661                {
    709662                        return $this->player;
    710663                }
    711                 else
    712                 {
    713                         return null;
    714                 }
     664
     665                return null;
    715666        }
    716667
    717668        /**
     
    727678                {
    728679                        return $ratings[$key];
    729680                }
    730                 else
    731                 {
    732                         return null;
    733                 }
     681
     682                return null;
    734683        }
    735684
    736685        /**
     
    744693                {
    745694                        return $this->ratings;
    746695                }
    747                 else
    748                 {
    749                         return null;
    750                 }
     696
     697                return null;
    751698        }
    752699
    753700        /**
     
    763710                {
    764711                        return $restrictions[$key];
    765712                }
    766                 else
    767                 {
    768                         return null;
    769                 }
     713
     714                return null;
    770715        }
    771716
    772717        /**
     
    780725                {
    781726                        return $this->restrictions;
    782727                }
    783                 else
    784                 {
    785                         return null;
    786                 }
     728
     729                return null;
    787730        }
    788731
    789732        /**
     
    797740                {
    798741                        return $this->samplingrate;
    799742                }
    800                 else
    801                 {
    802                         return null;
    803                 }
     743
     744                return null;
    804745        }
    805746
    806747        /**
     
    815756                {
    816757                        return round($length/1048576, 2);
    817758                }
    818                 else
    819                 {
    820                         return null;
    821                 }
     759
     760                return null;
    822761        }
    823762
    824763        /**
     
    834773                {
    835774                        return $thumbnails[$key];
    836775                }
    837                 else
    838                 {
    839                         return null;
    840                 }
     776
     777                return null;
    841778        }
    842779
    843780        /**
     
    851788                {
    852789                        return $this->thumbnails;
    853790                }
    854                 else
    855                 {
    856                         return null;
    857                 }
     791
     792                return null;
    858793        }
    859794
    860795        /**
     
    868803                {
    869804                        return $this->title;
    870805                }
    871                 else
    872                 {
    873                         return null;
    874                 }
     806
     807                return null;
    875808        }
    876809
    877810        /**
     
    886819                {
    887820                        return $this->type;
    888821                }
    889                 else
    890                 {
    891                         return null;
    892                 }
     822
     823                return null;
    893824        }
    894825
    895826        /**
     
    903834                {
    904835                        return $this->width;
    905836                }
    906                 else
    907                 {
    908                         return null;
    909                 }
     837
     838                return null;
    910839        }
    911840
    912841        /**
     
    942871         * - `height` (integer): The height of the embedded media. Accepts any
    943872         *    numeric pixel value (such as `360`) or `auto`. Defaults to `auto`,
    944873         *    and it is recommended that you use this default.
    945          * - `loop` (boolean): Do you want the media to loop when its done?
     874         * - `loop` (boolean): Do you want the media to loop when it's done?
    946875         *    Defaults to `false`.
    947876         * - `mediaplayer` (string): The location of the included
    948877         *    `mediaplayer.swf` file. This allows for the playback of Flash Video
     
    13661295                        {
    13671296                                return 'mp3';
    13681297                        }
    1369                         else
    1370                         {
    1371                                 return null;
    1372                         }
     1298
     1299                        return null;
    13731300                }
    1374                 else
    1375                 {
    1376                         return $type;
    1377                 }
     1301
     1302                return $type;
    13781303        }
    13791304}
    1380 
  • src/wp-includes/SimplePie/Exception.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.4-dev
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
  • src/wp-includes/SimplePie/File.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    6463        var $redirects = 0;
    6564        var $error;
    6665        var $method = SIMPLEPIE_FILE_SOURCE_NONE;
     66        var $permanent_url;
    6767
    68         public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
     68        public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false, $curl_options = array())
    6969        {
    7070                if (class_exists('idna_convert'))
    7171                {
    7272                        $idn = new idna_convert();
    7373                        $parsed = SimplePie_Misc::parse_url($url);
    74                         $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
     74                        $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], NULL);
    7575                }
    7676                $this->url = $url;
     77                $this->permanent_url = $url;
    7778                $this->useragent = $useragent;
    7879                if (preg_match('/^http(s)?:\/\//i', $url))
    7980                {
     
    102103                                curl_setopt($fp, CURLOPT_URL, $url);
    103104                                curl_setopt($fp, CURLOPT_HEADER, 1);
    104105                                curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
     106                                curl_setopt($fp, CURLOPT_FAILONERROR, 1);
    105107                                curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
    106108                                curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
    107109                                curl_setopt($fp, CURLOPT_REFERER, $url);
     
    112114                                        curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
    113115                                        curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
    114116                                }
     117                                foreach ($curl_options as $curl_param => $curl_value) {
     118                                        curl_setopt($fp, $curl_param, $curl_value);
     119                                }
    115120
    116121                                $this->headers = curl_exec($fp);
    117122                                if (curl_errno($fp) === 23 || curl_errno($fp) === 61)
     
    126131                                }
    127132                                else
    128133                                {
    129                                         $info = curl_getinfo($fp);
     134                                        // Use the updated url provided by curl_getinfo after any redirects.
     135                                        if ($info = curl_getinfo($fp)) {
     136                                                $this->url = $info['url'];
     137                                        }
    130138                                        curl_close($fp);
    131                                         $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
    132                                         $this->headers = array_pop($this->headers);
     139                                        $this->headers = SimplePie_HTTP_Parser::prepareHeaders($this->headers, $info['redirect_count'] + 1);
    133140                                        $parser = new SimplePie_HTTP_Parser($this->headers);
    134141                                        if ($parser->parse())
    135142                                        {
    136143                                                $this->headers = $parser->headers;
    137                                                 $this->body = $parser->body;
     144                                                $this->body = trim($parser->body);
    138145                                                $this->status_code = $parser->status_code;
    139146                                                if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
    140147                                                {
    141148                                                        $this->redirects++;
    142149                                                        $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
    143                                                         return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     150                                                        $previousStatusCode = $this->status_code;
     151                                                        $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     152                                                        $this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
     153                                                        return;
    144154                                                }
    145155                                        }
    146156                                }
     
    222232                                                        {
    223233                                                                $this->redirects++;
    224234                                                                $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
    225                                                                 return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     235                                                                $previousStatusCode = $this->status_code;
     236                                                                $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     237                                                                $this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
     238                                                                return;
    226239                                                        }
    227240                                                        if (isset($this->headers['content-encoding']))
    228241                                                        {
     
    239252                                                                                }
    240253                                                                                else
    241254                                                                                {
    242                                                                                         $this->body = $decoder->data;
     255                                                                                        $this->body = trim($decoder->data);
    243256                                                                                }
    244257                                                                                break;
    245258
     
    282295                else
    283296                {
    284297                        $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
    285                         if (!$this->body = file_get_contents($url))
     298                        if (empty($url) || !($this->body = trim(file_get_contents($url))))
    286299                        {
    287300                                $this->error = 'file_get_contents could not read the file';
    288301                                $this->success = false;
  • src/wp-includes/SimplePie/HTTP/Parser.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    156155                {
    157156                        return true;
    158157                }
    159                 else
    160                 {
    161                         $this->http_version = '';
    162                         $this->status_code = '';
    163                         $this->reason = '';
    164                         $this->headers = array();
    165                         $this->body = '';
    166                         return false;
    167                 }
     158
     159                $this->http_version = '';
     160                $this->status_code = '';
     161                $this->reason = '';
     162                $this->headers = array();
     163                $this->body = '';
     164                return false;
    168165        }
    169166
    170167        /**
     
    497494                        }
    498495                }
    499496        }
     497
     498        /**
     499         * Prepare headers (take care of proxies headers)
     500         *
     501         * @param string  $headers Raw headers
     502         * @param integer $count   Redirection count. Default to 1.
     503         *
     504         * @return string
     505         */
     506        static public function prepareHeaders($headers, $count = 1)
     507        {
     508                $data = explode("\r\n\r\n", $headers, $count);
     509                $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);
     515                }
     516                return $data;
     517        }
    500518}
  • src/wp-includes/SimplePie/IRI.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    212211                {
    213212                        return $this->normalization[$this->scheme][$name];
    214213                }
    215                 else
    216                 {
    217                         return $return;
    218                 }
     214
     215                return $return;
    219216        }
    220217
    221218        /**
     
    226223         */
    227224        public function __isset($name)
    228225        {
    229                 if (method_exists($this, 'get_' . $name) || isset($this->$name))
    230                 {
    231                         return true;
    232                 }
    233                 else
    234                 {
    235                         return false;
    236                 }
     226                return method_exists($this, 'get_' . $name) || isset($this->$name);
    237227        }
    238228
    239229        /**
     
    260250        }
    261251
    262252        /**
     253         * Clean up
     254         */
     255        public function __destruct() {
     256            $this->set_iri(null, true);
     257            $this->set_path(null, true);
     258            $this->set_authority(null, true);
     259        }
     260
     261        /**
    263262         * Create a new IRI object by resolving a relative IRI
    264263         *
    265264         * Returns false if $base is not absolute, otherwise an IRI.
     
    348347                                $target->scheme_normalization();
    349348                                return $target;
    350349                        }
    351                         else
    352                         {
    353                                 return false;
    354                         }
     350
     351                        return false;
    355352                }
    356353        }
    357354
     
    388385                        }
    389386                        return $match;
    390387                }
    391                 else
    392                 {
    393                         // This can occur when a paragraph is accidentally parsed as a URI
    394                         return false;
    395                 }
     388
     389                // This can occur when a paragraph is accidentally parsed as a URI
     390                return false;
    396391        }
    397392
    398393        /**
     
    768763         */
    769764        public function is_valid()
    770765        {
    771                 $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null;
    772                 if ($this->ipath !== '' &&
    773                         (
    774                                 $isauthority && (
    775                                         $this->ipath[0] !== '/' ||
    776                                         substr($this->ipath, 0, 2) === '//'
    777                                 ) ||
    778                                 (
    779                                         $this->scheme === null &&
    780                                         !$isauthority &&
    781                                         strpos($this->ipath, ':') !== false &&
    782                                         (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/'))
    783                                 )
    784                         )
    785                 )
    786                 {
    787                         return false;
    788                 }
     766                if ($this->ipath === '') return true;
    789767
     768                $isauthority = $this->iuserinfo !== null || $this->ihost !== null ||
     769                        $this->port !== null;
     770                if ($isauthority && $this->ipath[0] === '/') return true;
     771
     772                if (!$isauthority && (substr($this->ipath, 0, 2) === '//')) return false;
     773
     774                // Relative urls cannot have a colon in the first path segment (and the
     775                // slashes themselves are not included so skip the first character).
     776                if (!$this->scheme && !$isauthority &&
     777                    strpos($this->ipath, ':') !== false &&
     778                    strpos($this->ipath, '/', 1) !== false &&
     779                    strpos($this->ipath, ':') < strpos($this->ipath, '/', 1)) return false;
     780
    790781                return true;
    791782        }
    792783
     
    797788         * @param string $iri
    798789         * @return bool
    799790         */
    800         public function set_iri($iri)
     791        public function set_iri($iri, $clear_cache = false)
    801792        {
    802793                static $cache;
     794                if ($clear_cache)
     795                {
     796                        $cache = null;
     797                        return;
     798                }
    803799                if (!$cache)
    804800                {
    805801                        $cache = array();
     
    821817                                 $return) = $cache[$iri];
    822818                        return $return;
    823819                }
    824                 else
     820
     821                $parsed = $this->parse_iri((string) $iri);
     822                if (!$parsed)
    825823                {
    826                         $parsed = $this->parse_iri((string) $iri);
    827                         if (!$parsed)
    828                         {
    829                                 return false;
    830                         }
     824                        return false;
     825                }
    831826
    832                         $return = $this->set_scheme($parsed['scheme'])
    833                                 && $this->set_authority($parsed['authority'])
    834                                 && $this->set_path($parsed['path'])
    835                                 && $this->set_query($parsed['query'])
    836                                 && $this->set_fragment($parsed['fragment']);
     827                $return = $this->set_scheme($parsed['scheme'])
     828                        && $this->set_authority($parsed['authority'])
     829                        && $this->set_path($parsed['path'])
     830                        && $this->set_query($parsed['query'])
     831                        && $this->set_fragment($parsed['fragment']);
    837832
    838                         $cache[$iri] = array($this->scheme,
    839                                                                  $this->iuserinfo,
    840                                                                  $this->ihost,
    841                                                                  $this->port,
    842                                                                  $this->ipath,
    843                                                                  $this->iquery,
    844                                                                  $this->ifragment,
    845                                                                  $return);
    846                         return $return;
    847                 }
     833                $cache[$iri] = array($this->scheme,
     834                                                         $this->iuserinfo,
     835                                                         $this->ihost,
     836                                                         $this->port,
     837                                                         $this->ipath,
     838                                                         $this->iquery,
     839                                                         $this->ifragment,
     840                                                         $return);
     841                return $return;
    848842        }
    849843
    850844        /**
     
    879873         * @param string $authority
    880874         * @return bool
    881875         */
    882         public function set_authority($authority)
     876        public function set_authority($authority, $clear_cache = false)
    883877        {
    884878                static $cache;
     879                if ($clear_cache)
     880                {
     881                        $cache = null;
     882                        return;
     883                }
    885884                if (!$cache)
    886885                        $cache = array();
    887886
     
    901900
    902901                        return $return;
    903902                }
     903
     904                $remaining = $authority;
     905                if (($iuserinfo_end = strrpos($remaining, '@')) !== false)
     906                {
     907                        $iuserinfo = substr($remaining, 0, $iuserinfo_end);
     908                        $remaining = substr($remaining, $iuserinfo_end + 1);
     909                }
    904910                else
    905911                {
    906                         $remaining = $authority;
    907                         if (($iuserinfo_end = strrpos($remaining, '@')) !== false)
     912                        $iuserinfo = null;
     913                }
     914                if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)
     915                {
     916                        if (($port = substr($remaining, $port_start + 1)) === false)
    908917                        {
    909                                 $iuserinfo = substr($remaining, 0, $iuserinfo_end);
    910                                 $remaining = substr($remaining, $iuserinfo_end + 1);
    911                         }
    912                         else
    913                         {
    914                                 $iuserinfo = null;
    915                         }
    916                         if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)
    917                         {
    918                                 if (($port = substr($remaining, $port_start + 1)) === false)
    919                                 {
    920                                         $port = null;
    921                                 }
    922                                 $remaining = substr($remaining, 0, $port_start);
    923                         }
    924                         else
    925                         {
    926918                                $port = null;
    927919                        }
     920                        $remaining = substr($remaining, 0, $port_start);
     921                }
     922                else
     923                {
     924                        $port = null;
     925                }
    928926
    929                         $return = $this->set_userinfo($iuserinfo) &&
    930                                           $this->set_host($remaining) &&
    931                                           $this->set_port($port);
     927                $return = $this->set_userinfo($iuserinfo) &&
     928                                  $this->set_host($remaining) &&
     929                                  $this->set_port($port);
    932930
    933                         $cache[$authority] = array($this->iuserinfo,
    934                                                                            $this->ihost,
    935                                                                            $this->port,
    936                                                                            $return);
     931                $cache[$authority] = array($this->iuserinfo,
     932                                                                   $this->ihost,
     933                                                                   $this->port,
     934                                                                   $return);
    937935
    938                         return $return;
    939                 }
     936                return $return;
    940937        }
    941938
    942939        /**
     
    10361033                        $this->scheme_normalization();
    10371034                        return true;
    10381035                }
    1039                 else
    1040                 {
    1041                         $this->port = null;
    1042                         return false;
    1043                 }
     1036
     1037                $this->port = null;
     1038                return false;
    10441039        }
    10451040
    10461041        /**
     
    10491044         * @param string $ipath
    10501045         * @return bool
    10511046         */
    1052         public function set_path($ipath)
     1047        public function set_path($ipath, $clear_cache = false)
    10531048        {
    10541049                static $cache;
     1050                if ($clear_cache)
     1051                {
     1052                        $cache = null;
     1053                        return;
     1054                }
    10551055                if (!$cache)
    10561056                {
    10571057                        $cache = array();
     
    11661166                {
    11671167                        $iri .= $this->ipath;
    11681168                }
    1169                 elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')
     1169        elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')
    11701170                {
    11711171                        $iri .= $this->normalization[$this->scheme]['ipath'];
    11721172                }
     
    12101210                        {
    12111211                                $iauthority .= $this->ihost;
    12121212                        }
    1213                         if ($this->port !== null)
     1213            if ($this->port !== null && $this->port !== 0)
    12141214                        {
    12151215                                $iauthority .= ':' . $this->port;
    12161216                        }
    12171217                        return $iauthority;
    12181218                }
    1219                 else
    1220                 {
    1221                         return null;
    1222                 }
     1219
     1220                return null;
    12231221        }
    12241222
    12251223        /**
     
    12321230                $iauthority = $this->get_iauthority();
    12331231                if (is_string($iauthority))
    12341232                        return $this->to_uri($iauthority);
    1235                 else
    1236                         return $iauthority;
     1233
     1234                return $iauthority;
    12371235        }
    12381236}
  • src/wp-includes/SimplePie/Item.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    122121         */
    123122        public function __destruct()
    124123        {
    125                 if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
     124                if ((version_compare(PHP_VERSION, '5.6', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
    126125                {
    127126                        unset($this->feed);
    128127                }
     
    148147                {
    149148                        return $this->data['child'][$namespace][$tag];
    150149                }
    151                 else
    152                 {
    153                         return null;
    154                 }
     150
     151                return null;
    155152        }
    156153
    157154        /**
     
    203200         *
    204201         * Uses `<atom:id>`, `<guid>`, `<dc:identifier>` or the `about` attribute
    205202         * for RDF. If none of these are supplied (or `$hash` is true), creates an
    206          * MD5 hash based on the permalink and title. If either of those are not
    207          * supplied, creates a hash based on the full feed data.
     203         * MD5 hash based on the permalink, title and content.
    208204         *
    209205         * @since Beta 2
    210206         * @param boolean $hash Should we force using a hash instead of the supplied ID?
    211          * @return string
     207         * @param string|false $fn User-supplied function to generate an hash
     208         * @return string|null
    212209         */
    213         public function get_id($hash = false)
     210        public function get_id($hash = false, $fn = 'md5')
    214211        {
    215212                if (!$hash)
    216213                {
     
    238235                        {
    239236                                return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);
    240237                        }
    241                         elseif (($return = $this->get_permalink()) !== null)
    242                         {
    243                                 return $return;
    244                         }
    245                         elseif (($return = $this->get_title()) !== null)
    246                         {
    247                                 return $return;
    248                         }
    249238                }
    250                 if ($this->get_permalink() !== null || $this->get_title() !== null)
     239                if ($fn === false)
    251240                {
    252                         return md5($this->get_permalink() . $this->get_title());
     241                        return null;
    253242                }
    254                 else
     243                elseif (!is_callable($fn))
    255244                {
    256                         return md5(serialize($this->data));
     245                        trigger_error('User-supplied function $fn must be callable', E_USER_WARNING);
     246                        $fn = 'md5';
    257247                }
     248                return call_user_func($fn,
     249                       $this->get_permalink().$this->get_title().$this->get_content());
    258250        }
    259251
    260252        /**
     
    322314         */
    323315        public function get_description($description_only = false)
    324316        {
    325                 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
     317                if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) &&
     318                    ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
    326319                {
    327                         return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
     320                        return $return;
    328321                }
    329                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
     322                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) &&
     323                        ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
    330324                {
    331                         return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
     325                        return $return;
    332326                }
    333                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
     327                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) &&
     328                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($tags[0]))))
    334329                {
    335                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
     330                        return $return;
    336331                }
    337                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
     332                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) &&
     333                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
    338334                {
    339                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
     335                        return $return;
    340336                }
    341                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
     337                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) &&
     338                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
    342339                {
    343                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     340                        return $return;
    344341                }
    345                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
     342                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) &&
     343                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
    346344                {
    347                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     345                        return $return;
    348346                }
    349                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
     347                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) &&
     348                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
    350349                {
    351                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
     350                        return $return;
    352351                }
    353                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
     352                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) &&
     353                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)))
    354354                {
    355                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     355                        return $return;
    356356                }
    357                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
     357                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) &&
     358                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML)))
    358359                {
    359                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
     360                        return $return;
    360361                }
    361362
    362363                elseif (!$description_only)
     
    363364                {
    364365                        return $this->get_content(true);
    365366                }
    366                 else
    367                 {
    368                         return null;
    369                 }
     367
     368                return null;
    370369        }
    371370
    372371        /**
     
    385384         */
    386385        public function get_content($content_only = false)
    387386        {
    388                 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
     387                if (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) &&
     388                    ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
    389389                {
    390                         return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
     390                        return $return;
    391391                }
    392                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
     392                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) &&
     393                        ($return = $this->sanitize($tags[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($tags[0]['attribs'])), $this->get_base($tags[0]))))
    393394                {
    394                         return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
     395                        return $return;
    395396                }
    396                 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
     397                elseif (($tags = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) &&
     398                        ($return = $this->sanitize($tags[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($tags[0]))))
    397399                {
    398                         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
     400                        return $return;
    399401                }
    400402                elseif (!$content_only)
    401403                {
    402404                        return $this->get_description(true);
    403405                }
    404                 else
     406
     407                return null;
     408        }
     409
     410        /**
     411         * Get the media:thumbnail of the item
     412         *
     413         * Uses `<media:thumbnail>`
     414         *
     415         *
     416         * @return array|null
     417         */
     418        public function get_thumbnail()
     419        {
     420                if (!isset($this->data['thumbnail']))
    405421                {
    406                         return null;
     422                        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
     423                        {
     424                                $this->data['thumbnail'] = $return[0]['attribs'][''];
     425                        }
     426                        else
     427                        {
     428                                $this->data['thumbnail'] = null;
     429                        }
    407430                }
     431                return $this->data['thumbnail'];
    408432        }
    409433
    410434        /**
     
    421445                {
    422446                        return $categories[$key];
    423447                }
    424                 else
    425                 {
    426                         return null;
    427                 }
     448
     449                return null;
    428450        }
    429451
    430452        /**
     
    433455         * Uses `<atom:category>`, `<category>` or `<dc:subject>`
    434456         *
    435457         * @since Beta 3
    436          * @return array|null List of {@see SimplePie_Category} objects
     458         * @return SimplePie_Category[]|null List of {@see SimplePie_Category} objects
    437459         */
    438460        public function get_categories()
    439461        {
    440462                $categories = array();
    441463
    442                 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
     464                $type = 'category';
     465                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, $type) as $category)
    443466                {
    444467                        $term = null;
    445468                        $scheme = null;
     
    456479                        {
    457480                                $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
    458481                        }
    459                         $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
     482                        $categories[] = $this->registry->create('Category', array($term, $scheme, $label, $type));
    460483                }
    461                 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
     484                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, $type) as $category)
    462485                {
    463486                        // This is really the label, but keep this as the term also for BC.
    464487                        // Label will also work on retrieving because that falls back to term.
     
    471494                        {
    472495                                $scheme = null;
    473496                        }
    474                         $categories[] = $this->registry->create('Category', array($term, $scheme, null));
     497                        $categories[] = $this->registry->create('Category', array($term, $scheme, null, $type));
    475498                }
    476                 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
     499
     500                $type = 'subject';
     501                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, $type) as $category)
    477502                {
    478                         $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
     503                        $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null, $type));
    479504                }
    480                 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
     505                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, $type) as $category)
    481506                {
    482                         $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
     507                        $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null, $type));
    483508                }
    484509
    485510                if (!empty($categories))
     
    486511                {
    487512                        return array_unique($categories);
    488513                }
    489                 else
    490                 {
    491                         return null;
    492                 }
     514
     515                return null;
    493516        }
    494517
    495518        /**
     
    506529                {
    507530                        return $authors[$key];
    508531                }
    509                 else
    510                 {
    511                         return null;
    512                 }
     532
     533                return null;
    513534        }
    514535
    515536        /**
     
    526547                {
    527548                        return $contributors[$key];
    528549                }
    529                 else
    530                 {
    531                         return null;
    532                 }
     550
     551                return null;
    533552        }
    534553
    535554        /**
     
    538557         * Uses `<atom:contributor>`
    539558         *
    540559         * @since 1.1
    541          * @return array|null List of {@see SimplePie_Author} objects
     560         * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects
    542561         */
    543562        public function get_contributors()
    544563        {
     
    592611                {
    593612                        return array_unique($contributors);
    594613                }
    595                 else
    596                 {
    597                         return null;
    598                 }
     614
     615                return null;
    599616        }
    600617
    601618        /**
     
    604621         * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`
    605622         *
    606623         * @since Beta 2
    607          * @return array|null List of {@see SimplePie_Author} objects
     624         * @return SimplePie_Author[]|null List of {@see SimplePie_Author} objects
    608625         */
    609626        public function get_authors()
    610627        {
     
    682699                {
    683700                        return $authors;
    684701                }
    685                 else
    686                 {
    687                         return null;
    688                 }
     702
     703                return null;
    689704        }
    690705
    691706        /**
     
    710725                {
    711726                        return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
    712727                }
    713                 else
    714                 {
    715                         return null;
    716                 }
     728
     729                return null;
    717730        }
    718731
    719732        /**
     
    738751                        {
    739752                                $this->data['date']['raw'] = $return[0]['data'];
    740753                        }
    741                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
     754                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
    742755                        {
    743756                                $this->data['date']['raw'] = $return[0]['data'];
    744757                        }
    745                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
     758                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
    746759                        {
    747760                                $this->data['date']['raw'] = $return[0]['data'];
    748761                        }
    749                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
     762                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
    750763                        {
    751764                                $this->data['date']['raw'] = $return[0]['data'];
    752765                        }
    753                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
     766                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
    754767                        {
    755768                                $this->data['date']['raw'] = $return[0]['data'];
    756769                        }
    757                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
     770                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
    758771                        {
    759772                                $this->data['date']['raw'] = $return[0]['data'];
    760773                        }
    761                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
     774                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
    762775                        {
    763776                                $this->data['date']['raw'] = $return[0]['data'];
    764777                        }
    765                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
     778                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
    766779                        {
    767780                                $this->data['date']['raw'] = $return[0]['data'];
    768781                        }
     
    792805                                        return date($date_format, $this->data['date']['parsed']);
    793806                        }
    794807                }
    795                 else
    796                 {
    797                         return null;
    798                 }
     808
     809                return null;
    799810        }
    800811
    801812        /**
     
    821832                        if (!empty($this->data['updated']['raw']))
    822833                        {
    823834                                $parser = $this->registry->call('Parse_Date', 'get');
    824                                 $this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']);
     835                                $this->data['updated']['parsed'] = $parser->parse($this->data['updated']['raw']);
    825836                        }
    826837                        else
    827838                        {
     
    843854                                        return date($date_format, $this->data['updated']['parsed']);
    844855                        }
    845856                }
    846                 else
    847                 {
    848                         return null;
    849                 }
     857
     858                return null;
    850859        }
    851860
    852861        /**
     
    872881                {
    873882                        return strftime($date_format, $date);
    874883                }
    875                 else
    876                 {
    877                         return null;
    878                 }
     884
     885                return null;
    879886        }
    880887
    881888        /**
     
    936943                {
    937944                        return $enclosure->get_link();
    938945                }
    939                 else
    940                 {
    941                         return null;
    942                 }
     946
     947                return null;
    943948        }
    944949
    945950        /**
     
    953958        public function get_link($key = 0, $rel = 'alternate')
    954959        {
    955960                $links = $this->get_links($rel);
    956                 if ($links[$key] !== null)
     961                if ($links && $links[$key] !== null)
    957962                {
    958963                        return $links[$key];
    959964                }
    960                 else
    961                 {
    962                         return null;
    963                 }
     965
     966                return null;
    964967        }
    965968
    966969        /**
     
    10401043                {
    10411044                        return $this->data['links'][$rel];
    10421045                }
    1043                 else
    1044                 {
    1045                         return null;
    1046                 }
     1046
     1047                return null;
    10471048        }
    10481049
    10491050        /**
     
    10631064                {
    10641065                        return $enclosures[$key];
    10651066                }
    1066                 else
    1067                 {
    1068                         return null;
    1069                 }
     1067
     1068                return null;
    10701069        }
    10711070
    10721071        /**
     
    10801079         *
    10811080         * @since Beta 2
    10821081         * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
    1083          * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).
    1084          * @return array|null List of SimplePie_Enclosure items
     1082         * @todo If an element exists at a level, but its value is empty, we should fall back to the value from the parent (if it exists).
     1083         * @return SimplePie_Enclosure[]|null List of SimplePie_Enclosure items
    10851084         */
    10861085        public function get_enclosures()
    10871086        {
     
    26582657                                                // PLAYER
    26592658                                                if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
    26602659                                                {
    2661                                                         $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2660                                                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'])) {
     2661                                                                $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2662                                                        }
    26622663                                                }
    26632664                                                else
    26642665                                                {
     
    27332734                                                {
    27342735                                                        foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
    27352736                                                        {
    2736                                                                 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2737                                                                if (isset($thumbnail['attribs']['']['url'])) {
     2738                                                                        $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2739                                                                }
    27372740                                                        }
    27382741                                                        if (is_array($thumbnails))
    27392742                                                        {
     
    27892792                                        {
    27902793                                                $length = ceil($link['attribs']['']['length']);
    27912794                                        }
     2795                                        if (isset($link['attribs']['']['title']))
     2796                                        {
     2797                                                $title = $this->sanitize($link['attribs']['']['title'], SIMPLEPIE_CONSTRUCT_TEXT);
     2798                                        }
     2799                                        else
     2800                                        {
     2801                                                $title = $title_parent;
     2802                                        }
    27922803
    27932804                                        // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
    2794                                         $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
     2805                                        $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title, $width));
    27952806                                }
    27962807                        }
    27972808
     
    28772888                {
    28782889                        return $this->data['enclosures'];
    28792890                }
    2880                 else
    2881                 {
    2882                         return null;
    2883                 }
     2891
     2892                return null;
    28842893        }
    28852894
    28862895        /**
     
    29052914                {
    29062915                        return (float) $match[1];
    29072916                }
    2908                 else
    2909                 {
    2910                         return null;
    2911                 }
     2917
     2918                return null;
    29122919        }
    29132920
    29142921        /**
     
    29372944                {
    29382945                        return (float) $match[2];
    29392946                }
    2940                 else
    2941                 {
    2942                         return null;
    2943                 }
     2947
     2948                return null;
    29442949        }
    29452950
    29462951        /**
     
    29552960                {
    29562961                        return $this->registry->create('Source', array($this, $return[0]));
    29572962                }
    2958                 else
    2959                 {
    2960                         return null;
    2961                 }
     2963
     2964                return null;
    29622965        }
    29632966}
    2964 
  • src/wp-includes/SimplePie/Locator.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    6362        var $base_location = 0;
    6463        var $checked_feeds = 0;
    6564        var $max_checked_feeds = 10;
     65        var $force_fsockopen = false;
     66        var $curl_options = array();
    6667        protected $registry;
    6768
    68         public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10)
     69        public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10, $force_fsockopen = false, $curl_options = array())
    6970        {
    7071                $this->file = $file;
    7172                $this->useragent = $useragent;
    7273                $this->timeout = $timeout;
    7374                $this->max_checked_feeds = $max_checked_feeds;
     75                $this->force_fsockopen = $force_fsockopen;
     76                $this->curl_options = $curl_options;
    7477
    7578                if (class_exists('DOMDocument'))
    7679                {
     
    121124                {
    122125                        if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
    123126                        {
    124                                 return $working;
     127                                return $working[0];
    125128                        }
    126129
    127130                        if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
    128131                        {
    129                                 return $working;
     132                                return $working[0];
    130133                        }
    131134
    132135                        if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
    133136                        {
    134                                 return $working;
     137                                return $working[0];
    135138                        }
    136139
    137140                        if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
    138141                        {
    139                                 return $working;
     142                                return $working[0];
    140143                        }
    141144                }
    142145                return null;
    143146        }
    144147
    145         public function is_feed($file)
     148        public function is_feed($file, $check_html = false)
    146149        {
    147150                if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
    148151                {
    149152                        $sniffer = $this->registry->create('Content_Type_Sniffer', array($file));
    150153                        $sniffed = $sniffer->get_type();
    151                         if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml')))
     154                        $mime_types = array('application/rss+xml', 'application/rdf+xml',
     155                                            'text/rdf', 'application/atom+xml', 'text/xml',
     156                                            'application/xml', 'application/x-rss+xml');
     157                        if ($check_html)
    152158                        {
    153                                 return true;
     159                                $mime_types[] = 'text/html';
    154160                        }
    155                         else
    156                         {
    157                                 return false;
    158                         }
     161
     162                        return in_array($sniffed, $mime_types);
    159163                }
    160164                elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
    161165                {
     
    204208                {
    205209                        return array_values($feeds);
    206210                }
    207                 else
    208                 {
    209                         return null;
    210                 }
     211
     212                return null;
    211213        }
    212214
    213215        protected function search_elements_by_tag($name, &$done, $feeds)
     
    226228                        }
    227229                        if ($link->hasAttribute('href') && $link->hasAttribute('rel'))
    228230                        {
    229                                 $rel = array_unique($this->registry->call('Misc', 'space_seperated_tokens', array(strtolower($link->getAttribute('rel')))));
     231                                $rel = array_unique($this->registry->call('Misc', 'space_separated_tokens', array(strtolower($link->getAttribute('rel')))));
    230232                                $line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1;
    231233
    232234                                if ($this->base_location < $line)
     
    242244                                        continue;
    243245                                }
    244246
    245                                 if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))
     247                                if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('text/html', 'application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))
    246248                                {
    247249                                        $this->checked_feeds++;
    248250                                        $headers = array(
    249251                                                'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
    250252                                        );
    251                                         $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent));
    252                                         if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
     253                                        $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
     254                                        if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed, true))
    253255                                        {
    254256                                                $feeds[$href] = $feed;
    255257                                        }
     
    275277                        {
    276278                                $href = trim($link->getAttribute('href'));
    277279                                $parsed = $this->registry->call('Misc', 'parse_url', array($href));
    278                                 if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme']))
     280                                if ($parsed['scheme'] === '' || preg_match('/^(https?|feed)?$/i', $parsed['scheme']))
    279281                                {
    280282                                        if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo())
    281283                                        {
     
    312314                return null;
    313315        }
    314316
     317        public function get_rel_link($rel)
     318        {
     319                if ($this->dom === null)
     320                {
     321                        throw new SimplePie_Exception('DOMDocument not found, unable to use '.
     322                                                      'locator');
     323                }
     324                if (!class_exists('DOMXpath'))
     325                {
     326                        throw new SimplePie_Exception('DOMXpath not found, unable to use '.
     327                                                      'get_rel_link');
     328                }
     329
     330                $xpath = new DOMXpath($this->dom);
     331                $query = '//a[@rel and @href] | //link[@rel and @href]';
     332                foreach ($xpath->query($query) as $link)
     333                {
     334                        $href = trim($link->getAttribute('href'));
     335                        $parsed = $this->registry->call('Misc', 'parse_url', array($href));
     336                        if ($parsed['scheme'] === '' ||
     337                            preg_match('/^https?$/i', $parsed['scheme']))
     338                        {
     339                                if (method_exists($link, 'getLineNo') &&
     340                                    $this->base_location < $link->getLineNo())
     341                                {
     342                                        $href =
     343                                                $this->registry->call('Misc', 'absolutize_url',
     344                                                                      array(trim($link->getAttribute('href')),
     345                                                                            $this->base));
     346                                }
     347                                else
     348                                {
     349                                        $href =
     350                                                $this->registry->call('Misc', 'absolutize_url',
     351                                                                      array(trim($link->getAttribute('href')),
     352                                                                            $this->http_base));
     353                                }
     354                                if ($href === false)
     355                                {
     356                                        return null;
     357                                }
     358                                $rel_values = explode(' ', strtolower($link->getAttribute('rel')));
     359                                if (in_array($rel, $rel_values))
     360                                {
     361                                        return $href;
     362                                }
     363                        }
     364                }
     365                return null;
     366        }
     367
    315368        public function extension(&$array)
    316369        {
    317370                foreach ($array as $key => $value)
     
    327380                                $headers = array(
    328381                                        'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
    329382                                );
    330                                 $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent));
     383                                $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
    331384                                if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
    332385                                {
    333                                         return $feed;
     386                                        return array($feed);
    334387                                }
    335388                                else
    336389                                {
     
    349402                        {
    350403                                break;
    351404                        }
    352                         if (preg_match('/(rss|rdf|atom|xml)/i', $value))
     405                        if (preg_match('/(feed|rss|rdf|atom|xml)/i', $value))
    353406                        {
    354407                                $this->checked_feeds++;
    355408                                $headers = array(
    356409                                        'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
    357410                                );
    358                                 $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent));
     411                                $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen, $this->curl_options));
    359412                                if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
    360413                                {
    361                                         return $feed;
     414                                        return array($feed);
    362415                                }
    363416                                else
    364417                                {
     
    369422                return null;
    370423        }
    371424}
    372 
  • src/wp-includes/SimplePie/Misc.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    138137                foreach ($element['attribs'] as $key => $value)
    139138                {
    140139                        $key = strtolower($key);
    141                         $full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
     140                        $full .= " $key=\"" . htmlspecialchars($value['data'], ENT_COMPAT, 'UTF-8') . '"';
    142141                }
    143142                if ($element['self_closing'])
    144143                {
     
    218217                {
    219218                        return substr_replace($url, 'itpc', 0, 4);
    220219                }
    221                 else
     220
     221                return $url;
     222        }
     223
     224        public static function array_merge_recursive($array1, $array2)
     225        {
     226                foreach ($array2 as $key => $value)
    222227                {
    223                         return $url;
     228                        if (is_array($value))
     229                        {
     230                                $array1[$key] = SimplePie_Misc::array_merge_recursive($array1[$key], $value);
     231                        }
     232                        else
     233                        {
     234                                $array1[$key] = $value;
     235                        }
    224236                }
     237
     238                return $array1;
    225239        }
    226240
    227241        public static function parse_url($url)
     
    260274                {
    261275                        return chr($integer);
    262276                }
    263                 else
    264                 {
    265                         return strtoupper($match[0]);
    266                 }
     277
     278                return strtoupper($match[0]);
    267279        }
    268280
    269281        /**
     
    317329                {
    318330                        return $return;
    319331                }
    320                 // This is last, as behaviour of this varies with OS userland and PHP version
     332                // This is third, as behaviour of this varies with OS userland and PHP version
    321333                elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output)))
    322334                {
    323335                        return $return;
    324336                }
    325                 // If we can't do anything, just fail
    326                 else
     337                // This is last, as behaviour of this varies with OS userland and PHP version
     338                elseif (class_exists('\UConverter') && ($return = SimplePie_Misc::change_encoding_uconverter($data, $input, $output)))
    327339                {
    328                         return false;
     340                        return $return;
    329341                }
     342
     343                // If we can't do anything, just fail
     344                return false;
    330345        }
    331346
    332347        protected static function change_encoding_mbstring($data, $input, $output)
     
    373388        }
    374389
    375390        /**
     391         * @param string $data
     392         * @param string $input
     393         * @param string $output
     394         * @return string|false
     395         */
     396        protected static function change_encoding_uconverter($data, $input, $output)
     397        {
     398                return @\UConverter::transcode($data, $output, $input);
     399        }
     400
     401        /**
    376402         * Normalize an encoding name
    377403         *
    378404         * This is automatically generated by create.php
     
    18261852                {
    18271853                        return trim($mime);
    18281854                }
    1829                 else
    1830                 {
    1831                         return trim(substr($mime, 0, $pos));
    1832                 }
     1855
     1856                return trim(substr($mime, 0, $pos));
    18331857        }
    18341858
    18351859        public static function atom_03_construct_type($attribs)
     
    18621886                                        return SIMPLEPIE_CONSTRUCT_NONE | $mode;
    18631887                        }
    18641888                }
    1865                 else
    1866                 {
    1867                         return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
    1868                 }
     1889
     1890                return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
    18691891        }
    18701892
    18711893        public static function atom_10_construct_type($attribs)
     
    19151937                                return SIMPLEPIE_CONSTRUCT_BASE64;
    19161938                        }
    19171939                }
    1918                 else
    1919                 {
    1920                         return SIMPLEPIE_CONSTRUCT_TEXT;
    1921                 }
     1940
     1941                return SIMPLEPIE_CONSTRUCT_TEXT;
    19221942        }
    19231943
    19241944        public static function is_isegment_nz_nc($string)
     
    19261946                return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
    19271947        }
    19281948
    1929         public static function space_seperated_tokens($string)
     1949        public static function space_separated_tokens($string)
    19301950        {
    19311951                $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
    19321952                $string_length = strlen($string);
     
    19751995                {
    19761996                        return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
    19771997                }
    1978                 else
    1979                 {
    1980                         // U+FFFD REPLACEMENT CHARACTER
    1981                         return "\xEF\xBF\xBD";
    1982                 }
     1998
     1999                // U+FFFD REPLACEMENT CHARACTER
     2000                return "\xEF\xBF\xBD";
    19832001        }
    19842002
    19852003        /**
     
    21832201                {
    21842202                        return filemtime(dirname(__FILE__) . '/Core.php');
    21852203                }
    2186                 else
    2187                 {
    2188                         return filemtime(__FILE__);
    2189                 }
     2204
     2205                return filemtime(__FILE__);
    21902206        }
    21912207
    21922208        /**
     
    22442260                // No-op
    22452261        }
    22462262}
    2247 
  • src/wp-includes/SimplePie/Net/IPv6.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    174173                {
    175174                        return implode(':', $ip_parts);
    176175                }
    177                 else
    178                 {
    179                         return $ip_parts[0];
    180                 }
     176
     177                return $ip_parts[0];
    181178        }
    182179
    183180        /**
     
    201198                        $ipv4_part = substr($ip, $pos + 1);
    202199                        return array($ipv6_part, $ipv4_part);
    203200                }
    204                 else
    205                 {
    206                         return array($ip, '');
    207                 }
     201
     202                return array($ip, '');
    208203        }
    209204
    210205        /**
     
    254249                        }
    255250                        return true;
    256251                }
    257                 else
    258                 {
    259                         return false;
    260                 }
     252
     253                return false;
    261254        }
    262255
    263256        /**
  • src/wp-includes/SimplePie/Parse/Date.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    9998                'dimanche' => 7,
    10099                // German
    101100                'montag' => 1,
     101                'mo' => 1,
    102102                'dienstag' => 2,
     103                'di' => 2,
    103104                'mittwoch' => 3,
     105                'mi' => 3,
    104106                'donnerstag' => 4,
     107                'do' => 4,
    105108                'freitag' => 5,
     109                'fr' => 5,
    106110                'samstag' => 6,
     111                'sa' => 6,
    107112                'sonnabend' => 6,
     113                // AFAIK no short form for sonnabend
     114                'so' => 7,
    108115                'sonntag' => 7,
    109116                // Italian
    110117                'lunedì' => 1,
     
    146153                'Παρ' => 5,
    147154                'Σαβ' => 6,
    148155                'Κυρ' => 7,
     156                // Russian
     157                'Пн.' => 1,
     158                'Вт.' => 2,
     159                'Ср.' => 3,
     160                'Чт.' => 4,
     161                'Пт.' => 5,
     162                'Сб.' => 6,
     163                'Вс.' => 7,
    149164        );
    150165
    151166        /**
     
    173188                'aug' => 8,
    174189                'august' => 8,
    175190                'sep' => 9,
    176                 'september' => 8,
     191                'september' => 9,
    177192                'oct' => 10,
    178193                'october' => 10,
    179194                'nov' => 11,
     
    208223                'décembre' => 12,
    209224                // German
    210225                'januar' => 1,
     226                'jan' => 1,
    211227                'februar' => 2,
     228                'feb' => 2,
    212229                'märz' => 3,
     230                'mär' => 3,
    213231                'april' => 4,
    214                 'mai' => 5,
     232                'apr' => 4,
     233                'mai' => 5, // no short form for may
    215234                'juni' => 6,
     235                'jun' => 6,
    216236                'juli' => 7,
     237                'jul' => 7,
    217238                'august' => 8,
     239                'aug' => 8,
    218240                'september' => 9,
     241                'sep' => 9,
    219242                'oktober' => 10,
     243                'okt' => 10,
    220244                'november' => 11,
     245                'nov' => 11,
    221246                'dezember' => 12,
     247                'dez' => 12,
    222248                // Italian
    223249                'gennaio' => 1,
    224250                'febbraio' => 2,
     
    290316                'Σεπ' => 9,
    291317                'Οκτ' => 10,
    292318                'Νοέ' => 11,
    293                 'Δεκ' => 12,
     319                'Δεκ' => 12,           
     320                // Russian
     321                'Янв' => 1,
     322                'января' => 1,
     323                'Фев' => 2,
     324                'февраля' => 2,
     325                'Мар' => 3,
     326                'марта' => 3,
     327                'Апр' => 4,
     328                'апреля' => 4,
     329                'Май' => 5,
     330                'мая' => 5,
     331                'Июн' => 6,
     332                'июня' => 6,
     333                'Июл' => 7,
     334                'июля' => 7,
     335                'Авг' => 8,
     336                'августа' => 8,
     337                'Сен' => 9,
     338                'сентября' => 9,
     339                'Окт' => 10,
     340                'октября' => 10,
     341                'Ноя' => 11,
     342                'ноября' => 11,
     343                'Дек' => 12,
     344                'декабря' => 12,
     345
    294346        );
    295347
    296348        /**
     
    614666         *
    615667         * @final
    616668         * @access public
    617          * @param callable $callback
     669         * @param callback $callback
    618670         */
    619671        public function add_callback($callback)
    620672        {
     
    631683        /**
    632684         * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
    633685         * well as allowing any of upper or lower case "T", horizontal tabs, or
    634          * spaces to be used as the time seperator (including more than one))
     686         * spaces to be used as the time separator (including more than one))
    635687         *
    636688         * @access protected
    637689         * @return int Timestamp
     
    691743                        }
    692744
    693745                        // Convert the number of seconds to an integer, taking decimals into account
    694                         $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
     746                        $second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7])));
    695747
    696748                        return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
    697749                }
    698                 else
    699                 {
    700                         return false;
    701                 }
     750
     751                return false;
    702752        }
    703753
    704754        /**
     
    721771                {
    722772                        $output .= substr($string, $position, $pos - $position);
    723773                        $position = $pos + 1;
    724                         if ($string[$pos - 1] !== '\\')
     774                        if ($pos === 0 || $string[$pos - 1] !== '\\')
    725775                        {
    726776                                $depth++;
    727777                                while ($depth && $position < $length)
     
    849899
    850900                        return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
    851901                }
    852                 else
    853                 {
    854                         return false;
    855                 }
     902
     903                return false;
    856904        }
    857905
    858906        /**
     
    914962
    915963                        return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
    916964                }
    917                 else
    918                 {
    919                         return false;
    920                 }
     965
     966                return false;
    921967        }
    922968
    923969        /**
     
    9561002                        $month = $this->month[strtolower($match[2])];
    9571003                        return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
    9581004                }
    959                 else
    960                 {
    961                         return false;
    962                 }
     1005
     1006                return false;
    9631007        }
    9641008
    9651009        /**
     
    9751019                {
    9761020                        return false;
    9771021                }
    978                 else
    979                 {
    980                         return $strtotime;
    981                 }
     1022
     1023                return $strtotime;
    9821024        }
    9831025}
    984 
  • src/wp-includes/SimplePie/Parser.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    7574                $this->registry = $registry;
    7675        }
    7776
    78         public function parse(&$data, $encoding)
     77        public function parse(&$data, $encoding, $url = '')
    7978        {
     79                if (class_exists('DOMXpath') && function_exists('Mf2\parse')) {
     80                        $doc = new DOMDocument();
     81                        @$doc->loadHTML($data);
     82                        $xpath = new DOMXpath($doc);
     83                        // Check for both h-feed and h-entry, as both a feed with no entries
     84                        // and a list of entries without an h-feed wrapper are both valid.
     85                        $query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '.
     86                                'contains(concat(" ", @class, " "), " h-entry ")]';
     87                        $result = $xpath->query($query);
     88                        if ($result->length !== 0) {
     89                                return $this->parse_microformats($data, $url);
     90                        }
     91                }
     92
    8093                // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
    8194                if (strtoupper($encoding) === 'US-ASCII')
    8295                {
     
    120133                        if ($declaration->parse())
    121134                        {
    122135                                $data = substr($data, $pos + 2);
    123                                 $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data;
     136                                $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data;
    124137                        }
    125138                        else
    126139                        {
     
    163176                        xml_parser_free($xml);
    164177                        return $return;
    165178                }
    166                 else
     179
     180                libxml_clear_errors();
     181                $xml = new XMLReader();
     182                $xml->xml($data);
     183                while (@$xml->read())
    167184                {
    168                         libxml_clear_errors();
    169                         $xml = new XMLReader();
    170                         $xml->xml($data);
    171                         while (@$xml->read())
     185                        switch ($xml->nodeType)
    172186                        {
    173                                 switch ($xml->nodeType)
    174                                 {
    175187
    176                                         case constant('XMLReader::END_ELEMENT'):
     188                                case constant('XMLReader::END_ELEMENT'):
     189                                        if ($xml->namespaceURI !== '')
     190                                        {
     191                                                $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
     192                                        }
     193                                        else
     194                                        {
     195                                                $tagName = $xml->localName;
     196                                        }
     197                                        $this->tag_close(null, $tagName);
     198                                        break;
     199                                case constant('XMLReader::ELEMENT'):
     200                                        $empty = $xml->isEmptyElement;
     201                                        if ($xml->namespaceURI !== '')
     202                                        {
     203                                                $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
     204                                        }
     205                                        else
     206                                        {
     207                                                $tagName = $xml->localName;
     208                                        }
     209                                        $attributes = array();
     210                                        while ($xml->moveToNextAttribute())
     211                                        {
    177212                                                if ($xml->namespaceURI !== '')
    178213                                                {
    179                                                         $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
     214                                                        $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
    180215                                                }
    181216                                                else
    182217                                                {
    183                                                         $tagName = $xml->localName;
     218                                                        $attrName = $xml->localName;
    184219                                                }
     220                                                $attributes[$attrName] = $xml->value;
     221                                        }
     222                                        $this->tag_open(null, $tagName, $attributes);
     223                                        if ($empty)
     224                                        {
    185225                                                $this->tag_close(null, $tagName);
    186                                                 break;
    187                                         case constant('XMLReader::ELEMENT'):
    188                                                 $empty = $xml->isEmptyElement;
    189                                                 if ($xml->namespaceURI !== '')
    190                                                 {
    191                                                         $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
    192                                                 }
    193                                                 else
    194                                                 {
    195                                                         $tagName = $xml->localName;
    196                                                 }
    197                                                 $attributes = array();
    198                                                 while ($xml->moveToNextAttribute())
    199                                                 {
    200                                                         if ($xml->namespaceURI !== '')
    201                                                         {
    202                                                                 $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
    203                                                         }
    204                                                         else
    205                                                         {
    206                                                                 $attrName = $xml->localName;
    207                                                         }
    208                                                         $attributes[$attrName] = $xml->value;
    209                                                 }
    210                                                 $this->tag_open(null, $tagName, $attributes);
    211                                                 if ($empty)
    212                                                 {
    213                                                         $this->tag_close(null, $tagName);
    214                                                 }
    215                                                 break;
    216                                         case constant('XMLReader::TEXT'):
     226                                        }
     227                                        break;
     228                                case constant('XMLReader::TEXT'):
    217229
    218                                         case constant('XMLReader::CDATA'):
    219                                                 $this->cdata(null, $xml->value);
    220                                                 break;
    221                                 }
     230                                case constant('XMLReader::CDATA'):
     231                                        $this->cdata(null, $xml->value);
     232                                        break;
    222233                        }
    223                         if ($error = libxml_get_last_error())
    224                         {
    225                                 $this->error_code = $error->code;
    226                                 $this->error_string = $error->message;
    227                                 $this->current_line = $error->line;
    228                                 $this->current_column = $error->column;
    229                                 return false;
    230                         }
    231                         else
    232                         {
    233                                 return true;
    234                         }
    235234                }
     235                if ($error = libxml_get_last_error())
     236                {
     237                        $this->error_code = $error->code;
     238                        $this->error_string = $error->message;
     239                        $this->current_line = $error->line;
     240                        $this->current_column = $error->column;
     241                        return false;
     242                }
     243
     244                return true;
    236245        }
    237246
    238247        public function get_error_code()
     
    404413                }
    405414                return $cache[$string];
    406415        }
     416
     417        private function parse_hcard($data, $category = false) {
     418                $name = '';
     419                $link = '';
     420                // Check if h-card is set and pass that information on in the link.
     421                if (isset($data['type']) && in_array('h-card', $data['type'])) {
     422                        if (isset($data['properties']['name'][0])) {
     423                                $name = $data['properties']['name'][0];
     424                        }
     425                        if (isset($data['properties']['url'][0])) {
     426                                $link = $data['properties']['url'][0];
     427                                if ($name === '') {
     428                                        $name = $link;
     429                                }
     430                                else {
     431                                        // can't have commas in categories.
     432                                        $name = str_replace(',', '', $name);
     433                                }
     434                                $person_tag = $category ? '<span class="person-tag"></span>' : '';
     435                                return '<a class="h-card" href="'.$link.'">'.$person_tag.$name.'</a>';
     436                        }
     437                }
     438                return isset($data['value']) ? $data['value'] : '';
     439        }
     440
     441        private function parse_microformats(&$data, $url) {
     442                $feed_title = '';
     443                $feed_author = NULL;
     444                $author_cache = array();
     445                $items = array();
     446                $entries = array();
     447                $mf = Mf2\parse($data, $url);
     448                // First look for an h-feed.
     449                $h_feed = array();
     450                foreach ($mf['items'] as $mf_item) {
     451                        if (in_array('h-feed', $mf_item['type'])) {
     452                                $h_feed = $mf_item;
     453                                break;
     454                        }
     455                        // Also look for h-feed or h-entry in the children of each top level item.
     456                        if (!isset($mf_item['children'][0]['type'])) continue;
     457                        if (in_array('h-feed', $mf_item['children'][0]['type'])) {
     458                                $h_feed = $mf_item['children'][0];
     459                                // In this case the parent of the h-feed may be an h-card, so use it as
     460                                // the feed_author.
     461                                if (in_array('h-card', $mf_item['type'])) $feed_author = $mf_item;
     462                                break;
     463                        }
     464                        else if (in_array('h-entry', $mf_item['children'][0]['type'])) {
     465                                $entries = $mf_item['children'];
     466                                // In this case the parent of the h-entry list may be an h-card, so use
     467                                // it as the feed_author.
     468                                if (in_array('h-card', $mf_item['type'])) $feed_author = $mf_item;
     469                                break;
     470                        }
     471                }
     472                if (isset($h_feed['children'])) {
     473                        $entries = $h_feed['children'];
     474                        // Also set the feed title and store author from the h-feed if available.
     475                        if (isset($mf['items'][0]['properties']['name'][0])) {
     476                                $feed_title = $mf['items'][0]['properties']['name'][0];
     477                        }
     478                        if (isset($mf['items'][0]['properties']['author'][0])) {
     479                                $feed_author = $mf['items'][0]['properties']['author'][0];
     480                        }
     481                }
     482                else if (count($entries) === 0) {
     483                        $entries = $mf['items'];
     484                }
     485                for ($i = 0; $i < count($entries); $i++) {
     486                        $entry = $entries[$i];
     487                        if (in_array('h-entry', $entry['type'])) {
     488                                $item = array();
     489                                $title = '';
     490                                $description = '';
     491                                if (isset($entry['properties']['url'][0])) {
     492                                        $link = $entry['properties']['url'][0];
     493                                        if (isset($link['value'])) $link = $link['value'];
     494                                        $item['link'] = array(array('data' => $link));
     495                                }
     496                                if (isset($entry['properties']['uid'][0])) {
     497                                        $guid = $entry['properties']['uid'][0];
     498                                        if (isset($guid['value'])) $guid = $guid['value'];
     499                                        $item['guid'] = array(array('data' => $guid));
     500                                }
     501                                if (isset($entry['properties']['name'][0])) {
     502                                        $title = $entry['properties']['name'][0];
     503                                        if (isset($title['value'])) $title = $title['value'];
     504                                        $item['title'] = array(array('data' => $title));
     505                                }
     506                                if (isset($entry['properties']['author'][0]) || isset($feed_author)) {
     507                                        // author is a special case, it can be plain text or an h-card array.
     508                                        // If it's plain text it can also be a url that should be followed to
     509                                        // get the actual h-card.
     510                                        $author = isset($entry['properties']['author'][0]) ?
     511                                                $entry['properties']['author'][0] : $feed_author;
     512                                        if (!is_string($author)) {
     513                                                $author = $this->parse_hcard($author);
     514                                        }
     515                                        else if (strpos($author, 'http') === 0) {
     516                                                if (isset($author_cache[$author])) {
     517                                                        $author = $author_cache[$author];
     518                                                }
     519                                                else {
     520                                                        $mf = Mf2\fetch($author);
     521                                                        foreach ($mf['items'] as $hcard) {
     522                                                                // Only interested in an h-card by itself in this case.
     523                                                                if (!in_array('h-card', $hcard['type'])) {
     524                                                                        continue;
     525                                                                }
     526                                                                // It must have a url property matching what we fetched.
     527                                                                if (!isset($hcard['properties']['url']) ||
     528                                                                                !(in_array($author, $hcard['properties']['url']))) {
     529                                                                        continue;
     530                                                                }
     531                                                                // Save parse_hcard the trouble of finding the correct url.
     532                                                                $hcard['properties']['url'][0] = $author;
     533                                                                // Cache this h-card for the next h-entry to check.
     534                                                                $author_cache[$author] = $this->parse_hcard($hcard);
     535                                                                $author = $author_cache[$author];
     536                                                                break;
     537                                                        }
     538                                                }
     539                                        }
     540                                        $item['author'] = array(array('data' => $author));
     541                                }
     542                                if (isset($entry['properties']['photo'][0])) {
     543                                        // If a photo is also in content, don't need to add it again here.
     544                                        $content = '';
     545                                        if (isset($entry['properties']['content'][0]['html'])) {
     546                                                $content = $entry['properties']['content'][0]['html'];
     547                                        }
     548                                        $photo_list = array();
     549                                        for ($j = 0; $j < count($entry['properties']['photo']); $j++) {
     550                                                $photo = $entry['properties']['photo'][$j];
     551                                                if (!empty($photo) && strpos($content, $photo) === false) {
     552                                                        $photo_list[] = $photo;
     553                                                }
     554                                        }
     555                                        // When there's more than one photo show the first and use a lightbox.
     556                                        // Need a permanent, unique name for the image set, but don't have
     557                                        // anything unique except for the content itself, so use that.
     558                                        $count = count($photo_list);
     559                                        if ($count > 1) {
     560                                                $image_set_id = preg_replace('/[[:^alnum:]]/', '', $photo_list[0]);
     561                                                $description = '<p>';
     562                                                for ($j = 0; $j < $count; $j++) {
     563                                                        $hidden = $j === 0 ? '' : 'class="hidden" ';
     564                                                        $description .= '<a href="'.$photo_list[$j].'" '.$hidden.
     565                                                                'data-lightbox="image-set-'.$image_set_id.'">'.
     566                                                                '<img src="'.$photo_list[$j].'"></a>';
     567                                                }
     568                                                $description .= '<br><b>'.$count.' photos</b></p>';
     569                                        }
     570                                        else if ($count == 1) {
     571                                                $description = '<p><img src="'.$photo_list[0].'"></p>';
     572                                        }
     573                                }
     574                                if (isset($entry['properties']['content'][0]['html'])) {
     575                                        // e-content['value'] is the same as p-name when they are on the same
     576                                        // element. Use this to replace title with a strip_tags version so
     577                                        // that alt text from images is not included in the title.
     578                                        if ($entry['properties']['content'][0]['value'] === $title) {
     579                                                $title = strip_tags($entry['properties']['content'][0]['html']);
     580                                                $item['title'] = array(array('data' => $title));
     581                                        }
     582                                        $description .= $entry['properties']['content'][0]['html'];
     583                                        if (isset($entry['properties']['in-reply-to'][0])) {
     584                                                $in_reply_to = '';
     585                                                if (is_string($entry['properties']['in-reply-to'][0])) {
     586                                                        $in_reply_to = $entry['properties']['in-reply-to'][0];
     587                                                }
     588                                                else if (isset($entry['properties']['in-reply-to'][0]['value'])) {
     589                                                        $in_reply_to = $entry['properties']['in-reply-to'][0]['value'];
     590                                                }
     591                                                if ($in_reply_to !== '') {
     592                                                        $description .= '<p><span class="in-reply-to"></span> '.
     593                                                                '<a href="'.$in_reply_to.'">'.$in_reply_to.'</a><p>';
     594                                                }
     595                                        }
     596                                        $item['description'] = array(array('data' => $description));
     597                                }
     598                                if (isset($entry['properties']['category'])) {
     599                                        $category_csv = '';
     600                                        // Categories can also contain h-cards.
     601                                        foreach ($entry['properties']['category'] as $category) {
     602                                                if ($category_csv !== '') $category_csv .= ', ';
     603                                                if (is_string($category)) {
     604                                                        // Can't have commas in categories.
     605                                                        $category_csv .= str_replace(',', '', $category);
     606                                                }
     607                                                else {
     608                                                        $category_csv .= $this->parse_hcard($category, true);
     609                                                }
     610                                        }
     611                                        $item['category'] = array(array('data' => $category_csv));
     612                                }
     613                                if (isset($entry['properties']['published'][0])) {
     614                                        $timestamp = strtotime($entry['properties']['published'][0]);
     615                                        $pub_date = date('F j Y g:ia', $timestamp).' GMT';
     616                                        $item['pubDate'] = array(array('data' => $pub_date));
     617                                }
     618                                // The title and description are set to the empty string to represent
     619                                // a deleted item (which also makes it an invalid rss item).
     620                                if (isset($entry['properties']['deleted'][0])) {
     621                                        $item['title'] = array(array('data' => ''));
     622                                        $item['description'] = array(array('data' => ''));
     623                                }
     624                                $items[] = array('child' => array('' => $item));
     625                        }
     626                }
     627                // Mimic RSS data format when storing microformats.
     628                $link = array(array('data' => $url));
     629                $image = '';
     630                if (!is_string($feed_author) &&
     631                                isset($feed_author['properties']['photo'][0])) {
     632                        $image = array(array('child' => array('' => array('url' =>
     633                                array(array('data' => $feed_author['properties']['photo'][0]))))));
     634                }
     635                // Use the name given for the h-feed, or get the title from the html.
     636                if ($feed_title !== '') {
     637                        $feed_title = array(array('data' => htmlspecialchars($feed_title)));
     638                }
     639                else if ($position = strpos($data, '<title>')) {
     640                        $start = $position < 200 ? 0 : $position - 200;
     641                        $check = substr($data, $start, 400);
     642                        $matches = array();
     643                        if (preg_match('/<title>(.+)<\/title>/', $check, $matches)) {
     644                                $feed_title = array(array('data' => htmlspecialchars($matches[1])));
     645                        }
     646                }
     647                $channel = array('channel' => array(array('child' => array('' =>
     648                        array('link' => $link, 'image' => $image, 'title' => $feed_title,
     649                              'item' => $items)))));
     650                $rss = array(array('attribs' => array('' => array('version' => '2.0')),
     651                                   'child' => array('' => $channel)));
     652                $this->data = array('child' => array('' => array('rss' => $rss)));
     653                return true;
     654        }
     655
     656        private function declare_html_entities() {
     657                // This is required because the RSS specification says that entity-encoded
     658                // html is allowed, but the xml specification says they must be declared.
     659                return '<!DOCTYPE html [ <!ENTITY nbsp "&#x00A0;"> <!ENTITY iexcl "&#x00A1;"> <!ENTITY cent "&#x00A2;"> <!ENTITY pound "&#x00A3;"> <!ENTITY curren "&#x00A4;"> <!ENTITY yen "&#x00A5;"> <!ENTITY brvbar "&#x00A6;"> <!ENTITY sect "&#x00A7;"> <!ENTITY uml "&#x00A8;"> <!ENTITY copy "&#x00A9;"> <!ENTITY ordf "&#x00AA;"> <!ENTITY laquo "&#x00AB;"> <!ENTITY not "&#x00AC;"> <!ENTITY shy "&#x00AD;"> <!ENTITY reg "&#x00AE;"> <!ENTITY macr "&#x00AF;"> <!ENTITY deg "&#x00B0;"> <!ENTITY plusmn "&#x00B1;"> <!ENTITY sup2 "&#x00B2;"> <!ENTITY sup3 "&#x00B3;"> <!ENTITY acute "&#x00B4;"> <!ENTITY micro "&#x00B5;"> <!ENTITY para "&#x00B6;"> <!ENTITY middot "&#x00B7;"> <!ENTITY cedil "&#x00B8;"> <!ENTITY sup1 "&#x00B9;"> <!ENTITY ordm "&#x00BA;"> <!ENTITY raquo "&#x00BB;"> <!ENTITY frac14 "&#x00BC;"> <!ENTITY frac12 "&#x00BD;"> <!ENTITY frac34 "&#x00BE;"> <!ENTITY iquest "&#x00BF;"> <!ENTITY Agrave "&#x00C0;"> <!ENTITY Aacute "&#x00C1;"> <!ENTITY Acirc "&#x00C2;"> <!ENTITY Atilde "&#x00C3;"> <!ENTITY Auml "&#x00C4;"> <!ENTITY Aring "&#x00C5;"> <!ENTITY AElig "&#x00C6;"> <!ENTITY Ccedil "&#x00C7;"> <!ENTITY Egrave "&#x00C8;"> <!ENTITY Eacute "&#x00C9;"> <!ENTITY Ecirc "&#x00CA;"> <!ENTITY Euml "&#x00CB;"> <!ENTITY Igrave "&#x00CC;"> <!ENTITY Iacute "&#x00CD;"> <!ENTITY Icirc "&#x00CE;"> <!ENTITY Iuml "&#x00CF;"> <!ENTITY ETH "&#x00D0;"> <!ENTITY Ntilde "&#x00D1;"> <!ENTITY Ograve "&#x00D2;"> <!ENTITY Oacute "&#x00D3;"> <!ENTITY Ocirc "&#x00D4;"> <!ENTITY Otilde "&#x00D5;"> <!ENTITY Ouml "&#x00D6;"> <!ENTITY times "&#x00D7;"> <!ENTITY Oslash "&#x00D8;"> <!ENTITY Ugrave "&#x00D9;"> <!ENTITY Uacute "&#x00DA;"> <!ENTITY Ucirc "&#x00DB;"> <!ENTITY Uuml "&#x00DC;"> <!ENTITY Yacute "&#x00DD;"> <!ENTITY THORN "&#x00DE;"> <!ENTITY szlig "&#x00DF;"> <!ENTITY agrave "&#x00E0;"> <!ENTITY aacute "&#x00E1;"> <!ENTITY acirc "&#x00E2;"> <!ENTITY atilde "&#x00E3;"> <!ENTITY auml "&#x00E4;"> <!ENTITY aring "&#x00E5;"> <!ENTITY aelig "&#x00E6;"> <!ENTITY ccedil "&#x00E7;"> <!ENTITY egrave "&#x00E8;"> <!ENTITY eacute "&#x00E9;"> <!ENTITY ecirc "&#x00EA;"> <!ENTITY euml "&#x00EB;"> <!ENTITY igrave "&#x00EC;"> <!ENTITY iacute "&#x00ED;"> <!ENTITY icirc "&#x00EE;"> <!ENTITY iuml "&#x00EF;"> <!ENTITY eth "&#x00F0;"> <!ENTITY ntilde "&#x00F1;"> <!ENTITY ograve "&#x00F2;"> <!ENTITY oacute "&#x00F3;"> <!ENTITY ocirc "&#x00F4;"> <!ENTITY otilde "&#x00F5;"> <!ENTITY ouml "&#x00F6;"> <!ENTITY divide "&#x00F7;"> <!ENTITY oslash "&#x00F8;"> <!ENTITY ugrave "&#x00F9;"> <!ENTITY uacute "&#x00FA;"> <!ENTITY ucirc "&#x00FB;"> <!ENTITY uuml "&#x00FC;"> <!ENTITY yacute "&#x00FD;"> <!ENTITY thorn "&#x00FE;"> <!ENTITY yuml "&#x00FF;"> <!ENTITY OElig "&#x0152;"> <!ENTITY oelig "&#x0153;"> <!ENTITY Scaron "&#x0160;"> <!ENTITY scaron "&#x0161;"> <!ENTITY Yuml "&#x0178;"> <!ENTITY fnof "&#x0192;"> <!ENTITY circ "&#x02C6;"> <!ENTITY tilde "&#x02DC;"> <!ENTITY Alpha "&#x0391;"> <!ENTITY Beta "&#x0392;"> <!ENTITY Gamma "&#x0393;"> <!ENTITY Epsilon "&#x0395;"> <!ENTITY Zeta "&#x0396;"> <!ENTITY Eta "&#x0397;"> <!ENTITY Theta "&#x0398;"> <!ENTITY Iota "&#x0399;"> <!ENTITY Kappa "&#x039A;"> <!ENTITY Lambda "&#x039B;"> <!ENTITY Mu "&#x039C;"> <!ENTITY Nu "&#x039D;"> <!ENTITY Xi "&#x039E;"> <!ENTITY Omicron "&#x039F;"> <!ENTITY Pi "&#x03A0;"> <!ENTITY Rho "&#x03A1;"> <!ENTITY Sigma "&#x03A3;"> <!ENTITY Tau "&#x03A4;"> <!ENTITY Upsilon "&#x03A5;"> <!ENTITY Phi "&#x03A6;"> <!ENTITY Chi "&#x03A7;"> <!ENTITY Psi "&#x03A8;"> <!ENTITY Omega "&#x03A9;"> <!ENTITY alpha "&#x03B1;"> <!ENTITY beta "&#x03B2;"> <!ENTITY gamma "&#x03B3;"> <!ENTITY delta "&#x03B4;"> <!ENTITY epsilon "&#x03B5;"> <!ENTITY zeta "&#x03B6;"> <!ENTITY eta "&#x03B7;"> <!ENTITY theta "&#x03B8;"> <!ENTITY iota "&#x03B9;"> <!ENTITY kappa "&#x03BA;"> <!ENTITY lambda "&#x03BB;"> <!ENTITY mu "&#x03BC;"> <!ENTITY nu "&#x03BD;"> <!ENTITY xi "&#x03BE;"> <!ENTITY omicron "&#x03BF;"> <!ENTITY pi "&#x03C0;"> <!ENTITY rho "&#x03C1;"> <!ENTITY sigmaf "&#x03C2;"> <!ENTITY sigma "&#x03C3;"> <!ENTITY tau "&#x03C4;"> <!ENTITY upsilon "&#x03C5;"> <!ENTITY phi "&#x03C6;"> <!ENTITY chi "&#x03C7;"> <!ENTITY psi "&#x03C8;"> <!ENTITY omega "&#x03C9;"> <!ENTITY thetasym "&#x03D1;"> <!ENTITY upsih "&#x03D2;"> <!ENTITY piv "&#x03D6;"> <!ENTITY ensp "&#x2002;"> <!ENTITY emsp "&#x2003;"> <!ENTITY thinsp "&#x2009;"> <!ENTITY zwnj "&#x200C;"> <!ENTITY zwj "&#x200D;"> <!ENTITY lrm "&#x200E;"> <!ENTITY rlm "&#x200F;"> <!ENTITY ndash "&#x2013;"> <!ENTITY mdash "&#x2014;"> <!ENTITY lsquo "&#x2018;"> <!ENTITY rsquo "&#x2019;"> <!ENTITY sbquo "&#x201A;"> <!ENTITY ldquo "&#x201C;"> <!ENTITY rdquo "&#x201D;"> <!ENTITY bdquo "&#x201E;"> <!ENTITY dagger "&#x2020;"> <!ENTITY Dagger "&#x2021;"> <!ENTITY bull "&#x2022;"> <!ENTITY hellip "&#x2026;"> <!ENTITY permil "&#x2030;"> <!ENTITY prime "&#x2032;"> <!ENTITY Prime "&#x2033;"> <!ENTITY lsaquo "&#x2039;"> <!ENTITY rsaquo "&#x203A;"> <!ENTITY oline "&#x203E;"> <!ENTITY frasl "&#x2044;"> <!ENTITY euro "&#x20AC;"> <!ENTITY image "&#x2111;"> <!ENTITY weierp "&#x2118;"> <!ENTITY real "&#x211C;"> <!ENTITY trade "&#x2122;"> <!ENTITY alefsym "&#x2135;"> <!ENTITY larr "&#x2190;"> <!ENTITY uarr "&#x2191;"> <!ENTITY rarr "&#x2192;"> <!ENTITY darr "&#x2193;"> <!ENTITY harr "&#x2194;"> <!ENTITY crarr "&#x21B5;"> <!ENTITY lArr "&#x21D0;"> <!ENTITY uArr "&#x21D1;"> <!ENTITY rArr "&#x21D2;"> <!ENTITY dArr "&#x21D3;"> <!ENTITY hArr "&#x21D4;"> <!ENTITY forall "&#x2200;"> <!ENTITY part "&#x2202;"> <!ENTITY exist "&#x2203;"> <!ENTITY empty "&#x2205;"> <!ENTITY nabla "&#x2207;"> <!ENTITY isin "&#x2208;"> <!ENTITY notin "&#x2209;"> <!ENTITY ni "&#x220B;"> <!ENTITY prod "&#x220F;"> <!ENTITY sum "&#x2211;"> <!ENTITY minus "&#x2212;"> <!ENTITY lowast "&#x2217;"> <!ENTITY radic "&#x221A;"> <!ENTITY prop "&#x221D;"> <!ENTITY infin "&#x221E;"> <!ENTITY ang "&#x2220;"> <!ENTITY and "&#x2227;"> <!ENTITY or "&#x2228;"> <!ENTITY cap "&#x2229;"> <!ENTITY cup "&#x222A;"> <!ENTITY int "&#x222B;"> <!ENTITY there4 "&#x2234;"> <!ENTITY sim "&#x223C;"> <!ENTITY cong "&#x2245;"> <!ENTITY asymp "&#x2248;"> <!ENTITY ne "&#x2260;"> <!ENTITY equiv "&#x2261;"> <!ENTITY le "&#x2264;"> <!ENTITY ge "&#x2265;"> <!ENTITY sub "&#x2282;"> <!ENTITY sup "&#x2283;"> <!ENTITY nsub "&#x2284;"> <!ENTITY sube "&#x2286;"> <!ENTITY supe "&#x2287;"> <!ENTITY oplus "&#x2295;"> <!ENTITY otimes "&#x2297;"> <!ENTITY perp "&#x22A5;"> <!ENTITY sdot "&#x22C5;"> <!ENTITY lceil "&#x2308;"> <!ENTITY rceil "&#x2309;"> <!ENTITY lfloor "&#x230A;"> <!ENTITY rfloor "&#x230B;"> <!ENTITY lang "&#x2329;"> <!ENTITY rang "&#x232A;"> <!ENTITY loz "&#x25CA;"> <!ENTITY spades "&#x2660;"> <!ENTITY clubs "&#x2663;"> <!ENTITY hearts "&#x2665;"> <!ENTITY diams "&#x2666;"> ]>';
     660        }
    407661}
  • src/wp-includes/SimplePie/Rating.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    104103                {
    105104                        return $this->scheme;
    106105                }
    107                 else
    108                 {
    109                         return null;
    110                 }
     106
     107                return null;
    111108        }
    112109
    113110        /**
     
    121118                {
    122119                        return $this->value;
    123120                }
    124                 else
    125                 {
    126                         return null;
    127                 }
     121
     122                return null;
    128123        }
    129124}
  • src/wp-includes/SimplePie/Registry.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    113112         */
    114113        public function register($type, $class, $legacy = false)
    115114        {
    116                 if (!is_subclass_of($class, $this->default[$type]))
     115                if (!@is_subclass_of($class, $this->default[$type]))
    117116                {
    118117                        return false;
    119118                }
     
    222221                $result = call_user_func_array(array($class, $method), $parameters);
    223222                return $result;
    224223        }
    225 }
    226  No newline at end of file
     224}
  • src/wp-includes/SimplePie/Restriction.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    113112                {
    114113                        return $this->relationship;
    115114                }
    116                 else
    117                 {
    118                         return null;
    119                 }
     115
     116                return null;
    120117        }
    121118
    122119        /**
     
    130127                {
    131128                        return $this->type;
    132129                }
    133                 else
    134                 {
    135                         return null;
    136                 }
     130
     131                return null;
    137132        }
    138133
    139134        /**
     
    147142                {
    148143                        return $this->value;
    149144                }
    150                 else
    151                 {
    152                         return null;
    153                 }
     145
     146                return null;
    154147        }
    155148}
  • src/wp-includes/SimplePie/Sanitize.php

     
    55 * A PHP-Based RSS and Atom Feed Framework.
    66 * Takes the hard work out of managing a complete RSS/Atom solution.
    77 *
    8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     8 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    99 * All rights reserved.
    1010 *
    1111 * Redistribution and use in source and binary forms, with or without modification, are
     
    3333 * POSSIBILITY OF SUCH DAMAGE.
    3434 *
    3535 * @package SimplePie
    36  * @version 1.3.1
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     36 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    3837 * @author Ryan Parman
    3938 * @author Geoffrey Sneddon
    4039 * @author Ryan McCue
     
    6160        var $image_handler = '';
    6261        var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
    6362        var $encode_instead_of_strip = false;
    64         var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
     63        var $strip_attributes = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
     64        var $add_attributes = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none'));
    6565        var $strip_comments = false;
    6666        var $output_encoding = 'UTF-8';
    6767        var $enable_cache = true;
     
    160160                $this->encode_instead_of_strip = (bool) $encode;
    161161        }
    162162
    163         public function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
     163        public function strip_attributes($attribs = array('bgsound', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
    164164        {
    165165                if ($attribs)
    166166                {
     
    179179                }
    180180        }
    181181
     182        public function add_attributes($attribs = array('audio' => array('preload' => 'none'), 'iframe' => array('sandbox' => 'allow-scripts allow-same-origin'), 'video' => array('preload' => 'none')))
     183        {
     184                if ($attribs)
     185                {
     186                        if (is_array($attribs))
     187                        {
     188                                $this->add_attributes = $attribs;
     189                        }
     190                        else
     191                        {
     192                                $this->add_attributes = explode(',', $attribs);
     193                        }
     194                }
     195                else
     196                {
     197                        $this->add_attributes = false;
     198                }
     199        }
     200
    182201        public function strip_comments($strip = false)
    183202        {
    184203                $this->strip_comments = (bool) $strip;
     
    249268
    250269                                if (!class_exists('DOMDocument'))
    251270                                {
    252                                         $this->registry->call('Misc', 'error', array('DOMDocument not found, unable to use sanitizer', E_USER_WARNING, __FILE__, __LINE__));
    253                                         return '';
     271                                        throw new SimplePie_Exception('DOMDocument not found, unable to use sanitizer');
    254272                                }
    255273                                $document = new DOMDocument();
    256274                                $document->encoding = 'UTF-8';
     275
    257276                                $data = $this->preprocess($data, $type);
    258277
    259278                                set_error_handler(array('SimplePie_Misc', 'silence_errors'));
     
    260279                                $document->loadHTML($data);
    261280                                restore_error_handler();
    262281
     282                                $xpath = new DOMXPath($document);
     283
    263284                                // Strip comments
    264285                                if ($this->strip_comments)
    265286                                {
    266                                         $xpath = new DOMXPath($document);
    267287                                        $comments = $xpath->query('//comment()');
    268288
    269289                                        foreach ($comments as $comment)
     
    279299                                {
    280300                                        foreach ($this->strip_htmltags as $tag)
    281301                                        {
    282                                                 $this->strip_tag($tag, $document, $type);
     302                                                $this->strip_tag($tag, $document, $xpath, $type);
    283303                                        }
    284304                                }
    285305
     
    287307                                {
    288308                                        foreach ($this->strip_attributes as $attrib)
    289309                                        {
    290                                                 $this->strip_attr($attrib, $document);
     310                                                $this->strip_attr($attrib, $xpath);
    291311                                        }
    292312                                }
    293313
     314                                if ($this->add_attributes)
     315                                {
     316                                        foreach ($this->add_attributes as $tag => $valuePairs)
     317                                        {
     318                                                $this->add_attr($tag, $valuePairs, $document);
     319                                        }
     320                                }
     321
    294322                                // Replace relative URLs
    295323                                $this->base = $base;
    296324                                foreach ($this->replace_url_attributes as $element => $attributes)
     
    326354                                                                        }
    327355                                                                        else
    328356                                                                        {
    329                                                                                 trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
     357                                                                                trigger_error("$this->cache_location is not writable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
    330358                                                                        }
    331359                                                                }
    332360                                                        }
     
    334362                                        }
    335363                                }
    336364
    337                                 // Remove the DOCTYPE
    338                                 // Seems to cause segfaulting if we don't do this
    339                                 if ($document->firstChild instanceof DOMDocumentType)
    340                                 {
    341                                         $document->removeChild($document->firstChild);
    342                                 }
    343 
    344                                 // Move everything from the body to the root
    345                                 $real_body = $document->getElementsByTagName('body')->item(0)->childNodes->item(0);
    346                                 $document->replaceChild($real_body, $document->firstChild);
    347 
     365                                // Get content node
     366                                $div = $document->getElementsByTagName('body')->item(0)->firstChild;
    348367                                // Finally, convert to a HTML string
    349                                 $data = trim($document->saveHTML());
     368                                $data = trim($document->saveHTML($div));
    350369
    351370                                if ($this->remove_div)
    352371                                {
     
    384