Commit 3571c7cc authored by agata's avatar agata
Browse files

[auto] plugin: feedwordpress 2020.0118

parent da8169c2
......@@ -15,9 +15,6 @@ class FeedWordPressDiagnosticsPage extends FeedWordPressAdminPage {
function has_link () { return false; }
function display () {
global $wpdb, $wp_db_version, $fwp_path;
global $fwp_post;
if (FeedWordPress::needs_upgrade()) :
fwp_upgrade_page();
return;
......@@ -27,8 +24,8 @@ class FeedWordPressDiagnosticsPage extends FeedWordPressAdminPage {
FeedWordPressCompatibility::validate_http_request(/*action=*/ 'feedwordpress_diagnostics', /*capability=*/ 'manage_options');
if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
$this->accept_POST($fwp_post);
do_action('feedwordpress_admin_page_diagnostics_save', $fwp_post, $this);
$this->accept_POST($_POST);
do_action('feedwordpress_admin_page_diagnostics_save', $_POST, $this);
endif;
////////////////////////////////////////////////
......@@ -61,7 +58,7 @@ class FeedWordPressDiagnosticsPage extends FeedWordPressAdminPage {
?>
<div class="metabox-holder">
<?php
fwp_do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
?>
</div> <!-- class="metabox-holder" -->
</div> <!-- id="post-body" -->
......
......@@ -161,6 +161,17 @@ class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
/*checkbox=*/ true
);
} /* for */
// Let's make the interface for the PAUSE/RESUME a bit better
jQuery('<tr id="reveal-pause-resume"><th></th><td><button id="pause-resume-reveal-button">&#8212; PAUSE or RESUME UPDATES &#8212;</button></td></tr>').insertBefore('#pause-resume');
jQuery('#pause-resume').hide();
jQuery('#pause-resume-reveal-button').click(function(ev) {
ev.preventDefault();
jQuery('#pause-resume').toggle();
return false;
});
} );
<?php
......@@ -186,7 +197,7 @@ class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
<?php if ($page->for_default_settings()) : ?>
<tr>
<th scope="row">Updates:</th>
<th scope="row">Update Method:</th>
<td><select id="automatic-updates-selector" name="automatic_updates" size="1" onchange="contextual_appearance('automatic-updates-selector', 'cron-job-explanation', null, 'no');">
<option value="shutdown"<?php echo ($automatic_updates=='shutdown')?' selected="selected"':''; ?>>automatically check for updates after pages load</option>
<option value="init"<?php echo ($automatic_updates=='init')?' selected="selected"':''; ?>>automatically check for updates before pages load</option>
......@@ -198,23 +209,25 @@ class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
// 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.
$curlOrWgetPath = NULL;
$shellExecAvailable = (is_callable('shell_exec') && false === stripos(ini_get('disable_functions'), 'shell_exec'));
if ($shellExecAvailable) :
$path = `which curl`; $opts = '--silent %s';
$curlOrWgetPath = `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 ($shellExecAvailable and (is_null($curlOrWgetPath) or strlen(trim($curlOrWgetPath))==0)) :
$curlOrWgetPath = `which wget`; $opts = '-q -O - %s';
endif;
if (is_null($path) or strlen(trim($path))==0) :
$path = '/usr/bin/curl'; $opts = '--silent %s';
if (is_null($curlOrWgetPath) or strlen(trim($curlOrWgetPath))==0) :
$curlOrWgetPath = '/usr/bin/curl'; $opts = '--silent %s';
endif;
$path = preg_replace('/\n+$/', '', $path);
$curlOrWgetPath = preg_replace('/\n+$/', '', $curlOrWgetPath);
$cmdline = $path . ' ' . sprintf($opts, get_bloginfo('url').'?update_feedwordpress=1');
$cmdline = $curlOrWgetPath . ' ' . sprintf($opts, get_bloginfo('url').'?update_feedwordpress=1');
?>If you want to use a cron job,
you can perform scheduled updates by sending regularly-scheduled
......@@ -268,6 +281,24 @@ class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
<?php endif; ?>
<tr id="pause-resume">
<th scope="row"><?php print __('Pause/Resume:'); ?></th>
<td><?php
$this->setting_radio_control(
'update/pause', 'update_pause',
/*options=*/ array(
'no' => '<strong>UPDATE:</strong> import new posts as normal',
'yes' => '<strong>PAUSE:</strong> do not import new posts until I unpause updates',
),
/*params=*/ array(
'setting-default' => NULL,
'global-setting-default' => 'no',
'default-input-value' => 'default',
)
);
?></td>
</tr>
<tr>
<th scope="row"><?php print __('Update scheduling:') ?></th>
<td><p style="margin-top:0px">How long should FeedWordPress wait between updates before it considers this feed ready to be polled for updates again?</p>
......@@ -506,11 +537,7 @@ class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
$cat_id = FeedWordPress::link_category_id();
$params = array();
if (FeedWordPressCompatibility::test_version(FWP_SCHEMA_USES_ARGS_TAXONOMY)) :
$params['taxonomy'] = 'link_category';
else :
$params['type'] = 'link';
endif;
$params['hide_empty'] = false;
$results = get_categories($params);
......@@ -1215,6 +1242,10 @@ class FeedWordPressFeedsPage extends FeedWordPressAdminPage {
endif;
if (isset($post['update_pause'])) :
$this->update_setting('update/pause', $post['update_pause']);
endif;
if (isset($post['fetch_timeout'])) :
if (isset($post['fetch_timeout_default']) and $post['fetch_timeout_default']=='yes') :
$timeout = NULL;
......
<?php
class FeedWordPress_Parser extends SimplePie_Parser {
function reset_parser (&$xml) {
// reset members
$this->namespace = array('');
$this->element = array('');
$this->xml_base = array('');
$this->xml_base_explicit = array(false);
$this->xml_lang = array('');
$this->data = array();
$this->datas = array(array());
$this->current_xhtml_construct = -1;
$this->xmlns_stack = array();
$this->xmlns_current = array();
// reset libxml parser
xml_parser_free($xml);
$xml = xml_parser_create_ns($this->encoding, $this->separator);
......@@ -12,7 +25,7 @@ class FeedWordPress_Parser extends SimplePie_Parser {
xml_set_start_namespace_decl_handler($xml, 'start_xmlns');
}
function parse (&$data, $encoding) {
public function parse (&$data, $encoding) {
$data = apply_filters('feedwordpress_parser_parse', $data, $encoding, $this);
// Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
......@@ -95,32 +108,28 @@ class FeedWordPress_Parser extends SimplePie_Parser {
$endOfJunk = strpos($data, '<?xml');
if (!$parseResults and $endOfJunk > 0) :
// There is some junk before the feed prolog. Try to get rid of it.
$newData = substr($data, $endOfJunk);
$newData = trim($newData);
$data = substr($data, $endOfJunk);
$data = trim($data);
$this->reset_parser($xml);
$parseResults = xml_parse($xml, $newData, true);
$parseResults = xml_parse($xml, $data, true);
endif;
if (!$parseResults)
{
if (class_exists('DOMDocument')) :
libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->loadHTML('<html>'.$data.'</html>');
///*DBG*/ echo "<plaintext>";
///*DBG*/ $dd = $doc->getElementsByTagName('html');
///*DBG*/ for ($i = 0; $i < $dd->length; $i++) :
///*DBG*/ var_dump($dd->item($i)->nodeName);
///*DBG*/ endfor;
///*DBG*/ var_dump($doc);
libxml_use_internal_errors(false);
///*DBG*/ die;
$badEntity = (xml_get_error_code($xml) == 26);
if (!$parseResults and $badEntity) :
// There was an entity that libxml couldn't understand.
// Chances are, it was a stray HTML entity. So let's try
// converting all the named HTML entities to numeric XML
// entities and starting over.
$data = $this->html_convert_entities($data);
$this->reset_parser($xml);
$parseResults = xml_parse($xml, $data, true);
endif;
if (!$parseResults) {
$this->error_code = xml_get_error_code($xml);
$this->error_string = xml_error_string($this->error_code);
///*DBG*/ echo "WOOGA WOOGA"; var_dump($this->error_string); die;
$return = false;
}
......@@ -240,5 +249,281 @@ class FeedWordPress_Parser extends SimplePie_Parser {
endif;
return true;
} /* FeedWordPress_Parser::start_xmlns() */
}
/* html_convert_entities($string) -- convert named HTML entities to
* XML-compatible numeric entities. Adapted from code by @inanimatt:
* https://gist.github.com/inanimatt/879249
*/
public function html_convert_entities($string) {
return preg_replace_callback('/&([a-zA-Z][a-zA-Z0-9]+);/S',
array($this, 'convert_entity'), $string);
}
/* Swap HTML named entity with its numeric equivalent. If the entity
* isn't in the lookup table, this function returns a blank, which
* destroys the character in the output - this is probably the
* desired behaviour when producing XML. Adapted from code by @inanimatt:
* https://gist.github.com/inanimatt/879249
*/
public function convert_entity($matches) {
static $table = array(
'quot' => '&#34;',
'amp' => '&#38;',
'lt' => '&#60;',
'gt' => '&#62;',
'OElig' => '&#338;',
'oelig' => '&#339;',
'Scaron' => '&#352;',
'scaron' => '&#353;',
'Yuml' => '&#376;',
'circ' => '&#710;',
'tilde' => '&#732;',
'ensp' => '&#8194;',
'emsp' => '&#8195;',
'thinsp' => '&#8201;',
'zwnj' => '&#8204;',
'zwj' => '&#8205;',
'lrm' => '&#8206;',
'rlm' => '&#8207;',
'ndash' => '&#8211;',
'mdash' => '&#8212;',
'lsquo' => '&#8216;',
'rsquo' => '&#8217;',
'sbquo' => '&#8218;',
'ldquo' => '&#8220;',
'rdquo' => '&#8221;',
'bdquo' => '&#8222;',
'dagger' => '&#8224;',
'Dagger' => '&#8225;',
'permil' => '&#8240;',
'lsaquo' => '&#8249;',
'rsaquo' => '&#8250;',
'euro' => '&#8364;',
'fnof' => '&#402;',
'Alpha' => '&#913;',
'Beta' => '&#914;',
'Gamma' => '&#915;',
'Delta' => '&#916;',
'Epsilon' => '&#917;',
'Zeta' => '&#918;',
'Eta' => '&#919;',
'Theta' => '&#920;',
'Iota' => '&#921;',
'Kappa' => '&#922;',
'Lambda' => '&#923;',
'Mu' => '&#924;',
'Nu' => '&#925;',
'Xi' => '&#926;',
'Omicron' => '&#927;',
'Pi' => '&#928;',
'Rho' => '&#929;',
'Sigma' => '&#931;',
'Tau' => '&#932;',
'Upsilon' => '&#933;',
'Phi' => '&#934;',
'Chi' => '&#935;',
'Psi' => '&#936;',
'Omega' => '&#937;',
'alpha' => '&#945;',
'beta' => '&#946;',
'gamma' => '&#947;',
'delta' => '&#948;',
'epsilon' => '&#949;',
'zeta' => '&#950;',
'eta' => '&#951;',
'theta' => '&#952;',
'iota' => '&#953;',
'kappa' => '&#954;',
'lambda' => '&#955;',
'mu' => '&#956;',
'nu' => '&#957;',
'xi' => '&#958;',
'omicron' => '&#959;',
'pi' => '&#960;',
'rho' => '&#961;',
'sigmaf' => '&#962;',
'sigma' => '&#963;',
'tau' => '&#964;',
'upsilon' => '&#965;',
'phi' => '&#966;',
'chi' => '&#967;',
'psi' => '&#968;',
'omega' => '&#969;',
'thetasym' => '&#977;',
'upsih' => '&#978;',
'piv' => '&#982;',
'bull' => '&#8226;',
'hellip' => '&#8230;',
'prime' => '&#8242;',
'Prime' => '&#8243;',
'oline' => '&#8254;',
'frasl' => '&#8260;',
'weierp' => '&#8472;',
'image' => '&#8465;',
'real' => '&#8476;',
'trade' => '&#8482;',
'alefsym' => '&#8501;',
'larr' => '&#8592;',
'uarr' => '&#8593;',
'rarr' => '&#8594;',
'darr' => '&#8595;',
'harr' => '&#8596;',
'crarr' => '&#8629;',
'lArr' => '&#8656;',
'uArr' => '&#8657;',
'rArr' => '&#8658;',
'dArr' => '&#8659;',
'hArr' => '&#8660;',
'forall' => '&#8704;',
'part' => '&#8706;',
'exist' => '&#8707;',
'empty' => '&#8709;',
'nabla' => '&#8711;',
'isin' => '&#8712;',
'notin' => '&#8713;',
'ni' => '&#8715;',
'prod' => '&#8719;',
'sum' => '&#8721;',
'minus' => '&#8722;',
'lowast' => '&#8727;',
'radic' => '&#8730;',
'prop' => '&#8733;',
'infin' => '&#8734;',
'ang' => '&#8736;',
'and' => '&#8743;',
'or' => '&#8744;',
'cap' => '&#8745;',
'cup' => '&#8746;',
'int' => '&#8747;',
'there4' => '&#8756;',
'sim' => '&#8764;',
'cong' => '&#8773;',
'asymp' => '&#8776;',
'ne' => '&#8800;',
'equiv' => '&#8801;',
'le' => '&#8804;',
'ge' => '&#8805;',
'sub' => '&#8834;',
'sup' => '&#8835;',
'nsub' => '&#8836;',
'sube' => '&#8838;',
'supe' => '&#8839;',
'oplus' => '&#8853;',
'otimes' => '&#8855;',
'perp' => '&#8869;',
'sdot' => '&#8901;',
'lceil' => '&#8968;',
'rceil' => '&#8969;',
'lfloor' => '&#8970;',
'rfloor' => '&#8971;',
'lang' => '&#9001;',
'rang' => '&#9002;',
'loz' => '&#9674;',
'spades' => '&#9824;',
'clubs' => '&#9827;',
'hearts' => '&#9829;',
'diams' => '&#9830;',
'nbsp' => '&#160;',
'iexcl' => '&#161;',
'cent' => '&#162;',
'pound' => '&#163;',
'curren' => '&#164;',
'yen' => '&#165;',
'brvbar' => '&#166;',
'sect' => '&#167;',
'uml' => '&#168;',
'copy' => '&#169;',
'ordf' => '&#170;',
'laquo' => '&#171;',
'not' => '&#172;',
'shy' => '&#173;',
'reg' => '&#174;',
'macr' => '&#175;',
'deg' => '&#176;',
'plusmn' => '&#177;',
'sup2' => '&#178;',
'sup3' => '&#179;',
'acute' => '&#180;',
'micro' => '&#181;',
'para' => '&#182;',
'middot' => '&#183;',
'cedil' => '&#184;',
'sup1' => '&#185;',
'ordm' => '&#186;',
'raquo' => '&#187;',
'frac14' => '&#188;',
'frac12' => '&#189;',
'frac34' => '&#190;',
'iquest' => '&#191;',
'Agrave' => '&#192;',
'Aacute' => '&#193;',
'Acirc' => '&#194;',
'Atilde' => '&#195;',
'Auml' => '&#196;',
'Aring' => '&#197;',
'AElig' => '&#198;',
'Ccedil' => '&#199;',
'Egrave' => '&#200;',
'Eacute' => '&#201;',
'Ecirc' => '&#202;',
'Euml' => '&#203;',
'Igrave' => '&#204;',
'Iacute' => '&#205;',
'Icirc' => '&#206;',
'Iuml' => '&#207;',
'ETH' => '&#208;',
'Ntilde' => '&#209;',
'Ograve' => '&#210;',
'Oacute' => '&#211;',
'Ocirc' => '&#212;',
'Otilde' => '&#213;',
'Ouml' => '&#214;',
'times' => '&#215;',
'Oslash' => '&#216;',
'Ugrave' => '&#217;',
'Uacute' => '&#218;',
'Ucirc' => '&#219;',
'Uuml' => '&#220;',
'Yacute' => '&#221;',
'THORN' => '&#222;',
'szlig' => '&#223;',
'agrave' => '&#224;',
'aacute' => '&#225;',
'acirc' => '&#226;',
'atilde' => '&#227;',
'auml' => '&#228;',
'aring' => '&#229;',
'aelig' => '&#230;',
'ccedil' => '&#231;',
'egrave' => '&#232;',
'eacute' => '&#233;',
'ecirc' => '&#234;',
'euml' => '&#235;',
'igrave' => '&#236;',
'iacute' => '&#237;',
'icirc' => '&#238;',
'iuml' => '&#239;',
'eth' => '&#240;',
'ntilde' => '&#241;',
'ograve' => '&#242;',
'oacute' => '&#243;',
'ocirc' => '&#244;',
'otilde' => '&#245;',
'ouml' => '&#246;',
'divide' => '&#247;',
'oslash' => '&#248;',
'ugrave' => '&#249;',
'uacute' => '&#250;',
'ucirc' => '&#251;',
'uuml' => '&#252;',
'yacute' => '&#253;',
'thorn' => '&#254;',
'yuml' => '&#255;'
);
// Entity not found? Destroy it.
return isset($table[$matches[1]]) ? $table[$matches[1]] : '';
} /* FeedWordPress_Parser::convert_entity() */
} /* class FeedWordPress_Parser */
<?php
/**
* class FeedWordPressDiagnostic: help to organize some diagnostics output functions.
*/
class FeedWordPressDiagnostic {
public static function feed_error ($error, $old, $link) {
$wpError = $error['object'];
$url = $link->uri();
// check for effects of an effective-url filter
$effectiveUrl = $link->uri(array('fetch' => true));
if ($url != $effectiveUrl) : $url .= ' | ' . $effectiveUrl; endif;
$mesgs = $wpError->get_error_messages();
foreach ($mesgs as $mesg) :
$mesg = esc_html($mesg);
FeedWordPress::diagnostic(
'updated_feeds:errors',
"Feed Error: [${url}] update returned error: $mesg"
);
$hours = get_option('feedwordpress_diagnostics_persistent_errors_hours', 2);
$span = ($error['ts'] - $error['since']);
if ($span >= ($hours * 60 * 60)) :
$since = date('r', $error['since']);
$mostRecent = date('r', $error['ts']);
FeedWordPress::diagnostic(
'updated_feeds:errors:persistent',
"Feed Update Error: [${url}] returning errors"
." since ${since}:<br/><code>$mesg</code>",
$url, $error['since'], $error['ts']
);
endif;
endforeach;
}
public static function admin_emails ($id = '') {
$users = get_users_of_blog($id);
$recipients = array();
foreach ($users as $user) :
$user_id = (isset($user->user_id) ? $user->user_id : $user->ID);
$dude = new WP_User($user_id);
if ($dude->has_cap('administrator')) :
if ($dude->user_email) :
$recipients[] = $dude->user_email;
endif;
endif;
endforeach;
return $recipients;
}
public static function noncritical_bug ($varname, $var, $line, $file = NULL) {
if (FEEDWORDPRESS_DEBUG) : // halt only when we are doing debugging
self::critical_bug($varname, $var, $line, $file);
endif;
} /* FeedWordPressDiagnostic::noncritical_bug () */
public static function critical_bug ($varname, $var, $line, $file = NULL) {
global $wp_version;
if (!is_null($file)) :
$location = "line # ${line} of ".basename($file);
else :
$location = "line # ${line}";
endif;
print '<p><strong>Critical error:</strong> There may be a bug in FeedWordPress. Please <a href="'.FEEDWORDPRESS_AUTHOR_CONTACT.'">contact the author</a> and paste the following information into your e-mail:</p>';
print "\n<plaintext>";
print "Triggered at ${location}\n";
print "FeedWordPress: ".FEEDWORDPRESS_VERSION."\n";
print "WordPress: {$wp_version}\n";
print "PHP: ".phpversion()."\n";
print "Error data: ";
print $varname.": "; var_dump($var); echo "\n";
die;
} /* FeedWordPressDiagnostic::critical_bug () */
public static function is_on ($level) {
$show = get_option('feedwordpress_diagnostics_show', array());
return (in_array($level, $show));
} /* FeedWordPressDiagnostic::is_on () */
} /* class FeedWordPressDiagnostic */