diff --git a/wp-content/plugins/feedwordpress/feeds-page.php b/wp-content/plugins/feedwordpress/feeds-page.php index 011d92e832fd096510d534697abcc1adadb20249..84b3f87a8677bd5ba6069ceeb0e3f368ca055688 100644 --- a/wp-content/plugins/feedwordpress/feeds-page.php +++ b/wp-content/plugins/feedwordpress/feeds-page.php @@ -194,15 +194,25 @@ class FeedWordPressFeedsPage extends FeedWordPressAdminPage { </select> <div id="cron-job-explanation" class="setting-description"> <p><?php - $path = `which curl`; $opts = '--silent %s'; - if (is_null($path) or strlen(trim($path))==0) : + // Do we have shell_exec() available from here, or is it disabled for security reasons? + // If it's available, use it to execute `which` to try to get a realistic path to curl, + // or to wget. If everything fails or shell_exec() isn't available, then just make + // up something for the sake of example. + $shellExecAvailable = (is_callable('shell_exec') && false === stripos(ini_get('disable_functions'), 'shell_exec')); + + if ($shellExecAvailable) : + $path = `which curl`; $opts = '--silent %s'; + endif; + + if ($shellExecAvailable and (is_null($path) or strlen(trim($path))==0)) : $path = `which wget`; $opts = '-q -O - %s'; - if (is_null($path) or strlen(trim($path))==0) : - $path = '/usr/bin/curl'; $opts = '--silent %s'; - endif; endif; + + if (is_null($path) or strlen(trim($path))==0) : + $path = '/usr/bin/curl'; $opts = '--silent %s'; + endif; + $path = preg_replace('/\n+$/', '', $path); - $crontab = `crontab -l`; $cmdline = $path . ' ' . sprintf($opts, get_bloginfo('url').'?update_feedwordpress=1'); diff --git a/wp-content/plugins/feedwordpress/feedwordpress.php b/wp-content/plugins/feedwordpress/feedwordpress.php index 6526acbd570bbd406e94a65ad2e9fcac7a97b1ca..1f1b2fc81f260380ba72b73d3c40871f971fddbd 100644 --- a/wp-content/plugins/feedwordpress/feedwordpress.php +++ b/wp-content/plugins/feedwordpress/feedwordpress.php @@ -3,7 +3,7 @@ Plugin Name: FeedWordPress Plugin URI: http://feedwordpress.radgeek.com/ Description: simple and flexible Atom/RSS syndication for WordPress -Version: 2016.1213 +Version: 2017.1004 Author: Charles Johnson Author URI: http://radgeek.com/ License: GPL @@ -11,7 +11,7 @@ License: GPL /** * @package FeedWordPress - * @version 2016.1213 + * @version 2017.1004 */ # This uses code derived from: @@ -32,7 +32,7 @@ License: GPL # -- Don't change these unless you know what you're doing... -define ('FEEDWORDPRESS_VERSION', '2016.1213'); +define ('FEEDWORDPRESS_VERSION', '2017.1004'); define ('FEEDWORDPRESS_AUTHOR_CONTACT', 'http://radgeek.com/contact'); if (!defined('FEEDWORDPRESS_BLEG')) : @@ -634,7 +634,7 @@ function syndication_comments_feed_link ($link) { $source = get_syndication_feed_object(); $replacement = NULL; - if ($source->setting('munge comments feed links', 'munge_comments_feed_links', 'yes') != 'no') : + if (is_object($source) && $source->setting('munge comments feed links', 'munge_comments_feed_links', 'yes') != 'no') : $commentFeeds = get_post_custom_values('wfw:commentRSS'); if ( is_array($commentFeeds) @@ -1823,7 +1823,8 @@ class FeedWordPress { // Explicit update request in the HTTP request (e.g. from a cron job) if (self::update_requested()) : - + /*DBG*/ header("Content-Type: text/plain"); + $this->update_hooked = "Initiating a CRON JOB CHECK-IN ON UPDATE SCHEDULE due to URL parameter = ".trim($this->val($_REQUEST['update_feedwordpress'])); $this->update($this->update_requested_url()); diff --git a/wp-content/plugins/feedwordpress/feedwordpresslocalpost.class.php b/wp-content/plugins/feedwordpress/feedwordpresslocalpost.class.php index 743f65122a7f1bab75f65eb626b6894d0c74d875..3d6ff5a7fd321cdf310c1a089a688e0570013a4d 100644 --- a/wp-content/plugins/feedwordpress/feedwordpresslocalpost.class.php +++ b/wp-content/plugins/feedwordpress/feedwordpresslocalpost.class.php @@ -93,7 +93,9 @@ class FeedWordPressLocalPost { public function feed () { global $feedwordpress; - $this->link = $feedwordpress->subscription($this->feed_id()); + if (is_object($feedwordpress) and method_exists($feedwordpress, 'subscription')) : + $this->link = $feedwordpress->subscription($this->feed_id()); + endif; return $this->link; } diff --git a/wp-content/plugins/feedwordpress/feedwordpresssyndicationpage.class.php b/wp-content/plugins/feedwordpress/feedwordpresssyndicationpage.class.php index cd1b71299bf6ffcc67136c0fa9803a29328d7a3b..64025e5612c1348093489840c5da28954e09bf7c 100644 --- a/wp-content/plugins/feedwordpress/feedwordpresssyndicationpage.class.php +++ b/wp-content/plugins/feedwordpress/feedwordpresssyndicationpage.class.php @@ -701,7 +701,7 @@ class FeedWordPressSyndicationPage extends FeedWordPressAdminPage { var s = document.createElement('script'), t = document.getElementsByTagName('script')[0]; s.type = 'text/javascript'; s.async = true; - s.src = 'http://api.flattr.com/js/0.6/load.js?mode=auto'; + s.src = 'https://api.flattr.com/js/0.6/load.js?mode=auto'; t.parentNode.insertBefore(s, t); })(); /* ]]> */</script> @@ -723,7 +723,7 @@ support, and documentation.</p> <div style="display: inline-block; vertical-align: middle; "> <a class="FlattrButton" style="display:none;" href="http://feedwordpress.radgeek.com/"></a> <noscript> -<a href="http://flattr.com/thing/1380856/FeedWordPress" target="_blank"><img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a> +<a href="https://flattr.com/thing/1380856/FeedWordPress" target="_blank"><img src="https://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a> </noscript> <div>via Flattr</div> @@ -865,7 +865,7 @@ regular donation</a>) using an existing PayPal account or any major credit card. foreach ($alter as $sql) : $result = $wpdb->query($sql); if (!$result): - $errs[] = mysql_error(); + $errs[] = $wpdb->last_error; endif; endforeach; @@ -988,7 +988,7 @@ regular donation</a>) using an existing PayPal account or any major credit card. foreach ($alter as $sql) : $result = $wpdb->query($sql); if (!$result): - $errs[] = mysql_error(); + $errs[] = $wpdb->last_error; endif; endforeach; @@ -1218,7 +1218,7 @@ has been added as a contributing site, using the feed at <<a href="<?php print $fwp_post['feed']; ?>"><?php print esc_html($fwp_post['feed']); ?></a>>. | <a href="admin.php?page=<?php print $fwp_path; ?>/feeds-page.php&link_id=<?php print $link_id; ?>">Configure settings</a>.</p></div> <?php else: ?> -<div class="updated"><p>There was a problem adding the feed. [SQL: <?php echo esc_html(mysql_error()); ?>]</p></div> +<div class="updated"><p>There was a problem adding the feed. [SQL: <?php echo esc_html($wpdb->last_error); ?>]</p></div> <?php endif; elseif (isset($fwp_post['save_link_id'])): $existingLink = new SyndicatedLink($fwp_post['save_link_id']); diff --git a/wp-content/plugins/feedwordpress/readme.txt b/wp-content/plugins/feedwordpress/readme.txt index bae4f062072cb8d3a295c2702dea0a90255569f1..e59fdc681bea23ac256fe7c0549c2d13da4c1c4e 100644 --- a/wp-content/plugins/feedwordpress/readme.txt +++ b/wp-content/plugins/feedwordpress/readme.txt @@ -3,8 +3,8 @@ Contributors: Charles Johnson Donate link: http://feedwordpress.radgeek.com/ Tags: syndication, aggregation, feed, atom, rss Requires at least: 4.5 -Tested up to: 4.7 -Stable tag: 2016.1213 +Tested up to: 4.8.2 +Stable tag: 2017.1004 FeedWordPress syndicates content from feeds you choose into your WordPress weblog. @@ -93,9 +93,42 @@ outs, see the documentation at the [FeedWordPress project homepage][]. == Changelog == += 2017.0913 = + +* PARTIAL FIX FOR 2X DUPLICATE POSTS APPEARING ON DUAL HTTP/HTTPS SITES: Some + users reported an issue in which their FeedWordPress sites, which are over + both insecure HTTP and over HTTPS, would pick up exactly 2 copies of every + post or almost every post from certain feeds, and where the guids for each + of the pair of duplicate posts would look exactly alike, except for a + difference in the protocol, for example: + + http://www.example.com/?guid=c1cd28da39e8d7babcf6499983aca545 + https://www.example.com/?guid=c1cd28da39e8d7babcf6499983aca545 + + ... where www.example.com is the server that your own copy of FeedWordPress + is installed. This release of FeedWordPress normalizes post guid prefixes + so as to avoid or limit the scope of this problem. + +* PHP 7 Compatibility: eliminate remaining sources of PHP 7 compatibility-check + failures -- remove the use of depreciated mysql_error() function, and make + sure all classes make use of __construct() convention for constructors. + +* AVOID "PHP Warning: shell_exec() has been disabled for security reasons in + [...]/feedwordpress/feeds-page.php on line 197": FeedWordPress uses the PHP + shell_exec() function in a very narrowly limited way for information gathering, + trying to find the real path to curl or wget on your system, so that it can + give as realistic as possible a recommendation for the sample crontab line + displayed in Syndication > Feeds & Updates. Some web hosting environments + disable shell_exec for security reasons (since it could in theory be used to + do a lot more stuff than the very limited information gathering FWP uses it + for); in which case, this part of the code in FeedWordPress could spit out + a nasty-looking and potentially worrisome-looking error message. So, now this + code is fenced with checks to make sure that shell_exec is available, before + FWP attempts to make use of it. + = 2016.1213 = -* WORDPRSS BACKWARD COMPATIBILITY FOR VERSIONS [4.5, 4.7]: This change fixes +* WORDPRESS BACKWARD COMPATIBILITY FOR VERSIONS [4.5, 4.7]: This change fixes a fatal PHP error (on some web server configurations you'd see the message "Fatal error: require_once(): Failed opening required '[...]/wp-includes/class-wp-feed-cache.php'" on others, you might just see an HTTP 500 Internal Server Error or a blank diff --git a/wp-content/plugins/feedwordpress/syndicatedpost.class.php b/wp-content/plugins/feedwordpress/syndicatedpost.class.php index 8d1b1f4db362382d89721305c48f835eb014d9f1..00f701f73aa615da41d1ff90b8a6c50893b4a9d7 100644 --- a/wp-content/plugins/feedwordpress/syndicatedpost.class.php +++ b/wp-content/plugins/feedwordpress/syndicatedpost.class.php @@ -12,7 +12,7 @@ require_once(dirname(__FILE__).'/syndicatedpostxpathquery.class.php'); * different feed formats, which may be useful to FeedWordPress users * who make use of feed data in PHP add-ons and filters. * - * @version 2013.0525 + * @version 2017.1004 */ class SyndicatedPost { var $item = null; // MagpieRSS representation @@ -129,6 +129,7 @@ class SyndicatedPost { ); $excerpt = apply_filters('syndicated_item_excerpt', $this->excerpt(), $this); + if (!empty($excerpt)): $this->post['post_excerpt'] = $excerpt; endif; @@ -258,7 +259,6 @@ class SyndicatedPost { $this->post['post_type'] = apply_filters('syndicated_post_type', $this->link->setting('syndicated post type', 'syndicated_post_type', 'post'), $this); endif; - } /* SyndicatedPost::__construct() */ ##################################### @@ -413,18 +413,23 @@ class SyndicatedPost { $content = $this->content(); // Ignore whitespace, case, and tag cruft. - $theExcerpt = preg_replace('/\s+/', '', strtolower(strip_tags($excerpt))); - $theContent = preg_replace('/\s+/', '', strtolower(strip_tags($content))); - + $theExcerpt = preg_replace('/\s+/', '', strtolower(strip_tags(html_entity_decode($excerpt)))); + $theContent = preg_replace('/\s+/', '', strtolower(strip_tags(html_entity_decode($content)))); if ( empty($excerpt) or $theExcerpt == $theContent ) : # If content is available, generate an excerpt. if ( strlen(trim($content)) > 0 ) : $excerpt = strip_tags($content); if (strlen($excerpt) > 255) : - $excerpt = substr($excerpt,0,252).'...'; + if (is_object($this->link) and is_object($this->link->simplepie)) : + $encoding = $this->link->simplepie->get_encoding(); + else : + $encoding = get_option('blog_charset', 'utf8'); + endif; + $excerpt = mb_substr($excerpt,0,252,$encoding).'...'; endif; endif; endif; + return $excerpt; } /* SyndicatedPost::excerpt() */ @@ -584,9 +589,24 @@ class SyndicatedPost { return $hash; } /* SyndicatedPost::update_hash() */ + /** + * SyndicatedPost::normalize_guid_prefix(): generates a normalized URL + * prefix (including scheme, authority, full path, and the beginning of + * a query string) for creating guids that conform to WordPress's + * internal constraints on the URL space for valid guids. To create a + * normalized guid, just concatenate a valid URL query parameter value + * to the returned URL. + * + * @return string The URL prefix generated. + * + * @uses trailingslashit() + * @uses home_url() + * @uses apply_filters() + */ static function normalize_guid_prefix () { - return trailingslashit(get_bloginfo('url')).'?guid='; - } + $url = trailingslashit(home_url(/*path=*/ '', /*scheme=*/ 'http')); + return apply_filters('syndicated_item_guid_normalized_prefix', $url . '?guid='); + } /* SyndicatedPost::normalize_guid_prefix() */ static function normalize_guid ($guid) { $guid = trim($guid); @@ -596,6 +616,23 @@ class SyndicatedPost { $guid = SyndicatedPost::normalize_guid_prefix().md5($guid); endif; $guid = trim($guid); + + return $guid; + } /* SyndicatedPost::normalize_guid() */ + + static function alternative_guid_prefix () { + $url = trailingslashit(home_url(/*path=*/ '', /*scheme=*/ 'https')); + return apply_filters('syndicated_item_guid_normalized_prefix', $url . '?guid='); + } + static function alternative_guid ($guid) { + $guid = trim($guid); + if (preg_match('/^[0-9a-z]{32}$/i', $guid)) : // MD5 + $guid = SyndicatedPost::alternative_guid_prefix().strtolower($guid); + elseif ((strlen(esc_url($guid)) == 0) or (esc_url($guid) != $guid)) : + $guid = SyndicatedPost::alternative_guid_prefix().md5($guid); + endif; + $guid = trim($guid); + return $guid; } /* SyndicatedPost::normalize_guid() */ @@ -1417,7 +1454,7 @@ class SyndicatedPost { return $this->_wp_id; } - function store () { + public function store () { global $wpdb; if ($this->filtered()) : // This should never happen. @@ -1679,6 +1716,7 @@ class SyndicatedPost { // Go ahead and insert the first post record to // anchor the revision history. + $this->_wp_id = wp_insert_post($sdbpost, /*return wp_error=*/ true); $dbpost['ID'] = $this->_wp_id; diff --git a/wp-content/plugins/feedwordpress/syndicationdataqueries.class.php b/wp-content/plugins/feedwordpress/syndicationdataqueries.class.php index 2588fbdd4053131598f923ff9218580deea03afa..4c8a5086d9d64227600d265fee1f028275f57820 100644 --- a/wp-content/plugins/feedwordpress/syndicationdataqueries.class.php +++ b/wp-content/plugins/feedwordpress/syndicationdataqueries.class.php @@ -15,7 +15,7 @@ class SyndicationDataQueries { $wp->add_query_var('guid'); } - function parse_query (&$q) { + function parse_query ($q) { if ($q->get('guid')) : $q->is_single = false; // Causes nasty side-effects. $q->is_singular = true; // Doesn't? @@ -27,18 +27,18 @@ class SyndicationDataQueries { endif; } /* SyndicationDataQueries::parse_query () */ - function pre_get_posts (&$q) { + function pre_get_posts ($q) { // } - function posts_request ($sql, &$query) { + function posts_request ($sql, $query) { if ($query->get('fields') == '_synfresh') : FeedWordPress::diagnostic('feed_items:freshness:sql', "SQL: ".$sql); endif; return $sql; } - function posts_search ($search, &$query) { + function posts_search ($search, $query) { global $wpdb; if ($guid = $query->get('guid')) : if (strlen(trim($guid)) > 0) : @@ -47,6 +47,7 @@ class SyndicationDataQueries { // MD5 hashes if (preg_match('/^[0-9a-f]{32}$/i', $guid)) : $seek[] = SyndicatedPost::normalize_guid_prefix().$guid; + $seek[] = SyndicatedPost::alternative_guid_prefix().$guid; endif; // Invalid URIs, URIs that WordPress just doesn't like, and URIs @@ -54,8 +55,9 @@ class SyndicationDataQueries { $nGuid = SyndicatedPost::normalize_guid($guid); if ($guid != $nGuid) : $seek[] = $nGuid; + $seek[] = SyndicatedPost::alternative_guid($guid); endif; - + // Escape to prevent frak-ups, injections, etc. $seek = array_map('esc_sql', $seek); @@ -75,7 +77,7 @@ class SyndicationDataQueries { return $search; } /* SyndicationDataQueries::posts_search () */ - function posts_where ($where, &$q) { + function posts_where ($where, $q) { global $wpdb; // Ugly hack to ensure we ONLY check by guid in syndicated freshness @@ -92,7 +94,7 @@ class SyndicationDataQueries { return $where; } /* SyndicationDataQueries::post_where () */ - function posts_fields ($fields, &$query) { + function posts_fields ($fields, $query) { global $wpdb; if ($f = $query->get('fields')) : switch ($f) :