Make WordPress Core

Ticket #36669: update-simplepie.patch

File update-simplepie.patch, 86.6 KB (added by slushman, 8 years ago)

Patch updating SimplePie to version 1.4.

  • 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
  • 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
  • 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
  • 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
     
    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        /**
  • 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;
  • 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}
  • wp-includes/SimplePie/Cache/MySQL.php

    Property changes on: wp-includes/SimplePie/Cache/Memcached.php
    ___________________________________________________________________
    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));
     99               
     100                $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
    100101
    101102                // Path is prefixed with a "/"
    102103                $this->options['dbname'] = substr($this->options['path'], 1);
     
    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;
  • 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        $this->cache = $redis;
     69
     70        if (!is_null($options) && is_array($options)) {
     71            $this->options = $options;
     72        } else {
     73            $this->options = array (
     74                'prefix' => 'rss:simple_primary:',
     75                'expire' => 0,
     76            );
     77        }
     78
     79        $this->name = $this->options['prefix'] . $name;
     80    }
     81
     82    /**
     83     * @param \Redis $cache
     84     */
     85    public function setRedisClient(\Redis $cache) {
     86        $this->cache = $cache;
     87    }
     88
     89    /**
     90     * Save data to the cache
     91     *
     92     * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property
     93     * @return bool Successfulness
     94     */
     95    public function save($data) {
     96        if ($data instanceof SimplePie) {
     97            $data = $data->data;
     98        }
     99        $response = $this->cache->set($this->name, serialize($data));
     100        if ($this->options['expire']) {
     101            $this->cache->expire($this->name, $this->options['expire']);
     102        }
     103
     104        return $response;
     105    }
     106
     107    /**
     108     * Retrieve the data saved to the cache
     109     *
     110     * @return array Data for SimplePie::$data
     111     */
     112    public function load() {
     113        $data = $this->cache->get($this->name);
     114
     115        if ($data !== false) {
     116            return unserialize($data);
     117        }
     118        return false;
     119    }
     120
     121    /**
     122     * Retrieve the last modified time for the cache
     123     *
     124     * @return int Timestamp
     125     */
     126    public function mtime() {
     127
     128        $data = $this->cache->get($this->name);
     129
     130        if ($data !== false) {
     131            return time();
     132        }
     133
     134        return false;
     135    }
     136
     137    /**
     138     * Set the last modified time to the current time
     139     *
     140     * @return bool Success status
     141     */
     142    public function touch() {
     143
     144        $data = $this->cache->get($this->name);
     145
     146        if ($data !== false) {
     147            $return = $this->cache->set($this->name, $data);
     148            if ($this->options['expire']) {
     149                return $this->cache->expire($this->name, $this->ttl);
     150            }
     151            return $return;
     152        }
     153
     154        return false;
     155    }
     156
     157    /**
     158     * Remove the cache
     159     *
     160     * @return bool Success status
     161     */
     162    public function unlink() {
     163        return $this->cache->set($this->name, null);
     164    }
     165
     166}
  • wp-includes/SimplePie/Cache.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
     
    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        /**
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
     
    169168                        case "\x09":
    170169                        case "\x0A":
    171170                        case "\x0B":
    172                         case "\x0B":
    173171                        case "\x0C":
    174172                        case "\x20":
    175173                        case "\x3C":
  • 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
     
    451450        /**
    452451         * Get the duration of the enclosure
    453452         *
    454          * @param string $convert Convert seconds into hh:mm:ss
     453         * @param bool $convert Convert seconds into hh:mm:ss
    455454         * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found)
    456455         */
    457456        public function get_duration($convert = false)
     
    942941         * - `height` (integer): The height of the embedded media. Accepts any
    943942         *    numeric pixel value (such as `360`) or `auto`. Defaults to `auto`,
    944943         *    and it is recommended that you use this default.
    945          * - `loop` (boolean): Do you want the media to loop when its done?
     944         * - `loop` (boolean): Do you want the media to loop when it's done?
    946945         *    Defaults to `false`.
    947946         * - `mediaplayer` (string): The location of the included
    948947         *    `mediaplayer.swf` file. This allows for the playback of Flash Video
  • 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
  • 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                {
     
    7474                        $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
    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);
    131139                                        $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
    132140                                        $this->headers = array_pop($this->headers);
     
    140148                                                {
    141149                                                        $this->redirects++;
    142150                                                        $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
    143                                                         return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     151                                                        $previousStatusCode = $this->status_code;
     152                                                        $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     153                                                        $this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
     154                                                        return;
    144155                                                }
    145156                                        }
    146157                                }
     
    222233                                                        {
    223234                                                                $this->redirects++;
    224235                                                                $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
    225                                                                 return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     236                                                                $previousStatusCode = $this->status_code;
     237                                                                $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
     238                                                                $this->permanent_url = ($previousStatusCode == 301) ? $location : $url;
     239                                                                return;
    226240                                                        }
    227241                                                        if (isset($this->headers['content-encoding']))
    228242                                                        {
     
    282296                else
    283297                {
    284298                        $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
    285                         if (!$this->body = file_get_contents($url))
     299                        if (empty($url) || !($this->body = file_get_contents($url)))
    286300                        {
    287301                                $this->error = 'file_get_contents could not read the file';
    288302                                $this->success = false;
  • 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
  • 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
     
    260259        }
    261260
    262261        /**
     262         * Clean up
     263         */
     264        public function __destruct() {
     265            $this->set_iri(null, true);
     266            $this->set_path(null, true);
     267            $this->set_authority(null, true);
     268        }
     269
     270        /**
    263271         * Create a new IRI object by resolving a relative IRI
    264272         *
    265273         * Returns false if $base is not absolute, otherwise an IRI.
     
    797805         * @param string $iri
    798806         * @return bool
    799807         */
    800         public function set_iri($iri)
     808        public function set_iri($iri, $clear_cache = false)
    801809        {
    802810                static $cache;
     811                if ($clear_cache)
     812                {
     813                        $cache = null;
     814                        return;
     815                }
    803816                if (!$cache)
    804817                {
    805818                        $cache = array();
     
    879892         * @param string $authority
    880893         * @return bool
    881894         */
    882         public function set_authority($authority)
     895        public function set_authority($authority, $clear_cache = false)
    883896        {
    884897                static $cache;
     898                if ($clear_cache)
     899                {
     900                        $cache = null;
     901                        return;
     902                }
    885903                if (!$cache)
    886904                        $cache = array();
    887905
     
    10491067         * @param string $ipath
    10501068         * @return bool
    10511069         */
    1052         public function set_path($ipath)
     1070        public function set_path($ipath, $clear_cache = false)
    10531071        {
    10541072                static $cache;
     1073                if ($clear_cache)
     1074                {
     1075                        $cache = null;
     1076                        return;
     1077                }
    10551078                if (!$cache)
    10561079                {
    10571080                        $cache = array();
  • 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
     
    238237                        {
    239238                                return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);
    240239                        }
    241                         elseif (($return = $this->get_permalink()) !== null)
    242                         {
    243                                 return $return;
    244                         }
    245                         elseif (($return = $this->get_title()) !== null)
    246                         {
    247                                 return $return;
    248                         }
    249240                }
    250                 if ($this->get_permalink() !== null || $this->get_title() !== null)
    251                 {
    252                         return md5($this->get_permalink() . $this->get_title());
    253                 }
    254                 else
    255                 {
    256                         return md5(serialize($this->data));
    257                 }
     241                return md5(serialize($this->data));
    258242        }
    259243
    260244        /**
     
    406390                        return null;
    407391                }
    408392        }
     393       
     394        /**
     395         * Get the media:thumbnail of the item
     396         *
     397         * Uses `<media:thumbnail>`
     398         *
     399         *
     400         * @return array|null
     401         */
     402        public function get_thumbnail()
     403        {
     404                if (!isset($this->data['thumbnail']))
     405                {
     406                        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
     407                        {
     408                                $this->data['thumbnail'] = $return[0]['attribs'][''];
     409                        }
     410                        else
     411                        {
     412                                $this->data['thumbnail'] = null;
     413                        }
     414                }
     415                return $this->data['thumbnail'];
     416        }       
    409417
    410418        /**
    411419         * Get a category for the item
     
    446454                        $label = null;
    447455                        if (isset($category['attribs']['']['term']))
    448456                        {
    449                                 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
     457                                $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_HTML);
    450458                        }
    451459                        if (isset($category['attribs']['']['scheme']))
    452460                        {
    453                                 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
     461                                $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_HTML);
    454462                        }
    455463                        if (isset($category['attribs']['']['label']))
    456464                        {
    457                                 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
     465                                $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_HTML);
    458466                        }
    459467                        $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
    460468                }
     
    462470                {
    463471                        // This is really the label, but keep this as the term also for BC.
    464472                        // Label will also work on retrieving because that falls back to term.
    465                         $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     473                        $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML);
    466474                        if (isset($category['attribs']['']['domain']))
    467475                        {
    468                                 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
     476                                $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_HTML);
    469477                        }
    470478                        else
    471479                        {
     
    475483                }
    476484                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
    477485                {
    478                         $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
     486                        $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
    479487                }
    480488                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
    481489                {
    482                         $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
     490                        $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
    483491                }
    484492
    485493                if (!empty($categories))
     
    616624                        $email = null;
    617625                        if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
    618626                        {
    619                                 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     627                                $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
    620628                        }
    621629                        if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
    622630                        {
     
    624632                        }
    625633                        if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
    626634                        {
    627                                 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     635                                $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
    628636                        }
    629637                        if ($name !== null || $email !== null || $uri !== null)
    630638                        {
     
    638646                        $email = null;
    639647                        if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
    640648                        {
    641                                 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     649                                $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
    642650                        }
    643651                        if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
    644652                        {
     
    646654                        }
    647655                        if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
    648656                        {
    649                                 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     657                                $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
    650658                        }
    651659                        if ($name !== null || $email !== null || $url !== null)
    652660                        {
     
    655663                }
    656664                if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
    657665                {
    658                         $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)));
     666                        $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_HTML)));
    659667                }
    660668                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
    661669                {
    662                         $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
     670                        $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
    663671                }
    664672                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
    665673                {
    666                         $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
     674                        $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
    667675                }
    668676                foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
    669677                {
    670                         $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
     678                        $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_HTML), null, null));
    671679                }
    672680
    673681                if (!empty($authors))
     
    738746                        {
    739747                                $this->data['date']['raw'] = $return[0]['data'];
    740748                        }
    741                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
     749                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
    742750                        {
    743751                                $this->data['date']['raw'] = $return[0]['data'];
    744752                        }
    745                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
     753                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
    746754                        {
    747755                                $this->data['date']['raw'] = $return[0]['data'];
    748756                        }
    749                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
     757                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
    750758                        {
    751759                                $this->data['date']['raw'] = $return[0]['data'];
    752760                        }
    753                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
     761                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
    754762                        {
    755763                                $this->data['date']['raw'] = $return[0]['data'];
    756764                        }
    757                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
     765                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
    758766                        {
    759767                                $this->data['date']['raw'] = $return[0]['data'];
    760768                        }
    761                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
     769                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
    762770                        {
    763771                                $this->data['date']['raw'] = $return[0]['data'];
    764772                        }
    765                         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
     773                        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
    766774                        {
    767775                                $this->data['date']['raw'] = $return[0]['data'];
    768776                        }
     
    821829                        if (!empty($this->data['updated']['raw']))
    822830                        {
    823831                                $parser = $this->registry->call('Parse_Date', 'get');
    824                                 $this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']);
     832                                $this->data['updated']['parsed'] = $parser->parse($this->data['updated']['raw']);
    825833                        }
    826834                        else
    827835                        {
     
    10801088         *
    10811089         * @since Beta 2
    10821090         * @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).
     1091         * @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).
    10841092         * @return array|null List of SimplePie_Enclosure items
    10851093         */
    10861094        public function get_enclosures()
     
    26582666                                                // PLAYER
    26592667                                                if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
    26602668                                                {
    2661                                                         $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2669                                                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'])) {
     2670                                                                $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2671                                                        }
    26622672                                                }
    26632673                                                else
    26642674                                                {
     
    27332743                                                {
    27342744                                                        foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
    27352745                                                        {
    2736                                                                 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2746                                                                if (isset($thumbnail['attribs']['']['url'])) {
     2747                                                                        $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
     2748                                                                }
    27372749                                                        }
    27382750                                                        if (is_array($thumbnails))
    27392751                                                        {
  • 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
     
    121120                {
    122121                        if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
    123122                        {
    124                                 return $working;
     123                                return $working[0];
    125124                        }
    126125
    127126                        if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
    128127                        {
    129                                 return $working;
     128                                return $working[0];
    130129                        }
    131130
    132131                        if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
    133132                        {
    134                                 return $working;
     133                                return $working[0];
    135134                        }
    136135
    137136                        if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
    138137                        {
    139                                 return $working;
     138                                return $working[0];
    140139                        }
    141140                }
    142141                return null;
    143142        }
    144143
    145         public function is_feed($file)
     144        public function is_feed($file, $check_html = false)
    146145        {
    147146                if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
    148147                {
    149148                        $sniffer = $this->registry->create('Content_Type_Sniffer', array($file));
    150149                        $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')))
     150                        $mime_types = array('application/rss+xml', 'application/rdf+xml',
     151                                            'text/rdf', 'application/atom+xml', 'text/xml',
     152                                            'application/xml', 'application/x-rss+xml');
     153                        if ($check_html)
    152154                        {
     155                                $mime_types[] = 'text/html';
     156                        }
     157                        if (in_array($sniffed, $mime_types))
     158                        {
    153159                                return true;
    154160                        }
    155161                        else
     
    242248                                        continue;
    243249                                }
    244250
    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]))
     251                                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]))
    246252                                {
    247253                                        $this->checked_feeds++;
    248254                                        $headers = array(
     
    249255                                                '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',
    250256                                        );
    251257                                        $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))
     258                                        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))
    253259                                        {
    254260                                                $feeds[$href] = $feed;
    255261                                        }
     
    330336                                $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent));
    331337                                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))
    332338                                {
    333                                         return $feed;
     339                                        return array($feed);
    334340                                }
    335341                                else
    336342                                {
     
    358364                                $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent));
    359365                                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))
    360366                                {
    361                                         return $feed;
     367                                        return array($feed);
    362368                                }
    363369                                else
    364370                                {
  • 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                {
     
    224223                }
    225224        }
    226225
     226        public static function array_merge_recursive($array1, $array2)
     227        {
     228                foreach ($array2 as $key => $value)
     229                {
     230                        if (is_array($value))
     231                        {
     232                                $array1[$key] = SimplePie_Misc::array_merge_recursive($array1[$key], $value);
     233                        }
     234                        else
     235                        {
     236                                $array1[$key] = $value;
     237                        }           
     238                }
     239               
     240                return $array1;
     241        }
     242
    227243        public static function parse_url($url)
    228244        {
    229245                $iri = new SimplePie_IRI($url);
  • 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
  • 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
     
    173172                'aug' => 8,
    174173                'august' => 8,
    175174                'sep' => 9,
    176                 'september' => 8,
     175                'september' => 9,
    177176                'oct' => 10,
    178177                'october' => 10,
    179178                'nov' => 11,
     
    614613         *
    615614         * @final
    616615         * @access public
    617          * @param callable $callback
     616         * @param callback $callback
    618617         */
    619618        public function add_callback($callback)
    620619        {
     
    721720                {
    722721                        $output .= substr($string, $position, $pos - $position);
    723722                        $position = $pos + 1;
    724                         if ($string[$pos - 1] !== '\\')
     723                        if ($pos === 0 || $string[$pos - 1] !== '\\')
    725724                        {
    726725                                $depth++;
    727726                                while ($depth && $position < $length)
  • 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                $position = 0;
     80                while ($position = strpos($data, 'h-entry', $position + 7)) {
     81                        $start = $position < 200 ? 0 : $position - 200;
     82                        $check = substr($data, $start, 400);
     83                        if (preg_match('/class="[^"]*h-entry/', $check)) {
     84                                return $this->parse_microformats($data, $url);
     85                        }
     86                }
     87
    8088                // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
    8189                if (strtoupper($encoding) === 'US-ASCII')
    8290                {
     
    120128                        if ($declaration->parse())
    121129                        {
    122130                                $data = substr($data, $pos + 2);
    123                                 $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data;
     131                                $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data;
    124132                        }
    125133                        else
    126134                        {
     
    404412                }
    405413                return $cache[$string];
    406414        }
    407 }
     415
     416        private function parse_hcard($data) {
     417                $name = '';
     418                $link = '';
     419                // Check if h-card is set and pass that information on in the link.
     420                if (isset($data['type']) && in_array('h-card', $data['type'])) {
     421                        if (isset($data['properties']['name'][0])) {
     422                                $name = $data['properties']['name'][0];
     423                        }
     424                        if (isset($data['properties']['url'][0])) {
     425                                $link = $data['properties']['url'][0];
     426                                if ($name === '') {
     427                                        $name = $link;
     428                                }
     429                                else {
     430                                        // can't have commas in categories.
     431                                        $name = str_replace(',', '', $name);
     432                                }
     433                                return '<a class="h-card" href="'.$link.'">'.$name.'</a>';
     434                        }
     435                }
     436                return isset($data['value']) ? $data['value'] : '';
     437        }
     438
     439        private function parse_microformats(&$data, $url) {
     440                if (!function_exists('Mf2\parse')) return false;
     441
     442                $feed_title = '';
     443                $icon = '';
     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 an h-feed 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                                break;
     460                        }
     461                }
     462                if (isset($h_feed['children'])) {
     463                        $entries = $h_feed['children'];
     464                        // Also set the feed title and icon from the h-feed if available.
     465                        if (isset($mf['items'][0]['properties']['name'][0])) {
     466                                $feed_title = $mf['items'][0]['properties']['name'][0];
     467                        }
     468                        if (isset($mf['items'][0]['properties']['author'][0])) {
     469                                $author = $mf['items'][0]['properties']['author'][0];
     470                                if (is_array($author) &&
     471                                                isset($author['type']) && in_array('h-card', $author['type'])) {
     472                                        if (isset($author['properties']['photo'][0])) {
     473                                                $icon = $author['properties']['photo'][0];
     474                                        }
     475                                }
     476                        }
     477                }
     478                else {
     479                        $entries = $mf['items'];
     480                }
     481                for ($i = 0; $i < count($entries); $i++) {
     482                        $entry = $entries[$i];
     483                        if (in_array('h-entry', $entry['type'])) {
     484                                $item = array();
     485                                $description = '';
     486                                if (isset($entry['properties']['url'][0])) {
     487                                        $link = $entry['properties']['url'][0];
     488                                        $item['link'] = array(array('data' => $link));
     489                                }
     490                                if (isset($entry['properties']['name'][0])) {
     491                                        $title = $entry['properties']['name'][0];
     492                                        $item['title'] = array(array('data' => $title));
     493                                }
     494                                if (isset($entry['properties']['author'][0])) {
     495                                        // author is a special case, it can be plain text or an h-card array.
     496                                        // If it's plain text it can also be a url that should be followed to
     497                                        // get the actual h-card.
     498                                        $author = $entry['properties']['author'][0];
     499                                        if (is_array($author)) {
     500                                                $author = $this->parse_hcard($author);
     501                                        }
     502                                        else if (strpos($author, 'http') === 0) {
     503                                                if (isset($author_cache[$author])) {
     504                                                        $author = $author_cache[$author];
     505                                                }
     506                                                else {
     507                                                        $mf = Mf2\fetch($author);
     508                                                        foreach ($mf['items'] as $hcard) {
     509                                                                // Only interested in an h-card by itself in this case.
     510                                                                if (!in_array('h-card', $hcard['type'])) {
     511                                                                        continue;
     512                                                                }
     513                                                                // It must have a url property matching what we fetched.
     514                                                                if (!isset($hcard['properties']['url']) ||
     515                                                                                !(in_array($author, $hcard['properties']['url']))) {
     516                                                                        continue;
     517                                                                }
     518                                                                // Save parse_hcard the trouble of finding the correct url.
     519                                                                $hcard['properties']['url'][0] = $author;
     520                                                                // Cache this h-card for the next h-entry to check.
     521                                                                $author_cache[$author] = $this->parse_hcard($hcard, $author);
     522                                                                $author = $author_cache[$author];
     523                                                                break;
     524                                                        }
     525                                                }
     526                                        }
     527                                        $item['author'] = array(array('data' => $author));
     528                                }
     529                                if (isset($entry['properties']['photo'][0])) {
     530                                        // If a photo is also in content, don't need to add it again here.
     531                                        $content = '';
     532                                        if (isset($entry['properties']['content'][0]['html'])) {
     533                                                $content = $entry['properties']['content'][0]['html'];
     534                                        }
     535                                        $photo_list = array();
     536                                        for ($j = 0; $j < count($entry['properties']['photo']); $j++) {
     537                                                $photo = $entry['properties']['photo'][$j];
     538                                                if (strpos($content, $photo) === false) {
     539                                                        $photo_list[] = $photo;
     540                                                }
     541                                        }
     542                                        // When there's more than one photo show the first and use a lightbox.
     543                                        $count = count($photo_list);
     544                                        if ($count > 1) {
     545                                                $description = '<p>';
     546                                                for ($j = 0; $j < $count; $j++) {
     547                                                        $hidden = $j === 0 ? '' : 'class="hidden" ';
     548                                                        $description .= '<a href="'.$photo_list[$j].'" '.$hidden.
     549                                                                'data-lightbox="image-set-'.$i.'">'.
     550                                                                '<img src="'.$photo_list[$j].'"></a>';
     551                                                }
     552                                                $description .= '<br><b>'.$count.' photos</b></p>';
     553                                        }
     554                                        else if ($count == 1) {
     555                                                $description = '<p><img src="'.$photo_list[0].'"></p>';
     556                                        }
     557                                }
     558                                if (isset($entry['properties']['content'][0]['html'])) {
     559                                        $description .= $entry['properties']['content'][0]['html'];
     560                                        $item['description'] = array(array('data' => $description));
     561                                }
     562                                if (isset($entry['properties']['category'])) {
     563                                        $category_csv = '';
     564                                        // categories can also contain h-cards.
     565                                        foreach ($entry['properties']['category'] as $category) {
     566                                                if ($category_csv !== '') $category_csv .= ', ';
     567                                                if (is_array($category)) {
     568                                                        $category_csv .= $this->parse_hcard($category);
     569                                                }
     570                                                else {
     571                                                        // can't have commas in categories.
     572                                                        $category_csv .= str_replace(',', '', $category);
     573                                                }
     574                                        }
     575                                        $item['category'] = array(array('data' => $category_csv));
     576                                }
     577                                if (isset($entry['properties']['published'][0])) {
     578                                        $timestamp = strtotime($entry['properties']['published'][0]);
     579                                        $pub_date = date('F j Y g:ia', $timestamp).' GMT';
     580                                        $item['pubDate'] = array(array('data' => $pub_date));
     581                                }
     582                                $items[] = array('child' => array('' => $item));
     583                        }
     584                }
     585                // Mimic RSS data format when storing microformats.
     586                $link = array(array('data' => $url));
     587                $image = '';
     588                if ($icon !== '') {
     589                        array(array('child' => array('' =>
     590                              array('url' => array(array('data' => $icon))))));
     591                }
     592                // Use the a name given for the h-feed, or get the title from the html.
     593                if ($feed_title !== '') {
     594                        $feed_title = array(array('data' => htmlspecialchars($feed_title)));
     595                }
     596                else if ($position = strpos($data, '<title>')) {
     597                        $start = $position < 200 ? 0 : $position - 200;
     598                        $check = substr($data, $start, 400);
     599                        $matches = array();
     600                        if (preg_match('/<title>(.+)<\/title>/', $check, $matches)) {
     601                                $feed_title = array(array('data' => htmlspecialchars($matches[1])));
     602                        }
     603                }
     604                $channel = array('channel' => array(array('child' => array('' =>
     605                        array('link' => $link, 'image' => $image, 'title' => $feed_title,
     606                              'item' => $items)))));
     607                $rss = array(array('attribs' => array('' => array('version' => '2.0')),
     608                                   'child' => array('' => $channel)));
     609                $this->data = array('child' => array('' => array('rss' => $rss)));
     610                return true;
     611        }
     612
     613        private function declare_html_entities() {
     614                // This is required because the RSS specification says that entity-encoded
     615                // html is allowed, but the xml specification says they must be declared.
     616                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;"> ]>';
     617        }
     618}
     619 No newline at end of file
  • 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
  • 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}
  • 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
  • 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
     276                                // See https://github.com/simplepie/simplepie/issues/334
     277                                $unique_tag = '#'.uniqid().'#';
     278                                $data = trim($unique_tag . $data . $unique_tag);
     279
    257280                                $data = $this->preprocess($data, $type);
    258281
    259282                                set_error_handler(array('SimplePie_Misc', 'silence_errors'));
     
    260283                                $document->loadHTML($data);
    261284                                restore_error_handler();
    262285
     286                                $xpath = new DOMXPath($document);
     287
    263288                                // Strip comments
    264289                                if ($this->strip_comments)
    265290                                {
    266                                         $xpath = new DOMXPath($document);
    267291                                        $comments = $xpath->query('//comment()');
    268292
    269293                                        foreach ($comments as $comment)
     
    279303                                {
    280304                                        foreach ($this->strip_htmltags as $tag)
    281305                                        {
    282                                                 $this->strip_tag($tag, $document, $type);
     306                                                $this->strip_tag($tag, $document, $xpath, $type);
    283307                                        }
    284308                                }
    285309
     
    287311                                {
    288312                                        foreach ($this->strip_attributes as $attrib)
    289313                                        {
    290                                                 $this->strip_attr($attrib, $document);
     314                                                $this->strip_attr($attrib, $xpath);
    291315                                        }
    292316                                }
    293317
     318                                if ($this->add_attributes)
     319                                {
     320                                        foreach ($this->add_attributes as $tag => $valuePairs)
     321                                        {
     322                                                $this->add_attr($tag, $valuePairs, $document);
     323                                        }
     324                                }
     325
    294326                                // Replace relative URLs
    295327                                $this->base = $base;
    296328                                foreach ($this->replace_url_attributes as $element => $attributes)
     
    334366                                        }
    335367                                }
    336368
    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 
    348369                                // Finally, convert to a HTML string
    349370                                $data = trim($document->saveHTML());
    350371
     372                                list($_, $data, $_) = explode($unique_tag, $data);
     373
    351374                                if ($this->remove_div)
    352375                                {
    353376                                        $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);
     
    384407        protected function preprocess($html, $type)
    385408        {
    386409                $ret = '';
     410                $html = preg_replace('%</?(?:html|body)[^>]*?'.'>%is', '', $html);
    387411                if ($type & ~SIMPLEPIE_CONSTRUCT_XHTML)
    388412                {
    389413                        // Atom XHTML constructs are wrapped with a div by default
     
    456480                }
    457481        }
    458482
    459         protected function strip_tag($tag, $document, $type)
     483        protected function strip_tag($tag, $document, $xpath, $type)
    460484        {
    461                 $xpath = new DOMXPath($document);
    462485                $elements = $xpath->query('body//' . $tag);
    463486                if ($this->encode_instead_of_strip)
    464487                {
     
    541564                }
    542565        }
    543566
    544         protected function strip_attr($attrib, $document)
     567        protected function strip_attr($attrib, $xpath)
    545568        {
    546                 $xpath = new DOMXPath($document);
    547569                $elements = $xpath->query('//*[@' . $attrib . ']');
    548570
    549571                foreach ($elements as $element)
     
    551573                        $element->removeAttribute($attrib);
    552574                }
    553575        }
     576
     577        protected function add_attr($tag, $valuePairs, $document)
     578        {
     579                $elements = $document->getElementsByTagName($tag);
     580                foreach ($elements as $element)
     581                {
     582                        foreach ($valuePairs as $attrib => $value)
     583                        {
     584                                $element->setAttribute($attrib, $value);
     585                        }
     586                }
     587        }
    554588}
  • wp-includes/SimplePie/Source.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
  • wp-includes/SimplePie/XML/Declaration/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
  • wp-includes/SimplePie/gzdecode.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
  • wp-includes/class-simplepie.php

     
    6565 * A PHP-Based RSS and Atom Feed Framework.
    6666 * Takes the hard work out of managing a complete RSS/Atom solution.
    6767 *
    68  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
     68 * Copyright (c) 2004-2016, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
    6969 * All rights reserved.
    7070 *
    7171 * Redistribution and use in source and binary forms, with or without modification, are
     
    9393 * POSSIBILITY OF SUCH DAMAGE.
    9494 *
    9595 * @package SimplePie
    96  * @version 1.3.1
    97  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
     96 * @copyright 2004-2016 Ryan Parman, Geoffrey Sneddon, Ryan McCue
    9897 * @author Ryan Parman
    9998 * @author Geoffrey Sneddon
    10099 * @author Ryan McCue
     
    102101 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
    103102 */
    104103
     104
    105105/**
    106106 * SimplePie Name
    107107 */
     
    110110/**
    111111 * SimplePie Version
    112112 */
    113 define('SIMPLEPIE_VERSION', '1.3.1');
     113define('SIMPLEPIE_VERSION', '1.4');
    114114
    115115/**
    116116 * SimplePie Build
     
    31163116                }
    31173117        }
    31183118}
    3119 endif;
    3120  No newline at end of file
     3119endif;