mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/RSS
synced 2024-11-14 19:27:22 +00:00
bd5d63fcf0
Added URL whitelist to configuration If there are items in the array, and the used URL isn't in the array, it will not be allowed
65 lines
1.7 KiB
PHP
65 lines
1.7 KiB
PHP
<?php
|
|
|
|
class RSSHooks {
|
|
/**
|
|
* Tell the parser how to handle <rss> elements
|
|
* @param $parser Parser Object
|
|
*/
|
|
static function parserInit( $parser ) {
|
|
# Install parser hook for <rss> tags
|
|
$parser->setHook( 'rss', array( __CLASS__, 'renderRss' ) );
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Static function wrapping RSSParser to handle rendering of RSS elements
|
|
* @param $input String: text inside the tags.
|
|
* @param $args Array: value associative list of the element attributes and
|
|
* their values.
|
|
* @param $parser Parser
|
|
* @param $frame Frame parser context
|
|
*/
|
|
static function renderRss( $input, $args, $parser, $frame ) {
|
|
global $wgRSSCacheAge, $wgRSSCacheCompare, $wgRSSNamespaces, $wgRSSAllowedFeeds;
|
|
|
|
if ( is_array( $wgRSSNamespaces ) && count( $wgRSSNamespaces ) ) {
|
|
$ns = $parser->getTitle()->getNamespace();
|
|
$checkNS = array_flip( $wgRSSNamespaces );
|
|
|
|
if( !isset( $checkNS[$ns] ) ) {
|
|
return wfMsg( 'rss-ns-permission' );
|
|
}
|
|
}
|
|
|
|
if ( count( $wgRSSAllowedFeeds ) && !in_array( $input, $wgRSSAllowedFeeds ) ) {
|
|
return wfMsg( 'rss-url-permission ' );
|
|
}
|
|
|
|
if ( !Http::isValidURI( $input ) ) {
|
|
return wfMsg( 'rss-invalid-url', htmlspecialchars( $input ) );
|
|
}
|
|
if ( $wgRSSCacheCompare ) {
|
|
$timeout = $wgRSSCacheCompare;
|
|
} else {
|
|
$timeout = $wgRSSCacheAge;
|
|
}
|
|
|
|
$parser->getOutput()->updateCacheExpiry( $timeout );
|
|
|
|
$rss = new RSSParser( $input, $args );
|
|
|
|
$status = $rss->fetch();
|
|
|
|
# Check for errors.
|
|
if ( !$status->isGood() ) {
|
|
return wfMsg( 'rss-error', htmlspecialchars( $input ), $status->getWikiText() );
|
|
}
|
|
|
|
if ( !is_object( $rss->rss ) || !is_array( $rss->rss->items ) ) {
|
|
return wfMsg( 'rss-empty', htmlspecialchars( $input ) );
|
|
}
|
|
|
|
return $rss->renderFeed( $parser, $frame );
|
|
}
|
|
}
|